Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / tas / mcc / mcc_mod.l
1 /******************************************************************************/
2 /* */
3 /* Chaine de CAO & VLSI AVERTEC */
4 /* */
5 /* Fichier : mcc_mod.l */
6 /* */
7 /* */
8 /* (c) copyright 2001 AVERTEC */
9 /* Tous droits reserves */
10 /* */
11 /* Auteur(s) : Marc KUOCH */
12 /*----------------------------------------------------------------------------*/
13 /* */
14 /* */
15 /*----------------------------------------------------------------------------*/
16
17 %{
18 #include "mcc_mod.tab.h"
19 #include MCC_H
20 #include "mcc_mod_util.h"
21 #define YY_NO_UNPUT
22 #define ECHO /*fprintf(stderr,"\ntoken %s\n",yytext)*/
23
24 int MCC_LINE;
25
26 char *mcc_libenv,*mcc_str,*mcc_strp,*mcc_buf ;
27
28 typedef struct mcc_context {
29 struct mcc_context *next ;
30 YY_BUFFER_STATE buffer ;
31 int line ;
32 char *libtype ;
33 char *filename ;
34 char *curlibtype ;
35 FILE *file ;
36 } mcc_contextlist ;
37
38 mcc_contextlist *MCCCONTEXT = NULL ;
39 extern char *LIBTYPE ;
40 extern char *CURLIBTYPE ;
41 extern char *FILENAME ;
42 extern int popcontext() ;
43 extern int mcc_moderror() ;
44 %}
45
46 num [0-9]
47 wsp [ \t\r]
48 number [+-]?(("."{num}+)|({num}+("."{num}*)?))([e|E][+|-]?{num}+)?
49 string [a-zA-Z&_!?%][^ \"=:\r\t\n()]*
50 function [a-zA-Z_0-9]*\([^\n]*\)
51 alpha [a-zA-Z]
52 ident {alpha}{string}
53 symb_mod [mM][oO][dD][eE][lL]
54 symb_par [pP][aA][rR][aA][mM]
55 symb_lib [lL][iI][bB]
56 symb_include [iI][nN][cC][lL][uU][dD][eE]
57 symb_endl [eE][nN][dD][lL]
58 symb_prot [pP][rR][oO][tT]
59 symb_unprot [uU][nN][pP][rR][oO][tT]
60 symb_option [oO][pP][tT][iI][oO][nN][sS]?
61 symb_subckt [sS][uU][bB][cC][kK][tT]
62 symb_ends [eE][nN][dD][sS]
63 nmos [nN][mM][oO][sS]
64 pmos [pP][mM][oO][sS]
65 value [vV][aA][lL][uU][eE]
66
67 giga [gG]
68 kilo [kK]
69 mili [mM]
70 micro [uU]
71 nano [nN]
72 pico [pP]
73 femto [fF]
74
75 %x EQU UNIT ENV ENV2
76
77 %%
78 {wsp}* {ECHO ;}
79 \n {ECHO ; MCC_LINE++ ;}
80 ^{wsp}*[*#].*$ {ECHO ; /* comment */ ;}
81 [!].*$ {ECHO ; /* comment */ ;}
82 ^{wsp}*\+ {ECHO ;}
83 ^{wsp}*\.{symb_lib} {ECHO ; return T_LIB ;}
84 ^{wsp}*\.{symb_endl} {ECHO ; return T_ENDL ;}
85 ^{wsp}*\.{symb_subckt} {ECHO ; return T_SUBCKT ;}
86 ^{wsp}*\.{symb_ends} {ECHO ; return T_ENDS ;}
87 ^{wsp}*\.{symb_par} {ECHO ; return T_VAR ;}
88 {symb_par}{wsp}*[:] {ECHO ; return T_VARD ;}
89 ^{wsp}*\.{symb_mod} {ECHO ; return T_MODEL ;}
90 ^{wsp}*\.{symb_include} {ECHO ; return T_INCLUDE ;}
91 ^{wsp}*\.{symb_prot} {ECHO ; ;}
92 ^{wsp}*\.{symb_unprot} {ECHO ; ;}
93 ^{wsp}*\.{symb_option}.* {ECHO ; ;}
94 ^{wsp}*[dD]{num}*{string}* {ECHO ; return T_DIODE ;}
95 ^{wsp}*[qQ]{num}*{string}* {ECHO ; return T_ELEMENT ;}
96 ^{wsp}*[Js]{num}*{string}* {ECHO ; return T_ELEMENT ;}
97 ^{wsp}*[Mm]{num}*{string}* {ECHO ; mcc_modlval.text = mbkstrdup(mcc_modtext) ; return T_TRANSISTOR ;}
98 ^{wsp}*[rR]{num}*{string}* {ECHO ; return T_RESISTOR ;}
99 ^{wsp}*[cC]{num}*{string}* {ECHO ; return T_CAPACITOR ;}
100 ^{wsp}*[xX]{num}*{string}* {ECHO ; mcc_modlval.text = mbkstrdup(mcc_modtext) ; return T_INSTANCE ;}
101 ^{wsp}*[lL]{num}*{string}* {ECHO ; return T_ELEMENT ;}
102 ^{wsp}*[kK]{num}*{string}* {ECHO ; return T_ELEMENT ;}
103 ^{wsp}*[Tt]{num}*{string}* {ECHO ; return T_ELEMENT ;}
104 ^{wsp}*[vV]{num}*{string}* {ECHO ; return T_ELEMENT ;}
105 ^{wsp}*[iI]{num}*{string}* {ECHO ; return T_ELEMENT ;}
106 ^{wsp}*[gG]{num}*{string}* {ECHO ; return T_ELEMENT ;}
107 ^{wsp}*[eE]{num}*{string}* {ECHO ; return T_ELEMENT ;}
108 ^{wsp}*[fF]{num}*{string}* {ECHO ; return T_ELEMENT ;}
109 ^{wsp}*[hH]{num}*{string}* {ECHO ; return T_ELEMENT ;}
110 "=" {ECHO ; return '=' ;}
111 {nmos} {ECHO ; return T_NMOS ;}
112 {pmos} {ECHO ; return T_PMOS ;}
113 {value} {ECHO ; return T_VALUE ;}
114 \$ {ECHO ; BEGIN ENV ;}
115
116 <UNIT>{giga} {ECHO ; BEGIN INITIAL ; return T_GIGA ;}
117 <UNIT>{kilo} {ECHO ; BEGIN INITIAL ; return T_KILO ;}
118 <UNIT>{mili} {ECHO ; BEGIN INITIAL ; return T_MILI ;}
119 <UNIT>{micro} {ECHO ; BEGIN INITIAL ; return T_MICRO ;}
120 <UNIT>{nano} {ECHO ; BEGIN INITIAL ; return T_NANO ;}
121 <UNIT>{pico} {ECHO ; BEGIN INITIAL ; return T_PICO ;}
122 <UNIT>{femto} {ECHO ; BEGIN INITIAL ; return T_FEMTO ;}
123 <UNIT>{wsp}* {ECHO ; BEGIN INITIAL ;}
124 <UNIT>^{wsp}*\+ {ECHO ; BEGIN INITIAL ;}
125 <UNIT>\n {ECHO ; MCC_LINE++ ;BEGIN INITIAL ;}
126
127 <ENV>{string} {char *env;
128 ECHO ; BEGIN INITIAL ;
129 if ((env = avt_gethashvar(mcc_modtext)) != NULL) {
130 mcc_modlval.text = mbkstrdup(env) ;
131 return (T_STRING) ;
132 }
133 else {
134 fprintf(stderr,"\nMCC ERROR : env %s is not set !!!\n",mcc_modtext);
135 mcc_moderror();
136 }
137 }
138 [{'`] {ECHO ; mcc_str = NULL ; BEGIN EQU ;}
139 <EQU>[^}'`\$\n]* {ECHO ;
140 if (!mcc_str) {
141 mcc_str = mbkstrdup (mcc_modtext) ;
142 }
143 else {
144 char * pt ;
145 mcc_buf = (char*)mbkalloc (1024 * sizeof (char)) ;
146 mcc_strp = mbkstrdup (mcc_modtext) ;
147 pt = strchr(mcc_strp,'+') ;
148 *pt = ' ' ;
149 sprintf (mcc_buf, "%s%s", mcc_str, mcc_strp) ;
150 mbkfree (mcc_strp) ;
151 mbkfree (mcc_str) ;
152 mcc_str = mcc_buf ;
153 }
154 }
155 <EQU>\n {ECHO ; MCC_LINE++ ; }
156 <EQU>[}'`] {ECHO ;
157 BEGIN INITIAL ;
158 mcc_modlval.text = mcc_str ;
159 return T_EQUATION ;
160 }
161 <EQU>\$ {ECHO ; BEGIN ENV2;}
162 <ENV2>[^'`\n]* {char *env;
163 ECHO ;
164 if ((env = avt_gethashvar(mcc_modtext)) != NULL ) {
165 mcc_libenv = mbkstrdup(env) ;
166 }
167 else {
168 fprintf(stderr,"\nMCC ERROR : env %s is not set !!!\n",mcc_modtext);
169 mcc_moderror();
170 }
171 }
172 <ENV2>['`] {ECHO ;
173 BEGIN INITIAL ;
174 mcc_modlval.text = mcc_libenv;
175 return T_STRING; }
176
177
178 <<EOF>> {ECHO ; if(popcontext() == 1) yyterminate() ;}
179 {number} {ECHO ; mcc_modlval.real = strtod (mcc_modtext, (char**)NULL) ; BEGIN UNIT ; return (T_NUMBER) ; }
180 {string} {ECHO ; mcc_modlval.text = mbkstrdup(mcc_modtext) ; return (T_STRING) ; }
181 {function} {ECHO ; mcc_modlval.text = mbkstrdup(mcc_modtext) ; return (T_STRING) ; }
182
183
184 %%
185
186 int mcc_modwrap () { return 1 ; }
187
188 int popcontext()
189 {
190 mcc_contextlist *pt ;
191
192 if(MCCCONTEXT == NULL)
193 return 1 ;
194
195 pt = MCCCONTEXT ;
196 MCCCONTEXT = MCCCONTEXT->next ;
197 MCC_LINE = pt->line ;
198 FILENAME = pt->filename ;
199 LIBTYPE = pt->libtype ;
200 CURLIBTYPE = pt->curlibtype ;
201 mcc_modin = pt->file ;
202 mcc_mod_delete_buffer(YY_CURRENT_BUFFER) ;
203 mcc_mod_switch_to_buffer(pt->buffer) ;
204 mbkfree(pt) ;
205
206 return 0 ;
207 }
208
209 void pushcontext(filename)
210 char *filename ;
211 {
212 mcc_contextlist *pt ;
213 pt = (mcc_contextlist *)mbkalloc(sizeof(mcc_contextlist)) ;
214 pt->next = MCCCONTEXT ;
215 MCCCONTEXT = pt ;
216 pt->line = MCC_LINE ;
217 pt->filename = FILENAME ;
218 pt->libtype = LIBTYPE ;
219 pt->curlibtype = CURLIBTYPE ;
220 pt->buffer = YY_CURRENT_BUFFER ;
221 pt->file = mcc_modin ;
222 MCC_LINE = 1 ;
223 CURLIBTYPE = NULL ;
224 FILENAME = namealloc(filename) ;
225
226 mcc_modin = mbkfopen (filename, NULL,READ_TEXT) ;
227 if (!mcc_modin) {
228 fprintf(stderr, "\nMCC ERROR: can't open file %s to parse!!!\n", filename) ;
229 EXIT(1) ;
230 }
231 mcc_mod_switch_to_buffer(mcc_mod_create_buffer(mcc_modin, YY_BUF_SIZE)) ;
232
233 }
234
235 extern int mcc_moddebug ;
236
237 void yyinit (filename)
238 char *filename ;
239 {
240 /*mcc_moddebug = 1 ;*/
241 MCCCONTEXT = NULL ;
242 LIBTYPE = NULL ;
243 CURLIBTYPE = NULL ;
244 MCC_LINE = 1 ;
245 FILENAME = namealloc(filename) ;
246 }