LCOV - code coverage report
Current view: top level - src - parse_netlist.y (source / functions) Hit Total Coverage
Test: qucs-core-0.0.19 Code Coverage Lines: 130 269 48.3 %
Date: 2015-01-05 16:01:02 Functions: 0 1 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 43 278 15.5 %

           Branch data     Line data    Source code
       1                 :            : /* -*-c++-*- */
       2                 :            : 
       3                 :            : %{
       4                 :            : /*
       5                 :            :  * parse_netlist.y - parser for the Qucs netlist
       6                 :            :  *
       7                 :            :  * Copyright (C) 2003, 2004, 2005, 2006, 2007 Stefan Jahn <stefan@lkcc.org>
       8                 :            :  *
       9                 :            :  * This is free software; you can redistribute it and/or modify
      10                 :            :  * it under the terms of the GNU General Public License as published by
      11                 :            :  * the Free Software Foundation; either version 2, or (at your option)
      12                 :            :  * any later version.
      13                 :            :  *
      14                 :            :  * This software is distributed in the hope that it will be useful,
      15                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      16                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17                 :            :  * GNU General Public License for more details.
      18                 :            :  *
      19                 :            :  * You should have received a copy of the GNU General Public License
      20                 :            :  * along with this package; see the file COPYING.  If not, write to
      21                 :            :  * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
      22                 :            :  * Boston, MA 02110-1301, USA.
      23                 :            :  *
      24                 :            :  * $Id$
      25                 :            :  *
      26                 :            :  */
      27                 :            : 
      28                 :            : #if HAVE_CONFIG_H
      29                 :            : # include <config.h>
      30                 :            : #endif
      31                 :            : 
      32                 :            : #include <stdio.h>
      33                 :            : #include <stdlib.h>
      34                 :            : #include <string.h>
      35                 :            : 
      36                 :            : #define YYERROR_VERBOSE 42
      37                 :            : #define YYDEBUG 1
      38                 :            : #define YYMAXDEPTH 1000000
      39                 :            : 
      40                 :            : #include "check_netlist.h"
      41                 :            : #include "logging.h"
      42                 :            : #include "equation.h"
      43                 :            : #include "range.h"
      44                 :            : 
      45                 :            : using namespace qucs;
      46                 :            : 
      47                 :            : %}
      48                 :            : 
      49                 :            : %name-prefix="netlist_"
      50                 :            : 
      51                 :            : %token InvalidCharacter
      52                 :            : %token Identifier
      53                 :            : %token Assign
      54                 :            : %token ScaleOrUnit
      55                 :            : %token Eol
      56                 :            : %token Eqn
      57                 :            : %token DefSub
      58                 :            : %token EndSub
      59                 :            : %token REAL
      60                 :            : %token IMAG
      61                 :            : %token COMPLEX
      62                 :            : %token Character
      63                 :            : %token STRING
      64                 :            : 
      65                 :            : %right '='
      66                 :            : %right '?' ':'
      67                 :            : %left  Or
      68                 :            : %left  And
      69                 :            : %left  NotEqual Equal
      70                 :            : %left  Less Greater LessOrEqual GreaterOrEqual
      71                 :            : %left  '-' '+'
      72                 :            : %left  '*' '/' '%'
      73                 :            : %right Not
      74                 :            : %left  NEG     /* unary negation */
      75                 :            : %left  POS     /* unary non-negation */
      76                 :            : %right '^'
      77                 :            : 
      78                 :            : %union {
      79                 :            :   char * ident;
      80                 :            :   char * str;
      81                 :            :   double d;
      82                 :            :   char chr;
      83                 :            :   struct definition_t * definition;
      84                 :            :   struct definition_t * subcircuit;
      85                 :            :   struct node_t * node;
      86                 :            :   struct pair_t * pair;
      87                 :            :   struct value_t * value;
      88                 :            :   struct {
      89                 :            :     double r;
      90                 :            :     double i;
      91                 :            :   } c;
      92                 :            :   qucs::eqn::node * eqn;
      93                 :            :   qucs::eqn::constant * con;
      94                 :            :   qucs::eqn::reference * ref;
      95                 :            :   qucs::eqn::application * app;
      96                 :            :   qucs::eqn::assignment * assign;
      97                 :            : }
      98                 :            : 
      99                 :            : %type <ident> Identifier Assign NodeIdentifier InstanceIdentifier
     100                 :            : %type <str> ScaleOrUnit
     101                 :            : %type <d> REAL IMAG
     102                 :            : %type <c> COMPLEX
     103                 :            : %type <chr> Character
     104                 :            : %type <str> STRING
     105                 :            : %type <definition> DefinitionLine ActionLine DefBody DefBodyLine EquationLine
     106                 :            : %type <definition> InputList InputLine
     107                 :            : %type <subcircuit> DefBegin SubcircuitBody
     108                 :            : %type <node> NodeList
     109                 :            : %type <pair> PairList
     110                 :            : %type <value> PropertyValue ValueList Value PropertyReal
     111                 :            : %type <eqn> EquationList Expression ExpressionList
     112                 :            : %type <assign> Equation
     113                 :            : %type <con> Constant
     114                 :            : %type <ref> Reference
     115                 :            : %type <app> Application Range Matrix Vector
     116                 :            : %type <eqn> ExpressionMatrix ExpressionVector
     117                 :            : %type <eqn> ExpressionRowList ExpressionCol ExpressionColList
     118                 :            : 
     119                 :            : %%
     120                 :            : 
     121                 :            : Input:
     122                 :            :   InputList {
     123                 :        103 :     definition_root = $1;
     124                 :            :   }
     125                 :            : ;
     126                 :            : 
     127                 :        103 : InputList: /* nothing */ { $$ = NULL; }
     128                 :            :   | InputLine InputList {
     129         [ +  + ]:       1201 :     if ($1) {
     130                 :       1080 :       $1->next = $2;
     131                 :       1080 :       $$ = $1;
     132                 :            :     } else {
     133                 :        121 :       $$ = $2;
     134                 :            :     }
     135                 :            :   }
     136                 :            : ;
     137                 :            : 
     138                 :            : InputLine:
     139                 :            :   SubcircuitBody {
     140                 :         13 :     $$ = $1;
     141                 :            :   }
     142                 :            :   | EquationLine
     143                 :            :   | ActionLine
     144                 :            :   | DefinitionLine
     145                 :            :   | Eol {
     146                 :        121 :     $$ = NULL;
     147                 :            :   }
     148                 :            : ;
     149                 :            : 
     150                 :            : /* An action line in the netlist, i.e. the specification of the type
     151                 :            :    of simulation to be performed  */
     152                 :            : ActionLine:
     153                 :            :   '.' Identifier ':' InstanceIdentifier PairList Eol {
     154                 :        181 :     $$ = (struct definition_t *) calloc (sizeof (struct definition_t), 1);
     155                 :        181 :     $$->action = PROP_ACTION;
     156                 :        181 :     $$->type = $2;
     157                 :        181 :     $$->instance = $4;
     158                 :        181 :     $$->pairs = $5;
     159                 :        181 :     $$->line = netlist_lineno;
     160                 :            :   }
     161                 :            : ;
     162                 :            : 
     163                 :            : /* A definition line in the netlist, i.e. a component specification
     164                 :            :    such as R:R1 _net0 gnd R="50 Ohm" Temp="26.85" Tc1="0.0" Tc2="0.0" Tnom="26.85"
     165                 :            :  */
     166                 :            : DefinitionLine:
     167                 :            :   Identifier ':' InstanceIdentifier NodeList PairList Eol {
     168                 :        904 :     $$ = (struct definition_t *) calloc (sizeof (struct definition_t), 1);
     169                 :        904 :     $$->action = PROP_COMPONENT;
     170                 :        904 :     $$->type = $1;
     171                 :        904 :     $$->instance = $3;
     172                 :        904 :     $$->nodes = $4;
     173                 :        904 :     $$->pairs = $5;
     174                 :        904 :     $$->line = netlist_lineno;
     175                 :            :   }
     176                 :            : ;
     177                 :            : 
     178                 :            : InstanceIdentifier:
     179                 :       2103 :     Identifier  { $$ = $1; }
     180                 :          3 :   | ScaleOrUnit { $$ = $1; }
     181                 :            : ;
     182                 :            : 
     183                 :            : NodeIdentifier:
     184                 :       2099 :     Identifier  { $$ = $1; }
     185                 :         16 :   | ScaleOrUnit { $$ = $1; }
     186                 :            : ;
     187                 :            : 
     188                 :            : /* List of nodes for a component */
     189                 :        917 : NodeList: /* nothing */ { $$ = NULL; }
     190                 :            :   | NodeIdentifier NodeList {
     191                 :       2115 :     $$ = (struct node_t *) calloc (sizeof (struct node_t), 1);
     192                 :       2115 :     $$->node = $1;
     193                 :       2115 :     $$->next = $2;
     194                 :            :   }
     195                 :            : ;
     196                 :            : 
     197                 :            : /* Assigns the list of key-value pairs x="y" */
     198                 :       1098 : PairList: /* nothing */ { $$ = NULL; }
     199                 :            :   | Assign Value PairList {
     200                 :      10160 :     $$ = (struct pair_t *) calloc (sizeof (struct pair_t), 1);
     201                 :      10160 :     $$->key = $1;
     202                 :      10160 :     $$->value = $2;
     203                 :      10160 :     $$->next = $3;
     204                 :            :   }
     205                 :            :   | Assign NoneValue PairList {
     206                 :            :     if (0) {
     207                 :            :       $$ = (struct pair_t *) calloc (sizeof (struct pair_t), 1);
     208                 :            :       $$->key = $1;
     209                 :            :       $$->value = NULL;
     210                 :            :       $$->next = $3;
     211                 :            :     } else {
     212                 :        139 :       free ($1);
     213                 :        139 :       $$ = $3;
     214                 :            :     }
     215                 :            :   }
     216                 :            : ;
     217                 :            : 
     218                 :            : /* A empty value in a pair list */
     219                 :            : NoneValue:  { /* nothing */ }
     220                 :            :   | '"' '"' { /* also nothing */ }
     221                 :            : ;
     222                 :            : 
     223                 :            : /* A property value, can either be on its own or enclosed in quotes */
     224                 :            : Value:
     225                 :            :   PropertyValue {
     226                 :          0 :     $$ = $1;
     227                 :            :   }
     228                 :            :   | '"' PropertyValue '"' {
     229                 :      10160 :     $$ = $2;
     230                 :            :   }
     231                 :            : ;
     232                 :            : 
     233                 :            : PropertyReal:
     234                 :            :   REAL {
     235                 :       7572 :     $$ = create_value ();
     236                 :       7572 :     $$->value = $1;
     237                 :            :   }
     238                 :            :   | REAL ScaleOrUnit {
     239                 :       1660 :     $$ = create_value ();
     240                 :       1660 :     $$->value = $1;
     241                 :       1660 :     $$->scale = $2;
     242                 :            :   }
     243                 :            :   | REAL ScaleOrUnit ScaleOrUnit {
     244                 :          0 :     $$ = create_value ();
     245                 :          0 :     $$->value = $1;
     246                 :          0 :     $$->scale = $2;
     247                 :          0 :     $$->unit = $3;
     248                 :            :   }
     249                 :            : ;
     250                 :            : 
     251                 :            : PropertyValue:
     252                 :            :   PropertyReal {
     253                 :       9214 :     $$ = $1;
     254                 :            :   }
     255                 :            :   | InstanceIdentifier {
     256                 :        940 :     $$ = create_value ();
     257                 :        940 :     $$->ident = $1;
     258                 :            :   }
     259                 :            :   | '[' InstanceIdentifier ']' {
     260                 :          0 :     $$ = create_value ();
     261                 :          0 :     $$->ident = $2;
     262                 :            :   }
     263                 :            :   | '[' ValueList ']' {
     264                 :          6 :     $$ = $2;
     265                 :            :   }
     266                 :            : ;
     267                 :            : 
     268                 :          0 : ValueList: /* nothing */ { $$ = NULL; }
     269                 :            :   | PropertyReal {
     270                 :          6 :     $1->next = NULL;
     271                 :          6 :     $$ = $1;
     272                 :            :   }
     273                 :            :   | PropertyReal ';' ValueList {
     274                 :         12 :     $1->next = $3;
     275                 :         12 :     $$ = $1;
     276                 :            :   }
     277                 :            : ;
     278                 :            : 
     279                 :            : EquationLine:
     280                 :            :   Eqn ':' InstanceIdentifier Equation EquationList Eol {
     281                 :            :     /* create equation definition */
     282                 :         68 :     $$ = (struct definition_t *) calloc (sizeof (struct definition_t), 1);
     283         [ +  - ]:         68 :     $$->type = strdup ("Eqn");
     284                 :         68 :     $$->instance = $3;
     285                 :         68 :     $$->action = PROP_ACTION;
     286                 :         68 :     $$->line = netlist_lineno;
     287         [ +  - ]:         68 :     $4->setInstance ($3);
     288                 :         68 :     $4->setNext ($5);
     289         [ +  - ]:         68 :     $4->applyInstance ();
     290                 :         68 :     $$->eqns = $4;
     291                 :            :   }
     292                 :            : ;
     293                 :            : 
     294                 :         68 : EquationList: /* nothing */ { $$ = NULL; }
     295                 :            :   | Equation EquationList {
     296                 :        139 :     $1->setNext ($2);
     297                 :        139 :     $$ = $1;
     298                 :            :   }
     299                 :            : ;
     300                 :            : 
     301                 :            : Equation:
     302                 :            :   Assign '"' Expression '"' {
     303 [ +  - ][ +  - ]:        207 :     $$ = new eqn::assignment ();
     304                 :        207 :     $$->result = $1;
     305                 :        207 :     $$->body = $3;
     306                 :            :   }
     307                 :            : ;
     308                 :            : 
     309                 :            : Expression:
     310                 :            :     Constant {
     311                 :        141 :     $$ = $1;
     312                 :            :   }
     313                 :            :   | Reference {
     314                 :        233 :     $$ = $1;
     315                 :            :   }
     316                 :            :   | Application {
     317                 :        285 :     $$ = $1;
     318                 :            :   }
     319                 :            :   | '(' Expression ')' {
     320                 :         15 :     $$ = $2;
     321                 :            :   }
     322                 :            :   | '[' Vector ']' {
     323                 :          0 :     $$ = $2;
     324                 :            :   }
     325                 :            :   | '[' Matrix ']' {
     326                 :          0 :     $$ = $2;
     327                 :            :   }
     328                 :            : ;
     329                 :            : 
     330                 :            : ExpressionCol:
     331                 :            :   Expression ExpressionColList {
     332         [ #  # ]:          0 :     $1->appendNodes ($2);
     333                 :          0 :     $$ = $1;
     334                 :            :   }
     335                 :            : ;
     336                 :            : 
     337                 :          0 : ExpressionColList:  /* nothing */ { $$ = NULL; }
     338                 :            :   | ',' Expression ExpressionColList {
     339         [ #  # ]:          0 :     $2->appendNodes ($3);
     340                 :          0 :     $$ = $2;
     341                 :            :   }
     342                 :            : ;
     343                 :            : 
     344                 :            : ExpressionVector:
     345                 :            :   ExpressionCol
     346                 :            : ;
     347                 :            : 
     348                 :            : Vector:
     349                 :            :   ExpressionVector {
     350 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     351         [ #  # ]:          0 :     $$->n = strdup ("vector");
     352         [ #  # ]:          0 :     $$->nargs = $1->count ();
     353                 :          0 :     $$->args = $1;
     354                 :            :   }
     355                 :            : ;
     356                 :            : 
     357                 :          0 : ExpressionRowList:  /* nothing */ { $$ = NULL; }
     358                 :            :   | ';' ExpressionCol ExpressionRowList {
     359 [ #  # ][ #  # ]:          0 :     eqn::constant * c = new eqn::constant (eqn::TAG_CHAR);
     360                 :          0 :     c->chr = ';';
     361         [ #  # ]:          0 :     c->appendNodes ($2);
     362         [ #  # ]:          0 :     $2->appendNodes ($3);
     363                 :          0 :     $$ = c;
     364                 :            :   }
     365                 :            : ;
     366                 :            : 
     367                 :            : ExpressionMatrix:
     368                 :            :   ExpressionCol ';' ExpressionCol ExpressionRowList {
     369 [ #  # ][ #  # ]:          0 :     eqn::constant * c = new eqn::constant (eqn::TAG_CHAR);
     370                 :          0 :     c->chr = ';';
     371         [ #  # ]:          0 :     c->appendNodes ($3);
     372         [ #  # ]:          0 :     $3->appendNodes ($4);
     373         [ #  # ]:          0 :     $1->appendNodes (c);
     374                 :          0 :     $$ = $1;
     375                 :            :   }
     376                 :            : ;
     377                 :            : 
     378                 :            : Matrix:
     379                 :            :   ExpressionMatrix {
     380 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     381         [ #  # ]:          0 :     $$->n = strdup ("matrix");
     382         [ #  # ]:          0 :     $$->nargs = $1->count ();
     383                 :          0 :     $$->args = $1;
     384                 :            :   }
     385                 :            : ;
     386                 :            : 
     387                 :            : Constant:
     388                 :            :     REAL {
     389 [ +  - ][ +  - ]:        141 :     $$ = new eqn::constant (eqn::TAG_DOUBLE);
     390                 :        141 :     $$->d = $1;
     391                 :            :   }
     392                 :            :   | IMAG {
     393 [ #  # ][ #  # ]:          0 :     $$ = new eqn::constant (eqn::TAG_COMPLEX);
     394         [ #  # ]:          0 :     $$->c = new nr_complex_t (0.0, $1);
     395                 :            :   }
     396                 :            :   | Character {
     397 [ #  # ][ #  # ]:          0 :     $$ = new eqn::constant (eqn::TAG_CHAR);
     398                 :          0 :     $$->chr = $1;
     399                 :            :   }
     400                 :            :   | STRING {
     401 [ #  # ][ #  # ]:          0 :     $$ = new eqn::constant (eqn::TAG_STRING);
     402                 :          0 :     $$->s = $1;
     403                 :            :   }
     404                 :            : ;
     405                 :            : 
     406                 :            : Range:
     407                 :            :   Expression ':' Expression {
     408 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     409         [ #  # ]:          0 :     $$->n = strdup ("range");
     410                 :          0 :     $$->nargs = 2;
     411         [ #  # ]:          0 :     $1->append ($3);
     412                 :          0 :     $$->args = $1;
     413                 :            :   }
     414                 :            :   | ':' Expression {
     415 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     416         [ #  # ]:          0 :     $$->n = strdup ("range");
     417                 :          0 :     $$->nargs = 2;
     418 [ #  # ][ #  # ]:          0 :     eqn::constant * c = new eqn::constant (eqn::TAG_CHAR);
     419                 :          0 :     c->chr = '?';
     420         [ #  # ]:          0 :     c->append ($2);
     421                 :          0 :     $$->args = c;
     422                 :            :   }
     423                 :            :   | Expression ':' {
     424 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     425         [ #  # ]:          0 :     $$->n = strdup ("range");
     426                 :          0 :     $$->nargs = 2;
     427 [ #  # ][ #  # ]:          0 :     eqn::constant * c = new eqn::constant (eqn::TAG_CHAR);
     428                 :          0 :     c->chr = '?';
     429         [ #  # ]:          0 :     $1->append (c);
     430                 :          0 :     $$->args = $1;
     431                 :            :   }
     432                 :            :   | ':' {
     433 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     434         [ #  # ]:          0 :     $$->n = strdup ("range");
     435                 :          0 :     $$->nargs = 2;
     436 [ #  # ][ #  # ]:          0 :     eqn::constant * c1 = new eqn::constant (eqn::TAG_CHAR);
     437 [ #  # ][ #  # ]:          0 :     eqn::constant * c2 = new eqn::constant (eqn::TAG_CHAR);
     438                 :          0 :     c1->chr = '?';
     439                 :          0 :     c2->chr = '?';
     440         [ #  # ]:          0 :     c1->append (c2);
     441                 :          0 :     $$->args = c1;
     442                 :            :   }
     443                 :            : ;
     444                 :            : 
     445                 :            : Reference:
     446                 :            :   Identifier {
     447 [ +  - ][ +  - ]:        259 :     $$ = new eqn::reference ();
     448                 :        259 :     $$->n = $1;
     449                 :            :   }
     450                 :            : ;
     451                 :            : 
     452                 :            : Application:
     453                 :            :     Identifier '(' ExpressionList ')' {
     454 [ +  - ][ +  - ]:        115 :     $$ = new eqn::application ();
     455                 :        115 :     $$->n = $1;
     456         [ +  - ]:        115 :     $$->nargs = $3->count ();
     457                 :        115 :     $$->args = $3;
     458                 :            :   }
     459                 :            :   | Reference '[' ExpressionList ']' {
     460 [ +  - ][ +  - ]:         26 :     $$ = new eqn::application ();
     461         [ +  - ]:         26 :     $$->n = strdup ("array");
     462         [ +  - ]:         26 :     $$->nargs = 1 + $3->count ();
     463                 :         26 :     $1->setNext ($3);
     464                 :         26 :     $$->args = $1;
     465                 :            :   }
     466                 :            :   | Expression '+' Expression {
     467 [ +  - ][ +  - ]:          3 :     $$ = new eqn::application ();
     468         [ +  - ]:          3 :     $$->n = strdup ("+");
     469                 :          3 :     $$->nargs = 2;
     470         [ +  - ]:          3 :     $1->append ($3);
     471                 :          3 :     $$->args = $1;
     472                 :            :   }
     473                 :            :   | Expression '-' Expression {
     474 [ +  - ][ +  - ]:         35 :     $$ = new eqn::application ();
     475         [ +  - ]:         35 :     $$->n = strdup ("-");
     476                 :         35 :     $$->nargs = 2;
     477         [ +  - ]:         35 :     $1->append ($3);
     478                 :         35 :     $$->args = $1;
     479                 :            :   }
     480                 :            :   | Expression '*' Expression {
     481 [ +  - ][ +  - ]:         48 :     $$ = new eqn::application ();
     482         [ +  - ]:         48 :     $$->n = strdup ("*");
     483                 :         48 :     $$->nargs = 2;
     484         [ +  - ]:         48 :     $1->append ($3);
     485                 :         48 :     $$->args = $1;
     486                 :            :   }
     487                 :            :   | Expression '/' Expression {
     488 [ +  - ][ +  - ]:         27 :     $$ = new eqn::application ();
     489         [ +  - ]:         27 :     $$->n = strdup ("/");
     490                 :         27 :     $$->nargs = 2;
     491         [ +  - ]:         27 :     $1->append ($3);
     492                 :         27 :     $$->args = $1;
     493                 :            :   }
     494                 :            :   | Expression '%' Expression {
     495 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     496         [ #  # ]:          0 :     $$->n = strdup ("%");
     497                 :          0 :     $$->nargs = 2;
     498         [ #  # ]:          0 :     $1->append ($3);
     499                 :          0 :     $$->args = $1;
     500                 :            :   }
     501                 :            :   | '+' Expression %prec POS {
     502 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     503         [ #  # ]:          0 :     $$->n = strdup ("+");
     504                 :          0 :     $$->nargs = 1;
     505                 :          0 :     $$->args = $2;
     506                 :            :   }
     507                 :            :   | '-' Expression %prec NEG {
     508 [ +  - ][ +  - ]:         10 :     $$ = new eqn::application ();
     509         [ +  - ]:         10 :     $$->n = strdup ("-");
     510                 :         10 :     $$->nargs = 1;
     511                 :         10 :     $$->args = $2;
     512                 :            :   }
     513                 :            :   | Expression '^' Expression {
     514 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     515         [ #  # ]:          0 :     $$->n = strdup ("^");
     516                 :          0 :     $$->nargs = 2;
     517         [ #  # ]:          0 :     $1->append ($3);
     518                 :          0 :     $$->args = $1;
     519                 :            :   }
     520                 :            :   | Expression '?' Expression ':' Expression {
     521 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     522         [ #  # ]:          0 :     $$->n = strdup ("?:");
     523                 :          0 :     $$->nargs = 3;
     524         [ #  # ]:          0 :     $1->append ($3);
     525         [ #  # ]:          0 :     $1->append ($5);
     526                 :          0 :     $$->args = $1;
     527                 :            :   }
     528                 :            :   | Expression Less Expression {
     529 [ +  - ][ +  - ]:         21 :     $$ = new eqn::application ();
     530         [ +  - ]:         21 :     $$->n = strdup ("<");
     531                 :         21 :     $$->nargs = 2;
     532         [ +  - ]:         21 :     $1->append ($3);
     533                 :         21 :     $$->args = $1;
     534                 :            :   }
     535                 :            :   | Expression Greater Expression {
     536 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     537         [ #  # ]:          0 :     $$->n = strdup (">");
     538                 :          0 :     $$->nargs = 2;
     539         [ #  # ]:          0 :     $1->append ($3);
     540                 :          0 :     $$->args = $1;
     541                 :            :   }
     542                 :            :   | Expression GreaterOrEqual Expression {
     543 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     544         [ #  # ]:          0 :     $$->n = strdup (">=");
     545                 :          0 :     $$->nargs = 2;
     546         [ #  # ]:          0 :     $1->append ($3);
     547                 :          0 :     $$->args = $1;
     548                 :            :   }
     549                 :            :   | Expression LessOrEqual Expression {
     550 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     551         [ #  # ]:          0 :     $$->n = strdup ("<=");
     552                 :          0 :     $$->nargs = 2;
     553         [ #  # ]:          0 :     $1->append ($3);
     554                 :          0 :     $$->args = $1;
     555                 :            :   }
     556                 :            :   | Expression Equal Expression {
     557 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     558         [ #  # ]:          0 :     $$->n = strdup ("==");
     559                 :          0 :     $$->nargs = 2;
     560         [ #  # ]:          0 :     $1->append ($3);
     561                 :          0 :     $$->args = $1;
     562                 :            :   }
     563                 :            :   | Expression NotEqual Expression {
     564 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     565         [ #  # ]:          0 :     $$->n = strdup ("!=");
     566                 :          0 :     $$->nargs = 2;
     567         [ #  # ]:          0 :     $1->append ($3);
     568                 :          0 :     $$->args = $1;
     569                 :            :   }
     570                 :            :   | Not Expression {
     571 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     572         [ #  # ]:          0 :     $$->n = strdup ("!");
     573                 :          0 :     $$->nargs = 1;
     574                 :          0 :     $$->args = $2;
     575                 :            :   }
     576                 :            :   | Expression And Expression {
     577 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     578         [ #  # ]:          0 :     $$->n = strdup ("&&");
     579                 :          0 :     $$->nargs = 2;
     580         [ #  # ]:          0 :     $1->append ($3);
     581                 :          0 :     $$->args = $1;
     582                 :            :   }
     583                 :            :   | Expression Or Expression {
     584 [ #  # ][ #  # ]:          0 :     $$ = new eqn::application ();
     585         [ #  # ]:          0 :     $$->n = strdup ("||");
     586                 :          0 :     $$->nargs = 2;
     587         [ #  # ]:          0 :     $1->append ($3);
     588                 :          0 :     $$->args = $1;
     589                 :            :   }
     590                 :            : ;
     591                 :            : 
     592                 :          0 : ExpressionList: /* nothing */ { $$ = NULL; }
     593                 :            :   | Expression {
     594                 :        141 :     $$ = $1;
     595                 :            :   }
     596                 :            :   | Range {
     597                 :          0 :     $$ = $1;
     598                 :            :   }
     599                 :            :   | Expression ',' ExpressionList {
     600                 :         33 :     $1->setNext ($3);
     601                 :         33 :     $$ = $1;
     602                 :            :   }
     603                 :            :   | Range ',' ExpressionList {
     604                 :          0 :     $1->setNext ($3);
     605                 :          0 :     $$ = $1;
     606                 :            :   }
     607                 :            : ;
     608                 :            : 
     609                 :            : SubcircuitBody:
     610                 :            :   DefBegin DefBody DefEnd { /* a full subcircuit definition found */
     611                 :         13 :     $1->sub = $2;
     612                 :         13 :     $$ = $1;
     613                 :         13 :     $2 = NULL;
     614                 :            :   }
     615                 :            : ;
     616                 :            : 
     617                 :            : DefBegin:
     618                 :            :   DefSub InstanceIdentifier NodeList PairList Eol {
     619                 :            :     /* create subcircuit definition right here */
     620                 :         13 :     $$ = (struct definition_t *) calloc (sizeof (struct definition_t), 1);
     621         [ +  - ]:         13 :     $$->type = strdup ("Def");
     622                 :         13 :     $$->instance = $2;
     623                 :         13 :     $$->nodes = $3;
     624                 :         13 :     $$->pairs = $4;
     625                 :         13 :     $$->action = PROP_ACTION;
     626                 :         13 :     $$->line = netlist_lineno;
     627                 :            :   }
     628                 :            : ;
     629                 :            : 
     630                 :         13 : DefBody: /* nothing */ { $$ = NULL; }
     631                 :            :   | DefBodyLine DefBody { /* chain definitions here */
     632         [ +  - ]:         86 :     if ($1) {
     633                 :         86 :       $1->next = $2;
     634                 :         86 :       $$ = $1;
     635                 :            :     }
     636                 :            :     else {
     637                 :          0 :       $$ = $2;
     638                 :            :     }
     639                 :            :   }
     640                 :            : ;
     641                 :            : 
     642                 :            : DefEnd:
     643                 :            :   EndSub Eol { /* nothing to do */ }
     644                 :            : ;
     645                 :            : 
     646                 :            : DefBodyLine:
     647                 :            :   DefinitionLine { /* chain definitions here */
     648                 :         86 :     $1->next = $$;
     649                 :         86 :     $$ = $1;
     650                 :            :   }
     651                 :            :   | EquationLine { /* chain definitions here */
     652                 :          0 :     $1->next = $$;
     653                 :          0 :     $$ = $1;
     654                 :            :   }
     655                 :            :   | SubcircuitBody { /* do nothing here, see subcircuit rule */ }
     656                 :            :   | Eol {
     657                 :          0 :     $$ = NULL;
     658                 :            :   }
     659                 :            : ;
     660                 :            : 
     661                 :            : 
     662                 :            : %%
     663                 :            : 
     664                 :          0 : int netlist_error (const char * error) {
     665                 :          0 :   logprint (LOG_ERROR, "line %d: %s\n", netlist_lineno, error);
     666                 :          0 :   return 0;
     667                 :            : }

Generated by: LCOV version 1.11