Merge branch 'master' into elaborate-net-rework
This commit is contained in:
commit
dd47599d55
|
|
@ -82,6 +82,8 @@ class Statement : public LineInfo {
|
||||||
virtual NetProc* elaborate(Design*des, NetScope*scope) const;
|
virtual NetProc* elaborate(Design*des, NetScope*scope) const;
|
||||||
virtual void elaborate_scope(Design*des, NetScope*scope) const;
|
virtual void elaborate_scope(Design*des, NetScope*scope) const;
|
||||||
virtual void elaborate_sig(Design*des, NetScope*scope) const;
|
virtual void elaborate_sig(Design*des, NetScope*scope) const;
|
||||||
|
|
||||||
|
map<perm_string,PExpr*> attributes;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
`ifdef CONSTANTS_VAMS
|
`ifdef CONSTANTS_VAMS
|
||||||
`else
|
`else
|
||||||
`define CONSTANTS_VAMS 1
|
`define CONSTANTS_VAMS 1
|
||||||
|
|
||||||
// M_ is a mathematical constant
|
// M_ is a mathematical constant
|
||||||
`define M_E 2.7182818284590452354
|
`define M_E 2.7182818284590452354
|
||||||
`define M_LOG2E 1.4426950408889634074
|
`define M_LOG2E 1.4426950408889634074
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ int cmdfile_stack_ptr = 0;
|
||||||
cflval.text = trim_trailing_white(yytext, 0);
|
cflval.text = trim_trailing_white(yytext, 0);
|
||||||
BEGIN(0);
|
BEGIN(0);
|
||||||
return TOK_STRING; }
|
return TOK_STRING; }
|
||||||
|
|
||||||
/* Fallback match. */
|
/* Fallback match. */
|
||||||
. { return yytext[0]; }
|
. { return yytext[0]; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -221,7 +221,7 @@ implies the synthesis \fB-S\fP flag.
|
||||||
.TP 8
|
.TP 8
|
||||||
.B vhdl
|
.B vhdl
|
||||||
This target produces a VHDL translation of the Verilog netlist. The
|
This target produces a VHDL translation of the Verilog netlist. The
|
||||||
output is a single file containing VHDL entities corresponding to
|
output is a single file containing VHDL entities corresponding to
|
||||||
the modules in the Verilog source code. Note that only a subset of
|
the modules in the Verilog source code. Note that only a subset of
|
||||||
the Verilog language is supported. See the wiki for more information.
|
the Verilog language is supported. See the wiki for more information.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -341,7 +341,7 @@ static int t_default(char*cmd, unsigned ncmd)
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Command signaled: %s\n", cmd);
|
fprintf(stderr, "Command signaled: %s\n", cmd);
|
||||||
rtn = -1;
|
rtn = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(cmd);
|
free(cmd);
|
||||||
|
|
@ -523,7 +523,7 @@ int process_generation(const char*name)
|
||||||
void add_sft_file(const char *module)
|
void add_sft_file(const char *module)
|
||||||
{
|
{
|
||||||
char *file;
|
char *file;
|
||||||
|
|
||||||
file = (char *) malloc(strlen(base)+1+strlen(module)+4+1);
|
file = (char *) malloc(strlen(base)+1+strlen(module)+4+1);
|
||||||
sprintf(file, "%s%c%s.sft", base, sep, module);
|
sprintf(file, "%s%c%s.sft", base, sep, module);
|
||||||
if (access(file, R_OK) == 0)
|
if (access(file, R_OK) == 0)
|
||||||
|
|
@ -654,7 +654,7 @@ int main(int argc, char **argv)
|
||||||
case 'c':
|
case 'c':
|
||||||
case 'f':
|
case 'f':
|
||||||
add_cmd_file(optarg);
|
add_cmd_file(optarg);
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
process_define(optarg);
|
process_define(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
@ -673,9 +673,9 @@ int main(int argc, char **argv)
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
fprintf(stderr, "%s\n", HELP);
|
fprintf(stderr, "%s\n", HELP);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case 'I':
|
case 'I':
|
||||||
process_include_dir(optarg);
|
process_include_dir(optarg);
|
||||||
|
|
|
||||||
|
|
@ -682,7 +682,7 @@ NetExpr* PECallFunction::elaborate_sfunc_(Design*des, NetScope*scope, int expr_w
|
||||||
/* Elaborate the sub-expression to get its
|
/* Elaborate the sub-expression to get its
|
||||||
self-determined width, and save that width. Then
|
self-determined width, and save that width. Then
|
||||||
delete the expression because we don't really want
|
delete the expression because we don't really want
|
||||||
the expression itself. */
|
the expression itself. */
|
||||||
long sub_expr_width = 0;
|
long sub_expr_width = 0;
|
||||||
if (NetExpr*tmp = expr->elaborate_expr(des, scope, -1, true)) {
|
if (NetExpr*tmp = expr->elaborate_expr(des, scope, -1, true)) {
|
||||||
sub_expr_width = tmp->expr_width();
|
sub_expr_width = tmp->expr_width();
|
||||||
|
|
|
||||||
16
elab_net.cc
16
elab_net.cc
|
|
@ -394,7 +394,7 @@ static NetNet* compare_eq_constant(Design*des, NetScope*scope,
|
||||||
if (zeros > 0) {
|
if (zeros > 0) {
|
||||||
type = op_code == 'e'? NetUReduce::NOR : NetUReduce::OR;
|
type = op_code == 'e'? NetUReduce::NOR : NetUReduce::OR;
|
||||||
|
|
||||||
if (debug_elaborate)
|
if (debug_elaborate)
|
||||||
cerr << lsig->get_fileline() << ": debug: "
|
cerr << lsig->get_fileline() << ": debug: "
|
||||||
<< "Replace net==" << val << " equality with "
|
<< "Replace net==" << val << " equality with "
|
||||||
<< zeros << "-input reduction [N]OR gate." << endl;
|
<< zeros << "-input reduction [N]OR gate." << endl;
|
||||||
|
|
@ -402,7 +402,7 @@ static NetNet* compare_eq_constant(Design*des, NetScope*scope,
|
||||||
} else {
|
} else {
|
||||||
type = op_code == 'e'? NetUReduce::AND : NetUReduce::NAND;
|
type = op_code == 'e'? NetUReduce::AND : NetUReduce::NAND;
|
||||||
|
|
||||||
if (debug_elaborate)
|
if (debug_elaborate)
|
||||||
cerr << lsig->get_fileline() << ": debug: "
|
cerr << lsig->get_fileline() << ": debug: "
|
||||||
<< "Replace net==" << val << " equality with "
|
<< "Replace net==" << val << " equality with "
|
||||||
<< ones << "-input reduction AND gate." << endl;
|
<< ones << "-input reduction AND gate." << endl;
|
||||||
|
|
@ -1227,8 +1227,8 @@ NetNet* PEBinary::elaborate_net_shift_(Design*des, NetScope*scope,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If all data bits get shifted away, connect the zero or
|
/* If all data bits get shifted away, connect the zero or
|
||||||
* padding bits directly to output, and stop before building the
|
* padding bits directly to output, and stop before building the
|
||||||
* concatenation. */
|
* concatenation. */
|
||||||
if (dist >= lwidth) {
|
if (dist >= lwidth) {
|
||||||
connect(osig->pin(0), zero->pin(0));
|
connect(osig->pin(0), zero->pin(0));
|
||||||
return osig;
|
return osig;
|
||||||
|
|
@ -1829,7 +1829,7 @@ NetNet* PEIdent::elaborate_net(Design*des, NetScope*scope,
|
||||||
if (id_msb || id_lsb) {
|
if (id_msb || id_lsb) {
|
||||||
assert(id_msb && id_lsb);
|
assert(id_msb && id_lsb);
|
||||||
const NetEConst*tmp = dynamic_cast<const NetEConst*>(id_msb);
|
const NetEConst*tmp = dynamic_cast<const NetEConst*>(id_msb);
|
||||||
ivl_assert(*this, tmp);
|
ivl_assert(*this, tmp);
|
||||||
msb = tmp->value().as_long();
|
msb = tmp->value().as_long();
|
||||||
|
|
||||||
tmp = dynamic_cast<const NetEConst*>(id_lsb);
|
tmp = dynamic_cast<const NetEConst*>(id_lsb);
|
||||||
|
|
@ -2997,7 +2997,7 @@ NetNet* PENumber::elaborate_net(Design*des, NetScope*scope,
|
||||||
if (value_->get(width-1) != verinum::V0)
|
if (value_->get(width-1) != verinum::V0)
|
||||||
break;
|
break;
|
||||||
width -= 1;
|
width -= 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (value_->has_sign() == false) {
|
} else if (value_->has_sign() == false) {
|
||||||
|
|
@ -3406,7 +3406,7 @@ NetNet* PEUnary::elaborate_net(Design*des, NetScope*scope,
|
||||||
tmp->decay_time(decay);
|
tmp->decay_time(decay);
|
||||||
|
|
||||||
connect(tmp->pin(1), sub_sig->pin(0));
|
connect(tmp->pin(1), sub_sig->pin(0));
|
||||||
connect(tmp->pin(0), sig->pin(0));
|
connect(tmp->pin(0), sig->pin(0));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -3662,7 +3662,7 @@ NetNet* PEUnary::elab_net_unary_real_(Design*des, NetScope*scope,
|
||||||
" for real values." << endl;
|
" for real values." << endl;
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'm': { // abs()
|
case 'm': { // abs()
|
||||||
NetAbs*tmp = new NetAbs(scope, scope->local_symbol(), 1);
|
NetAbs*tmp = new NetAbs(scope, scope->local_symbol(), 1);
|
||||||
tmp->set_line(*this);
|
tmp->set_line(*this);
|
||||||
|
|
|
||||||
|
|
@ -670,7 +670,7 @@ bool PGenerate::generate_scope_case_(Design*des, NetScope*container)
|
||||||
<< "Generate case matches item at "
|
<< "Generate case matches item at "
|
||||||
<< item->get_fileline() << endl;
|
<< item->get_fileline() << endl;
|
||||||
|
|
||||||
// The name of the scope to generate, whatever that item is.
|
// The name of the scope to generate, whatever that item is.
|
||||||
hname_t use_name (item->scope_name);
|
hname_t use_name (item->scope_name);
|
||||||
|
|
||||||
NetScope*scope = new NetScope(container, use_name,
|
NetScope*scope = new NetScope(container, use_name,
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,7 @@ static void elaborate_sig_tasks(Design*des, NetScope*scope,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Module::elaborate_sig(Design*des, NetScope*scope) const
|
bool Module::elaborate_sig(Design*des, NetScope*scope) const
|
||||||
{
|
{
|
||||||
bool flag = true;
|
bool flag = true;
|
||||||
|
|
@ -361,7 +361,7 @@ bool PGModule::elaborate_sig_mod_(Design*des, NetScope*scope,
|
||||||
continue;
|
continue;
|
||||||
flag = tmp->elaborate_sig(des, scope) && flag;
|
flag = tmp->elaborate_sig(des, scope) && flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NetScope::scope_vec_t instance = scope->instance_arrays[get_name()];
|
NetScope::scope_vec_t instance = scope->instance_arrays[get_name()];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1377,7 +1377,7 @@ NetExpr* NetETernary::eval_tree(int prune_to_width)
|
||||||
case C_0:
|
case C_0:
|
||||||
eval_expr(false_val_);
|
eval_expr(false_val_);
|
||||||
if (debug_eval_tree) {
|
if (debug_eval_tree) {
|
||||||
|
|
||||||
cerr << get_fileline() << ": debug: Evaluate ternary with "
|
cerr << get_fileline() << ": debug: Evaluate ternary with "
|
||||||
<< "constant condition value: ";
|
<< "constant condition value: ";
|
||||||
print_ternary_cond(cond_);
|
print_ternary_cond(cond_);
|
||||||
|
|
|
||||||
|
|
@ -1269,7 +1269,7 @@ NetNet* NetEUFunc::synthesize(Design*des, NetScope*scope)
|
||||||
/* Connect the pins to the arguments. */
|
/* Connect the pins to the arguments. */
|
||||||
NetFuncDef*def = func_->func_def();
|
NetFuncDef*def = func_->func_def();
|
||||||
for (unsigned idx = 0; idx < eparms.count(); idx += 1) {
|
for (unsigned idx = 0; idx < eparms.count(); idx += 1) {
|
||||||
NetNet*tmp = pad_to_width(des, eparms[idx],
|
NetNet*tmp = pad_to_width(des, eparms[idx],
|
||||||
def->port(idx)->vector_width());
|
def->port(idx)->vector_width());
|
||||||
connect(net->pin(idx+1), tmp->pin(0));
|
connect(net->pin(idx+1), tmp->pin(0));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -282,7 +282,7 @@ int main(int argc, char*argv[])
|
||||||
fclose(src);
|
fclose(src);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
fprintf(stderr, "Icarus Verilog Preprocessor version %s\n",
|
fprintf(stderr, "Icarus Verilog Preprocessor version %s\n",
|
||||||
VERSION);
|
VERSION);
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ int acc_object_of_type(handle object, PLI_INT32 type)
|
||||||
|
|
||||||
if (pli_trace) {
|
if (pli_trace) {
|
||||||
fprintf(pli_trace, "acc_object_of_type(%p \"%s\", %d)",
|
fprintf(pli_trace, "acc_object_of_type(%p \"%s\", %d)",
|
||||||
object, vpi_get_str(vpiName, object), type);
|
object, vpi_get_str(vpiName, object), type);
|
||||||
fflush(pli_trace);
|
fflush(pli_trace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
8
main.cc
8
main.cc
|
|
@ -230,16 +230,16 @@ static void process_generation_flag(const char*gen)
|
||||||
|
|
||||||
} else if (strcmp(gen,"specify") == 0) {
|
} else if (strcmp(gen,"specify") == 0) {
|
||||||
gn_specify_blocks_flag = true;
|
gn_specify_blocks_flag = true;
|
||||||
|
|
||||||
} else if (strcmp(gen,"no-specify") == 0) {
|
} else if (strcmp(gen,"no-specify") == 0) {
|
||||||
gn_specify_blocks_flag = false;
|
gn_specify_blocks_flag = false;
|
||||||
|
|
||||||
} else if (strcmp(gen,"verilog-ams") == 0) {
|
} else if (strcmp(gen,"verilog-ams") == 0) {
|
||||||
gn_verilog_ams_flag = true;
|
gn_verilog_ams_flag = true;
|
||||||
|
|
||||||
} else if (strcmp(gen,"no-verilog-ams") == 0) {
|
} else if (strcmp(gen,"no-verilog-ams") == 0) {
|
||||||
gn_verilog_ams_flag = false;
|
gn_verilog_ams_flag = false;
|
||||||
|
|
||||||
} else if (strcmp(gen,"io-range-error") == 0) {
|
} else if (strcmp(gen,"io-range-error") == 0) {
|
||||||
gn_io_range_error_flag = true;
|
gn_io_range_error_flag = true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -736,7 +736,7 @@ class NetScope : public Attrib {
|
||||||
bool in_func();
|
bool in_func();
|
||||||
/* Is the task or function automatic. */
|
/* Is the task or function automatic. */
|
||||||
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_; };
|
||||||
|
|
||||||
const NetTaskDef* task_def() const;
|
const NetTaskDef* task_def() const;
|
||||||
const NetFuncDef* func_def() const;
|
const NetFuncDef* func_def() const;
|
||||||
|
|
@ -773,7 +773,7 @@ class NetScope : public Attrib {
|
||||||
|
|
||||||
void evaluate_parameters(class Design*);
|
void evaluate_parameters(class Design*);
|
||||||
|
|
||||||
// Look for defparams that never matched, and print warnings.
|
// Look for defparams that never matched, and print warnings.
|
||||||
void residual_defparams(class Design*);
|
void residual_defparams(class Design*);
|
||||||
|
|
||||||
/* This method generates a non-hierarchical name that is
|
/* This method generates a non-hierarchical name that is
|
||||||
|
|
|
||||||
64
parse.y
64
parse.y
|
|
@ -355,7 +355,7 @@ number : BASED_NUMBER
|
||||||
based_size = 0; }
|
based_size = 0; }
|
||||||
;
|
;
|
||||||
|
|
||||||
/* real and realtime are exactly the same so save some code
|
/* real and realtime are exactly the same so save some code
|
||||||
* with a common matching rule. */
|
* with a common matching rule. */
|
||||||
real_or_realtime
|
real_or_realtime
|
||||||
: K_real
|
: K_real
|
||||||
|
|
@ -3591,28 +3591,31 @@ statement
|
||||||
FILE_NAME(tmp, @1);
|
FILE_NAME(tmp, @1);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| event_control statement_or_null
|
| event_control attribute_list_opt statement_or_null
|
||||||
{ PEventStatement*tmp = $1;
|
{ PEventStatement*tmp = $1;
|
||||||
if (tmp == 0) {
|
if (tmp == 0) {
|
||||||
yyerror(@1, "error: Invalid event control.");
|
yyerror(@1, "error: Invalid event control.");
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
} else {
|
} else {
|
||||||
tmp->set_statement($2);
|
if ($3) pform_bind_attributes($3->attributes,$2);
|
||||||
$$ = tmp;
|
tmp->set_statement($3);
|
||||||
}
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '@' '*' statement_or_null
|
}
|
||||||
{ PEventStatement*tmp = new PEventStatement;
|
| '@' '*' attribute_list_opt statement_or_null
|
||||||
FILE_NAME(tmp, @1);
|
{ PEventStatement*tmp = new PEventStatement;
|
||||||
tmp->set_statement($3);
|
FILE_NAME(tmp, @1);
|
||||||
$$ = tmp;
|
if ($4) pform_bind_attributes($4->attributes,$3);
|
||||||
}
|
tmp->set_statement($4);
|
||||||
| '@' '(' '*' ')' statement_or_null
|
$$ = tmp;
|
||||||
{ PEventStatement*tmp = new PEventStatement;
|
}
|
||||||
FILE_NAME(tmp, @1);
|
| '@' '(' '*' ')' attribute_list_opt statement_or_null
|
||||||
tmp->set_statement($5);
|
{ PEventStatement*tmp = new PEventStatement;
|
||||||
$$ = tmp;
|
FILE_NAME(tmp, @1);
|
||||||
}
|
if ($6) pform_bind_attributes($6->attributes,$5);
|
||||||
|
tmp->set_statement($6);
|
||||||
|
$$ = tmp;
|
||||||
|
}
|
||||||
| lpvalue '=' expression ';'
|
| lpvalue '=' expression ';'
|
||||||
{ PAssign*tmp = new PAssign($1,$3);
|
{ PAssign*tmp = new PAssign($1,$3);
|
||||||
FILE_NAME(tmp, @1);
|
FILE_NAME(tmp, @1);
|
||||||
|
|
@ -3737,14 +3740,15 @@ statement_list
|
||||||
;
|
;
|
||||||
|
|
||||||
statement_or_null
|
statement_or_null
|
||||||
: statement
|
: statement
|
||||||
| ';' { $$ = 0; }
|
{ $$ = $1; }
|
||||||
;
|
| ';'
|
||||||
|
{ $$ = 0; }
|
||||||
|
;
|
||||||
|
|
||||||
analog_statement
|
analog_statement
|
||||||
: branch_probe_expression K_CONTRIBUTE expression ';'
|
: branch_probe_expression K_CONTRIBUTE expression ';'
|
||||||
{ $$ = pform_contribution_statement(@2, $1, $3); }
|
{ $$ = pform_contribution_statement(@2, $1, $3); }
|
||||||
;
|
;
|
||||||
|
|
||||||
/* Task items are, other than the statement, task port items and
|
/* Task items are, other than the statement, task port items and
|
||||||
|
|
@ -3970,7 +3974,7 @@ task_port_decl
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ports can be integer with a width of [31:0]. */
|
/* Ports can be integer with a width of [31:0]. */
|
||||||
|
|
||||||
| K_input K_integer IDENTIFIER
|
| K_input K_integer IDENTIFIER
|
||||||
{ svector<PExpr*>*range_stub = new svector<PExpr*>(2);
|
{ svector<PExpr*>*range_stub = new svector<PExpr*>(2);
|
||||||
PExpr*re;
|
PExpr*re;
|
||||||
|
|
@ -4036,7 +4040,7 @@ task_port_decl
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ports can be time with a width of [63:0] (unsigned). */
|
/* Ports can be time with a width of [63:0] (unsigned). */
|
||||||
|
|
||||||
| K_input K_time IDENTIFIER
|
| K_input K_time IDENTIFIER
|
||||||
{ svector<PExpr*>*range_stub = new svector<PExpr*>(2);
|
{ svector<PExpr*>*range_stub = new svector<PExpr*>(2);
|
||||||
PExpr*re;
|
PExpr*re;
|
||||||
|
|
|
||||||
21
pform.cc
21
pform.cc
|
|
@ -157,6 +157,19 @@ PBlock* pform_push_block_scope(char*name, PBlock::BL_TYPE bt)
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pform_bind_attributes(map<perm_string,PExpr*>&attributes,
|
||||||
|
svector<named_pexpr_t*>*attr)
|
||||||
|
{
|
||||||
|
if (attr == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (unsigned idx = 0 ; idx < attr->count() ; idx += 1) {
|
||||||
|
named_pexpr_t*tmp = (*attr)[idx];
|
||||||
|
attributes[tmp->name] = tmp->parm;
|
||||||
|
}
|
||||||
|
delete attr;
|
||||||
|
}
|
||||||
|
|
||||||
PWire*pform_get_wire_in_scope(perm_string name)
|
PWire*pform_get_wire_in_scope(perm_string name)
|
||||||
{
|
{
|
||||||
/* Note that if we are processing a generate, then the
|
/* Note that if we are processing a generate, then the
|
||||||
|
|
@ -1951,13 +1964,7 @@ PProcess* pform_make_behavior(PProcess::Type type, Statement*st,
|
||||||
{
|
{
|
||||||
PProcess*pp = new PProcess(type, st);
|
PProcess*pp = new PProcess(type, st);
|
||||||
|
|
||||||
if (attr) {
|
pform_bind_attributes(pp->attributes, attr);
|
||||||
for (unsigned idx = 0 ; idx < attr->count() ; idx += 1) {
|
|
||||||
named_pexpr_t*tmp = (*attr)[idx];
|
|
||||||
pp->attributes[tmp->name] = tmp->parm;
|
|
||||||
}
|
|
||||||
delete attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
pform_put_behavior_in_scope(pp);
|
pform_put_behavior_in_scope(pp);
|
||||||
return pp;
|
return pp;
|
||||||
|
|
|
||||||
4
pform.h
4
pform.h
|
|
@ -117,6 +117,10 @@ struct lgate {
|
||||||
unsigned lineno;
|
unsigned lineno;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Use this function to transform the parted form of the attribute
|
||||||
|
list to the attribute map that is used later. */
|
||||||
|
extern void pform_bind_attributes(map<perm_string,PExpr*>&attributes,
|
||||||
|
svector<named_pexpr_t*>*attr);
|
||||||
|
|
||||||
/* The lexor calls this function to change the default nettype. */
|
/* The lexor calls this function to change the default nettype. */
|
||||||
extern void pform_set_default_nettype(NetNet::Type net,
|
extern void pform_set_default_nettype(NetNet::Type net,
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,21 @@ std::ostream& operator << (std::ostream&out, ddomain_t dom)
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dump_attributes_map(ostream&out,
|
||||||
|
const map<perm_string,PExpr*>&attributes,
|
||||||
|
int ind)
|
||||||
|
{
|
||||||
|
for (map<perm_string,PExpr*>::const_iterator idx = attributes.begin()
|
||||||
|
; idx != attributes.end() ; idx++ ) {
|
||||||
|
|
||||||
|
out << setw(ind) << "" << "(* " << (*idx).first;
|
||||||
|
if ((*idx).second) {
|
||||||
|
out << " = " << *(*idx).second;
|
||||||
|
}
|
||||||
|
out << " *)" << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PExpr::dump(ostream&out) const
|
void PExpr::dump(ostream&out) const
|
||||||
{
|
{
|
||||||
out << typeid(*this).name();
|
out << typeid(*this).name();
|
||||||
|
|
@ -363,14 +378,7 @@ void PWire::dump(ostream&out, unsigned ind) const
|
||||||
}
|
}
|
||||||
|
|
||||||
out << ";" << endl;
|
out << ";" << endl;
|
||||||
for (map<perm_string,PExpr*>::const_iterator idx = attributes.begin()
|
dump_attributes_map(out, attributes, 8);
|
||||||
; idx != attributes.end()
|
|
||||||
; idx ++) {
|
|
||||||
out << " " << (*idx).first;
|
|
||||||
if ((*idx).second)
|
|
||||||
out << " = " << *(*idx).second;
|
|
||||||
out << endl;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PGate::dump_pins(ostream&out) const
|
void PGate::dump_pins(ostream&out) const
|
||||||
|
|
@ -541,6 +549,7 @@ void Statement::dump(ostream&out, unsigned ind) const
|
||||||
out << setw(ind) << "";
|
out << setw(ind) << "";
|
||||||
out << "/* " << get_fileline() << ": " << typeid(*this).name()
|
out << "/* " << get_fileline() << ": " << typeid(*this).name()
|
||||||
<< " */ ;" << endl;
|
<< " */ ;" << endl;
|
||||||
|
dump_attributes_map(out, attributes, ind+2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AStatement::dump(ostream&out, unsigned ind) const
|
void AStatement::dump(ostream&out, unsigned ind) const
|
||||||
|
|
@ -634,6 +643,7 @@ void PCase::dump(ostream&out, unsigned ind) const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out << " (" << *expr_ << ") /* " << get_fileline() << " */" << endl;
|
out << " (" << *expr_ << ") /* " << get_fileline() << " */" << endl;
|
||||||
|
dump_attributes_map(out, attributes, ind+2);
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < items_->count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < items_->count() ; idx += 1) {
|
||||||
PCase::Item*cur = (*items_)[idx];
|
PCase::Item*cur = (*items_)[idx];
|
||||||
|
|
@ -882,15 +892,7 @@ void PProcess::dump(ostream&out, unsigned ind) const
|
||||||
|
|
||||||
out << " /* " << get_fileline() << " */" << endl;
|
out << " /* " << get_fileline() << " */" << endl;
|
||||||
|
|
||||||
for (map<perm_string,PExpr*>::const_iterator idx = attributes.begin()
|
dump_attributes_map(out, attributes, ind+2);
|
||||||
; idx != attributes.end() ; idx++ ) {
|
|
||||||
|
|
||||||
out << setw(ind+2) << "" << "(* " << (*idx).first;
|
|
||||||
if ((*idx).second) {
|
|
||||||
out << " = " << *(*idx).second;
|
|
||||||
}
|
|
||||||
out << " *)" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
statement_->dump(out, ind+2);
|
statement_->dump(out, ind+2);
|
||||||
}
|
}
|
||||||
|
|
@ -908,15 +910,7 @@ void AProcess::dump(ostream&out, unsigned ind) const
|
||||||
|
|
||||||
out << " /* " << get_fileline() << " */" << endl;
|
out << " /* " << get_fileline() << " */" << endl;
|
||||||
|
|
||||||
for (map<perm_string,PExpr*>::const_iterator idx = attributes.begin()
|
dump_attributes_map(out, attributes, ind+2);
|
||||||
; idx != attributes.end() ; idx++ ) {
|
|
||||||
|
|
||||||
out << setw(ind+2) << "" << "(* " << (*idx).first;
|
|
||||||
if ((*idx).second) {
|
|
||||||
out << " = " << *(*idx).second;
|
|
||||||
}
|
|
||||||
out << " *)" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
statement_->dump(out, ind+2);
|
statement_->dump(out, ind+2);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1688,7 +1688,7 @@ extern "C" ivl_switch_t ivl_scope_switch(ivl_scope_t net, unsigned idx)
|
||||||
assert(idx < net->switches.size());
|
assert(idx < net->switches.size());
|
||||||
return net->switches[idx];
|
return net->switches[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int ivl_scope_time_precision(ivl_scope_t net)
|
extern "C" int ivl_scope_time_precision(ivl_scope_t net)
|
||||||
{
|
{
|
||||||
assert(net);
|
assert(net);
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,7 @@ void dll_target::expr_const(const NetEConst*net)
|
||||||
expr_ = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s));
|
expr_ = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s));
|
||||||
assert(expr_);
|
assert(expr_);
|
||||||
expr_->value_= net->expr_type();
|
expr_->value_= net->expr_type();
|
||||||
|
FILE_NAME(expr_, net);
|
||||||
|
|
||||||
if (net->value().is_string()) {
|
if (net->value().is_string()) {
|
||||||
expr_->type_ = IVL_EX_STRING;
|
expr_->type_ = IVL_EX_STRING;
|
||||||
|
|
@ -276,6 +277,7 @@ void dll_target::expr_creal(const NetECReal*net)
|
||||||
expr_->width_ = net->expr_width();
|
expr_->width_ = net->expr_width();
|
||||||
expr_->signed_ = 1;
|
expr_->signed_ = 1;
|
||||||
expr_->type_ = IVL_EX_REALNUM;
|
expr_->type_ = IVL_EX_REALNUM;
|
||||||
|
FILE_NAME(expr_, net);
|
||||||
expr_->value_= IVL_VT_REAL;
|
expr_->value_= IVL_VT_REAL;
|
||||||
expr_->u_.real_.value = net->value().as_double();
|
expr_->u_.real_.value = net->value().as_double();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
t-dll.cc
2
t-dll.cc
|
|
@ -857,7 +857,7 @@ bool dll_target::bufz(const NetBUFZ*net)
|
||||||
logic_attributes(obj, net);
|
logic_attributes(obj, net);
|
||||||
|
|
||||||
make_logic_delays_(obj, net);
|
make_logic_delays_(obj, net);
|
||||||
|
|
||||||
scope_add_logic(scope, obj);
|
scope_add_logic(scope, obj);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -1042,7 +1042,7 @@ static void signal_nexus_const(ivl_signal_t sig,
|
||||||
switch (ivl_const_type(con)) {
|
switch (ivl_const_type(con)) {
|
||||||
case IVL_VT_LOGIC:
|
case IVL_VT_LOGIC:
|
||||||
bits = ivl_const_bits(con);
|
bits = ivl_const_bits(con);
|
||||||
for (idx = 0 ; idx < width ; idx += 1) {
|
for (idx = 0 ; idx < width ; idx += 1) {
|
||||||
fprintf(out, "%c", bits[width-idx-1]);
|
fprintf(out, "%c", bits[width-idx-1]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,11 @@ vhdl_expr *vhdl_expr::cast(const vhdl_type *to)
|
||||||
// << " (" << type_->get_width() << ") "
|
// << " (" << type_->get_width() << ") "
|
||||||
// << " to=" << to->get_string() << " ("
|
// << " to=" << to->get_string() << " ("
|
||||||
// << to->get_width() << ")" << std::endl;
|
// << to->get_width() << ")" << std::endl;
|
||||||
|
|
||||||
|
// If this expression hasn't been given a type then
|
||||||
|
// we can't generate any type conversion code
|
||||||
|
if (NULL == type_)
|
||||||
|
return this;
|
||||||
|
|
||||||
if (to->get_name() == type_->get_name()) {
|
if (to->get_name() == type_->get_name()) {
|
||||||
if (to->get_width() == type_->get_width())
|
if (to->get_width() == type_->get_width())
|
||||||
|
|
|
||||||
|
|
@ -241,6 +241,8 @@ static vhdl_expr *lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm)
|
||||||
return concat_lpm_to_expr(scope, lpm);
|
return concat_lpm_to_expr(scope, lpm);
|
||||||
case IVL_LPM_CMP_GE:
|
case IVL_LPM_CMP_GE:
|
||||||
return rel_lpm_to_expr(scope, lpm, VHDL_BINOP_GEQ);
|
return rel_lpm_to_expr(scope, lpm, VHDL_BINOP_GEQ);
|
||||||
|
case IVL_LPM_CMP_GT:
|
||||||
|
return rel_lpm_to_expr(scope, lpm, VHDL_BINOP_GT);
|
||||||
case IVL_LPM_CMP_EQ:
|
case IVL_LPM_CMP_EQ:
|
||||||
case IVL_LPM_CMP_EEQ:
|
case IVL_LPM_CMP_EEQ:
|
||||||
return rel_lpm_to_expr(scope, lpm, VHDL_BINOP_EQ);
|
return rel_lpm_to_expr(scope, lpm, VHDL_BINOP_EQ);
|
||||||
|
|
@ -323,7 +325,7 @@ int draw_lpm(vhdl_arch *arch, ivl_lpm_t lpm)
|
||||||
out->set_slice(off, ivl_lpm_width(lpm) - 1);
|
out->set_slice(off, ivl_lpm_width(lpm) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
arch->add_stmt(new vhdl_cassign_stmt(out, f));
|
arch->add_stmt(new vhdl_cassign_stmt(out, f->cast(out->get_type())));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -362,10 +362,10 @@ static char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr)
|
||||||
assert(number_is_immediate(d_rise, 64, 0));
|
assert(number_is_immediate(d_rise, 64, 0));
|
||||||
assert(number_is_immediate(d_fall, 64, 0));
|
assert(number_is_immediate(d_fall, 64, 0));
|
||||||
assert(number_is_immediate(d_decay, 64, 0));
|
assert(number_is_immediate(d_decay, 64, 0));
|
||||||
|
|
||||||
fprintf(vvp_out, "L_%p/d .functor BUFZ 1, %s, "
|
fprintf(vvp_out, "L_%p/d .functor BUFZ 1, %s, "
|
||||||
"C4<0>, C4<0>, C4<0>;\n", cptr, result);
|
"C4<0>, C4<0>, C4<0>;\n", cptr, result);
|
||||||
|
|
||||||
fprintf(vvp_out, "L_%p .delay (%lu,%lu,%lu) L_%p/d;\n",
|
fprintf(vvp_out, "L_%p .delay (%lu,%lu,%lu) L_%p/d;\n",
|
||||||
cptr, get_number_immediate(d_rise),
|
cptr, get_number_immediate(d_rise),
|
||||||
get_number_immediate(d_rise),
|
get_number_immediate(d_rise),
|
||||||
|
|
|
||||||
|
|
@ -2169,7 +2169,7 @@ static struct vector_info draw_select_signal(ivl_expr_t sube,
|
||||||
assert(res.base);
|
assert(res.base);
|
||||||
fprintf(vvp_out, " %%load/v %u, v%p_%u, %u; Only need %u of %u bits\n",
|
fprintf(vvp_out, " %%load/v %u, v%p_%u, %u; Only need %u of %u bits\n",
|
||||||
res.base, sig, use_word, bit_wid, bit_wid, ivl_expr_width(sube));
|
res.base, sig, use_word, bit_wid, bit_wid, ivl_expr_width(sube));
|
||||||
|
|
||||||
save_signal_lookaside(res.base, sig, use_word, bit_wid);
|
save_signal_lookaside(res.base, sig, use_word, bit_wid);
|
||||||
/* Pad the part select to the desired width. Note that
|
/* Pad the part select to the desired width. Note that
|
||||||
this *should* always turn into an unsigned pad
|
this *should* always turn into an unsigned pad
|
||||||
|
|
|
||||||
|
|
@ -187,7 +187,7 @@ static int draw_number_real(ivl_expr_t exp)
|
||||||
|
|
||||||
/* If this is actually a negative number, then get the
|
/* If this is actually a negative number, then get the
|
||||||
positive equivalent, and set the sign bit in the exponent
|
positive equivalent, and set the sign bit in the exponent
|
||||||
field.
|
field.
|
||||||
|
|
||||||
To get the positive equivalent of mant we need to take the
|
To get the positive equivalent of mant we need to take the
|
||||||
negative of the mantissa (0-mant) but also be aware that
|
negative of the mantissa (0-mant) but also be aware that
|
||||||
|
|
|
||||||
|
|
@ -539,7 +539,7 @@ static int show_stmt_assign_nb_real(ivl_statement_t net)
|
||||||
lval = ivl_stmt_lval(net, 0);
|
lval = ivl_stmt_lval(net, 0);
|
||||||
sig = ivl_lval_sig(lval);
|
sig = ivl_lval_sig(lval);
|
||||||
assert(sig);
|
assert(sig);
|
||||||
|
|
||||||
if (ivl_signal_dimensions(sig) > 0) {
|
if (ivl_signal_dimensions(sig) > 0) {
|
||||||
word_ix = ivl_lval_idx(lval);
|
word_ix = ivl_lval_idx(lval);
|
||||||
assert(word_ix);
|
assert(word_ix);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#norootforbuild
|
#norootforbuild
|
||||||
#
|
#
|
||||||
%define rev_date 20080830
|
%define rev_date 20080905
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
Summary: Icarus Verilog
|
Summary: Icarus Verilog
|
||||||
|
|
@ -82,6 +82,9 @@ rm -rf $RPM_BUILD_ROOT
|
||||||
%attr(-,root,root) /usr/include/_pli_types.h
|
%attr(-,root,root) /usr/include/_pli_types.h
|
||||||
|
|
||||||
%changelog -n verilog
|
%changelog -n verilog
|
||||||
|
* Fri Sep 03 2008 - steve@icarus.com
|
||||||
|
- New snapshot 20080905
|
||||||
|
|
||||||
* Sat Aug 30 2008 - steve@icarus.com
|
* Sat Aug 30 2008 - steve@icarus.com
|
||||||
- Add vhdl target files
|
- Add vhdl target files
|
||||||
- Add V/AMS header files.
|
- Add V/AMS header files.
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ V = va_math.o
|
||||||
|
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
SYSTEM_VPI_LDFLAGS = $(LIBS)
|
SYSTEM_VPI_LDFLAGS = $(LIBS)
|
||||||
VA_MATH_LDFLAGS =
|
VA_MATH_LDFLAGS =
|
||||||
ifeq (@MINGW32@,yes)
|
ifeq (@MINGW32@,yes)
|
||||||
SYSTEM_VPI_LDFLAGS += @EXTRALIBS@
|
SYSTEM_VPI_LDFLAGS += @EXTRALIBS@
|
||||||
VA_MATH_LDFLAGS += @EXTRALIBS@
|
VA_MATH_LDFLAGS += @EXTRALIBS@
|
||||||
|
|
|
||||||
|
|
@ -252,8 +252,8 @@ static PLI_INT32 variable_cb_1(p_cb_data cause)
|
||||||
struct t_cb_data cb;
|
struct t_cb_data cb;
|
||||||
struct vcd_info*info = (struct vcd_info*)cause->user_data;
|
struct vcd_info*info = (struct vcd_info*)cause->user_data;
|
||||||
|
|
||||||
if (dump_is_full) return 0;
|
if (dump_is_full) return 0;
|
||||||
if (dump_is_off) return 0;
|
if (dump_is_off) return 0;
|
||||||
if (dump_header_pending()) return 0;
|
if (dump_header_pending()) return 0;
|
||||||
if (info->scheduled) return 0;
|
if (info->scheduled) return 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -721,7 +721,7 @@ static PLI_INT32 sys_dumpvars_calltf(PLI_BYTE8*name)
|
||||||
for ( ; item; item = vpi_scan(argv)) {
|
for ( ; item; item = vpi_scan(argv)) {
|
||||||
const char *scname;
|
const char *scname;
|
||||||
int add_var = 0;
|
int add_var = 0;
|
||||||
|
|
||||||
vcd_names_sort(&vcd_tab);
|
vcd_names_sort(&vcd_tab);
|
||||||
|
|
||||||
/* If this is a signal make sure it has not already
|
/* If this is a signal make sure it has not already
|
||||||
|
|
|
||||||
56
vpi_user.h
56
vpi_user.h
|
|
@ -76,7 +76,7 @@ typedef struct t_vpi_vlog_info
|
||||||
|
|
||||||
|
|
||||||
typedef struct t_vpi_time {
|
typedef struct t_vpi_time {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Type can be :
|
Type can be :
|
||||||
|
|
||||||
|
|
@ -124,52 +124,52 @@ typedef struct t_vpi_value {
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
Conform the IEEE 1364, We add the
|
Conform the IEEE 1364, We add the
|
||||||
Standard vpi_delay structure to
|
Standard vpi_delay structure to
|
||||||
enable the modpath delay values
|
enable the modpath delay values
|
||||||
|
|
||||||
|
|
||||||
Conform IEEE 1364, Pg 670 :
|
Conform IEEE 1364, Pg 670 :
|
||||||
|
|
||||||
The "da" field of the s_vpi_delay
|
The "da" field of the s_vpi_delay
|
||||||
structure shall be a user allocated
|
structure shall be a user allocated
|
||||||
array of "s_vpi_time" structure
|
array of "s_vpi_time" structure
|
||||||
|
|
||||||
The array shall store delay values returned
|
The array shall store delay values returned
|
||||||
by vpi_get_delay(). The number of elements in
|
by vpi_get_delay(). The number of elements in
|
||||||
the array shall be determined by
|
the array shall be determined by
|
||||||
|
|
||||||
(1) The number of delays to be retrieved
|
(1) The number of delays to be retrieved
|
||||||
( normally this is used in vpi_get_delays (..) )
|
( normally this is used in vpi_get_delays (..) )
|
||||||
{
|
{
|
||||||
(1.1) Set by "no_of_delays" field
|
(1.1) Set by "no_of_delays" field
|
||||||
|
|
||||||
(1.2) For the primitive_object, the no_of_delays
|
(1.2) For the primitive_object, the no_of_delays
|
||||||
shall be 2 or 3
|
shall be 2 or 3
|
||||||
|
|
||||||
(1.3) For path_delay object the no_of_delays shall
|
(1.3) For path_delay object the no_of_delays shall
|
||||||
be 1,2,3,6, 12
|
be 1,2,3,6, 12
|
||||||
|
|
||||||
(1.4) For timing_check_object, the no_of_delays shall
|
(1.4) For timing_check_object, the no_of_delays shall
|
||||||
be match the number of limits existing in the
|
be match the number of limits existing in the
|
||||||
Time Check
|
Time Check
|
||||||
|
|
||||||
(1.5) For intermodule_path object, the no_of_delays shall
|
(1.5) For intermodule_path object, the no_of_delays shall
|
||||||
be 2 or 3
|
be 2 or 3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(2) The "mtm_flag" && "pulsere_flag"
|
(2) The "mtm_flag" && "pulsere_flag"
|
||||||
|
|
||||||
|
|
||||||
Normally, if you set mtm = X, pulsere = Y
|
Normally, if you set mtm = X, pulsere = Y
|
||||||
then, you will need allocate (num * no_of_delay)
|
then, you will need allocate (num * no_of_delay)
|
||||||
s_vpi_time elements for 'da' array before calling
|
s_vpi_time elements for 'da' array before calling
|
||||||
the vpi_get/put_delays (..)
|
the vpi_get/put_delays (..)
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
| | | |
|
| | | |
|
||||||
| mtm_flag | No of s_vpi_time array | order in which delay |
|
| mtm_flag | No of s_vpi_time array | order in which delay |
|
||||||
|
|
@ -197,7 +197,7 @@ typedef struct t_vpi_value {
|
||||||
| | | .... |
|
| | | .... |
|
||||||
|----------------|-------------------------|------------------------------|
|
|----------------|-------------------------|------------------------------|
|
||||||
| | | 1o delay da[0]--> min delay |
|
| | | 1o delay da[0]--> min delay |
|
||||||
| mtm = true | | da[1]--> typ delay |
|
| mtm = true | | da[1]--> typ delay |
|
||||||
| pulere = true | 9*no_of_delay | da[2]--> max delay |
|
| pulere = true | 9*no_of_delay | da[2]--> max delay |
|
||||||
| | | da[3]--> min delay |
|
| | | da[3]--> min delay |
|
||||||
| | | da[4]--> typ delay |
|
| | | da[4]--> typ delay |
|
||||||
|
|
@ -206,14 +206,14 @@ typedef struct t_vpi_value {
|
||||||
| | | da[7]--> typ delay |
|
| | | da[7]--> typ delay |
|
||||||
| | | da[8]--> max delay |
|
| | | da[8]--> max delay |
|
||||||
| | | 2o delay da[9]--> min delay |
|
| | | 2o delay da[9]--> min delay |
|
||||||
| | | .... |
|
| | | .... |
|
||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
|
|
||||||
IMPORTANT :
|
IMPORTANT :
|
||||||
|
|
||||||
The delay Structure has to be allocated before passing a pointer to
|
The delay Structure has to be allocated before passing a pointer to
|
||||||
"vpi_get_delays ( )".
|
"vpi_get_delays ( )".
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -296,7 +296,7 @@ typedef struct t_vpi_delay {
|
||||||
#define vpiArgument 89
|
#define vpiArgument 89
|
||||||
#define vpiInternalScope 92
|
#define vpiInternalScope 92
|
||||||
#define vpiModPathIn 95
|
#define vpiModPathIn 95
|
||||||
#define vpiModPathOut 96
|
#define vpiModPathOut 96
|
||||||
#define vpiVariables 100
|
#define vpiVariables 100
|
||||||
#define vpiExpr 102
|
#define vpiExpr 102
|
||||||
|
|
||||||
|
|
@ -500,7 +500,7 @@ extern vpiHandle vpi_put_value(vpiHandle obj, p_vpi_value value,
|
||||||
extern PLI_INT32 vpi_free_object(vpiHandle ref);
|
extern PLI_INT32 vpi_free_object(vpiHandle ref);
|
||||||
extern PLI_INT32 vpi_get_vlog_info(p_vpi_vlog_info vlog_info_p);
|
extern PLI_INT32 vpi_get_vlog_info(p_vpi_vlog_info vlog_info_p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
These Routines will enable the modpath vpiHandle
|
These Routines will enable the modpath vpiHandle
|
||||||
to read/write delay values
|
to read/write delay values
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
19
vvp/array.cc
19
vvp/array.cc
|
|
@ -977,12 +977,18 @@ void array_word_change(vvp_array_t array, unsigned long addr)
|
||||||
struct __vpiCallback*cur = next;
|
struct __vpiCallback*cur = next;
|
||||||
next = cur->next;
|
next = cur->next;
|
||||||
|
|
||||||
// Skip callbacks for callbacks not for me.
|
// Skip callbacks that are not for me. -1 is for every element.
|
||||||
if (cur->extra_data != (long)addr) {
|
if (cur->extra_data != (long)addr && cur->extra_data != -1) {
|
||||||
prev = cur;
|
prev = cur;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For whole array callbacks we need to set the index.
|
||||||
|
if (cur->extra_data == -1) {
|
||||||
|
cur->cb_data.index = (PLI_INT32) ((int)addr +
|
||||||
|
array->first_addr.value);
|
||||||
|
}
|
||||||
|
|
||||||
if (cur->cb_data.cb_rtn != 0) {
|
if (cur->cb_data.cb_rtn != 0) {
|
||||||
if (cur->cb_data.value)
|
if (cur->cb_data.value)
|
||||||
vpip_vec4_get_value(array->vals->get_word(addr),
|
vpip_vec4_get_value(array->vals->get_word(addr),
|
||||||
|
|
@ -1058,6 +1064,15 @@ void vpip_array_word_change(struct __vpiCallback*cb, vpiHandle obj)
|
||||||
parent->vpi_callbacks = cb;
|
parent->vpi_callbacks = cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vpip_array_change(struct __vpiCallback*cb, vpiHandle obj)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct __vpiArray*arr = ARRAY_HANDLE(obj);
|
||||||
|
cb->extra_data = -1; // This is a callback for every element.
|
||||||
|
cb->next = arr->vpi_callbacks;
|
||||||
|
arr->vpi_callbacks = cb;
|
||||||
|
}
|
||||||
|
|
||||||
void compile_array_port(char*label, char*array, char*addr)
|
void compile_array_port(char*label, char*array, char*addr)
|
||||||
{
|
{
|
||||||
array_port_resolv_list_t*resolv_mem
|
array_port_resolv_list_t*resolv_mem
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ extern vvp_vector4_t array_get_word(vvp_array_t array, unsigned address);
|
||||||
/* VPI hooks */
|
/* VPI hooks */
|
||||||
|
|
||||||
extern void vpip_array_word_change(struct __vpiCallback*cb, vpiHandle word);
|
extern void vpip_array_word_change(struct __vpiCallback*cb, vpiHandle word);
|
||||||
|
extern void vpip_array_change(struct __vpiCallback*cb, vpiHandle word);
|
||||||
|
|
||||||
/* Compile hooks */
|
/* Compile hooks */
|
||||||
extern void compile_variablew(char*label, vvp_array_t array,
|
extern void compile_variablew(char*label, vvp_array_t array,
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ enum operand_e {
|
||||||
OA_CODE_PTR,
|
OA_CODE_PTR,
|
||||||
/* The operand is a variable or net pointer */
|
/* The operand is a variable or net pointer */
|
||||||
OA_FUNC_PTR,
|
OA_FUNC_PTR,
|
||||||
/* The operand is a second functor pointer */
|
/* The operand is a second functor pointer */
|
||||||
OA_FUNC_PTR2,
|
OA_FUNC_PTR2,
|
||||||
/* The operand is a VPI handle */
|
/* The operand is a VPI handle */
|
||||||
OA_VPI_PTR,
|
OA_VPI_PTR,
|
||||||
|
|
@ -700,7 +700,7 @@ void compile_vpi_time_precision(long pre)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert a Cr string value to double.
|
* Convert a Cr string value to double.
|
||||||
*
|
*
|
||||||
* The format is broken into mantissa and exponent.
|
* The format is broken into mantissa and exponent.
|
||||||
* The exponent in turn includes a sign bit.
|
* The exponent in turn includes a sign bit.
|
||||||
*
|
*
|
||||||
|
|
@ -1369,7 +1369,7 @@ static struct __vpiModPathSrc*make_modpath_src(struct __vpiModPath*path,
|
||||||
srcobj->path_term_in.edge = vpi_edge;
|
srcobj->path_term_in.edge = vpi_edge;
|
||||||
input_connect(net, 0, src.text);
|
input_connect(net, 0, src.text);
|
||||||
dst->add_modpath_src(obj, ifnone);
|
dst->add_modpath_src(obj, ifnone);
|
||||||
|
|
||||||
return srcobj;
|
return srcobj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1543,7 +1543,7 @@ void compile_code(char*label, char*mnem, comp_operands_t opa)
|
||||||
case OA_NONE:
|
case OA_NONE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OA_ARR_PTR:
|
case OA_ARR_PTR:
|
||||||
if (opa->argv[idx].ltype != L_SYMB) {
|
if (opa->argv[idx].ltype != L_SYMB) {
|
||||||
yyerror("operand format");
|
yyerror("operand format");
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -719,7 +719,7 @@ static void modpath_src_put_delays (vpiHandle ref, p_vpi_delay delays)
|
||||||
/*
|
/*
|
||||||
* This routine will retrieve the delay[12] values
|
* This routine will retrieve the delay[12] values
|
||||||
* of a vpiHandle. In this case, he will get an
|
* of a vpiHandle. In this case, he will get an
|
||||||
* specific delays values from a vpiModPathIn
|
* specific delays values from a vpiModPathIn
|
||||||
* object
|
* object
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
@ -841,7 +841,7 @@ struct __vpiModPath* vpip_make_modpath(vvp_net_t *net)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function will construct a vpiModPathIn
|
* This function will construct a vpiModPathIn
|
||||||
* ( struct __vpiModPathSrc ) Object. will give
|
* ( struct __vpiModPathSrc ) Object. will give
|
||||||
* a delays[12] values, and point to the specified functor
|
* a delays[12] values, and point to the specified functor
|
||||||
*
|
*
|
||||||
|
|
@ -883,6 +883,6 @@ struct __vpiModPathSrc* vpip_modpath_src_from_handle(vpiHandle ref)
|
||||||
{
|
{
|
||||||
if (ref->vpi_type->type_code != vpiModPath)
|
if (ref->vpi_type->type_code != vpiModPath)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return (struct __vpiModPathSrc *) ref;
|
return (struct __vpiModPathSrc *) ref;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -468,7 +468,7 @@ register.
|
||||||
* %load/x1p <bit>, <functor-label>, <wid>
|
* %load/x1p <bit>, <functor-label>, <wid>
|
||||||
|
|
||||||
This is an indexed load. It uses the contents of index register 1 to
|
This is an indexed load. It uses the contents of index register 1 to
|
||||||
select a part from a vector functor at <functor-label>. The
|
select a part from a vector functor at <functor-label>. The
|
||||||
part is pulled from the indexed bit of the addressed functor and loaded
|
part is pulled from the indexed bit of the addressed functor and loaded
|
||||||
into the destination thread bit. The <wid> is the width of the
|
into the destination thread bit. The <wid> is the width of the
|
||||||
part. If any bit of the desired value is outside the vector, then that
|
part. If any bit of the desired value is outside the vector, then that
|
||||||
|
|
|
||||||
12
vvp/parse.y
12
vvp/parse.y
|
|
@ -188,19 +188,19 @@ statement
|
||||||
|
|
||||||
| T_LABEL K_ARRAY T_STRING ',' signed_t_number signed_t_number ',' signed_t_number signed_t_number ';'
|
| T_LABEL K_ARRAY T_STRING ',' signed_t_number signed_t_number ',' signed_t_number signed_t_number ';'
|
||||||
{ compile_var_array($1, $3, $5, $6, $8, $9, 0); }
|
{ compile_var_array($1, $3, $5, $6, $8, $9, 0); }
|
||||||
|
|
||||||
| T_LABEL K_ARRAY_I T_STRING ',' signed_t_number signed_t_number ',' signed_t_number signed_t_number ';'
|
| T_LABEL K_ARRAY_I T_STRING ',' signed_t_number signed_t_number ',' signed_t_number signed_t_number ';'
|
||||||
{ compile_var_array($1, $3, $5, $6, $8, $9, 2); }
|
{ compile_var_array($1, $3, $5, $6, $8, $9, 2); }
|
||||||
|
|
||||||
| T_LABEL K_ARRAY_R T_STRING ',' signed_t_number signed_t_number ',' signed_t_number signed_t_number ';'
|
| T_LABEL K_ARRAY_R T_STRING ',' signed_t_number signed_t_number ',' signed_t_number signed_t_number ';'
|
||||||
{ compile_real_array($1, $3, $5, $6, $8, $9); }
|
{ compile_real_array($1, $3, $5, $6, $8, $9); }
|
||||||
|
|
||||||
| T_LABEL K_ARRAY_S T_STRING ',' signed_t_number signed_t_number ',' signed_t_number signed_t_number ';'
|
| T_LABEL K_ARRAY_S T_STRING ',' signed_t_number signed_t_number ',' signed_t_number signed_t_number ';'
|
||||||
{ compile_var_array($1, $3, $5, $6, $8, $9, 1); }
|
{ compile_var_array($1, $3, $5, $6, $8, $9, 1); }
|
||||||
|
|
||||||
| T_LABEL K_ARRAY T_STRING ',' signed_t_number signed_t_number ';'
|
| T_LABEL K_ARRAY T_STRING ',' signed_t_number signed_t_number ';'
|
||||||
{ compile_net_array($1, $3, $5, $6); }
|
{ compile_net_array($1, $3, $5, $6); }
|
||||||
|
|
||||||
| T_LABEL K_ARRAY_PORT T_SYMBOL ',' T_SYMBOL ';'
|
| T_LABEL K_ARRAY_PORT T_SYMBOL ',' T_SYMBOL ';'
|
||||||
{ compile_array_port($1, $3, $5); }
|
{ compile_array_port($1, $3, $5); }
|
||||||
|
|
||||||
|
|
@ -831,7 +831,7 @@ argument
|
||||||
{ $$ = vpip_make_binary_const($1.idx, $1.text);
|
{ $$ = vpip_make_binary_const($1.idx, $1.text);
|
||||||
free($1.text);
|
free($1.text);
|
||||||
}
|
}
|
||||||
| symbol_access
|
| symbol_access
|
||||||
{ $$ = $1; }
|
{ $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,10 @@ static struct __vpiCallback* make_value_change(p_cb_data data)
|
||||||
vpip_array_word_change(obj, data->obj);
|
vpip_array_word_change(obj, data->obj);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case vpiMemory:
|
||||||
|
vpip_array_change(obj, data->obj);
|
||||||
|
break;
|
||||||
|
|
||||||
case vpiPartSelect:
|
case vpiPartSelect:
|
||||||
vpip_part_select_value_change(obj, data->obj);
|
vpip_part_select_value_change(obj, data->obj);
|
||||||
break;
|
break;
|
||||||
|
|
@ -570,7 +574,7 @@ void vvp_fun_signal::get_value(struct t_vpi_value*vp)
|
||||||
switch (vp->format) {
|
switch (vp->format) {
|
||||||
case vpiScalarVal:
|
case vpiScalarVal:
|
||||||
// This works because vvp_bit4_t has the same encoding
|
// This works because vvp_bit4_t has the same encoding
|
||||||
// as a scalar value! See vpip_vec4_get_value() for a
|
// as a scalar value! See vpip_vec4_get_value() for a
|
||||||
// more robust method.
|
// more robust method.
|
||||||
vp->value.scalar = value(0);
|
vp->value.scalar = value(0);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -330,7 +330,7 @@ int vpip_time_units_from_handle(vpiHandle obj)
|
||||||
case vpiReg:
|
case vpiReg:
|
||||||
signal = vpip_signal_from_handle(obj);
|
signal = vpip_signal_from_handle(obj);
|
||||||
scope = vpip_scope(signal);
|
scope = vpip_scope(signal);
|
||||||
return scope->time_units;
|
return scope->time_units;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "ERROR: vpip_time_units_from_handle called with "
|
fprintf(stderr, "ERROR: vpip_time_units_from_handle called with "
|
||||||
|
|
@ -686,20 +686,20 @@ vpiHandle vpi_put_value(vpiHandle obj, s_vpi_value*vp,
|
||||||
|
|
||||||
assert(when != 0);
|
assert(when != 0);
|
||||||
|
|
||||||
switch (when->type) {
|
switch (when->type) {
|
||||||
case vpiScaledRealTime:
|
case vpiScaledRealTime:
|
||||||
dly = (vvp_time64_t)(when->real *
|
dly = (vvp_time64_t)(when->real *
|
||||||
(pow(10.0L,
|
(pow(10.0L,
|
||||||
vpip_time_units_from_handle(obj) -
|
vpip_time_units_from_handle(obj) -
|
||||||
vpip_get_time_precision())));
|
vpip_get_time_precision())));
|
||||||
break;
|
break;
|
||||||
case vpiSimTime:
|
case vpiSimTime:
|
||||||
dly = vpip_timestruct_to_time(when);
|
dly = vpip_timestruct_to_time(when);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dly = 0;
|
dly = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
vpip_put_value_event*put = new vpip_put_value_event;
|
vpip_put_value_event*put = new vpip_put_value_event;
|
||||||
put->handle = obj;
|
put->handle = obj;
|
||||||
|
|
@ -919,22 +919,22 @@ vpiHandle vpi_handle_by_name(const char *name, vpiHandle scope)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
We increment the two vpi methods to enable the
|
We increment the two vpi methods to enable the
|
||||||
read/write of SDF delay values from/into
|
read/write of SDF delay values from/into
|
||||||
the modpath vpiHandle
|
the modpath vpiHandle
|
||||||
|
|
||||||
|
|
||||||
basically, they will redirect the generic vpi_interface
|
basically, they will redirect the generic vpi_interface
|
||||||
|
|
||||||
vpi_get_delay ( .. )
|
vpi_get_delay ( .. )
|
||||||
vpi_put_delay ( .. )
|
vpi_put_delay ( .. )
|
||||||
|
|
||||||
|
|
||||||
to the
|
to the
|
||||||
|
|
||||||
modpath_get_delay ( .. ) ;
|
modpath_get_delay ( .. ) ;
|
||||||
modpath_put_delay ( .. ) ;
|
modpath_put_delay ( .. ) ;
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -943,17 +943,17 @@ void vpi_get_delays(vpiHandle expr, p_vpi_delay delays)
|
||||||
{
|
{
|
||||||
assert(expr);
|
assert(expr);
|
||||||
assert(delays);
|
assert(delays);
|
||||||
|
|
||||||
if (expr->vpi_type->vpi_get_delays_)
|
if (expr->vpi_type->vpi_get_delays_)
|
||||||
{
|
{
|
||||||
(expr->vpi_type->vpi_get_delays_)(expr, delays);
|
(expr->vpi_type->vpi_get_delays_)(expr, delays);
|
||||||
|
|
||||||
if (vpi_trace)
|
if (vpi_trace)
|
||||||
{
|
{
|
||||||
fprintf(vpi_trace,
|
fprintf(vpi_trace,
|
||||||
"vpi_get_delays(%p, %p) -->\n", expr, delays);
|
"vpi_get_delays(%p, %p) -->\n", expr, delays);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -961,17 +961,17 @@ void vpi_put_delays(vpiHandle expr, p_vpi_delay delays)
|
||||||
{
|
{
|
||||||
assert(expr );
|
assert(expr );
|
||||||
assert(delays );
|
assert(delays );
|
||||||
|
|
||||||
if (expr->vpi_type->vpi_put_delays_)
|
if (expr->vpi_type->vpi_put_delays_)
|
||||||
{
|
{
|
||||||
(expr->vpi_type->vpi_put_delays_)(expr, delays);
|
(expr->vpi_type->vpi_put_delays_)(expr, delays);
|
||||||
|
|
||||||
if (vpi_trace)
|
if (vpi_trace)
|
||||||
{
|
{
|
||||||
fprintf(vpi_trace,
|
fprintf(vpi_trace,
|
||||||
"vpi_put_delays(%p, %p) -->\n", expr, delays);
|
"vpi_put_delays(%p, %p) -->\n", expr, delays);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -267,7 +267,7 @@ struct __vpiModPathSrc {
|
||||||
|
|
||||||
/* This is the input expression for this modpath. */
|
/* This is the input expression for this modpath. */
|
||||||
struct __vpiModPathTerm path_term_in;
|
struct __vpiModPathTerm path_term_in;
|
||||||
|
|
||||||
/* This is the input net for the modpath. signals on this net
|
/* This is the input net for the modpath. signals on this net
|
||||||
are used to determine the modpath. They are *not* propagated
|
are used to determine the modpath. They are *not* propagated
|
||||||
anywhere. */
|
anywhere. */
|
||||||
|
|
@ -277,7 +277,7 @@ struct __vpiModPathSrc {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* The vpiMoaPath vpiHandle will define
|
* The vpiMoaPath vpiHandle will define
|
||||||
* a vpiModPath of record .modpath as defined
|
* a vpiModPath of record .modpath as defined
|
||||||
* in the IEEE 1364
|
* in the IEEE 1364
|
||||||
*
|
*
|
||||||
|
|
@ -285,7 +285,7 @@ struct __vpiModPathSrc {
|
||||||
|
|
||||||
struct __vpiModPath {
|
struct __vpiModPath {
|
||||||
struct __vpiScope *scope ;
|
struct __vpiScope *scope ;
|
||||||
|
|
||||||
class vvp_fun_modpath*modpath;
|
class vvp_fun_modpath*modpath;
|
||||||
|
|
||||||
struct __vpiModPathTerm path_term_out;
|
struct __vpiModPathTerm path_term_out;
|
||||||
|
|
@ -297,12 +297,12 @@ extern struct __vpiModPathSrc* vpip_modpath_src_from_handle(vpiHandle ref);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Function is used to create the vpiHandle
|
* The Function is used to create the vpiHandle
|
||||||
* for vpiModPath && vpiModPathIn objects
|
* for vpiModPath && vpiModPathIn objects
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern struct __vpiModPathSrc* vpip_make_modpath_src (struct __vpiModPath*path_dest,
|
extern struct __vpiModPathSrc* vpip_make_modpath_src (struct __vpiModPath*path_dest,
|
||||||
vvp_time64_t use_delay[12] ,
|
vvp_time64_t use_delay[12] ,
|
||||||
vvp_net_t *net ) ;
|
vvp_net_t *net ) ;
|
||||||
|
|
||||||
extern struct __vpiModPath* vpip_make_modpath(vvp_net_t *net) ;
|
extern struct __vpiModPath* vpip_make_modpath(vvp_net_t *net) ;
|
||||||
|
|
|
||||||
|
|
@ -198,7 +198,7 @@ static int compare_types(int code, int type)
|
||||||
(type == vpiIntegerVar ||
|
(type == vpiIntegerVar ||
|
||||||
type == vpiTimeVar ||
|
type == vpiTimeVar ||
|
||||||
type == vpiRealVar))
|
type == vpiRealVar))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -351,7 +351,7 @@ static void format_vpiStringVal(vvp_fun_signal_vec*sig, int base, unsigned wid,
|
||||||
vp->value.str = rbuf;
|
vp->value.str = rbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void format_vpiScalarVal(vvp_fun_signal_vec*sig, int base,
|
static void format_vpiScalarVal(vvp_fun_signal_vec*sig, int base,
|
||||||
s_vpi_value*vp)
|
s_vpi_value*vp)
|
||||||
{
|
{
|
||||||
if (base >= 0 && base < (signed)sig->size()) {
|
if (base >= 0 && base < (signed)sig->size()) {
|
||||||
|
|
|
||||||
|
|
@ -296,7 +296,7 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp)
|
||||||
case vpiRealVal:
|
case vpiRealVal:
|
||||||
vp->value.real = 0;
|
vp->value.real = 0;
|
||||||
for (unsigned idx = wid ; idx > 0 ; idx -= 1) {
|
for (unsigned idx = wid ; idx > 0 ; idx -= 1) {
|
||||||
vp->value.real *= 2.0;
|
vp->value.real *= 2.0;
|
||||||
switch (get_bit(rfp, idx-1)) {
|
switch (get_bit(rfp, idx-1)) {
|
||||||
case BIT4_0:
|
case BIT4_0:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -223,7 +223,7 @@ unsigned vpip_vec4_to_dec_str(const vvp_vector4_t&vec4,
|
||||||
void vpip_dec_str_to_vec4(vvp_vector4_t&vec,
|
void vpip_dec_str_to_vec4(vvp_vector4_t&vec,
|
||||||
const char*buf, bool signed_flag)
|
const char*buf, bool signed_flag)
|
||||||
{
|
{
|
||||||
/* The str string is the decimal value with the least
|
/* The str string is the decimal value with the least
|
||||||
significant digit first. This loop creates that string by
|
significant digit first. This loop creates that string by
|
||||||
reversing the order of the buf string. For example, if the
|
reversing the order of the buf string. For example, if the
|
||||||
input is "1234", str gets "4321". */
|
input is "1234", str gets "4321". */
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,7 @@ static unsigned long* vector_to_array(struct vthread_s*thr,
|
||||||
static vvp_vector4_t vthread_bits_to_vector(struct vthread_s*thr,
|
static vvp_vector4_t vthread_bits_to_vector(struct vthread_s*thr,
|
||||||
unsigned bit, unsigned wid)
|
unsigned bit, unsigned wid)
|
||||||
{
|
{
|
||||||
/* Make a vector of the desired width. */
|
/* Make a vector of the desired width. */
|
||||||
|
|
||||||
if (bit >= 4) {
|
if (bit >= 4) {
|
||||||
return vvp_vector4_t(thr->bits4, bit, wid);
|
return vvp_vector4_t(thr->bits4, bit, wid);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue