在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 78|回复: 1

[原创] drc density密度跑出的图形根据坐标导入到cellview的skill

[复制链接]
发表于 7 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
如果输入数据 `input_data` 是一个文件 `aa`,我们需要修改脚本以从文件中读取数据,而不是直接使用硬编码的输入数据。以下是修改后的 Python 脚本:

---

### **修改后的 Python 脚本**

```python
# 从文件 aa 中读取输入数据
with open("aa", "r") as file:
    input_data = file.read()

# 解析输入数据
lines = input_data.strip().split("\n")
skill_script = []
skill_script.append('let((cv)')
skill_script.append('  cv = dbOpenCellViewByType("OD_density" "ODDN4_MaxDinReg" "layout" "maskLayout" "a")')

for i, line in enumerate(lines):
    x1, y1, x2, y2, pin_name = line.split()
    pin_name = f"D{pin_name}"  # 添加前缀 D
    net_name = f"net{i+1}"
    fig_name = f"fig{i+1}"
    pin_var = f"pin{i+1}"

    # 生成 Skill 脚本
    skill_script.append(f'  ; 第 {i+1} 个 pin')
    skill_script.append(f'  pin_name{i+1} = "{pin_name}"')
    skill_script.append(f'  {net_name} = dbMakeNet(cv pin_name{i+1})')
    skill_script.append(f'  {fig_name} = dbCreateRect(cv "AP" list({x1}:{y1} {x2}:{y2}))')
    skill_script.append(f'  {pin_var} = dbCreatePin({net_name} {fig_name})')
    skill_script.append('')

# 添加保存操作
skill_script.append('  ; 保存')
skill_script.append('  dbSave(cv)')
skill_script.append('); let')

# 输出 Skill 脚本到文件
with open("output_script.il", "w") as output_file:
    output_file.write("\n".join(skill_script))

print("Skill 脚本已生成并保存到 output_script.il 文件中。")
```

---

### **脚本说明**
1. **从文件读取数据**:
   - 使用 `with open("aa", "r") as file` 打开文件 `aa`,并读取其内容到 `input_data`。
2. **解析数据**:
   - 将文件内容按行分割,并解析每行的 `x1, y1, x2, y2, pin_name`。
3. **生成 Skill 脚本**:
   - 根据解析的数据生成对应的 Skill 脚本。
4. **保存脚本到文件**:
   - 将生成的 Skill 脚本保存到 `output_script.il` 文件中。

---

### **使用方法**
1. 将输入数据保存到文件 `aa` 中,确保文件内容格式正确:
   ```
   386.949 9 404.949 27 0.556239
   431.949 9 449.949 27 0.556239
   440.949 9 458.949 27 0.55502
   395.949 225 413.949 243 0.554741
   404.949 225 422.949 243 0.554741
   440.949 225 458.949 243 0.554741
   449.949 225 467.949 243 0.554741
   395.949 234 413.949 252 0.551103
   404.949 234 422.949 252 0.551103
   440.949 234 458.949 252 0.551103
   449.949 234 467.949 252 0.551103
   422.949 9 440.949 27 0.550335
   ```
2. 运行 Python 脚本,生成 Skill 脚本文件 `output_script.il`。
3. 在 Cadence Virtuoso 的 CIW(Command Interpreter Window)中加载生成的脚本:
   ```skill
   load("output_script.il")
   ```
4. 运行脚本,生成对应的 nets、矩形和 pins。

---

### **生成的 Skill 脚本示例**
生成的 `output_script.il` 文件内容如下:

