def main(): parser = argparse.ArgumentParser(description='Unpack Gowin bitstream') parser.add_argument('netlist') parser.add_argument('-d', '--device', required=True) parser.add_argument('-o', '--output', default='pack.fs') parser.add_argument('--png') args = parser.parse_args() with importlib.resources.open_binary("apycula", f"{args.device}.pickle") as f: db = pickle.load(f) with open(args.netlist) as f: pnr = json.load(f) tilemap = chipdb.tile_bitmap(db, db.template, empty=True) bels = get_bels(pnr) place(db, tilemap, bels) pips = get_pips(pnr) route(db, tilemap, pips) res = chipdb.fuse_bitmap(db, tilemap) header_footer(db, res) if args.png: bslib.display(args.png, res) bslib.write_bitstream(args.output, res, db.cmd_hdr, db.cmd_ftr)
def main(): parser = argparse.ArgumentParser(description='Pack Gowin bitstream') parser.add_argument('netlist') parser.add_argument('-d', '--device', required=True) parser.add_argument('-o', '--output', default='pack.fs') parser.add_argument('-c', '--compress', default=False, action='store_true') parser.add_argument('--png') args = parser.parse_args() device = args.device # For tool integration it is allowed to pass a full part number m = re.match("GW1N([A-Z]*)-(LV|UV|UX)([0-9])C?([A-Z]{2}[0-9]+)(C[0-9]/I[0-9])", device) if m: luts = m.group(3) device = f"GW1N-{luts}" with importlib.resources.open_binary("apycula", f"{device}.pickle") as f: db = pickle.load(f) with open(args.netlist) as f: pnr = json.load(f) tilemap = chipdb.tile_bitmap(db, db.template, empty=True) bels = get_bels(pnr) place(db, tilemap, bels) pips = get_pips(pnr) route(db, tilemap, pips) res = chipdb.fuse_bitmap(db, tilemap) header_footer(db, res, args.compress) if args.png: bslib.display(args.png, res) bslib.write_bitstream(args.output, res, db.cmd_hdr, db.cmd_ftr, args.compress)
def main(): parser = argparse.ArgumentParser(description='Pack Gowin bitstream') parser.add_argument('netlist') parser.add_argument('-d', '--device', required=True) parser.add_argument('-o', '--output', default='pack.fs') parser.add_argument('-c', '--compress', default=False, action='store_true') parser.add_argument('-s', '--cst', default=None) parser.add_argument('--allow_pinless_io', action='store_true') parser.add_argument('--jtag_as_gpio', action='store_true') parser.add_argument('--sspi_as_gpio', action='store_true') parser.add_argument('--mspi_as_gpio', action='store_true') parser.add_argument('--ready_as_gpio', action='store_true') parser.add_argument('--done_as_gpio', action='store_true') parser.add_argument('--reconfign_as_gpio', action='store_true') parser.add_argument('--png') args = parser.parse_args() device = args.device # For tool integration it is allowed to pass a full part number m = re.match( "GW1N(S?)[A-Z]*-(LV|UV|UX)([0-9])C?([A-Z]{2}[0-9]+P?)(C[0-9]/I[0-9])", device) if m: mods = m.group(1) luts = m.group(3) device = f"GW1N{mods}-{luts}" with importlib.resources.open_binary("apycula", f"{device}.pickle") as f: db = pickle.load(f) with open(args.netlist) as f: pnr = json.load(f) tilemap = chipdb.tile_bitmap(db, db.template, empty=True) cst = codegen.Constraints() bels = get_bels(pnr) place(db, tilemap, bels, cst, args) pips = get_pips(pnr) route(db, tilemap, pips) dualmode_pins(db, tilemap, args) res = chipdb.fuse_bitmap(db, tilemap) header_footer(db, res, args.compress) if args.png: bslib.display(args.png, res) bslib.write_bitstream(args.output, res, db.cmd_hdr, db.cmd_ftr, args.compress) if args.cst: with open(args.cst, "w") as f: cst.write(f)