Skip to content

Commit 45dbce1

Browse files
wanda-phiwhitequark
authored andcommitted
hdl: consistently use "comb" for combinatorial domain.
Fixes #1097.
1 parent b6c5294 commit 45dbce1

File tree

11 files changed

+104
-115
lines changed

11 files changed

+104
-115
lines changed

amaranth/back/rtlil.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ def _convert_fragment(builder, fragment, name_map, hierarchy):
794794
rd_clk_polarity = 0
795795
rd_transparency_mask = 0
796796
for index, port in enumerate(fragment._read_ports):
797-
if port._domain is not None:
797+
if port._domain != "comb":
798798
cd = fragment.domains[port._domain]
799799
rd_clk.append(cd.clk)
800800
if cd.clk_edge == "pos":
@@ -870,7 +870,7 @@ def make_en(port):
870870
# affects further codegen; e.g. whether \sig$next signals will be generated and used.
871871
for domain, statements in fragment.statements.items():
872872
for signal in statements._lhs_signals():
873-
compiler_state.add_driven(signal, sync=domain is not None)
873+
compiler_state.add_driven(signal, sync=domain != "comb")
874874

875875
# Transform all signals used as ports in the current fragment eagerly and outside of
876876
# any hierarchy, to make sure they get sensible (non-prefixed) names.
@@ -943,7 +943,7 @@ def make_en(port):
943943
# For every signal in sync domains, assign \sig$next to the current
944944
# value (\sig).
945945
for signal in group_signals:
946-
if domain is None:
946+
if domain == "comb":
947947
prev_value = _ast.Const(signal.reset, signal.width)
948948
else:
949949
prev_value = signal

amaranth/hdl/_dsl.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,7 @@ def __getattr__(self, name):
4848
"did you mean <module>.{} instead?"
4949
.format(name, name, name),
5050
SyntaxWarning, stacklevel=2)
51-
if name == "comb":
52-
domain = None
53-
else:
54-
domain = name
55-
return _ModuleBuilderDomain(self._builder, self._depth, domain)
51+
return _ModuleBuilderDomain(self._builder, self._depth, name)
5652

5753
def __getitem__(self, name):
5854
return self.__getattr__(name)
@@ -520,20 +516,13 @@ def _pop_ctrl(self):
520516
for name in fsm_states}))
521517

522518
def _add_statement(self, assigns, domain, depth):
523-
def domain_name(domain):
524-
if domain is None:
525-
return "comb"
526-
else:
527-
return domain
528-
529519
while len(self._ctrl_stack) > self.domain._depth:
530520
self._pop_ctrl()
531521

532522
for stmt in Statement.cast(assigns):
533523
if not isinstance(stmt, (Assign, Property)):
534524
raise SyntaxError(
535-
"Only assignments and property checks may be appended to d.{}"
536-
.format(domain_name(domain)))
525+
f"Only assignments and property checks may be appended to d.{domain}")
537526

538527
stmt._MustUse__used = True
539528

@@ -543,9 +532,8 @@ def domain_name(domain):
543532
elif self._driving[signal] != domain:
544533
cd_curr = self._driving[signal]
545534
raise SyntaxError(
546-
"Driver-driver conflict: trying to drive {!r} from d.{}, but it is "
547-
"already driven from d.{}"
548-
.format(signal, domain_name(domain), domain_name(cd_curr)))
535+
f"Driver-driver conflict: trying to drive {signal!r} from d.{domain}, but it is "
536+
f"already driven from d.{cd_curr}")
549537

550538
self._statements.setdefault(domain, []).append(stmt)
551539

amaranth/hdl/_ir.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ def iter_ports(self, dir=None):
8686
if port_dir == dir:
8787
yield port
8888

89-
def add_driver(self, signal, domain=None):
89+
def add_driver(self, signal, domain="comb"):
90+
assert isinstance(domain, str)
9091
if domain not in self.drivers:
9192
self.drivers[domain] = SignalSet()
9293
self.drivers[domain].add(signal)
@@ -97,12 +98,12 @@ def iter_drivers(self):
9798
yield domain, signal
9899

99100
def iter_comb(self):
100-
if None in self.drivers:
101-
yield from self.drivers[None]
101+
if "comb" in self.drivers:
102+
yield from self.drivers["comb"]
102103

103104
def iter_sync(self):
104105
for domain, signals in self.drivers.items():
105-
if domain is None:
106+
if domain == "comb":
106107
continue
107108
for signal in signals:
108109
yield domain, signal
@@ -111,7 +112,7 @@ def iter_signals(self):
111112
signals = SignalSet()
112113
signals |= self.ports.keys()
113114
for domain, domain_signals in self.drivers.items():
114-
if domain is not None:
115+
if domain != "comb":
115116
cd = self.domains[domain]
116117
signals.add(cd.clk)
117118
if cd.rst is not None:
@@ -129,7 +130,7 @@ def iter_domains(self):
129130
yield from self.domains
130131

