@@ -60,7 +60,7 @@ def elaborate(self, platform):
6060
6161 heartbeat_buffer = io .Buffer ("o" , self .ports .heartbeat )
6262 m .submodules .heartbeat_buffer = heartbeat_buffer
63- m .d .comb += heartbeat_buffer .o .eq (heartbeat_ctr [- 1 ])
63+ m .d .comb += heartbeat_buffer .o .eq (heartbeat_ctr [- 1 ]) # type: ignore
6464 return m
6565
6666
@@ -71,10 +71,10 @@ def __init__(self,
7171 port : Port ,
7272 * ,
7373 invert : bool = False ):
74- self ._direction = io .Direction (port .direction )
74+ self ._direction = io .Direction (port .iomodel [ ' direction' ] )
7575 self ._invert = invert
76- self ._model = port .model
77- self ._pins = port .pins
76+ self ._iomodel = port .iomodel
77+ self ._pins = port .pins if port . pins else []
7878
7979 # Initialize signal attributes to None
8080 self ._i = None
@@ -87,20 +87,20 @@ def __init__(self,
8787 if self ._direction in (io .Direction .Output , io .Direction .Bidir ):
8888 self ._o = Signal (port .width , name = f"{ component } _{ name } __o" )
8989 if self ._direction is io .Direction .Bidir :
90- if "all_have_oe" in self ._options and self ._options ["all_have_oe" ]:
90+ if "all_have_oe" in self ._iomodel and self ._iomodel ["all_have_oe" ]:
9191 self ._oe = Signal (port .width , name = f"{ component } _{ name } __oe" , init = - 1 )
9292 else :
9393 self ._oe = Signal (1 , name = f"{ component } _{ name } __oe" , init = - 1 )
9494 elif self ._direction is io .Direction .Output :
9595 # Always create an _oe for output ports
9696 self ._oe = Signal (1 , name = f"{ component } _{ name } __oe" , init = - 1 )
9797
98- logger .debug (f"Created SiliconPlatformPort { name } , width={ len (port . pins )} ,dir{ self ._direction } " )
98+ logger .debug (f"Created SiliconPlatformPort { name } , width={ len (self . _pins )} ,dir{ self ._direction } " )
9999
100100 def wire (self , m : Module , interface : PureInterface ):
101- assert self ._direction == interface .signature .direction
101+ assert self ._direction == interface .signature .direction #type: ignore
102102 if hasattr (interface , 'i' ):
103- m .d .comb += interface .i .eq (self .i )
103+ m .d .comb += interface .i .eq (self .i ) # type: ignore
104104 for d in ['o' , 'oe' ]:
105105 if hasattr (interface , d ):
106106 m .d .comb += getattr (self , d ).eq (getattr (interface , d ))
@@ -141,16 +141,16 @@ def invert(self):
141141
142142 def __len__ (self ):
143143 if self ._direction is io .Direction .Input :
144- return len (self ._i )
144+ return len (self .i )
145145 if self ._direction is io .Direction .Output :
146- return len (self ._o )
146+ return len (self .o )
147147 if self ._direction is io .Direction .Bidir :
148- assert len (self ._i ) == len (self ._o )
149- if self ._options ["all_have_oe" ]:
150- assert len (self .o ) == len (self ._oe )
148+ assert len (self .i ) == len (self .o )
149+ if 'all_have_oe' in self ._iomodel and self . _iomodel ["all_have_oe" ]:
150+ assert len (self .o ) == len (self .oe )
151151 else :
152- assert len (self ._oe ) == 1
153- return len (self ._i )
152+ assert len (self .oe ) == 1
153+ return len (self .i )
154154 assert False # :nocov:
155155
156156 def __getitem__ (self , key ):
@@ -160,7 +160,7 @@ def __getitem__(self, key):
160160 result ._oe = None if self ._oe is None else self ._oe [key ]
161161 result ._invert = self ._invert
162162 result ._direction = self ._direction
163- result ._options = self ._options
163+ result ._iomodel = self ._iomodel
164164 result ._pins = self ._pins
165165 return result
166166
@@ -171,7 +171,7 @@ def __invert__(self):
171171 result ._oe = self ._oe
172172 result ._invert = not self ._invert
173173 result ._direction = self ._direction
174- result ._options = self ._options
174+ result ._iomodel = self ._iomodel
175175 result ._pins = self ._pins
176176 return result
177177
@@ -183,7 +183,7 @@ def __add__(self, other):
183183 result ._oe = None if direction is io .Direction .Input else Cat (self ._oe , other ._oe )
184184 result ._invert = self ._invert
185185 result ._direction = direction
186- result ._options = self ._options
186+ result ._iomodel = self ._iomodel
187187 result ._pins = self ._pins + other ._pins
188188 return result
189189
@@ -194,6 +194,10 @@ def __repr__(self):
194194
195195
196196class IOBuffer (io .Buffer ):
197+ o : Signal
198+ i : Signal
199+ oe : Signal
200+
197201 def elaborate (self , platform ):
198202 if not isinstance (self .port , SiliconPlatformPort ):
199203 raise TypeError (f"Cannot elaborate SiliconPlatform buffer with port { self .port !r} " )
@@ -224,6 +228,9 @@ def elaborate(self, platform):
224228
225229
226230class FFBuffer (io .FFBuffer ):
231+ i : Signal
232+ o : Signal
233+ oe : Signal
227234 def elaborate (self , platform ):
228235 if not isinstance (self .port , SiliconPlatformPort ):
229236 raise TypeError (f"Cannot elaborate SiliconPlatform buffer with port { self .port !r} " )
@@ -268,10 +275,7 @@ def instantiate_ports(self, m: Module):
268275 for name , port in v .items ():
269276 self ._ports [port .port_name ] = SiliconPlatformPort (component , name , port )
270277
271- for clock , name in self ._config ["chipflow" ]["clocks" ].items ():
272- if name not in pinlock .package .clocks :
273- raise ChipFlowError ("Unable to find clock {name} in pinlock" )
274-
278+ for clock , name in self ._config .chipflow .clocks .items ():
275279 port_data = pinlock .package .clocks [name ]
276280 port = SiliconPlatformPort (component , name , port_data , invert = True )
277281 self ._ports [name ] = port
@@ -283,7 +287,7 @@ def instantiate_ports(self, m: Module):
283287 setattr (m .submodules , "clk_buffer_" + clock , clk_buffer )
284288 m .d .comb += ClockSignal ().eq (clk_buffer .i )
285289
286- for reset , name in self ._config [ " chipflow" ][ " resets" ] .items ():
290+ for reset , name in self ._config . chipflow . resets .items ():
287291 port_data = pinlock .package .resets [name ]
288292 port = SiliconPlatformPort (component , name , port_data )
289293 self ._ports [name ] = port
0 commit comments