Skip to content

Commit 1061db1

Browse files
committed
Correction for #224
Signed-off-by: Matthew Ballance <matt.ballance@gmail.com>
1 parent 0a9a1d6 commit 1061db1

File tree

5 files changed

+68
-3
lines changed

5 files changed

+68
-3
lines changed

doc/Changelog.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11

2+
## 0.9.2
3+
- (#224) - Ensure fields within expressions can be referenced
4+
25
## 0.9.1
36
- (#221) - Correct a random-stability issue due to solve-order directives
47
-

src/vsc/model/expr_indexed_field_ref_model.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def __init__(self,
1616
idx_t):
1717
super().__init__()
1818

19-
if not isinstance(root, (ExprFieldRefModel,ExprArraySubscriptModel)):
19+
if not isinstance(root, (ExprFieldRefModel,ExprArraySubscriptModel,ExprIndexedFieldRefModel)):
2020
raise Exception("unsupported root for an indexed reference: " + str(root))
2121

2222
self.root = root

src/vsc/types.py

+26
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
from vsc.model.expr_rangelist_model import ExprRangelistModel
4141
from vsc.model.expr_unary_model import ExprUnaryModel
4242
from vsc.model.field_array_model import FieldArrayModel
43+
from vsc.model.field_composite_model import FieldCompositeModel
4344
from vsc.model.field_const_array_model import FieldConstArrayModel
4445
from vsc.model.field_scalar_model import FieldScalarModel
4546
from vsc.model.unary_expr_type import UnaryExprType
@@ -49,6 +50,8 @@
4950
from vsc.impl.expr_mode import get_expr_mode, expr_mode, is_expr_mode
5051
from vsc.model.expr_array_product_model import ExprArrayProductModel
5152
from vsc.visitors.model_pretty_printer import ModelPrettyPrinter
53+
from vsc.visitors.expr2field_visitor import Expr2FieldVisitor
54+
from vsc.visitors.expr2fieldtype_visitor import Expr2FieldTypeVisitor
5255
from vsc.model.expr_indexed_dynref_model import ExprIndexedDynRefModel
5356
from vsc.model.source_info import SourceInfo
5457

@@ -172,6 +175,29 @@ def not_inside(self, rhs):
172175
else:
173176
raise Exception("Unsupported 'not_inside' argument of type " + str(type(rhs)))
174177

178+
def __getattr__(self, name):
179+
ret = None
180+
em = object.__getattribute__(self, "em")
181+
fm_t = Expr2FieldTypeVisitor().fieldtype(em)
182+
183+
if fm_t is not None:
184+
if name in fm_t.field_id_m.keys():
185+
idx = fm_t.field_id_m[name]
186+
ret = expr(ExprIndexedFieldRefModel(em, [idx]))
187+
else:
188+
raise Exception("Field %s not in type %s" % (name, fm_t.name))
189+
else:
190+
fm = Expr2FieldVisitor().field(em)
191+
192+
if name in fm.field_id_m.keys():
193+
idx = fm.field_id_m[name]
194+
ret = expr(ExprIndexedFieldRefModel(em, [idx]))
195+
else:
196+
raise Exception("Composite %s does not contain a field \"%s\"" % (
197+
fm.name, name))
198+
199+
return ret
200+
175201
def __getitem__(self, k):
176202
if is_expr_mode():
177203
if isinstance(k, slice):

src/vsc/visitors/expr2fieldtype_visitor.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
class Expr2FieldTypeVisitor(ModelVisitor):
1313
"""Traverses an array-reference expression, returning element-type information"""
1414

15-
DEBUG_EN = False
15+
DEBUG_EN = True
1616

1717
def __init__(self):
1818
super().__init__()
@@ -39,6 +39,9 @@ def visit_field_scalar_array(self, f:FieldArrayModel):
3939
self.type = f.type_t
4040
if Expr2FieldTypeVisitor.DEBUG_EN:
4141
print("--> visit_field_array fm=%s ft=%s" % (str(self.field), str(self.type)))
42+
43+
def visit_composite_field(self, t):
44+
self.type = None
4245

4346
def visit_expr_indexed_fieldref(self, e : ExprIndexedFieldRefModel):
4447
if Expr2FieldTypeVisitor.DEBUG_EN:
@@ -52,6 +55,14 @@ def visit_expr_array_subscript(self, s : ExprArraySubscriptModel):
5255
print("--> visit_expr_array_subscript")
5356
s.lhs.accept(self)
5457

58+
if Expr2FieldTypeVisitor.DEBUG_EN:
59+
print("--> visit_expr_array_subscript(visit_type)")
60+
t = self.type
61+
self.type = None
62+
t.accept(self)
63+
if Expr2FieldTypeVisitor.DEBUG_EN:
64+
print("<-- visit_expr_array_subscript(visit_type)")
65+
5566
if Expr2FieldTypeVisitor.DEBUG_EN:
5667
print("<-- visit_expr_array_subscript")
5768

ve/unit/test_compound_obj.py

+26-1
Original file line numberDiff line numberDiff line change
@@ -545,4 +545,29 @@ def test_c(self):
545545
inst.randomize(debug=0)
546546
print(inst.c1[0].a[0].value)
547547
print(inst.c2[0].x[0].value)
548-
548+
549+
def test_nested_objects(self):
550+
551+
@vsc.randobj
552+
class Field(object):
553+
def __init__(self):
554+
self.c = vsc.rand_uint8_t()
555+
556+
557+
@vsc.randobj
558+
class Child(object):
559+
def __init__(self):
560+
self.b = vsc.rand_attr(Field())
561+
562+
563+
@vsc.randobj
564+
class Parent(object):
565+
def __init__(self):
566+
self.a = vsc.rand_list_t(Child(), 2)
567+
568+
@vsc.constraint
569+
def eq_c(self):
570+
self.a[0].b.c == self.a[1].b.c
571+
572+
573+
item = Parent()

0 commit comments

Comments
 (0)