1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : SPF Version 1.00 */
6 /* Fichier : spf.yac */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Gilles Augustins */
13 /****************************************************************************/
18 #include "spf_actions.h"
19 #include "spf_annot.h"
22 static double spfgetval(char *txt, int line, char *err, int capa);
24 /*****************************************************************************
26 *****************************************************************************/
28 /*****************************************************************************
29 * function declarations *
30 *****************************************************************************/
34 static char *circuitname;
56 %token _LEFTPAR _ENDOFSPICELINE
59 %token <text> _QSTRING
70 %token <text> _DIVIDER
71 %token <text> _DELIMITER
78 /* native SPICE statements */
82 %token <text> _RESISTANCE
83 %token <text> _CAPACITANCE
84 %token <text> _SUBCKTCALL
93 %type <text> instpinname
94 %type <text> subnodename
99 %type <ch_l> extnodes_list
104 dspf_file : spf_version header_elements body end { } ;
106 .endofspiceline. : _ENDOFSPICELINE
109 header_elements : design_name header_elements
110 | date vendor header_elements
111 | program_name header_elements
112 | program_version header_elements
113 | hierarchy_divider header_elements
114 | name_delimiter header_elements
115 | busbit header_elements
119 spf_version : _DSPF _TEXT .endofspiceline.
120 | error _ENDOFSPICELINE
123 design_name : _DESIGN qstring .endofspiceline.
125 circuitname=spf_deqstring($2);
127 | error _ENDOFSPICELINE
130 date : _DATE qstring .endofspiceline.
131 | error _ENDOFSPICELINE
134 vendor : _VENDOR qstring .endofspiceline.
135 | error _ENDOFSPICELINE
138 program_name : _PROGRAM qstring .endofspiceline.
139 | error _ENDOFSPICELINE
142 program_version : _VERSION qstring .endofspiceline.
143 | error _ENDOFSPICELINE
146 hierarchy_divider : _DIVIDER .endofspiceline.
150 if (s!=NULL) while (*s==' ' || *s=='\t') s++;
153 avt_errmsg(SPF_ERRMSG, "005", AVT_WARNING, spf_Line-1);
159 | error _ENDOFSPICELINE
162 name_delimiter : _DELIMITER .endofspiceline.
166 if (s!=NULL) while (*s==' ' || *s=='\t') s++;
169 avt_errmsg(SPF_ERRMSG, "006", AVT_WARNING, spf_Line-1);
170 spf_setDelimiter(':');
173 spf_setDelimiter(*s);
175 | error _ENDOFSPICELINE
178 busbit : _BUSBIT .endofspiceline.
180 char temp[1024], temp1[1024];
181 sscanf($1,"%s%s", temp, temp1);
182 if (strlen(temp1)==2)
183 spf_setBUSDelimiters(temp1[0], temp1[1]);
185 if ((strlen(temp1)==4) && (temp1[0] == '"') && (temp1[3] == '"'))
186 spf_setBUSDelimiters(temp1[1], temp1[2]);
188 avt_errmsg(SPF_ERRMSG, "007", AVT_WARNING, spf_Line-1);
190 | error _ENDOFSPICELINE
193 qstring : empty { strcpy($$, "") ; }
194 | _QSTRING { strcpy($$ ,$1) ; }
195 | _TEXT { strcpy($$ ,$1) ; } ;
200 char *name = circuitname;
203 avt_errmsg(SPF_ERRMSG, "008", AVT_WARNING);
206 if (spf_Lofig!=NULL) fprintf(stdout, "LOADING FILE %s.%s\n", name, IN_PARASITICS);
207 if (spf_Lofig==NULL || strcmp(name, spf_Lofig->NAME))
209 if ((spf_Lofig = getloadedlofig(name))==NULL)
211 avt_errmsg(SPF_ERRMSG, "009", AVT_WARNING, name);
215 spf_prepare_lofig(spf_Lofig);
220 subCircuit : subckt_def gnet_def_list net_block_list inst_block_list end_subckt
224 | _END .endofspiceline.
227 subckt_def : _SUBCKT _TEXT extnodes_list .endofspiceline.
229 char *name = namealloc($2);
231 if (spf_Lofig!=NULL) fprintf(stdout, "LOADING FILE %s.%s\n", name, IN_PARASITICS);
232 if (spf_Lofig==NULL || strcmp(name, spf_Lofig->NAME))
234 if ((spf_Lofig = getloadedlofig(name))==NULL)
236 avt_errmsg(SPF_ERRMSG, "009", AVT_WARNING, name);
240 spf_prepare_lofig(spf_Lofig);
242 printf("Circuit : %s\n",$2) ;
245 | error _ENDOFSPICELINE
248 extnodes_list : empty { $$ = NULL ; }
249 | extnodes_list nodename
251 /*$$ = addchain($1, $2)*/
254 gnet_def_list : empty
255 | gnet_def_list gnet_def
258 gnet_def : _GROUND_NET nodename .endofspiceline.
260 spf_SetGroundSignal($2);
262 | error _ENDOFSPICELINE
265 net_block_list : empty
266 | net_block_list net_block
269 net_block : net_def node_def_list res_capa_def_list
272 node_def_list : empty
273 | node_def_list node_def
276 res_capa_def_list : empty
277 | res_capa_def_list capacitor_def
278 | res_capa_def_list resistor_def
281 inst_block_list : empty
282 | inst_block_list inst_block
285 inst_block : _SUBCKTCALL extnodes_list .endofspiceline. /* native SPICE */
289 end_subckt : _ENDS chipname .endofspiceline.
291 spf_ResetLocalHTable();
293 | _ENDS .endofspiceline.
295 spf_ResetLocalHTable();
299 net_def : _NET nodename netcap .endofspiceline.
303 | error _ENDOFSPICELINE
311 pin_def : _PIN pin_element .endofspiceline.
312 | error _ENDOFSPICELINE
315 pin_element : _LEFTPAR pinname pintype pincap coord_list _RIGHTPAR
317 spf_AddConnector($2);
325 instpin_def : _INST instpin_element .endofspiceline.
326 | error _ENDOFSPICELINE
329 instpin_element : _LEFTPAR instpinname instname pinname pintype pincap coord_list _RIGHTPAR
331 spf_AddInstanceConnector($2,$3,$4);
335 subnode_def : _SUB subnode_element .endofspiceline.
339 subnode_element : _LEFTPAR subnodename coord_list _RIGHTPAR
345 capacitor_def : _CAPACITANCE nodename nodename cvalue .endofspiceline.
347 spf_AddCapacitance($2,$3,$4);
349 | error _ENDOFSPICELINE
352 resistor_def : _RESISTANCE nodename nodename rvalue .endofspiceline.
354 spf_AddResistor($2,$3,$4);
356 | error _ENDOFSPICELINE
359 netcap : cvalue { $$ = $1 ; } ;
363 if ($1[1]!='\0' || strchr("IiOoSsBbJjXx", $1[0])==NULL)
364 avt_errmsg(SPF_ERRMSG, "001", AVT_WARNING, $1, spf_Line);
368 pincap : cvalue { $$ = $1 ; }
369 | cvalue _LEFTPAR rcpair_list _RIGHTPAR
371 $$ = $1 ; /* Elmore ? */
379 rcpair : rvalue cvalue
382 coord : xcoord ycoord
393 $$=spfgetval($1, spf_Line, "010", 1)*1e12;
399 $$=spfgetval($1, spf_Line, "011", 0);
409 chipname : _TEXT { strcpy($$, $1) ; }
412 pinname : _TEXT { strcpy($$, $1) ; }
415 instname : _TEXT { strcpy($$, $1) ; }
418 instpinname : _TEXT { strcpy($$, $1) ; }
421 subnodename : _TEXT { strcpy($$, $1) ; }
428 extern char *spftext;
433 if (*tok=='\n') tok="<CR>";
434 avt_errmsg(SPF_ERRMSG, "002", AVT_WARNING, spf_Line, tok);
438 static double spfgetval(char *txt, int line, char *err, int capa)
443 dval=strtod(txt, &endptr);
446 if ((l=strlen(endptr))==1 || (capa && l==2 && tolower(endptr[1])=='f'))
448 switch(tolower(endptr[0]))
450 case 'f': factor = spf_femto(); break;
451 case 'p': factor = spf_pico(); break;
452 case 'n': factor = spf_nano(); break;
453 case 'u': factor = spf_micro(); break;
454 case 'm': factor = spf_milli(); break;
455 case 'k': factor = spf_kilo(); break;
457 avt_errmsg(SPF_ERRMSG, err, AVT_WARNING, txt, line);
463 avt_errmsg(SPF_ERRMSG, err, AVT_WARNING, txt, line);