Improve parsing of timing checks
This commit is contained in:
parent
e54ff22fce
commit
d46628b2f2
|
|
@ -21,8 +21,8 @@
|
||||||
|
|
||||||
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,
|
||||||
pform_name_t* timestamp_cond,
|
pform_name_t* timestamp_cond,
|
||||||
pform_name_t* timecheck_cond,
|
pform_name_t* timecheck_cond,
|
||||||
|
|
@ -31,8 +31,8 @@ PRecRem::PRecRem(event_t reference_event,
|
||||||
:
|
:
|
||||||
reference_event_ (reference_event),
|
reference_event_ (reference_event),
|
||||||
data_event_ (data_event),
|
data_event_ (data_event),
|
||||||
//setup_limit (setup_limit),
|
setup_limit_ (setup_limit),
|
||||||
//hold_limit (hold_limit),
|
hold_limit_ (hold_limit),
|
||||||
notifier_ (notifier),
|
notifier_ (notifier),
|
||||||
timestamp_cond_ (timestamp_cond),
|
timestamp_cond_ (timestamp_cond),
|
||||||
timecheck_cond_ (timecheck_cond),
|
timecheck_cond_ (timecheck_cond),
|
||||||
|
|
@ -43,6 +43,9 @@ PRecRem::PRecRem(event_t reference_event,
|
||||||
|
|
||||||
PRecRem::~PRecRem()
|
PRecRem::~PRecRem()
|
||||||
{
|
{
|
||||||
|
delete setup_limit_;
|
||||||
|
delete hold_limit_;
|
||||||
|
|
||||||
// Delete optional arguments
|
// Delete optional arguments
|
||||||
if (reference_event_.condition) delete reference_event_.condition;
|
if (reference_event_.condition) delete reference_event_.condition;
|
||||||
if (data_event_.condition) delete data_event_.condition;
|
if (data_event_.condition) delete data_event_.condition;
|
||||||
|
|
@ -58,8 +61,8 @@ PRecRem::~PRecRem()
|
||||||
|
|
||||||
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,
|
||||||
pform_name_t* timestamp_cond,
|
pform_name_t* timestamp_cond,
|
||||||
pform_name_t* timecheck_cond,
|
pform_name_t* timecheck_cond,
|
||||||
|
|
@ -68,8 +71,8 @@ PSetupHold::PSetupHold(event_t reference_event,
|
||||||
:
|
:
|
||||||
reference_event_ (reference_event),
|
reference_event_ (reference_event),
|
||||||
data_event_ (data_event),
|
data_event_ (data_event),
|
||||||
//setup_limit (setup_limit),
|
setup_limit_ (setup_limit),
|
||||||
//hold_limit (hold_limit),
|
hold_limit_ (hold_limit),
|
||||||
notifier_ (notifier),
|
notifier_ (notifier),
|
||||||
timestamp_cond_ (timestamp_cond),
|
timestamp_cond_ (timestamp_cond),
|
||||||
timecheck_cond_ (timecheck_cond),
|
timecheck_cond_ (timecheck_cond),
|
||||||
|
|
@ -80,6 +83,9 @@ PSetupHold::PSetupHold(event_t reference_event,
|
||||||
|
|
||||||
PSetupHold::~PSetupHold()
|
PSetupHold::~PSetupHold()
|
||||||
{
|
{
|
||||||
|
delete setup_limit_;
|
||||||
|
delete hold_limit_;
|
||||||
|
|
||||||
// Delete optional arguments
|
// Delete optional arguments
|
||||||
if (reference_event_.condition) delete reference_event_.condition;
|
if (reference_event_.condition) delete reference_event_.condition;
|
||||||
if (data_event_.condition) delete data_event_.condition;
|
if (data_event_.condition) delete data_event_.condition;
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
# include "LineInfo.h"
|
# include "LineInfo.h"
|
||||||
|
# include "PExpr.h"
|
||||||
# include "pform_types.h"
|
# include "pform_types.h"
|
||||||
|
|
||||||
// TODO cleanup in destructor and cleanup in Module!
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The PTimingCheck is the base class for all timing checks
|
* The PTimingCheck is the base class for all timing checks
|
||||||
*/
|
*/
|
||||||
|
|
@ -40,6 +39,17 @@ class PTimingCheck : public LineInfo {
|
||||||
PExpr* condition;
|
PExpr* condition;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This struct is used to parse the optional arguments
|
||||||
|
struct optional_args_t {
|
||||||
|
pform_name_t* notifier = nullptr;
|
||||||
|
pform_name_t* timestamp_cond = nullptr;
|
||||||
|
pform_name_t* timecheck_cond = nullptr;
|
||||||
|
pform_name_t* delayed_reference = nullptr;
|
||||||
|
pform_name_t* delayed_data = nullptr;
|
||||||
|
PExpr* event_based_flag = nullptr;
|
||||||
|
PExpr* remain_active_flag = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
PTimingCheck() { }
|
PTimingCheck() { }
|
||||||
virtual ~PTimingCheck() { }
|
virtual ~PTimingCheck() { }
|
||||||
|
|
||||||
|
|
@ -54,10 +64,11 @@ class PTimingCheck : public LineInfo {
|
||||||
class PRecRem : public PTimingCheck {
|
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,
|
||||||
pform_name_t* timestamp_cond,
|
pform_name_t* timestamp_cond,
|
||||||
pform_name_t* timecheck_cond,
|
pform_name_t* timecheck_cond,
|
||||||
|
|
@ -70,12 +81,12 @@ class PRecRem : public PTimingCheck {
|
||||||
|
|
||||||
void dump(std::ostream&out, unsigned ind) const override;
|
void dump(std::ostream&out, unsigned ind) const override;
|
||||||
|
|
||||||
public: // TODO
|
private:
|
||||||
event_t reference_event_; // hierarchy_identifier
|
event_t reference_event_; // hierarchy_identifier
|
||||||
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_;
|
||||||
|
|
||||||
|
|
@ -94,8 +105,8 @@ 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,
|
||||||
pform_name_t* timestamp_cond,
|
pform_name_t* timestamp_cond,
|
||||||
pform_name_t* timecheck_cond,
|
pform_name_t* timecheck_cond,
|
||||||
|
|
@ -108,12 +119,12 @@ class PSetupHold : public PTimingCheck {
|
||||||
|
|
||||||
void dump(std::ostream&out, unsigned ind) const override;
|
void dump(std::ostream&out, unsigned ind) const override;
|
||||||
|
|
||||||
public: // TODO
|
private:
|
||||||
event_t reference_event_; // hierarchy_identifier
|
event_t reference_event_; // hierarchy_identifier
|
||||||
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_;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -84,9 +84,9 @@ module test;
|
||||||
$timeskew(posedge sig1, negedge sig2 , 0:0:0 , notifier);
|
$timeskew(posedge sig1, negedge sig2 , 0:0:0 , notifier);
|
||||||
$timeskew(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , notifier);
|
$timeskew(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , notifier);
|
||||||
$timeskew(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , notifier);
|
$timeskew(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , notifier);
|
||||||
// TODO $timeskew(posedge sig1 , negedge sig2 , 0:0:0, notifier , 1'b0);
|
$timeskew(posedge sig1 , negedge sig2 , 0:0:0, notifier , 1'b0);
|
||||||
// TODO $timeskew(negedge sig1 , posedge sig2 , 0:0:0 , 1'b1 , 1'b0);
|
$timeskew(negedge sig1 , posedge sig2 , 0:0:0 , 1'b1 , 1'b0);
|
||||||
// TODO $timeskew(negedge sig1 , posedge sig2 , 0:0:0 , , 1'b1);
|
$timeskew(negedge sig1 , posedge sig2 , 0:0:0 , , 1'b1);
|
||||||
|
|
||||||
$fullskew(posedge sig1 , negedge sig2 , 0:0:0 , 0:0:0);
|
$fullskew(posedge sig1 , negedge sig2 , 0:0:0 , 0:0:0);
|
||||||
$fullskew(negedge sig1 , posedge sig2 , 0:0:0 , 0:0:0);
|
$fullskew(negedge sig1 , posedge sig2 , 0:0:0 , 0:0:0);
|
||||||
|
|
@ -95,9 +95,9 @@ module test;
|
||||||
$fullskew(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier);
|
$fullskew(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier);
|
||||||
$fullskew(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , 0:0:0 , notifier);
|
$fullskew(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , 0:0:0 , notifier);
|
||||||
$fullskew(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , 0:0:0 , notifier);
|
$fullskew(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , 0:0:0 , notifier);
|
||||||
// TODO $fullskew(posedge sig1 , negedge sig2 , 0:0:0, notifier , 1'b0);
|
$fullskew(posedge sig1 , negedge sig2 , 0:0:0, notifier , 1'b0);
|
||||||
// TODO $fullskew(negedge sig1 , posedge sig2 , 0:0:0 , 1'b1 , 1'b0);
|
$fullskew(negedge sig1 , posedge sig2 , 0:0:0 , 1'b1 , 1'b0);
|
||||||
// TODO $fullskew(negedge sig1 , posedge sig2 , 0:0:0 , , 1'b1);
|
$fullskew(negedge sig1 , posedge sig2 , 0:0:0 , , 1'b1);
|
||||||
|
|
||||||
$width(posedge sig1 , 0:0:0 );
|
$width(posedge sig1 , 0:0:0 );
|
||||||
$width(posedge sig1 &&& cond1 , 0:0:0 , 0 );
|
$width(posedge sig1 &&& cond1 , 0:0:0 , 0 );
|
||||||
|
|
|
||||||
267
parse.y
267
parse.y
|
|
@ -525,6 +525,7 @@ Module::port_t *module_declare_port(const YYLTYPE&loc, char *id,
|
||||||
std::list<index_component_t> *dimensions;
|
std::list<index_component_t> *dimensions;
|
||||||
|
|
||||||
PTimingCheck::event_t* timing_check_event;
|
PTimingCheck::event_t* timing_check_event;
|
||||||
|
PTimingCheck::optional_args_t* spec_optional_args;
|
||||||
|
|
||||||
LexicalScope::lifetime_t lifetime;
|
LexicalScope::lifetime_t lifetime;
|
||||||
|
|
||||||
|
|
@ -692,9 +693,15 @@ Module::port_t *module_declare_port(const YYLTYPE&loc, char *id,
|
||||||
%type <let_port_itm> let_port_item
|
%type <let_port_itm> let_port_item
|
||||||
|
|
||||||
%type <pform_name> hierarchy_identifier implicit_class_handle class_hierarchy_identifier
|
%type <pform_name> hierarchy_identifier implicit_class_handle class_hierarchy_identifier
|
||||||
%type <pform_name> spec_notifier_opt spec_notifier spec_condition_opt
|
%type <pform_name> spec_notifier_opt spec_notifier
|
||||||
%type <pform_name> spec_condition spec_delayed_opt spec_delayed
|
|
||||||
%type <timing_check_event> spec_reference_event
|
%type <timing_check_event> spec_reference_event
|
||||||
|
%type <spec_optional_args> setuphold_opt_args recrem_opt_args setuphold_recrem_opt_notifier
|
||||||
|
%type <spec_optional_args> setuphold_recrem_opt_timestamp_cond setuphold_recrem_opt_timecheck_cond
|
||||||
|
%type <spec_optional_args> setuphold_recrem_opt_delayed_reference setuphold_recrem_opt_delayed_data
|
||||||
|
%type <spec_optional_args> timeskew_opt_args fullskew_opt_args
|
||||||
|
%type <spec_optional_args> timeskew_fullskew_opt_notifier timeskew_fullskew_opt_event_based_flag
|
||||||
|
%type <spec_optional_args> timeskew_fullskew_opt_remain_active_flag
|
||||||
|
|
||||||
%type <expr> assignment_pattern expression expr_mintypmax
|
%type <expr> assignment_pattern expression expr_mintypmax
|
||||||
%type <expr> expr_primary_or_typename expr_primary
|
%type <expr> expr_primary_or_typename expr_primary
|
||||||
%type <expr> class_new dynamic_array_new
|
%type <expr> class_new dynamic_array_new
|
||||||
|
|
@ -5899,14 +5906,19 @@ specify_item
|
||||||
yyerrok;
|
yyerrok;
|
||||||
}
|
}
|
||||||
| K_Sfullskew '(' spec_reference_event ',' spec_reference_event
|
| K_Sfullskew '(' spec_reference_event ',' spec_reference_event
|
||||||
',' delay_value ',' delay_value spec_notifier_opt /* TODO event_based_flag remain_active_flag */ ')' ';'
|
',' delay_value ',' delay_value fullskew_opt_args ')' ';'
|
||||||
{
|
{
|
||||||
cerr << @3 << ": warning: Timing checks are not supported." << endl;
|
cerr << @3 << ": warning: Timing checks are not supported." << endl;
|
||||||
delete $3; // spec_reference_event
|
delete $3; // spec_reference_event
|
||||||
delete $5; // spec_reference_event
|
delete $5; // spec_reference_event
|
||||||
delete $7; // delay_value
|
delete $7; // delay_value
|
||||||
delete $9; // delay_value
|
delete $9; // delay_value
|
||||||
if($10) delete $10; // spec_notifier_opt
|
|
||||||
|
if ($10->notifier) delete $10->notifier;
|
||||||
|
if ($10->event_based_flag) delete $10->event_based_flag;
|
||||||
|
if ($10->remain_active_flag) delete $10->remain_active_flag;
|
||||||
|
|
||||||
|
delete $10; // fullskew_opt_args
|
||||||
}
|
}
|
||||||
| K_Shold '(' spec_reference_event ',' spec_reference_event
|
| K_Shold '(' spec_reference_event ',' spec_reference_event
|
||||||
',' delay_value spec_notifier_opt ')' ';'
|
',' delay_value spec_notifier_opt ')' ';'
|
||||||
|
|
@ -5945,11 +5957,10 @@ specify_item
|
||||||
if($8) delete $8; // spec_notifier_opt
|
if($8) delete $8; // spec_notifier_opt
|
||||||
}
|
}
|
||||||
| K_Srecrem '(' spec_reference_event ',' spec_reference_event
|
| K_Srecrem '(' spec_reference_event ',' spec_reference_event
|
||||||
',' expr_mintypmax ',' expr_mintypmax spec_notifier_opt spec_condition_opt
|
',' expr_mintypmax ',' expr_mintypmax recrem_opt_args ')' ';'
|
||||||
spec_condition_opt spec_delayed_opt spec_delayed_opt ')' ';'
|
|
||||||
{
|
{
|
||||||
cerr << @3 << ": warning: Timing checks are not supported. ";
|
cerr << @3 << ": warning: Timing checks are not supported. ";
|
||||||
if ($13 != nullptr || $14 != nullptr)
|
if ($10->delayed_reference != nullptr || $10->delayed_data != nullptr)
|
||||||
{
|
{
|
||||||
cerr << "Delayed reference and data signals become copies of the"
|
cerr << "Delayed reference and data signals become copies of the"
|
||||||
<< " original reference and data signals." << endl;
|
<< " original reference and data signals." << endl;
|
||||||
|
|
@ -5959,13 +5970,12 @@ specify_item
|
||||||
cerr << endl;
|
cerr << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRecRem*rec_rem = pform_make_rec_rem(@1, *$3, *$5, *$7, *$9, $10, $11, $12, $13, $14);
|
PRecRem*recrem = pform_make_recrem(@1, *$3, *$5, $7, $9, $10);
|
||||||
pform_module_timing_check((PTimingCheck*)rec_rem);
|
pform_module_timing_check((PTimingCheck*)recrem);
|
||||||
|
|
||||||
delete $3; // spec_reference_event
|
delete $3; // spec_reference_event
|
||||||
delete $5; // spec_reference_event
|
delete $5; // spec_reference_event
|
||||||
delete $7; // delay_value
|
delete $10; // setuphold_recrem_opt_notifier
|
||||||
delete $9; // delay_value
|
|
||||||
}
|
}
|
||||||
| K_Sremoval '(' spec_reference_event ',' spec_reference_event
|
| K_Sremoval '(' spec_reference_event ',' spec_reference_event
|
||||||
',' delay_value spec_notifier_opt ')' ';'
|
',' delay_value spec_notifier_opt ')' ';'
|
||||||
|
|
@ -5986,11 +5996,10 @@ specify_item
|
||||||
if($8) delete $8; // spec_notifier_opt
|
if($8) delete $8; // spec_notifier_opt
|
||||||
}
|
}
|
||||||
| K_Ssetuphold '(' spec_reference_event ',' spec_reference_event
|
| K_Ssetuphold '(' spec_reference_event ',' spec_reference_event
|
||||||
',' expr_mintypmax ',' expr_mintypmax spec_notifier_opt spec_condition_opt
|
',' expr_mintypmax ',' expr_mintypmax setuphold_opt_args ')' ';'
|
||||||
spec_condition_opt spec_delayed_opt spec_delayed_opt ')' ';'
|
|
||||||
{
|
{
|
||||||
cerr << @3 << ": warning: Timing checks are not supported. ";
|
cerr << @3 << ": warning: Timing checks are not supported. ";
|
||||||
if ($13 != nullptr || $14 != nullptr)
|
if ($10->delayed_reference != nullptr || $10->delayed_data != nullptr)
|
||||||
{
|
{
|
||||||
cerr << "Delayed reference and data signals become copies of the"
|
cerr << "Delayed reference and data signals become copies of the"
|
||||||
<< " original reference and data signals." << endl;
|
<< " original reference and data signals." << endl;
|
||||||
|
|
@ -6000,13 +6009,12 @@ specify_item
|
||||||
cerr << endl;
|
cerr << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
PSetupHold*setup_hold = pform_make_setup_hold(@1, *$3, *$5, *$7, *$9, $10, $11, $12, $13, $14);
|
PSetupHold*setuphold = pform_make_setuphold(@1, *$3, *$5, $7, $9, $10);
|
||||||
pform_module_timing_check((PTimingCheck*)setup_hold);
|
pform_module_timing_check((PTimingCheck*)setuphold);
|
||||||
|
|
||||||
delete $3; // spec_reference_event
|
delete $3; // spec_reference_event
|
||||||
delete $5; // spec_reference_event
|
delete $5; // spec_reference_event
|
||||||
delete $7; // delay_value
|
delete $10; // setuphold_recrem_opt_notifier
|
||||||
delete $9; // delay_value
|
|
||||||
}
|
}
|
||||||
| K_Sskew '(' spec_reference_event ',' spec_reference_event
|
| K_Sskew '(' spec_reference_event ',' spec_reference_event
|
||||||
',' delay_value spec_notifier_opt ')' ';'
|
',' delay_value spec_notifier_opt ')' ';'
|
||||||
|
|
@ -6018,13 +6026,18 @@ specify_item
|
||||||
if($8) delete $8; // spec_notifier_opt
|
if($8) delete $8; // spec_notifier_opt
|
||||||
}
|
}
|
||||||
| K_Stimeskew '(' spec_reference_event ',' spec_reference_event
|
| K_Stimeskew '(' spec_reference_event ',' spec_reference_event
|
||||||
',' delay_value spec_notifier_opt /* TODO event_based_flag remain_active_flag */ ')' ';'
|
',' delay_value timeskew_opt_args ')' ';'
|
||||||
{
|
{
|
||||||
cerr << @3 << ": warning: Timing checks are not supported." << endl;
|
cerr << @3 << ": warning: Timing checks are not supported." << endl;
|
||||||
delete $3; // spec_reference_event
|
delete $3; // spec_reference_event
|
||||||
delete $5; // spec_reference_event
|
delete $5; // spec_reference_event
|
||||||
delete $7; // delay_value
|
delete $7; // delay_value
|
||||||
if($8) delete $8; // spec_notifier_opt
|
|
||||||
|
if ($8->notifier) delete $8->notifier;
|
||||||
|
if ($8->event_based_flag) delete $8->event_based_flag;
|
||||||
|
if ($8->remain_active_flag) delete $8->remain_active_flag;
|
||||||
|
|
||||||
|
delete $8; // timeskew_opt_args
|
||||||
}
|
}
|
||||||
| K_Swidth '(' spec_reference_event ',' delay_value ',' expression
|
| K_Swidth '(' spec_reference_event ',' delay_value ',' expression
|
||||||
spec_notifier_opt ')' ';'
|
spec_notifier_opt ')' ';'
|
||||||
|
|
@ -6325,6 +6338,192 @@ edge_descriptor_list
|
||||||
| K_edge_descriptor
|
| K_edge_descriptor
|
||||||
;
|
;
|
||||||
|
|
||||||
|
setuphold_opt_args
|
||||||
|
: setuphold_recrem_opt_notifier
|
||||||
|
{ $$ = $1; }
|
||||||
|
|
|
||||||
|
{ $$ = new PTimingCheck::optional_args_t; }
|
||||||
|
;
|
||||||
|
|
||||||
|
recrem_opt_args
|
||||||
|
: setuphold_recrem_opt_notifier
|
||||||
|
{ $$ = $1; }
|
||||||
|
|
|
||||||
|
{ $$ = new PTimingCheck::optional_args_t; }
|
||||||
|
;
|
||||||
|
|
||||||
|
/* The following rules are used for the optional arguments
|
||||||
|
in $recrem and $setuphold */
|
||||||
|
setuphold_recrem_opt_notifier
|
||||||
|
: ',' // Empty and end of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' hierarchy_identifier // End of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
args->notifier = $2;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' setuphold_recrem_opt_timestamp_cond // Empty
|
||||||
|
{ $$ = $2; }
|
||||||
|
| ',' hierarchy_identifier setuphold_recrem_opt_timestamp_cond
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
$$->notifier = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
setuphold_recrem_opt_timestamp_cond
|
||||||
|
: ',' // Empty and end of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' hierarchy_identifier // End of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
args->timestamp_cond = $2;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' setuphold_recrem_opt_timecheck_cond // Empty
|
||||||
|
{ $$ = $2; }
|
||||||
|
| ',' hierarchy_identifier setuphold_recrem_opt_timecheck_cond
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
$$->timestamp_cond = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
setuphold_recrem_opt_timecheck_cond
|
||||||
|
: ',' // Empty and end of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' hierarchy_identifier // End of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
args->timecheck_cond = $2;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' setuphold_recrem_opt_delayed_reference // Empty
|
||||||
|
{ $$ = $2; }
|
||||||
|
| ',' hierarchy_identifier setuphold_recrem_opt_delayed_reference
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
$$->timecheck_cond = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
setuphold_recrem_opt_delayed_reference
|
||||||
|
: ',' // Empty and end of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' hierarchy_identifier // End of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
args->delayed_reference = $2;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' setuphold_recrem_opt_delayed_data // Empty
|
||||||
|
{ $$ = $2; }
|
||||||
|
| ',' hierarchy_identifier setuphold_recrem_opt_delayed_data
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
$$->delayed_reference = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
setuphold_recrem_opt_delayed_data
|
||||||
|
: ',' // Empty and end of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' hierarchy_identifier // End of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
args->delayed_data = $2;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
timeskew_opt_args
|
||||||
|
: timeskew_fullskew_opt_notifier
|
||||||
|
{ $$ = $1; }
|
||||||
|
|
|
||||||
|
{ $$ = new PTimingCheck::optional_args_t; }
|
||||||
|
;
|
||||||
|
|
||||||
|
fullskew_opt_args
|
||||||
|
: timeskew_fullskew_opt_notifier
|
||||||
|
{ $$ = $1; }
|
||||||
|
|
|
||||||
|
{ $$ = new PTimingCheck::optional_args_t; }
|
||||||
|
;
|
||||||
|
|
||||||
|
/* The following rules are used for the optional arguments
|
||||||
|
in $timeskew and $fullskew */
|
||||||
|
timeskew_fullskew_opt_notifier
|
||||||
|
: ',' // Empty and end of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' hierarchy_identifier // End of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
args->notifier = $2;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' timeskew_fullskew_opt_event_based_flag // Empty
|
||||||
|
{ $$ = $2; }
|
||||||
|
| ',' hierarchy_identifier timeskew_fullskew_opt_event_based_flag
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
$$->notifier = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
timeskew_fullskew_opt_event_based_flag
|
||||||
|
: ',' // Empty and end of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' expression // End of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
args->event_based_flag = $2;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' timeskew_fullskew_opt_remain_active_flag // Empty
|
||||||
|
{ $$ = $2; }
|
||||||
|
| ',' expression timeskew_fullskew_opt_remain_active_flag
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
$$->event_based_flag = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
timeskew_fullskew_opt_remain_active_flag
|
||||||
|
: ',' // Empty and end of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
| ',' expression // End of list
|
||||||
|
{
|
||||||
|
PTimingCheck::optional_args_t* args = new PTimingCheck::optional_args_t;
|
||||||
|
args->remain_active_flag = $2;
|
||||||
|
$$ = args;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
spec_notifier_opt
|
spec_notifier_opt
|
||||||
: /* empty */
|
: /* empty */
|
||||||
{ $$ = 0; }
|
{ $$ = 0; }
|
||||||
|
|
@ -6339,34 +6538,6 @@ spec_notifier
|
||||||
{ $$ = $2; }
|
{ $$ = $2; }
|
||||||
;
|
;
|
||||||
|
|
||||||
spec_condition_opt
|
|
||||||
: /* empty */
|
|
||||||
{ $$ = 0; }
|
|
||||||
| spec_condition
|
|
||||||
{ $$ = $1; }
|
|
||||||
;
|
|
||||||
|
|
||||||
spec_condition
|
|
||||||
: ','
|
|
||||||
{ $$ = 0; }
|
|
||||||
| ',' hierarchy_identifier
|
|
||||||
{ $$ = $2; }
|
|
||||||
;
|
|
||||||
|
|
||||||
spec_delayed_opt
|
|
||||||
: /* empty */
|
|
||||||
{ $$ = 0; }
|
|
||||||
| spec_delayed
|
|
||||||
{ $$ = $1; }
|
|
||||||
;
|
|
||||||
|
|
||||||
spec_delayed
|
|
||||||
: ','
|
|
||||||
{ $$ = 0; }
|
|
||||||
| ',' hierarchy_identifier
|
|
||||||
{ $$ = $2; }
|
|
||||||
;
|
|
||||||
|
|
||||||
subroutine_call
|
subroutine_call
|
||||||
: hierarchy_identifier argument_list_parens_opt
|
: hierarchy_identifier argument_list_parens_opt
|
||||||
{ PCallTask*tmp = pform_make_call_task(@1, *$1, *$2);
|
{ PCallTask*tmp = pform_make_call_task(@1, *$1, *$2);
|
||||||
|
|
|
||||||
68
pform.cc
68
pform.cc
|
|
@ -3113,59 +3113,55 @@ extern void pform_module_specify_path(PSpecPath*obj)
|
||||||
/*
|
/*
|
||||||
* Timing checks.
|
* Timing checks.
|
||||||
*/
|
*/
|
||||||
extern PRecRem* pform_make_rec_rem(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,
|
||||||
pform_name_t* notifier,
|
PTimingCheck::optional_args_t* args)
|
||||||
pform_name_t* timestamp_cond,
|
|
||||||
pform_name_t* timecheck_cond,
|
|
||||||
pform_name_t* delayed_reference,
|
|
||||||
pform_name_t* delayed_data)
|
|
||||||
{
|
{
|
||||||
PRecRem*rec_rem = new PRecRem(
|
ivl_assert(li, args);
|
||||||
|
|
||||||
|
PRecRem*recrem = new PRecRem(
|
||||||
reference_event,
|
reference_event,
|
||||||
data_event,
|
data_event,
|
||||||
//setup_limit,
|
setup_limit,
|
||||||
//hold_limit,
|
hold_limit,
|
||||||
notifier,
|
args->notifier,
|
||||||
timestamp_cond,
|
args->timestamp_cond,
|
||||||
timecheck_cond,
|
args->timecheck_cond,
|
||||||
delayed_reference,
|
args->delayed_reference,
|
||||||
delayed_data
|
args->delayed_data
|
||||||
);
|
);
|
||||||
|
|
||||||
FILE_NAME(rec_rem, li);
|
FILE_NAME(recrem, li);
|
||||||
|
|
||||||
return rec_rem;
|
return recrem;
|
||||||
}
|
}
|
||||||
extern PSetupHold* pform_make_setup_hold(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,
|
||||||
pform_name_t* notifier,
|
PTimingCheck::optional_args_t* args)
|
||||||
pform_name_t* timestamp_cond,
|
|
||||||
pform_name_t* timecheck_cond,
|
|
||||||
pform_name_t* delayed_reference,
|
|
||||||
pform_name_t* delayed_data)
|
|
||||||
{
|
{
|
||||||
PSetupHold*setup_hold = new PSetupHold(
|
ivl_assert(li, args);
|
||||||
|
|
||||||
|
PSetupHold*setuphold = new PSetupHold(
|
||||||
reference_event,
|
reference_event,
|
||||||
data_event,
|
data_event,
|
||||||
//setup_limit,
|
setup_limit,
|
||||||
//hold_limit,
|
hold_limit,
|
||||||
notifier,
|
args->notifier,
|
||||||
timestamp_cond,
|
args->timestamp_cond,
|
||||||
timecheck_cond,
|
args->timecheck_cond,
|
||||||
delayed_reference,
|
args->delayed_reference,
|
||||||
delayed_data
|
args->delayed_data
|
||||||
);
|
);
|
||||||
|
|
||||||
FILE_NAME(setup_hold, li);
|
FILE_NAME(setuphold, li);
|
||||||
|
|
||||||
return setup_hold;
|
return setuphold;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void pform_module_timing_check(PTimingCheck*obj)
|
extern void pform_module_timing_check(PTimingCheck*obj)
|
||||||
|
|
|
||||||
24
pform.h
24
pform.h
|
|
@ -433,27 +433,19 @@ extern void pform_module_specify_path(PSpecPath*obj);
|
||||||
/*
|
/*
|
||||||
* Functions related to timing checks.
|
* Functions related to timing checks.
|
||||||
*/
|
*/
|
||||||
extern PRecRem* pform_make_rec_rem(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,
|
||||||
pform_name_t* notifier,
|
PTimingCheck::optional_args_t* args
|
||||||
pform_name_t* timestamp_cond,
|
|
||||||
pform_name_t* timecheck_cond,
|
|
||||||
pform_name_t* delayed_reference,
|
|
||||||
pform_name_t* delayed_data
|
|
||||||
);
|
);
|
||||||
extern PSetupHold* pform_make_setup_hold(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,
|
||||||
pform_name_t* notifier,
|
PTimingCheck::optional_args_t* args
|
||||||
pform_name_t* timestamp_cond,
|
|
||||||
pform_name_t* timecheck_cond,
|
|
||||||
pform_name_t* delayed_reference,
|
|
||||||
pform_name_t* delayed_data
|
|
||||||
);
|
);
|
||||||
extern void pform_module_timing_check(PTimingCheck*obj);
|
extern void pform_module_timing_check(PTimingCheck*obj);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue