blob: cfd80e9a3a50c28483598639bca86e5f63dbff4b [file] [log] [blame]
#!/usr/bin/env python3
"""
This example uses PyTrellis to convert the text-config from bit_to_config.py back to a bitstream
"""
import pytrellis
import sys
pytrellis.load_database("../../database")
def get_next_nonblank(f):
while True:
line = f.readline()
if line == "":
return None
if '#' in line:
line = line[:line.index('#')]
if len(line.strip()) == 0:
continue
return line.rstrip('\n')
def main(argv):
block_hdr = ""
block_content = ""
chip = None
seen_tiles = set()
def finalise_last_block():
if block_hdr.startswith(".tile"):
tile_name = block_hdr.split(" ")[1]
chip.tiles[tile_name].read_config(block_content)
seen_tiles.add(tile_name)
with open(argv[1], 'r') as cfg:
while True:
l = get_next_nonblank(cfg)
if l is None:
break
if l.startswith('.'):
finalise_last_block()
block_hdr = l
block_content = ""
if l.startswith(".device "):
chip = pytrellis.Chip(l.split(" ")[1])
elif l.startswith(".comment "):
chip.metadata.append(l.split(" ", 1)[1])
elif l.startswith(".tile "):
pass
else:
assert False, "unrecognised dot-statement {}".format(l.split(" ")[0])
else:
block_content += l
block_content += "\n"
finalise_last_block()
# Init unseen tiles with the default config
for tile in chip.get_all_tiles():
if tile.info.name not in seen_tiles:
tile.read_config("")
bs = pytrellis.Bitstream.serialise_chip(chip)
bs.write_bit(argv[2])
if __name__ == "__main__":
main(sys.argv)