1 /******************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Fichier : mcc_mod.l */
8 /* (c) copyright 2001 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Marc KUOCH */
12 /*----------------------------------------------------------------------------*/
15 /*----------------------------------------------------------------------------*/
18 #include "mcc_mod.tab.h"
20 #include "mcc_mod_util.h"
22 #define ECHO /*fprintf(stderr,"\ntoken %s\n",yytext)*/
26 char *mcc_libenv,*mcc_str,*mcc_strp,*mcc_buf ;
28 typedef struct mcc_context {
29 struct mcc_context *next ;
30 YY_BUFFER_STATE buffer ;
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() ;
48 number [+-]?(("."{num}+)|({num}+("."{num}*)?))([e|E][+|-]?{num}+)?
49 string [a-zA-Z&_!?%][^ \"=:\r\t\n()]*
50 function [a-zA-Z_0-9]*\([^\n]*\)
53 symb_mod [mM][oO][dD][eE][lL]
54 symb_par [pP][aA][rR][aA][mM]
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]
65 value [vV][aA][lL][uU][eE]
79 \n {ECHO ; MCC_LINE++ ;}
80 ^{wsp}*[*#].*$ {ECHO ; /* comment */ ;}
81 [!].*$ {ECHO ; /* comment */ ;}
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 ;}
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 ;}
127 <ENV>{string} {char *env;
128 ECHO ; BEGIN INITIAL ;
129 if ((env = avt_gethashvar(mcc_modtext)) != NULL) {
130 mcc_modlval.text = mbkstrdup(env) ;
134 fprintf(stderr,"\nMCC ERROR : env %s is not set !!!\n",mcc_modtext);
138 [{'`] {ECHO ; mcc_str = NULL ; BEGIN EQU ;}
139 <EQU>[^}'`\$\n]* {ECHO ;
141 mcc_str = mbkstrdup (mcc_modtext) ;
145 mcc_buf = (char*)mbkalloc (1024 * sizeof (char)) ;
146 mcc_strp = mbkstrdup (mcc_modtext) ;
147 pt = strchr(mcc_strp,'+') ;
149 sprintf (mcc_buf, "%s%s", mcc_str, mcc_strp) ;
155 <EQU>\n {ECHO ; MCC_LINE++ ; }
158 mcc_modlval.text = mcc_str ;
161 <EQU>\$ {ECHO ; BEGIN ENV2;}
162 <ENV2>[^'`\n]* {char *env;
164 if ((env = avt_gethashvar(mcc_modtext)) != NULL ) {
165 mcc_libenv = mbkstrdup(env) ;
168 fprintf(stderr,"\nMCC ERROR : env %s is not set !!!\n",mcc_modtext);
174 mcc_modlval.text = mcc_libenv;
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) ; }
186 int mcc_modwrap () { return 1 ; }
190 mcc_contextlist *pt ;
192 if(MCCCONTEXT == NULL)
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) ;
209 void pushcontext(filename)
212 mcc_contextlist *pt ;
213 pt = (mcc_contextlist *)mbkalloc(sizeof(mcc_contextlist)) ;
214 pt->next = MCCCONTEXT ;
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 ;
224 FILENAME = namealloc(filename) ;
226 mcc_modin = mbkfopen (filename, NULL,READ_TEXT) ;
228 fprintf(stderr, "\nMCC ERROR: can't open file %s to parse!!!\n", filename) ;
231 mcc_mod_switch_to_buffer(mcc_mod_create_buffer(mcc_modin, YY_BUF_SIZE)) ;
235 extern int mcc_moddebug ;
237 void yyinit (filename)
240 /*mcc_moddebug = 1 ;*/
245 FILENAME = namealloc(filename) ;