improve IC Layout Diffussion model 20251120
This commit is contained in:
125
tools/batch_rasterize_10_0.py
Normal file
125
tools/batch_rasterize_10_0.py
Normal file
@@ -0,0 +1,125 @@
|
||||
import pya
|
||||
import os
|
||||
import glob
|
||||
|
||||
def batch_rasterize_layer_10_0(input_dir, output_dir, width_px=256):
|
||||
# --- 1. 环境准备 ---
|
||||
if not os.path.exists(input_dir):
|
||||
print(f"Error: Input directory not found: {input_dir}")
|
||||
return
|
||||
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir)
|
||||
print(f"Created output directory: {output_dir}")
|
||||
|
||||
# 获取所有 gds 文件 (不区分大小写)
|
||||
gds_files = glob.glob(os.path.join(input_dir, "*.gds")) + \
|
||||
glob.glob(os.path.join(input_dir, "*.GDS"))
|
||||
|
||||
# 去重并排序
|
||||
gds_files = sorted(list(set(gds_files)))
|
||||
|
||||
total_files = len(gds_files)
|
||||
print(f"Found {total_files} GDS files in {input_dir}")
|
||||
print("-" * 50)
|
||||
|
||||
# 定义目标层
|
||||
TARGET_LAYER = 10
|
||||
TARGET_DATATYPE = 0
|
||||
|
||||
# --- 2. 批量处理循环 ---
|
||||
for i, gds_path in enumerate(gds_files):
|
||||
try:
|
||||
gds_filename = os.path.basename(gds_path)
|
||||
gds_basename = os.path.splitext(gds_filename)[0]
|
||||
|
||||
# 输出文件路径: out_dir/filename.png
|
||||
output_path = os.path.join(output_dir, f"{gds_basename}.png")
|
||||
|
||||
print(f"[{i+1}/{total_files}] Processing: {gds_filename} ...", end="", flush=True)
|
||||
|
||||
# --- 加载 Layout ---
|
||||
layout = pya.Layout()
|
||||
layout.read(gds_path)
|
||||
top_cell = layout.top_cell()
|
||||
|
||||
if top_cell is None:
|
||||
print(" -> Error: No Top Cell")
|
||||
continue
|
||||
|
||||
# --- 获取微米单位的 BBox (关键修复) ---
|
||||
global_dbbox = top_cell.dbbox()
|
||||
|
||||
# 如果 BBox 无效,跳过
|
||||
if global_dbbox.width() <= 0 or global_dbbox.height() <= 0:
|
||||
print(" -> Error: Empty Layout")
|
||||
continue
|
||||
|
||||
# --- 计算分辨率 ---
|
||||
aspect_ratio = global_dbbox.height() / global_dbbox.width()
|
||||
height_px = int(width_px * aspect_ratio)
|
||||
height_px = max(1, height_px)
|
||||
|
||||
# --- 初始化视图 ---
|
||||
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 10/0 ---
|
||||
|
||||
# 1. 清除默认图层
|
||||
iter = view.begin_layers()
|
||||
while not iter.at_end():
|
||||
view.delete_layer(iter)
|
||||
|
||||
# 2. 查找目标层索引
|
||||
# find_layer 返回索引,如果没找到通常需要在后续判断
|
||||
# 注意:即使文件里没有这一层,我们通常也需要生成一张全黑图片以保持数据集完整性
|
||||
layer_idx = layout.find_layer(TARGET_LAYER, TARGET_DATATYPE)
|
||||
|
||||
# 检查该层是否存在于 layout 中
|
||||
if layer_idx is not None:
|
||||
# 检查该层在 Top Cell 下是否有内容 (可选,为了效率)
|
||||
# 如果你需要即便没内容也输出黑图,可以保留逻辑继续
|
||||
|
||||
props = pya.LayerPropertiesNode()
|
||||
props.source_layer_index = layer_idx
|
||||
|
||||
# --- 沿用你确认可用的参数 ---
|
||||
props.dither_pattern = 0 # 你的配置: 0
|
||||
props.width = 0 # 你的配置: 0
|
||||
props.fill_color = 0xFFFFFF
|
||||
props.frame_color = 0xFFFFFF
|
||||
props.visible = True
|
||||
|
||||
view.insert_layer(view.end_layers(), props)
|
||||
else:
|
||||
# 如果没找到层,保持 view 里没有层,结果将是纯黑背景
|
||||
# 这在机器学习数据集中通常是期望的行为(Label为空)
|
||||
pass
|
||||
|
||||
# --- 锁定视角 (使用 Micron 坐标) ---
|
||||
view.zoom_box(global_dbbox)
|
||||
|
||||
# --- 保存图片 ---
|
||||
view.save_image(output_path, width_px, height_px)
|
||||
print(" Done.")
|
||||
|
||||
except Exception as e:
|
||||
print(f" -> Exception: {e}")
|
||||
|
||||
print("-" * 50)
|
||||
print("Batch processing finished.")
|
||||
|
||||
# --- 主程序入口 ---
|
||||
if __name__ == "__main__":
|
||||
# 配置输入输出文件夹
|
||||
input_folder = "/home/jiao77/Documents/data/ICCAD2019/layout" # 你的 GDS 文件夹
|
||||
output_folder = "/home/jiao77/Documents/data/ICCAD2019/img" # 输出图片文件夹
|
||||
resolution_width = 256 # 图片宽度
|
||||
|
||||
batch_rasterize_layer_10_0(input_folder, output_folder, resolution_width)
|
||||
Reference in New Issue
Block a user