Skip to content

Commit 46ecf0c

Browse files
authored
Fix OPEN_DRAIN IO attribute (#194)
The coding of the OPEN_DRAIN attribute turned out to be not so unambiguous. It looks like there is ON / OFF and one more default state. As a temporary measure, setting OPEN_DRAIN=OFF is ignored, but you use OPENDRAIN=ON at your own peril and risk. Signed-off-by: YRabbit <[email protected]>
1 parent ba69439 commit 46ecf0c

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

apycula/gowin_pack.py

+11-7
Original file line numberDiff line numberDiff line change
@@ -519,21 +519,21 @@ def __init__(self, row, col, idx, attrs, flags, connections):
519519
'LVCMOS33': '3.3', 'LVDS25': '2.5', 'LVCMOS33D': '3.3', 'LVCMOS_D': '3.3'}
520520
_init_io_attrs = {
521521
'IBUF': {'PADDI': 'PADDI', 'HYSTERESIS': 'NONE', 'PULLMODE': 'UP', 'SLEWRATE': 'SLOW',
522-
'DRIVE': '0', 'OPENDRAIN': 'OFF', 'CLAMP': 'OFF', 'DIFFRESISTOR': 'OFF',
522+
'DRIVE': '0', 'CLAMP': 'OFF', 'DIFFRESISTOR': 'OFF',
523523
'VREF': 'OFF', 'LVDS_OUT': 'OFF'},
524-
'OBUF': {'ODMUX_1': '1', 'OPENDRAIN': 'OFF', 'PULLMODE': 'UP', 'SLEWRATE': 'FAST',
524+
'OBUF': {'ODMUX_1': '1', 'PULLMODE': 'UP', 'SLEWRATE': 'FAST',
525525
'DRIVE': '8', 'HYSTERESIS': 'NONE', 'CLAMP': 'OFF', 'DIFFRESISTOR': 'OFF',
526526
'SINGLERESISTOR': 'OFF', 'VCCIO': '1.8', 'LVDS_OUT': 'OFF', 'DDR_DYNTERM': 'NA', 'TO': 'INV'},
527-
'TBUF': {'ODMUX_1': 'UNKNOWN', 'OPENDRAIN': 'OFF', 'PULLMODE': 'UP', 'SLEWRATE': 'FAST',
527+
'TBUF': {'ODMUX_1': 'UNKNOWN', 'PULLMODE': 'UP', 'SLEWRATE': 'FAST',
528528
'DRIVE': '8', 'HYSTERESIS': 'NONE', 'CLAMP': 'OFF', 'DIFFRESISTOR': 'OFF',
529529
'SINGLERESISTOR': 'OFF', 'VCCIO': '1.8', 'LVDS_OUT': 'OFF', 'DDR_DYNTERM': 'NA',
530530
'TO': 'INV', 'PERSISTENT': 'OFF', 'ODMUX': 'TRIMUX'},
531-
'IOBUF': {'ODMUX_1': 'UNKNOWN', 'OPENDRAIN': 'OFF', 'PULLMODE': 'UP', 'SLEWRATE': 'FAST',
531+
'IOBUF': {'ODMUX_1': 'UNKNOWN', 'PULLMODE': 'UP', 'SLEWRATE': 'FAST',
532532
'DRIVE': '8', 'HYSTERESIS': 'NONE', 'CLAMP': 'OFF', 'DIFFRESISTOR': 'OFF',
533533
'SINGLERESISTOR': 'OFF', 'VCCIO': '1.8', 'LVDS_OUT': 'OFF', 'DDR_DYNTERM': 'NA',
534534
'TO': 'INV', 'PERSISTENT': 'OFF', 'ODMUX': 'TRIMUX', 'PADDI': 'PADDI'},
535535
}
536-
_refine_attrs = {'SLEW_RATE': 'SLEWRATE', 'PULL_MODE': 'PULLMODE'}
536+
_refine_attrs = {'SLEW_RATE': 'SLEWRATE', 'PULL_MODE': 'PULLMODE', 'OPEN_DRAIN': 'OPENDRAIN'}
537537
def refine_io_attrs(attr):
538538
return _refine_attrs.get(attr, attr)
539539

@@ -696,6 +696,8 @@ def place(db, tilemap, bels, cst, args):
696696
continue
697697
if flag_name_val[0] == chipdb.mode_attr_sep + "IO_TYPE":
698698
iostd = _iostd_alias.get(flag_name_val[1], flag_name_val[1])
699+
else:
700+
io_desc.attrs[flag_name_val[0][1:]] = flag_name_val[1]
699701
io_desc.attrs['IO_TYPE'] = iostd
700702
if pinless_io:
701703
return
@@ -839,6 +841,8 @@ def place(db, tilemap, bels, cst, args):
839841
for k, val in atr.items():
840842
if k not in attrids.iob_attrids.keys():
841843
print(f'XXX IO: add {k} key handle')
844+
elif k == 'OPENDRAIN' and val == 'OFF':
845+
continue
842846
else:
843847
add_attr_val(db, 'IOB', iob_attrs, attrids.iob_attrids[k], attrids.iob_attrvals[val])
844848
if k in {'VCCIO'}:
@@ -982,11 +986,11 @@ def main():
982986
mods = m.group(1) or ""
983987
luts = m.group(3)
984988
device = f"GW1N{mods}-{luts}"
985-
989+
986990
with importlib.resources.path('apycula', f'{args.device}.pickle') as path:
987991
with closing(gzip.open(path, 'rb')) as f:
988992
db = pickle.load(f)
989-
993+
990994
with open(args.netlist) as f:
991995
pnr = json.load(f)
992996

0 commit comments

Comments
 (0)