sc_writer_policy.h revision 12027
19241Sandreas.hansson@arm.com/*****************************************************************************
29717Sandreas.hansson@arm.com
39241Sandreas.hansson@arm.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
49241Sandreas.hansson@arm.com  more contributor license agreements.  See the NOTICE file distributed
59241Sandreas.hansson@arm.com  with this work for additional information regarding copyright ownership.
69241Sandreas.hansson@arm.com  Accellera licenses this file to you under the Apache License, Version 2.0
79241Sandreas.hansson@arm.com  (the "License"); you may not use this file except in compliance with the
89241Sandreas.hansson@arm.com  License.  You may obtain a copy of the License at
99241Sandreas.hansson@arm.com
109241Sandreas.hansson@arm.com    http://www.apache.org/licenses/LICENSE-2.0
119241Sandreas.hansson@arm.com
129241Sandreas.hansson@arm.com  Unless required by applicable law or agreed to in writing, software
139241Sandreas.hansson@arm.com  distributed under the License is distributed on an "AS IS" BASIS,
149241Sandreas.hansson@arm.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
159241Sandreas.hansson@arm.com  implied.  See the License for the specific language governing
169241Sandreas.hansson@arm.com  permissions and limitations under the License.
179241Sandreas.hansson@arm.com
189241Sandreas.hansson@arm.com *****************************************************************************/
199241Sandreas.hansson@arm.com
209241Sandreas.hansson@arm.com/*****************************************************************************
219241Sandreas.hansson@arm.com
229241Sandreas.hansson@arm.com  sc_writer_policy.h -- The sc_signal<T> writer policy definition
239241Sandreas.hansson@arm.com
249241Sandreas.hansson@arm.com  Original Author: Philipp A: Hartmann, OFFIS
259241Sandreas.hansson@arm.com
269241Sandreas.hansson@arm.com  CHANGE LOG IS AT THE END OF THE FILE
279241Sandreas.hansson@arm.com *****************************************************************************/
289241Sandreas.hansson@arm.com
299241Sandreas.hansson@arm.com
309241Sandreas.hansson@arm.com#ifndef SC_WRITER_POLICY_H_INCLUDED_
319241Sandreas.hansson@arm.com#define SC_WRITER_POLICY_H_INCLUDED_
329241Sandreas.hansson@arm.com
339241Sandreas.hansson@arm.com#if !defined(SC_DEFAULT_WRITER_POLICY)
349241Sandreas.hansson@arm.com#  if defined(SC_NO_WRITE_CHECK)
359241Sandreas.hansson@arm.com#    define SC_DEFAULT_WRITER_POLICY SC_UNCHECKED_WRITERS
369241Sandreas.hansson@arm.com#  else
379241Sandreas.hansson@arm.com#    define SC_DEFAULT_WRITER_POLICY SC_ONE_WRITER
389241Sandreas.hansson@arm.com#  endif
399241Sandreas.hansson@arm.com#endif
409241Sandreas.hansson@arm.com
419241Sandreas.hansson@arm.comnamespace sc_core {
429241Sandreas.hansson@arm.com
439241Sandreas.hansson@arm.comclass sc_object;
449241Sandreas.hansson@arm.comclass sc_port_base;
459241Sandreas.hansson@arm.comextern
469241Sandreas.hansson@arm.comvoid
479241Sandreas.hansson@arm.comsc_signal_invalid_writer( sc_object* target, sc_object* first_writer,
489241Sandreas.hansson@arm.com                          sc_object* second_writer, bool check_delta );
499241Sandreas.hansson@arm.com
509241Sandreas.hansson@arm.com// SIGNAL WRITING POLICIES
519241Sandreas.hansson@arm.com//
529241Sandreas.hansson@arm.com// Note: if you add a new policy to the enum below you will need to add
539241Sandreas.hansson@arm.com// an additional overload of sc_reset::reset_signal_is() for the sc_signal<bool>
549241Sandreas.hansson@arm.com// instance. That will require changes to sysc/kernel/sc_reset.cpp and
559241Sandreas.hansson@arm.com// sysc/kernel/sc_reset.h
569241Sandreas.hansson@arm.com
579718Sandreas.hansson@arm.comenum sc_writer_policy
589720Sandreas.hansson@arm.com{
599717Sandreas.hansson@arm.com  SC_ONE_WRITER        = 0, ///< unique writer (from a unique port)
609719Sandreas.hansson@arm.com  SC_MANY_WRITERS      = 1, ///< allow multiple writers (with different ports)
619241Sandreas.hansson@arm.com  SC_UNCHECKED_WRITERS = 3  ///< even allow delta cycle conflicts (non-standard)
629719Sandreas.hansson@arm.com};
639719Sandreas.hansson@arm.com
649719Sandreas.hansson@arm.com// signal forward declaration
659719Sandreas.hansson@arm.comtemplate< typename T, sc_writer_policy POL = SC_DEFAULT_WRITER_POLICY >
669241Sandreas.hansson@arm.comclass sc_signal;
679241Sandreas.hansson@arm.com
689241Sandreas.hansson@arm.comtemplate< sc_writer_policy >
699241Sandreas.hansson@arm.comstruct sc_writer_policy_check;
709241Sandreas.hansson@arm.com
719241Sandreas.hansson@arm.comstruct sc_writer_policy_nocheck_write
729241Sandreas.hansson@arm.com{
739241Sandreas.hansson@arm.com  bool check_write( sc_object* /* target */, bool /* value_changed */ )
749241Sandreas.hansson@arm.com    { return true; }
759294Sandreas.hansson@arm.com  void update(){}
769294Sandreas.hansson@arm.com};
779241Sandreas.hansson@arm.com
789241Sandreas.hansson@arm.comstruct sc_writer_policy_check_write
799241Sandreas.hansson@arm.com{
809241Sandreas.hansson@arm.com  bool check_write( sc_object* target, bool value_changed );
819241Sandreas.hansson@arm.com  void update(){}
829241Sandreas.hansson@arm.comprotected:
839241Sandreas.hansson@arm.com  sc_writer_policy_check_write( bool check_delta = false )
849241Sandreas.hansson@arm.com    : m_check_delta( check_delta ), m_writer_p(NULL) {}
859241Sandreas.hansson@arm.com  const bool         m_check_delta;
869241Sandreas.hansson@arm.com  sc_object*         m_writer_p;
879241Sandreas.hansson@arm.com};
889241Sandreas.hansson@arm.com
899241Sandreas.hansson@arm.comstruct sc_writer_policy_check_delta
909241Sandreas.hansson@arm.com    : sc_writer_policy_check_write
919241Sandreas.hansson@arm.com{
929524SAndreas.Sandberg@ARM.com
939241Sandreas.hansson@arm.com  sc_writer_policy_check_delta()
949241Sandreas.hansson@arm.com    : sc_writer_policy_check_write(true) {}
959718Sandreas.hansson@arm.com
969718Sandreas.hansson@arm.com  bool check_write( sc_object* target, bool value_changed )
979241Sandreas.hansson@arm.com  {
989717Sandreas.hansson@arm.com      if( value_changed )
999241Sandreas.hansson@arm.com          return sc_writer_policy_check_write::check_write( target, true );
1009241Sandreas.hansson@arm.com      return true;
1019241Sandreas.hansson@arm.com  }
1029241Sandreas.hansson@arm.com
1039241Sandreas.hansson@arm.com  void update(){ m_writer_p = NULL; }
1049241Sandreas.hansson@arm.com};
1059241Sandreas.hansson@arm.com
1069241Sandreas.hansson@arm.comstruct sc_writer_policy_nocheck_port
1079241Sandreas.hansson@arm.com{
1089241Sandreas.hansson@arm.com  bool check_port( sc_object*, sc_port_base*, bool )
1099524SAndreas.Sandberg@ARM.com    { return true; }
1109719Sandreas.hansson@arm.com};
1119720Sandreas.hansson@arm.com
1129719Sandreas.hansson@arm.comstruct sc_writer_policy_check_port
1139241Sandreas.hansson@arm.com{
1149241Sandreas.hansson@arm.com  bool check_port( sc_object* target, sc_port_base* port, bool is_output );
1159241Sandreas.hansson@arm.com
1169241Sandreas.hansson@arm.comprotected:
1179241Sandreas.hansson@arm.com  sc_writer_policy_check_port() : m_output(0) {}
1189241Sandreas.hansson@arm.com  sc_port_base* m_output;
1199241Sandreas.hansson@arm.com};
1209342SAndreas.Sandberg@arm.com
1219241Sandreas.hansson@arm.comtemplate<>
1229719Sandreas.hansson@arm.comstruct sc_writer_policy_check<SC_ONE_WRITER>
1239719Sandreas.hansson@arm.com  : sc_writer_policy_check_port
1249719Sandreas.hansson@arm.com  , sc_writer_policy_check_write
1259719Sandreas.hansson@arm.com{};
1269719Sandreas.hansson@arm.com
1279719Sandreas.hansson@arm.comtemplate<>
1289719Sandreas.hansson@arm.comstruct sc_writer_policy_check<SC_MANY_WRITERS>
1299719Sandreas.hansson@arm.com  : sc_writer_policy_nocheck_port
1309719Sandreas.hansson@arm.com  , sc_writer_policy_check_delta
1319719Sandreas.hansson@arm.com{};
1329241Sandreas.hansson@arm.com
1339241Sandreas.hansson@arm.comtemplate<>
1349241Sandreas.hansson@arm.comstruct sc_writer_policy_check<SC_UNCHECKED_WRITERS>
1359241Sandreas.hansson@arm.com  : sc_writer_policy_nocheck_port
1369241Sandreas.hansson@arm.com  , sc_writer_policy_nocheck_write
1379241Sandreas.hansson@arm.com{};
1389241Sandreas.hansson@arm.com
1399241Sandreas.hansson@arm.com} // namespace sc_core
1409719Sandreas.hansson@arm.com
1419241Sandreas.hansson@arm.com#endif
1429719Sandreas.hansson@arm.com
1439241Sandreas.hansson@arm.com// Taf!
1449717Sandreas.hansson@arm.com