Add support for getting parameter MSB, LSB and sign from the ivl interface
This commit is contained in:
parent
633360a0f9
commit
d08e0270e4
18
ivl_target.h
18
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
|
||||
|
|
|
|||
19
t-dll-api.cc
19
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)
|
||||
{
|
||||
|
|
|
|||
24
t-dll.cc
24
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<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);
|
||||
|
|
|
|||
5
t-dll.h
5
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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue