112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  sc_writer_policy.h -- The sc_signal<T> writer policy definition
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Philipp A: Hartmann, OFFIS
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de  CHANGE LOG IS AT THE END OF THE FILE
2712027Sjungma@eit.uni-kl.de *****************************************************************************/
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de#ifndef SC_WRITER_POLICY_H_INCLUDED_
3112027Sjungma@eit.uni-kl.de#define SC_WRITER_POLICY_H_INCLUDED_
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de#if !defined(SC_DEFAULT_WRITER_POLICY)
3412027Sjungma@eit.uni-kl.de#  if defined(SC_NO_WRITE_CHECK)
3512027Sjungma@eit.uni-kl.de#    define SC_DEFAULT_WRITER_POLICY SC_UNCHECKED_WRITERS
3612027Sjungma@eit.uni-kl.de#  else
3712027Sjungma@eit.uni-kl.de#    define SC_DEFAULT_WRITER_POLICY SC_ONE_WRITER
3812027Sjungma@eit.uni-kl.de#  endif
3912027Sjungma@eit.uni-kl.de#endif
4012027Sjungma@eit.uni-kl.de
4112027Sjungma@eit.uni-kl.denamespace sc_core {
4212027Sjungma@eit.uni-kl.de
4312027Sjungma@eit.uni-kl.declass sc_object;
4412027Sjungma@eit.uni-kl.declass sc_port_base;
4512027Sjungma@eit.uni-kl.deextern
4612027Sjungma@eit.uni-kl.devoid
4712027Sjungma@eit.uni-kl.desc_signal_invalid_writer( sc_object* target, sc_object* first_writer,
4812027Sjungma@eit.uni-kl.de                          sc_object* second_writer, bool check_delta );
4912027Sjungma@eit.uni-kl.de
5012027Sjungma@eit.uni-kl.de// SIGNAL WRITING POLICIES
5112027Sjungma@eit.uni-kl.de//
5212027Sjungma@eit.uni-kl.de// Note: if you add a new policy to the enum below you will need to add
5312027Sjungma@eit.uni-kl.de// an additional overload of sc_reset::reset_signal_is() for the sc_signal<bool>
5412027Sjungma@eit.uni-kl.de// instance. That will require changes to sysc/kernel/sc_reset.cpp and
5512027Sjungma@eit.uni-kl.de// sysc/kernel/sc_reset.h
5612027Sjungma@eit.uni-kl.de
5712027Sjungma@eit.uni-kl.deenum sc_writer_policy
5812027Sjungma@eit.uni-kl.de{
5912027Sjungma@eit.uni-kl.de  SC_ONE_WRITER        = 0, ///< unique writer (from a unique port)
6012027Sjungma@eit.uni-kl.de  SC_MANY_WRITERS      = 1, ///< allow multiple writers (with different ports)
6112027Sjungma@eit.uni-kl.de  SC_UNCHECKED_WRITERS = 3  ///< even allow delta cycle conflicts (non-standard)
6212027Sjungma@eit.uni-kl.de};
6312027Sjungma@eit.uni-kl.de
6412027Sjungma@eit.uni-kl.de// signal forward declaration
6512027Sjungma@eit.uni-kl.detemplate< typename T, sc_writer_policy POL = SC_DEFAULT_WRITER_POLICY >
6612027Sjungma@eit.uni-kl.declass sc_signal;
6712027Sjungma@eit.uni-kl.de
6812027Sjungma@eit.uni-kl.detemplate< sc_writer_policy >
6912027Sjungma@eit.uni-kl.destruct sc_writer_policy_check;
7012027Sjungma@eit.uni-kl.de
7112027Sjungma@eit.uni-kl.destruct sc_writer_policy_nocheck_write
7212027Sjungma@eit.uni-kl.de{
7312027Sjungma@eit.uni-kl.de  bool check_write( sc_object* /* target */, bool /* value_changed */ )
7412027Sjungma@eit.uni-kl.de    { return true; }
7512027Sjungma@eit.uni-kl.de  void update(){}
7612027Sjungma@eit.uni-kl.de};
7712027Sjungma@eit.uni-kl.de
7812027Sjungma@eit.uni-kl.destruct sc_writer_policy_check_write
7912027Sjungma@eit.uni-kl.de{
8012027Sjungma@eit.uni-kl.de  bool check_write( sc_object* target, bool value_changed );
8112027Sjungma@eit.uni-kl.de  void update(){}
8212027Sjungma@eit.uni-kl.deprotected:
8312027Sjungma@eit.uni-kl.de  sc_writer_policy_check_write( bool check_delta = false )
8412027Sjungma@eit.uni-kl.de    : m_check_delta( check_delta ), m_writer_p(NULL) {}
8512027Sjungma@eit.uni-kl.de  const bool         m_check_delta;
8612027Sjungma@eit.uni-kl.de  sc_object*         m_writer_p;
8712027Sjungma@eit.uni-kl.de};
8812027Sjungma@eit.uni-kl.de
8912027Sjungma@eit.uni-kl.destruct sc_writer_policy_check_delta
9012027Sjungma@eit.uni-kl.de    : sc_writer_policy_check_write
9112027Sjungma@eit.uni-kl.de{
9212027Sjungma@eit.uni-kl.de
9312027Sjungma@eit.uni-kl.de  sc_writer_policy_check_delta()
9412027Sjungma@eit.uni-kl.de    : sc_writer_policy_check_write(true) {}
9512027Sjungma@eit.uni-kl.de
9612027Sjungma@eit.uni-kl.de  bool check_write( sc_object* target, bool value_changed )
9712027Sjungma@eit.uni-kl.de  {
9812027Sjungma@eit.uni-kl.de      if( value_changed )
9912027Sjungma@eit.uni-kl.de          return sc_writer_policy_check_write::check_write( target, true );
10012027Sjungma@eit.uni-kl.de      return true;
10112027Sjungma@eit.uni-kl.de  }
10212027Sjungma@eit.uni-kl.de
10312027Sjungma@eit.uni-kl.de  void update(){ m_writer_p = NULL; }
10412027Sjungma@eit.uni-kl.de};
10512027Sjungma@eit.uni-kl.de
10612027Sjungma@eit.uni-kl.destruct sc_writer_policy_nocheck_port
10712027Sjungma@eit.uni-kl.de{
10812027Sjungma@eit.uni-kl.de  bool check_port( sc_object*, sc_port_base*, bool )
10912027Sjungma@eit.uni-kl.de    { return true; }
11012027Sjungma@eit.uni-kl.de};
11112027Sjungma@eit.uni-kl.de
11212027Sjungma@eit.uni-kl.destruct sc_writer_policy_check_port
11312027Sjungma@eit.uni-kl.de{
11412027Sjungma@eit.uni-kl.de  bool check_port( sc_object* target, sc_port_base* port, bool is_output );
11512027Sjungma@eit.uni-kl.de
11612027Sjungma@eit.uni-kl.deprotected:
11712027Sjungma@eit.uni-kl.de  sc_writer_policy_check_port() : m_output(0) {}
11812027Sjungma@eit.uni-kl.de  sc_port_base* m_output;
11912027Sjungma@eit.uni-kl.de};
12012027Sjungma@eit.uni-kl.de
12112027Sjungma@eit.uni-kl.detemplate<>
12212027Sjungma@eit.uni-kl.destruct sc_writer_policy_check<SC_ONE_WRITER>
12312027Sjungma@eit.uni-kl.de  : sc_writer_policy_check_port
12412027Sjungma@eit.uni-kl.de  , sc_writer_policy_check_write
12512027Sjungma@eit.uni-kl.de{};
12612027Sjungma@eit.uni-kl.de
12712027Sjungma@eit.uni-kl.detemplate<>
12812027Sjungma@eit.uni-kl.destruct sc_writer_policy_check<SC_MANY_WRITERS>
12912027Sjungma@eit.uni-kl.de  : sc_writer_policy_nocheck_port
13012027Sjungma@eit.uni-kl.de  , sc_writer_policy_check_delta
13112027Sjungma@eit.uni-kl.de{};
13212027Sjungma@eit.uni-kl.de
13312027Sjungma@eit.uni-kl.detemplate<>
13412027Sjungma@eit.uni-kl.destruct sc_writer_policy_check<SC_UNCHECKED_WRITERS>
13512027Sjungma@eit.uni-kl.de  : sc_writer_policy_nocheck_port
13612027Sjungma@eit.uni-kl.de  , sc_writer_policy_nocheck_write
13712027Sjungma@eit.uni-kl.de{};
13812027Sjungma@eit.uni-kl.de
13912027Sjungma@eit.uni-kl.de} // namespace sc_core
14012027Sjungma@eit.uni-kl.de
14112027Sjungma@eit.uni-kl.de#endif
14212027Sjungma@eit.uni-kl.de
14312027Sjungma@eit.uni-kl.de// Taf!
144