脚本目录结构如下:
$ tree .
|-- config.json
|-- gen_view.py
|-- templates
|-- view.t
运行:python3 gen_view.py
一、文件config.json:
{
"rc": [
{
"name": "cmax",
"T": "125",
"captable": "cmax.captable",
"qrctech": "cmax/qrcTechfile"
},
{
"name": "cmin",
"T": "-40",
"captable": "cmin.captable",
"qrctech": "cmin/qrcTechfile"
},
{
"name": "ctyp",
"T": "-125",
"captable": "ctyp.captable",
"qrctech": "ctyp/qrcTechfile"
}
],
"library": [
{
"name": "ss_lib",
"libfiles": [
"../../lib/stdlib/sc7_base_rvt/lib/sc7_cl130al_base_rvt_ss_typical_max_1p08v_125c.lib",
"../../lib/memory/SRAM_512x48_200MHz/sram_sp_512x48_nldm_ss_1p08v_1p08v_125c_syn.lib",
"../../lib/memory/SRAM_256x8_200MHz/sram_sp_256x8_nldm_ss_1p08v_1p08v_125c_syn.lib"
],
"hascdb": "no",
"cdbfiles": [
"stdlib_ss.cdb",
"sram1_ss.cdb",
"sram2_ss.cdb"
]
},
{
"name": "ff_lib",
"libfiles": [
"../../lib/stdlib/sc7_base_rvt/lib/sc7_cl130al_base_rvt_ff_typical_min_1p32v_m40c.lib",
"../../lib/memory/SRAM_256x8_200MHz/sram_sp_256x8_nldm_ff_1p32v_1p32v_m40c_syn.lib",
"../../lib/memory/SRAM_512x48_200MHz/sram_sp_512x48_nldm_ff_1p32v_1p32v_m40c_syn.lib"
],
"hascdb": "no",
"cdbfiles": [
"stdlib_ff.cdb",
"sram1_ff.cdb",
"sram2_ff.cdb"
]
},
{
"name": "tt_lib",
"libfiles": [
"../../lib/stdlib/sc7_base_rvt/lib/sc7_cl130al_base_rvt_tt_typical_max_1p20v_25c.lib",
"../../lib/memory/SRAM_512x48_200MHz/sram_sp_512x48_nldm_tt_1p20v_1p20v_25c_syn.lib",
"../../lib/memory/SRAM_256x8_200MHz/sram_sp_256x8_nldm_tt_1p20v_1p20v_25c_syn.lib"
],
"hascdb": "no",
"cdbfiles": [
"stdlib_tt.cdb",
"sram1_tt.cdb",
"sram2_tt.cdb"
]
}
],
"mode": [
{
"name": "sdc_bist",
"sdcfile": "../data/sdc_s_mbist.sdc"
},
{
"name": "sdc_normal",
"sdcfile": "../data/sdc_s_normal_lvds_2ch.sdc"
},
{
"name": "sdc_normal2",
"sdcfile": "../data/sdc_s_normal2_lvds_2ch.sdc"
}
],
"delay": [
{
"name": "dly_ss",
"library": "ss_lib",
"rc": "cmax"
},
{
"name": "dly_ff",
"library": "ff_lib",
"rc": "cmax"
},
{
"name": "dly_tt",
"library": "tt_lib",
"rc": "ctyp"
}
],
"view": [
{
"name": "view_ss_normal",
"mode": "sdc_normal",
"delay": "dly_ss"
},
{
"name": "view_ff_normal",
"mode": "sdc_normal",
"delay": "dly_ff"
},
{
"name": "view_tt_normal",
"mode": "sdc_normal",
"delay": "dly_tt"
},
{
"name": "view_ss_normal2",
"mode": "sdc_normal2",
"delay": "dly_ss"
},
{
"name": "view_ff_normal2",
"mode": "sdc_normal2",
"delay": "dly_ff"
},
{
"name": "view_tt_normal2",
"mode": "sdc_normal2",
"delay": "dly_tt"
},
{
"name": "view_ss_bist",
"mode": "sdc_bist",
"delay": "dly_ss"
},
{
"name": "view_ff_bist",
"mode": "sdc_bist",
"delay": "dly_ff"
},
{
"name": "view_tt_bist",
"mode": "sdc_bist",
"delay": "dly_tt"
}
],
"setup": [
"view_ss_normal",
"view_tt_normal",
"view_ss_normal2",
"view_tt_normal2",
"view_ss_bist",
"view_tt_bist"
],
"hold": [
"view_ss_normal",
"view_ff_normal",
"view_tt_normal",
"view_ss_normal2",
"view_ff_normal2",
"view_tt_normal2",
"view_ss_bist",
"view_ff_bist",
"view_tt_bist"
]
}
二、文件gen_view.py:
import sys
#import re
from jinja2 import Environment, FileSystemLoader
import json5 as json
#-------------------------------------------
# read config file
#-------------------------------------------
f = open("config.json", "r")
data = json.load(f)
#print(data['rc'])
#sys.exit()
#-------------------------------------------
# call jinja2 template
#-------------------------------------------
env = Environment(
loader=FileSystemLoader('templates'),
autoescape=False
)
template = env.get_template('view.t')
view_string = template.render(data)
#print(view_string)
#-------------------------------------------
# write to view file
#-------------------------------------------
design_top = "top"
f = open(design_top + ".view", "w")
f.write(view_string)
f.close()
三、文件templates/view.t:
# Version:1.0 MMMC View Definition File
# Do Not Remove Above Line
{% for item in rc %}
create_rc_corner -name {{ item.name }} -T { {{ item.T }} } \
-cap_table { {{ item.captable }} } \
-qx_tech_file { {{ item.qrctech }} }
{% endfor %}
{% for item in library %}
create_library_set \
-name {{ item.name }} \
-timing { \
{% for subitem in item.libfiles -%}
{{ subitem }} \
{% endfor -%}
{% if item.hascdb == "yes" -%}
} \
-si { \
{% for subitem in item.cdbfiles -%}
{{ subitem }} \
{% endfor -%}
}
{% else -%}
}
{% endif %}
{% endfor %}
{% for item in mode -%}
create_constraint_mode -name {{ item.name }} -sdc_files { {{ item.sdcfile}} }
{% endfor %}
{% for item in delay -%}
create_delay_corner -name {{ item.name }} -library_set { {{ item.library}} } -rc_corner { {{ item.rc}} }
{% endfor %}
{% for item in view -%}
create_analysis_view -name {{ item.name }} -constraint_mode { {{ item.mode }} } -delay_corner { {{ item.delay}} }
{% endfor %}
set_analysis_view -setup { \
{% for item in setup -%}
{{ item }} \
{% endfor -%}
} -hold { \
{% for item in hold -%}
{{ item }} \
{% endfor -%}
}
