Re: Version number macros

From: Philipp A. Hartmann <philipp.hartmann@offis.de>
Date: Mon Oct 04 2010 - 12:02:36 PDT

John,

please find some comments below.

On 04/10/10 18:13, john.aynsley@doulos.com wrote:
>
> Okay, so the duplicated set of definitions would be as follows:
[snip tlm definitions]

TLM is (usually) implemented as header-only library. Since SystemC
already requires separate linking, I think the rules can be different.

> namespace sc_core
> {
> #define SC_VERSION_MAJOR implementation_defined_number // For example, 2
> #define SC_VERSION_MINOR implementation_defined_number // 0
> #define SC_VERSION_PATCH implementation_defined_number // 1

+1 on these. They are definitely useful at compile-time.

> #define SC_VERSION_ORIGINATOR implementation_defined_string // "OSCI"
> #define SC_VERSION_RELEASE_DATE implementation_defined_date // "20090329"
> #define SC_VERSION_PRERELEASE implementation_defined_string // "beta"

Do we need these #defines? For what purpose? We can't do much with
them during preprocessing (except for string token concatenation).

> #define SC_IS_PRERELEASE implementation_defined_bool // TRUE

+1 on this.

> #define SC_VERSION implementation_defined_string // "2.0.1_beta-OSCI"
> #define SC_COPYRIGHT implementation_defined_string

Similar as above. I don't see the need for these symbols.

> const unsigned int sc_version_major;
> const unsigned int sc_version_minor;
> const unsigned int sc_version_patch;

I'm fine with these.

> const std::string sc_version_originator;
> const std::string sc_version_release_date;
> const std::string sc_version_prerelease;

I'm not sure, whether compilers are allowed to drop these constants, if
they are not used in a translation unit. Otherwise, having duplicate
definitions in each object file feels ... inefficient.

> const bool sc_is_prerelease;

+1.

> const std::string sc_version_string;
> const std::string sc_copyright_string;

As with the other string constants.

> inline const char* sc_release();
> inline const char* sc_version();
> inline const char* sc_copyright();

These should probably not be inline. As said above: We already have a
SystemC library to link against.

> }
>
[snip char sets]

>
> To answer Jerome, sure, the actual choice of version numbers is
> implementation-defined. The standard only defines the formal structure.

IIUIC, that's exactly the motivation for having a compile-time symbol
for detecting the available structure. e.g. in cases of something like

#if defined(SYSTEMC_IEEE_VERSION) && (SYSTEMC_IEEE_VERSION+0 >= 201001L)
 // cleanup for process control extensions
 catch ( sc_unwind_exception const & ) {
  // ...
 }
#endif

Makes sense?

Thanks,
  Philipp

