Spaces:
Sleeping
Sleeping
File size: 2,632 Bytes
e7cce1c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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) |