```skill
let((cv)
  cv = dbOpenCellViewByType("OD_density" "ODDN4_MaxDinReg" "layout" "maskLayout" "a")

  ; 第 1 个 pin
  pin_name1 = "D0.556239"
  net1 = dbMakeNet(cv pin_name1)
  fig1 = dbCreateRect(cv "AP" list(386.949:9 404.949:27))
  pin1 = dbCreatePin(net1 fig1)

  ; 第 2 个 pin
  pin_name2 = "D0.556239"
  net2 = dbMakeNet(cv pin_name2)
  fig2 = dbCreateRect(cv "AP" list(431.949:9 449.949:27))
  pin2 = dbCreatePin(net2 fig2)

  ; 第 3 个 pin
  pin_name3 = "D0.55502"
  net3 = dbMakeNet(cv pin_name3)
  fig3 = dbCreateRect(cv "AP" list(440.949:9 458.949:27))
  pin3 = dbCreatePin(net3 fig3)

  ; 第 4 个 pin
  pin_name4 = "D0.554741"
  net4 = dbMakeNet(cv pin_name4)
  fig4 = dbCreateRect(cv "AP" list(395.949:225 413.949:243))
  pin4 = dbCreatePin(net4 fig4)

  ; 第 5 个 pin
  pin_name5 = "D0.554741"
  net5 = dbMakeNet(cv pin_name5)
  fig5 = dbCreateRect(cv "AP" list(404.949:225 422.949:243))
  pin5 = dbCreatePin(net5 fig5)

  ; 第 6 个 pin
  pin_name6 = "D0.554741"
  net6 = dbMakeNet(cv pin_name6)
  fig6 = dbCreateRect(cv "AP" list(440.949:225 458.949:243))
  pin6 = dbCreatePin(net6 fig6)

  ; 第 7 个 pin
  pin_name7 = "D0.554741"
  net7 = dbMakeNet(cv pin_name7)
  fig7 = dbCreateRect(cv "AP" list(449.949:225 467.949:243))
  pin7 = dbCreatePin(net7 fig7)

  ; 第 8 个 pin
  pin_name8 = "D0.551103"
  net8 = dbMakeNet(cv pin_name8)
  fig8 = dbCreateRect(cv "AP" list(395.949:234 413.949:252))
  pin8 = dbCreatePin(net8 fig8)

  ; 第 9 个 pin
  pin_name9 = "D0.551103"
  net9 = dbMakeNet(cv pin_name9)
  fig9 = dbCreateRect(cv "AP" list(404.949:234 422.949:252))
  pin9 = dbCreatePin(net9 fig9)

  ; 第 10 个 pin
  pin_name10 = "D0.551103"
  net10 = dbMakeNet(cv pin_name10)
  fig10 = dbCreateRect(cv "AP" list(440.949:234 458.949:252))
  pin10 = dbCreatePin(net10 fig10)

  ; 第 11 个 pin
  pin_name11 = "D0.551103"
  net11 = dbMakeNet(cv pin_name11)
  fig11 = dbCreateRect(cv "AP" list(449.949:234 467.949:252))
  pin11 = dbCreatePin(net11 fig11)

  ; 第 12 个 pin
  pin_name12 = "D0.550335"
  net12 = dbMakeNet(cv pin_name12)
  fig12 = dbCreateRect(cv "AP" list(422.949:9 440.949:27))
  pin12 = dbCreatePin(net12 fig12)

  ; 保存
  dbSave(cv)
); let
```

---

### **总结**
通过修改后的脚本,你可以从文件 `aa` 中读取输入数据,并生成对应的 Skill 脚本文件 `output_script.il`。生成的脚本可以直接在 Cadence Virtuoso 中运行,自动化创建 nets、矩形和 pins。

以下是修改后的 Python 脚本中每一行代码的详细解析,帮助你理解每个命令的作用和含义:

---

### **1. 从文件读取输入数据**
```python
with open("aa", "r") as file:
    input_data = file.read()
```
- **`open("aa", "r")`**:
  - 打开名为 `aa` 的文件,模式为 `"r"`(只读模式)。
- **`with ... as file:`**:
  - 使用 `with` 语句打开文件,确保文件在使用后自动关闭。
- **`file.read()`**:
  - 读取文件的全部内容,并将其存储到变量 `input_data` 中。

---

### **2. 解析输入数据**
```python
lines = input_data.strip().split("\n")
```
- **`input_data.strip()`**:
  - 去除 `input_data` 字符串开头和结尾的空白字符(如换行符、空格等)。
- **`.split("\n")`**:
  - 按换行符 `\n` 分割字符串,生成一个列表 `lines`,其中每个元素是文件中的一行。

---

### **3. 初始化 Skill 脚本**
```python
skill_script = []
skill_script.append('let((cv)')
skill_script.append('  cv = dbOpenCellViewByType("OD_density" "ODDN4_MaxDinReg" "layout" "maskLayout" "a")')
```
- **`skill_script = []`**:
  - 创建一个空列表 `skill_script`,用于存储生成的 Skill 脚本内容。
- **`skill_script.append(...)`**:
  - 向列表中添加 Skill 脚本的初始部分:
    - `let((cv))`:定义一个局部变量 `cv`。
    - `cv = dbOpenCellViewByType(...)`:打开指定的 cellview,用于后续操作。

---

### **4. 遍历每行数据并生成 Skill 脚本**
```python
for i, line in enumerate(lines):
    x1, y1, x2, y2, pin_name = line.split()
    pin_name = f"D{pin_name}"  # 添加前缀 D
    net_name = f"net{i+1}"
    fig_name = f"fig{i+1}"
    pin_var = f"pin{i+1}"
```
- **`for i, line in enumerate(lines):`**:
  - 遍历 `lines` 列表中的每一行数据,`i` 是行号(从 0 开始),`line` 是当前行的内容。
- **`x1, y1, x2, y2, pin_name = line.split()`**:
  - 将当前行按空格分割,提取出 `x1, y1, x2, y2, pin_name`。
