Add functionality to alias an individual word of an array.

This patch adds the functionality to alias an individual word
of an array.
This commit is contained in:
Cary R 2008-03-20 13:07:18 -07:00 committed by Stephen Williams
parent 04e8623ed6
commit bb14ac1fe0
7 changed files with 81 additions and 23 deletions

View File

@ -1120,19 +1120,31 @@ static void draw_net_in_scope(ivl_signal_t sig)
discover that the entire array can be collapsed, discover that the entire array can be collapsed,
so the word count for the signal and the alias so the word count for the signal and the alias
*must* match. */ *must* match. */
assert(word_count == ivl_signal_array_count(nex_data->net));
if (iword == 0) { if (word_count == ivl_signal_array_count(nex_data->net)) {
fprintf(vvp_out, "v%p .array \"%s\", v%p; Alias to %s\n", if (iword == 0) {
sig, vvp_mangle_name(ivl_signal_basename(sig)), fprintf(vvp_out, "v%p .array \"%s\", v%p; Alias to %s\n",
nex_data->net, ivl_signal_basename(nex_data->net)); sig, vvp_mangle_name(ivl_signal_basename(sig)),
nex_data->net,
ivl_signal_basename(nex_data->net));
}
/* An alias for an individual word. */
} else {
if (iword == 0) {
int first = ivl_signal_array_base(sig);
int last = first + word_count-1;
fprintf(vvp_out, "v%p .array \"%s\", %d %d;\n",
sig,
vvp_mangle_name(ivl_signal_basename(sig)),
last, first);
}
fprintf(vvp_out, "v%p_%u .alias%s v%p %u, %d %d, "
"v%p_%u; Alias to %s\n", sig, iword,
datatype_flag, sig, iword, msb, lsb,
nex_data->net, nex_data->net_word,
ivl_signal_basename(nex_data->net));
} }
/* An alias for the individual words? */
#if 0
fprintf(vvp_out, "v%p_%u .alias%s v%p, %d %d, v%p_%u;\n",
sig, iword, datatype_flag, sig,
msb, lsb, nex_data->net, nex_data->net_word);
#endif
} else { } else {
/* Finally, we may have an alias that is a word /* Finally, we may have an alias that is a word
connected to another word. Again, this is a connected to another word. Again, this is a

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2007 Stephen Williams (steve@icarus.com) * Copyright (c) 2007-2008 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
@ -16,9 +16,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: array.cc,v 1.2 2007/04/10 01:26:16 steve Exp $"
#endif
# include "array.h" # include "array.h"
#include "symbols.h" #include "symbols.h"
@ -345,6 +342,12 @@ static vpiHandle vpip_make_array(char*label, const char*name,
return &(obj->base); return &(obj->base);
} }
void array_alias_word(vvp_array_t array, unsigned long addr, vpiHandle word)
{
assert(addr < array->array_count);
array->words[addr] = word;
}
void array_attach_word(vvp_array_t array, unsigned long addr, vpiHandle word) void array_attach_word(vvp_array_t array, unsigned long addr, vpiHandle word)
{ {
assert(addr < array->array_count); assert(addr < array->array_count);
@ -546,4 +549,3 @@ void compile_array_alias(char*label, char*name, char*src)
free(name); free(name);
free(src); free(src);
} }

View File

@ -1,7 +1,7 @@
#ifndef __array_H // -*- c++ -*- #ifndef __array_H // -*- c++ -*-
#define __array_H #define __array_H
/* /*
* Copyright (c) 2007 Stephen Williams (steve@icarus.com) * Copyright (c) 2007-2008 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
@ -18,9 +18,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: array.h,v 1.2 2007/04/10 01:26:16 steve Exp $"
#endif
#include "vvp_net.h" #include "vvp_net.h"
#include "vpi_user.h" #include "vpi_user.h"
@ -36,7 +33,10 @@ extern vpiHandle array_index_iterate(int code, vpiHandle ref);
extern void array_word_change(vvp_array_t array, unsigned long addr); extern void array_word_change(vvp_array_t array, unsigned long addr);
extern void array_attach_word(vvp_array_t array, unsigned long addr, vpiHandle word); extern void array_attach_word(vvp_array_t array, unsigned long addr,
vpiHandle word);
extern void array_alias_word(vvp_array_t array, unsigned long addr,
vpiHandle word);
extern void array_set_word(vvp_array_t arr, extern void array_set_word(vvp_array_t arr,
unsigned idx, unsigned idx,

View File

@ -247,6 +247,13 @@ static vvp_net_t*lookup_functor_symbol(const char*label)
return val.net; return val.net;
} }
vpiHandle vvp_lookup_handle(const char*label)
{
symbol_value_t val = sym_get_value(sym_vpi, label);
if (val.ptr) return (vpiHandle) val.ptr;
return 0;
}
vvp_net_t* vvp_net_lookup(const char*label) vvp_net_t* vvp_net_lookup(const char*label)
{ {
/* First, look to see if the symbol is a vpi object of some /* First, look to see if the symbol is a vpi object of some

View File

@ -72,6 +72,7 @@ extern void wide_inputs_connect(vvp_wide_fun_core*core,
unsigned argc, struct symb_s*argv); unsigned argc, struct symb_s*argv);
extern vvp_net_t* vvp_net_lookup(const char*label); extern vvp_net_t* vvp_net_lookup(const char*label);
extern vpiHandle vvp_lookup_handle(const char*label);
/* /*
* Add a functor to the symbol table * Add a functor to the symbol table
@ -408,5 +409,8 @@ extern void compile_alias(char*label, char*name,
extern void compile_alias_real(char*label, char*name, extern void compile_alias_real(char*label, char*name,
int msb, int lsb, int msb, int lsb,
unsigned argc, struct symb_s*argv); unsigned argc, struct symb_s*argv);
extern void compile_aliasw(char*label, char*array_symbol,
unsigned long array_addr, int msb, int lsb,
unsigned argc, struct symb_s*argv);
#endif #endif

View File

@ -642,6 +642,18 @@ statement
symbols_net ';' symbols_net ';'
{ compile_netw($1, $3, $4, $6, $7, true, true, $9.cnt, $9.vect); } { compile_netw($1, $3, $4, $6, $7, true, true, $9.cnt, $9.vect); }
/* Array word versions of alias directives. */
| T_LABEL K_ALIAS T_SYMBOL T_NUMBER ','
signed_t_number signed_t_number ','
symbols_net ';'
{ compile_aliasw($1, $3, $4, $6, $7, $9.cnt, $9.vect); }
| T_LABEL K_ALIAS_R T_SYMBOL T_NUMBER ','
signed_t_number signed_t_number ','
symbols_net ';'
{ compile_aliasw($1, $3, $4, $6, $7, $9.cnt, $9.vect); }
/* Parameter statements come in a few simple forms. The most basic /* Parameter statements come in a few simple forms. The most basic
is the string parameter. */ is the string parameter. */

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003-2007 Stephen Williams (steve@icarus.com) * Copyright (c) 2003-2008 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
@ -234,6 +234,28 @@ void compile_net_real(char*label, char*name, int msb, int lsb, bool local_flag,
free(argv); free(argv);
} }
void compile_aliasw(char*label, char*array_label, unsigned long array_addr,
int msb, int lsb, unsigned argc, struct symb_s*argv)
{
vvp_array_t array = array_find(array_label);
assert(array);
assert(argc == 1);
vvp_net_t*node = vvp_net_lookup(argv[0].text);
/* Add the label into the functor symbol table. */
define_functor_symbol(label, node);
vpiHandle obj = vvp_lookup_handle(argv[0].text);
assert(obj);
array_alias_word(array, array_addr, obj);
free(label);
free(array_label);
free(argv[0].text);
free(argv);
}
void compile_alias(char*label, char*name, int msb, int lsb, bool signed_flag, void compile_alias(char*label, char*name, int msb, int lsb, bool signed_flag,
unsigned argc, struct symb_s*argv) unsigned argc, struct symb_s*argv)
{ {
@ -277,4 +299,3 @@ void compile_alias_real(char*label, char*name, int msb, int lsb,
free(argv[0].text); free(argv[0].text);
free(argv); free(argv);
} }