[WIP] Fixing issues with binned spice files
Signed-off-by: Grzegorz Latosinski <glatosinski@antmicro.com>
diff --git a/convert_pm3_to_csv.py b/convert_pm3_to_csv.py
index e152c94..85fc690 100644
--- a/convert_pm3_to_csv.py
+++ b/convert_pm3_to_csv.py
@@ -26,6 +26,23 @@
import json
import clean_spice_files
+copyright = [
+ '* Copyright 2020 The Skywater PDK Authors',
+ '*',
+ '* Licensed under the Apache License, Version 2.0 (the "License");',
+ '* you may not use this file except in compliance with the License.',
+ '* You may obtain a copy of the License at',
+ '*',
+ '* https://www.apache.org/licenses/LICENSE-2.0',
+ '*',
+ '* Unless required by applicable law or agreed to in writing, software',
+ '* distributed under the License is distributed on an "AS IS" BASIS,',
+ '* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.',
+ '* See the License for the specific language governing permissions and',
+ '* limitations under the License.',
+ ''
+]
+
sourcetodests = defaultdict(list)
RE_SUBCKT = re.compile(r'\.subckt\s+(?P<subcktname>[^ ]+)\s?(?P<nodenames>.*)')
@@ -35,28 +52,37 @@
# RE_SUBCKT_END = re.compile(r'^.ends')
RE_GROUP = re.compile(r'[*\s]*?(?P<group>[^*\n]+?)[*\s]*(\n|$)')
RE_MODE_LINE = re.compile(r'(?P<modeid>\d+)\s*:\s*type=\s*(?P<modetype>.*)(\n|$)')
-RE_INLINE_SUBCKT_MODEL = re.compile(r'^(?P<subcktname>[^ ]+)\s*\((?P<nodenames>.*)\)\s*(?P<modelname>[^ ]+)\s*(?P<parameters>.*)($|\n)')
+RE_INLINE_SUBCKT_MODEL = re.compile(r'^(?P<modelname>[^ ]+)\s*\((?P<nodenames>.*)\)\s*(?P<subcktname>[^ ]+)\s*(?P<parameters>.*)($|\n)')
RE_MODEL = re.compile(r'[\.]?model')
def order_parameters(paramname):
priority = {
- 'subckt': 0,
- 'inlinesubckt': 1,
- 'nodes': 2,
- 'model': 3,
- 'type': 4,
- 'mode': 5,
- 'modetype': 6,
- 'lmin': 7,
- 'lmax': 8,
- 'wmin': 9,
- 'wmax': 10,
- 'level': 11,
- 'tnom': 12,
- 'version': 13,
- 'tox': 14,
- 'toxm': 15,
+ 'subckt$subckt': 0,
+ 'subckt$inlinesubckt': 1,
+ 'subckt$nodes': 2,
+ 'model$model': 3,
+ 'model$type': 4,
+ 'mode$mode': 5,
+ 'mode$modetype': 6,
+ 'model$lmin': 7,
+ 'model$lmax': 8,
+ 'model$wmin': 9,
+ 'model$wmax': 10,
+ 'model$level': 11,
+ 'model$tnom': 12,
+ 'model$version': 13,
+ 'model$tox': 14,
+ 'model$toxm': 15,
+ 'mode$lmin': 7,
+ 'mode$lmax': 8,
+ 'mode$wmin': 9,
+ 'mode$wmax': 10,
+ 'mode$level': 11,
+ 'mode$tnom': 12,
+ 'mode$version': 13,
+ 'mode$tox': 14,
+ 'mode$toxm': 15,
}
if paramname in priority:
return (priority[paramname], paramname)
@@ -71,48 +97,34 @@
# subckt nodes
# subckt nodes model type
result = []
- if parameters[0] == 'model':
+ if parameters[0] == 'model$model':
+ assert all(['model$' in parameter for parameter in parameters]), parameters
for entry in csventry:
assert 'N/A' not in entry[:2], entry
result.append(f'.model {entry[0]} {entry[1]}')
for parameter, value in zip(parameters[2:], entry[2:]):
if value != 'N/A':
- result.append(f'+{parameter}= {value}')
- elif parameters[0] == 'subckt':
- lastsubckt = None
- firstsubckt = True
- for entry in csventry:
- assert 'N/A' not in entry[:2], entry
- if lastsubckt != entry[0]:
- if not firstsubckt:
- result.append('.ends')
- firstsubckt = False
- result.append(f'.subckt {entry[0]} {" ".join(entry[1].split(","))}')
- lastsubckt = entry[0]
- startpoint = 2
- if entry[2] == 'model':
- assert 'N/A' not in entry[2:4], entry
- result.append(f'.model {entry[2]} {entry[3]}')
- startpoint = 4
- for parameter, value in zip(parameters[startpoint:], entry[startpoint:]):
- if value != 'N/A':
- result.append(f'+{parameter}= {value}')
- if not firstsubckt:
- result.append('.ends')
- elif parameters[0] == 'inlinesubckt':
+ result.append(f'+{parameter.split("$")[1]}= {value}')
+ elif 'mode$mode' in parameters:
lastsubcktdef = None
lastmodel = None
firstsubcktdef = True
firstmodel = True
for entry in csventry:
assert 'N/A' not in entry[:4], entry
- if not entry[0].endswith('_dummy') and entry[0] != lastsubcktdef:
+ if entry[0] != lastsubcktdef:
if not firstsubcktdef:
result.append(f'ends {lastsubcktdef}')
lastsubcktdef = entry[0]
firstsubcktdef = False
- result.append(f'inline subckt {entry[0]} ({" ".join(entry[1].split(","))})')
- if 'mode' in set(parameters):
+ if 'subckt$inlinesubckt' in parameters:
+ result.append(f'inline subckt {entry[0]} ({" ".join(entry[1].split(","))})')
+ else:
+ result.append(f'.subckt {entry[0]} {" ".join(entry[1].split(","))}')
+ for parameter, value in zip(parameters[2:], entry[2:]):
+ if value != 'N/A' and parameter.split("$")[0] == 'subckt':
+ result.append(f'+{parameter.split("$")[1]}= {value}')
+ if 'mode$mode' in set(parameters):
if entry[2] != lastmodel:
if not firstmodel:
result.append('}')
@@ -121,16 +133,44 @@
lastmodel = entry[2]
result.append(f'{entry[4]}: type={entry[5]}')
for parameter, value in zip(parameters[6:], entry[6:]):
- result.append(f'+{parameter}= {value}')
- else:
- result.append(f'{entry[0]} ({" ".join(entry[1].split(","))}) {entry[2]}')
- for parameter, value in zip(parameters[3:], entry[3:]):
- if value != 'N/A':
- result.append(f'+{parameter}= {value}')
+ if value != 'N/A' and parameter.split("$")[0] == 'mode':
+ result.append(f'+{parameter.split("$")[1]}= {value}')
if not firstmodel:
result.append('}')
if not firstsubcktdef:
result.append(f'ends {lastsubcktdef}')
+ elif parameters[0] in ['subckt$subckt', 'subckt$inlinesubckt']:
+ lastsubckt = None
+ firstsubckt = True
+ assert not any(['mode$' in parameter for parameter in parameters]), entry
+ for entry in csventry:
+ assert 'N/A' not in entry[:2], entry
+ if lastsubckt != entry[0]:
+ if not firstsubckt:
+ result.append('.ends')
+ firstsubckt = False
+ if parameters[0] == 'subckt$subckt':
+ result.append(f'.subckt {entry[0]} {" ".join(entry[1].split(","))}')
+ else:
+ result.append(f'inline subckt {entry[0]} ({" ".join(entry[1].split(","))})')
+ lastsubckt = entry[0]
+ startpoint = 2
+ for parameter, value in zip(parameters[startpoint:], entry[startpoint:]):
+ if value != 'N/A' and parameter.split('$')[0] == 'subckt':
+ result.append(f'+{parameter.split("$")[1]}= {value}')
+ if parameters[2] == 'model$model' and 'N/A' not in entry[2:4]:
+ assert 'N/A' not in entry[2:4], (parameters, entry)
+ if parameters[0] == 'subckt$subckt':
+ result.append(f'.model {entry[2]} {entry[3]}')
+ else:
+ result.append(f'{entry[2]} ({" ".join(entry[1].split(","))})')
+ startpoint = 4
+ for parameter, value in zip(parameters[startpoint:], entry[startpoint:]):
+ if value != 'N/A' and parameter.split('$')[0] == 'model':
+ result.append(f'+{parameter.split("$")[1]}= {value}')
+ if not firstsubckt:
+ result.append('.ends')
+ # elif parameters[0] == 'subckt$inlinesubckt':
result = clean_spice_files.basic_cleaning(result)
result = clean_spice_files.makefixedwidthcolumn(result)
return result
@@ -143,6 +183,7 @@
params['mode'] = {}
scopetype = None
leftovers = []
+ parameterbag = {}
def produce_line():
finparams = {}
finparams.update(params['subckt'])
@@ -155,21 +196,31 @@
try:
if not line.strip():
continue
+ if line.strip().startswith('*'):
+ continue
+ line = re.sub(r'\$.*$', '', line)
origline = line
line = line.strip()
elements = shlex.split(line, posix=False)
- if line.startswith('*'):
- continue
m = RE_MODE_LINE.match(line)
if m:
if scopetype == 'mode':
produce_line()
params['mode'] = {}
- params['mode']['mode'] = m.group('modeid')
- params['mode']['modetype'] = m.group('modetype')
+ params['mode']['mode$mode'] = m.group('modeid')
+ params['mode']['mode$modetype'] = m.group('modetype')
scopetype = 'mode'
continue
ind = 0
+ if line.startswith('parameters'):
+ l = re.sub('\s+', ' ', line)
+ prs = l.split(' ')[1:]
+ assert len(prs) % 2 == 0
+ ind = 0
+ while ind < len(prs):
+ parameterbag[prs[ind].split('=')[0]] = prs[ind+1]
+ ind += 2
+ continue
def parse_parameters():
if scopetype is None:
return
@@ -183,16 +234,32 @@
print(colored(line, 'magenta'), file=sys.stderr)
ind += 2
continue
- params[scopetype][elements[ind][:-1]] = elements[ind+1]
- prevkey = elements[ind][:-1]
+ key = elements[ind][:-1]
+ val = elements[ind+1]
+ for paramnam, paramval in parameterbag.items():
+ val = val.replace(paramnam, paramval)
+ params[scopetype][f'{scopetype}${key}'] = val
+ prevkey = key
ind += 2
+ if ind + 1 < len(elements) and 'dev/gauss' in elements[ind]:
+ val = elements[ind+1]
+ for paramnam, paramval in parameterbag.items():
+ val = val.replace(paramnam, paramval)
+ params[scopetype][f'{scopetype}${key}'] = ' '.join([params[scopetype][f'{scopetype}${key}'], elements[ind], val])
+ ind += 2
elif '=' in elements[ind]:
res = elements[ind].split('=')
- params[scopetype][res[0]] = res[1]
+ val = res[1]
+ for paramnam, paramval in parameterbag.items():
+ val = val.replace(paramnam, paramval)
+ params[scopetype][f'{scopetype}${res[0]}'] = val
prevkey = res[0]
ind += 1
elif prevkey is not None:
- params[scopetype][prevkey] += elements[ind]
+ val = elements[ind]
+ for paramnam, paramval in parameterbag.items():
+ val = val.replace(paramnam, paramval)
+ params[scopetype][f'{scopetype}${prevkey}'] += elements[ind]
ind += 1
else:
print(colored(line, 'cyan'), file=sys.stderr)
@@ -202,7 +269,7 @@
params['subckt'] = {}
params['model'] = {}
params['mode'] = {}
- params['subckt']['subckt'] = elements[1]
+ params['subckt']['subckt$subckt'] = elements[1]
nodelist = []
ind = 2
for element in elements[2:]:
@@ -212,7 +279,7 @@
element = element.replace(')', '')
nodelist.append(element)
ind += 1
- params['subckt']['nodes'] = ','.join(nodelist)
+ params['subckt']['subckt$nodes'] = ','.join(nodelist)
scopetype = 'subckt'
elements = elements[ind:]
parse_parameters()
@@ -221,8 +288,8 @@
produce_line()
params['model'] = {}
params['mode'] = {}
- params['model']['model'] = elements[1]
- params['model']['type'] = elements[2]
+ params['model']['model$model'] = elements[1]
+ params['model']['model$type'] = elements[2]
scopetype = 'model'
if len(elements) >=4 and elements[3] == '{':
continue
@@ -242,15 +309,35 @@
params['subckt'] = {}
params['model'] = {}
params['mode'] = {}
- scopetype = 'subckt'
- params['subckt']['inlinesubckt'] = m.group('subcktname')
- params['subckt']['nodes'] = ','.join(m.group('nodenames').split(' '))
- params['model']['model'] = m.group('modelname')
- params['model']['type'] = params['subckt']['inlinesubckt']
+ scopetype = 'model'
+ params['subckt']['subckt$inlinesubckt'] = m.group('subcktname')
+ params['subckt']['subckt$nodes'] = ','.join(m.group('nodenames').split(' '))
+ params['model']['model$model'] = m.group('modelname')
+ params['model']['model$type'] = params['subckt']['subckt$inlinesubckt']
elements = m.group('parameters').split()
parse_parameters()
+ elif ('subckt$subckt' in params['subckt'] and params['subckt']['subckt$subckt'] in elements) or ('model$model' in params['model'] and params['model']['model$model'].split('.')[0] in elements):
+ typend = params['subckt']['subckt$subckt'] if params['subckt']['subckt$subckt'] in elements else params['model']['model$model'].split('.')[0]
+ typ = params['subckt']['subckt$subckt'] if params['subckt']['subckt$subckt'] in elements else params['model']['model$type']
+ if scopetype != 'subckt':
+ produce_line()
+ params['model'] = {}
+ params['mode'] = {}
+ params['model']['model$model'] = elements[0]
+ scopetype = 'model'
+ ind = 1
+ nodes = []
+ for el in elements[1:]:
+ if el == typend:
+ break
+ nodes.append(el)
+ ind += 1
+ params['subckt']['subckt$nodes'] = ','.join(nodes)
+ params['model']['model$type'] = elements[ind]
+ elements = elements[ind+1:]
+ parse_parameters()
else:
- if not line.strip().startswith('ends') and not line.strip().startswith('inline subckt'):
+ if 'ends' not in line.strip() and not line.strip().startswith('inline subckt'):
if scopetype is None or not line.strip() in ['{', '}']:
leftovers.append(origline.rstrip())
print(colored(line, 'yellow'), file=sys.stderr)
@@ -330,9 +417,9 @@
binnedspice = csv_to_pm3(result[0], result[1:])
csv2bsimname = filename.with_suffix(f'.csv2bsim{filename.suffix}')
with open(csv2bsimname, 'w') as csv2bsimfile:
- csv2bsimfile.write('\n'.join(binnedspice))
+ csv2bsimfile.write('\n'.join(copyright + binnedspice))
with open(filename.with_suffix(f'.csvwrap{filename.suffix}'), 'w') as csvwrapfile:
leftovers.append(f'.include "{Path(csv2bsimname).name}"')
- csvwrapfile.write('\n'.join(leftovers))
+ csvwrapfile.write('\n'.join(copyright + leftovers))
with open(args.sourcetodests, 'w') as srctodst:
json.dump(sourcetodests, srctodst, indent=2)
diff --git a/test-pm3-to-csv/test1.csv b/test-pm3-to-csv/test1.csv
deleted file mode 100644
index b33a3a9..0000000
--- a/test-pm3-to-csv/test1.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-model;type;lmin;lmax;wmin;wmax;level;tnom;dev/gauss;toxe
-name;nmos;1.5;1.0e-04;'a + b';100.56;100.0;15.0;'1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))';1.16e-08
diff --git a/test-pm3-to-csv/test1.table b/test-pm3-to-csv/test1.table
deleted file mode 100644
index 81922ac..0000000
--- a/test-pm3-to-csv/test1.table
+++ /dev/null
@@ -1,2 +0,0 @@
- model type lmin lmax wmin wmax level tnom dev/gauss toxe
- name nmos 1.5 1.0e-04 'a + b' 100.56 100.0 15.0 '1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))' 1.16e-08
\ No newline at end of file
diff --git a/test-pm3-to-csv/test2.csv b/test-pm3-to-csv/test2.csv
deleted file mode 100644
index 756512f..0000000
--- a/test-pm3-to-csv/test2.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-model;type;lmin;lmax;wmin;wmax;level;tnom;dev/gauss;toxe
-name1;nmos;1.5;1.0e-04;'a + b';100.56;100.0;15.0;'1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))';1.16e-08
-name2;pmos;N/A;N/A;N/A;N/A;N/A;N/A;N/A;N/A
diff --git a/test-pm3-to-csv/test2.pm3 b/test-pm3-to-csv/test2.pm3
index 1555e7c..f1990b5 100644
--- a/test-pm3-to-csv/test2.pm3
+++ b/test-pm3-to-csv/test2.pm3
@@ -2,7 +2,7 @@
+lmin= 1.5 lmax= 1.0e-04 wmin= 'a + b' wmax= 100.56
-+level= 100.0
++level= 100.0 $ this is level testing= 15
+tnom= 15.0
+toxe= 1.16e-08 dev/gauss= '1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))'
diff --git a/test-pm3-to-csv/test2.table b/test-pm3-to-csv/test2.table
deleted file mode 100644
index 4941cd9..0000000
--- a/test-pm3-to-csv/test2.table
+++ /dev/null
@@ -1,3 +0,0 @@
- model type lmin lmax wmin wmax level tnom dev/gauss toxe
- name1 nmos 1.5 1.0e-04 'a + b' 100.56 100.0 15.0 '1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))' 1.16e-08
- name2 pmos N/A N/A N/A N/A N/A N/A N/A N/A
\ No newline at end of file
diff --git a/test-pm3-to-csv/test3.csv b/test-pm3-to-csv/test3.csv
deleted file mode 100644
index b9601a2..0000000
--- a/test-pm3-to-csv/test3.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-model;type;lmin;lmax;wmin;wmax;level;tnom;dev/gauss;toxe
-name;nmos;1.5;1.0e-04;'a + b';100.56;100.0;15.0;'1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))';1.16e-08
-name;pmos;N/A;N/A;N/A;N/A;50.0;N/A;N/A;N/A
diff --git a/test-pm3-to-csv/test3.table b/test-pm3-to-csv/test3.table
deleted file mode 100644
index f6a0d03..0000000
--- a/test-pm3-to-csv/test3.table
+++ /dev/null
@@ -1,3 +0,0 @@
- model type lmin lmax wmin wmax level tnom dev/gauss toxe
- name nmos 1.5 1.0e-04 'a + b' 100.56 100.0 15.0 '1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))' 1.16e-08
- name pmos N/A N/A N/A N/A 50.0 N/A N/A N/A
\ No newline at end of file
diff --git a/test-pm3-to-csv/test4.csv b/test-pm3-to-csv/test4.csv
deleted file mode 100644
index 1b5a72d..0000000
--- a/test-pm3-to-csv/test4.csv
+++ /dev/null
@@ -1,6 +0,0 @@
-subckt;nodes;model;type;mode;modetype;lmin;lmax;wmin;wmax;level;tnom;version;dev/gauss;global1;global2;global3;lln;toxe
-nhv;a b c d efgh;name1;bsim4;0;p;1.5;1.0e-04;'a + b';100.56;100.0;15.0;4.5;'1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))';5;7;8;1.0;1.16e-08
-nhv;a b c d efgh;name1;bsim4;1;n;2.5;3.0e-07;1;100.56;10.0;5.0;1.5;N/A;5;7;8;6.0;N/A
-nhv;a b c d efgh;name2;bsim3;0;p;1.5;1.0e-04;'a + b';100.56;100.0;15.0;4.5;N/A;5;7;8;1.0;1.16e-08
-nhv;a b c d efgh;name2;bsim3;1;n;2.5;3.0e-07;1;100.56;10.0;5.0;1.5;N/A;5;7;8;6.0;N/A
-nhv;a b c d efgh;name2;bsim3;5;n;2.5;3.0e-07;1;100.56;N/A;5.0;1.5;N/A;5;7;8;6.0;N/A
diff --git a/test-pm3-to-csv/test4.table b/test-pm3-to-csv/test4.table
deleted file mode 100644
index cb2cf29..0000000
--- a/test-pm3-to-csv/test4.table
+++ /dev/null
@@ -1,6 +0,0 @@
- subckt nodes model type mode modetype lmin lmax wmin wmax level tnom version dev/gauss global1 global2 global3 lln toxe
- nhv a b c d efgh name1 bsim4 0 p 1.5 1.0e-04 'a + b' 100.56 100.0 15.0 4.5 '1.16e-08*(nhv_toxe_slope/sqrt(E(*,1)*E(*,w)*E(*,m)))' 5 7 8 1.0 1.16e-08
- nhv a b c d efgh name1 bsim4 1 n 2.5 3.0e-07 1 100.56 10.0 5.0 1.5 N/A 5 7 8 6.0 N/A
- nhv a b c d efgh name2 bsim3 0 p 1.5 1.0e-04 'a + b' 100.56 100.0 15.0 4.5 N/A 5 7 8 1.0 1.16e-08
- nhv a b c d efgh name2 bsim3 1 n 2.5 3.0e-07 1 100.56 10.0 5.0 1.5 N/A 5 7 8 6.0 N/A
- nhv a b c d efgh name2 bsim3 5 n 2.5 3.0e-07 1 100.56 N/A 5.0 1.5 N/A 5 7 8 6.0 N/A
\ No newline at end of file
diff --git a/test-pm3-to-csv/test5.pm3 b/test-pm3-to-csv/test5.pm3
new file mode 100644
index 0000000..a71c3e0
--- /dev/null
+++ b/test-pm3-to-csv/test5.pm3
@@ -0,0 +1,87 @@
+* Copyright 2020 The Skywater PDK Authors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* https://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+
+simulator lang=spectre
+
+inline subckt nhvrf_3p50m10_b (d g s b)
+
+parameters mult= 1
+
+nhvrf_3p50m10_b (d g s b) nhv_rf_base_m10_b w= 3.01 l= 0.50 m= 10 ad= 0.421 pd= 3.29 as= 0.51 ps= 3.948 nrd= 40.44 nrs= 33.70 mult= 10 * mult
+nhvrf_3p50m10_b_dummy (b b s b) nhv_rf_base_m10_b w= 3.01 l= 0.50 m= 2 ad= 0.903 pd= 6.62 as= 0.0 ps= 0.0 nrd= 20.22 nrs= 0.0 mult= 2 * mult
+
+ends nhvrf_3p50m10_b
+
+inline subckt nhvrf_3p50m4_b (d g s b)
+
+parameters mult= 1
+
+nhvrf_3p50m4_b (d g s b) nhv_rf_base_m4_b w= 3.01 l= 0.50 m= 4 ad= 0.421 pd= 3.29 as= 0.63 ps= 4.935 nrd= 40.44 nrs= 26.96 mult= 4 * mult
+nhvrf_3p50m4_b_dummy (b b s b) nhv_rf_base_m4_b w= 3.01 l= 0.50 m= 2 ad= 0.903 pd= 6.62 as= 0.0 ps= 0.0 nrd= 20.22 nrs= 0.0 mult= 2 * mult
+
+ends nhvrf_3p50m4_b
+
+inline subckt nhvrf_5p50m10_b (d g s b)
+
+parameters mult= 1
+
+nhvrf_5p50m10_b (d g s b) nhv_rf_base_m10_b_w5 w= 5.05 l= 0.50 m= 10 ad= 0.707 pd= 5.33 as= 0.85 ps= 6.396 nrd= 24.27 nrs= 20.22 mult= 10 * mult
+nhvrf_5p50m10_b_dummy (b b s b) nhv_rf_base_m10_b_w5 w= 5.05 l= 0.50 m= 2 ad= 1.515 pd= 10.7 as= 0.0 ps= 0.0 nrd= 12.13 nrs= 0.0 mult= 2 * mult
+
+ends nhvrf_5p50m10_b
+
+inline subckt nhvrf_5p50m4_b (d g s b)
+
+parameters mult= 1
+
+nhvrf_5p50m4_b (d g s b) nhv_rf_base_m4_b_w5 w= 5.05 l= 0.50 m= 4 ad= 0.707 pd= 5.33 as= 1.06 ps= 7.995 nrd= 24.267 nrs= 16.178 mult= 4 * mult
+nhvrf_5p50m4_b_dummy (b b s b) nhv_rf_base_m4_b_w5 w= 5.05 l= 0.50 m= 2 ad= 1.515 pd= 10.7 as= 0.0 ps= 0.0 nrd= 12.13 nrs= 0.0 mult= 2 * mult
+
+ends nhvrf_5p50m4_b
+
+inline subckt nhvrf_7p50m10_b (d g s b)
+
+parameters mult= 1
+
+nhvrf_7p50m10_b (d g s b) nhv_rf_base_m10_b_w7 w= 7.09 l= 0.50 m= 10 ad= 0.993 pd= 7.37 as= 1.19 ps= 8.844 nrd= 17.33 nrs= 14.44 mult= 10 * mult
+nhvrf_7p50m10_b_dummy (b b s b) nhv_rf_base_m10_b_w7 w= 7.09 l= 0.50 m= 2 ad= 2.127 pd= 14.78 as= 0.0 ps= 0.0 nrd= 8.67 nrs= 0.0 mult= 2 * mult
+
+ends nhvrf_7p50m10_b
+
+inline subckt nhvrf_7p50m4_b (d g s b)
+
+parameters mult= 1
+
+nhvrf_7p50m4_b (d g s b) nhv_rf_base_m4_b_w7 w= 7.09 l= 0.50 m= 4 ad= 0.993 pd= 7.37 as= 1.49 ps= 11.055 nrd= 17.33 nrs= 11.56 mult= 4 * mult
+nhvrf_7p50m4_b_dummy (b b s b) nhv_rf_base_m4_b_w7 w= 7.09 l= 0.50 m= 2 ad= 2.127 pd= 14.78 as= 0.0 ps= 0.0 nrd= 8.67 nrs= 0.0 mult= 2 * mult
+
+ends nhvrf_7p50m4_b
+
+inline subckt nhvrf_5p50m2_b (d g s b)
+
+parameters mult= 1
+
+nhvrf_5p50m2_b (d g s b) nhv_rf_base_m2_b_w5 w= 5.05 l= 0.50 m= 2 ad= 0.707 pd= 5.33 as= 1.414 ps= 10.66 nrd= 24.267 nrs= 12.133 mult= 2 * mult
+nhvrf_5p50m2_b_dummy (b b s b) nhv_rf_base_m2_b_w5 w= 5.05 l= 0.50 m= 2 ad= 1.515 pd= 10.7 as= 0.0 ps= 0.0 nrd= 12.13 nrs= 0.0 mult= 2 * mult
+
+ends nhvrf_5p50m2_b
+
+inline subckt nhvrf_3p50m2_b (d g s b)
+
+parameters mult= 1
+
+nhvrf_3p50m2_b (d g s b) nhv_rf_base_m2_b w= 3.01 l= 0.50 m= 2 ad= 0.42 pd= 3.29 as= 0.84 ps= 6.58 nrd= 40.44 nrs= 20.22 mult= 2 * mult
+nhvrf_3p50m2_b_dummy (b b s b) nhv_rf_base_m2_b w= 3.01 l= 0.50 m= 2 ad= 0.903 pd= 6.62 as= 0.0 ps= 0.0 nrd= 20.22 nrs= 0.0 mult= 2 * mult
+
+ends nhvrf_3p50m2_b