- **`pin_name = f"D{pin_name}"`**:
  - 在 `pin_name` 前添加前缀 `D`,生成新的 net 名称。
- **`net_name = f"net{i+1}"`**:
  - 生成 net 变量名,如 `net1`, `net2` 等。
- **`fig_name = f"fig{i+1}"`**:
  - 生成矩形变量名,如 `fig1`, `fig2` 等。
- **`pin_var = f"pin{i+1}"`**:
  - 生成 pin 变量名,如 `pin1`, `pin2` 等。

---

### **5. 生成 Skill 脚本内容**
```python
    skill_script.append(f'  ; 第 {i+1} 个 pin')
    skill_script.append(f'  pin_name{i+1} = "{pin_name}"')
    skill_script.append(f'  {net_name} = dbMakeNet(cv pin_name{i+1})')
    skill_script.append(f'  {fig_name} = dbCreateRect(cv "AP" list({x1}:{y1} {x2}:{y2}))')
    skill_script.append(f'  {pin_var} = dbCreatePin({net_name} {fig_name})')
    skill_script.append('')
```
- **`skill_script.append(...)`**:
  - 向 `skill_script` 列表中添加 Skill 脚本的每一行:
    1. **注释**:`; 第 {i+1} 个 pin`,用于标记当前是第几个 pin。
    2. **定义 net 名称**:`pin_name{i+1} = "{pin_name}"`。
    3. **创建 net**:`{net_name} = dbMakeNet(cv pin_name{i+1})`。
    4. **创建矩形**:`{fig_name} = dbCreateRect(cv "AP" list({x1}:{y1} {x2}:{y2}))`。
    5. **创建 pin**:`{pin_var} = dbCreatePin({net_name} {fig_name})`。
    6. **空行**:用于分隔每个 pin 的代码块。

---

### **6. 添加保存操作**
```python
skill_script.append('  ; 保存')
skill_script.append('  dbSave(cv)')
skill_script.append('); let')
```
- **`skill_script.append(...)`**:
  - 向 `skill_script` 列表中添加 Skill 脚本的结尾部分:
    1. **注释**:`; 保存`,用于标记保存操作。
    2. **保存 cellview**:`dbSave(cv)`。
    3. **结束 `let` 块**:`); let`。

---

### **7. 输出 Skill 脚本到文件**
```python
with open("output_script.il", "w") as output_file:
    output_file.write("\n".join(skill_script))
```
- **`open("output_script.il", "w")`**:
  - 打开文件 `output_script.il`,模式为 `"w"`(写入模式)。如果文件不存在,则创建文件;如果文件已存在,则覆盖内容。
- **`output_file.write(...)`**:
  - 将 `skill_script` 列表中的内容按行连接(`"\n".join(...)`),并写入文件。

---

### **8. 打印提示信息**
```python
print("Skill 脚本已生成并保存到 output_script.il 文件中。")
```
- **`print(...)`**:
  - 在控制台输出提示信息,告知用户脚本已生成并保存。

---

### **总结**
通过以上详细解析,你可以理解每一行代码的作用:
1. **从文件读取数据**:读取输入文件 `aa` 的内容。
2. **解析数据**:按行分割并提取坐标和 net 名称。
3. **生成 Skill 脚本**:根据输入数据生成对应的 Skill 脚本内容。
4. **保存脚本**:将生成的 Skill 脚本保存到文件 `output_script.il` 中。

运行该脚本后,你可以直接在 Cadence Virtuoso 中加载 `output_script.il` 文件,自动化创建 nets、矩形和 pins。

 楼主| 发表于 6 小时前 | 显示全部楼层
这里把density报出来的DV值当成了pin_name
Calculated property definitions:
#EC \u2013 Common edge length or projection.
#EW \u2014 Edge width, or minimum separation distance
between edge pair.
#EL \u2014 Average edge length of the edge pair.
#PA \u2014 Polygon area.
#PP \u2014 Polygon perimeter.
#SC \u2014 Shape Class. Result shapes are classified
internally and the #SC value is an index into the set of
different shapes found in the results database.
#Flipped, #Rotated \u2014 For Results From Cloned Cells.
Notice the presence of properties DV, DG, and DA:
\u2022 DV (Density value) \u2014 Density value of the window (to eight significant figures).
\u2022 DG (Density gradient) \u2014 Gradient value of the window if GRADIENT is specified.
\u2022 DA (Density area) \u2014 Area value of the window. It may either be followed by a numeric
value, or by a layer name and then a numeric value. With no layer name, it is the area of
the window and is always attached. Otherwise, a DA property is attached for each input
layer and is the layer name followed by its area in the window.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-3-12 22:54 , Processed in 0.015874 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表