Skip to content

Commit 987dfd2

Browse files
authored
Merge pull request #325 from diffblue/verilog_inst_baset
Verilog: introduce verilog_inst_baset
2 parents c5c001f + 4076987 commit 987dfd2

File tree

5 files changed

+67
-79
lines changed

5 files changed

+67
-79
lines changed

src/verilog/verilog_expr.h

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -393,25 +393,21 @@ to_verilog_local_parameter_decl(irept &irep)
393393
return static_cast<verilog_local_parameter_declt &>(irep);
394394
}
395395

396-
class verilog_instt:public verilog_module_itemt
396+
class verilog_inst_baset : public verilog_module_itemt
397397
{
398398
public:
399-
inline verilog_instt():verilog_module_itemt(ID_inst)
399+
verilog_inst_baset(irep_idt id) : verilog_module_itemt(id)
400400
{
401401
}
402402

403-
inline irep_idt get_module() const { return get(ID_module); }
404-
405-
inline void set_module(const irep_idt &module) { return set(ID_module, module); }
406-
407-
inline exprt::operandst &parameter_assignments()
403+
irep_idt get_module() const
408404
{
409-
return static_cast<exprt &>(add(ID_parameter_assignments)).operands();
405+
return get(ID_module);
410406
}
411407

412-
inline const exprt::operandst &parameter_assignments() const
408+
void set_module(const irep_idt &module)
413409
{
414-
return static_cast<const exprt &>(find(ID_parameter_assignments)).operands();
410+
return set(ID_module, module);
415411
}
416412

417413
class instancet : public exprt
@@ -457,6 +453,25 @@ class verilog_instt:public verilog_module_itemt
457453
using exprt::operands;
458454
};
459455

456+
class verilog_instt : public verilog_inst_baset
457+
{
458+
public:
459+
inline verilog_instt() : verilog_inst_baset(ID_inst)
460+
{
461+
}
462+
463+
exprt::operandst &parameter_assignments()
464+
{
465+
return static_cast<exprt &>(add(ID_parameter_assignments)).operands();
466+
}
467+
468+
const exprt::operandst &parameter_assignments() const
469+
{
470+
return static_cast<const exprt &>(find(ID_parameter_assignments))
471+
.operands();
472+
}
473+
};
474+
460475
inline const verilog_instt &to_verilog_inst(const exprt &expr)
461476
{
462477
assert(expr.id()==ID_inst);
@@ -469,28 +484,12 @@ inline verilog_instt &to_verilog_inst(exprt &expr)
469484
return static_cast<verilog_instt &>(expr);
470485
}
471486

472-
class verilog_inst_builtint:public verilog_module_itemt
487+
class verilog_inst_builtint : public verilog_inst_baset
473488
{
474489
public:
475-
inline verilog_inst_builtint():verilog_module_itemt(ID_inst_builtin)
490+
inline verilog_inst_builtint() : verilog_inst_baset(ID_inst_builtin)
476491
{
477492
}
478-
479-
inline irep_idt get_module() const { return get(ID_module); }
480-
481-
using instancet = verilog_instt::instancet;
482-
483-
using instancest = std::vector<instancet>;
484-
485-
const instancest &instances() const
486-
{
487-
return (const instancest &)(operands());
488-
}
489-
490-
instancest &instances()
491-
{
492-
return (instancest &)(operands());
493-
}
494493
};
495494

496495
inline const verilog_inst_builtint &to_verilog_inst_builtin(const exprt &expr)

src/verilog/verilog_interfaces.cpp

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -637,18 +637,10 @@ Function: verilog_typecheckt::convert_inst
637637
\*******************************************************************/
638638

639639
void verilog_typecheckt::interface_inst(
640-
const verilog_module_itemt &inst_module_item)
640+
const verilog_inst_baset &inst_module_item)
641641
{
642-
if(inst_module_item.id() == ID_inst)
643-
{
644-
for(auto &instance : to_verilog_inst(inst_module_item).instances())
645-
interface_inst(inst_module_item, instance);
646-
}
647-
else
648-
{
649-
for(auto &instance : to_verilog_inst_builtin(inst_module_item).instances())
650-
interface_inst(inst_module_item, instance);
651-
}
642+
for(auto &instance : inst_module_item.instances())
643+
interface_inst(inst_module_item, instance);
652644
}
653645

