Merge pull request #701 from larsclausen/lgate-lineinfo

lgate: Inherit from LineInfo
This commit is contained in:
Stephen Williams 2022-05-01 07:34:45 -07:00 committed by GitHub
commit 64cc04f6d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 48 deletions

24
parse.y
View File

@ -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;

View File

@ -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
View File

@ -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);

View File

@ -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