Skip to content

Commit 172da52

Browse files
committed
[CompileGuard] Exclude default from keys
1 parent 5bee42c commit 172da52

File tree

1 file changed

+9
-19
lines changed

1 file changed

+9
-19
lines changed

magma/compile_guard.py

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,15 @@ def _is_simple_type(T: Kind) -> bool:
140140

141141
class _CompileGuardSelect(Generator2):
142142
def __init__(self, T: Kind, keys: Tuple[str]):
143+
assert keys # not empty
143144
self.T = T
144145
self.keys = keys
145-
assert len(self.keys) > 1
146146
self.io = IO(
147-
**{f"I{i}": In(T) for i in range(len(self.keys))},
147+
**{f"I{i}": In(T) for i in range(len(self.keys) + 1)},
148148
O=Out(T),
149149
)
150150
T_str = type_to_sanitized_string(T)
151-
self.name = f"CompileGuardSelect_{T_str}_{'_'.join(keys)}"
151+
self.name = f"CompileGuardSelect_{T_str}_{'_'.join(keys)}_default"
152152
self.primitive = True
153153

154154
def elaborate(self):
@@ -161,17 +161,9 @@ def elaborate(self):
161161
raise TypeError(f"Unsupported type: {self.T}")
162162
self.verilog = ""
163163
for i, key in enumerate(self.keys):
164-
if i == 0:
165-
stmt = f"`ifdef {key}"
166-
elif key == "default":
167-
assert i == (len(self.keys) - 1)
168-
stmt = "`else"
169-
else:
170-
stmt = f"`elsif {key}"
171-
self.verilog += f"""\
172-
{stmt}
173-
assign O = I{i};
174-
"""
164+
pred = f"`ifdef {key}" if i == 0 else f"`elsif {key}"
165+
self.verilog += f"{pred}\n assign O = I{i};\n"
166+
self.verilog += f"`else\n assign O = I{len(self.keys)};\n"
175167
self.verilog += "`endif"
176168

177169

@@ -185,9 +177,7 @@ def compile_guard_select(**kwargs):
185177
raise KeyError("Expected default argument") from None
186178
if not kwargs: # kwargs is empty
187179
raise KeyError("Expected at least one key besides default")
188-
# We rely on insertion order to make the default the last element for the
189-
# generated if/elif/else code.
190-
kwargs["default"] = default
191-
T, _ = infer_mux_type(list(kwargs.values()))
180+
values = tuple(kwargs.values()) + (default,)
181+
T, values = infer_mux_type(values)
192182
Select = _CompileGuardSelect(T, tuple(kwargs.keys()))
193-
return Select()(*kwargs.values())
183+
return Select()(*values)

0 commit comments

Comments
 (0)