lgate: Inherit from LineInfo
The lgate struct has its own fields for tracking file and line number, while everything else that has this information attached inherits from the LineInfo class. Make lgate also inherit from LineInfo for consistency. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
e7b700f48e
commit
dddc41891e
24
parse.y
24
parse.y
|
|
@ -4102,8 +4102,7 @@ gate_instance
|
||||||
{ lgate*tmp = new lgate;
|
{ lgate*tmp = new lgate;
|
||||||
tmp->name = $1;
|
tmp->name = $1;
|
||||||
tmp->parms = $3;
|
tmp->parms = $3;
|
||||||
tmp->file = @1.text;
|
FILE_NAME(tmp, @1);
|
||||||
tmp->lineno = @1.first_line;
|
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -4113,8 +4112,7 @@ gate_instance
|
||||||
tmp->name = $1;
|
tmp->name = $1;
|
||||||
tmp->parms = $4;
|
tmp->parms = $4;
|
||||||
tmp->ranges = $2;
|
tmp->ranges = $2;
|
||||||
tmp->file = @1.text;
|
FILE_NAME(tmp, @1);
|
||||||
tmp->lineno = @1.first_line;
|
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -4123,8 +4121,7 @@ gate_instance
|
||||||
{ lgate*tmp = new lgate;
|
{ lgate*tmp = new lgate;
|
||||||
tmp->name = "";
|
tmp->name = "";
|
||||||
tmp->parms = $2;
|
tmp->parms = $2;
|
||||||
tmp->file = @1.text;
|
FILE_NAME(tmp, @1);
|
||||||
tmp->lineno = @1.first_line;
|
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4136,8 +4133,7 @@ gate_instance
|
||||||
tmp->parms = 0;
|
tmp->parms = 0;
|
||||||
tmp->parms_by_name = 0;
|
tmp->parms_by_name = 0;
|
||||||
tmp->ranges = $2;
|
tmp->ranges = $2;
|
||||||
tmp->file = @1.text;
|
FILE_NAME(tmp, @1);
|
||||||
tmp->lineno = @1.first_line;
|
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -4149,8 +4145,7 @@ gate_instance
|
||||||
tmp->name = $1;
|
tmp->name = $1;
|
||||||
tmp->parms = 0;
|
tmp->parms = 0;
|
||||||
tmp->parms_by_name = $3;
|
tmp->parms_by_name = $3;
|
||||||
tmp->file = @1.text;
|
FILE_NAME(tmp, @1);
|
||||||
tmp->lineno = @1.first_line;
|
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -4161,8 +4156,7 @@ gate_instance
|
||||||
tmp->parms = 0;
|
tmp->parms = 0;
|
||||||
tmp->parms_by_name = $4;
|
tmp->parms_by_name = $4;
|
||||||
tmp->ranges = $2;
|
tmp->ranges = $2;
|
||||||
tmp->file = @1.text;
|
FILE_NAME(tmp, @1);
|
||||||
tmp->lineno = @1.first_line;
|
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -4172,8 +4166,7 @@ gate_instance
|
||||||
tmp->name = $1;
|
tmp->name = $1;
|
||||||
tmp->parms = 0;
|
tmp->parms = 0;
|
||||||
tmp->parms_by_name = 0;
|
tmp->parms_by_name = 0;
|
||||||
tmp->file = @1.text;
|
FILE_NAME(tmp, @1);
|
||||||
tmp->lineno = @1.first_line;
|
|
||||||
yyerror(@2, "error: Syntax error in instance port "
|
yyerror(@2, "error: Syntax error in instance port "
|
||||||
"expression(s).");
|
"expression(s).");
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
|
|
@ -4186,8 +4179,7 @@ gate_instance
|
||||||
tmp->parms = 0;
|
tmp->parms = 0;
|
||||||
tmp->parms_by_name = 0;
|
tmp->parms_by_name = 0;
|
||||||
tmp->ranges = $2;
|
tmp->ranges = $2;
|
||||||
tmp->file = @1.text;
|
FILE_NAME(tmp, @1);
|
||||||
tmp->lineno = @1.first_line;
|
|
||||||
yyerror(@3, "error: Syntax error in instance port "
|
yyerror(@3, "error: Syntax error in instance port "
|
||||||
"expression(s).");
|
"expression(s).");
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
|
|
|
||||||
26
pform.cc
26
pform.cc
|
|
@ -389,12 +389,6 @@ bool allow_timeprec_decl = true;
|
||||||
// Track whether the current parameter declaration is in a parameter port list
|
// Track whether the current parameter declaration is in a parameter port list
|
||||||
static bool pform_in_parameter_port_list = false;
|
static bool pform_in_parameter_port_list = false;
|
||||||
|
|
||||||
static inline void FILE_NAME(LineInfo*obj, const char*file, unsigned lineno)
|
|
||||||
{
|
|
||||||
obj->set_lineno(lineno);
|
|
||||||
obj->set_file(filename_strings.make(file));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The lexical_scope keeps track of the current lexical scope that is
|
* The lexical_scope keeps track of the current lexical scope that is
|
||||||
* being parsed. The lexical scope may stack, so the current scope may
|
* being parsed. The lexical scope may stack, so the current scope may
|
||||||
|
|
@ -2205,8 +2199,8 @@ static void pform_makegate(PGBuiltin::Type type,
|
||||||
list<named_pexpr_t>*attr)
|
list<named_pexpr_t>*attr)
|
||||||
{
|
{
|
||||||
if (info.parms_by_name) {
|
if (info.parms_by_name) {
|
||||||
cerr << info.file << ":" << info.lineno << ": Gates do not "
|
cerr << info.get_fileline() << ": Gates do not have port names."
|
||||||
"have port names." << endl;
|
<< endl;
|
||||||
error_count += 1;
|
error_count += 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -2229,7 +2223,7 @@ static void pform_makegate(PGBuiltin::Type type,
|
||||||
|
|
||||||
cur->strength0(str.str0);
|
cur->strength0(str.str0);
|
||||||
cur->strength1(str.str1);
|
cur->strength1(str.str1);
|
||||||
FILE_NAME(cur, info.file, info.lineno);
|
cur->set_line(info);
|
||||||
|
|
||||||
if (pform_cur_generate) {
|
if (pform_cur_generate) {
|
||||||
if (dev_name != "") add_local_symbol(pform_cur_generate, dev_name, cur);
|
if (dev_name != "") add_local_symbol(pform_cur_generate, dev_name, cur);
|
||||||
|
|
@ -2286,7 +2280,7 @@ static void pform_make_modgate(perm_string type,
|
||||||
struct parmvalue_t*overrides,
|
struct parmvalue_t*overrides,
|
||||||
list<PExpr*>*wires,
|
list<PExpr*>*wires,
|
||||||
list<pform_range_t>*ranges,
|
list<pform_range_t>*ranges,
|
||||||
const char*fn, unsigned ln,
|
const LineInfo&li,
|
||||||
std::list<named_pexpr_t>*attr)
|
std::list<named_pexpr_t>*attr)
|
||||||
{
|
{
|
||||||
for (list<PExpr*>::iterator idx = wires->begin()
|
for (list<PExpr*>::iterator idx = wires->begin()
|
||||||
|
|
@ -2295,7 +2289,7 @@ static void pform_make_modgate(perm_string type,
|
||||||
}
|
}
|
||||||
|
|
||||||
PGModule*cur = new PGModule(type, name, wires);
|
PGModule*cur = new PGModule(type, name, wires);
|
||||||
FILE_NAME(cur, fn, ln);
|
cur->set_line(li);
|
||||||
cur->set_ranges(ranges);
|
cur->set_ranges(ranges);
|
||||||
|
|
||||||
if (overrides && overrides->by_name) {
|
if (overrides && overrides->by_name) {
|
||||||
|
|
@ -2329,7 +2323,7 @@ static void pform_make_modgate(perm_string type,
|
||||||
struct parmvalue_t*overrides,
|
struct parmvalue_t*overrides,
|
||||||
list<named_pexpr_t>*bind,
|
list<named_pexpr_t>*bind,
|
||||||
list<pform_range_t>*ranges,
|
list<pform_range_t>*ranges,
|
||||||
const char*fn, unsigned ln,
|
const LineInfo&li,
|
||||||
std::list<named_pexpr_t>*attr)
|
std::list<named_pexpr_t>*attr)
|
||||||
{
|
{
|
||||||
unsigned npins = bind->size();
|
unsigned npins = bind->size();
|
||||||
|
|
@ -2342,7 +2336,7 @@ static void pform_make_modgate(perm_string type,
|
||||||
}
|
}
|
||||||
|
|
||||||
PGModule*cur = new PGModule(type, name, pins, npins);
|
PGModule*cur = new PGModule(type, name, pins, npins);
|
||||||
FILE_NAME(cur, fn, ln);
|
cur->set_line(li);
|
||||||
cur->set_ranges(ranges);
|
cur->set_ranges(ranges);
|
||||||
|
|
||||||
if (overrides && overrides->by_name) {
|
if (overrides && overrides->by_name) {
|
||||||
|
|
@ -2412,7 +2406,7 @@ void pform_make_modgates(const struct vlltype&loc,
|
||||||
if (cur.parms_by_name) {
|
if (cur.parms_by_name) {
|
||||||
pform_make_modgate(type, cur_name, overrides,
|
pform_make_modgate(type, cur_name, overrides,
|
||||||
cur.parms_by_name, cur.ranges,
|
cur.parms_by_name, cur.ranges,
|
||||||
cur.file, cur.lineno, attr);
|
cur, attr);
|
||||||
|
|
||||||
} else if (cur.parms) {
|
} else if (cur.parms) {
|
||||||
|
|
||||||
|
|
@ -2425,13 +2419,13 @@ void pform_make_modgates(const struct vlltype&loc,
|
||||||
}
|
}
|
||||||
pform_make_modgate(type, cur_name, overrides,
|
pform_make_modgate(type, cur_name, overrides,
|
||||||
cur.parms, cur.ranges,
|
cur.parms, cur.ranges,
|
||||||
cur.file, cur.lineno, attr);
|
cur, attr);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
list<PExpr*>*wires = new list<PExpr*>;
|
list<PExpr*>*wires = new list<PExpr*>;
|
||||||
pform_make_modgate(type, cur_name, overrides,
|
pform_make_modgate(type, cur_name, overrides,
|
||||||
wires, cur.ranges,
|
wires, cur.ranges,
|
||||||
cur.file, cur.lineno, attr);
|
cur, attr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
17
pform.h
17
pform.h
|
|
@ -62,6 +62,7 @@ class PSpecPath;
|
||||||
class PClass;
|
class PClass;
|
||||||
class PPackage;
|
class PPackage;
|
||||||
struct vlltype;
|
struct vlltype;
|
||||||
|
struct lgate;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The min:typ:max expression s selected at parse time using the
|
* The min:typ:max expression s selected at parse time using the
|
||||||
|
|
@ -96,22 +97,6 @@ struct parmvalue_t {
|
||||||
struct str_pair_t { ivl_drive_t str0, str1; };
|
struct str_pair_t { ivl_drive_t str0, str1; };
|
||||||
|
|
||||||
|
|
||||||
/* The lgate is gate instantiation information. */
|
|
||||||
struct lgate {
|
|
||||||
explicit inline lgate(int =0)
|
|
||||||
: parms(0), parms_by_name(0), ranges(0), file(NULL), lineno(0)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
std::string name;
|
|
||||||
std::list<PExpr*>*parms;
|
|
||||||
std::list<named_pexpr_t>*parms_by_name;
|
|
||||||
|
|
||||||
std::list<pform_range_t>*ranges;
|
|
||||||
|
|
||||||
const char* file;
|
|
||||||
unsigned lineno;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern std::list<pform_range_t>* make_range_from_width(uint64_t wid);
|
extern std::list<pform_range_t>* make_range_from_width(uint64_t wid);
|
||||||
extern std::list<pform_range_t>* copy_range(std::list<pform_range_t>* orig);
|
extern std::list<pform_range_t>* copy_range(std::list<pform_range_t>* orig);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,19 @@ typedef named<PExpr*> named_pexpr_t;
|
||||||
*/
|
*/
|
||||||
typedef std::pair<PExpr*,PExpr*> pform_range_t;
|
typedef std::pair<PExpr*,PExpr*> pform_range_t;
|
||||||
|
|
||||||
|
/* The lgate is gate instantiation information. */
|
||||||
|
struct lgate : public LineInfo {
|
||||||
|
explicit lgate(int = 0)
|
||||||
|
: parms(0), parms_by_name(0), ranges(0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
std::list<PExpr*>*parms;
|
||||||
|
std::list<named_pexpr_t>*parms_by_name;
|
||||||
|
|
||||||
|
std::list<pform_range_t>*ranges;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The pform_port_t holds the name and optional unpacked dimensions
|
* The pform_port_t holds the name and optional unpacked dimensions
|
||||||
* and initialization expression for a single port in a list of port
|
* and initialization expression for a single port in a list of port
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue