@@ -874,18 +874,6 @@ def emit_rhs(self, module_idx: int, value: _ast.Value) -> Tuple[_nir.Value, bool
874
874
signed = False
875
875
else :
876
876
assert False # :nocov:
877
- elif len (value .operands ) == 3 :
878
- assert value .operator == 'm'
879
- operand_s , signed_s = self .emit_rhs (module_idx , value .operands [0 ])
880
- operand_a , signed_a = self .emit_rhs (module_idx , value .operands [1 ])
881
- operand_b , signed_b = self .emit_rhs (module_idx , value .operands [2 ])
882
- if len (operand_s ) != 1 :
883
- operand_s = self .emit_operator (module_idx , 'b' , operand_s ,
884
- src_loc = value .src_loc )
885
- operand_a , operand_b , signed = \
886
- self .unify_shapes_bitwise (operand_a , signed_a , operand_b , signed_b )
887
- result = self .emit_operator (module_idx , 'm' , operand_s , operand_a , operand_b ,
888
- src_loc = value .src_loc )
889
877
else :
890
878
assert False # :nocov:
891
879
elif isinstance (value , _ast .Slice ):
@@ -901,39 +889,51 @@ def emit_rhs(self, module_idx: int, value: _ast.Value) -> Tuple[_nir.Value, bool
901
889
signed = False
902
890
elif isinstance (value , _ast .SwitchValue ):
903
891
test , _signed = self .emit_rhs (module_idx , value .test )
904
- conds = []
905
- elems = []
906
- for patterns , elem , in value .cases :
907
- if patterns is not None :
908
- if not patterns :
909
- # Hack: empty pattern set cannot be supported by RTLIL.
910
- continue
911
- for pattern in patterns :
912
- assert len (pattern ) == len (test )
913
- cell = _nir .Matches (module_idx , value = test , patterns = patterns ,
914
- src_loc = value .src_loc )
915
- net , = self .netlist .add_value_cell (1 , cell )
916
- conds .append (net )
917
- else :
918
- conds .append (_nir .Net .from_const (1 ))
919
- elems .append (self .emit_rhs (module_idx , elem ))
920
- cell = _nir .PriorityMatch (module_idx , en = _nir .Net .from_const (1 ),
921
- inputs = _nir .Value (conds ),
922
- src_loc = value .src_loc )
923
- conds = self .netlist .add_value_cell (len (conds ), cell )
924
- shape = _ast .Shape ._unify (
925
- _ast .Shape (len (value ), signed )
926
- for value , signed in elems
927
- )
928
- elems = tuple (self .extend (elem , elem_signed , shape .width ) for elem , elem_signed in elems )
929
- assignments = [
930
- _nir .Assignment (cond = subcond , start = 0 , value = elem , src_loc = value .src_loc )
931
- for subcond , elem in zip (conds , elems )
932
- ]
933
- cell = _nir .AssignmentList (module_idx , default = _nir .Value .from_const (0 , shape .width ),
934
- assignments = assignments , src_loc = value .src_loc )
935
- result = self .netlist .add_value_cell (shape .width , cell )
936
- signed = shape .signed
892
+ if (len (value .cases ) == 2 and
893
+ value .cases [0 ][0 ] == ("0" * len (test ),) and
894
+ value .cases [1 ][0 ] is None ):
895
+ operand_a , signed_a = self .emit_rhs (module_idx , value .cases [1 ][1 ])
896
+ operand_b , signed_b = self .emit_rhs (module_idx , value .cases [0 ][1 ])
897
+ if len (test ) != 1 :
898
+ test = self .emit_operator (module_idx , 'b' , test , src_loc = value .src_loc )
899
+ operand_a , operand_b , signed = \
900
+ self .unify_shapes_bitwise (operand_a , signed_a , operand_b , signed_b )
901
+ result = self .emit_operator (module_idx , 'm' , test , operand_a , operand_b ,
902
+ src_loc = value .src_loc )
903
+ else :
904
+ conds = []
905
+ elems = []
906
+ for patterns , elem , in value .cases :
907
+ if patterns is not None :
908
+ if not patterns :
909
+ # Hack: empty pattern set cannot be supported by RTLIL.
910
+ continue
911
+ for pattern in patterns :
912
+ assert len (pattern ) == len (test )
913
+ cell = _nir .Matches (module_idx , value = test , patterns = patterns ,
914
+ src_loc = value .src_loc )
915
+ net , = self .netlist .add_value_cell (1 , cell )
916
+ conds .append (net )
917
+ else :
918
+ conds .append (_nir .Net .from_const (1 ))
919
+ elems .append (self .emit_rhs (module_idx , elem ))
920
+ cell = _nir .PriorityMatch (module_idx , en = _nir .Net .from_const (1 ),
921
+ inputs = _nir .Value (conds ),
922
+ src_loc = value .src_loc )
923
+ conds = self .netlist .add_value_cell (len (conds ), cell )
924
+ shape = _ast .Shape ._unify (
925
+ _ast .Shape (len (value ), signed )
926
+ for value , signed in elems
927
+ )
928
+ elems = tuple (self .extend (elem , elem_signed , shape .width ) for elem , elem_signed in elems )
929
+ assignments = [
930
+ _nir .Assignment (cond = subcond , start = 0 , value = elem , src_loc = value .src_loc )
931
+ for subcond , elem in zip (conds , elems )
932
+ ]
933
+ cell = _nir .AssignmentList (module_idx , default = _nir .Value .from_const (0 , shape .width ),
934
+ assignments = assignments , src_loc = value .src_loc )
935
+ result = self .netlist .add_value_cell (shape .width , cell )
936
+ signed = shape .signed
937
937
elif isinstance (value , _ast .Concat ):
938
938
nets = []
939
939
for val in value .parts :
0 commit comments