diff --git a/ivl_target.h b/ivl_target.h index 31a571bbe..c46721697 100644 --- a/ivl_target.h +++ b/ivl_target.h @@ -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 diff --git a/t-dll-api.cc b/t-dll-api.cc index f090536e6..15fc0c247 100644 --- a/t-dll-api.cc +++ b/t-dll-api.cc @@ -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) { diff --git a/t-dll.cc b/t-dll.cc index d7d4fb234..160e621f1 100644 --- a/t-dll.cc +++ b/t-dll.cc @@ -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(cur_pit->second.msb); + const NetEConst *lsbc = + dynamic_cast(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); diff --git a/t-dll.h b/t-dll.h index a4cd38c4f..06e5708c8 100644 --- a/t-dll.h +++ b/t-dll.h @@ -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;