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 #ifndef __ivl_target_H
#define __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 * 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
@ -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 * Return the value of the parameter. This should be a simple
* constant expression, an IVL_EX_STRING or IVL_EX_NUMBER. * 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 * ivl_parameter_local
* Return whether parameter was local (localparam, implicit genvar etc) * Return whether parameter was local (localparam, implicit genvar etc)
* or not. * 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 const char* ivl_parameter_basename(ivl_parameter_t net);
extern ivl_scope_t ivl_parameter_scope(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 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 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 /* 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) * Copyright CERN 2013 / 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
@ -1746,6 +1746,23 @@ extern "C" int ivl_parameter_local(ivl_parameter_t net)
return net->local; 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) 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]; ivl_parameter_t cur_par = &scop->param[idx];
cur_par->basename = cur_pit->first; cur_par->basename = cur_pit->first;
cur_par->local = cur_pit->second.local_flag; 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; cur_par->scope = scop;
FILE_NAME(cur_par, &(cur_pit->second)); FILE_NAME(cur_par, &(cur_pit->second));
NetExpr*etmp = cur_pit->second.val; NetExpr*etmp = cur_pit->second.val;
if (etmp == 0) { if (etmp == 0) {
cerr << "?:?: internal error: " cerr << "?:?: internal error: What is the parameter "
<< "What is the parameter expression for " << cur_pit->first << "expression for " << cur_pit->first
<< " in " << net->fullname() << "?" << endl; << " in " << net->fullname() << "?" << endl;
} }
assert(etmp); assert(etmp);

View File

@ -1,7 +1,7 @@
#ifndef __t_dll_H #ifndef __t_dll_H
#define __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 * 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
@ -604,6 +604,9 @@ struct ivl_parameter_s {
perm_string basename; perm_string basename;
ivl_scope_t scope; ivl_scope_t scope;
ivl_expr_t value; ivl_expr_t value;
long msb;
long lsb;
bool signed_flag;
bool local; bool local;
perm_string file; perm_string file;
unsigned lineno; unsigned lineno;