mirror of
https://github.com/YosysHQ/nextpnr.git
synced 2026-04-30 13:41:26 +00:00
generic/examples: Add FASM writer Python script
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
52
generic/examples/write_fasm.py
Normal file
52
generic/examples/write_fasm.py
Normal file
@@ -0,0 +1,52 @@
|
||||
from collections import namedtuple
|
||||
|
||||
"""
|
||||
write: set to True to enable writing this parameter to FASM
|
||||
|
||||
numeric: set to True to write this parameter as a bit array (width>1) or
|
||||
single bit (width==1) named after the parameter. Otherwise this
|
||||
parameter will be written as `name.value`
|
||||
|
||||
width: width of numeric parameter (ignored for non-numeric parameters)
|
||||
|
||||
alias: an alternative name for this parameter (parameter name used if alias
|
||||
is None)
|
||||
"""
|
||||
ParameterConfig = namedtuple('ParameterConfig', 'write numeric width alias')
|
||||
|
||||
# FIXME use defaults= once Python 3.7 is standard
|
||||
ParameterConfig.__new__.__defaults__ = (False, True, 1, None)
|
||||
|
||||
|
||||
"""
|
||||
Write a design as FASM
|
||||
|
||||
ctx: nextpnr context
|
||||
paramCfg: ParameterConfig describing how to write parameters
|
||||
f: output file
|
||||
"""
|
||||
def write_fasm(ctx, paramCfg, f):
|
||||
for nname, net in sorted(ctx.nets, key=lambda x: str(x[1].name)):
|
||||
print("# Net %s" % nname, file=f)
|
||||
for wire, pip in sorted(net.wires, key=lambda x: str(x[1])):
|
||||
if pip.pip != "":
|
||||
print("%s" % pip.pip, file=f)
|
||||
print("", file=f)
|
||||
for cname, cell in sorted(ctx.cells, key=lambda x: str(x[1].name)):
|
||||
print("# Cell %s at %s" % (cname, cell.bel), file=f)
|
||||
for param, val in sorted(cell.params, key=lambda x: str(x)):
|
||||
cfg = paramCfg[(cell.type, param)]
|
||||
if not cfg.write:
|
||||
continue
|
||||
fasm_name = cfg.alias if cfg.alias is not None else param
|
||||
if cfg.numeric:
|
||||
if cfg.width == 1:
|
||||
if int(val) != 0:
|
||||
print("%s.%s" % (cell.bel, fasm_name), file=f)
|
||||
else:
|
||||
# Parameters with width >32 are direct binary, otherwise denary
|
||||
binval = val if cfg.width > 32 else "{:0{}b}".format(int(val), cfg.width)
|
||||
print("%s.%s[%d:0] = %d'b%s" % (cell.bel, fasm_name, cfg.width-1, cfg.width, binval), file=f)
|
||||
else:
|
||||
print("%s.%s.%s" % (cell.bel, fasm_name, val), file=f)
|
||||
print("", file=f)
|
||||
Reference in New Issue
Block a user