654646
/*******************************************************************\
@@ -664,7 +656,7 @@ Function: verilog_typecheckt::interface_inst
664656
\*******************************************************************/
665657

666658
void verilog_typecheckt::interface_inst(
667-
const verilog_module_itemt &statement,
659+
const verilog_inst_baset &statement,
668660
const verilog_instt::instancet &op)
669661
{
670662
bool primitive=statement.id()==ID_inst_builtin;
@@ -759,9 +751,10 @@ void verilog_typecheckt::interface_module_item(
759751
{
760752
// already done by elaborate_parameters
761753
}
762-
else if(module_item.id()==ID_inst ||
763-
module_item.id()==ID_inst_builtin)
764-
interface_inst(module_item);
754+
else if(module_item.id() == ID_inst)
755+
interface_inst(to_verilog_inst(module_item));
756+
else if(module_item.id() == ID_inst_builtin)
757+
interface_inst(to_verilog_inst_builtin(module_item));
765758
else if(module_item.id()==ID_always)
766759
interface_statement(to_verilog_always(module_item).statement());
767760
else if(module_item.id()==ID_initial)

src/verilog/verilog_synthesis.cpp

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,19 +1086,17 @@ void verilog_synthesist::synth_module_instance_builtin(
10861086
{
10871087
const irep_idt &module=module_item.get_module();
10881088

1089-
forall_operands(it, module_item)
1089+
for(auto &instance : module_item.instances())
10901090
{
1091-
const exprt &instance=*it;
1092-
10931091
// check built-in ones
10941092
if(module==ID_bufif0 ||
10951093
module==ID_bufif1 ||
10961094
module==ID_notif0 ||
10971095
module==ID_notif1)
10981096
{
10991097
// add to general constraints
1100-
1101-
exprt constraint=*it;
1098+
1099+
exprt constraint = instance;
11021100
constraint.id("verilog-primitive-module");
11031101
constraint.type()=bool_typet();
11041102
constraint.set(ID_module, module);
@@ -1112,8 +1110,8 @@ void verilog_synthesist::synth_module_instance_builtin(
11121110
module==ID_rpmos)
11131111
{
11141112
// add to general constraints
1115-
1116-
exprt constraint=*it;
1113+
1114+
exprt constraint = instance;
11171115
constraint.id("verilog-primitive-module");
11181116
constraint.type()=bool_typet();
11191117
constraint.set(ID_module, module);
@@ -1128,29 +1126,29 @@ void verilog_synthesist::synth_module_instance_builtin(
11281126
module==ID_xor ||
11291127
module==ID_xnor)
11301128
{
1131-
assert(instance.operands().size()>=2);
1129+
assert(instance.connections().size() >= 2);
11321130

1133-
if(instance.operands().size()==2)
1131+
if(instance.connections().size() == 2)
11341132
{
1135-
equal_exprt constraint{instance.operands()[0],
1136-
instance.operands().back()};
1133+
equal_exprt constraint{
1134+
instance.connections()[0], instance.connections().back()};
11371135
trans.invar().add_to_operands(std::move(constraint));
11381136
}
11391137
else
11401138
{
1141-
for(unsigned i=1; i<=instance.operands().size()-2; i++)
1139+
for(unsigned i = 1; i <= instance.connections().size() - 2; i++)
11421140
{
11431141
exprt op(module, instance.type());
11441142

11451143
if(i==1)
11461144
{
1147-
op.add_to_operands(instance.operands()[i]);
1148-
op.add_to_operands(instance.operands()[i + 1]);
1145+
op.add_to_operands(instance.connections()[i]);
1146+
op.add_to_operands(instance.connections()[i + 1]);
11491147
}
11501148
else
11511149
{
1152-
op.add_to_operands(instance.operands()[0]);
1153-
op.add_to_operands(instance.operands()[i + 1]);
1150+
op.add_to_operands(instance.connections()[0]);
1151+
op.add_to_operands(instance.connections()[i + 1]);
11541152
}
11551153

11561154
if(instance.type().id()!=ID_bool)
@@ -1162,7 +1160,7 @@ void verilog_synthesist::synth_module_instance_builtin(
11621160
}
11631161
}
11641162

1165-
/*assert(instance.operands().size()!=3);
1163+
/*assert(instance.connections().size()!=3);
11661164
op.add_to_operands(std::move(instance.op1()), std::move(instance.op2()));
11671165
11681166
if(instance.type().id()!=ID_bool)
@@ -1176,30 +1174,30 @@ void verilog_synthesist::synth_module_instance_builtin(
11761174
}
11771175
else if(module==ID_buf)
11781176
{
1179-
assert(instance.operands().size()>=2);
1177+
assert(instance.connections().size() >= 2);
11801178

1181-
for(unsigned i=0; i<instance.operands().size()-1; i++)
1179+
for(unsigned i = 0; i < instance.connections().size() - 1; i++)
11821180
{
1183-
equal_exprt constraint{instance.operands()[i],
1184-
instance.operands().back()};
1181+
equal_exprt constraint{
1182+
instance.connections()[i], instance.connections().back()};
11851183

11861184
assert(trans.operands().size()==3);
11871185
trans.invar().add_to_operands(std::move(constraint));
11881186
}
11891187
}
11901188
else if(module==ID_not)
11911189
{
1192-
assert(instance.operands().size()>=2);
1190+
assert(instance.connections().size() >= 2);
11931191

1194-
for(unsigned i=0; i<instance.operands().size()-1; i++)
1192+
for(unsigned i = 0; i < instance.connections().size() - 1; i++)
11951193
{
11961194
exprt op(ID_not, instance.type());
1197-
op.add_to_operands(instance.operands()[i]);
1195+
op.add_to_operands(instance.connections()[i]);
11981196

11991197
if(instance.type().id()!=ID_bool)
12001198
op.id("bit"+op.id_string());
12011199

1202-
equal_exprt constraint{op, instance.operands().back()};
1200+
equal_exprt constraint{op, instance.connections().back()};
12031201

12041202
assert(trans.operands().size()==3);
12051203
trans.invar().add_to_operands(std::move(constraint));
@@ -1211,8 +1209,8 @@ void verilog_synthesist::synth_module_instance_builtin(
12111209
module=="rtranif0")
12121210
{
12131211
// add to general constraints
1214-
1215-
exprt constraint=*it;
1212+
1213+
exprt constraint = instance;
12161214
constraint.id("verilog-primitive-module");
12171215
constraint.type()=bool_typet();
12181216
constraint.set(ID_module, module);
@@ -1224,8 +1222,8 @@ void verilog_synthesist::synth_module_instance_builtin(
12241222
module=="rtran")
12251223
{
12261224
// add to general constraints
1227-
1228-
exprt constraint=*it;
1225+
1226+
exprt constraint = instance;
12291227
constraint.id("verilog-primitive-module");
12301228
constraint.type()=bool_typet();
12311229
constraint.set(ID_module, module);

src/verilog/verilog_typecheck.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -626,10 +626,8 @@ void verilog_typecheckt::convert_inst_builtin(
626626
{
627627
const irep_idt &inst_module=inst.get_module();
628628

629-
Forall_operands(it, inst)
629+
for(auto &instance : inst.instances())
630630
{
631-
exprt &instance=*it;
632-
633631
typecheck_builtin_port_connections(instance);
634632

635633
// check built-in ones
@@ -654,7 +652,7 @@ void verilog_typecheckt::convert_inst_builtin(
654652
inst_module==ID_xor ||
655653
inst_module==ID_xnor)
656654
{
657-
if(instance.operands().size()<2)
655+
if(instance.connections().size() < 2)
658656
{
659657
throw errort().with_location(instance.source_location())
660658
<< "Primitive gate " << inst_module
@@ -664,7 +662,7 @@ void verilog_typecheckt::convert_inst_builtin(
664662
else if(inst_module==ID_buf ||
665663
inst_module==ID_not)
666664
{
667-
if(instance.operands().size()<2)
665+
if(instance.connections().size() < 2)
668666
{
669667
throw errort().with_location(instance.source_location())
670668
<< "Primitive gate " << inst_module

src/verilog/verilog_typecheck.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ class verilog_typecheckt:
112112
void check_module_ports(const verilog_module_sourcet &);
113113
void interface_module_decl(const class verilog_declt &);
114114
void interface_function_or_task_decl(const class verilog_declt &);
115-
void interface_inst(const verilog_module_itemt &);
115+
void interface_inst(const verilog_inst_baset &);
116116
void interface_inst(
117-
const verilog_module_itemt &,
117+
const verilog_inst_baset &,
118118
const verilog_instt::instancet &op);
119119
void interface_module_item(const class verilog_module_itemt &);
120120
void interface_block(const class verilog_blockt &);

0 commit comments

Comments
 (0)