131132
def add_statements(self, domain, *stmts):
132-
assert domain is None or isinstance(domain, str)
133+
assert isinstance(domain, str)
133134
for stmt in Statement.cast(stmts):
134135
stmt._MustUse__used = True
135136
self.statements.setdefault(domain, _StatementList()).append(stmt)
@@ -338,7 +339,7 @@ def _create_missing_domains(self, missing_domain, *, platform=None):
338339

339340
new_domains = []
340341
for domain_name in collector.used_domains - collector.defined_domains:
341-
if domain_name is None:
342+
if domain_name == "comb":
342343
continue
343344
value = missing_domain(domain_name)
344345
if value is None:
@@ -589,7 +590,7 @@ def add_signal_name(signal):
589590
add_signal_name(port)
590591

591592
for domain_name, domain_signals in self.drivers.items():
592-
if domain_name is not None:
593+
if domain_name != "comb":
593594
domain = self.domains[domain_name]
594595
add_signal_name(domain.clk)
595596
if domain.rst is not None:

amaranth/hdl/_mem.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,14 @@ def __init__(self, identity, addr, data):
3434
class MemoryInstance(Fragment):
3535
class _ReadPort:
3636
def __init__(self, *, domain, addr, data, en, transparency):
37-
assert domain is None or isinstance(domain, str)
38-
if domain == "comb":
39-
domain = None
37+
assert isinstance(domain, str)
4038
self._domain = domain
4139
self._addr = Value.cast(addr)
4240
self._data = Value.cast(data)
4341
self._en = Value.cast(en)
4442
self._transparency = tuple(transparency)
4543
assert len(self._en) == 1
46-
if domain is None:
44+
if domain == "comb":
4745
assert isinstance(self._en, Const)
4846
assert self._en.width == 1
4947
assert self._en.value == 1

amaranth/hdl/_xfrm.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ def __init__(self):
333333
self._local_domains = set()
334334

335335
def _add_used_domain(self, domain_name):
336-
if domain_name is None:
336+
if domain_name == "comb":
337337
return
338338
if domain_name in self._local_domains:
339339
return
@@ -517,7 +517,7 @@ def on_ResetSignal(self, value):
517517

518518
def _insert_resets(self, fragment):
519519
for domain_name, signals in fragment.drivers.items():
520-
if domain_name is None:
520+
if domain_name == "comb":
521521
continue
522522
domain = fragment.domains[domain_name]
523523
if domain.rst is None:
@@ -629,12 +629,14 @@ def __init__(self, controls):
629629
self.src_loc = None
630630
if isinstance(controls, Value):
631631
controls = {"sync": controls}
632+
if "comb" in controls:
633+
raise ValueError("Cannot add controls on the 'comb' domain")
632634
self.controls = OrderedDict(controls)
633635

634636
def on_fragment(self, fragment):
635637
new_fragment = super().on_fragment(fragment)
636638
for domain, signals in fragment.drivers.items():
637-
if domain is None or domain not in self.controls:
639+
if domain == "comb" or domain not in self.controls:
638640
continue
639641
self._insert_control(new_fragment, domain, signals)
640642
return new_fragment

amaranth/sim/_pyrtl.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ def __call__(self, fragment):
421421

422422
for domain_name in domains:
423423
domain_stmts = fragment.statements.get(domain_name, _StatementList())
424-
domain_process = PyRTLProcess(is_comb=domain_name is None)
424+
domain_process = PyRTLProcess(is_comb=domain_name == "comb")
425425
domain_signals = domain_stmts._lhs_signals()
426426

427427
if isinstance(fragment, MemoryInstance):
@@ -433,7 +433,7 @@ def __call__(self, fragment):
433433
emitter.append(f"def run():")
434434
emitter._level += 1
435435

436-
if domain_name is None:
436+
if domain_name == "comb":
437437
for signal in domain_signals:
438438
signal_index = self.state.get_signal(signal)
439439
emitter.append(f"next_{signal_index} = {signal.reset}")
@@ -448,7 +448,7 @@ def __call__(self, fragment):
448448
lhs = _LHSValueCompiler(self.state, emitter, rhs=rhs)
449449

450450
for port in fragment._read_ports:
451-
if port._domain is not None:
451+
if port._domain != "comb":
452452
continue
453453

454454
addr = rhs(port._addr)

0 commit comments

Comments
 (0)