Add support for system function table files.
This commit is contained in:
parent
a0ed5e9e29
commit
28719e8584
12
compiler.h
12
compiler.h
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: compiler.h,v 1.21 2004/03/09 04:29:42 steve Exp $"
|
#ident "$Id: compiler.h,v 1.22 2004/03/10 04:51:24 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <list>
|
# include <list>
|
||||||
|
|
@ -128,9 +128,13 @@ struct sfunc_return_type {
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct sfunc_return_type* lookup_sys_func(const char*name);
|
extern const struct sfunc_return_type* lookup_sys_func(const char*name);
|
||||||
|
extern int load_sys_func_table(const char*path);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compiler.h,v $
|
* $Log: compiler.h,v $
|
||||||
|
* Revision 1.22 2004/03/10 04:51:24 steve
|
||||||
|
* Add support for system function table files.
|
||||||
|
*
|
||||||
* Revision 1.21 2004/03/09 04:29:42 steve
|
* Revision 1.21 2004/03/09 04:29:42 steve
|
||||||
* Separate out the lookup_sys_func table, for eventual
|
* Separate out the lookup_sys_func table, for eventual
|
||||||
* support for function type tables.
|
* support for function type tables.
|
||||||
|
|
@ -154,11 +158,5 @@ extern const struct sfunc_return_type* lookup_sys_func(const char*name);
|
||||||
* scope names and system task/function names
|
* scope names and system task/function names
|
||||||
* into this table. Also, permallocate event
|
* into this table. Also, permallocate event
|
||||||
* names from the beginning.
|
* names from the beginning.
|
||||||
*
|
|
||||||
* Revision 1.15 2003/02/22 04:12:49 steve
|
|
||||||
* Add the portbind warning.
|
|
||||||
*
|
|
||||||
* Revision 1.14 2003/01/30 16:23:07 steve
|
|
||||||
* Spelling fixes.
|
|
||||||
*/
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
.TH iverilog 1 "$Date: 2003/11/26 01:36:25 $" Version "$Date: 2003/11/26 01:36:25 $"
|
.TH iverilog 1 "$Date: 2004/03/10 04:51:25 $" Version "$Date: 2004/03/10 04:51:25 $"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
iverilog - Icarus Verilog compiler
|
iverilog - Icarus Verilog compiler
|
||||||
|
|
||||||
|
|
@ -212,6 +212,33 @@ inherit timescale from another file. Both probably mean that
|
||||||
timescales are inconsistent, and simulation timing can be confusing
|
timescales are inconsistent, and simulation timing can be confusing
|
||||||
and dependent on compilation order.
|
and dependent on compilation order.
|
||||||
|
|
||||||
|
.SH "SYSTEM FUNCTION TABLE FILES"
|
||||||
|
If the source file name as a \fB.sft\fP suffix, then it is taken to be
|
||||||
|
a system function table file. A System function table file is used to
|
||||||
|
describe to the compiler the return types for system functions. This
|
||||||
|
is necessary because the compiler needs this information to elaborate
|
||||||
|
expressions that contain these system functions, but cannot run the
|
||||||
|
sizetf functions since it has no run-time.
|
||||||
|
|
||||||
|
The format of the table is ASCII, one function per line. Empty lines
|
||||||
|
are ignored, and lines that start with the '\fI#\fP' character are
|
||||||
|
comment lines. Each non-comment line starts with the function name,
|
||||||
|
then the vpi type (i.e. vpiSysFuncReal). The following types are
|
||||||
|
supported:
|
||||||
|
|
||||||
|
.TP 8
|
||||||
|
.B vpiSysFuncReal
|
||||||
|
The function returns a real/realtime value.
|
||||||
|
|
||||||
|
.TP 8
|
||||||
|
.B vpiSysFuncInt
|
||||||
|
The function returns an integer.
|
||||||
|
|
||||||
|
.TP 8
|
||||||
|
.B vpiSysFuncSized <wid> <signed|unsigned>
|
||||||
|
The function returns a vector with the given width, and is signed or
|
||||||
|
unsigned according to the flag.
|
||||||
|
|
||||||
.SH "COMMAND FILES"
|
.SH "COMMAND FILES"
|
||||||
The command file allows the user to place source file names and
|
The command file allows the user to place source file names and
|
||||||
certain command line switches into a text file instead of on a long
|
certain command line switches into a text file instead of on a long
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: main.c,v 1.63 2004/02/15 18:03:30 steve Exp $"
|
#ident "$Id: main.c,v 1.64 2004/03/10 04:51:25 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -368,10 +368,21 @@ void process_define(const char*name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is called while processing a file name in a command
|
||||||
|
* file, or a file name on the command line. Look to see if there is a
|
||||||
|
* .sft suffix, and if so pass that as a sys_func file. Otherwise, it
|
||||||
|
* is a Verilog source file to be written into the file list.
|
||||||
|
*/
|
||||||
void process_file_name(const char*name)
|
void process_file_name(const char*name)
|
||||||
{
|
{
|
||||||
fprintf(source_file, "%s\n", name);
|
if (strlen(name) > 4 && strcasecmp(".sft", name+strlen(name)-4) == 0) {
|
||||||
source_count += 1;
|
fprintf(iconfig_file,"sys_func:%s\n", name);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
fprintf(source_file, "%s\n", name);
|
||||||
|
source_count += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int process_generation(const char*name)
|
int process_generation(const char*name)
|
||||||
|
|
@ -714,6 +725,9 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: main.c,v $
|
* $Log: main.c,v $
|
||||||
|
* Revision 1.64 2004/03/10 04:51:25 steve
|
||||||
|
* Add support for system function table files.
|
||||||
|
*
|
||||||
* Revision 1.63 2004/02/15 18:03:30 steve
|
* Revision 1.63 2004/02/15 18:03:30 steve
|
||||||
* Cleanup of warnings.
|
* Cleanup of warnings.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
11
main.cc
11
main.cc
|
|
@ -19,7 +19,7 @@ const char COPYRIGHT[] =
|
||||||
* 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
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: main.cc,v 1.81 2004/02/18 17:11:56 steve Exp $"
|
#ident "$Id: main.cc,v 1.82 2004/03/10 04:51:24 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -250,6 +250,9 @@ static void parm_to_flagmap(const string&flag)
|
||||||
* out:<path>
|
* out:<path>
|
||||||
* Path to the output file.
|
* Path to the output file.
|
||||||
*
|
*
|
||||||
|
* sys_func:<path>
|
||||||
|
* Path to a system functions descriptor table
|
||||||
|
*
|
||||||
* root:<name>
|
* root:<name>
|
||||||
* Specify a root module. There may be multiple of this.
|
* Specify a root module. There may be multiple of this.
|
||||||
*
|
*
|
||||||
|
|
@ -333,6 +336,9 @@ static void read_iconfig_file(const char*ipath)
|
||||||
} else if (strcmp(buf, "out") == 0) {
|
} else if (strcmp(buf, "out") == 0) {
|
||||||
flags["-o"] = strdup(cp);
|
flags["-o"] = strdup(cp);
|
||||||
|
|
||||||
|
} else if (strcmp(buf, "sys_func") == 0) {
|
||||||
|
load_sys_func_table(cp);
|
||||||
|
|
||||||
} else if (strcmp(buf, "root") == 0) {
|
} else if (strcmp(buf, "root") == 0) {
|
||||||
roots.push_back(lex_strings.make(cp));
|
roots.push_back(lex_strings.make(cp));
|
||||||
|
|
||||||
|
|
@ -716,6 +722,9 @@ int main(int argc, char*argv[])
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: main.cc,v $
|
* $Log: main.cc,v $
|
||||||
|
* Revision 1.82 2004/03/10 04:51:24 steve
|
||||||
|
* Add support for system function table files.
|
||||||
|
*
|
||||||
* Revision 1.81 2004/02/18 17:11:56 steve
|
* Revision 1.81 2004/02/18 17:11:56 steve
|
||||||
* Use perm_strings for named langiage items.
|
* Use perm_strings for named langiage items.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
134
sys_funcs.cc
134
sys_funcs.cc
|
|
@ -16,7 +16,7 @@
|
||||||
* 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
|
||||||
*/
|
*/
|
||||||
#ident "$Id: sys_funcs.cc,v 1.1 2004/03/09 04:29:42 steve Exp $"
|
#ident "$Id: sys_funcs.cc,v 1.2 2004/03/10 04:51:24 steve Exp $"
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
# include "compiler.h"
|
# include "compiler.h"
|
||||||
|
|
@ -38,11 +38,25 @@ static const struct sfunc_return_type sfunc_table[] = {
|
||||||
{ 0, NetExpr::ET_VECTOR, 32, 0 }
|
{ 0, NetExpr::ET_VECTOR, 32, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct sfunc_return_type_cell : sfunc_return_type {
|
||||||
|
struct sfunc_return_type_cell*next;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct sfunc_return_type_cell*sfunc_stack = 0;
|
||||||
|
|
||||||
const struct sfunc_return_type* lookup_sys_func(const char*name)
|
const struct sfunc_return_type* lookup_sys_func(const char*name)
|
||||||
{
|
{
|
||||||
unsigned idx = 0;
|
/* First, try to find then name in the function stack. */
|
||||||
|
struct sfunc_return_type_cell*cur = sfunc_stack;
|
||||||
|
while (cur) {
|
||||||
|
if (strcmp(cur->name, name) == 0)
|
||||||
|
return cur;
|
||||||
|
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next, look in the core table. */
|
||||||
|
unsigned idx = 0;
|
||||||
while (sfunc_table[idx].name) {
|
while (sfunc_table[idx].name) {
|
||||||
|
|
||||||
if (strcmp(sfunc_table[idx].name, name) == 0)
|
if (strcmp(sfunc_table[idx].name, name) == 0)
|
||||||
|
|
@ -51,18 +65,130 @@ const struct sfunc_return_type* lookup_sys_func(const char*name)
|
||||||
idx += 1;
|
idx += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No luch finding, so return the trailer, which give a
|
/* No luck finding, so return the trailer, which give a
|
||||||
default description. */
|
default description. */
|
||||||
return sfunc_table + idx;
|
return sfunc_table + idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function loads a system functions descriptor file with the
|
||||||
|
* format:
|
||||||
|
*
|
||||||
|
* <name> <type> [<arguments>]
|
||||||
|
*/
|
||||||
|
int load_sys_func_table(const char*path)
|
||||||
|
{
|
||||||
|
struct sfunc_return_type_cell*cell;
|
||||||
|
FILE*fd = fopen(path, "r");
|
||||||
|
|
||||||
|
if (fd == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
char buf[256];
|
||||||
|
while (fgets(buf, sizeof buf, fd)) {
|
||||||
|
char*name = buf + strspn(buf, " \t\r\n");
|
||||||
|
|
||||||
|
/* Skip empty lines. */
|
||||||
|
if (name[0] == 0)
|
||||||
|
continue;
|
||||||
|
/* Skip comment lines. */
|
||||||
|
if (name[0] == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
char*cp = name + strcspn(name, " \t\r\n");
|
||||||
|
if (cp[0]) *cp++ = 0;
|
||||||
|
|
||||||
|
cp += strspn(cp, " \t\r\n");
|
||||||
|
|
||||||
|
char*stype = cp;
|
||||||
|
if (stype[0] == 0) {
|
||||||
|
fprintf(stderr, "%s:%s: No function type?\n",
|
||||||
|
path, name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cp = stype + strcspn(stype, " \t\r\n");
|
||||||
|
if (cp[0]) *cp++ = 0;
|
||||||
|
|
||||||
|
if (strcmp(stype,"vpiSysFuncReal") == 0) {
|
||||||
|
cell = new struct sfunc_return_type_cell;
|
||||||
|
cell->name = lex_strings.add(name);
|
||||||
|
cell->type = NetExpr::ET_REAL;
|
||||||
|
cell->wid = 0;
|
||||||
|
cell->signed_flag = true;
|
||||||
|
cell->next = sfunc_stack;
|
||||||
|
sfunc_stack = cell;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(stype,"vpiSysFuncInt") == 0) {
|
||||||
|
cell = new struct sfunc_return_type_cell;
|
||||||
|
cell->name = lex_strings.add(name);
|
||||||
|
cell->type = NetExpr::ET_VECTOR;
|
||||||
|
cell->wid = 32;
|
||||||
|
cell->signed_flag = true;
|
||||||
|
cell->next = sfunc_stack;
|
||||||
|
sfunc_stack = cell;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If this is a sized integer, then parse the additional
|
||||||
|
arguments, the width (decimal) and the optional
|
||||||
|
signed/unsigned flag. */
|
||||||
|
if (strcmp(stype,"vpiSysFuncSized") == 0) {
|
||||||
|
cp += strspn(cp, " \t\r\n");
|
||||||
|
char*swidth = cp;
|
||||||
|
unsigned width = 32;
|
||||||
|
bool signed_flag = false;
|
||||||
|
|
||||||
|
cp = swidth + strcspn(swidth, " \t\r\n");
|
||||||
|
if (cp[0]) *cp++ = 0;
|
||||||
|
|
||||||
|
width = strtoul(swidth, 0, 10);
|
||||||
|
|
||||||
|
cp += strspn(cp, " \t\r\n");
|
||||||
|
char*flag = cp;
|
||||||
|
|
||||||
|
while (flag[0]) {
|
||||||
|
cp = flag + strcspn(flag, " \t\r\n");
|
||||||
|
if (cp[0]) *cp++ = 0;
|
||||||
|
|
||||||
|
if (strcmp(flag,"signed") == 0) {
|
||||||
|
signed_flag = true;
|
||||||
|
|
||||||
|
} else if (strcmp(flag,"unsigned") == 0) {
|
||||||
|
signed_flag = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
flag = cp + strspn(cp, " \t\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
cell = new struct sfunc_return_type_cell;
|
||||||
|
cell->name = lex_strings.add(name);
|
||||||
|
cell->type = NetExpr::ET_VECTOR;
|
||||||
|
cell->wid = width;
|
||||||
|
cell->signed_flag = signed_flag;
|
||||||
|
cell->next = sfunc_stack;
|
||||||
|
sfunc_stack = cell;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "%s:%s: Unknown type: %s\n",
|
||||||
|
path, name, stype);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: sys_funcs.cc,v $
|
* $Log: sys_funcs.cc,v $
|
||||||
|
* Revision 1.2 2004/03/10 04:51:24 steve
|
||||||
|
* Add support for system function table files.
|
||||||
|
*
|
||||||
* Revision 1.1 2004/03/09 04:29:42 steve
|
* Revision 1.1 2004/03/09 04:29:42 steve
|
||||||
* Separate out the lookup_sys_func table, for eventual
|
* Separate out the lookup_sys_func table, for eventual
|
||||||
* support for function type tables.
|
* support for function type tables.
|
||||||
*
|
*
|
||||||
* Remove ipal compile flags.
|
* Remove ipal compile flags.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue