diff --git a/gatemate/chip.py b/gatemate/chip.py index 3e21779..4f4c113 100644 --- a/gatemate/chip.py +++ b/gatemate/chip.py @@ -60,6 +60,14 @@ class Chip: y_pos = (y + 2) % die.num_rows() - 2 return die.get_tile_type(x_pos,y_pos) + def get_tile_info(self,x,y): + x_pos = (x + 2) % die.num_cols() - 2 + y_pos = (y + 2) % die.num_rows() - 2 + x_die = (x + 2) // die.num_cols() + y_die = (y + 2) // die.num_rows() + die_num = x_die + y_die * self.die_width + return die.get_tile_info(die_num, x_pos, y_pos) + def get_connections(self): conn = dict() for d in self.dies.values(): diff --git a/gatemate/die.py b/gatemate/die.py index 4f80240..717f244 100644 --- a/gatemate/die.py +++ b/gatemate/die.py @@ -200,6 +200,12 @@ class Connection: y : int name : str +@dataclass(eq=True, order=True) +class TileInfo: + die : int + bit_x : int + bit_y : int + prim_index : int PRIMITIVES_PINS = { "CPE": [ @@ -926,6 +932,33 @@ def get_tile_type_list(): return tt +def get_bitstream_tile(x, y): + # Edge blocks are bit bigger + if x == -2: + x += 1 + if x == max_col(): + x -= 1 + if y == -2: + y += 1 + if y == max_row(): + y -= 1 + return (x + 1) // 2, (y + 1) // 2 + +def get_tile_info(d,x,y): + bx, by = get_bitstream_tile(x,y) + pos = 0 + if is_cpe(x,y): + pos = ((x+1) % 2) * 2 + ((y+1) % 2) + 1 + if is_edge_top(x,y): + pos = (x - 1) % 2 + 1 + if is_edge_bottom(x,y): + pos = (x - 1) % 2 + 1 + if is_edge_left(x,y): + pos = (y - 1) % 2 + 1 + if is_edge_right(x,y): + pos = (y - 1) % 2 + 1 + return TileInfo(d, bx, by, pos) + def alt_plane(dir,plane): alt = [[5, 6, 7, 8, 1, 2, 3, 4,11,12, 9,10], [9,10,11,12, 9,10,11,12,12,11,10, 9]]