用json配置文件生成innovus view文件
专栏:iLoveIC Feb. 25, 2026, 6:56 p.m. 100 阅读
用json、jinja2生成innovus view文件

脚本目录结构如下:

$ 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 -%}
}
感谢阅读,更多文章点击这里:【专栏:iLoveIC】
最新20篇 开设专栏