From d0c1efbfc22230e5cb089dedc91146cc81532534 Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Tue, 30 Oct 2018 11:07:31 -0700 Subject: [PATCH] Fix fasm_assembler for partial tile usage. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- prjxray/fasm_assembler.py | 15 +++++++++++++++ prjxray/tile_segbits.py | 5 +++-- utils/fasm2pips.py | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/prjxray/fasm_assembler.py b/prjxray/fasm_assembler.py index c625ac6c..4b633d45 100644 --- a/prjxray/fasm_assembler.py +++ b/prjxray/fasm_assembler.py @@ -22,6 +22,9 @@ class FasmAssembler(object): self.db = db self.grid = db.grid() + self.seen_tile = set() + self.frames_in_use = set() + self.frames = {} self.frames_line = {} @@ -29,7 +32,12 @@ class FasmAssembler(object): if not sparse: frames = self.frames_init() else: + # Even in sparse mode, zero all frames for any tile that is + # setting a bit. This handles the case where the tile has + # multiple frames, but the FASM only specifies some of the frames. frames = {} + for frame in self.frames_in_use: + init_frame_at_address(frames, frame) for (frame_addr, word_addr, bit_index), is_set in self.frames.items(): init_frame_at_address(frames, frame_addr) @@ -112,6 +120,13 @@ class FasmAssembler(object): segbits = self.db.get_tile_segbits(gridinfo.tile_type) + # Mark all frames used by this tile as in use. + if tile not in self.seen_tile: + for frame in segbits.frames(bits): + self.frames_in_use.add(frame) + + self.seen_tile.add(tile) + db_k = '%s.%s' % (gridinfo.tile_type, feature) try: diff --git a/prjxray/tile_segbits.py b/prjxray/tile_segbits.py index 392026b3..8472c9f8 100644 --- a/prjxray/tile_segbits.py +++ b/prjxray/tile_segbits.py @@ -143,5 +143,6 @@ class TileSegbits(object): def frames(self, bits): """ Iterate over frames this tile uses for a given bit location. """ - for bit in self.segbits.values(): - yield bits.base_address + bit.word_column + for query_bits in self.segbits.values(): + for bit in query_bits: + yield bits.base_address + bit.word_column diff --git a/utils/fasm2pips.py b/utils/fasm2pips.py index 9c92887b..3e7a60d8 100755 --- a/utils/fasm2pips.py +++ b/utils/fasm2pips.py @@ -46,7 +46,7 @@ def main(): for pip in tile_type.pips: if pip.net_from == parts[2] and pip.net_to == parts[1]: - yield '{}/{}.{}'.format(tile, gridinfo.tile_type, pip.name) + yield '{}/{}'.format(tile, pip.name) print( 'highlight_objects [concat {}]'.format(