@@ -94,7 +94,7 @@ def __init__(self, platform, i, o):
9494 "size" : 1 ,
9595 "location" : platform .get_pin_location (o )[0 ],
9696 "properties" : platform .get_pin_properties (o ),
97- "name" : i , # FIXME.
97+ "name" : i . name_override , # FIXME
9898 "mode" : "OUTPUT_CLK" ,
9999 }
100100 platform .toolchain .ifacewriter .blocks .append (block )
@@ -139,24 +139,7 @@ class EfinixTristate(Module):
139139 def lower (dr ):
140140 return EfinixTristateImpl (dr .platform , dr .target , dr .o , dr .oe , dr .i )
141141
142- # Efinix SDRTristate -------------------------------------------------------------------------------
143142
144- class EfinixSDRTristateImpl (Module ):
145- def __init__ (self , platform , io , o , oe , i , clk ):
146- _o = Signal ()
147- _oe = Signal ()
148- _i = Signal ()
149- self .specials += SDROutput (o , _o , clk )
150- self .specials += SDRInput (_i , i , clk )
151- self .submodules += InferedSDRIO (oe , _oe , clk )
152- tristate = Tristate (io , _o , _oe , _i )
153- tristate .platform = platform
154- self .specials += tristate
155-
156- class EfinixSDRTristate (Module ):
157- @staticmethod
158- def lower (dr ):
159- return EfinixSDRTristateImpl (dr .platform , dr .io , dr .o , dr .oe , dr .i , dr .clk )
160143
161144# Efinix DifferentialOutput ------------------------------------------------------------------------
162145
@@ -261,13 +244,130 @@ class EfinixDifferentialInput:
261244 def lower (dr ):
262245 return EfinixDifferentialInputImpl (dr .platform , dr .i_p , dr .i_n , dr .o )
263246
247+
248+
249+
250+
251+ # Efinix DDRTristate ---------------------------------------------------------------------------------
252+
253+ class EfinixDDRTristateImpl (Module ):
254+ def __init__ (self , platform , io , o1 , o2 , oe1 , oe2 , i1 , i2 , clk ):
255+ assert oe1 == oe2
256+ io_name = platform .get_pin_name (io )
257+ io_pad = platform .get_pin_location (io )
258+ io_prop = platform .get_pin_properties (io )
259+ io_prop_dict = dict (io_prop )
260+ io_data_i_h = platform .add_iface_io (io_name + "_OUT_HI" )
261+ io_data_i_l = platform .add_iface_io (io_name + "_OUT_LO" )
262+ io_data_o_h = platform .add_iface_io (io_name + "_IN_HI" )
263+ io_data_o_l = platform .add_iface_io (io_name + "_IN_LO" )
264+ io_data_e = platform .add_iface_io (io_name + "_OE" )
265+ self .comb += io_data_i_h .eq (o1 )
266+ self .comb += io_data_i_l .eq (o2 )
267+ self .comb += io_data_e .eq (oe1 )
268+ self .comb += i1 .eq (io_data_o_h )
269+ self .comb += i2 .eq (io_data_o_l )
270+ block = {
271+ "type" : "GPIO" ,
272+ "mode" : "INOUT" ,
273+ "name" : io_name ,
274+ "location" : io_pad ,
275+ "properties" : io_prop ,
276+ "size" : 1 ,
277+ "in_reg" : "DDIO_RESYNC" ,
278+ "in_clk_pin" : clk .name_override , # FIXME.
279+ "out_reg" : "DDIO_RESYNC" ,
280+ "out_clk_pin" : clk .name_override , # FIXME.
281+ "oe_reg" : "REG" ,
282+ "is_inclk_inverted" : False ,
283+ "drive_strength" : io_prop_dict .get ("DRIVE_STRENGTH" , "4" )
284+ }
285+ platform .toolchain .ifacewriter .blocks .append (block )
286+ platform .toolchain .excluded_ios .append (platform .get_pin (io ))
287+
288+ class EfinixDDRTristate :
289+ @staticmethod
290+ def lower (dr ):
291+ return EfinixDDRTristateImpl (dr .platform , dr .io , dr .o1 , dr .o2 , dr .oe1 , dr .oe2 , dr .i1 , dr .i2 , dr .clk )
292+
293+ # Efinix SDRTristate -------------------------------------------------------------------------------
294+
295+ class EfinixSDRTristateImpl (EfinixDDRTristateImpl ):
296+ def __init__ (self , platform , io , o , oe , i , clk ):
297+ io_name = platform .get_pin_name (io )
298+ io_pad = platform .get_pin_location (io )
299+ io_prop = platform .get_pin_properties (io )
300+ io_prop_dict = dict (io_prop )
301+ io_data_i = platform .add_iface_io (io_name + "_OUT" )
302+ io_data_o = platform .add_iface_io (io_name + "_IN" )
303+ io_data_e = platform .add_iface_io (io_name + "_OE" )
304+ self .comb += io_data_i .eq (o )
305+ self .comb += io_data_e .eq (oe )
306+ self .comb += i .eq (io_data_o )
307+ block = {
308+ "type" : "GPIO" ,
309+ "mode" : "INOUT" ,
310+ "name" : io_name ,
311+ "location" : io_pad ,
312+ "properties" : io_prop ,
313+ "size" : 1 ,
314+ "in_reg" : "REG" ,
315+ "in_clk_pin" : clk .name_override , # FIXME.
316+ "out_reg" : "REG" ,
317+ "out_clk_pin" : clk .name_override , # FIXME.
318+ "oe_reg" : "REG" ,
319+ "is_inclk_inverted" : False ,
320+ "drive_strength" : io_prop_dict .get ("DRIVE_STRENGTH" , "4" )
321+ }
322+ platform .toolchain .ifacewriter .blocks .append (block )
323+ platform .toolchain .excluded_ios .append (platform .get_pin (io ))
324+
325+
326+ class EfinixSDRTristate (Module ):
327+ @staticmethod
328+ def lower (dr ):
329+ return EfinixSDRTristateImpl (dr .platform , dr .io , dr .o , dr .oe , dr .i , dr .clk )
330+
331+ # Efinix SDROutput -------------------------------------------------------------------------------
332+
333+ class EfinixSDROutputImpl (Module ):
334+ def __init__ (self , platform , i , o , clk ):
335+ io_name = platform .get_pin_name (o )
336+ io_pad = platform .get_pin_location (o )
337+ io_prop = platform .get_pin_properties (o )
338+ io_prop_dict = dict (io_prop )
339+ io_data_i = platform .add_iface_io (io_name )
340+ self .comb += io_data_i .eq (i )
341+ block = {
342+ "type" : "GPIO" ,
343+ "mode" : "OUTPUT" ,
344+ "name" : io_name ,
345+ "location" : io_pad ,
346+ "properties" : io_prop ,
347+ "size" : 1 ,
348+ "out_reg" : "REG" ,
349+ "out_clk_pin" : clk .name_override , # FIXME.
350+ "is_inclk_inverted" : False ,
351+ "drive_strength" : io_prop_dict .get ("DRIVE_STRENGTH" , "4" )
352+ }
353+ platform .toolchain .ifacewriter .blocks .append (block )
354+ platform .toolchain .excluded_ios .append (platform .get_pin (o ))
355+
356+
357+ class EfinixSDROutput (Module ):
358+ @staticmethod
359+ def lower (dr ):
360+ return EfinixSDROutputImpl (dr .platform , dr .i , dr .o , dr .clk )
361+
362+
264363# Efinix DDROutput ---------------------------------------------------------------------------------
265364
266365class EfinixDDROutputImpl (Module ):
267366 def __init__ (self , platform , i1 , i2 , o , clk ):
268367 io_name = platform .get_pin_name (o )
269368 io_pad = platform .get_pin_location (o )
270369 io_prop = platform .get_pin_properties (o )
370+ io_prop_dict = dict (io_prop )
271371 io_data_h = platform .add_iface_io (io_name + "_HI" )
272372 io_data_l = platform .add_iface_io (io_name + "_LO" )
273373 self .comb += io_data_h .eq (i1 )
@@ -280,9 +380,9 @@ def __init__(self, platform, i1, i2, o, clk):
280380 "properties" : io_prop ,
281381 "size" : 1 ,
282382 "out_reg" : "DDIO_RESYNC" ,
283- "out_clk_pin" : clk , # FIXME.
383+ "out_clk_pin" : clk . name_override , # FIXME.
284384 "is_inclk_inverted" : False ,
285- "drive_strength" : 4 # FIXME: Get it from constraints.
385+ "drive_strength" : io_prop_dict . get ( "DRIVE_STRENGTH" , "4" )
286386 }
287387 platform .toolchain .ifacewriter .blocks .append (block )
288388 platform .toolchain .excluded_ios .append (platform .get_pin (o ))
@@ -311,7 +411,7 @@ def __init__(self, platform, i, o1, o2, clk):
311411 "properties" : io_prop ,
312412 "size" : 1 ,
313413 "in_reg" : "DDIO_RESYNC" ,
314- "in_clk_pin" : clk , # FIXME.
414+ "in_clk_pin" : clk . name_override , # FIXME.
315415 "is_inclk_inverted" : False
316416 }
317417 platform .toolchain .ifacewriter .blocks .append (block )
@@ -331,7 +431,9 @@ def lower(dr):
331431 Tristate : EfinixTristate ,
332432 DifferentialOutput : EfinixDifferentialOutput ,
333433 DifferentialInput : EfinixDifferentialInput ,
434+ SDROutput : EfinixSDROutput ,
334435 SDRTristate : EfinixSDRTristate ,
335436 DDROutput : EfinixDDROutput ,
336437 DDRInput : EfinixDDRInput ,
438+ DDRTristate : EfinixDDRTristate ,
337439}
0 commit comments