improve IC Layout Diffussion model 20251120
This commit is contained in:
102
tools/rasterize.py
Normal file
102
tools/rasterize.py
Normal file
@@ -0,0 +1,102 @@
|
||||
import pya
|
||||
import os
|
||||
|
||||
def rasterize_final(gds_path, output_dir, width_px=256):
|
||||
# --- 1. 检查与设置 ---
|
||||
if not os.path.exists(gds_path):
|
||||
print(f"Error: File not found: {gds_path}")
|
||||
return
|
||||
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir)
|
||||
|
||||
gds_basename = os.path.splitext(os.path.basename(gds_path))[0]
|
||||
print(f"Processing: {gds_basename}")
|
||||
|
||||
# --- 2. 加载 Layout ---
|
||||
layout = pya.Layout()
|
||||
layout.read(gds_path)
|
||||
top_cell = layout.top_cell()
|
||||
|
||||
if top_cell is None:
|
||||
print("Error: No top cell found.")
|
||||
return
|
||||
|
||||
# [核心修复] 使用 dbbox() 获取微米(Micron)单位的边框
|
||||
# bbox() 返回的是 DBU (Database Units, 整数),View 可能会把它当做微米导致比例尺错误
|
||||
global_dbbox = top_cell.dbbox()
|
||||
|
||||
print(f"Global BBox (Microns): {global_dbbox}")
|
||||
print(f"Width: {global_dbbox.width()} um, Height: {global_dbbox.height()} um")
|
||||
|
||||
if global_dbbox.width() <= 0:
|
||||
print("Error: Layout is empty or zero width.")
|
||||
return
|
||||
|
||||
# 计算分辨率
|
||||
aspect_ratio = global_dbbox.height() / global_dbbox.width()
|
||||
height_px = int(width_px * aspect_ratio)
|
||||
height_px = max(1, height_px)
|
||||
|
||||
# --- 3. 初始化视图 ---
|
||||
view = pya.LayoutView()
|
||||
view.show_layout(layout, False)
|
||||
view.max_hier_levels = 1000
|
||||
|
||||
# 设置为黑底(用于正式输出)
|
||||
view.set_config("background-color", "#000000")
|
||||
view.set_config("grid-visible", "false")
|
||||
|
||||
layer_indices = layout.layer_indices()
|
||||
saved_count = 0
|
||||
|
||||
for layer_idx in layer_indices:
|
||||
# 检查内容 (注意:bbox_per_layer 也要看情况,这里我们直接渲染不设防)
|
||||
# 为了效率,可以先检查该层是否为空
|
||||
if top_cell.bbox_per_layer(layer_idx).empty():
|
||||
continue
|
||||
|
||||
layer_info = layout.get_info(layer_idx)
|
||||
|
||||
# 输出文件名
|
||||
filename = f"{gds_basename}_{layer_info.layer}_{layer_info.datatype}.png"
|
||||
full_output_path = os.path.join(output_dir, filename)
|
||||
|
||||
# --- 4. 配置图层 ---
|
||||
iter = view.begin_layers()
|
||||
while not iter.at_end():
|
||||
view.delete_layer(iter)
|
||||
|
||||
props = pya.LayerPropertiesNode()
|
||||
props.source_layer_index = layer_idx
|
||||
|
||||
# 实心填充
|
||||
props.dither_pattern = 0
|
||||
|
||||
# 白色填充 + 白色边框
|
||||
props.fill_color = 0xFFFFFF
|
||||
props.frame_color = 0xFFFFFF
|
||||
|
||||
# 稍微加粗一点边框,保证极细线条也能被渲染
|
||||
props.width = 0
|
||||
props.visible = True
|
||||
|
||||
view.insert_layer(view.end_layers(), props)
|
||||
|
||||
# [核心修复] 使用微米坐标 Zoom
|
||||
view.zoom_box(global_dbbox)
|
||||
|
||||
# 保存
|
||||
view.save_image(full_output_path, width_px, height_px)
|
||||
print(f"Saved: {filename}")
|
||||
saved_count += 1
|
||||
|
||||
print(f"Done. Generated {saved_count} images.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 请替换为你的实际路径
|
||||
input_gds = "/home/jiao77/Documents/data/ICCAD2019/layout/patid_MX_Benchmark2_clip_hotspot1_11_orig_0.gds"
|
||||
output_folder = "out/final_images"
|
||||
resolution_width = 256
|
||||
|
||||
rasterize_final(input_gds, output_folder, resolution_width)
|
||||
Reference in New Issue
Block a user