@@ -140,15 +140,15 @@ def _is_simple_type(T: Kind) -> bool:
140
140
141
141
class _CompileGuardSelect (Generator2 ):
142
142
def __init__ (self , T : Kind , keys : Tuple [str ]):
143
+ assert keys # not empty
143
144
self .T = T
144
145
self .keys = keys
145
- assert len (self .keys ) > 1
146
146
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 )},
148
148
O = Out (T ),
149
149
)
150
150
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 "
152
152
self .primitive = True
153
153
154
154
def elaborate (self ):
@@ -161,17 +161,9 @@ def elaborate(self):
161
161
raise TypeError (f"Unsupported type: { self .T } " )
162
162
self .verilog = ""
163
163
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 "
175
167
self .verilog += "`endif"
176
168
177
169
@@ -185,9 +177,7 @@ def compile_guard_select(**kwargs):
185
177
raise KeyError ("Expected default argument" ) from None
186
178
if not kwargs : # kwargs is empty
187
179
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 )
192
182
Select = _CompileGuardSelect (T , tuple (kwargs .keys ()))
193
- return Select ()(* kwargs . values () )
183
+ return Select ()(* values )
0 commit comments