16 #ifndef _SCC_CCI_PARAM_RESTRICTED_H_ 
   17 #define _SCC_CCI_PARAM_RESTRICTED_H_ 
   19 #include <cci_configuration> 
   20 #include <unordered_set> 
   24 template <
typename T> 
struct _min_max_restriction {
 
   25     _min_max_restriction(T min, T max)
 
   29     bool operator()(cci::cci_param_write_event<T> 
const& ev)
 const { 
return ev.new_value >= min && ev.new_value <= max; }
 
   34 template <
typename T> 
struct _min_max_excl_restriction {
 
   35     _min_max_excl_restriction(T min, T max)
 
   39     bool operator()(cci::cci_param_write_event<T> 
const& ev)
 const { 
return ev.new_value > min && ev.new_value < max; }
 
   44 template <
typename T> 
struct _min_restriction {
 
   45     _min_restriction(T min)
 
   48     bool operator()(cci::cci_param_write_event<T> 
const& ev)
 const { 
return ev.new_value >= min; }
 
   52 template <
typename T> 
struct _min_excl_restriction {
 
   53     _min_excl_restriction(T min)
 
   56     bool operator()(cci::cci_param_write_event<T> 
const& ev)
 const { 
return ev.new_value > min; }
 
   60 template <
typename T> 
struct _max_restriction {
 
   61     _max_restriction(T max)
 
   64     bool operator()(cci::cci_param_write_event<T> 
const& ev)
 const { 
return ev.new_value <= max; }
 
   68 template <
typename T> 
struct _max_excl_restriction {
 
   69     _max_excl_restriction(T max)
 
   72     bool operator()(cci::cci_param_write_event<T> 
const& ev)
 const { 
return ev.new_value < max; }
 
   76 template <
typename T> 
struct _discrete_restriction {
 
   77     template <
typename COLLECTION_TYPE>
 
   78     _discrete_restriction(COLLECTION_TYPE values)
 
   79     : values(std::begin(values), std::end(values)) {}
 
   81     bool operator()(cci::cci_param_write_event<T> 
const& ev)
 const { 
return values.count(ev.new_value) > 0; }
 
   82     std::unordered_set<T> 
const values;
 
   93 template <
typename T> 
inline _min_max_restriction<T> 
min_max_restriction(T min, T max) { 
return _min_max_restriction<T>(min, max); }
 
   95 template <
typename T> 
inline _min_max_restriction<T> 
gte_lte_restriction(T min, T max) { 
return _min_max_restriction<T>(min, max); }
 
  105     return _min_max_excl_restriction<T>(min, max);
 
  108 template <
typename T> 
inline _min_max_excl_restriction<T> 
gt_lt_restriction(T min, T max) { 
return _min_max_excl_restriction<T>(min, max); }
 
  116 template <
typename T> 
inline _min_restriction<T> 
min_restriction(T min) { 
return _min_restriction<T>(min); }
 
  118 template <
typename T> 
inline _min_restriction<T> 
gte_restriction(T min) { 
return _min_restriction<T>(min); }
 
  126 template <
typename T> 
inline _min_excl_restriction<T> 
min_excl_restriction(T min) { 
return _min_excl_restriction<T>(min); }
 
  128 template <
typename T> 
inline _min_excl_restriction<T> 
gt_restriction(T min) { 
return _min_excl_restriction<T>(min); }
 
  136 template <
typename T> 
inline _max_restriction<T> 
max_restriction(T max) { 
return _max_restriction<T>(max); }
 
  138 template <
typename T> 
inline _max_restriction<T> 
lte_restriction(T max) { 
return _max_restriction<T>(max); }
 
  146 template <
typename T> 
inline _max_excl_restriction<T> 
max_excl_restriction(T max) { 
return _max_excl_restriction<T>(max); }
 
  148 template <
typename T> 
inline _max_excl_restriction<T> 
lt_excl_restriction(T max) { 
return _max_excl_restriction<T>(max); }
 
