eda-floorplan-openenv / visualize.py
blackdev337's picture
Initial Commit
e7cce1c verified
Raw
History Blame Contribute Delete
2.63 kB
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
from eda_env import EDAFloorplanEnv
def draw_floorplan(env: EDAFloorplanEnv, step_number: int = 0):
"""Generates a professional EDA visualizer for the current environment state."""
grid = np.array(env.grid)
size = env.grid_size
fig, ax = plt.subplots(figsize=(8, 8))
# Draw the base silicon grid
ax.set_xlim(-0.5, size - 0.5)
ax.set_ylim(-0.5, size - 0.5)
ax.set_xticks(np.arange(size))
ax.set_yticks(np.arange(size))
ax.grid(which='both', color='lightgrey', linestyle='-', linewidth=1)
# Plot placed components
cmap = plt.get_cmap("tab10") # Color palette for components
for comp_id, (x, y) in env.placed_locations.items():
# Draw component block
rect = patches.Rectangle((x - 0.4, y - 0.4), 0.8, 0.8,
linewidth=2, edgecolor='black',
facecolor=cmap(comp_id % 10), alpha=0.8)
ax.add_patch(rect)
# Add label
ax.text(x, y, f"C{comp_id}", ha='center', va='center',
color='white', fontweight='bold', fontsize=12)
# Draw HPWL Bounding Boxes for Nets
for i, net in enumerate(env.netlist):
placed_nodes = [node for node in net if node in env.placed_locations]
if len(placed_nodes) > 1:
xs = [env.placed_locations[n][0] for n in placed_nodes]
ys = [env.placed_locations[n][1] for n in placed_nodes]
min_x, max_x = min(xs), max(xs)
min_y, max_y = min(ys), max(ys)
# Draw the routing bounding box
width = max_x - min_x
height = max_y - min_y
box = patches.Rectangle((min_x, min_y), width, height,
linewidth=2.5, edgecolor=cmap(i % 10),
facecolor='none', linestyle='--')
ax.add_patch(box)
plt.title(f"EDA Floorplan State - Task: {env.task_name} | Step: {step_number}", fontsize=14, pad=20)
plt.gca().invert_yaxis() # Match matrix coordinates (0,0 at top left)
plt.show()
if __name__ == "__main__":
# Test the visualizer with a dummy placement
print("Generating visualizer preview...")
env = EDAFloorplanEnv(task_name="place_routed")
# Simulate a few steps for the visualizer
from eda_env import EDAAction
env.step(EDAAction(component_id=1, x=1, y=1))
env.step(EDAAction(component_id=2, x=3, y=2))
env.step(EDAAction(component_id=4, x=2, y=5))
draw_floorplan(env, step_number=3)