Parse more things.
This commit is contained in:
parent
8e73ff2376
commit
6625ea71c2
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: lexor.lex,v 1.12 1999/05/06 04:09:28 steve Exp $"
|
#ident "$Id: lexor.lex,v 1.13 1999/05/08 20:19:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//# define YYSTYPE lexval
|
//# define YYSTYPE lexval
|
||||||
|
|
@ -125,6 +125,10 @@ static verinum*make_unsized_hex(const char*txt);
|
||||||
yylval.text = new string(yytext);
|
yylval.text = new string(yytext);
|
||||||
return SYSTEM_IDENTIFIER; }
|
return SYSTEM_IDENTIFIER; }
|
||||||
|
|
||||||
|
\.[a-zA-Z_][a-zA-Z0-9$_]* {
|
||||||
|
yylval.text = new string(yytext+1);
|
||||||
|
return PORTNAME; }
|
||||||
|
|
||||||
[0-9][0-9_]*\'d[0-9][0-9_]* { yylval.number = make_sized_dec(yytext);
|
[0-9][0-9_]*\'d[0-9][0-9_]* { yylval.number = make_sized_dec(yytext);
|
||||||
return NUMBER; }
|
return NUMBER; }
|
||||||
[0-9][0-9_]*\'[bB][0-1xz_]+ { yylval.number = make_sized_binary(yytext);
|
[0-9][0-9_]*\'[bB][0-1xz_]+ { yylval.number = make_sized_binary(yytext);
|
||||||
|
|
@ -222,6 +226,7 @@ static const struct { const char*name; int code; } key_table[] = {
|
||||||
{ "endprimitive", K_endprimitive },
|
{ "endprimitive", K_endprimitive },
|
||||||
{ "endspecify", K_endspecify },
|
{ "endspecify", K_endspecify },
|
||||||
{ "endtable", K_endtable },
|
{ "endtable", K_endtable },
|
||||||
|
{ "endtask", K_endtask },
|
||||||
{ "event", K_event },
|
{ "event", K_event },
|
||||||
{ "for", K_for },
|
{ "for", K_for },
|
||||||
{ "force", K_force },
|
{ "force", K_force },
|
||||||
|
|
|
||||||
59
parse.y
59
parse.y
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: parse.y,v 1.23 1999/05/07 04:26:49 steve Exp $"
|
#ident "$Id: parse.y,v 1.24 1999/05/08 20:19:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "parse_misc.h"
|
# include "parse_misc.h"
|
||||||
|
|
@ -59,7 +59,7 @@ extern void lex_end_table();
|
||||||
verinum* number;
|
verinum* number;
|
||||||
};
|
};
|
||||||
|
|
||||||
%token <text> IDENTIFIER SYSTEM_IDENTIFIER STRING
|
%token <text> IDENTIFIER PORTNAME SYSTEM_IDENTIFIER STRING
|
||||||
%token <number> NUMBER
|
%token <number> NUMBER
|
||||||
%token K_LE K_GE K_EQ K_NE K_CEQ K_CNE
|
%token K_LE K_GE K_EQ K_NE K_CEQ K_CNE
|
||||||
%token K_LOR K_LAND
|
%token K_LOR K_LAND
|
||||||
|
|
@ -225,6 +225,13 @@ delay
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
delete $2;
|
delete $2;
|
||||||
}
|
}
|
||||||
|
| '#' '(' IDENTIFIER ')'
|
||||||
|
{ PEIdent*tmp = new PEIdent(*$3);
|
||||||
|
tmp->set_file(@1.text);
|
||||||
|
tmp->set_lineno(@1.first_line);
|
||||||
|
$$ = tmp;
|
||||||
|
delete $3;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
delay_opt
|
delay_opt
|
||||||
|
|
@ -327,6 +334,12 @@ expression
|
||||||
| expression '|' expression
|
| expression '|' expression
|
||||||
{ $$ = new PEBinary('|', $1, $3);
|
{ $$ = new PEBinary('|', $1, $3);
|
||||||
}
|
}
|
||||||
|
| expression '<' expression
|
||||||
|
{ $$ = new PEBinary('<', $1, $3);
|
||||||
|
}
|
||||||
|
| expression '>' expression
|
||||||
|
{ $$ = new PEBinary('>', $1, $3);
|
||||||
|
}
|
||||||
| expression K_EQ expression
|
| expression K_EQ expression
|
||||||
{ $$ = new PEBinary('e', $1, $3);
|
{ $$ = new PEBinary('e', $1, $3);
|
||||||
}
|
}
|
||||||
|
|
@ -410,6 +423,8 @@ expr_primary
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
/* A gate_instance is a module instantiation or a built in part
|
||||||
|
type. In any case, the gate has a set of connections to ports. */
|
||||||
gate_instance
|
gate_instance
|
||||||
: IDENTIFIER '(' expression_list ')'
|
: IDENTIFIER '(' expression_list ')'
|
||||||
{ lgate*tmp = new lgate;
|
{ lgate*tmp = new lgate;
|
||||||
|
|
@ -443,6 +458,16 @@ gate_instance
|
||||||
tmp->lineno = @1.first_line;
|
tmp->lineno = @1.first_line;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
| IDENTIFIER '(' port_name_list ')'
|
||||||
|
{ lgate*tmp = new lgate;
|
||||||
|
tmp->name = *$1;
|
||||||
|
tmp->parms = 0;
|
||||||
|
tmp->file = @1.text;
|
||||||
|
tmp->lineno = @1.first_line;
|
||||||
|
delete $1;
|
||||||
|
yyerror(@1, "Sorry, named port connections not supported.");
|
||||||
|
$$ = tmp;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
gate_instance_list
|
gate_instance_list
|
||||||
|
|
@ -641,6 +666,9 @@ module_item
|
||||||
tmp->set_file(@1.text);
|
tmp->set_file(@1.text);
|
||||||
tmp->set_lineno(@1.first_line);
|
tmp->set_lineno(@1.first_line);
|
||||||
}
|
}
|
||||||
|
| K_task IDENTIFIER ';' statement K_endtask
|
||||||
|
{ yyerror(@1, "Sorry, task declarations not supported.");
|
||||||
|
}
|
||||||
| KK_attribute '(' IDENTIFIER ',' STRING ',' STRING ')' ';'
|
| KK_attribute '(' IDENTIFIER ',' STRING ',' STRING ')' ';'
|
||||||
{ pform_set_attrib(*$3, *$5, *$7);
|
{ pform_set_attrib(*$3, *$5, *$7);
|
||||||
delete $3;
|
delete $3;
|
||||||
|
|
@ -702,6 +730,21 @@ port
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
port_name
|
||||||
|
: PORTNAME '(' IDENTIFIER ')'
|
||||||
|
{ delete $1;
|
||||||
|
delete $3;
|
||||||
|
}
|
||||||
|
| PORTNAME '(' ')'
|
||||||
|
{ delete $1;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
port_name_list
|
||||||
|
: port_name_list ',' port_name
|
||||||
|
| port_name
|
||||||
|
;
|
||||||
|
|
||||||
port_type
|
port_type
|
||||||
: K_input { $$ = NetNet::PINPUT; }
|
: K_input { $$ = NetNet::PINPUT; }
|
||||||
| K_output { $$ = NetNet::POUTPUT; }
|
| K_output { $$ = NetNet::POUTPUT; }
|
||||||
|
|
@ -839,6 +882,10 @@ statement
|
||||||
{ $$ = pform_make_assignment($1, $3);
|
{ $$ = pform_make_assignment($1, $3);
|
||||||
yyerror(@1, "Sorry, non-blocking assignment not implemented.");
|
yyerror(@1, "Sorry, non-blocking assignment not implemented.");
|
||||||
}
|
}
|
||||||
|
| lpvalue '=' delay expression ';'
|
||||||
|
{ $$ = pform_make_assignment($1, $3);
|
||||||
|
yyerror(@1, "Sorry, assignment timing control not implemented.");
|
||||||
|
}
|
||||||
| K_wait '(' expression ')' statement_opt
|
| K_wait '(' expression ')' statement_opt
|
||||||
{ PEventStatement*tmp;
|
{ PEventStatement*tmp;
|
||||||
PEEvent*etmp = new PEEvent(NetNEvent::POSITIVE, $3);
|
PEEvent*etmp = new PEEvent(NetNEvent::POSITIVE, $3);
|
||||||
|
|
@ -852,6 +899,14 @@ statement
|
||||||
| SYSTEM_IDENTIFIER ';'
|
| SYSTEM_IDENTIFIER ';'
|
||||||
{ $$ = pform_make_calltask($1);
|
{ $$ = pform_make_calltask($1);
|
||||||
}
|
}
|
||||||
|
| IDENTIFIER '(' expression_list ')' ';'
|
||||||
|
{ yyerror(@1, "Sorry, task enabling not implemented.");
|
||||||
|
$$ = new PNoop;
|
||||||
|
}
|
||||||
|
| IDENTIFIER ';'
|
||||||
|
{ yyerror(@1, "Sorry, task enabling not implemented.");
|
||||||
|
$$ = new PNoop;
|
||||||
|
}
|
||||||
| error ';'
|
| error ';'
|
||||||
{ yyerror(@1, "malformed statement");
|
{ yyerror(@1, "malformed statement");
|
||||||
$$ = new PNoop;
|
$$ = new PNoop;
|
||||||
|
|
|
||||||
7
pform.cc
7
pform.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: pform.cc,v 1.15 1999/05/07 04:26:49 steve Exp $"
|
#ident "$Id: pform.cc,v 1.16 1999/05/08 20:19:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "pform.h"
|
# include "pform.h"
|
||||||
|
|
@ -289,7 +289,7 @@ void pform_make_modgates(const string&type, svector<lgate>*gates)
|
||||||
for (unsigned idx = 0 ; idx < gates->count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < gates->count() ; idx += 1) {
|
||||||
lgate cur = (*gates)[idx];
|
lgate cur = (*gates)[idx];
|
||||||
|
|
||||||
vector<PExpr*>wires (cur.parms->size());
|
vector<PExpr*>wires (cur.parms? cur.parms->size() : 0);
|
||||||
for (unsigned idx = 0 ; idx < wires.size() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < wires.size() ; idx += 1) {
|
||||||
PExpr*ep = cur.parms->front();
|
PExpr*ep = cur.parms->front();
|
||||||
cur.parms->pop_front();
|
cur.parms->pop_front();
|
||||||
|
|
@ -533,6 +533,9 @@ int pform_parse(const char*path, map<string,Module*>&modules,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform.cc,v $
|
* $Log: pform.cc,v $
|
||||||
|
* Revision 1.16 1999/05/08 20:19:20 steve
|
||||||
|
* Parse more things.
|
||||||
|
*
|
||||||
* Revision 1.15 1999/05/07 04:26:49 steve
|
* Revision 1.15 1999/05/07 04:26:49 steve
|
||||||
* Parse more complex continuous assign lvalues.
|
* Parse more complex continuous assign lvalues.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue