diff --git a/amaranth/hdl/_ir.py b/amaranth/hdl/_ir.py index 5c6ace6..762683b 100644 --- a/amaranth/hdl/_ir.py +++ b/amaranth/hdl/_ir.py @@ -772,7 +772,7 @@ class NetlistEmitter: signal, bit = self.late_net_to_signal[left] other_src_loc = self.connect_src_loc[left] 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.connect_src_loc[left] = src_loc @@ -785,15 +785,15 @@ class NetlistEmitter: 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" raise _ir.DriverConflict( - f"Signal {lhs} driven from domain {domain_name} at {src_loc} and domain " - f"{other_domain_name} at {driver.src_loc}") + 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[0]}:{driver.src_loc[1]}") if driver.module_idx != module_idx: mod_name = ".".join(self.netlist.modules[module_idx].name or ("",)) other_mod_name = \ ".".join(self.netlist.modules[driver.module_idx].name or ("",)) raise _ir.DriverConflict( - f"Signal {lhs} driven from module {mod_name} at {src_loc} and " - f"module {other_mod_name} at {driver.src_loc}") + 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[0]}:{driver.src_loc[1]}") else: driver = NetlistDriver(module_idx, lhs, domain=cd, src_loc=src_loc) self.drivers[lhs] = driver diff --git a/tests/test_hdl_ast.py b/tests/test_hdl_ast.py index 5cc6c2a..18653a5 100644 --- a/tests/test_hdl_ast.py +++ b/tests/test_hdl_ast.py @@ -1,4 +1,4 @@ -# amaranth: UnusedPrint=no, UnusedProperty +# amaranth: UnusedPrint=no, UnusedProperty=no import warnings from enum import Enum, EnumMeta diff --git a/tests/test_hdl_ir.py b/tests/test_hdl_ir.py index f01a773..f37e05a 100644 --- a/tests/test_hdl_ir.py +++ b/tests/test_hdl_ir.py @@ -3142,3 +3142,40 @@ class SwitchTestCase(FHDLTestCase): (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), [])