Skip to content

Commit d28db3e

Browse files
authored
Merge pull request #258 from fvutils/copilot/implement-magic-operators
Add missing arithmetic operator magic methods for coverpoint expressions
2 parents c039eb6 + 20358f9 commit d28db3e

File tree

3 files changed

+564
-0
lines changed

3 files changed

+564
-0
lines changed

src/vsc/model/value_scalar.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,83 @@ def __sub__(self, rhs):
8080
v = int(rhs)
8181
return ValueScalar(self.v - v)
8282

83+
def __mul__(self, rhs):
84+
v = int(rhs)
85+
return ValueScalar(self.v * v)
86+
87+
def __truediv__(self, rhs):
88+
v = int(rhs)
89+
return ValueScalar(int(self.v / v))
90+
91+
def __floordiv__(self, rhs):
92+
v = int(rhs)
93+
return ValueScalar(self.v // v)
94+
95+
def __mod__(self, rhs):
96+
v = int(rhs)
97+
return ValueScalar(self.v % v)
98+
99+
def __or__(self, rhs):
100+
v = int(rhs)
101+
return ValueScalar(self.v | v)
102+
103+
def __xor__(self, rhs):
104+
v = int(rhs)
105+
return ValueScalar(self.v ^ v)
106+
107+
def __lshift__(self, rhs):
108+
v = int(rhs)
109+
return ValueScalar(self.v << v)
110+
111+
def __rshift__(self, rhs):
112+
v = int(rhs)
113+
return ValueScalar(self.v >> v)
114+
115+
# Reverse operators (for when constant is on the left side)
116+
def __radd__(self, lhs):
117+
v = int(lhs)
118+
return ValueScalar(v + self.v)
119+
120+
def __rsub__(self, lhs):
121+
v = int(lhs)
122+
return ValueScalar(v - self.v)
123+
124+
def __rmul__(self, lhs):
125+
v = int(lhs)
126+
return ValueScalar(v * self.v)
127+
128+
def __rtruediv__(self, lhs):
129+
v = int(lhs)
130+
return ValueScalar(int(v / self.v))
131+
132+
def __rfloordiv__(self, lhs):
133+
v = int(lhs)
134+
return ValueScalar(v // self.v)
135+
136+
def __rmod__(self, lhs):
137+
v = int(lhs)
138+
return ValueScalar(v % self.v)
139+
140+
def __rand__(self, lhs):
141+
v = int(lhs)
142+
return ValueScalar(v & self.v)
143+
144+
def __ror__(self, lhs):
145+
v = int(lhs)
146+
return ValueScalar(v | self.v)
147+
148+
def __rxor__(self, lhs):
149+
v = int(lhs)
150+
return ValueScalar(v ^ self.v)
151+
152+
def __rlshift__(self, lhs):
153+
v = int(lhs)
154+
return ValueScalar(v << self.v)
155+
156+
def __rrshift__(self, lhs):
157+
v = int(lhs)
158+
return ValueScalar(v >> self.v)
159+
83160
def __getitem__(self, rng):
84161
print("getitem")
85162

src/vsc/types.py

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,107 @@ def __invert__(self):
142142

143143
return expr(ExprUnaryModel(UnaryExprType.Not, lhs))
144144

145+
# Reverse operators (for when constant is on the left side)
146+
def __radd__(self, lhs):
147+
to_expr(lhs)
148+
lhs_e = pop_expr()
149+
# The current expression is on the stack
150+
rhs_e = pop_expr()
151+
e = ExprBinModel(lhs_e, BinExprType.Add, rhs_e)
152+
if in_srcinfo_mode():
153+
e.srcinfo = SourceInfo.mk(2)
154+
return expr(e)
155+
156+
def __rsub__(self, lhs):
157+
to_expr(lhs)
158+
lhs_e = pop_expr()
159+
rhs_e = pop_expr()
160+
e = ExprBinModel(lhs_e, BinExprType.Sub, rhs_e)
161+
if in_srcinfo_mode():
162+
e.srcinfo = SourceInfo.mk(2)
163+
return expr(e)
164+
165+
def __rmul__(self, lhs):
166+
to_expr(lhs)
167+
lhs_e = pop_expr()
168+
rhs_e = pop_expr()
169+
e = ExprBinModel(lhs_e, BinExprType.Mul, rhs_e)
170+
if in_srcinfo_mode():
171+
e.srcinfo = SourceInfo.mk(2)
172+
return expr(e)
173+
174+
def __rtruediv__(self, lhs):
175+
to_expr(lhs)
176+
lhs_e = pop_expr()
177+
rhs_e = pop_expr()
178+
e = ExprBinModel(lhs_e, BinExprType.Div, rhs_e)
179+
if in_srcinfo_mode():
180+
e.srcinfo = SourceInfo.mk(2)
181+
return expr(e)
182+
183+
def __rfloordiv__(self, lhs):
184+
to_expr(lhs)
185+
lhs_e = pop_expr()
186+
rhs_e = pop_expr()
187+
e = ExprBinModel(lhs_e, BinExprType.Div, rhs_e)
188+
if in_srcinfo_mode():
189+
e.srcinfo = SourceInfo.mk(2)
190+
return expr(e)
191+
192+
def __rmod__(self, lhs):
193+
to_expr(lhs)
194+
lhs_e = pop_expr()
195+
rhs_e = pop_expr()
196+
e = ExprBinModel(lhs_e, BinExprType.Mod, rhs_e)
197+
if in_srcinfo_mode():
198+
e.srcinfo = SourceInfo.mk(2)
199+
return expr(e)
200+
201+
def __rand__(self, lhs):
202+
to_expr(lhs)
203+
lhs_e = pop_expr()
204+
rhs_e = pop_expr()
205+
e = ExprBinModel(lhs_e, BinExprType.And, rhs_e)
206+
if in_srcinfo_mode():
207+
e.srcinfo = SourceInfo.mk(2)
208+
return expr(e)
209+
210+
def __ror__(self, lhs):
211+
to_expr(lhs)
212+
lhs_e = pop_expr()
213+
rhs_e = pop_expr()
214+
e = ExprBinModel(lhs_e, BinExprType.Or, rhs_e)
215+
if in_srcinfo_mode():
216+
e.srcinfo = SourceInfo.mk(2)
217+
return expr(e)
218+
219+
def __rxor__(self, lhs):
220+
to_expr(lhs)
221+
lhs_e = pop_expr()
222+
rhs_e = pop_expr()
223+
e = ExprBinModel(lhs_e, BinExprType.Xor, rhs_e)
224+
if in_srcinfo_mode():
225+
e.srcinfo = SourceInfo.mk(2)
226+
return expr(e)
227+
228+
def __rlshift__(self, lhs):
229+
to_expr(lhs)
230+
lhs_e = pop_expr()
231+
rhs_e = pop_expr()
232+
e = ExprBinModel(lhs_e, BinExprType.Sll, rhs_e)
233+
if in_srcinfo_mode():
234+
e.srcinfo = SourceInfo.mk(2)
235+
return expr(e)
236+
237+
def __rrshift__(self, lhs):
238+
to_expr(lhs)
239+
lhs_e = pop_expr()
240+
rhs_e = pop_expr()
241+
e = ExprBinModel(lhs_e, BinExprType.Srl, rhs_e)
242+
if in_srcinfo_mode():
243+
e.srcinfo = SourceInfo.mk(2)
244+
return expr(e)
245+
145246
def inside(self, rhs):
146247
lhs_e = pop_expr()
147248

@@ -575,6 +676,117 @@ def __invert__(self):
575676
lhs = pop_expr()
576677
return expr(ExprUnaryModel(UnaryExprType.Not, lhs))
577678

679+
# Reverse operators (for when constant is on the left side)
680+
def __radd__(self, lhs):
681+
to_expr(lhs)
682+
lhs_e = pop_expr()
683+
self.to_expr()
684+
rhs_e = pop_expr()
685+
e = ExprBinModel(lhs_e, BinExprType.Add, rhs_e)
686+
if in_srcinfo_mode():
687+
e.srcinfo = SourceInfo.mk(2)
688+
return expr(e)
689+
690+
def __rsub__(self, lhs):
691+
to_expr(lhs)
692+
lhs_e = pop_expr()
693+
self.to_expr()
694+
rhs_e = pop_expr()
695+
e = ExprBinModel(lhs_e, BinExprType.Sub, rhs_e)
696+
if in_srcinfo_mode():
697+
e.srcinfo = SourceInfo.mk(2)
698+
return expr(e)
699+
700+
def __rmul__(self, lhs):
701+
to_expr(lhs)
702+
lhs_e = pop_expr()
703+
self.to_expr()
704+
rhs_e = pop_expr()
705+
e = ExprBinModel(lhs_e, BinExprType.Mul, rhs_e)
706+
if in_srcinfo_mode():
707+
e.srcinfo = SourceInfo.mk(2)
708+
return expr(e)
709+
710+
def __rtruediv__(self, lhs):
711+
to_expr(lhs)
712+
lhs_e = pop_expr()
713+
self.to_expr()
714+
rhs_e = pop_expr()
715+
e = ExprBinModel(lhs_e, BinExprType.Div, rhs_e)
716+
if in_srcinfo_mode():
717+
e.srcinfo = SourceInfo.mk(2)
718+
return expr(e)
719+
720+
def __rfloordiv__(self, lhs):
721+
to_expr(lhs)
722+
lhs_e = pop_expr()
723+
self.to_expr()
724+
rhs_e = pop_expr()
725+
e = ExprBinModel(lhs_e, BinExprType.Div, rhs_e)
726+
if in_srcinfo_mode():
727+
e.srcinfo = SourceInfo.mk(2)
728+
return expr(e)
729+
730+
def __rmod__(self, lhs):
731+
to_expr(lhs)
732+
lhs_e = pop_expr()
733+
self.to_expr()
734+
rhs_e = pop_expr()
735+
e = ExprBinModel(lhs_e, BinExprType.Mod, rhs_e)
736+
if in_srcinfo_mode():
737+
e.srcinfo = SourceInfo.mk(2)
738+
return expr(e)
739+
740+
def __rand__(self, lhs):
741+
to_expr(lhs)
742+
lhs_e = pop_expr()
743+
self.to_expr()
744+
rhs_e = pop_expr()
745+
e = ExprBinModel(lhs_e, BinExprType.And, rhs_e)
746+
if in_srcinfo_mode():
747+
e.srcinfo = SourceInfo.mk(2)
748+
return expr(e)
749+
750+
def __ror__(self, lhs):
751+
to_expr(lhs)
752+
lhs_e = pop_expr()
753+
self.to_expr()
754+
rhs_e = pop_expr()
755+
e = ExprBinModel(lhs_e, BinExprType.Or, rhs_e)
756+
if in_srcinfo_mode():
757+
e.srcinfo = SourceInfo.mk(2)
758+
return expr(e)
759+
760+
def __rxor__(self, lhs):
761+
to_expr(lhs)
762+
lhs_e = pop_expr()
763+
self.to_expr()
764+
rhs_e = pop_expr()
765+
e = ExprBinModel(lhs_e, BinExprType.Xor, rhs_e)
766+
if in_srcinfo_mode():
767+
e.srcinfo = SourceInfo.mk(2)
768+
return expr(e)
769+
770+
def __rlshift__(self, lhs):
771+
to_expr(lhs)
772+
lhs_e = pop_expr()
773+
self.to_expr()
774+
rhs_e = pop_expr()
775+
e = ExprBinModel(lhs_e, BinExprType.Sll, rhs_e)
776+
if in_srcinfo_mode():
777+
e.srcinfo = SourceInfo.mk(2)
778+
return expr(e)
779+
780+
def __rrshift__(self, lhs):
781+
to_expr(lhs)
782+
lhs_e = pop_expr()
783+
self.to_expr()
784+
rhs_e = pop_expr()
785+
e = ExprBinModel(lhs_e, BinExprType.Srl, rhs_e)
786+
if in_srcinfo_mode():
787+
e.srcinfo = SourceInfo.mk(2)
788+
return expr(e)
789+
578790
def inside(self, rhs):
579791
self.to_expr()
580792
lhs_e = pop_expr()

0 commit comments

Comments
 (0)