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