diff --git a/src/plugins/tools/net_tracer/db_plugin/dbNetTracerIO.cc b/src/plugins/tools/net_tracer/db_plugin/dbNetTracerIO.cc index 124157793..132f9e5a3 100644 --- a/src/plugins/tools/net_tracer/db_plugin/dbNetTracerIO.cc +++ b/src/plugins/tools/net_tracer/db_plugin/dbNetTracerIO.cc @@ -498,6 +498,7 @@ NetTracerTechnologyComponent::NetTracerTechnologyComponent () // NetTracerConnectivity implementation NetTracerConnectivity::NetTracerConnectivity () + : m_is_fallback_default (false) { // .. nothing yet .. } @@ -510,6 +511,7 @@ NetTracerConnectivity::NetTracerConnectivity (const NetTracerConnectivity &d) NetTracerConnectivity &NetTracerConnectivity::operator= (const NetTracerConnectivity &d) { if (this != &d) { + m_is_fallback_default = d.m_is_fallback_default; m_connections = d.m_connections; m_symbols = d.m_symbols; m_name = d.m_name; diff --git a/src/plugins/tools/net_tracer/db_plugin/dbNetTracerIO.h b/src/plugins/tools/net_tracer/db_plugin/dbNetTracerIO.h index de4a10407..e8f7a8d9c 100644 --- a/src/plugins/tools/net_tracer/db_plugin/dbNetTracerIO.h +++ b/src/plugins/tools/net_tracer/db_plugin/dbNetTracerIO.h @@ -369,6 +369,16 @@ public: NetTracerConnectivity (const NetTracerConnectivity &d); NetTracerConnectivity &operator= (const NetTracerConnectivity &d); + bool is_fallback_default () const + { + return m_is_fallback_default; + } + + void set_fallback_default (bool f) + { + m_is_fallback_default = f; + } + const std::string &name () const { return m_name; @@ -491,6 +501,7 @@ private: std::vector m_connections; std::vector m_symbols; std::string m_name, m_description; + bool m_is_fallback_default; }; class DB_PLUGIN_PUBLIC NetTracerTechnologyComponent diff --git a/src/plugins/tools/net_tracer/db_plugin/dbNetTracerPlugin.cc b/src/plugins/tools/net_tracer/db_plugin/dbNetTracerPlugin.cc index 3444bbe24..d5ad41a84 100644 --- a/src/plugins/tools/net_tracer/db_plugin/dbNetTracerPlugin.cc +++ b/src/plugins/tools/net_tracer/db_plugin/dbNetTracerPlugin.cc @@ -68,6 +68,18 @@ namespace tl namespace { +static const db::NetTracerConnectivity * +get_fallback_default (const db::NetTracerTechnologyComponent &tc) +{ + for (auto d = tc.begin (); d != tc.end (); ++d) { + if (d->is_fallback_default ()) { + return d.operator-> (); + } + } + + return 0; +} + static const db::NetTracerConnectivity * get_default (const db::NetTracerTechnologyComponent &tc) { @@ -88,28 +100,29 @@ get_default (const db::NetTracerTechnologyComponent &tc) template struct FallbackXMLWriteAdaptor { - FallbackXMLWriteAdaptor (void (db::NetTracerConnectivity::*member) (const Value &), void (db::NetTracerConnectivity::*clear) ()) - : mp_member (member), mp_clear (clear) + FallbackXMLWriteAdaptor (void (db::NetTracerConnectivity::*member) (const Value &)) + : mp_member (member) { // .. nothing yet .. } void operator () (db::NetTracerTechnologyComponent &owner, tl::XMLReaderState &reader) const { - db::NetTracerConnectivity *stack = const_cast (get_default (owner)); - if (! stack) { + db::NetTracerConnectivity *stack = const_cast (get_fallback_default (owner)); + if (! stack && owner.begin () == owner.end ()) { owner.push_back (db::NetTracerConnectivity ()); stack = (owner.end () - 1).operator-> (); + stack->set_fallback_default (true); } - (stack->*mp_clear) (); - tl::XMLObjTag tag; - (stack->*mp_member) (*reader.back (tag)); + if (stack) { + tl::XMLObjTag tag; + (stack->*mp_member) (*reader.back (tag)); + } } private: void (db::NetTracerConnectivity::*mp_member) (const Value &); - void (db::NetTracerConnectivity::*mp_clear) (); }; template @@ -184,10 +197,10 @@ public: // Fallback readers for migrating pre-0.28 setups to 0.28 and backward compatibility tl::XMLMember, FallbackXMLWriteAdaptor , tl::XMLStdConverter > ( FallbackXMLReadAdaptor (&NetTracerConnectivity::begin, &NetTracerConnectivity::end), - FallbackXMLWriteAdaptor (&NetTracerConnectivity::add, &NetTracerConnectivity::clear_connections), "connection") + + FallbackXMLWriteAdaptor (&NetTracerConnectivity::add), "connection") + tl::XMLMember, FallbackXMLWriteAdaptor , tl::XMLStdConverter > ( FallbackXMLReadAdaptor (&NetTracerConnectivity::begin_symbols, &NetTracerConnectivity::end_symbols), - FallbackXMLWriteAdaptor (&NetTracerConnectivity::add_symbol, &NetTracerConnectivity::clear_symbols), "symbols") + FallbackXMLWriteAdaptor (&NetTracerConnectivity::add_symbol), "symbols") ); } }; diff --git a/src/plugins/tools/net_tracer/db_plugin/gsiDeclDbNetTracer.cc b/src/plugins/tools/net_tracer/db_plugin/gsiDeclDbNetTracer.cc index f9f4d1695..90fdab1ad 100644 --- a/src/plugins/tools/net_tracer/db_plugin/gsiDeclDbNetTracer.cc +++ b/src/plugins/tools/net_tracer/db_plugin/gsiDeclDbNetTracer.cc @@ -52,6 +52,41 @@ static void def_symbol (db::NetTracerConnectivity *tech, const std::string &name tech->add_symbol (db::NetTracerSymbolInfo (db::LayerProperties (name), expr)); } +static std::string get_layer_a (const db::NetTracerConnectionInfo *info) +{ + return info->layer_a ().to_string (); +} + +static std::string get_via_layer (const db::NetTracerConnectionInfo *info) +{ + return info->via_layer ().to_string (); +} + +static std::string get_layer_b (const db::NetTracerConnectionInfo *info) +{ + return info->layer_b ().to_string (); +} + +gsi::Class decl_NetTracerConnectionInfo ("db", "NetTracerConnectionInfo", + gsi::method_ext ("layer_a", &get_layer_a, "@brief Gets the expression for the A layer") + + gsi::method_ext ("via_layer", &get_via_layer, "@brief Gets the expression for the Via layer") + + gsi::method_ext ("layer_b", &get_layer_b, "@brief Gets the expression for the B layer"), + "@brief Represents a single connection info line for the net tracer technology definition\n" + "This class has been introduced in version 0.28.3." +); + +static std::string get_symbol (const db::NetTracerSymbolInfo *info) +{ + return info->symbol ().to_string (); +} + +gsi::Class decl_NetTracerSymbolInfo ("db", "NetTracerSymbolInfo", + gsi::method_ext ("symbol", &get_symbol, "@brief Gets the symbol") + + gsi::method ("expression", &db::NetTracerSymbolInfo::expression, "@brief Gets the expression"), + "@brief Represents a single symbol info line for the net tracer technology definition\n" + "This class has been introduced in version 0.28.3." +); + gsi::Class decl_NetTracerConnectivity ("db", "NetTracerConnectivity", gsi::method ("name", &db::NetTracerConnectivity::name, "@brief Gets the name of the connectivty definition\n" @@ -79,6 +114,14 @@ gsi::Class decl_NetTracerConnectivity ("db", "NetTrac "@brief Defines a symbol for use in the material expressions.\n" "Defines a sub-expression to be used in further symbols or material expressions. " "For the detailed notation of the expression see the description of the net tracer feature." + ) + + gsi::iterator ("each_connection", static_cast (&db::NetTracerConnectivity::begin), static_cast (&db::NetTracerConnectivity::end), + "@brief Gets the connection information.\n" + "This iterator method has been introduced in version 0.28.3.\n" + ) + + gsi::iterator ("each_symbol", static_cast (&db::NetTracerConnectivity::begin_symbols), static_cast (&db::NetTracerConnectivity::end_symbols), + "@brief Gets the symbol information.\n" + "This iterator method has been introduced in version 0.28.3.\n" ), "@brief A connectivity description for the net tracer\n" "\n" @@ -99,6 +142,18 @@ gsi::Class decl_NetTracerConnectivity ("db", "NetTrac "has been generalized.\n" ); +DB_PUBLIC gsi::Class &decl_dbTechnologyComponent (); + +gsi::Class decl_NetTracerTechnologyComponent (decl_dbTechnologyComponent (), "db", "NetTracerTechnologyComponent", + gsi::iterator ("each", static_cast (&db::NetTracerTechnologyComponent::begin), static_cast (&db::NetTracerTechnologyComponent::end), + "@brief Gets the connectivity definitions from the net tracer technology component.\n" + ), + "@brief Represents the technology information for the net tracer.\n" + "This class has been redefined in version 0.28 and re-introduced in version 0.28.3. Since version 0.28, " + "multiple stacks are supported and the individual stack definition is provided through a list of stacks. Use \\each " + "to iterate the stacks." +); + static void trace1 (db::NetTracer *net_tracer, const db::NetTracerConnectivity &tech, const db::Layout &layout, const db::Cell &cell, const db::Point &start_point, unsigned int start_layer) { db::NetTracerData tracer_data = tech.get_tracer_data (layout); diff --git a/testdata/ruby/layTechnologies.rb b/testdata/ruby/layTechnologies.rb index 26e215f9f..29ab17734 100644 --- a/testdata/ruby/layTechnologies.rb +++ b/testdata/ruby/layTechnologies.rb @@ -23,6 +23,14 @@ end load("test_prologue.rb") +def nt_tech_to_s(t) + t.each.collect do |s| + ([ "Stack [" + s.name + "]:" ] + + s.each_connection.collect { |c| " conn: " + c.layer_a + "," + c.via_layer + "," + c.layer_b } + + s.each_symbol.collect { |c| " symbol: " + c.symbol + "=" + c.expression }).join("\n") + end.join("\n") + "\n" +end + class LAYTechnologies_TestClass < TestBase def test_1 @@ -117,7 +125,88 @@ END assert_equal(tech.component_names.size > 0, true) assert_equal(tech.component_names.find("connectivity") != nil, true) - assert_equal(tech.component("connectivity").class.to_s, "RBA::TechnologyComponent") + assert_equal(tech.component("connectivity").class.to_s, "RBA::NetTracerTechnologyComponent") + + end + + # issue 1245 + def test_3 + + # empty connectivity + tech = RBA::Technology::technology_from_xml(< + X + + +END + + nt_tech = tech.component("connectivity") + + assert_equal(nt_tech_to_s(nt_tech), "\n") + + # 0.27 to 0.28 migration + tech = RBA::Technology::technology_from_xml(< + X + + 11,2,3 + 14,5,6 + AA=17 + BB=42 + + +END + + nt_tech = tech.component("connectivity") + + assert_equal(nt_tech_to_s(nt_tech), < + X + + + ST1 + 1,2,3 + 4,5,6 + A=17 + B=42 + + + ST2 + 1,2,3 + 4,5,7 + A=1 + + + 1,2,3 + 4,5,6 + AA=17 + BB=42 + + +END + + nt_tech = tech.component("connectivity") + + assert_equal(nt_tech_to_s(nt_tech), <