improve IC Layout Diffussion model 20251120

This commit is contained in:
Jiao77
2025-11-20 01:47:09 +08:00
parent 930f1952d5
commit 49fe21fb2f
8 changed files with 2254 additions and 0 deletions

View 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)