| /***************************************************************************** | |
| Licensed to Accellera Systems Initiative Inc. (Accellera) under one or | |
| more contributor license agreements. See the NOTICE file distributed | |
| with this work for additional information regarding copyright ownership. | |
| Accellera licenses this file to you under the Apache License, Version 2.0 | |
| (the "License"); you may not use this file except in compliance with the | |
| License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | |
| implied. See the License for the specific language governing | |
| permissions and limitations under the License. | |
| *****************************************************************************/ | |
| /***************************************************************************** | |
| sc_writer_policy.h -- The sc_signal<T> writer policy definition | |
| Original Author: Philipp A: Hartmann, OFFIS | |
| CHANGE LOG IS AT THE END OF THE FILE | |
| *****************************************************************************/ | |
| #ifndef SC_WRITER_POLICY_H_INCLUDED_ | |
| #define SC_WRITER_POLICY_H_INCLUDED_ | |
| #if !defined(SC_DEFAULT_WRITER_POLICY) | |
| # if defined(SC_NO_WRITE_CHECK) | |
| # define SC_DEFAULT_WRITER_POLICY SC_UNCHECKED_WRITERS | |
| # else | |
| # define SC_DEFAULT_WRITER_POLICY SC_ONE_WRITER | |
| # endif | |
| #endif | |
| namespace sc_core { | |
| class sc_object; | |
| class sc_port_base; | |
| extern | |
| void | |
| sc_signal_invalid_writer( sc_object* target, sc_object* first_writer, | |
| sc_object* second_writer, bool check_delta ); | |
| // SIGNAL WRITING POLICIES | |
| // | |
| // Note: if you add a new policy to the enum below you will need to add | |
| // an additional overload of sc_reset::reset_signal_is() for the sc_signal<bool> | |
| // instance. That will require changes to sysc/kernel/sc_reset.cpp and | |
| // sysc/kernel/sc_reset.h | |
| enum sc_writer_policy | |
| { | |
| SC_ONE_WRITER = 0, ///< unique writer (from a unique port) | |
| SC_MANY_WRITERS = 1, ///< allow multiple writers (with different ports) | |
| SC_UNCHECKED_WRITERS = 3 ///< even allow delta cycle conflicts (non-standard) | |
| }; | |
| // signal forward declaration | |
| template< typename T, sc_writer_policy POL = SC_DEFAULT_WRITER_POLICY > | |
| class sc_signal; | |
| template< sc_writer_policy > | |
| struct sc_writer_policy_check; | |
| struct sc_writer_policy_nocheck_write | |
| { | |
| bool check_write( sc_object* /* target */, bool /* value_changed */ ) | |
| { return true; } | |
| void update(){} | |
| }; | |
| struct sc_writer_policy_check_write | |
| { | |
| bool check_write( sc_object* target, bool value_changed ); | |
| void update(){} | |
| protected: | |
| sc_writer_policy_check_write( bool check_delta = false ) | |
| : m_check_delta( check_delta ), m_writer_p(NULL) {} | |
| const bool m_check_delta; | |
| sc_object* m_writer_p; | |
| }; | |
| struct sc_writer_policy_check_delta | |
| : sc_writer_policy_check_write | |
| { | |
| sc_writer_policy_check_delta() | |
| : sc_writer_policy_check_write(true) {} | |
| bool check_write( sc_object* target, bool value_changed ) | |
| { | |
| if( value_changed ) | |
| return sc_writer_policy_check_write::check_write( target, true ); | |
| return true; | |
| } | |
| void update(){ m_writer_p = NULL; } | |
| }; | |
| struct sc_writer_policy_nocheck_port | |
| { | |
| bool check_port( sc_object*, sc_port_base*, bool ) | |
| { return true; } | |
| }; | |
| struct sc_writer_policy_check_port | |
| { | |
| bool check_port( sc_object* target, sc_port_base* port, bool is_output ); | |
| protected: | |
| sc_writer_policy_check_port() : m_output(0) {} | |
| sc_port_base* m_output; | |
| }; | |
| template<> | |
| struct sc_writer_policy_check<SC_ONE_WRITER> | |
| : sc_writer_policy_check_port | |
| , sc_writer_policy_check_write | |
| {}; | |
| template<> | |
| struct sc_writer_policy_check<SC_MANY_WRITERS> | |
| : sc_writer_policy_nocheck_port | |
| , sc_writer_policy_check_delta | |
| {}; | |
| template<> | |
| struct sc_writer_policy_check<SC_UNCHECKED_WRITERS> | |
| : sc_writer_policy_nocheck_port | |
| , sc_writer_policy_nocheck_write | |
| {}; | |
| } // namespace sc_core | |
| #endif | |
| // Taf! |