Files
RoRD-Layout-Recognation/tools/batch_rasterize_10_0.py
2025-11-20 01:47:09 +08:00

125 lines
4.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)