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_fifo.h -- The sc_fifo<T> primitive channel class. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Martin Janssen, Synopsys, Inc., 2001-05-21 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#ifndef SC_FIFO_H 3012027Sjungma@eit.uni-kl.de#define SC_FIFO_H 3112027Sjungma@eit.uni-kl.de 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_communication_ids.h" 3412027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_prim_channel.h" 3512027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_fifo_ifs.h" 3612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_event.h" 3712027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h" 3812027Sjungma@eit.uni-kl.de#include "sysc/tracing/sc_trace.h" 3912027Sjungma@eit.uni-kl.de#include <typeinfo> 4012027Sjungma@eit.uni-kl.de 4112027Sjungma@eit.uni-kl.denamespace sc_core { 4212027Sjungma@eit.uni-kl.de 4312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 4412027Sjungma@eit.uni-kl.de// CLASS : sc_fifo<T> 4512027Sjungma@eit.uni-kl.de// 4612027Sjungma@eit.uni-kl.de// The sc_fifo<T> primitive channel class. 4712027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 4812027Sjungma@eit.uni-kl.de 4912027Sjungma@eit.uni-kl.detemplate <class T> 5012027Sjungma@eit.uni-kl.declass sc_fifo 5112027Sjungma@eit.uni-kl.de: public sc_fifo_in_if<T>, 5212027Sjungma@eit.uni-kl.de public sc_fifo_out_if<T>, 5312027Sjungma@eit.uni-kl.de public sc_prim_channel 5412027Sjungma@eit.uni-kl.de{ 5512027Sjungma@eit.uni-kl.depublic: 5612027Sjungma@eit.uni-kl.de 5712027Sjungma@eit.uni-kl.de // constructors 5812027Sjungma@eit.uni-kl.de 5912027Sjungma@eit.uni-kl.de explicit sc_fifo( int size_ = 16 ) 6012027Sjungma@eit.uni-kl.de : sc_prim_channel( sc_gen_unique_name( "fifo" ) ), 6112027Sjungma@eit.uni-kl.de m_data_read_event( 6212027Sjungma@eit.uni-kl.de (std::string(SC_KERNEL_EVENT_PREFIX)+"_read_event").c_str()), 6312027Sjungma@eit.uni-kl.de m_data_written_event( 6412027Sjungma@eit.uni-kl.de (std::string(SC_KERNEL_EVENT_PREFIX)+"_write_event").c_str()) 6512027Sjungma@eit.uni-kl.de { init( size_ ); } 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.de explicit sc_fifo( const char* name_, int size_ = 16 ) 6812027Sjungma@eit.uni-kl.de : sc_prim_channel( name_ ), 6912027Sjungma@eit.uni-kl.de m_data_read_event( 7012027Sjungma@eit.uni-kl.de (std::string(SC_KERNEL_EVENT_PREFIX)+"_read_event").c_str()), 7112027Sjungma@eit.uni-kl.de m_data_written_event( 7212027Sjungma@eit.uni-kl.de (std::string(SC_KERNEL_EVENT_PREFIX)+"_write_event").c_str()) 7312027Sjungma@eit.uni-kl.de { init( size_ ); } 7412027Sjungma@eit.uni-kl.de 7512027Sjungma@eit.uni-kl.de 7612027Sjungma@eit.uni-kl.de // destructor 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.de virtual ~sc_fifo() 7912027Sjungma@eit.uni-kl.de { delete [] m_buf; } 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.de 8212027Sjungma@eit.uni-kl.de // interface methods 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.de virtual void register_port( sc_port_base&, const char* ); 8512027Sjungma@eit.uni-kl.de 8612027Sjungma@eit.uni-kl.de 8712027Sjungma@eit.uni-kl.de // blocking read 8812027Sjungma@eit.uni-kl.de virtual void read( T& ); 8912027Sjungma@eit.uni-kl.de virtual T read(); 9012027Sjungma@eit.uni-kl.de 9112027Sjungma@eit.uni-kl.de // non-blocking read 9212027Sjungma@eit.uni-kl.de virtual bool nb_read( T& ); 9312027Sjungma@eit.uni-kl.de 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.de // get the number of available samples 9612027Sjungma@eit.uni-kl.de 9712027Sjungma@eit.uni-kl.de virtual int num_available() const 9812027Sjungma@eit.uni-kl.de { return ( m_num_readable - m_num_read ); } 9912027Sjungma@eit.uni-kl.de 10012027Sjungma@eit.uni-kl.de 10112027Sjungma@eit.uni-kl.de // get the data written event 10212027Sjungma@eit.uni-kl.de 10312027Sjungma@eit.uni-kl.de virtual const sc_event& data_written_event() const 10412027Sjungma@eit.uni-kl.de { return m_data_written_event; } 10512027Sjungma@eit.uni-kl.de 10612027Sjungma@eit.uni-kl.de 10712027Sjungma@eit.uni-kl.de // blocking write 10812027Sjungma@eit.uni-kl.de virtual void write( const T& ); 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de // non-blocking write 11112027Sjungma@eit.uni-kl.de virtual bool nb_write( const T& ); 11212027Sjungma@eit.uni-kl.de 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.de // get the number of free spaces 11512027Sjungma@eit.uni-kl.de 11612027Sjungma@eit.uni-kl.de virtual int num_free() const 11712027Sjungma@eit.uni-kl.de { return ( m_size - m_num_readable - m_num_written ); } 11812027Sjungma@eit.uni-kl.de 11912027Sjungma@eit.uni-kl.de 12012027Sjungma@eit.uni-kl.de // get the data read event 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de virtual const sc_event& data_read_event() const 12312027Sjungma@eit.uni-kl.de { return m_data_read_event; } 12412027Sjungma@eit.uni-kl.de 12512027Sjungma@eit.uni-kl.de 12612027Sjungma@eit.uni-kl.de // other methods 12712027Sjungma@eit.uni-kl.de 12812027Sjungma@eit.uni-kl.de operator T () 12912027Sjungma@eit.uni-kl.de { return read(); } 13012027Sjungma@eit.uni-kl.de 13112027Sjungma@eit.uni-kl.de 13212027Sjungma@eit.uni-kl.de sc_fifo<T>& operator = ( const T& a ) 13312027Sjungma@eit.uni-kl.de { write( a ); return *this; } 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.de 13612027Sjungma@eit.uni-kl.de void trace( sc_trace_file* tf ) const; 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.de 13912027Sjungma@eit.uni-kl.de virtual void print( ::std::ostream& = ::std::cout ) const; 14012027Sjungma@eit.uni-kl.de virtual void dump( ::std::ostream& = ::std::cout ) const; 14112027Sjungma@eit.uni-kl.de 14212027Sjungma@eit.uni-kl.de virtual const char* kind() const 14312027Sjungma@eit.uni-kl.de { return "sc_fifo"; } 14412027Sjungma@eit.uni-kl.de 14512027Sjungma@eit.uni-kl.deprotected: 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.de virtual void update(); 14812027Sjungma@eit.uni-kl.de 14912027Sjungma@eit.uni-kl.de // support methods 15012027Sjungma@eit.uni-kl.de 15112027Sjungma@eit.uni-kl.de void init( int ); 15212027Sjungma@eit.uni-kl.de 15312027Sjungma@eit.uni-kl.de void buf_init( int ); 15412027Sjungma@eit.uni-kl.de bool buf_write( const T& ); 15512027Sjungma@eit.uni-kl.de bool buf_read( T& ); 15612027Sjungma@eit.uni-kl.de 15712027Sjungma@eit.uni-kl.deprotected: 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de int m_size; // size of the buffer 16012027Sjungma@eit.uni-kl.de T* m_buf; // the buffer 16112027Sjungma@eit.uni-kl.de int m_free; // number of free spaces 16212027Sjungma@eit.uni-kl.de int m_ri; // index of next read 16312027Sjungma@eit.uni-kl.de int m_wi; // index of next write 16412027Sjungma@eit.uni-kl.de 16512027Sjungma@eit.uni-kl.de sc_port_base* m_reader; // used for static design rule checking 16612027Sjungma@eit.uni-kl.de sc_port_base* m_writer; // used for static design rule checking 16712027Sjungma@eit.uni-kl.de 16812027Sjungma@eit.uni-kl.de int m_num_readable; // #samples readable 16912027Sjungma@eit.uni-kl.de int m_num_read; // #samples read during this delta cycle 17012027Sjungma@eit.uni-kl.de int m_num_written; // #samples written during this delta cycle 17112027Sjungma@eit.uni-kl.de 17212027Sjungma@eit.uni-kl.de sc_event m_data_read_event; 17312027Sjungma@eit.uni-kl.de sc_event m_data_written_event; 17412027Sjungma@eit.uni-kl.de 17512027Sjungma@eit.uni-kl.deprivate: 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.de // disabled 17812027Sjungma@eit.uni-kl.de sc_fifo( const sc_fifo<T>& ); 17912027Sjungma@eit.uni-kl.de sc_fifo& operator = ( const sc_fifo<T>& ); 18012027Sjungma@eit.uni-kl.de}; 18112027Sjungma@eit.uni-kl.de 18212027Sjungma@eit.uni-kl.de 18312027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 18412027Sjungma@eit.uni-kl.de 18512027Sjungma@eit.uni-kl.detemplate <class T> 18612027Sjungma@eit.uni-kl.deinline 18712027Sjungma@eit.uni-kl.devoid 18812027Sjungma@eit.uni-kl.desc_fifo<T>::register_port( sc_port_base& port_, 18912027Sjungma@eit.uni-kl.de const char* if_typename_ ) 19012027Sjungma@eit.uni-kl.de{ 19112027Sjungma@eit.uni-kl.de std::string nm( if_typename_ ); 19212027Sjungma@eit.uni-kl.de if( nm == typeid( sc_fifo_in_if<T> ).name() || 19312027Sjungma@eit.uni-kl.de nm == typeid( sc_fifo_blocking_in_if<T> ).name() 19412027Sjungma@eit.uni-kl.de ) { 19512027Sjungma@eit.uni-kl.de // only one reader can be connected 19612027Sjungma@eit.uni-kl.de if( m_reader != 0 ) { 19712027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_MORE_THAN_ONE_FIFO_READER_, 0 ); 19812027Sjungma@eit.uni-kl.de } 19912027Sjungma@eit.uni-kl.de m_reader = &port_; 20012027Sjungma@eit.uni-kl.de } else if( nm == typeid( sc_fifo_out_if<T> ).name() || 20112027Sjungma@eit.uni-kl.de nm == typeid( sc_fifo_blocking_out_if<T> ).name() 20212027Sjungma@eit.uni-kl.de ) { 20312027Sjungma@eit.uni-kl.de // only one writer can be connected 20412027Sjungma@eit.uni-kl.de if( m_writer != 0 ) { 20512027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_MORE_THAN_ONE_FIFO_WRITER_, 0 ); 20612027Sjungma@eit.uni-kl.de } 20712027Sjungma@eit.uni-kl.de m_writer = &port_; 20812027Sjungma@eit.uni-kl.de } 20912027Sjungma@eit.uni-kl.de else 21012027Sjungma@eit.uni-kl.de { 21112027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_BIND_IF_TO_PORT_, 21212027Sjungma@eit.uni-kl.de "sc_fifo<T> port not recognized" ); 21312027Sjungma@eit.uni-kl.de } 21412027Sjungma@eit.uni-kl.de} 21512027Sjungma@eit.uni-kl.de 21612027Sjungma@eit.uni-kl.de 21712027Sjungma@eit.uni-kl.de// blocking read 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.detemplate <class T> 22012027Sjungma@eit.uni-kl.deinline 22112027Sjungma@eit.uni-kl.devoid 22212027Sjungma@eit.uni-kl.desc_fifo<T>::read( T& val_ ) 22312027Sjungma@eit.uni-kl.de{ 22412027Sjungma@eit.uni-kl.de while( num_available() == 0 ) { 22512027Sjungma@eit.uni-kl.de sc_core::wait( m_data_written_event ); 22612027Sjungma@eit.uni-kl.de } 22712027Sjungma@eit.uni-kl.de m_num_read ++; 22812027Sjungma@eit.uni-kl.de buf_read( val_ ); 22912027Sjungma@eit.uni-kl.de request_update(); 23012027Sjungma@eit.uni-kl.de} 23112027Sjungma@eit.uni-kl.de 23212027Sjungma@eit.uni-kl.detemplate <class T> 23312027Sjungma@eit.uni-kl.deinline 23412027Sjungma@eit.uni-kl.deT 23512027Sjungma@eit.uni-kl.desc_fifo<T>::read() 23612027Sjungma@eit.uni-kl.de{ 23712027Sjungma@eit.uni-kl.de T tmp; 23812027Sjungma@eit.uni-kl.de read( tmp ); 23912027Sjungma@eit.uni-kl.de return tmp; 24012027Sjungma@eit.uni-kl.de} 24112027Sjungma@eit.uni-kl.de 24212027Sjungma@eit.uni-kl.de// non-blocking read 24312027Sjungma@eit.uni-kl.de 24412027Sjungma@eit.uni-kl.detemplate <class T> 24512027Sjungma@eit.uni-kl.deinline 24612027Sjungma@eit.uni-kl.debool 24712027Sjungma@eit.uni-kl.desc_fifo<T>::nb_read( T& val_ ) 24812027Sjungma@eit.uni-kl.de{ 24912027Sjungma@eit.uni-kl.de if( num_available() == 0 ) { 25012027Sjungma@eit.uni-kl.de return false; 25112027Sjungma@eit.uni-kl.de } 25212027Sjungma@eit.uni-kl.de m_num_read ++; 25312027Sjungma@eit.uni-kl.de buf_read( val_ ); 25412027Sjungma@eit.uni-kl.de request_update(); 25512027Sjungma@eit.uni-kl.de return true; 25612027Sjungma@eit.uni-kl.de} 25712027Sjungma@eit.uni-kl.de 25812027Sjungma@eit.uni-kl.de 25912027Sjungma@eit.uni-kl.de// blocking write 26012027Sjungma@eit.uni-kl.de 26112027Sjungma@eit.uni-kl.detemplate <class T> 26212027Sjungma@eit.uni-kl.deinline 26312027Sjungma@eit.uni-kl.devoid 26412027Sjungma@eit.uni-kl.desc_fifo<T>::write( const T& val_ ) 26512027Sjungma@eit.uni-kl.de{ 26612027Sjungma@eit.uni-kl.de while( num_free() == 0 ) { 26712027Sjungma@eit.uni-kl.de sc_core::wait( m_data_read_event ); 26812027Sjungma@eit.uni-kl.de } 26912027Sjungma@eit.uni-kl.de m_num_written ++; 27012027Sjungma@eit.uni-kl.de buf_write( val_ ); 27112027Sjungma@eit.uni-kl.de request_update(); 27212027Sjungma@eit.uni-kl.de} 27312027Sjungma@eit.uni-kl.de 27412027Sjungma@eit.uni-kl.de// non-blocking write 27512027Sjungma@eit.uni-kl.de 27612027Sjungma@eit.uni-kl.detemplate <class T> 27712027Sjungma@eit.uni-kl.deinline 27812027Sjungma@eit.uni-kl.debool 27912027Sjungma@eit.uni-kl.desc_fifo<T>::nb_write( const T& val_ ) 28012027Sjungma@eit.uni-kl.de{ 28112027Sjungma@eit.uni-kl.de if( num_free() == 0 ) { 28212027Sjungma@eit.uni-kl.de return false; 28312027Sjungma@eit.uni-kl.de } 28412027Sjungma@eit.uni-kl.de m_num_written ++; 28512027Sjungma@eit.uni-kl.de buf_write( val_ ); 28612027Sjungma@eit.uni-kl.de request_update(); 28712027Sjungma@eit.uni-kl.de return true; 28812027Sjungma@eit.uni-kl.de} 28912027Sjungma@eit.uni-kl.de 29012027Sjungma@eit.uni-kl.de 29112027Sjungma@eit.uni-kl.detemplate <class T> 29212027Sjungma@eit.uni-kl.deinline 29312027Sjungma@eit.uni-kl.devoid 29412027Sjungma@eit.uni-kl.desc_fifo<T>::trace( sc_trace_file* tf ) const 29512027Sjungma@eit.uni-kl.de{ 29612027Sjungma@eit.uni-kl.de#if defined(DEBUG_SYSTEMC) 29712027Sjungma@eit.uni-kl.de char buf[32]; 29812027Sjungma@eit.uni-kl.de std::string nm = name(); 29912027Sjungma@eit.uni-kl.de for( int i = 0; i < m_size; ++ i ) { 30012027Sjungma@eit.uni-kl.de std::sprintf( buf, "_%d", i ); 30112027Sjungma@eit.uni-kl.de sc_trace( tf, m_buf[i], nm + buf ); 30212027Sjungma@eit.uni-kl.de } 30312027Sjungma@eit.uni-kl.de#endif 30412027Sjungma@eit.uni-kl.de} 30512027Sjungma@eit.uni-kl.de 30612027Sjungma@eit.uni-kl.de 30712027Sjungma@eit.uni-kl.detemplate <class T> 30812027Sjungma@eit.uni-kl.deinline 30912027Sjungma@eit.uni-kl.devoid 31012027Sjungma@eit.uni-kl.desc_fifo<T>::print( ::std::ostream& os ) const 31112027Sjungma@eit.uni-kl.de{ 31212027Sjungma@eit.uni-kl.de if( m_free != m_size ) { 31312027Sjungma@eit.uni-kl.de int i = m_ri; 31412027Sjungma@eit.uni-kl.de do { 31512027Sjungma@eit.uni-kl.de os << m_buf[i] << ::std::endl; 31612027Sjungma@eit.uni-kl.de i = ( i + 1 ) % m_size; 31712027Sjungma@eit.uni-kl.de } while( i != m_wi ); 31812027Sjungma@eit.uni-kl.de } 31912027Sjungma@eit.uni-kl.de} 32012027Sjungma@eit.uni-kl.de 32112027Sjungma@eit.uni-kl.detemplate <class T> 32212027Sjungma@eit.uni-kl.deinline 32312027Sjungma@eit.uni-kl.devoid 32412027Sjungma@eit.uni-kl.desc_fifo<T>::dump( ::std::ostream& os ) const 32512027Sjungma@eit.uni-kl.de{ 32612027Sjungma@eit.uni-kl.de os << "name = " << name() << ::std::endl; 32712027Sjungma@eit.uni-kl.de if( m_free != m_size ) { 32812027Sjungma@eit.uni-kl.de int i = m_ri; 32912027Sjungma@eit.uni-kl.de int j = 0; 33012027Sjungma@eit.uni-kl.de do { 33112027Sjungma@eit.uni-kl.de os << "value[" << i << "] = " << m_buf[i] << ::std::endl; 33212027Sjungma@eit.uni-kl.de i = ( i + 1 ) % m_size; 33312027Sjungma@eit.uni-kl.de j ++; 33412027Sjungma@eit.uni-kl.de } while( i != m_wi ); 33512027Sjungma@eit.uni-kl.de } 33612027Sjungma@eit.uni-kl.de} 33712027Sjungma@eit.uni-kl.de 33812027Sjungma@eit.uni-kl.de 33912027Sjungma@eit.uni-kl.detemplate <class T> 34012027Sjungma@eit.uni-kl.deinline 34112027Sjungma@eit.uni-kl.devoid 34212027Sjungma@eit.uni-kl.desc_fifo<T>::update() 34312027Sjungma@eit.uni-kl.de{ 34412027Sjungma@eit.uni-kl.de if( m_num_read > 0 ) { 34512027Sjungma@eit.uni-kl.de m_data_read_event.notify(SC_ZERO_TIME); 34612027Sjungma@eit.uni-kl.de } 34712027Sjungma@eit.uni-kl.de 34812027Sjungma@eit.uni-kl.de if( m_num_written > 0 ) { 34912027Sjungma@eit.uni-kl.de m_data_written_event.notify(SC_ZERO_TIME); 35012027Sjungma@eit.uni-kl.de } 35112027Sjungma@eit.uni-kl.de 35212027Sjungma@eit.uni-kl.de m_num_readable = m_size - m_free; 35312027Sjungma@eit.uni-kl.de m_num_read = 0; 35412027Sjungma@eit.uni-kl.de m_num_written = 0; 35512027Sjungma@eit.uni-kl.de} 35612027Sjungma@eit.uni-kl.de 35712027Sjungma@eit.uni-kl.de 35812027Sjungma@eit.uni-kl.de// support methods 35912027Sjungma@eit.uni-kl.de 36012027Sjungma@eit.uni-kl.detemplate <class T> 36112027Sjungma@eit.uni-kl.deinline 36212027Sjungma@eit.uni-kl.devoid 36312027Sjungma@eit.uni-kl.desc_fifo<T>::init( int size_ ) 36412027Sjungma@eit.uni-kl.de{ 36512027Sjungma@eit.uni-kl.de buf_init( size_ ); 36612027Sjungma@eit.uni-kl.de 36712027Sjungma@eit.uni-kl.de m_reader = 0; 36812027Sjungma@eit.uni-kl.de m_writer = 0; 36912027Sjungma@eit.uni-kl.de 37012027Sjungma@eit.uni-kl.de m_num_readable = 0; 37112027Sjungma@eit.uni-kl.de m_num_read = 0; 37212027Sjungma@eit.uni-kl.de m_num_written = 0; 37312027Sjungma@eit.uni-kl.de} 37412027Sjungma@eit.uni-kl.de 37512027Sjungma@eit.uni-kl.de 37612027Sjungma@eit.uni-kl.detemplate <class T> 37712027Sjungma@eit.uni-kl.deinline 37812027Sjungma@eit.uni-kl.devoid 37912027Sjungma@eit.uni-kl.desc_fifo<T>::buf_init( int size_ ) 38012027Sjungma@eit.uni-kl.de{ 38112027Sjungma@eit.uni-kl.de if( size_ <= 0 ) { 38212027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_INVALID_FIFO_SIZE_, 0 ); 38312027Sjungma@eit.uni-kl.de } 38412027Sjungma@eit.uni-kl.de m_size = size_; 38512027Sjungma@eit.uni-kl.de m_buf = new T[m_size]; 38612027Sjungma@eit.uni-kl.de m_free = m_size; 38712027Sjungma@eit.uni-kl.de m_ri = 0; 38812027Sjungma@eit.uni-kl.de m_wi = 0; 38912027Sjungma@eit.uni-kl.de} 39012027Sjungma@eit.uni-kl.de 39112027Sjungma@eit.uni-kl.detemplate <class T> 39212027Sjungma@eit.uni-kl.deinline 39312027Sjungma@eit.uni-kl.debool 39412027Sjungma@eit.uni-kl.desc_fifo<T>::buf_write( const T& val_ ) 39512027Sjungma@eit.uni-kl.de{ 39612027Sjungma@eit.uni-kl.de if( m_free == 0 ) { 39712027Sjungma@eit.uni-kl.de return false; 39812027Sjungma@eit.uni-kl.de } 39912027Sjungma@eit.uni-kl.de m_buf[m_wi] = val_; 40012027Sjungma@eit.uni-kl.de m_wi = ( m_wi + 1 ) % m_size; 40112027Sjungma@eit.uni-kl.de m_free --; 40212027Sjungma@eit.uni-kl.de return true; 40312027Sjungma@eit.uni-kl.de} 40412027Sjungma@eit.uni-kl.de 40512027Sjungma@eit.uni-kl.detemplate <class T> 40612027Sjungma@eit.uni-kl.deinline 40712027Sjungma@eit.uni-kl.debool 40812027Sjungma@eit.uni-kl.desc_fifo<T>::buf_read( T& val_ ) 40912027Sjungma@eit.uni-kl.de{ 41012027Sjungma@eit.uni-kl.de if( m_free == m_size ) { 41112027Sjungma@eit.uni-kl.de return false; 41212027Sjungma@eit.uni-kl.de } 41312027Sjungma@eit.uni-kl.de val_ = m_buf[m_ri]; 41412027Sjungma@eit.uni-kl.de m_buf[m_ri] = T(); // clear entry for boost::shared_ptr, et al. 41512027Sjungma@eit.uni-kl.de m_ri = ( m_ri + 1 ) % m_size; 41612027Sjungma@eit.uni-kl.de m_free ++; 41712027Sjungma@eit.uni-kl.de return true; 41812027Sjungma@eit.uni-kl.de} 41912027Sjungma@eit.uni-kl.de 42012027Sjungma@eit.uni-kl.de 42112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 42212027Sjungma@eit.uni-kl.de 42312027Sjungma@eit.uni-kl.detemplate <class T> 42412027Sjungma@eit.uni-kl.deinline 42512027Sjungma@eit.uni-kl.de::std::ostream& 42612027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, const sc_fifo<T>& a ) 42712027Sjungma@eit.uni-kl.de{ 42812027Sjungma@eit.uni-kl.de a.print( os ); 42912027Sjungma@eit.uni-kl.de return os; 43012027Sjungma@eit.uni-kl.de} 43112027Sjungma@eit.uni-kl.de 43212027Sjungma@eit.uni-kl.de} // namespace sc_core 43312027Sjungma@eit.uni-kl.de 43412027Sjungma@eit.uni-kl.de//$Log: sc_fifo.h,v $ 43512027Sjungma@eit.uni-kl.de//Revision 1.6 2011/08/26 20:45:40 acg 43612027Sjungma@eit.uni-kl.de// Andy Goodrich: moved the modification log to the end of the file to 43712027Sjungma@eit.uni-kl.de// eliminate source line number skew when check-ins are done. 43812027Sjungma@eit.uni-kl.de// 43912027Sjungma@eit.uni-kl.de//Revision 1.5 2011/03/23 16:17:22 acg 44012027Sjungma@eit.uni-kl.de// Andy Goodrich: hide the sc_events that are kernel related. 44112027Sjungma@eit.uni-kl.de// 44212027Sjungma@eit.uni-kl.de//Revision 1.4 2011/02/18 20:23:45 acg 44312027Sjungma@eit.uni-kl.de// Andy Goodrich: Copyright update. 44412027Sjungma@eit.uni-kl.de// 44512027Sjungma@eit.uni-kl.de//Revision 1.3 2009/10/14 19:05:40 acg 44612027Sjungma@eit.uni-kl.de// Andy Goodrich: added check for blocking interfaces in addition to the 44712027Sjungma@eit.uni-kl.de// combined blocking/nonblocking interface. 44812027Sjungma@eit.uni-kl.de// 44912027Sjungma@eit.uni-kl.de//Revision 1.2 2009/05/22 16:06:24 acg 45012027Sjungma@eit.uni-kl.de// Andy Goodrich: process control updates. 45112027Sjungma@eit.uni-kl.de// 45212027Sjungma@eit.uni-kl.de//Revision 1.1.1.1 2006/12/15 20:20:04 acg 45312027Sjungma@eit.uni-kl.de//SystemC 2.3 45412027Sjungma@eit.uni-kl.de// 45512027Sjungma@eit.uni-kl.de//Revision 1.4 2006/01/24 20:46:31 acg 45612027Sjungma@eit.uni-kl.de//Andy Goodrich: changes to eliminate use of deprecated features. For instance, 45712027Sjungma@eit.uni-kl.de//using notify(SC_ZERO_TIME) in place of notify_delayed(). 45812027Sjungma@eit.uni-kl.de// 45912027Sjungma@eit.uni-kl.de//Revision 1.3 2006/01/13 20:41:59 acg 46012027Sjungma@eit.uni-kl.de//Andy Goodrich: Changes to add port registration to the things that are 46112027Sjungma@eit.uni-kl.de//checked when SC_NO_WRITE_CHECK is not defined. 46212027Sjungma@eit.uni-kl.de// 46312027Sjungma@eit.uni-kl.de//Revision 1.2 2006/01/03 23:18:26 acg 46412027Sjungma@eit.uni-kl.de//Changed copyright to include 2006. 46512027Sjungma@eit.uni-kl.de// 46612027Sjungma@eit.uni-kl.de//Revision 1.1.1.1 2005/12/19 23:16:43 acg 46712027Sjungma@eit.uni-kl.de//First check in of SystemC 2.1 into its own archive. 46812027Sjungma@eit.uni-kl.de// 46912027Sjungma@eit.uni-kl.de//Revision 1.12 2005/09/15 23:01:51 acg 47012027Sjungma@eit.uni-kl.de//Added std:: prefix to appropriate methods and types to get around 47112027Sjungma@eit.uni-kl.de//issues with the Edison Front End. 47212027Sjungma@eit.uni-kl.de// 47312027Sjungma@eit.uni-kl.de//Revision 1.11 2005/06/10 22:43:55 acg 47412027Sjungma@eit.uni-kl.de//Added CVS change log annotation. 47512027Sjungma@eit.uni-kl.de// 47612027Sjungma@eit.uni-kl.de 47712027Sjungma@eit.uni-kl.de#endif 47812027Sjungma@eit.uni-kl.de 47912027Sjungma@eit.uni-kl.de// Taf! 480