@@ -19,20 +19,25 @@ def __init__(
19
19
description : str ,
20
20
required : bool ,
21
21
isinstance : Optional [type ] = None ,
22
+ isinstance_list : Optional [type ] = None ,
22
23
issubclass : Optional [type ] = None ,
23
24
issubclass_list : Optional [type ] = None ,
24
25
):
25
26
self .name = name
26
27
self .description = description
27
28
self .required = required
28
29
self .isinstance = isinstance
30
+ self .isinstance_list = isinstance_list
29
31
self .issubclass = issubclass
30
32
self .issubclass_list = issubclass_list
31
33
32
34
def validate (self , project ):
33
- assert not (
34
- self .issubclass and self .issubclass_list
35
- ), "may only define one of issubclass and issubclass_list"
35
+ assert len (list (filter (None , [
36
+ self .isinstance ,
37
+ self .isinstance_list ,
38
+ self .issubclass ,
39
+ self .issubclass_list ,
40
+ ]))) == 1 , "must define exactly one of the is... parameters"
36
41
37
42
if self .required :
38
43
assert hasattr (project , self .name ), (
@@ -49,6 +54,14 @@ def validate(self, project):
49
54
f"{ self .name !r} ({ self .description } ) should an instance of "
50
55
f"{ self .isinstance !r} , but is { attr !r} "
51
56
)
57
+ if self .isinstance_list :
58
+ assert isinstance (attr , list )
59
+ for elem in attr :
60
+ assert isinstance (elem , self .isinstance_list ), (
61
+ f"{ project .__module__ } .{ project .__class__ .__qualname__ } property "
62
+ f"{ self .name !r} ({ self .description } ) should a list of instances of "
63
+ f"{ self .isinstanc_list !r} , but has element { elem !r} "
64
+ )
52
65
if self .issubclass :
53
66
assert issubclass (attr , self .issubclass ), (
54
67
f"{ project .__module__ } .{ project .__class__ .__qualname__ } property "
@@ -61,7 +74,7 @@ def validate(self, project):
61
74
assert issubclass (elem , self .issubclass_list ), (
62
75
f"{ project .__module__ } .{ project .__class__ .__qualname__ } property "
63
76
f"{ self .name !r} ({ self .description } ) should be a list of subclasses of "
64
- f"{ self .issubclass !r} , but has element { attr !r} "
77
+ f"{ self .issubclass_list !r} , but has element { elem !r} "
65
78
)
66
79
67
80
@@ -98,6 +111,12 @@ class Project:
98
111
required = False ,
99
112
issubclass_list = CxxrtlPlatform ,
100
113
),
114
+ Prop (
115
+ "externals" ,
116
+ description = "a list of Verilog and RTLIL project paths to include in the build" ,
117
+ required = False ,
118
+ isinstance_list = str ,
119
+ ),
101
120
]
102
121
103
122
def __init_subclass__ (cls ):
0 commit comments