mirror of https://github.com/VLSIDA/OpenRAM.git
68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
from enum import Enum
|
|
from vector3d import vector3d
|
|
|
|
class direction(Enum):
|
|
NORTH = 1
|
|
SOUTH = 2
|
|
EAST = 3
|
|
WEST = 4
|
|
UP = 5
|
|
DOWN = 6
|
|
NORTHEAST = 7
|
|
NORTHWEST = 8
|
|
SOUTHEAST = 9
|
|
SOUTHWEST = 10
|
|
|
|
|
|
def get_offset(direct):
|
|
"""
|
|
Returns the vector offset for a given direction.
|
|
"""
|
|
if direct==direction.NORTH:
|
|
offset = vector3d(0,1,0)
|
|
elif direct==direction.SOUTH:
|
|
offset = vector3d(0,-1,0)
|
|
elif direct==direction.EAST:
|
|
offset = vector3d(1,0,0)
|
|
elif direct==direction.WEST:
|
|
offset = vector3d(-1,0,0)
|
|
elif direct==direction.UP:
|
|
offset = vector3d(0,0,1)
|
|
elif direct==direction.DOWN:
|
|
offset = vector3d(0,0,-1)
|
|
elif direct==direction.NORTHEAST:
|
|
offset = vector3d(1,1,0)
|
|
elif direct==direction.NORTHWEST:
|
|
offset = vector3d(-1,1,0)
|
|
elif direct==direction.SOUTHEAST:
|
|
offset = vector3d(1,-1,0)
|
|
elif direct==direction.SOUTHWEST:
|
|
offset = vector3d(-1,-1,0)
|
|
else:
|
|
debug.error("Invalid direction {}".format(direct))
|
|
|
|
return offset
|
|
|
|
def cardinal_directions(up_down_too=False):
|
|
temp_dirs = [direction.NORTH, direction.EAST, direction.SOUTH, direction.WEST]
|
|
if up_down_too:
|
|
temp_dirs.extend([direction.UP, direction.DOWN])
|
|
return temp_dirs
|
|
|
|
def cardinal_offsets(up_down_too=False):
|
|
return [direction.get_offset(d) for d in direction.cardinal_directions(up_down_too)]
|
|
|
|
def all_directions():
|
|
return [direction.NORTH, direction.EAST, direction.SOUTH, direction.WEST,
|
|
direction.NORTHEAST, direction.NORTHWEST, direction.SOUTHEAST, direction.SOUTHWEST]
|
|
|
|
def all_offsets():
|
|
return [direction.get_offset(d) for d in direction.all_directions()]
|
|
|
|
def all_neighbors(cell):
|
|
return [cell+x for x in direction.all_offsets()]
|
|
|
|
def cardinal_neighbors(cell):
|
|
return [cell+x for x in direction.cardinal_offsets()]
|
|
|