Merge branch 'master' into vvp-net-out-rework
This commit is contained in:
commit
30ee9a104e
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998-2008 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 1998-2009 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -29,7 +29,9 @@ Module::Module(perm_string n)
|
||||||
: PScope(n)
|
: PScope(n)
|
||||||
{
|
{
|
||||||
library_flag = false;
|
library_flag = false;
|
||||||
|
is_cell = false;
|
||||||
default_nettype = NetNet::NONE;
|
default_nettype = NetNet::NONE;
|
||||||
|
timescale_warn_done = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Module::~Module()
|
Module::~Module()
|
||||||
|
|
|
||||||
3
Module.h
3
Module.h
|
|
@ -74,6 +74,8 @@ class Module : public PScope, public LineInfo {
|
||||||
other effect. */
|
other effect. */
|
||||||
bool library_flag;
|
bool library_flag;
|
||||||
|
|
||||||
|
bool is_cell;
|
||||||
|
|
||||||
NetNet::Type default_nettype;
|
NetNet::Type default_nettype;
|
||||||
|
|
||||||
/* specparams are simpler then other params, in that they have
|
/* specparams are simpler then other params, in that they have
|
||||||
|
|
@ -106,6 +108,7 @@ class Module : public PScope, public LineInfo {
|
||||||
set by the `timescale directive. */
|
set by the `timescale directive. */
|
||||||
int time_unit, time_precision;
|
int time_unit, time_precision;
|
||||||
bool time_from_timescale;
|
bool time_from_timescale;
|
||||||
|
bool timescale_warn_done;
|
||||||
|
|
||||||
/* Task definitions within this module */
|
/* Task definitions within this module */
|
||||||
map<perm_string,PTask*> tasks;
|
map<perm_string,PTask*> tasks;
|
||||||
|
|
|
||||||
|
|
@ -1081,6 +1081,7 @@ void NetScope::dump(ostream&o) const
|
||||||
|
|
||||||
print_type(o);
|
print_type(o);
|
||||||
if (is_auto()) o << " (automatic)";
|
if (is_auto()) o << " (automatic)";
|
||||||
|
if (is_cell()) o << " (cell)";
|
||||||
o << endl;
|
o << endl;
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < attr_cnt() ; idx += 1)
|
for (unsigned idx = 0 ; idx < attr_cnt() ; idx += 1)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
%{
|
%{
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2009 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -21,9 +21,6 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
|
||||||
#ident "$Id: cflexor.lex,v 1.11 2007/03/22 16:08:18 steve Exp $"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
# include "cfparse.h"
|
# include "cfparse.h"
|
||||||
# include "cfparse_misc.h"
|
# include "cfparse_misc.h"
|
||||||
|
|
@ -236,3 +233,17 @@ void cfreset(FILE*fd, const char*path)
|
||||||
current_file = strdup(path);
|
current_file = strdup(path);
|
||||||
cflloc.first_line = 1;
|
cflloc.first_line = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Modern version of flex (>=2.5.9) can clean up the scanner data.
|
||||||
|
*/
|
||||||
|
void destroy_lexor()
|
||||||
|
{
|
||||||
|
# ifdef FLEX_SCANNER
|
||||||
|
# if YY_FLEX_MAJOR_VERSION >= 2 && YY_FLEX_MINOR_VERSION >= 5
|
||||||
|
# if defined(YY_FLEX_SUBMINOR_VERSION) && YY_FLEX_SUBMINOR_VERSION >= 9
|
||||||
|
yylex_destroy();
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
%{
|
%{
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 20001 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2009 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -17,10 +17,6 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
|
||||||
#ident "$Id: cfparse.y,v 1.12 2007/04/19 02:52:53 steve Exp $"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
# include "globals.h"
|
# include "globals.h"
|
||||||
# include "cfparse_misc.h"
|
# include "cfparse_misc.h"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __cfparse_misc_H
|
#ifndef __cfparse_misc_H
|
||||||
#define __cfparse_misc_H
|
#define __cfparse_misc_H
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001 Picture Elements, Inc.
|
* Copyright (c) 2001-2009 Picture Elements, Inc.
|
||||||
* Stephen Williams (steve@picturel.com)
|
* Stephen Williams (steve@picturel.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
|
|
@ -38,6 +38,7 @@ int cflex(void);
|
||||||
int cferror(const char *);
|
int cferror(const char *);
|
||||||
int cfparse(void);
|
int cfparse(void);
|
||||||
void switch_to_command_file(const char *);
|
void switch_to_command_file(const char *);
|
||||||
|
void destroy_lexor();
|
||||||
char *current_file;
|
char *current_file;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -870,6 +870,20 @@ int main(int argc, char **argv)
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
default:
|
default:
|
||||||
|
fclose(source_file);
|
||||||
|
remove(source_path);
|
||||||
|
free(source_path);
|
||||||
|
fclose(defines_file);
|
||||||
|
remove(defines_path);
|
||||||
|
free(defines_path);
|
||||||
|
fclose(iconfig_file);
|
||||||
|
remove(iconfig_path);
|
||||||
|
free(iconfig_path);
|
||||||
|
remove(compiled_defines_path);
|
||||||
|
free(compiled_defines_path);
|
||||||
|
while( (command_filename = get_cmd_file()) ) {
|
||||||
|
free(command_filename);
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -941,7 +955,9 @@ int main(int argc, char **argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
free(command_filename);
|
free(command_filename);
|
||||||
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
destroy_lexor();
|
||||||
|
|
||||||
if (depfile) {
|
if (depfile) {
|
||||||
fprintf(defines_file, "M:%s\n", depfile);
|
fprintf(defines_file, "M:%s\n", depfile);
|
||||||
|
|
|
||||||
|
|
@ -479,6 +479,8 @@ bool Module::elaborate_scope(Design*des, NetScope*scope,
|
||||||
|
|
||||||
elaborate_scope_events_(des, scope, events);
|
elaborate_scope_events_(des, scope, events);
|
||||||
|
|
||||||
|
scope->is_cell(is_cell);
|
||||||
|
|
||||||
return des->errors == 0;
|
return des->errors == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
1
ivl.def
1
ivl.def
|
|
@ -161,6 +161,7 @@ ivl_scope_event
|
||||||
ivl_scope_events
|
ivl_scope_events
|
||||||
ivl_scope_file
|
ivl_scope_file
|
||||||
ivl_scope_is_auto
|
ivl_scope_is_auto
|
||||||
|
ivl_scope_is_cell
|
||||||
ivl_scope_lineno
|
ivl_scope_lineno
|
||||||
ivl_scope_logs
|
ivl_scope_logs
|
||||||
ivl_scope_log
|
ivl_scope_log
|
||||||
|
|
|
||||||
|
|
@ -1537,6 +1537,9 @@ extern unsigned ivl_parameter_lineno(ivl_parameter_t net);
|
||||||
* ivl_scope_is_auto
|
* ivl_scope_is_auto
|
||||||
* Is the task or function declared to be automatic?
|
* Is the task or function declared to be automatic?
|
||||||
*
|
*
|
||||||
|
* ivl_scope_is_cell
|
||||||
|
* Is the module defined to be a cell?
|
||||||
|
*
|
||||||
* ivl_scope_var
|
* ivl_scope_var
|
||||||
* ivl_scope_vars
|
* ivl_scope_vars
|
||||||
* REMOVED
|
* REMOVED
|
||||||
|
|
@ -1614,6 +1617,7 @@ extern unsigned ivl_scope_events(ivl_scope_t net);
|
||||||
extern ivl_event_t ivl_scope_event(ivl_scope_t net, unsigned idx);
|
extern ivl_event_t ivl_scope_event(ivl_scope_t net, unsigned idx);
|
||||||
extern const char* ivl_scope_file(ivl_scope_t net);
|
extern const char* ivl_scope_file(ivl_scope_t net);
|
||||||
extern unsigned ivl_scope_is_auto(ivl_scope_t net);
|
extern unsigned ivl_scope_is_auto(ivl_scope_t net);
|
||||||
|
extern unsigned ivl_scope_is_cell(ivl_scope_t net);
|
||||||
extern unsigned ivl_scope_lineno(ivl_scope_t net);
|
extern unsigned ivl_scope_lineno(ivl_scope_t net);
|
||||||
extern unsigned ivl_scope_logs(ivl_scope_t net);
|
extern unsigned ivl_scope_logs(ivl_scope_t net);
|
||||||
extern ivl_net_logic_t ivl_scope_log(ivl_scope_t net, unsigned idx);
|
extern ivl_net_logic_t ivl_scope_log(ivl_scope_t net, unsigned idx);
|
||||||
|
|
|
||||||
32
ivlpp/main.c
32
ivlpp/main.c
|
|
@ -214,26 +214,34 @@ int main(int argc, char*argv[])
|
||||||
FILE*precomp_out = NULL;
|
FILE*precomp_out = NULL;
|
||||||
|
|
||||||
/* Define preprocessor keywords that I plan to just pass. */
|
/* Define preprocessor keywords that I plan to just pass. */
|
||||||
|
/* From 1364-2005 Chapter 19. */
|
||||||
|
define_macro("begin_keywords", "`begin_keywords", 1, 0);
|
||||||
define_macro("celldefine", "`celldefine", 1, 0);
|
define_macro("celldefine", "`celldefine", 1, 0);
|
||||||
define_macro("default_decay_time", "`default_decay_time", 1, 0);
|
|
||||||
define_macro("default_nettype", "`default_nettype", 1, 0);
|
define_macro("default_nettype", "`default_nettype", 1, 0);
|
||||||
define_macro("default_trireg_strength", "`default_trireg_strength", 1, 0);
|
define_macro("end_keywords", "`end_keywords", 1, 0);
|
||||||
define_macro("delay_mode_distributed", "`delay_mode_distributed", 1, 0);
|
|
||||||
define_macro("delay_mode_unit", "`delay_mode_unit", 1, 0);
|
|
||||||
define_macro("delay_mode_path", "`delay_mode_path", 1, 0);
|
|
||||||
define_macro("delay_mode_zero", "`delay_mode_zero", 1, 0);
|
|
||||||
define_macro("disable_portfaults", "`disable_portfaults", 1, 0);
|
|
||||||
define_macro("enable_portfaults", "`enable_portfaults", 1, 0);
|
|
||||||
define_macro("endcelldefine", "`endcelldefine", 1, 0);
|
define_macro("endcelldefine", "`endcelldefine", 1, 0);
|
||||||
define_macro("endprotect", "`endprotect", 1, 0);
|
|
||||||
define_macro("line", "`line", 1, 0);
|
define_macro("line", "`line", 1, 0);
|
||||||
define_macro("nosuppress_faults", "`nosuppress_faults", 1, 0);
|
|
||||||
define_macro("nounconnected_drive", "`nounconnected_drive", 1, 0);
|
define_macro("nounconnected_drive", "`nounconnected_drive", 1, 0);
|
||||||
define_macro("protect", "`protect", 1, 0);
|
define_macro("pragma", "`pragma", 1, 0);
|
||||||
define_macro("resetall", "`resetall", 1, 0);
|
define_macro("resetall", "`resetall", 1, 0);
|
||||||
define_macro("suppress_faults", "`suppress_faults", 1, 0);
|
|
||||||
define_macro("timescale", "`timescale", 1, 0);
|
define_macro("timescale", "`timescale", 1, 0);
|
||||||
define_macro("unconnected_drive", "`unconnected_drive", 1, 0);
|
define_macro("unconnected_drive", "`unconnected_drive", 1, 0);
|
||||||
|
|
||||||
|
/* From 1364-2005 Annex D. */
|
||||||
|
define_macro("default_decay_time", "`default_decay_time", 1, 0);
|
||||||
|
define_macro("default_trireg_strength", "`default_trireg_strength", 1, 0);
|
||||||
|
define_macro("delay_mode_distributed", "`delay_mode_distributed", 1, 0);
|
||||||
|
define_macro("delay_mode_path", "`delay_mode_path", 1, 0);
|
||||||
|
define_macro("delay_mode_unit", "`delay_mode_unit", 1, 0);
|
||||||
|
define_macro("delay_mode_zero", "`delay_mode_zero", 1, 0);
|
||||||
|
|
||||||
|
/* From other places. */
|
||||||
|
define_macro("disable_portfaults", "`disable_portfaults", 1, 0);
|
||||||
|
define_macro("enable_portfaults", "`enable_portfaults", 1, 0);
|
||||||
|
define_macro("endprotect", "`endprotect", 1, 0);
|
||||||
|
define_macro("nosuppress_faults", "`nosuppress_faults", 1, 0);
|
||||||
|
define_macro("protect", "`protect", 1, 0);
|
||||||
|
define_macro("suppress_faults", "`suppress_faults", 1, 0);
|
||||||
define_macro("uselib", "`uselib", 1, 0);
|
define_macro("uselib", "`uselib", 1, 0);
|
||||||
|
|
||||||
include_cnt = 2;
|
include_cnt = 2;
|
||||||
|
|
|
||||||
227
lexor.lex
227
lexor.lex
|
|
@ -67,9 +67,6 @@ static const char* set_file_name(char*text)
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern void pform_set_timescale(int, int, const char*file, unsigned line);
|
|
||||||
|
|
||||||
void reset_lexor();
|
void reset_lexor();
|
||||||
static void line_directive();
|
static void line_directive();
|
||||||
static void line_directive2();
|
static void line_directive2();
|
||||||
|
|
@ -88,6 +85,8 @@ static list<int> keyword_mask_stack;
|
||||||
|
|
||||||
static int comment_enter;
|
static int comment_enter;
|
||||||
static bool in_module = false;
|
static bool in_module = false;
|
||||||
|
static bool in_UDP = false;
|
||||||
|
bool in_celldefine = false;
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%x CCOMMENT
|
%x CCOMMENT
|
||||||
|
|
@ -107,8 +106,9 @@ S [afpnumkKMGT]
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
^"#line"[ ]+\"[^\"]*\"[ ]+[0-9]+.* { line_directive(); }
|
/* Recognize the various line directives. */
|
||||||
^"`line"[ ]+[0-9]+[ ]+\"[^\"]*\".* { line_directive2(); }
|
^"#line"[ \t]+.+ { line_directive(); }
|
||||||
|
^[ \t]?"`line"[ \t]+.+ { line_directive2(); }
|
||||||
|
|
||||||
[ \t\b\f\r] { ; }
|
[ \t\b\f\r] { ; }
|
||||||
\n { yylloc.first_line += 1; }
|
\n { yylloc.first_line += 1; }
|
||||||
|
|
@ -237,6 +237,14 @@ S [afpnumkKMGT]
|
||||||
in_module = false;
|
in_module = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case K_primitive:
|
||||||
|
in_UDP = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case K_endprimitive:
|
||||||
|
in_UDP = false;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
yylval.text = 0;
|
yylval.text = 0;
|
||||||
break;
|
break;
|
||||||
|
|
@ -348,7 +356,7 @@ S [afpnumkKMGT]
|
||||||
return REALTIME; }
|
return REALTIME; }
|
||||||
|
|
||||||
|
|
||||||
/* Notice and handle the timescale directive. */
|
/* Notice and handle the `timescale directive. */
|
||||||
|
|
||||||
^{W}?`timescale { BEGIN(PPTIMESCALE); }
|
^{W}?`timescale { BEGIN(PPTIMESCALE); }
|
||||||
<PPTIMESCALE>.* { process_timescale(yytext); }
|
<PPTIMESCALE>.* { process_timescale(yytext); }
|
||||||
|
|
@ -362,28 +370,54 @@ S [afpnumkKMGT]
|
||||||
yylloc.first_line += 1;
|
yylloc.first_line += 1;
|
||||||
BEGIN(0); }
|
BEGIN(0); }
|
||||||
|
|
||||||
|
/* Notice and handle the `celldefine and `endcelldefine directives. */
|
||||||
|
|
||||||
|
^{W}?`celldefine{W}? { in_celldefine = true; }
|
||||||
|
^{W}?`endcelldefine{W}? { in_celldefine = false; }
|
||||||
|
|
||||||
|
/* Notice and handle the resetall directive. */
|
||||||
|
|
||||||
|
^{W}?`resetall{W}? {
|
||||||
|
if (in_module) {
|
||||||
|
cerr << yylloc.text << ":" << yylloc.first_line << ": error: "
|
||||||
|
"`resetall directive can not be inside a module "
|
||||||
|
"definition." << endl;
|
||||||
|
error_count += 1;
|
||||||
|
} else if (in_UDP) {
|
||||||
|
cerr << yylloc.text << ":" << yylloc.first_line << ": error: "
|
||||||
|
"`resetall directive can not be inside a UDP "
|
||||||
|
"definition." << endl;
|
||||||
|
error_count += 1;
|
||||||
|
} else {
|
||||||
|
pform_set_default_nettype(NetNet::WIRE, yylloc.text,
|
||||||
|
yylloc.first_line);
|
||||||
|
in_celldefine = false;
|
||||||
|
pform_set_timescale(def_ts_units, def_ts_prec, 0, 0);
|
||||||
|
/* Add `nounconnected_drive when implemented. */
|
||||||
|
} }
|
||||||
|
|
||||||
/* These are directives that I do not yet support. I think that IVL
|
/* These are directives that I do not yet support. I think that IVL
|
||||||
should handle these, not an external preprocessor. */
|
should handle these, not an external preprocessor. */
|
||||||
|
/* From 1364-2005 Chapter 19. */
|
||||||
|
^{W}?`nounconnected_drive{W}?.* { }
|
||||||
|
^{W}?`pragme{W}?.* { }
|
||||||
|
^{W}?`unconnected_drive{W}?.* { }
|
||||||
|
|
||||||
^{W}?`celldefine{W}?.* { }
|
/* From 1364-2005 Annex D. */
|
||||||
^{W}?`default_decay_time{W}?.* { }
|
^{W}?`default_decay_time{W}?.* { }
|
||||||
^{W}?`default_trireg_strength{W}?.* { }
|
^{W}?`default_trireg_strength{W}?.* { }
|
||||||
^{W}?`delay_mode_distributed{W}?.* { }
|
^{W}?`delay_mode_distributed{W}?.* { }
|
||||||
^{W}?`delay_mode_unit{W}?.* { }
|
|
||||||
^{W}?`delay_mode_path{W}?.* { }
|
^{W}?`delay_mode_path{W}?.* { }
|
||||||
|
^{W}?`delay_mode_unit{W}?.* { }
|
||||||
^{W}?`delay_mode_zero{W}?.* { }
|
^{W}?`delay_mode_zero{W}?.* { }
|
||||||
|
|
||||||
|
/* From other places. */
|
||||||
^{W}?`disable_portfaults{W}?.* { }
|
^{W}?`disable_portfaults{W}?.* { }
|
||||||
^{W}?`enable_portfaults{W}?.* { }
|
^{W}?`enable_portfaults{W}?.* { }
|
||||||
^{W}?`endcelldefine{W}?.* { }
|
|
||||||
`endprotect { }
|
`endprotect { }
|
||||||
^{W}?`line{W}?.* { }
|
|
||||||
^{W}?`nosuppress_faults{W}?.* { }
|
^{W}?`nosuppress_faults{W}?.* { }
|
||||||
^{W}?`nounconnected_drive{W}?.* { }
|
|
||||||
`protect { }
|
`protect { }
|
||||||
^{W}?`resetall{W}?.* { }
|
|
||||||
^{W}?`suppress_faults{W}?.* { }
|
^{W}?`suppress_faults{W}?.* { }
|
||||||
^{W}?`unconnected_drive{W}?.* { }
|
|
||||||
^{W}?`uselib{W}?.* { }
|
^{W}?`uselib{W}?.* { }
|
||||||
|
|
||||||
^{W}?`begin_keywords{W}? { BEGIN(PPBEGIN_KEYWORDS); }
|
^{W}?`begin_keywords{W}? { BEGIN(PPBEGIN_KEYWORDS); }
|
||||||
|
|
@ -483,6 +517,12 @@ S [afpnumkKMGT]
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
^{W}?`elsif{W}?.* {
|
||||||
|
cerr << yylloc.text << ":" << yylloc.first_line <<
|
||||||
|
": warning: `elsif not supported. Use an external preprocessor."
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
|
||||||
^{W}?`endif{W}?.* {
|
^{W}?`endif{W}?.* {
|
||||||
cerr << yylloc.text << ":" << yylloc.first_line <<
|
cerr << yylloc.text << ":" << yylloc.first_line <<
|
||||||
": warning: `endif not supported. Use an external preprocessor."
|
": warning: `endif not supported. Use an external preprocessor."
|
||||||
|
|
@ -495,6 +535,12 @@ S [afpnumkKMGT]
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
^{W}?`ifndef{W}?.* {
|
||||||
|
cerr << yylloc.text << ":" << yylloc.first_line <<
|
||||||
|
": warning: `ifndef not supported. Use an external preprocessor."
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
|
||||||
^`include{W}?.* {
|
^`include{W}?.* {
|
||||||
cerr << yylloc.text << ":" << yylloc.first_line <<
|
cerr << yylloc.text << ":" << yylloc.first_line <<
|
||||||
": warning: `include not supported. Use an external preprocessor."
|
": warning: `include not supported. Use an external preprocessor."
|
||||||
|
|
@ -1053,47 +1099,150 @@ int yywrap()
|
||||||
*/
|
*/
|
||||||
static void line_directive()
|
static void line_directive()
|
||||||
{
|
{
|
||||||
char*qt1 = strchr(yytext, '"');
|
char *cpr;
|
||||||
assert(qt1);
|
/* Skip any leading space. */
|
||||||
qt1 += 1;
|
char *cp = index(yytext, '#');
|
||||||
|
/* Skip the #line directive. */
|
||||||
|
assert(strncmp(cp, "#line", 5) == 0);
|
||||||
|
cp += 5;
|
||||||
|
/* Skip the space after the #line directive. */
|
||||||
|
cp += strspn(cp, " \t");
|
||||||
|
|
||||||
char*qt2 = strchr(qt1, '"');
|
/* Find the starting " and skip it. */
|
||||||
assert(qt2);
|
char*fn_start = strchr(cp, '"');
|
||||||
|
if (cp != fn_start) {
|
||||||
|
VLerror(yylloc, "Invalid #line directive (file name start).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fn_start += 1;
|
||||||
|
|
||||||
char*buf = new char[qt2-qt1+1];
|
/* Find the last ". */
|
||||||
strncpy(buf, qt1, qt2-qt1);
|
char*fn_end = strrchr(fn_start, '"');
|
||||||
buf[qt2-qt1] = 0;
|
if (!fn_end) {
|
||||||
|
VLerror(yylloc, "Invalid #line directive (file name end).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the file name and assign it to yylloc. */
|
||||||
|
char*buf = new char[fn_end-fn_start+1];
|
||||||
|
strncpy(buf, fn_start, fn_end-fn_start);
|
||||||
|
buf[fn_end-fn_start] = 0;
|
||||||
|
|
||||||
|
/* Skip the space after the file name. */
|
||||||
|
cp = fn_end;
|
||||||
|
cp += 1;
|
||||||
|
cpr = cp;
|
||||||
|
cpr += strspn(cp, " \t");
|
||||||
|
if (cp == cpr) {
|
||||||
|
VLerror(yylloc, "Invalid #line directive (missing space after "
|
||||||
|
"file name).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cp = cpr;
|
||||||
|
|
||||||
|
/* Get the line number and verify that it is correct. */
|
||||||
|
unsigned long lineno = strtoul(cp, &cpr, 10);
|
||||||
|
if (cp == cpr) {
|
||||||
|
VLerror(yylloc, "Invalid line number for #line directive.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cp = cpr;
|
||||||
|
|
||||||
|
/* Verify that only space is left. */
|
||||||
|
cpr += strspn(cp, " \t");
|
||||||
|
if ((size_t)(cpr-yytext) != strlen(yytext)) {
|
||||||
|
VLerror(yylloc, "Invalid #line directive (extra garbage after "
|
||||||
|
"line number).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now we can assign the new values to yyloc. */
|
||||||
yylloc.text = set_file_name(buf);
|
yylloc.text = set_file_name(buf);
|
||||||
|
yylloc.first_line = lineno;
|
||||||
qt2 += 1;
|
|
||||||
yylloc.first_line = strtoul(qt2,0,0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The line directive matches lines of the form `line N "foo" M and
|
||||||
|
* calls this function. Here I parse out the file name and line
|
||||||
|
* number, and change the yylloc to suite. M is ignored.
|
||||||
|
*/
|
||||||
static void line_directive2()
|
static void line_directive2()
|
||||||
{
|
{
|
||||||
assert(strncmp(yytext,"`line",5) == 0);
|
char *cpr;
|
||||||
char*cp = yytext + strlen("`line");
|
/* Skip any leading space. */
|
||||||
cp += strspn(cp, " ");
|
char *cp = index(yytext, '`');
|
||||||
yylloc.first_line = strtoul(cp,&cp,10);
|
/* Skip the `line directive. */
|
||||||
|
assert(strncmp(cp, "`line", 5) == 0);
|
||||||
|
cp += 5;
|
||||||
|
|
||||||
yylloc.first_line -= 1;
|
/* strtoul skips leading space. */
|
||||||
|
unsigned long lineno = strtoul(cp, &cpr, 10);
|
||||||
|
if (cp == cpr) {
|
||||||
|
VLerror(yylloc, "Invalid line number for `line directive.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lineno -= 1;
|
||||||
|
cp = cpr;
|
||||||
|
|
||||||
cp += strspn(cp, " ");
|
/* Skip the space between the line number and the file name. */
|
||||||
if (*cp == 0) return;
|
cpr += strspn(cp, " \t");
|
||||||
|
if (cp == cpr) {
|
||||||
|
VLerror(yylloc, "Invalid `line directive (missing space after "
|
||||||
|
"line number).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cp = cpr;
|
||||||
|
|
||||||
char*qt1 = strchr(yytext, '"');
|
/* Find the starting " and skip it. */
|
||||||
assert(qt1);
|
char*fn_start = strchr(cp, '"');
|
||||||
qt1 += 1;
|
if (cp != fn_start) {
|
||||||
|
VLerror(yylloc, "Invalid `line directive (file name start).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fn_start += 1;
|
||||||
|
|
||||||
char*qt2 = strchr(qt1, '"');
|
/* Find the last ". */
|
||||||
assert(qt2);
|
char*fn_end = strrchr(fn_start, '"');
|
||||||
|
if (!fn_end) {
|
||||||
|
VLerror(yylloc, "Invalid `line directive (file name end).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
char*buf = new char[qt2-qt1+1];
|
/* Skip the space after the file name. */
|
||||||
strncpy(buf, qt1, qt2-qt1);
|
cp = fn_end;
|
||||||
buf[qt2-qt1] = 0;
|
cp += 1;
|
||||||
|
cpr = cp;
|
||||||
|
cpr += strspn(cp, " \t");
|
||||||
|
if (cp == cpr) {
|
||||||
|
VLerror(yylloc, "Invalid `line directive (missing space after "
|
||||||
|
"file name).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cp = cpr;
|
||||||
|
|
||||||
|
/* Check that the level is correct, we do not need the level. */
|
||||||
|
strtoul(cp, &cpr, 10);
|
||||||
|
if (cp == cpr) {
|
||||||
|
VLerror(yylloc, "Invalid level for `line directive.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cp = cpr;
|
||||||
|
|
||||||
|
/* Verify that only space is left. */
|
||||||
|
cpr += strspn(cp, " \t");
|
||||||
|
if ((size_t)(cpr-yytext) != strlen(yytext)) {
|
||||||
|
VLerror(yylloc, "Invalid `line directive (extra garbage after "
|
||||||
|
"level).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the file name and assign it and the line number to yylloc. */
|
||||||
|
char*buf = new char[fn_end-fn_start+1];
|
||||||
|
strncpy(buf, fn_start, fn_end-fn_start);
|
||||||
|
buf[fn_end-fn_start] = 0;
|
||||||
|
|
||||||
yylloc.text = set_file_name(buf);
|
yylloc.text = set_file_name(buf);
|
||||||
|
yylloc.first_line = lineno;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern FILE*vl_input;
|
extern FILE*vl_input;
|
||||||
|
|
|
||||||
4
main.cc
4
main.cc
|
|
@ -142,6 +142,9 @@ bool verbose_flag = false;
|
||||||
|
|
||||||
unsigned integer_width = 32;
|
unsigned integer_width = 32;
|
||||||
|
|
||||||
|
int def_ts_units = 0;
|
||||||
|
int def_ts_prec = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Keep a heap of identifier strings that I encounter. This is a more
|
* Keep a heap of identifier strings that I encounter. This is a more
|
||||||
* efficient way to allocate those strings.
|
* efficient way to allocate those strings.
|
||||||
|
|
@ -726,6 +729,7 @@ int main(int argc, char*argv[])
|
||||||
if (flag_tmp) recursive_mod_limit = strtoul(flag_tmp,NULL,0);
|
if (flag_tmp) recursive_mod_limit = strtoul(flag_tmp,NULL,0);
|
||||||
|
|
||||||
/* Parse the input. Make the pform. */
|
/* Parse the input. Make the pform. */
|
||||||
|
pform_set_timescale(def_ts_units, def_ts_prec, 0, 0);
|
||||||
int rc = pform_parse(argv[optind]);
|
int rc = pform_parse(argv[optind]);
|
||||||
|
|
||||||
if (pf_path) {
|
if (pf_path) {
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ NetScope::NetScope(NetScope*up, const hname_t&n, NetScope::TYPE t)
|
||||||
events_ = 0;
|
events_ = 0;
|
||||||
lcounter_ = 0;
|
lcounter_ = 0;
|
||||||
is_auto_ = false;
|
is_auto_ = false;
|
||||||
|
is_cell_ = false;
|
||||||
|
|
||||||
if (up) {
|
if (up) {
|
||||||
default_nettype_ = up->default_nettype();
|
default_nettype_ = up->default_nettype();
|
||||||
|
|
|
||||||
|
|
@ -761,6 +761,10 @@ class NetScope : public Attrib {
|
||||||
void is_auto(bool is_auto__) { is_auto_ = is_auto__; };
|
void is_auto(bool is_auto__) { is_auto_ = is_auto__; };
|
||||||
bool is_auto() const { return is_auto_; };
|
bool is_auto() const { return is_auto_; };
|
||||||
|
|
||||||
|
/* Is the module a cell (is in a `celldefine) */
|
||||||
|
void is_cell(bool is_cell__) { is_cell_ = is_cell__; };
|
||||||
|
bool is_cell() const { return is_cell_; };
|
||||||
|
|
||||||
const NetTaskDef* task_def() const;
|
const NetTaskDef* task_def() const;
|
||||||
const NetFuncDef* func_def() const;
|
const NetFuncDef* func_def() const;
|
||||||
|
|
||||||
|
|
@ -908,7 +912,7 @@ class NetScope : public Attrib {
|
||||||
NetScope*sub_;
|
NetScope*sub_;
|
||||||
|
|
||||||
unsigned lcounter_;
|
unsigned lcounter_;
|
||||||
bool is_auto_;
|
bool is_auto_, is_cell_;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
17
parse.y
17
parse.y
|
|
@ -921,6 +921,21 @@ expression
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
| '~' '&' expr_primary %prec UNARY_PREC
|
||||||
|
{ yyerror(@1, "error: '~' '&' is not a valid expression. "
|
||||||
|
"Please use operator '~&' instead.");
|
||||||
|
$$ = 0;
|
||||||
|
}
|
||||||
|
| '~' '|' expr_primary %prec UNARY_PREC
|
||||||
|
{ yyerror(@1, "error: '~' '|' is not a valid expression. "
|
||||||
|
"Please use operator '~|' instead.");
|
||||||
|
$$ = 0;
|
||||||
|
}
|
||||||
|
| '~' '^' expr_primary %prec UNARY_PREC
|
||||||
|
{ yyerror(@1, "error: '~' '^' is not a valid expression. "
|
||||||
|
"Please use operator '~^' instead.");
|
||||||
|
$$ = 0;
|
||||||
|
}
|
||||||
| K_NAND expr_primary %prec UNARY_PREC
|
| K_NAND expr_primary %prec UNARY_PREC
|
||||||
{ PEUnary*tmp = new PEUnary('A', $2);
|
{ PEUnary*tmp = new PEUnary('A', $2);
|
||||||
FILE_NAME(tmp, @2);
|
FILE_NAME(tmp, @2);
|
||||||
|
|
@ -1908,7 +1923,7 @@ module : attribute_list_opt module_start IDENTIFIER
|
||||||
{ pform_module_set_ports($6); }
|
{ pform_module_set_ports($6); }
|
||||||
module_item_list_opt
|
module_item_list_opt
|
||||||
K_endmodule
|
K_endmodule
|
||||||
{ pform_endmodule($3);
|
{ pform_endmodule($3, in_celldefine);
|
||||||
delete[]$3;
|
delete[]$3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __parse_api_H
|
#ifndef __parse_api_H
|
||||||
#define __parse_api_H
|
#define __parse_api_H
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2009 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -46,4 +46,9 @@ extern int pform_parse(const char*path, FILE*file =0);
|
||||||
|
|
||||||
extern string vl_file;
|
extern string vl_file;
|
||||||
|
|
||||||
|
extern void pform_set_timescale(int units, int prec, const char*file,
|
||||||
|
unsigned lineno);
|
||||||
|
extern int def_ts_units;
|
||||||
|
extern int def_ts_prec;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __parse_misc_H
|
#ifndef __parse_misc_H
|
||||||
#define __parse_misc_H
|
#define __parse_misc_H
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998-2000 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 1998-2009 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -65,4 +65,6 @@ extern ostream& operator << (ostream&, const YYLTYPE&loc);
|
||||||
extern unsigned error_count, warn_count;
|
extern unsigned error_count, warn_count;
|
||||||
extern unsigned long based_size;
|
extern unsigned long based_size;
|
||||||
|
|
||||||
|
extern bool in_celldefine;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
33
pform.cc
33
pform.cc
|
|
@ -70,11 +70,11 @@ static NetNet::Type pform_default_nettype = NetNet::WIRE;
|
||||||
* These variables track the current time scale, as well as where the
|
* These variables track the current time scale, as well as where the
|
||||||
* timescale was set. This supports warnings about tangled timescales.
|
* timescale was set. This supports warnings about tangled timescales.
|
||||||
*/
|
*/
|
||||||
static int pform_time_unit = 0;
|
static int pform_time_unit;
|
||||||
static int pform_time_prec = 0;
|
static int pform_time_prec;
|
||||||
|
|
||||||
static char*pform_timescale_file = 0;
|
static char*pform_timescale_file = 0;
|
||||||
static unsigned pform_timescale_line = 0;
|
static unsigned pform_timescale_line;
|
||||||
|
|
||||||
static inline void FILE_NAME(LineInfo*obj, const char*file, unsigned lineno)
|
static inline void FILE_NAME(LineInfo*obj, const char*file, unsigned lineno)
|
||||||
{
|
{
|
||||||
|
|
@ -298,10 +298,25 @@ void pform_set_timescale(int unit, int prec,
|
||||||
first_flag = false;
|
first_flag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pform_timescale_file = strdup(file);
|
if (file) pform_timescale_file = strdup(file);
|
||||||
|
else pform_timescale_file = 0;
|
||||||
pform_timescale_line = lineno;
|
pform_timescale_line = lineno;
|
||||||
|
|
||||||
if (warn_timescale && first_flag && (pform_modules.size() > 0)) {
|
if (!warn_timescale || !first_flag || !file) return;
|
||||||
|
|
||||||
|
/* Look to see if we have any modules without a timescale. */
|
||||||
|
bool have_no_ts = false;
|
||||||
|
map<perm_string,Module*>::iterator mod;
|
||||||
|
for (mod = pform_modules.begin(); mod != pform_modules.end(); mod++) {
|
||||||
|
const Module*mp = (*mod).second;
|
||||||
|
if (mp->time_from_timescale ||
|
||||||
|
mp->timescale_warn_done) continue;
|
||||||
|
have_no_ts = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we do then print a message for the new ones. */
|
||||||
|
if (have_no_ts) {
|
||||||
cerr << file << ":" << lineno << ": warning: "
|
cerr << file << ":" << lineno << ": warning: "
|
||||||
<< "Some modules have no timescale. This may cause"
|
<< "Some modules have no timescale. This may cause"
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
@ -312,7 +327,10 @@ void pform_set_timescale(int unit, int prec,
|
||||||
map<perm_string,Module*>::iterator mod;
|
map<perm_string,Module*>::iterator mod;
|
||||||
for (mod = pform_modules.begin()
|
for (mod = pform_modules.begin()
|
||||||
; mod != pform_modules.end() ; mod++) {
|
; mod != pform_modules.end() ; mod++) {
|
||||||
const Module*mp = (*mod).second;
|
Module*mp = (*mod).second;
|
||||||
|
if (mp->time_from_timescale ||
|
||||||
|
mp->timescale_warn_done) continue;
|
||||||
|
mp->timescale_warn_done = true;
|
||||||
|
|
||||||
cerr << file << ":" << lineno << ": : "
|
cerr << file << ":" << lineno << ": : "
|
||||||
<< " -- module " << (*mod).first
|
<< " -- module " << (*mod).first
|
||||||
|
|
@ -449,11 +467,12 @@ void pform_module_set_ports(vector<Module::port_t*>*ports)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pform_endmodule(const char*name)
|
void pform_endmodule(const char*name, bool in_celldefine)
|
||||||
{
|
{
|
||||||
assert(pform_cur_module);
|
assert(pform_cur_module);
|
||||||
perm_string mod_name = pform_cur_module->mod_name();
|
perm_string mod_name = pform_cur_module->mod_name();
|
||||||
assert(strcmp(name, mod_name) == 0);
|
assert(strcmp(name, mod_name) == 0);
|
||||||
|
pform_cur_module->is_cell = in_celldefine;
|
||||||
|
|
||||||
map<perm_string,Module*>::const_iterator test =
|
map<perm_string,Module*>::const_iterator test =
|
||||||
pform_modules.find(mod_name);
|
pform_modules.find(mod_name);
|
||||||
|
|
|
||||||
2
pform.h
2
pform.h
|
|
@ -159,7 +159,7 @@ extern void pform_module_define_port(const struct vlltype&li,
|
||||||
extern Module::port_t* pform_module_port_reference(perm_string name,
|
extern Module::port_t* pform_module_port_reference(perm_string name,
|
||||||
const char*file,
|
const char*file,
|
||||||
unsigned lineno);
|
unsigned lineno);
|
||||||
extern void pform_endmodule(const char*);
|
extern void pform_endmodule(const char*, bool in_celldefine);
|
||||||
|
|
||||||
extern void pform_make_udp(perm_string name, list<perm_string>*parms,
|
extern void pform_make_udp(perm_string name, list<perm_string>*parms,
|
||||||
svector<PWire*>*decl, list<string>*table,
|
svector<PWire*>*decl, list<string>*table,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1998-2008 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 1998-2009 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -1147,7 +1147,9 @@ void Module::dump(ostream&out) const
|
||||||
out << " *) ";
|
out << " *) ";
|
||||||
}
|
}
|
||||||
|
|
||||||
out << "module " << mod_name() << ";" << endl;
|
out << "module " << mod_name() << ";";
|
||||||
|
if (is_cell) out << " // Is in `celldefine.";
|
||||||
|
out << endl;
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < ports.size() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < ports.size() ; idx += 1) {
|
||||||
port_t*cur = ports[idx];
|
port_t*cur = ports[idx];
|
||||||
|
|
|
||||||
|
|
@ -1655,6 +1655,12 @@ extern "C" unsigned ivl_scope_is_auto(ivl_scope_t net)
|
||||||
return net->is_auto;
|
return net->is_auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" unsigned ivl_scope_is_cell(ivl_scope_t net)
|
||||||
|
{
|
||||||
|
assert(net);
|
||||||
|
return net->is_cell;
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" unsigned ivl_scope_lineno(ivl_scope_t net)
|
extern "C" unsigned ivl_scope_lineno(ivl_scope_t net)
|
||||||
{
|
{
|
||||||
assert(net);
|
assert(net);
|
||||||
|
|
|
||||||
1
t-dll.cc
1
t-dll.cc
|
|
@ -2389,6 +2389,7 @@ void dll_target::scope(const NetScope*net)
|
||||||
scop->nattr = net->attr_cnt();
|
scop->nattr = net->attr_cnt();
|
||||||
scop->attr = fill_in_attributes(net);
|
scop->attr = fill_in_attributes(net);
|
||||||
scop->is_auto = net->is_auto();
|
scop->is_auto = net->is_auto();
|
||||||
|
scop->is_cell = net->is_cell();
|
||||||
|
|
||||||
switch (net->type()) {
|
switch (net->type()) {
|
||||||
case NetScope::MODULE:
|
case NetScope::MODULE:
|
||||||
|
|
|
||||||
2
t-dll.h
2
t-dll.h
|
|
@ -606,6 +606,8 @@ struct ivl_scope_s {
|
||||||
ivl_statement_t def;
|
ivl_statement_t def;
|
||||||
unsigned is_auto;
|
unsigned is_auto;
|
||||||
|
|
||||||
|
unsigned is_cell;
|
||||||
|
|
||||||
unsigned ports;
|
unsigned ports;
|
||||||
ivl_signal_t*port;
|
ivl_signal_t*port;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1533,7 +1533,8 @@ static int show_scope(ivl_scope_t net, void*x)
|
||||||
is_auto = ivl_scope_is_auto(net) ? "automatic " : "";
|
is_auto = ivl_scope_is_auto(net) ? "automatic " : "";
|
||||||
switch (ivl_scope_type(net)) {
|
switch (ivl_scope_type(net)) {
|
||||||
case IVL_SCT_MODULE:
|
case IVL_SCT_MODULE:
|
||||||
fprintf(out, " module %s", ivl_scope_tname(net));
|
fprintf(out, " module %s%s", ivl_scope_tname(net),
|
||||||
|
ivl_scope_is_cell(net) ? " (cell)" : "");
|
||||||
break;
|
break;
|
||||||
case IVL_SCT_FUNCTION:
|
case IVL_SCT_FUNCTION:
|
||||||
fprintf(out, " function %s%s", is_auto, ivl_scope_tname(net));
|
fprintf(out, " function %s%s", is_auto, ivl_scope_tname(net));
|
||||||
|
|
|
||||||
|
|
@ -1825,9 +1825,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
||||||
ivl_scope_lineno(net));
|
ivl_scope_lineno(net));
|
||||||
|
|
||||||
if (parent) {
|
if (parent) {
|
||||||
fprintf(vvp_out, ", %d %d, S_%p;\n",
|
fprintf(vvp_out, ", %d %d %u, S_%p;\n",
|
||||||
ivl_file_table_index(ivl_scope_def_file(net)),
|
ivl_file_table_index(ivl_scope_def_file(net)),
|
||||||
ivl_scope_def_lineno(net), parent);
|
ivl_scope_def_lineno(net), ivl_scope_is_cell(net), parent);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
fprintf(vvp_out, ";\n");
|
fprintf(vvp_out, ";\n");
|
||||||
|
|
|
||||||
51
vpi_user.h
51
vpi_user.h
|
|
@ -304,33 +304,34 @@ typedef struct t_vpi_delay {
|
||||||
#define vpiCallback 1000
|
#define vpiCallback 1000
|
||||||
|
|
||||||
/* PROPERTIES */
|
/* PROPERTIES */
|
||||||
#define vpiUndefined (-1)
|
#define vpiUndefined (-1)
|
||||||
#define vpiType 1
|
#define vpiType 1
|
||||||
#define vpiName 2
|
#define vpiName 2
|
||||||
#define vpiFullName 3
|
#define vpiFullName 3
|
||||||
#define vpiSize 4
|
#define vpiSize 4
|
||||||
#define vpiFile 5
|
#define vpiFile 5
|
||||||
#define vpiLineNo 6
|
#define vpiLineNo 6
|
||||||
#define vpiTopModule 7
|
#define vpiTopModule 7
|
||||||
#define vpiDefName 9
|
#define vpiCellInstance 8
|
||||||
|
#define vpiDefName 9
|
||||||
#define vpiTimeUnit 11
|
#define vpiTimeUnit 11
|
||||||
#define vpiTimePrecision 12
|
#define vpiTimePrecision 12
|
||||||
#define vpiDefFile 15
|
#define vpiDefFile 15
|
||||||
#define vpiDefLineNo 16
|
#define vpiDefLineNo 16
|
||||||
#define vpiNetType 22
|
#define vpiNetType 22
|
||||||
# define vpiWire 1
|
# define vpiWire 1
|
||||||
#define vpiArray 28
|
#define vpiArray 28
|
||||||
#define vpiEdge 36
|
#define vpiEdge 36
|
||||||
# define vpiNoEdge 0x00 /* No edge */
|
# define vpiNoEdge 0x00 /* No edge */
|
||||||
# define vpiEdge01 0x01 /* 0 --> 1 */
|
# define vpiEdge01 0x01 /* 0 --> 1 */
|
||||||
# define vpiEdge10 0x02 /* 1 --> 0 */
|
# define vpiEdge10 0x02 /* 1 --> 0 */
|
||||||
# define vpiEdge0x 0x04 /* 0 --> x */
|
# define vpiEdge0x 0x04 /* 0 --> x */
|
||||||
# define vpiEdgex1 0x08 /* x --> 1 */
|
# define vpiEdgex1 0x08 /* x --> 1 */
|
||||||
# define vpiEdge1x 0x10 /* 1 --> x */
|
# define vpiEdge1x 0x10 /* 1 --> x */
|
||||||
# define vpiEdgex0 0x20 /* x --> 0 */
|
# define vpiEdgex0 0x20 /* x --> 0 */
|
||||||
# define vpiPosedge (vpiEdgex1|vpiEdge01|vpiEdge0x)
|
# define vpiPosedge (vpiEdgex1|vpiEdge01|vpiEdge0x)
|
||||||
# define vpiNegedge (vpiEdgex0|vpiEdge10|vpiEdge1x)
|
# define vpiNegedge (vpiEdgex0|vpiEdge10|vpiEdge1x)
|
||||||
# define vpiAnyEdge (vpiPosedge|vpiNegedge)
|
# define vpiAnyEdge (vpiPosedge|vpiNegedge)
|
||||||
#define vpiConstType 40
|
#define vpiConstType 40
|
||||||
# define vpiDecConst 1
|
# define vpiDecConst 1
|
||||||
# define vpiRealConst 2
|
# define vpiRealConst 2
|
||||||
|
|
|
||||||
|
|
@ -414,7 +414,8 @@ extern void compile_codelabel(char*label);
|
||||||
*/
|
*/
|
||||||
extern void compile_scope_decl(char*typ, char*lab, char*nam, char*tnam,
|
extern void compile_scope_decl(char*typ, char*lab, char*nam, char*tnam,
|
||||||
char*par, long file_idx, long lineno,
|
char*par, long file_idx, long lineno,
|
||||||
long def_file_idx, long def_lineno);
|
long def_file_idx, long def_lineno,
|
||||||
|
long is_cell);
|
||||||
extern void compile_scope_recall(char*sym);
|
extern void compile_scope_recall(char*sym);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
10
vvp/parse.y
10
vvp/parse.y
|
|
@ -574,19 +574,19 @@ statement
|
||||||
parent scope, then this is a root scope. */
|
parent scope, then this is a root scope. */
|
||||||
|
|
||||||
| T_LABEL K_SCOPE T_SYMBOL ',' T_STRING T_STRING T_NUMBER T_NUMBER ';'
|
| T_LABEL K_SCOPE T_SYMBOL ',' T_STRING T_STRING T_NUMBER T_NUMBER ';'
|
||||||
{ compile_scope_decl($1, $3, $5, $6, 0, $7, $8, $7, $8); }
|
{ compile_scope_decl($1, $3, $5, $6, 0, $7, $8, $7, $8, 0); }
|
||||||
|
|
||||||
| T_LABEL K_SCOPE T_SYMBOL ',' T_STRING T_STRING T_NUMBER T_NUMBER ','
|
| T_LABEL K_SCOPE T_SYMBOL ',' T_STRING T_STRING T_NUMBER T_NUMBER ','
|
||||||
T_NUMBER T_NUMBER ',' T_SYMBOL ';'
|
T_NUMBER T_NUMBER T_NUMBER ',' T_SYMBOL ';'
|
||||||
{ compile_scope_decl($1, $3, $5, $6, $13, $7, $8, $10, $11); }
|
{ compile_scope_decl($1, $3, $5, $6, $14, $7, $8, $10, $11, $12); }
|
||||||
|
|
||||||
/* XXXX Legacy declaration has no type name. */
|
/* XXXX Legacy declaration has no type name. */
|
||||||
|
|
||||||
| T_LABEL K_SCOPE T_SYMBOL ',' T_STRING ';'
|
| T_LABEL K_SCOPE T_SYMBOL ',' T_STRING ';'
|
||||||
{ compile_scope_decl($1, $3, $5, 0, 0, 0, 0, 0, 0); }
|
{ compile_scope_decl($1, $3, $5, 0, 0, 0, 0, 0, 0, 0); }
|
||||||
|
|
||||||
| T_LABEL K_SCOPE T_SYMBOL ',' T_STRING ',' T_SYMBOL ';'
|
| T_LABEL K_SCOPE T_SYMBOL ',' T_STRING ',' T_SYMBOL ';'
|
||||||
{ compile_scope_decl($1, $3, $5, 0, $7, 0, 0, 0, 0); }
|
{ compile_scope_decl($1, $3, $5, 0, $7, 0, 0, 0, 0, 0); }
|
||||||
|
|
||||||
/* Scope recall has no label of its own, but refers by label to a
|
/* Scope recall has no label of its own, but refers by label to a
|
||||||
declared scope. */
|
declared scope. */
|
||||||
|
|
|
||||||
11
vvp/stop.cc
11
vvp/stop.cc
|
|
@ -478,6 +478,13 @@ static void invoke_command(char*txt)
|
||||||
delete[]argv;
|
delete[]argv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void invoke_command_const(const char*txt)
|
||||||
|
{
|
||||||
|
char *vtxt = strdup(txt);
|
||||||
|
invoke_command(vtxt);
|
||||||
|
free(vtxt);
|
||||||
|
}
|
||||||
|
|
||||||
void stop_handler(int rc)
|
void stop_handler(int rc)
|
||||||
{
|
{
|
||||||
/* The user may be running in a non-interactive environment, so
|
/* The user may be running in a non-interactive environment, so
|
||||||
|
|
@ -489,8 +496,8 @@ void stop_handler(int rc)
|
||||||
|
|
||||||
vpi_mcd_printf(1,"** VVP Stop(%d) **\n", rc);
|
vpi_mcd_printf(1,"** VVP Stop(%d) **\n", rc);
|
||||||
vpi_mcd_printf(1,"** Flushing output streams.\n");
|
vpi_mcd_printf(1,"** Flushing output streams.\n");
|
||||||
invoke_command("$fflush");
|
invoke_command_const("$fflush");
|
||||||
invoke_command("$dumpflush");
|
invoke_command_const("$dumpflush");
|
||||||
vpi_mcd_printf(1,"** Current simulation time is %" TIME_FMT_U " ticks.\n",
|
vpi_mcd_printf(1,"** Current simulation time is %" TIME_FMT_U " ticks.\n",
|
||||||
schedule_simtime());
|
schedule_simtime());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,7 @@ struct __vpiScope {
|
||||||
unsigned def_file_idx;
|
unsigned def_file_idx;
|
||||||
unsigned def_lineno;
|
unsigned def_lineno;
|
||||||
bool is_automatic;
|
bool is_automatic;
|
||||||
|
bool is_cell;
|
||||||
/* The scope has a system time of its own. */
|
/* The scope has a system time of its own. */
|
||||||
struct __vpiSystemTime scoped_time;
|
struct __vpiSystemTime scoped_time;
|
||||||
struct __vpiSystemTime scoped_stime;
|
struct __vpiSystemTime scoped_stime;
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,9 @@ static int scope_get(int code, vpiHandle obj)
|
||||||
assert(handle_is_scope(obj));
|
assert(handle_is_scope(obj));
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
case vpiCellInstance:
|
||||||
|
return (int) ref->is_cell;
|
||||||
|
|
||||||
case vpiDefLineNo:
|
case vpiDefLineNo:
|
||||||
return ref->def_lineno;
|
return ref->def_lineno;
|
||||||
|
|
||||||
|
|
@ -395,7 +398,7 @@ static void attach_to_scope_(struct __vpiScope*scope, vpiHandle obj)
|
||||||
void
|
void
|
||||||
compile_scope_decl(char*label, char*type, char*name, char*tname,
|
compile_scope_decl(char*label, char*type, char*name, char*tname,
|
||||||
char*parent, long file_idx, long lineno,
|
char*parent, long file_idx, long lineno,
|
||||||
long def_file_idx, long def_lineno)
|
long def_file_idx, long def_lineno, long is_cell)
|
||||||
{
|
{
|
||||||
struct __vpiScope*scope = new struct __vpiScope;
|
struct __vpiScope*scope = new struct __vpiScope;
|
||||||
count_vpi_scopes += 1;
|
count_vpi_scopes += 1;
|
||||||
|
|
@ -409,6 +412,9 @@ compile_scope_decl(char*label, char*type, char*name, char*tname,
|
||||||
base_type = &type[0];
|
base_type = &type[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_cell) scope->is_cell = true;
|
||||||
|
else scope->is_cell = false;
|
||||||
|
|
||||||
if (strcmp(base_type,"module") == 0) {
|
if (strcmp(base_type,"module") == 0) {
|
||||||
scope->base.vpi_type = &vpip_scope_module_rt;
|
scope->base.vpi_type = &vpip_scope_module_rt;
|
||||||
} else if (strcmp(base_type,"function") == 0) {
|
} else if (strcmp(base_type,"function") == 0) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue