Add support for getting parameter MSB, LSB and sign from the ivl interface

This commit is contained in:
Cary R 2013-07-04 11:26:39 -07:00
parent 633360a0f9
commit d08e0270e4
4 changed files with 59 additions and 7 deletions

View File

@ -1,7 +1,7 @@
#ifndef __ivl_target_H
#define __ivl_target_H
/*
* Copyright (c) 2000-2012 Stephen Williams (steve@icarus.com)
* Copyright (c) 2000-2013 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
@ -1606,6 +1606,15 @@ extern ivl_signal_t ivl_nexus_ptr_sig(ivl_nexus_ptr_t net);
* Return the value of the parameter. This should be a simple
* constant expression, an IVL_EX_STRING or IVL_EX_NUMBER.
*
* ivl_parameter_msb
* ivl_parameter_lsb
* Returns the MSB and LSB for the parameter. For a parameter without
* a range the value is zero based and the width of the expression is
* used to determine the MSB.
*
* ivl_parameter_signed
* Returns if the parameter was declared to be signed.
*
* ivl_parameter_local
* Return whether parameter was local (localparam, implicit genvar etc)
* or not.
@ -1617,9 +1626,12 @@ extern ivl_signal_t ivl_nexus_ptr_sig(ivl_nexus_ptr_t net);
extern const char* ivl_parameter_basename(ivl_parameter_t net);
extern ivl_scope_t ivl_parameter_scope(ivl_parameter_t net);
extern ivl_expr_t ivl_parameter_expr(ivl_parameter_t net);
extern int ivl_parameter_local(ivl_parameter_t net);
extern int ivl_parameter_msb(ivl_parameter_t net);
extern int ivl_parameter_lsb(ivl_parameter_t net);
extern int ivl_parameter_signed(ivl_parameter_t net);
extern int ivl_parameter_local(ivl_parameter_t net);
extern const char* ivl_parameter_file(ivl_parameter_t net);
extern unsigned ivl_parameter_lineno(ivl_parameter_t net);
extern unsigned ivl_parameter_lineno(ivl_parameter_t net);
/* SCOPE

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2012 Stephen Williams (steve@icarus.com)
* Copyright (c) 2000-2013 Stephen Williams (steve@icarus.com)
* Copyright CERN 2013 / Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
@ -1746,6 +1746,23 @@ extern "C" int ivl_parameter_local(ivl_parameter_t net)
return net->local;
}
extern "C" int ivl_parameter_signed(ivl_parameter_t net)
{
assert(net);
return net->signed_flag;
}
extern "C" int ivl_parameter_msb(ivl_parameter_t net)
{
assert(net);
return net->msb;
}
extern "C" int ivl_parameter_lsb(ivl_parameter_t net)
{
assert(net);
return net->lsb;
}
extern "C" ivl_expr_t ivl_parameter_expr(ivl_parameter_t net)
{

View File

@ -508,13 +508,33 @@ void dll_target::make_scope_parameters(ivl_scope_t scop, const NetScope*net)
ivl_parameter_t cur_par = &scop->param[idx];
cur_par->basename = cur_pit->first;
cur_par->local = cur_pit->second.local_flag;
/* Either both the MSB and LSB expressions are provided or
* neither are provided. */
if (cur_pit->second.msb) {
assert(cur_pit->second.lsb);
/* The MSB and LSB expressions must be integral constants. */
const NetEConst *msbc =
dynamic_cast<const NetEConst*>(cur_pit->second.msb);
const NetEConst *lsbc =
dynamic_cast<const NetEConst*>(cur_pit->second.lsb);
assert(msbc);
assert(lsbc);
cur_par->msb = msbc->value().as_long();
cur_par->lsb = lsbc->value().as_long();
} else {
assert(! cur_pit->second.lsb);
cur_par->msb = cur_pit->second.val->expr_width() - 1;
assert(cur_par->msb >= 0);
cur_par->lsb = 0;
}
cur_par->signed_flag = cur_pit->second.signed_flag;
cur_par->scope = scop;
FILE_NAME(cur_par, &(cur_pit->second));
NetExpr*etmp = cur_pit->second.val;
if (etmp == 0) {
cerr << "?:?: internal error: "
<< "What is the parameter expression for " << cur_pit->first
cerr << "?:?: internal error: What is the parameter "
<< "expression for " << cur_pit->first
<< " in " << net->fullname() << "?" << endl;
}
assert(etmp);

View File

@ -1,7 +1,7 @@
#ifndef __t_dll_H
#define __t_dll_H
/*
* Copyright (c) 2000-2012 Stephen Williams (steve@icarus.com)
* Copyright (c) 2000-2013 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
@ -604,6 +604,9 @@ struct ivl_parameter_s {
perm_string basename;
ivl_scope_t scope;
ivl_expr_t value;
long msb;
long lsb;
bool signed_flag;
bool local;
perm_string file;
unsigned lineno;