[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