From 8cde52c4ebac8088da6281d051b3ca8bac66cdb9 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Fri, 2 Jul 2021 14:47:30 +0200 Subject: [PATCH] netlist: Fix namespaces for subsheet packages Commit 9f35462 fixed packages and nets split across multiple pages of a subschematic that are listed in the same component, but it missed the case of source= attributes being distributed between components. Change namespace handling once again so the list of refdes' that leads to a subschematic forms its namespace. Reported-by: Karl Hammar --- src/backend/util_repackage.py | 2 +- src/command/netlist.py | 12 ++------ src/gaf/netlist/instance.py | 9 ++++++ src/gaf/netlist/net.py | 5 ++-- src/gaf/netlist/netlist.py | 2 +- src/gaf/netlist/package.py | 4 +-- tests/netlist/Makefile.am | 7 +++++ tests/netlist/regression/gschemrc | 2 ++ .../regression/multiple_sources_pkg-geda.out | 22 +++++++++++++++ .../multiple_sources_pkg-sources/sub-0.sch | 32 ++++++++++++++++++++++ .../multiple_sources_pkg-sources/sub-1.sch | 32 ++++++++++++++++++++++ .../regression/multiple_sources_pkg-symbols/io.sym | 9 ++++++ .../multiple_sources_pkg-symbols/sub.sym | 5 ++++ .../multiple_sources_pkg-symbols/sym.sym | 18 ++++++++++++ tests/netlist/regression/multiple_sources_pkg.sch | 15 ++++++++++ 15 files changed, 159 insertions(+), 17 deletions(-) create mode 100644 tests/netlist/regression/multiple_sources_pkg-geda.out create mode 100644 tests/netlist/regression/multiple_sources_pkg-sources/sub-0.sch create mode 100644 tests/netlist/regression/multiple_sources_pkg-sources/sub-1.sch create mode 100644 tests/netlist/regression/multiple_sources_pkg-symbols/io.sym create mode 100644 tests/netlist/regression/multiple_sources_pkg-symbols/sub.sym create mode 100644 tests/netlist/regression/multiple_sources_pkg-symbols/sym.sym create mode 100644 tests/netlist/regression/multiple_sources_pkg.sch diff --git a/src/backend/util_repackage.py b/src/backend/util_repackage.py index 93a714e90..d16e01caa 100644 --- a/src/backend/util_repackage.py +++ b/src/backend/util_repackage.py @@ -96,7 +96,7 @@ def repackage(netlist, refdes_func): if netlist.flat_package_namespace: namespace = None else: - namespace = component.sheet.instantiating_component + namespace = component.sheet.namespace try: package = pkg_dict[namespace, new_refdes] diff --git a/src/command/netlist.py b/src/command/netlist.py index 700e19760..61bfa8813 100644 --- a/src/command/netlist.py +++ b/src/command/netlist.py @@ -117,20 +117,12 @@ def source_library_search(path): ## Construct component and net names for hierarchical schematics. -def mangle(basename, component, separator0, order0, separator1, order1): - if component is None: +def mangle(basename, hierarchy_tag, separator0, order0, separator1, order1): + if not hierarchy_tag: return basename if basename is None: return None - # prefix which is attached to all component and net names - # found in this schematic - hierarchy_tag = [] - while component is not None: - hierarchy_tag.insert(0, component.blueprint.refdes) - component = component.sheet.instantiating_component - assert hierarchy_tag - if order0 == PREPEND: hierarchy_tag.reverse() diff --git a/src/gaf/netlist/instance.py b/src/gaf/netlist/instance.py index cf17af6ad..b088b12cd 100644 --- a/src/gaf/netlist/instance.py +++ b/src/gaf/netlist/instance.py @@ -49,6 +49,15 @@ class Sheet: if instantiating_component is not None: instantiating_component.subsheets.append(self) + # prefix which is attached to all component and net names + # found in this schematic + next_parent = self.instantiating_component + namespace_parts = [] + while next_parent is not None: + namespace_parts.insert(0, next_parent.blueprint.refdes) + next_parent = next_parent.sheet.instantiating_component + self.namespace = tuple(namespace_parts) + # Starting internal netlist creation for net_blueprint in self.blueprint.nets: diff --git a/src/gaf/netlist/net.py b/src/gaf/netlist/net.py index e3cf1d905..cae29de1a 100644 --- a/src/gaf/netlist/net.py +++ b/src/gaf/netlist/net.py @@ -118,7 +118,7 @@ def postproc_instances(netlist, flat_namespace, prefer_netname_attribute, if flat_namespace[from_netattrib]: net_name = None, net_name else: - net_name = sheet.instantiating_component, net_name + net_name = sheet.namespace, net_name try: net = net_dict[net_name] @@ -228,8 +228,7 @@ def postproc_instances(netlist, flat_namespace, prefer_netname_attribute, if flat_namespace[False]: net_name = None, net_name else: - net_name = component.sheet.instantiating_component, \ - net_name + net_name = component.sheet.namespace, net_name net.namespace, net.unmangled_name = net_name net.unnamed_counter = unnamed_counter diff --git a/src/gaf/netlist/netlist.py b/src/gaf/netlist/netlist.py index 0ec6a479d..992594621 100644 --- a/src/gaf/netlist/netlist.py +++ b/src/gaf/netlist/netlist.py @@ -346,7 +346,7 @@ class Netlist: if component.blueprint.refdes is not None: component.refdes = refdes_mangle_func( component.blueprint.refdes, - component.sheet.instantiating_component) + component.sheet.namespace) # assign package refdes for package in self.packages: diff --git a/src/gaf/netlist/package.py b/src/gaf/netlist/package.py index 632238b23..299dfd69b 100644 --- a/src/gaf/netlist/package.py +++ b/src/gaf/netlist/package.py @@ -273,7 +273,7 @@ def postproc_instances(netlist, flat_namespace): if flat_namespace: namespace = None else: - namespace = component.sheet.instantiating_component + namespace = component.sheet.namespace try: package = pkg_dict[namespace, component.blueprint.refdes] @@ -319,7 +319,7 @@ def postproc_instances(netlist, flat_namespace): if flat_namespace: namespace = None else: - namespace = cpin.component.sheet.instantiating_component + namespace = cpin.component.sheet.namespace ppin = pkg_dict[namespace, cpin.component.blueprint.refdes] \ .pins_by_number[cpin.blueprint.number] if ppin not in net.connections: diff --git a/tests/netlist/Makefile.am b/tests/netlist/Makefile.am index 1c8127f4c..b829a832c 100644 --- a/tests/netlist/Makefile.am +++ b/tests/netlist/Makefile.am @@ -56,6 +56,7 @@ TESTS = stack_1-geda.out \ regression/duplicate_port-geda.out \ regression/missing_pinseq-geda.out \ regression/multiple_sources-geda.out \ + regression/multiple_sources_pkg-geda.out \ regression/named_unconnected_net-geda.out \ regression/override_netname-geda.out \ regression/refdes_promotion-geda.out \ @@ -525,6 +526,12 @@ testdata = \ regression/multiple_sources-symbols/sub.sym \ regression/multiple_sources-symbols/sym.sym \ regression/multiple_sources.sch \ + regression/multiple_sources_pkg-sources/sub-0.sch \ + regression/multiple_sources_pkg-sources/sub-1.sch \ + regression/multiple_sources_pkg-symbols/io.sym \ + regression/multiple_sources_pkg-symbols/sub.sym \ + regression/multiple_sources_pkg-symbols/sym.sym \ + regression/multiple_sources_pkg.sch \ regression/named_unconnected_net.sch \ regression/override_netname-symbols/component.sym \ regression/override_netname-symbols/power.sym \ diff --git a/tests/netlist/regression/gschemrc b/tests/netlist/regression/gschemrc index 654200855..74c4e6b0b 100644 --- a/tests/netlist/regression/gschemrc +++ b/tests/netlist/regression/gschemrc @@ -3,6 +3,7 @@ (source-library "duplicate_pinlabel-sources") (source-library "duplicate_port-sources") (source-library "multiple_sources-sources") +(source-library "multiple_sources_pkg-sources") (reset-component-library) (component-library-search "../std-symbols") (component-library "component_refdes-symbols") @@ -11,6 +12,7 @@ (component-library "duplicate_port-symbols") (component-library "missing_pinseq-symbols") (component-library "multiple_sources-symbols") +(component-library "multiple_sources_pkg-symbols") (component-library "override_netname-symbols") (component-library "refdes_promotion-symbols") (component-library "transform_symbols-symbols") diff --git a/tests/netlist/regression/multiple_sources_pkg-geda.out b/tests/netlist/regression/multiple_sources_pkg-geda.out new file mode 100644 index 000000000..95854873d --- /dev/null +++ b/tests/netlist/regression/multiple_sources_pkg-geda.out @@ -0,0 +1,22 @@ +START header + +gEDA's netlist format +Created specifically for testing of gnetlist + +END header + +START components + +A/B2 device=unknown +A/C device=unknown +A/B1 device=unknown + +END components + +START nets + +A/RIGHT : A/C 4, A/B2 2, A/C 2, A/B1 2 +A/LEFT : A/C 3, A/B2 1, A/C 1, A/B1 1 + +END nets + diff --git a/tests/netlist/regression/multiple_sources_pkg-sources/sub-0.sch b/tests/netlist/regression/multiple_sources_pkg-sources/sub-0.sch new file mode 100644 index 000000000..24214e16d --- /dev/null +++ b/tests/netlist/regression/multiple_sources_pkg-sources/sub-0.sch @@ -0,0 +1,32 @@ +v 20191008 2 +C -1400 0 1 0 0 io.sym +{ +T -1700 0 5 10 1 0 0 7 1 +netname=LEFT +} +N -1400 0 -1000 0 4 +N -1000 -500 -400 -500 4 +N -1000 -500 -1000 500 4 +N -1000 500 -400 500 4 +C 0 500 1 0 0 sym.sym +{ +T -400 800 5 10 1 0 0 0 1 +refdes=B1 +} +C 0 -500 1 0 0 sym.sym +{ +T -400 -200 5 10 1 0 0 0 1 +refdes=C +T -400 -900 5 10 1 0 0 0 1 +slotdef=1:1,2 +T -400 -1100 5 10 1 0 0 0 1 +slot=1 +} +N 400 -500 1000 -500 4 +N 1000 -500 1000 500 4 +N 400 500 1000 500 4 +N 1000 0 3000 0 4 +{ +T 2950 50 5 10 1 0 0 6 1 +netname=RIGHT +} diff --git a/tests/netlist/regression/multiple_sources_pkg-sources/sub-1.sch b/tests/netlist/regression/multiple_sources_pkg-sources/sub-1.sch new file mode 100644 index 000000000..991d01498 --- /dev/null +++ b/tests/netlist/regression/multiple_sources_pkg-sources/sub-1.sch @@ -0,0 +1,32 @@ +v 20191008 2 +C -1400 0 1 0 0 io.sym +{ +T -1700 0 5 10 1 0 0 7 1 +netname=LEFT +} +N -1400 0 -1000 0 4 +N -1000 -500 -400 -500 4 +N -1000 -500 -1000 500 4 +N -1000 500 -400 500 4 +C 0 500 1 0 0 sym.sym +{ +T -400 800 5 10 1 0 0 0 1 +refdes=B2 +} +C 0 -500 1 0 0 sym.sym +{ +T -400 -200 5 10 1 0 0 0 1 +refdes=C +T -400 -900 5 10 1 0 0 0 1 +slotdef=2:3,4 +T -400 -1100 5 10 1 0 0 0 1 +slot=2 +} +N 400 -500 1000 -500 4 +N 1000 -500 1000 500 4 +N 400 500 1000 500 4 +N 1000 0 3000 0 4 +{ +T 2950 50 5 10 1 0 0 6 1 +netname=RIGHT +} diff --git a/tests/netlist/regression/multiple_sources_pkg-symbols/io.sym b/tests/netlist/regression/multiple_sources_pkg-symbols/io.sym new file mode 100644 index 000000000..b92996e9f --- /dev/null +++ b/tests/netlist/regression/multiple_sources_pkg-symbols/io.sym @@ -0,0 +1,9 @@ +v 20191008 2 +P 0 0 -200 0 1 0 0 +{ +T -300 50 5 8 0 1 0 6 1 +pinnumber=1 +} +T -300 0 8 10 1 0 0 7 1 +netname=unknown +L -200 100 -200 -100 3 10 1 0 -1 -1 diff --git a/tests/netlist/regression/multiple_sources_pkg-symbols/sub.sym b/tests/netlist/regression/multiple_sources_pkg-symbols/sub.sym new file mode 100644 index 000000000..466285faa --- /dev/null +++ b/tests/netlist/regression/multiple_sources_pkg-symbols/sub.sym @@ -0,0 +1,5 @@ +v 20191008 2 +T 0 0 8 10 1 0 0 0 1 +refdes=A +T 0 -200 8 10 1 0 0 0 1 +source=sub.sch diff --git a/tests/netlist/regression/multiple_sources_pkg-symbols/sym.sym b/tests/netlist/regression/multiple_sources_pkg-symbols/sym.sym new file mode 100644 index 000000000..c2784afb6 --- /dev/null +++ b/tests/netlist/regression/multiple_sources_pkg-symbols/sym.sym @@ -0,0 +1,18 @@ +v 20191008 2 +P -400 0 -200 0 1 0 0 +{ +T -300 50 5 8 1 1 0 6 1 +pinnumber=1 +T -300 -50 5 8 0 1 0 8 1 +pinseq=1 +} +P 400 0 200 0 1 0 0 +{ +T 300 50 5 8 1 1 0 0 1 +pinnumber=2 +T 300 -50 5 8 0 1 0 2 1 +pinseq=2 +} +T -400 300 8 10 1 0 0 0 1 +refdes=B? +B -200 -200 400 400 3 0 1 0 -1 -1 0 -1 -1 -1 -1 -1 diff --git a/tests/netlist/regression/multiple_sources_pkg.sch b/tests/netlist/regression/multiple_sources_pkg.sch new file mode 100644 index 000000000..4bc68d0ab --- /dev/null +++ b/tests/netlist/regression/multiple_sources_pkg.sch @@ -0,0 +1,15 @@ +v 20191008 2 +C 0 0 1 0 0 sub.sym +{ +T 0 0 5 10 1 0 0 0 1 +refdes=A +T 0 -200 5 10 1 0 0 0 1 +source=sub-0.sch +} +C 0 -400 1 0 0 sub.sym +{ +T 0 -400 5 10 1 0 0 0 1 +refdes=A +T 0 -600 5 10 1 0 0 0 1 +source=sub-1.sch +} -- 2.11.4.GIT