Use more C++11 features

This commit is contained in:
mole99 2023-07-12 15:10:23 +02:00
parent 7f5b8d49eb
commit 6b2990cfec
7 changed files with 73 additions and 114 deletions

View File

@ -19,8 +19,8 @@
# include "PTimingCheck.h" # include "PTimingCheck.h"
PRecRem::PRecRem(event_t reference_event, PRecRem::PRecRem(event_t* reference_event,
event_t data_event, event_t* data_event,
PExpr* setup_limit, PExpr* setup_limit,
PExpr* hold_limit, PExpr* hold_limit,
pform_name_t* notifier, pform_name_t* notifier,
@ -43,24 +43,10 @@ PRecRem::PRecRem(event_t reference_event,
PRecRem::~PRecRem() PRecRem::~PRecRem()
{ {
delete setup_limit_;
delete hold_limit_;
// Delete optional arguments
if (reference_event_.condition) delete reference_event_.condition;
if (data_event_.condition) delete data_event_.condition;
if(notifier_) delete notifier_;
if(timestamp_cond_) delete timestamp_cond_;
if(timecheck_cond_) delete timecheck_cond_;
if(delayed_reference_) delete delayed_reference_;
if(delayed_data_) delete delayed_data_;
} }
PSetupHold::PSetupHold(event_t reference_event, PSetupHold::PSetupHold(event_t* reference_event,
event_t data_event, event_t* data_event,
PExpr* setup_limit, PExpr* setup_limit,
PExpr* hold_limit, PExpr* hold_limit,
pform_name_t* notifier, pform_name_t* notifier,
@ -83,18 +69,4 @@ PSetupHold::PSetupHold(event_t reference_event,
PSetupHold::~PSetupHold() PSetupHold::~PSetupHold()
{ {
delete setup_limit_;
delete hold_limit_;
// Delete optional arguments
if (reference_event_.condition) delete reference_event_.condition;
if (data_event_.condition) delete data_event_.condition;
if(notifier_) delete notifier_;
if(timestamp_cond_) delete timestamp_cond_;
if(timecheck_cond_) delete timecheck_cond_;
if(delayed_reference_) delete delayed_reference_;
if(delayed_data_) delete delayed_data_;
} }

View File

@ -22,6 +22,7 @@
# include "LineInfo.h" # include "LineInfo.h"
# include "PExpr.h" # include "PExpr.h"
# include "pform_types.h" # include "pform_types.h"
# include <memory>
/* /*
* The PTimingCheck is the base class for all timing checks * The PTimingCheck is the base class for all timing checks
@ -36,7 +37,7 @@ class PTimingCheck : public LineInfo {
bool posedge; bool posedge;
bool negedge; bool negedge;
std::vector<EdgeType> edges; std::vector<EdgeType> edges;
PExpr* condition; std::unique_ptr<PExpr> condition;
}; };
// This struct is used to parse the optional arguments // This struct is used to parse the optional arguments
@ -65,8 +66,8 @@ class PRecRem : public PTimingCheck {
public: public:
PRecRem(event_t reference_event, PRecRem(event_t* reference_event,
event_t data_event, event_t* data_event,
PExpr* setup_limit, PExpr* setup_limit,
PExpr* hold_limit, PExpr* hold_limit,
pform_name_t* notifier, pform_name_t* notifier,
@ -82,19 +83,19 @@ class PRecRem : public PTimingCheck {
void dump(std::ostream&out, unsigned ind) const override; void dump(std::ostream&out, unsigned ind) const override;
private: private:
event_t reference_event_; // hierarchy_identifier std::unique_ptr<event_t> reference_event_;
event_t data_event_; std::unique_ptr<event_t> data_event_;
PExpr* setup_limit_; std::unique_ptr<PExpr> setup_limit_;
PExpr* hold_limit_; std::unique_ptr<PExpr> hold_limit_;
pform_name_t* notifier_; std::unique_ptr<pform_name_t> notifier_;
pform_name_t* timestamp_cond_; std::unique_ptr<pform_name_t> timestamp_cond_;
pform_name_t* timecheck_cond_; std::unique_ptr<pform_name_t> timecheck_cond_;
pform_name_t* delayed_reference_; std::unique_ptr<pform_name_t> delayed_reference_;
pform_name_t* delayed_data_; std::unique_ptr<pform_name_t> delayed_data_;
}; };
/* /*
@ -103,8 +104,8 @@ class PRecRem : public PTimingCheck {
class PSetupHold : public PTimingCheck { class PSetupHold : public PTimingCheck {
public: public:
PSetupHold(event_t reference_event, PSetupHold(event_t* reference_event,
event_t data_event, event_t* data_event,
PExpr* setup_limit, PExpr* setup_limit,
PExpr* hold_limit, PExpr* hold_limit,
pform_name_t* notifier, pform_name_t* notifier,
@ -120,19 +121,19 @@ class PSetupHold : public PTimingCheck {
void dump(std::ostream&out, unsigned ind) const override; void dump(std::ostream&out, unsigned ind) const override;
private: private:
event_t reference_event_; // hierarchy_identifier std::unique_ptr<event_t> reference_event_;
event_t data_event_; std::unique_ptr<event_t> data_event_;
PExpr* setup_limit_; std::unique_ptr<PExpr> setup_limit_;
PExpr* hold_limit_; std::unique_ptr<PExpr> hold_limit_;
pform_name_t* notifier_; std::unique_ptr<pform_name_t> notifier_;
pform_name_t* timestamp_cond_; std::unique_ptr<pform_name_t> timestamp_cond_;
pform_name_t* timecheck_cond_; std::unique_ptr<pform_name_t> timecheck_cond_;
pform_name_t* delayed_reference_; std::unique_ptr<pform_name_t> delayed_reference_;
pform_name_t* delayed_data_; std::unique_ptr<pform_name_t> delayed_data_;
}; };
#endif /* IVL_PTimingCheck_H */ #endif /* IVL_PTimingCheck_H */

View File

@ -6321,15 +6321,15 @@ void PRecRem::elaborate(Design*des, NetScope*scope) const
{ {
if (debug_elaborate) { if (debug_elaborate) {
cerr << get_fileline() << ": PRecRem::elaborate: Assigning " cerr << get_fileline() << ": PRecRem::elaborate: Assigning "
<< reference_event_.name << reference_event_->name
<< " to " << *delayed_reference_ << endl; << " to " << *delayed_reference_ << endl;
} }
NetNet*sig = des->find_signal(scope, reference_event_.name); NetNet*sig = des->find_signal(scope, reference_event_->name);
if (sig == nullptr) { if (sig == nullptr) {
cerr << get_fileline() << ": error: Cannot find: " cerr << get_fileline() << ": error: Cannot find: "
<< reference_event_.name << endl; << reference_event_->name << endl;
des->errors += 1; des->errors += 1;
return; return;
} }
@ -6350,15 +6350,15 @@ void PRecRem::elaborate(Design*des, NetScope*scope) const
{ {
if (debug_elaborate) { if (debug_elaborate) {
cerr << get_fileline() << ": PRecRem::elaborate: Assigning " cerr << get_fileline() << ": PRecRem::elaborate: Assigning "
<< data_event_.name << data_event_->name
<< " to " << *delayed_data_ << endl; << " to " << *delayed_data_ << endl;
} }
NetNet*sig = des->find_signal(scope, data_event_.name); NetNet*sig = des->find_signal(scope, data_event_->name);
if (sig == nullptr) { if (sig == nullptr) {
cerr << get_fileline() << ": error: Cannot find: " cerr << get_fileline() << ": error: Cannot find: "
<< data_event_.name << endl; << data_event_->name << endl;
des->errors += 1; des->errors += 1;
return; return;
} }
@ -6388,15 +6388,15 @@ void PSetupHold::elaborate(Design*des, NetScope*scope) const
{ {
if (debug_elaborate) { if (debug_elaborate) {
cerr << get_fileline() << ": PSetupHold::elaborate: Assigning" cerr << get_fileline() << ": PSetupHold::elaborate: Assigning"
<< reference_event_.name << reference_event_->name
<< " to " << *delayed_reference_ << endl; << " to " << *delayed_reference_ << endl;
} }
NetNet*sig = des->find_signal(scope, reference_event_.name); NetNet*sig = des->find_signal(scope, reference_event_->name);
if (sig == nullptr) { if (sig == nullptr) {
cerr << get_fileline() << ": error: Cannot find: " cerr << get_fileline() << ": error: Cannot find: "
<< reference_event_.name << endl; << reference_event_->name << endl;
des->errors += 1; des->errors += 1;
return; return;
} }
@ -6417,15 +6417,15 @@ void PSetupHold::elaborate(Design*des, NetScope*scope) const
{ {
if (debug_elaborate) { if (debug_elaborate) {
cerr << get_fileline() << ": PSetupHold::elaborate: Assigning" cerr << get_fileline() << ": PSetupHold::elaborate: Assigning"
<< reference_event_.name << data_event_->name
<< " to " << *delayed_reference_ << endl; << " to " << *delayed_data_ << endl;
} }
NetNet*sig = des->find_signal(scope, data_event_.name); NetNet*sig = des->find_signal(scope, data_event_->name);
if (sig == nullptr) { if (sig == nullptr) {
cerr << get_fileline() << ": error: Cannot find: " cerr << get_fileline() << ": error: Cannot find: "
<< data_event_.name << endl; << data_event_->name << endl;
des->errors += 1; des->errors += 1;
return; return;
} }
@ -6518,10 +6518,8 @@ bool Module::elaborate(Design*des, NetScope*scope) const
bool result_flag = true; bool result_flag = true;
// Elaborate within the generate blocks. // Elaborate within the generate blocks.
typedef list<PGenerate*>::const_iterator generate_it_t; for (const auto cur : generate_schemes) {
for (generate_it_t cur = generate_schemes.begin() cur->elaborate(des, scope);
; cur != generate_schemes.end() ; ++ cur ) {
(*cur)->elaborate(des, scope);
} }
// Elaborate functions. // Elaborate functions.
@ -6540,10 +6538,8 @@ bool Module::elaborate(Design*des, NetScope*scope) const
// complex. // complex.
const list<PGate*>&gl = get_gates(); const list<PGate*>&gl = get_gates();
for (list<PGate*>::const_iterator gt = gl.begin() for (const auto gt : gl) {
; gt != gl.end() ; ++ gt ) { gt->elaborate(des, scope);
(*gt)->elaborate(des, scope);
} }
// Elaborate the variable initialization statements, making a // Elaborate the variable initialization statements, making a
@ -6556,23 +6552,18 @@ bool Module::elaborate(Design*des, NetScope*scope) const
result_flag &= elaborate_behaviors_(des, scope); result_flag &= elaborate_behaviors_(des, scope);
// Elaborate the specify paths of the module. // Elaborate the specify paths of the module.
for (list<PSpecPath*>::const_iterator sp = specify_paths.begin() for (const auto sp : specify_paths) {
; sp != specify_paths.end() ; ++ sp ) { sp->elaborate(des, scope);
(*sp)->elaborate(des, scope);
} }
// Elaborate the timing checks of the module. // Elaborate the timing checks of the module.
for (list<PTimingCheck*>::const_iterator tc = timing_checks.begin() for (const auto tc : timing_checks) {
; tc != timing_checks.end() ; ++ tc ) { tc->elaborate(des, scope);
(*tc)->elaborate(des, scope);
} }
// Elaborate the elaboration tasks. // Elaborate the elaboration tasks.
for (list<PCallTask*>::const_iterator et = elab_tasks.begin() for (const auto et : elab_tasks) {
; et != elab_tasks.end() ; ++ et ) { result_flag &= et->elaborate_elab(des, scope);
result_flag &= (*et)->elaborate_elab(des, scope);
} }
return result_flag; return result_flag;

25
parse.y
View File

@ -33,6 +33,7 @@
# include <stack> # include <stack>
# include <cstring> # include <cstring>
# include <sstream> # include <sstream>
# include <memory>
using namespace std; using namespace std;
@ -5970,11 +5971,9 @@ specify_item
cerr << endl; cerr << endl;
} }
PRecRem*recrem = pform_make_recrem(@1, *$3, *$5, $7, $9, $10); PRecRem*recrem = pform_make_recrem(@1, $3, $5, $7, $9, $10);
pform_module_timing_check((PTimingCheck*)recrem); pform_module_timing_check(recrem);
delete $3; // spec_reference_event
delete $5; // spec_reference_event
delete $10; // setuphold_recrem_opt_notifier delete $10; // setuphold_recrem_opt_notifier
} }
| K_Sremoval '(' spec_reference_event ',' spec_reference_event | K_Sremoval '(' spec_reference_event ',' spec_reference_event
@ -6009,11 +6008,9 @@ specify_item
cerr << endl; cerr << endl;
} }
PSetupHold*setuphold = pform_make_setuphold(@1, *$3, *$5, $7, $9, $10); PSetupHold*setuphold = pform_make_setuphold(@1, $3, $5, $7, $9, $10);
pform_module_timing_check((PTimingCheck*)setuphold); pform_module_timing_check(setuphold);
delete $3; // spec_reference_event
delete $5; // spec_reference_event
delete $10; // setuphold_recrem_opt_notifier delete $10; // setuphold_recrem_opt_notifier
} }
| K_Sskew '(' spec_reference_event ',' spec_reference_event | K_Sskew '(' spec_reference_event ',' spec_reference_event
@ -6267,7 +6264,7 @@ spec_reference_event
event->name = *$1; event->name = *$1;
event->posedge = false; event->posedge = false;
event->negedge = false; event->negedge = false;
event->condition = $3; event->condition = std::unique_ptr<PExpr>($3);
delete $1; delete $1;
$$ = event; $$ = event;
} }
@ -6294,7 +6291,7 @@ spec_reference_event
event->name = *$2; event->name = *$2;
event->posedge = true; event->posedge = true;
event->negedge = false; event->negedge = false;
event->condition = $4; event->condition = std::unique_ptr<PExpr>($4);
delete $2; delete $2;
$$ = event; $$ = event;
} }
@ -6303,7 +6300,7 @@ spec_reference_event
event->name = *$2; event->name = *$2;
event->posedge = false; event->posedge = false;
event->negedge = true; event->negedge = true;
event->condition = $4; event->condition = std::unique_ptr<PExpr>($4);
delete $2; delete $2;
$$ = event; $$ = event;
} }
@ -6323,7 +6320,7 @@ spec_reference_event
event->posedge = false; event->posedge = false;
event->negedge = false; event->negedge = false;
// TODO add edge descriptors // TODO add edge descriptors
event->condition = $7; event->condition = std::unique_ptr<PExpr>($7);
delete $5; delete $5;
$$ = event; $$ = event;
} }
@ -6526,14 +6523,14 @@ timeskew_fullskew_opt_remain_active_flag
spec_notifier_opt spec_notifier_opt
: /* empty */ : /* empty */
{ $$ = 0; } { $$ = nullptr; }
| spec_notifier | spec_notifier
{ $$ = $1; } { $$ = $1; }
; ;
spec_notifier spec_notifier
: ',' : ','
{ $$ = 0; } { $$ = nullptr; }
| ',' hierarchy_identifier | ',' hierarchy_identifier
{ $$ = $2; } { $$ = $2; }
; ;

