| #!/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) |