From 2bed3cc771611146c21d523f89998801749391dd Mon Sep 17 00:00:00 2001 From: Andrew Butt Date: Fri, 10 Jul 2020 18:44:32 -0400 Subject: [PATCH] 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)