|
52 | 52 | from magma.circuit import AnonymousCircuitType, CircuitKind, DefineCircuitKind |
53 | 53 | from magma.clock import Reset, ResetN, AsyncReset, AsyncResetN |
54 | 54 | from magma.common import filter_by_key, assert_false |
55 | | -from magma.compile_guard import get_compile_guard_data |
| 55 | +from magma.compile_guard import get_compile_guard_data, CompileGuardSelect |
56 | 56 | from magma.digital import Digital, DigitalMeta |
57 | 57 | from magma.inline_verilog_expression import InlineVerilogExpression |
58 | 58 | from magma.inline_verilog2 import InlineVerilog2 |
@@ -880,6 +880,27 @@ def visit_magma_xmr_source(self, module: ModuleWrapper) -> bool: |
880 | 880 | sv.ReadInOutOp(operands=[in_out], results=[result]) |
881 | 881 | return True |
882 | 882 |
|
| 883 | + @wrap_with_not_implemented_error |
| 884 | + def visit_magma_compile_guard_select(self, module: ModuleWrapper) -> bool: |
| 885 | + inst = module.module |
| 886 | + defn = type(inst) |
| 887 | + assert isinstance(defn, CompileGuardSelect) |
| 888 | + assert len(defn.keys) + 1 == len(module.operands) |
| 889 | + assert len(module.results) == 1 |
| 890 | + result = module.results[0] |
| 891 | + mlir_type = magma_type_to_mlir_type(defn.T) |
| 892 | + reg = self.ctx.new_value(hw.InOutType(mlir_type)) |
| 893 | + sv.RegOp(results=[reg]) |
| 894 | + with contextlib.ExitStack() as stack: |
| 895 | + for i, key in enumerate(defn.keys): |
| 896 | + if_def = sv.IfDefOp(key) |
| 897 | + stack.enter_context(push_block(if_def.then_block)) |
| 898 | + sv.AssignOp(operands=[reg, module.operands[i]]) |
| 899 | + stack.enter_context(push_block(if_def.else_block)) |
| 900 | + sv.AssignOp(operands=[reg, module.operands[-1]]) |
| 901 | + sv.ReadInOutOp(operands=[reg], results=[result]) |
| 902 | + return True |
| 903 | + |
883 | 904 | @wrap_with_not_implemented_error |
884 | 905 | def visit_inline_verilog(self, module: ModuleWrapper) -> bool: |
885 | 906 | inst = module.module |
@@ -921,6 +942,8 @@ def visit_instance(self, module: ModuleWrapper) -> bool: |
921 | 942 | return self.visit_magma_xmr_sink(module) |
922 | 943 | if isinstance(defn, XMRSource): |
923 | 944 | return self.visit_magma_xmr_source(module) |
| 945 | + if isinstance(defn, CompileGuardSelect): |
| 946 | + return self.visit_magma_compile_guard_select(module) |
924 | 947 | if getattr(defn, "inline_verilog_strs", []): |
925 | 948 | return self.visit_inline_verilog(module) |
926 | 949 | if isprimitive(defn): |
|
0 commit comments