summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/communication/sc_writer_policy.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/systemc/src/sysc/communication/sc_writer_policy.h')
-rw-r--r--ext/systemc/src/sysc/communication/sc_writer_policy.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/communication/sc_writer_policy.h b/ext/systemc/src/sysc/communication/sc_writer_policy.h
new file mode 100644
index 000000000..93b80f861
--- /dev/null
+++ b/ext/systemc/src/sysc/communication/sc_writer_policy.h
@@ -0,0 +1,143 @@
+/*****************************************************************************
+
+ 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!