@@ -1186,12 +1186,19 @@ def fse_create_hclk_nodes(dev, device, fse, dat: Datfile):
1186
1186
row , col = hclk_loc
1187
1187
ttyp = fse ['header' ]['grid' ][61 ][row ][col ]
1188
1188
dev .hclk_pips [(row , col )] = fse_pips (fse , ttyp , table = 48 , wn = hclknames )
1189
+ for dst in dev .hclk_pips [(row , col )].keys ():
1190
+ # from HCLK to interbank MUX
1191
+ if dst in {'HCLK_BANK_OUT0' , 'HCLK_BANK_OUT1' }:
1192
+ add_node (dev , f'HCLK{ "TBLR" .index (side )} _BANK_OUT{ dst [- 1 ]} ' , "GLOBAL_CLK" , row , col , dst )
1189
1193
# connect local wires like PCLKT0 etc to the global nodes
1190
1194
for srcs in dev .hclk_pips [(row , col )].values ():
1191
1195
for src in srcs .keys ():
1192
1196
for pfx in _global_wire_prefixes :
1193
1197
if src .startswith (pfx ):
1194
1198
add_node (dev , src , "HCLK" , row , col , src )
1199
+ # from interbank MUX to HCLK
1200
+ if src in {'HCLK_BANK_IN0' , 'HCLK_BANK_IN1' }:
1201
+ add_node (dev , f'HCLKMUX{ src [- 1 ]} ' , "GLOBAL_CLK" , row , col , src )
1195
1202
# strange GW1N-9C input-input aliases
1196
1203
for i in {0 , 2 }:
1197
1204
dev .nodes .setdefault (f'X{ col } Y{ row } /HCLK9-{ i } ' , ('HCLK' , {(row , col , f'HCLK_IN{ i } ' )}))[1 ].add ((row , col , f'HCLK_9IN{ i } ' ))
@@ -1236,6 +1243,80 @@ def fse_create_hclk_nodes(dev, device, fse, dat: Datfile):
1236
1243
if src .startswith ('HCLK' ):
1237
1244
hclks [src ].add ((row , col , src ))
1238
1245
1246
+ # DHCEN (as I imagine) is an additional control input of the HCLK input
1247
+ # multiplexer. We have four input multiplexers - HCLK_IN0, HCLK_IN1, HCLK_IN2,
1248
+ # HCLK_IN3 (GW1N-9C with its additional four multiplexers stands separately,
1249
+ # but we will deal with it later) and two interbank inputs.
1250
+ # Creating images using IDE where we use the maximum allowable number of DHCEN,
1251
+ # the CE port of which is connected to the IO ports, then we trace the route
1252
+ # from IO to the final wire, which will be the CE port of the DHCEN primitive.
1253
+ # We are not interested in the CLKIN and CLKOUT ports because we are supposed
1254
+ # to simply disable/enable one of the input multiplexers.
1255
+ # Let's summarize the experimental data in a table.
1256
+ # There are 4 multiplexers and interbank inputs on each side of the chip
1257
+ # (sides: Right Bottom Left Top).
1258
+ _dhcen_ce = {
1259
+ 'GW1N-1' :
1260
+ {'B' : [(10 , 19 , 'D5' ), (10 , 19 , 'D3' ), (10 , 19 , 'D4' ), (10 , 19 , 'D2' ), (10 , 0 , 'C0' ), (10 , 0 , 'C1' )]},
1261
+ 'GW1NZ-1' :
1262
+ {'R' : [( 0 , 19 , 'A2' ), ( 0 , 19 , 'A4' ), ( 0 , 19 , 'A3' ), ( 0 , 19 , 'A5' ), ( 0 , 18 , 'C6' ), ( 0 , 18 , 'C7' )],
1263
+ 'T' : [(10 , 19 , 'A2' ), (10 , 19 , 'A4' ), (10 , 19 , 'A3' ), (10 , 19 , 'A5' ), (10 , 19 , 'C6' ), (10 , 19 , 'C7' )]},
1264
+ 'GW1NS-2' :
1265
+ {'R' : [(10 , 19 , 'A4' ), (10 , 19 , 'A6' ), (10 , 19 , 'A5' ), (10 , 19 , 'A7' ), (10 , 19 , 'C4' ), (10 , 19 , 'C5' )],
1266
+ 'B' : [(11 , 19 , 'A4' ), (11 , 19 , 'A6' ), (11 , 19 , 'A5' ), (11 , 19 , 'A7' ), (11 , 19 , 'C4' ), (11 , 19 , 'C5' )],
1267
+ 'L' : [( 9 , 0 , 'A0' ), ( 9 , 0 , 'A2' ), ( 9 , 0 , 'A1' ), ( 9 , 0 , 'A3' ), ( 9 , 0 , 'C0' ), ( 9 , 0 , 'C1' )],
1268
+ 'T' : [( 0 , 19 , 'D5' ), ( 0 , 19 , 'D3' ), ( 0 , 19 , 'D4' ), ( 0 , 19 , 'D2' ), ( 0 , 0 , 'B1' ), ( 0 , 0 , 'B0' )]},
1269
+ 'GW1N-4' :
1270
+ {'R' : [(18 , 37 , 'C6' ), (18 , 37 , 'D7' ), (18 , 37 , 'C7' ), (18 , 37 , 'D6' ), ( 0 , 37 , 'D7' ), ( 0 , 37 , 'D6' )],
1271
+ 'B' : [(19 , 37 , 'A2' ), (19 , 37 , 'A4' ), (19 , 37 , 'A3' ), (19 , 37 , 'A5' ), (19 , 0 , 'B2' ), (19 , 0 , 'B3' )],
1272
+ 'L' : [(18 , 0 , 'C6' ), (18 , 0 , 'D7' ), (18 , 0 , 'C7' ), (18 , 0 , 'D6' ), (19 , 0 , 'A4' ), ( 0 , 0 , 'B1' )]},
1273
+ 'GW1NS-4' :
1274
+ {'R' : [(18 , 37 , 'C6' ), (18 , 37 , 'D7' ), (18 , 37 , 'C7' ), (18 , 37 , 'D6' ), ( 0 , 37 , 'D7' ), ( 0 , 37 , 'D6' )],
1275
+ 'B' : [(19 , 37 , 'A2' ), (19 , 37 , 'A4' ), (19 , 37 , 'A3' ), (19 , 37 , 'A5' ), (19 , 0 , 'B2' ), (19 , 0 , 'B3' )],
1276
+ 'T' : [( 1 , 0 , 'B6' ), ( 1 , 0 , 'A0' ), ( 1 , 0 , 'B7' ), ( 1 , 0 , 'A1' ), ( 1 , 0 , 'C4' ), ( 1 , 0 , 'C3' )]},
1277
+ 'GW1N-9' :
1278
+ {'R' : [(18 , 46 , 'C6' ), (18 , 46 , 'D7' ), (18 , 46 , 'C7' ), (18 , 46 , 'D6' ), (18 , 46 , 'B6' ), (18 , 46 , 'B7' )],
1279
+ 'B' : [(28 , 46 , 'A2' ), (28 , 46 , 'A4' ), (28 , 46 , 'A3' ), (28 , 46 , 'A5' ), (28 , 0 , 'B2' ), (28 , 0 , 'B3' )],
1280
+ 'L' : [(18 , 0 , 'C6' ), (18 , 0 , 'D7' ), (18 , 0 , 'C7' ), (18 , 0 , 'D6' ), (18 , 0 , 'B6' ), (18 , 0 , 'B7' )],
1281
+ 'T' : [( 9 , 0 , 'C6' ), ( 9 , 0 , 'D7' ), ( 9 , 0 , 'C7' ), ( 9 , 0 , 'D6' ), ( 9 , 0 , 'B6' ), ( 9 , 0 , 'B7' )]},
1282
+ 'GW1N-9C' :
1283
+ {'R' : [(18 , 46 , 'C6' ), (18 , 46 , 'D7' ), (18 , 46 , 'C7' ), (18 , 46 , 'D6' ), (18 , 46 , 'B6' ), (18 , 46 , 'B7' )],
1284
+ 'B' : [(28 , 46 , 'A2' ), (28 , 46 , 'A4' ), (28 , 46 , 'A3' ), (28 , 46 , 'A5' ), (28 , 0 , 'B2' ), (28 , 0 , 'B3' )],
1285
+ 'L' : [(18 , 0 , 'C6' ), (18 , 0 , 'D7' ), (18 , 0 , 'C7' ), (18 , 0 , 'D6' ), (18 , 0 , 'B6' ), (18 , 0 , 'B7' )],
1286
+ 'T' : [( 9 , 0 , 'C6' ), ( 9 , 0 , 'D7' ), ( 9 , 0 , 'C7' ), ( 9 , 0 , 'D6' ), ( 9 , 0 , 'B6' ), ( 9 , 0 , 'B7' )]},
1287
+ 'GW2A-18' :
1288
+ {'R' : [(27 , 55 , 'A2' ), (27 , 55 , 'A3' ), (27 , 55 , 'D2' ), (27 , 55 , 'D3' ), (27 , 55 , 'D0' ), (27 , 55 , 'D1' )],
1289
+ 'B' : [(54 , 27 , 'A2' ), (54 , 27 , 'A3' ), (54 , 27 , 'D2' ), (54 , 27 , 'D3' ), (54 , 27 , 'D0' ), (54 , 27 , 'D1' )],
1290
+ 'L' : [(27 , 0 , 'A2' ), (27 , 0 , 'A3' ), (27 , 0 , 'D2' ), (27 , 0 , 'D3' ), (27 , 0 , 'D0' ), (27 , 0 , 'D1' )],
1291
+ 'T' : [( 0 , 27 , 'A2' ), ( 0 , 27 , 'A3' ), ( 0 , 27 , 'D2' ), ( 0 , 27 , 'D3' ), ( 0 ,27 , 'D0' ), ( 0 , 27 , 'D1' )]},
1292
+ 'GW2A-18C' :
1293
+ {'R' : [(27 , 55 , 'A2' ), (27 , 55 , 'A3' ), (27 , 55 , 'D2' ), (27 , 55 , 'D3' ), (27 , 55 , 'D0' ), (27 , 55 , 'D1' )],
1294
+ 'B' : [(54 , 27 , 'A2' ), (54 , 27 , 'A3' ), (54 , 27 , 'D2' ), (54 , 27 , 'D3' ), (54 , 27 , 'D0' ), (54 , 27 , 'D1' )],
1295
+ 'L' : [(27 , 0 , 'A2' ), (27 , 0 , 'A3' ), (27 , 0 , 'D2' ), (27 , 0 , 'D3' ), (27 , 0 , 'D0' ), (27 , 0 , 'D1' )],
1296
+ 'T' : [( 0 , 27 , 'A2' ), ( 0 , 27 , 'A3' ), ( 0 , 27 , 'D2' ), ( 0 , 27 , 'D3' ), ( 0 ,27 , 'D0' ), ( 0 , 27 , 'D1' )]},
1297
+ }
1298
+ def fse_create_dhcen (dev , device , fse , dat : Datfile ):
1299
+ if device not in _dhcen_ce :
1300
+ print (f'No DHCEN for { device } for now.' )
1301
+ return
1302
+ for side , ces in _dhcen_ce [device ].items ():
1303
+ for idx , ce_wire in enumerate (ces ):
1304
+ row , col , wire = ce_wire
1305
+ extra = dev .extra_func .setdefault ((row , col ), {})
1306
+ dhcen = extra .setdefault ('dhcen' , [])
1307
+ # use db.hclk_pips in order to find HCLK_IN cells
1308
+ for hclk_loc in _hclk_to_fclk [device ][side ]['hclk' ]:
1309
+ if idx < 4 :
1310
+ hclk_name = f'HCLK_IN{ idx } '
1311
+ else :
1312
+ hclk_name = f'HCLK_BANK_OUT{ idx - 4 } '
1313
+ if hclk_name in dev .hclk_pips [hclk_loc ]:
1314
+ hclkin = {'pip' : [f'X{ hclk_loc [1 ]} Y{ hclk_loc [0 ]} ' , hclk_name , next (iter (dev .hclk_pips [hclk_loc ][hclk_name ].keys ())), side ]}
1315
+
1316
+ hclkin .update ({ 'ce' : wire })
1317
+ dhcen .append (hclkin )
1318
+
1319
+
1239
1320
_pll_loc = {
1240
1321
'GW1N-1' :
1241
1322
{'TRPLL0CLK0' : (0 , 17 , 'F4' ), 'TRPLL0CLK1' : (0 , 17 , 'F5' ),
@@ -1488,6 +1569,7 @@ def fse_create_clocks(dev, device, dat: Datfile, fse):
1488
1569
1489
1570
1490
1571
spines = {f'SPINE{ i } ' for i in range (32 )}
1572
+ hclk_srcs = {f'HCLK{ i } _BANK_OUT{ j } ' for i in range (4 ) for j in range (2 )}
1491
1573
dcs_inputs = {f'P{ i } { j } { k } ' for i in range (1 , 5 ) for j in range (6 , 8 ) for k in "ABCD" }
1492
1574
for row , rd in enumerate (dev .grid ):
1493
1575
for col , rc in enumerate (rd ):
@@ -1499,6 +1581,12 @@ def fse_create_clocks(dev, device, dat: Datfile, fse):
1499
1581
add_node (dev , dest , "GLOBAL_CLK" , row , col , dest )
1500
1582
for src in { wire for wire in srcs .keys () if wire not in {'VCC' , 'VSS' }}:
1501
1583
add_node (dev , src , "GLOBAL_CLK" , row , col , src )
1584
+ elif dest in {'HCLKMUX0' , 'HCLKMUX1' }:
1585
+ # this interbank communication between HCLKs
1586
+ add_node (dev , dest , "GLOBAL_CLK" , row , col , dest )
1587
+ for src in {wire for wire in srcs .keys () if wire in hclk_srcs }:
1588
+ add_node (dev , src , "GLOBAL_CLK" , row , col , src )
1589
+
1502
1590
# GBx0 <- GBOx
1503
1591
for spine_pair in range (4 ): # GB00/GB40, GB10/GB50, GB20/GB60, GB30/GB70
1504
1592
tap_start = _clock_data [device ]['tap_start' ][0 ]
@@ -2088,6 +2176,7 @@ def from_fse(device, fse, dat: Datfile):
2088
2176
fse_create_bandgap (dev , device )
2089
2177
fse_create_userflash (dev , device , dat )
2090
2178
fse_create_logic2clk (dev , device , dat )
2179
+ fse_create_dhcen (dev , device , fse , dat )
2091
2180
disable_plls (dev , device )
2092
2181
sync_extra_func (dev )
2093
2182
set_chip_flags (dev , device );
@@ -3487,6 +3576,8 @@ def fse_wire_delays(db):
3487
3576
db .wire_delay [clknames [i ]] = "CENT_SPINE_PCLK"
3488
3577
for i in range (129 , 153 ): # clock inputs (logic->clock)
3489
3578
db .wire_delay [clknames [i ]] = "CENT_SPINE_PCLK"
3579
+ for i in range (1000 , 1010 ): # HCLK
3580
+ db .wire_delay [clknames [i ]] = "X0" # XXX
3490
3581
3491
3582
# assign pads with plls
3492
3583
# for now use static table and store the bel name although it is always PLL without a number
0 commit comments