1 /********************
2     This file is part of the software library CADLIB written by Conrad Ziesler
3     Copyright 2003, Conrad Ziesler, all rights reserved.
4 
5 *************************
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 
20 ******************/
21 /* netlist_dev.h, definitions for a netlist of circuital devices
22    Conrad Ziesler
23 */
24 #ifndef __NETLIST_DEV_H__
25 #define __NETLIST_DEV_H__
26 #ifndef __NETLIST_H__
27 #include "netlist.h"
28 #endif
29 
30 #define DEVNODE_HEAD 0
31 #define DEVNODE_TAIL 1
32 
33 #define DEVFET_S 0
34 #define DEVFET_D 1
35 #define DEVFET_G 2
36 #define DEVFET_B 3
37 #define DEVFET_w 0
38 #define DEVFET_l 1
39 #define DEVFET_as 2
40 #define DEVFET_ad 3
41 #define DEVFET_ps 4
42 #define DEVFET_pd 5
43 #define DEVFET_V  6
44 
45 #define DEV2TERM_P 1
46 #define DEV2TERM_N 0
47 
48 #define DEVCAP_c 0
49 #define DEVCAP_V 1
50 
51 #define DEVRES_r 0
52 #define DEVRES_V 1
53 
54 /* #define DEVT_NODE   0   defined in netlist.h */
55 #define DEVT_FET    1
56 #define DEVT_CAP    2
57 #define DEVT_RES    3
58 #define DEVT_IND    4
59 #define DEVT_DIODE  5
60 #define DEVT_VSRC   6
61 #define DEVT_ISRC   7
62 #define DEVT_BJT    8
63 #define DEVT_MAX    9
64 /*                   0  1  2  3  4  5  6  7  8  */
65 #define DEVT_TERMS { 2, 4, 2, 2, 2, 2, 2, 2, 4 }
66 #define DEVT_SYMS  { "NODE", "FET", "CAP", "RES", "IND", "DIODE", "VSRC", "ISRC", "BJT" }
67 #define DEVT_VALS  { 0, DEVFET_V, DEVCAP_V, DEVRES_V, 0 , 0, 0, 0 , 0 }
68 #define DEVT_OTHERS { 0, sizeof(unsigned), 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0 }
69 
70 
71 #define DEVP_NODE(nl,t)  list_data(&((nl)->e[DEVT_NODE].l),(t).devi)
72 #define DEVP_NODEt(nl,t) ((devnode_t *)DEVP_NODE((nl),(t)))
73 
74 #define DEVP_FET(nl,t)  list_data(&((nl)->e[DEVT_FET].l),(t).devi)
75 #define DEVP_FETt(nl,t) ((devfet_t *)DEVP_NODE((nl),(t)))
76 
77 #define DEVP_CAP(nl,t)  list_data(&((nl)->e[DEVT_CAP].l),(t).devi)
78 #define DEVP_CAPt(nl,t) ((devcap_t *)DEVP_NODE((nl),(t)))
79 
80 #define DEVGEN_V 8
81 
82 typedef struct devgen_st
83 {
84   dev_input_t parent;
85   termptr_t n[TERMPTR_MAX_TERMI];
86   eqn_t v[DEVGEN_V];
87 }devgen_t;
88 
89 #define DEVFET_nmos 1
90 #define DEVFET_pmos 2
91 
92 typedef struct devfet_st
93 {
94   dev_input_t parent;
95   termptr_t n[4];
96   eqn_t v[DEVFET_V];
97   unsigned type; /* n/p */
98 }devfet_t;
99 
100 
101 typedef struct devcap_st
102 {
103   dev_input_t parent;
104   termptr_t n[2];
105   eqn_t v[1];
106 }devcap_t;
107 
108 
109 typedef struct devres_st
110 {
111   dev_input_t parent;
112   termptr_t n[2];
113   eqn_t v[1];
114 }devres_t;
115 
116 
117 typedef struct devind_st
118 {
119   dev_input_t parent;
120   termptr_t n[2];
121   eqn_t v[1];
122 }devind_t;
123 
124 
125 typedef struct devvsrc_st
126 {
127   dev_input_t parent;
128   termptr_t n[2];
129   eqn_t v[1];
130 }devvsrc_t;
131 
132 
133 typedef struct devisrc_st
134 {
135   dev_input_t parent;
136   termptr_t n[2];
137   eqn_t v[1];
138 }devisrc_t;
139 
140 
141 typedef struct devdiode_st
142 {
143   dev_input_t parent;
144   termptr_t n[2];
145   eqn_t v[4];
146 }devdiode_t;
147 
148 
149 typedef struct devbjt_st
150 {
151   dev_input_t parent;
152   termptr_t n[4];
153   eqn_t v[4];
154 }devbjt_t;
155 
156 typedef struct dev2term_st
157 {
158   dev_input_t parent;
159   termptr_t n[2];
160   eqn_t v[1];
161 }dev2term_t;
162 
163 typedef struct dev4term_st
164 {
165   dev_input_t parent;
166   termptr_t n[4];
167   eqn_t v[1];
168 }dev4term_t;
169 
170 typedef union devall_un
171 {
172   void *p;
173   devgen_t *genp;
174   devnode_t *nodep;
175   devfet_t *fetp;
176   devcap_t *capp;
177   devind_t *indp;
178   devbjt_t *bjtp;
179   devvsrc_t *vsrcp;
180   devisrc_t *isrcp;
181 }devall_p;
182 
183 
184 #define NETLIST_DEFSIZES \
185   {  \
186      sizeof(devnode_t) , sizeof(devfet_t),  sizeof(devcap_t), sizeof(devres_t),  \
187      sizeof(devind_t),  sizeof(devdiode_t), sizeof(devvsrc_t),    \
188      sizeof(devisrc_t) , sizeof(devbjt_t)   \
189   }
190 
191 
192 
193 
194 netlist_t *netlist_copyish(netlist_t *in, int size, int sizes[]);
195 void netlist_o_spice(void *of_fp, netlist_t *nl, int n_start);
196 netlist_t *netlist_devnew_inplace(netlist_input_t ni, int extrasize, int extrasizes[DEVT_MAX]);
197 netlist_t *netlist_devnew(netlist_input_t ni);
198 /********* netlist_funcs.c *********/
199 netlistfunc_t * netlist_devfet_funcs(netlist_t *nl, netlistfunc_t *fp);
200 
201 #endif
202 
203