@@ -387,6 +387,16 @@ def get_oreg(clk, d, q):
387
387
o_Q = q [bit ]
388
388
)
389
389
390
+ def get_oereg (clk , oe , q ):
391
+ for bit in range (len (q )):
392
+ m .submodules += Instance ("OFS1P3DX" ,
393
+ i_SCLK = clk ,
394
+ i_SP = Const (1 ),
395
+ i_CD = Const (0 ),
396
+ i_D = oe ,
397
+ o_Q = q [bit ]
398
+ )
399
+
390
400
def get_iddr (sclk , d , q0 , q1 ):
391
401
for bit in range (len (d )):
392
402
m .submodules += Instance ("IDDRX1F" ,
@@ -508,7 +518,7 @@ def get_oneg(a, invert):
508
518
if "o" in pin .dir :
509
519
o = Signal (pin .width , name = "{}_xdr_o" .format (pin .name ))
510
520
if pin .dir in ("oe" , "io" ):
511
- t = Signal (1 , name = "{}_xdr_t" .format (pin .name ))
521
+ t = Signal (pin . width , name = "{}_xdr_t" .format (pin .name ))
512
522
513
523
if pin .xdr == 0 :
514
524
if "i" in pin .dir :
@@ -523,31 +533,28 @@ def get_oneg(a, invert):
523
533
if "o" in pin .dir :
524
534
get_oreg (pin .o_clk , pin_o , o )
525
535
if pin .dir in ("oe" , "io" ):
526
- get_oreg (pin .o_clk , ~ pin .oe , t )
536
+ get_oereg (pin .o_clk , ~ pin .oe , t )
527
537
elif pin .xdr == 2 :
528
538
if "i" in pin .dir :
529
539
get_iddr (pin .i_clk , i , pin_i0 , pin_i1 )
530
540
if "o" in pin .dir :
531
541
get_oddr (pin .o_clk , pin_o0 , pin_o1 , o )
532
542
if pin .dir in ("oe" , "io" ):
533
- # It looks like Diamond will not pack an OREG as a tristate register in a DDR PIO.
534
- # It is not clear what is the recommended set of primitives for this task.
535
- # Similarly, nextpnr will not pack anything as a tristate register in a DDR PIO.
536
- get_oreg (pin .o_clk , ~ pin .oe , t )
543
+ get_oereg (pin .o_clk , ~ pin .oe , t )
537
544
elif pin .xdr == 4 :
538
545
if "i" in pin .dir :
539
546
get_iddrx2 (pin .i_clk , pin .i_fclk , i , pin_i0 , pin_i1 , pin_i2 , pin_i3 )
540
547
if "o" in pin .dir :
541
548
get_oddrx2 (pin .o_clk , pin .o_fclk , pin_o0 , pin_o1 , pin_o2 , pin_o3 , o )
542
549
if pin .dir in ("oe" , "io" ):
543
- get_oreg (pin .o_clk , ~ pin .oe , t )
550
+ get_oereg (pin .o_clk , ~ pin .oe , t )
544
551
elif pin .xdr == 7 :
545
552
if "i" in pin .dir :
546
553
get_iddr71b (pin .i_clk , pin .i_fclk , i , pin_i0 , pin_i1 , pin_i2 , pin_i3 , pin_i4 , pin_i5 , pin_i6 )
547
554
if "o" in pin .dir :
548
555
get_oddr71b (pin .o_clk , pin .o_fclk , pin_o0 , pin_o1 , pin_o2 , pin_o3 , pin_o4 , pin_o5 , pin_o6 , o )
549
556
if pin .dir in ("oe" , "io" ):
550
- get_oreg (pin .o_clk , ~ pin .oe , t )
557
+ get_oereg (pin .o_clk , ~ pin .oe , t )
551
558
else :
552
559
assert False
553
560
@@ -584,7 +591,7 @@ def get_tristate(self, pin, port, attrs, invert):
584
591
i , o , t = self ._get_xdr_buffer (m , pin , o_invert = invert )
585
592
for bit in range (pin .width ):
586
593
m .submodules ["{}_{}" .format (pin .name , bit )] = Instance ("OBZ" ,
587
- i_T = t ,
594
+ i_T = t [ bit ] ,
588
595
i_I = o [bit ],
589
596
o_O = port .io [bit ]
590
597
)
@@ -597,7 +604,7 @@ def get_input_output(self, pin, port, attrs, invert):
597
604
i , o , t = self ._get_xdr_buffer (m , pin , i_invert = invert , o_invert = invert )
598
605
for bit in range (pin .width ):
599
606
m .submodules ["{}_{}" .format (pin .name , bit )] = Instance ("BB" ,
600
- i_T = t ,
607
+ i_T = t [ bit ] ,
601
608
i_I = o [bit ],
602
609
o_O = i [bit ],
603
610
io_B = port .io [bit ]
@@ -635,7 +642,7 @@ def get_diff_tristate(self, pin, port, attrs, invert):
635
642
i , o , t = self ._get_xdr_buffer (m , pin , o_invert = invert )
636
643
for bit in range (pin .width ):
637
644
m .submodules ["{}_{}" .format (pin .name , bit )] = Instance ("OBZ" ,
638
- i_T = t ,
645
+ i_T = t [ bit ] ,
639
646
i_I = o [bit ],
640
647
o_O = port .p [bit ],
641
648
)
@@ -648,7 +655,7 @@ def get_diff_input_output(self, pin, port, attrs, invert):
648
655
i , o , t = self ._get_xdr_buffer (m , pin , i_invert = invert , o_invert = invert )
649
656
for bit in range (pin .width ):
650
657
m .submodules ["{}_{}" .format (pin .name , bit )] = Instance ("BB" ,
651
- i_T = t ,
658
+ i_T = t [ bit ] ,
652
659
i_I = o [bit ],
653
660
o_O = i [bit ],
654
661
io_B = port .p [bit ],
0 commit comments