View File

@ -3114,8 +3114,8 @@ extern void pform_module_specify_path(PSpecPath*obj)
* Timing checks. * Timing checks.
*/ */
extern PRecRem* pform_make_recrem(const struct vlltype&li, extern PRecRem* pform_make_recrem(const struct vlltype&li,
PTimingCheck::event_t&reference_event, PTimingCheck::event_t*reference_event,
PTimingCheck::event_t&data_event, PTimingCheck::event_t*data_event,
PExpr*setup_limit, PExpr*setup_limit,
PExpr*hold_limit, PExpr*hold_limit,
PTimingCheck::optional_args_t* args) PTimingCheck::optional_args_t* args)
@ -3139,8 +3139,8 @@ extern void pform_module_specify_path(PSpecPath*obj)
return recrem; return recrem;
} }
extern PSetupHold* pform_make_setuphold(const struct vlltype&li, extern PSetupHold* pform_make_setuphold(const struct vlltype&li,
PTimingCheck::event_t&reference_event, PTimingCheck::event_t*reference_event,
PTimingCheck::event_t&data_event, PTimingCheck::event_t*data_event,
PExpr*setup_limit, PExpr*setup_limit,
PExpr*hold_limit, PExpr*hold_limit,
PTimingCheck::optional_args_t* args) PTimingCheck::optional_args_t* args)
@ -3166,7 +3166,7 @@ extern PSetupHold* pform_make_setuphold(const struct vlltype&li,
extern void pform_module_timing_check(PTimingCheck*obj) extern void pform_module_timing_check(PTimingCheck*obj)
{ {
if (obj == 0) if (!obj)
return; return;
pform_cur_module.front()->timing_checks.push_back(obj); pform_cur_module.front()->timing_checks.push_back(obj);

View File

@ -434,15 +434,15 @@ extern void pform_module_specify_path(PSpecPath*obj);
* Functions related to timing checks. * Functions related to timing checks.
*/ */
extern PRecRem* pform_make_recrem(const struct vlltype&li, extern PRecRem* pform_make_recrem(const struct vlltype&li,
PTimingCheck::event_t&reference_event, PTimingCheck::event_t*reference_event,
PTimingCheck::event_t&data_event, PTimingCheck::event_t*data_event,
PExpr*setup_limit, PExpr*setup_limit,
PExpr*hold_limit, PExpr*hold_limit,
PTimingCheck::optional_args_t* args PTimingCheck::optional_args_t* args
); );
extern PSetupHold* pform_make_setuphold(const struct vlltype&li, extern PSetupHold* pform_make_setuphold(const struct vlltype&li,
PTimingCheck::event_t&reference_event, PTimingCheck::event_t*reference_event,
PTimingCheck::event_t&data_event, PTimingCheck::event_t*data_event,
PExpr*setup_limit, PExpr*setup_limit,
PExpr*hold_limit, PExpr*hold_limit,
PTimingCheck::optional_args_t* args PTimingCheck::optional_args_t* args

View File

@ -1718,10 +1718,8 @@ void Module::dump_timingchecks_(ostream&out, unsigned indent) const
{ {
cout << "dump_timingchecks_" << endl; cout << "dump_timingchecks_" << endl;
typedef list<PTimingCheck*>::const_iterator tcheck_iter_t; for (const auto cur : timing_checks) {
for (tcheck_iter_t cur = timing_checks.begin() cur->dump(out, indent);
; cur != timing_checks.end() ; ++ cur ) {
(*cur)->dump(out, indent);
} }
} }