From 2bed3cc771611146c21d523f89998801749391dd Mon Sep 17 00:00:00 2001 From: Andrew Butt Date: Fri, 10 Jul 2020 18:44:32 -0400 Subject: [PATCH 1/4] Add overlay python object to act as inverse roi Signed-off-by: Andrew Butt --- prjxray/overlay.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 prjxray/overlay.py diff --git a/prjxray/overlay.py b/prjxray/overlay.py new file mode 100644 index 00000000..2ba4b779 --- /dev/null +++ b/prjxray/overlay.py @@ -0,0 +1,60 @@ +class Overlay(object): + """ Object that represents an overlay. + + Can be used to iterate over tiles and sites not inside a partition region. + + """ + + def __init__(self, db, region_dict): + self.grid = db.grid() + self.region_dict = region_dict + + def tile_in_roi(self, grid_loc): + """ Returns true if grid_loc (GridLoc tuple) is within the overlay. """ + x = grid_loc.grid_x + y = grid_loc.grid_y + for _, bounds in self.region_dict.items(): + x1, x2, y1, y2 = bounds + if x1 <= x and x <= x2 and y1 <= y and y <= y2: + return False + return True + + def gen_tiles(self, tile_types=None): + ''' Yield tile names within overlay. + + tile_types: list of tile types to keep, or None for all + ''' + + for tile_name in self.grid.tiles(): + loc = self.grid.loc_of_tilename(tile_name) + + if not self.tile_in_roi(loc): + continue + + gridinfo = self.grid.gridinfo_at_loc(loc) + + if tile_types is not None and gridinfo.tile_type not in tile_types: + continue + + yield tile_name + + def gen_sites(self, site_types=None): + ''' Yield (tile_name, site_name, site_type) within overlay. + + site_types: list of site types to keep, or None for all + + ''' + + for tile_name in self.grid.tiles(): + loc = self.grid.loc_of_tilename(tile_name) + + if not self.tile_in_roi(loc): + continue + + gridinfo = self.grid.gridinfo_at_loc(loc) + + for site_name, site_type in gridinfo.sites.items(): + if site_types is not None and site_type not in site_types: + continue + + yield (tile_name, site_name, site_type) From 9456bcded15617949942a33db76112bae5a39805 Mon Sep 17 00:00:00 2001 From: Andrew Butt Date: Tue, 14 Jul 2020 18:05:38 -0400 Subject: [PATCH 2/4] Make suggested overlay changes, still need tests Signed-off-by: Andrew Butt --- prjxray/overlay.py | 54 +++++++++++----------------------------------- 1 file changed, 12 insertions(+), 42 deletions(-) diff --git a/prjxray/overlay.py b/prjxray/overlay.py index 2ba4b779..95ef8e38 100644 --- a/prjxray/overlay.py +++ b/prjxray/overlay.py @@ -1,3 +1,13 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017-2020 The Project X-Ray Authors. +# +# Use of this source code is governed by a ISC-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/ISC +# +# SPDX-License-Identifier: ISC class Overlay(object): """ Object that represents an overlay. @@ -5,8 +15,8 @@ class Overlay(object): """ - def __init__(self, db, region_dict): - self.grid = db.grid() + def __init__(self, grid, region_dict): + self.grid = grid self.region_dict = region_dict def tile_in_roi(self, grid_loc): @@ -18,43 +28,3 @@ class Overlay(object): if x1 <= x and x <= x2 and y1 <= y and y <= y2: return False return True - - def gen_tiles(self, tile_types=None): - ''' Yield tile names within overlay. - - tile_types: list of tile types to keep, or None for all - ''' - - for tile_name in self.grid.tiles(): - loc = self.grid.loc_of_tilename(tile_name) - - if not self.tile_in_roi(loc): - continue - - gridinfo = self.grid.gridinfo_at_loc(loc) - - if tile_types is not None and gridinfo.tile_type not in tile_types: - continue - - yield tile_name - - def gen_sites(self, site_types=None): - ''' Yield (tile_name, site_name, site_type) within overlay. - - site_types: list of site types to keep, or None for all - - ''' - - for tile_name in self.grid.tiles(): - loc = self.grid.loc_of_tilename(tile_name) - - if not self.tile_in_roi(loc): - continue - - gridinfo = self.grid.gridinfo_at_loc(loc) - - for site_name, site_type in gridinfo.sites.items(): - if site_types is not None and site_type not in site_types: - continue - - yield (tile_name, site_name, site_type) From 67b2749b0a514a10659b637fa2bb503ea56bc833 Mon Sep 17 00:00:00 2001 From: Andrew Butt Date: Wed, 15 Jul 2020 15:26:47 -0400 Subject: [PATCH 3/4] Add test cases for overlay Signed-off-by: Andrew Butt --- tests/test_util.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tests/test_util.py b/tests/test_util.py index 8ea851ed..dae5b13c 100755 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -21,8 +21,10 @@ from unittest import TestCase, main environ['XRAY_DATABASE_ROOT'] = '.' environ['XRAY_PART'] = './' -from prjxray.util import get_roi - +from prjxray.util import get_roi, get_db_root +from prjxray.db import Database +from prjxray.overlay import Overlay +from prjxray.grid_types import GridLoc @contextmanager def setup_database(contents): @@ -69,6 +71,17 @@ class TestUtil(TestCase): self.assertListEqual( list(get_roi().gen_sites()), [('ATILE', 'FOO', 'BAR')]) + def test_in_roi_overlay(self): + db = Database(get_db_root(), './database/artix7/xc7a50tfgg484-1') + region_dict = {} + region_dict['pr1'] = (10, 58, 0, 51) + region_dict['pr2'] = (10, 58, 52, 103) + overlay = Overlay(db.grid(), region_dict) + self.assertFalse(overlay.tile_in_roi(GridLoc(18, 50))) + self.assertFalse(overlay.tile_in_roi(GridLoc(18, 84))) + self.assertTrue(overlay.tile_in_roi(GridLoc(8, 50))) + self.assertTrue(overlay.tile_in_roi(GridLoc(18, 112))) + self.assertTrue(overlay.tile_in_roi(GridLoc(80, 40))) if __name__ == '__main__': main() From 70f74123741dbb449d97b7f8a386306d8af4d7db Mon Sep 17 00:00:00 2001 From: Andrew Butt Date: Wed, 15 Jul 2020 15:54:27 -0400 Subject: [PATCH 4/4] Remove grid argument and fix formatting Signed-off-by: Andrew Butt --- prjxray/overlay.py | 3 +-- tests/test_util.py | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/prjxray/overlay.py b/prjxray/overlay.py index 95ef8e38..64c7cce6 100644 --- a/prjxray/overlay.py +++ b/prjxray/overlay.py @@ -15,8 +15,7 @@ class Overlay(object): """ - def __init__(self, grid, region_dict): - self.grid = grid + def __init__(self, region_dict): self.region_dict = region_dict def tile_in_roi(self, grid_loc): diff --git a/tests/test_util.py b/tests/test_util.py index dae5b13c..2187630c 100755 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -22,10 +22,10 @@ environ['XRAY_DATABASE_ROOT'] = '.' environ['XRAY_PART'] = './' from prjxray.util import get_roi, get_db_root -from prjxray.db import Database from prjxray.overlay import Overlay from prjxray.grid_types import GridLoc + @contextmanager def setup_database(contents): with TemporaryDirectory() as d: @@ -72,16 +72,16 @@ class TestUtil(TestCase): list(get_roi().gen_sites()), [('ATILE', 'FOO', 'BAR')]) def test_in_roi_overlay(self): - db = Database(get_db_root(), './database/artix7/xc7a50tfgg484-1') region_dict = {} region_dict['pr1'] = (10, 58, 0, 51) region_dict['pr2'] = (10, 58, 52, 103) - overlay = Overlay(db.grid(), region_dict) + overlay = Overlay(region_dict) self.assertFalse(overlay.tile_in_roi(GridLoc(18, 50))) self.assertFalse(overlay.tile_in_roi(GridLoc(18, 84))) self.assertTrue(overlay.tile_in_roi(GridLoc(8, 50))) self.assertTrue(overlay.tile_in_roi(GridLoc(18, 112))) self.assertTrue(overlay.tile_in_roi(GridLoc(80, 40))) + if __name__ == '__main__': main()