diff options
author | gatecat <gatecat@ds0.me> | 2021-02-11 11:10:32 +0000 |
---|---|---|
committer | gatecat <gatecat@ds0.me> | 2021-02-12 10:36:59 +0000 |
commit | 510969ab9704865f87c7c0bd09e0185b729feffc (patch) | |
tree | 39a6e35998d92f5066f21f8055a17fb7a7428f98 /machxo2/examples/write_fasm.py | |
parent | c956cae8244c094783edc7101fd0ca542c24e55b (diff) | |
download | nextpnr-510969ab9704865f87c7c0bd09e0185b729feffc.tar.gz nextpnr-510969ab9704865f87c7c0bd09e0185b729feffc.tar.bz2 nextpnr-510969ab9704865f87c7c0bd09e0185b729feffc.zip |
Create machxo2 backend (renamed from generic).
Signed-off-by: William D. Jones <thor0505@comcast.net>
Diffstat (limited to 'machxo2/examples/write_fasm.py')
-rw-r--r-- | machxo2/examples/write_fasm.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/machxo2/examples/write_fasm.py b/machxo2/examples/write_fasm.py new file mode 100644 index 00000000..ede8f16b --- /dev/null +++ b/machxo2/examples/write_fasm.py @@ -0,0 +1,51 @@ +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: map from (celltype, parametername) -> 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 + print("%s.%s[%d:0] = %d'b%s" % (cell.bel, fasm_name, cfg.width-1, cfg.width, val), file=f) + else: + print("%s.%s.%s" % (cell.bel, fasm_name, val), file=f) + print("", file=f)
\ No newline at end of file |