125 lines
4.7 KiB
Python
125 lines
4.7 KiB
Python
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) |