  157     return _discrete_restriction<T>(values);
 
  167 template <
typename T, 
size_t SZ> 
inline _discrete_restriction<T> 
discrete_restriction(std::array<T, SZ> values) {
 
  168     return _discrete_restriction<T>(values);
 
  178     return _discrete_restriction<T>(values);
 
  196 template <
typename T, cci::cci_param_mutable_type TM = cci::CCI_MUTABLE_PARAM> 
struct cci_param_restricted : 
public cci::cci_param<T, TM> {
 
  211     template <
typename RESTR>
 
  212     cci_param_restricted(
const std::string& name, 
const T& default_value, RESTR 
const& restr, 
const std::string& desc = 
"",
 
  213                          cci::cci_name_type name_type = cci::CCI_RELATIVE_NAME,
 
  214                          const cci::cci_originator& originator = sc_core::sc_get_current_object() ? cci::cci_originator()
 
  215                                                                                                   : cci::cci_originator(
"sc_main"))
 
  216     : cci::cci_param<T, TM>(name, default_value, desc, name_type, originator) {
 
  217         this->register_pre_write_callback(restr);
 
  233     template <
typename RESTR>
 
  234     cci_param_restricted(
const std::string& name, 
const T& default_value, RESTR 
const& restr, cci::cci_broker_handle private_broker,
 
  235                          const std::string& desc = 
"", cci::cci_name_type name_type = cci::CCI_RELATIVE_NAME,
 
  236                          const cci::cci_originator& originator = sc_core::sc_get_current_object() ? cci::cci_originator()
 
  237                                                                                                   : cci::cci_originator(
"sc_main"))
 
  238     : cci::cci_param<T, TM>(name, default_value, desc, name_type, originator) {
 
  239         this->register_pre_write_callback(restr);
 
_max_excl_restriction< T > max_excl_restriction(T max)
creates a maximum restriction excluding the maximum value
_max_restriction< T > max_restriction(T max)
creates a maximum restriction including the maximum value
_min_excl_restriction< T > gt_restriction(T min)
alias for min_excl_restriction(T min)
_min_restriction< T > gte_restriction(T min)
alias for min_restriction(T min)
_min_max_restriction< T > min_max_restriction(T min, T max)
creates a min/max restriction with including the limits
_discrete_restriction< T > discrete_restriction(std::initializer_list< T > values)
creates a restriction for a discrete values set
_min_restriction< T > min_restriction(T min)
creates a minimum restriction including the minimum value
_min_max_restriction< T > gte_lte_restriction(T min, T max)
alias for min_max_restriction(T min, T max)
_min_excl_restriction< T > min_excl_restriction(T min)
creates a minimum restriction excluding the minimum value
_max_excl_restriction< T > lt_excl_restriction(T max)
alias for max_excl_restriction(T max)
_max_restriction< T > lte_restriction(T max)
alias for max_restriction(T max)
_min_max_excl_restriction< T > min_max_excl_restriction(T min, T max)
creates a min/max restriction with excluding the limits
_min_max_excl_restriction< T > gt_lt_restriction(T min, T max)
alias for min_max_excl_restriction(T min, T max)
extension of cci_param<T, TM> which automatically registeres a callback to restrict the valid values ...
cci_param_restricted(const std::string &name, const T &default_value, RESTR const &restr, cci::cci_broker_handle private_broker, const std::string &desc="", cci::cci_name_type name_type=cci::CCI_RELATIVE_NAME, const cci::cci_originator &originator=sc_core::sc_get_current_object() ? cci::cci_originator() :cci::cci_originator("sc_main"))
cci_param_restricted(const std::string &name, const T &default_value, RESTR const &restr, const std::string &desc="", cci::cci_name_type name_type=cci::CCI_RELATIVE_NAME, const cci::cci_originator &originator=sc_core::sc_get_current_object() ? cci::cci_originator() :cci::cci_originator("sc_main"))