hdl._ir: Fix fallout from #1190, add more tests.
This commit is contained in:
parent
23f1b63425
commit
18b54ded0a
|
@ -772,7 +772,7 @@ class NetlistEmitter:
|
||||||
signal, bit = self.late_net_to_signal[left]
|
signal, bit = self.late_net_to_signal[left]
|
||||||
other_src_loc = self.connect_src_loc[left]
|
other_src_loc = self.connect_src_loc[left]
|
||||||
raise _ir.DriverConflict(f"Bit {bit} of signal {signal!r} has multiple drivers: "
|
raise _ir.DriverConflict(f"Bit {bit} of signal {signal!r} has multiple drivers: "
|
||||||
f"{other_src_loc} and {src_loc}")
|
f"{other_src_loc[0]}:{other_src_loc[1]} and {src_loc[0]}:{src_loc[1]}")
|
||||||
self.netlist.connections[left] = right
|
self.netlist.connections[left] = right
|
||||||
self.connect_src_loc[left] = src_loc
|
self.connect_src_loc[left] = src_loc
|
||||||
|
|
||||||
|
@ -785,15 +785,15 @@ class NetlistEmitter:
|
||||||
domain_name = cd.name if cd is not None else "comb"
|
domain_name = cd.name if cd is not None else "comb"
|
||||||
other_domain_name = driver.domain.name if driver.domain is not None else "comb"
|
other_domain_name = driver.domain.name if driver.domain is not None else "comb"
|
||||||
raise _ir.DriverConflict(
|
raise _ir.DriverConflict(
|
||||||
f"Signal {lhs} driven from domain {domain_name} at {src_loc} and domain "
|
f"Signal {lhs!r} driven from domain {domain_name} at {src_loc[0]}:{src_loc[1]} and domain "
|
||||||
f"{other_domain_name} at {driver.src_loc}")
|
f"{other_domain_name} at {driver.src_loc[0]}:{driver.src_loc[1]}")
|
||||||
if driver.module_idx != module_idx:
|
if driver.module_idx != module_idx:
|
||||||
mod_name = ".".join(self.netlist.modules[module_idx].name or ("<toplevel>",))
|
mod_name = ".".join(self.netlist.modules[module_idx].name or ("<toplevel>",))
|
||||||
other_mod_name = \
|
other_mod_name = \
|
||||||
".".join(self.netlist.modules[driver.module_idx].name or ("<toplevel>",))
|
".".join(self.netlist.modules[driver.module_idx].name or ("<toplevel>",))
|
||||||
raise _ir.DriverConflict(
|
raise _ir.DriverConflict(
|
||||||
f"Signal {lhs} driven from module {mod_name} at {src_loc} and "
|
f"Signal {lhs!r} driven from module {mod_name} at {src_loc[0]}:{src_loc[1]} and "
|
||||||
f"module {other_mod_name} at {driver.src_loc}")
|
f"module {other_mod_name} at {driver.src_loc[0]}:{driver.src_loc[1]}")
|
||||||
else:
|
else:
|
||||||
driver = NetlistDriver(module_idx, lhs, domain=cd, src_loc=src_loc)
|
driver = NetlistDriver(module_idx, lhs, domain=cd, src_loc=src_loc)
|
||||||
self.drivers[lhs] = driver
|
self.drivers[lhs] = driver
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# amaranth: UnusedPrint=no, UnusedProperty
|
# amaranth: UnusedPrint=no, UnusedProperty=no
|
||||||
|
|
||||||
import warnings
|
import warnings
|
||||||
from enum import Enum, EnumMeta
|
from enum import Enum, EnumMeta
|
||||||
|
|
|
@ -3142,3 +3142,40 @@ class SwitchTestCase(FHDLTestCase):
|
||||||
(cell 21 0 (cover 0.6 20.0 neg 0.12 ('c')))
|
(cell 21 0 (cover 0.6 20.0 neg 0.12 ('c')))
|
||||||
)
|
)
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
class ConflictTestCase(FHDLTestCase):
|
||||||
|
def test_domain_conflict(self):
|
||||||
|
s = Signal()
|
||||||
|
m = Module()
|
||||||
|
m.d.sync += s.eq(1)
|
||||||
|
m1 = Module()
|
||||||
|
m1.d.comb += s.eq(2)
|
||||||
|
m.submodules.m1 = m1
|
||||||
|
with self.assertRaisesRegex(DriverConflict,
|
||||||
|
r"^Signal \(sig s\) driven from domain comb at "
|
||||||
|
r".*test_hdl_ir.py:\d+ and domain sync at "
|
||||||
|
r".*test_hdl_ir.py:\d+$"):
|
||||||
|
build_netlist(Fragment.get(m, None), [])
|
||||||
|
|
||||||
|
def test_module_conflict(self):
|
||||||
|
s = Signal()
|
||||||
|
m = Module()
|
||||||
|
m.d.sync += s.eq(1)
|
||||||
|
m1 = Module()
|
||||||
|
m1.d.sync += s.eq(2)
|
||||||
|
m.submodules.m1 = m1
|
||||||
|
with self.assertRaisesRegex(DriverConflict,
|
||||||
|
r"^Signal \(sig s\) driven from module top\.m1 at "
|
||||||
|
r".*test_hdl_ir.py:\d+ and module top at "
|
||||||
|
r".*test_hdl_ir.py:\d+$"):
|
||||||
|
build_netlist(Fragment.get(m, None), [])
|
||||||
|
|
||||||
|
def test_instance_conflict(self):
|
||||||
|
s = Signal()
|
||||||
|
m = Module()
|
||||||
|
m.d.sync += s.eq(1)
|
||||||
|
m.submodules.t = Instance("tt", o_s=s)
|
||||||
|
with self.assertRaisesRegex(DriverConflict,
|
||||||
|
r"^Bit 0 of signal \(sig s\) has multiple drivers: "
|
||||||
|
r".*test_hdl_ir.py:\d+ and .*test_hdl_ir.py:\d+$"):
|
||||||
|
build_netlist(Fragment.get(m, None), [])
|
||||||
|
|
Loading…
Reference in a new issue