> The OSCI simulator follows a specific lineage of version numbering. Other
> vendors may base their versions on the OSCI numbering or may do their own
> thing. These strings relate to the implementation itself, NOT to the
> version of the IEEE standard the implementation claims to support. That
> would be presumptuous!
>
> Does that work?
>
> John A
>
>
>
>
> From:
> "Roesler, Eric E" <eric.e.roesler@intel.com>
> To:
> David C Black <dcblack@xtreme-eda.com>, "john.aynsley@doulos.com"
> <john.aynsley@doulos.com>
> Cc:
> Jerome CORNET <jerome.cornet@st.com>, "systemc-p1666-technical@eda.org"
> <systemc-p1666-technical@eda.org>
> Date:
> 30/09/2010 18:39
> Subject:
> RE: Version number macros
>
>
>
> I attempted to reply yesterday but the message never appeared, apologies
> if you see a duplicate.
>
> I agree with David, it would be very handy to have the ability to check
> for API compatibility at compile time. With the TLM macros already in
> existence, they seem like a good starting point.
>
> To the question of whether to combine or not ? I think you are going to
> have to keep the TLM macros around for backward compatibility, but they
> are specific to TLM, so you will in addition need macro for systemc in
> general. So for now, I think you have to live with two separate sets of
> macros. Perhaps you can deprecate the TLM macros in the near future, and
> then remove them in a very future version.
>
> EricR
>
>
>
> From: owner-systemc-p1666-technical@eda.org [
> mailto:owner-systemc-p1666-technical@eda.org] On Behalf Of David C Black
> Sent: Tuesday, September 28, 2010 5:07 AM
> To: john.aynsley@doulos.com
> Cc: Jerome CORNET; systemc-p1666-technical@eda.org
> Subject: Re: Version number macros
>
> I would like to point out that the original SystemC API does not play well
> with compile-time issues. With TLM it is quite nice to be able to detect
> and deal with issues at compile-time. For example, when an incompatibility
> arises due to versions. #if works nicely to prevent wasted compilation
> cycles.
>
> Also, this allows allows for writing code that is backward compatible,
> which becomes an issue as ESL is now adopted in many places.
>
> Back in May of 2008, Charles Wilson made several very reasoned comments on
> this subject:
> The issue I have with the SystemC version information is that is does not
> provide a consistent, testable (compile time, run time) mechanism for
> determining and extracting the version information.
>
> I would assert that '20060505' is not the version, but rather the ISO 8601
> date (YYYYMMDD) for the build. The version is '2.2.0'. SystemC version
> strings are incorrectly implemented.
>
> A developer implementing code that works with version of TLM should be
> able to conditionally compile using standard practices
>
> #if ( TLM_VERION_MAJOR < 2 ) <-- compile time
>
> or
>
> if ( tlm_version_major < 2 ) <-- run time
>
> and not by elaborating each release date string.
>
> Hence the choice of 'major.minor.patch[ (prerelease)]'.
>
> where:
>
> 2.0.0 (DR1) indicates a developer release
> 2.0.0 indicates a public of 2.0
> 2.0.1 indicates a patch to 2.0
> 2.1.0 indicates an feature update to 2.0
>
> I don't have an issue with including the build date in the string, with
> the note that it should not be used except for public releases.
>
> 2.0.0 (20080614) indicating a public release of 2.0 on 14 June 2008.
>
> -----------
>
> references:
>
> ISO 8601 <http://en.wikipedia.org/wiki/ISO_8601>
> version numbering <http://apr.apache.org/versioning.html>
>
> I think he made a very strong case for this approach. Also note his
> reference to existing standards regarding both date formatting and
> versioning.
>
> So I am strongly in favor of the TLM style versioning.
>
> ------------------------------------------------------
> David C Black, XtremeEDA ESL Practice Leader
> http://www.Xtreme-EDA.com
> (Consulting, Services & Training for all your ESL, verification and DFT
> needs)
> Voice: 512.850.4322 Skype:dcblack FAX: 888.467.4609
>
> On Sep 28, 2010, at 6:16 AM, john.aynsley@doulos.com wrote:
>
>
> Jerome, All,
>
> Well, okay, but there is more to it than that. Here is the current SystemC
> API. Note that there are no macros, but the release string has a formal
> structure.
>
> namespace sc_core {
> const char* sc_copyright();
> const char* sc_version();
> const char* sc_release();
> }
>
> Function sc_release shall return an implementation-defined string of the
> following form:
> <major#>.<minor#>.<patch>-<originator>
> where <major#> represents the major release number, <minor#> represents
> the minor release
> number, <patch> represents the patch level, and <originator> represents
> the originator of the
> SystemC implementation. The intent is that this string should be
> machine-readable by any SystemC
> application that has an interest in checking the version or release number
> of the SystemC
> implementation.
> The character set for each of these four fields shall be as follows:
> a)The lower-case letters a-z
> b)The upper-case letters A-Z
> c)The decimal digits 0-9
> d)The underscore character _
>
> and here is the equivalent for TLM-2.0 (taken from the OSCI LRM, not just
> the implementation):
>
>
> namespace tlm
> {
> #define TLM_VERSION_MAJOR implementation_defined_number // For example, 2
> #define TLM_VERSION_MINOR implementation_defined_number // 0
> #define TLM_VERSION_PATCH implementation_defined_number // 1
> #define TLM_VERSION_ORIGINATOR implementation_defined_string // "OSCI"
> #define TLM_VERSION_RELEASE_DATE implementation_defined_date // "20090329"
>
> #define TLM_VERSION_PRERELEASE implementation_defined_string // "beta"
> #define TLM_IS_PRERELEASE implementation_defined_bool // TRUE
> #define TLM_VERSION implementation_defined_string // "2.0.1_beta-OSCI"
> #define TLM_COPYRIGHT implementation_defined_string
>
> const unsigned int tlm_version_major;
> const unsigned int tlm_version_minor;
> const unsigned int tlm_version_patch;
> const std::string tlm_version_originator;
> const std::string tlm_version_release_date;
> const std::string tlm_version_prerelease;
> const bool tlm_is_prerelease;
> const std::string tlm_version_string;
> const std::string tlm_copyright_string;
>
> inline const char* tlm_release();
> inline const char* tlm_version();
> inline const char* tlm_copyright();
> } // namespace tlm
>
>
> So the question is, do we want independent and parallel set of definitions
> for SystemC and TLM-2.0 releases, or do we want to merge them to give a
> single combined version? Having made that decision, do we want backward
> compatibility with the current 1666 and TLM-2.0 definitions?
>
> John A
>
>
>
> From:
> Jerome CORNET <jerome.cornet@st.com>
> To:
> "Philipp A. Hartmann" <philipp.hartmann@offis.de>
> Cc:
> john.aynsley@doulos.com, systemc-p1666-technical@eda.org
> Date:
> 16/09/2010 13:59
> Subject:
> Re: Version number macros
>
>
>
>
>
> Philipp,
>
> sorry for the delay in the answer: obviously you are right (I should
> have read the C++ norm more
> carefully).
>
> Agreed with all you said.
>
> Regards,
>
> Jerome
>
> On 9/15/2010 11:29 AM, Philipp A. Hartmann wrote:
>> Jerome,
>>
>> according to the C++ standard (17.4.3.1.2 [lib.global.names]), "certain
>> sets of names and function signatures are always reserved to the [C++]
>> implementation":
>>
>> - Each name that contains a double underscore (__) or begins with an
>> underscore followed by an upper-case letter (2.11) is reserved to
>> the implementation for any use.
>>
>> So I would prefer to have a macro name like SYSTEMC_IEEE_VERSION, or
>> SYSTEMC_IEEE_1666. SYSTEMC_VERSION should not be used, since this is
>> already used in (some) existing implementations.
>>
>> Thanks,
>> Philipp
>>
>> On 14/09/10 13:17, Jerome CORNET wrote:
>>> On 9/10/2010 4:07 PM, john.aynsley@doulos.com wrote:
>>>> Jerome,
>>>>
>>>> After process control extensions, the next priority on the list is
>>>> version number macros.
>>>>
>>>> You wrote:
>>>>
>>>> "Speaking of macros, I don't know if this has been planned, but it
>>>> would be great (and standard practice) to specify a way to retrieve
>>>> the version number of the norm that an implementation is following.
>>>> (In our case that would be either 2005 or 2010 for now).
>>>> The ISO C standard defines a macro __STDC__VERSION__ whose value is
>>>> 199901L (integer long) for C99.
>>>> ISO C++ also defines a macro, __cplusplus with value 199711L."
>>>>
>>>> Would you like to make a specific proposal?
>>>>
>>> John, All, (sorry for the slight delay)
>>>
>>> to me the best way is to follow the other standards' previous decisions
>>> unless
>>> we've got strong reasons for changing.
>>>
>>> So I would propose a macro (to allow test in #if) like this:
>>>
>>> __SYSTEMC_IEEE_VERSION with value 201001L
>>>
>>>
>>> with 2010 be for 1666-2010 and 01 being reserved for minor revisions
> (as
>>> it is used for c++).
>>>
>>> If someone prefer a variations in the name (__SYSTEM_VERSION or
>>> whatever), this is obviously
>>> also ok for us.
>>>
>>>
>>> Jerome
>>>
>>>
>>>
>>
>
>
>
>

-- 
Philipp A. Hartmann
Hardware/Software Design Methodology Group
OFFIS Institute for Information Technology
R&D Division Transportation · FuE-Bereich Verkehr
Escherweg 2 · 26121 Oldenburg · Germany
Phone/Fax: +49-441-9722-420/282 · PGP: 0x9161A5C0 · http://www.offis.de/
-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Mon Oct 4 12:03:11 2010

This archive was generated by hypermail 2.1.8 : Mon Oct 04 2010 - 12:03:12 PDT