/* -*- c++ -*- * SOCLIB_LGPL_HEADER_BEGIN * * This file is part of SoCLib, GNU LGPLv2.1. * * SoCLib is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; version 2.1 of the License. * * SoCLib is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with SoCLib; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA * * SOCLIB_LGPL_HEADER_END * * Author : Abdelmalek SI MERABET * Date : February 2011 * Copyright: UPMC - LIP6 */ #include #include #include #include "alloc_elems.h" #include "../include/dspin_local_ring_fast_c.h" namespace soclib { namespace caba { using soclib::common::alloc_elems; using soclib::common::dealloc_elems; #define tmpl(x) template x DspinLocalRingFastC //////////////////////////////// // constructor // //////////////////////////////// tmpl(/**/)::DspinLocalRingFastC( sc_module_name insname, const soclib::common::MappingTable &mt, const soclib::common::IntTab &ringid, const int &wrapper_fifo_depth, const int &half_gateway_fifo_depth, int nb_attached_initiator, int nb_attached_target, const int x_width, const int y_width) : soclib::caba::BaseModule(insname), m_ns(nb_attached_initiator+nb_attached_target+2), m_nai(nb_attached_initiator), m_nat(nb_attached_target) { p_cmd_out = soclib::common::alloc_elems >("p_cmd_out", m_nat+1); p_rsp_in = soclib::common::alloc_elems >("p_rsp_in" , m_nat+1); p_cmd_in = soclib::common::alloc_elems >("p_cmd_in" , m_nai+1); p_rsp_out = soclib::common::alloc_elems >("p_rsp_out", m_nai+1); //-- to keep trace on ring traffic init_cmd = new cmd_str[m_nai+1]; tgt_rsp = new rsp_str[m_nat+1]; tgt_cmd_val = new bool[m_nat+1]; init_rsp_val = new bool[m_nai+1]; //-- m_ring_initiator = new ring_initiator_t*[m_nai]; m_ring_target = new ring_target_t*[m_nat]; m_ring_signal = new ring_signal_t[m_ns]; std::ostringstream o; o << name() << "_hg_init"; bool alloc_hg_init = (m_nai == 0); m_half_gateway_initiator = new half_gateway_initiator_t(o.str().c_str(), alloc_hg_init, half_gateway_fifo_depth, mt, ringid, nb_attached_target, x_width, y_width); std::ostringstream p; p << name() << "_hg_target"; bool alloc_hg_target = (m_nat == 0); m_half_gateway_target = new half_gateway_target_t(p.str().c_str(), alloc_hg_target, half_gateway_fifo_depth, mt, ringid, m_nat); for(int i=0; ireset(); } for(int t=0;treset(); } m_half_gateway_initiator->reset(); m_half_gateway_target->reset(); return; } // update ring signals four times // in order to break the loop due to dependency existing between ring signals // this rule is based on relaxation principle for (int niter = 0; niter < m_ns - 1; niter++) { for(int i=0;iupdate_ring_signals(m_ring_signal[h], m_ring_signal[i]); } for(int i=0;iupdate_ring_signals(m_ring_signal[m_nai+i-1], m_ring_signal[m_nai+i] ); } m_half_gateway_initiator->update_ring_signals(m_ring_signal[m_nai+m_nat-1], m_ring_signal[m_nai+m_nat], tga, iga); m_half_gateway_target->update_ring_signals(m_ring_signal[m_ns-2], m_ring_signal[m_ns-1], tga, iga); } //-----------------------------------------------// // transition // //----------------------------------------------// for(int i=0;itransition(p_cmd_in[i], p_rsp_out[i], m_ring_signal[h], init_cmd[i], init_rsp_val[i]); } for(int t=0;ttransition(p_cmd_out[t], p_rsp_in[t], m_ring_signal[m_nai+t-1], tgt_cmd_val[t], tgt_rsp[t]); } m_half_gateway_initiator->transition(p_cmd_in[m_nai], p_rsp_out[m_nai], m_ring_signal[m_nai+m_nat-1], init_cmd[m_nai], init_rsp_val[m_nai], tga); m_half_gateway_target->transition(p_cmd_out[m_nat], p_rsp_in[m_nat], m_ring_signal[m_nai+m_nat], tgt_cmd_val[m_nat], tgt_rsp[m_nat], iga); } tmpl(void)::genMoore() { for(int i=0;igenMoore(p_cmd_in[i], p_rsp_out[i]); for(int t=0;tgenMoore(p_cmd_out[t], p_rsp_in[t]); m_half_gateway_initiator->genMoore(p_cmd_in[m_nai], p_rsp_out[m_nai]); m_half_gateway_target->genMoore(p_cmd_out[m_nat], p_rsp_in[m_nat]); } //---------------- destructor tmpl(/**/)::~DspinLocalRingFastC() { delete m_half_gateway_initiator; delete m_half_gateway_target; for(int x = 0; x < m_nai; x++) delete m_ring_initiator[x]; for(int x = 0; x < m_nat; x++) delete m_ring_target[x]; delete [] m_ring_initiator; delete [] m_ring_target; delete [] m_ring_signal; dealloc_elems(p_cmd_out, m_nat+1); dealloc_elems(p_cmd_in, m_nai+1); dealloc_elems(p_rsp_in, m_nat+1); dealloc_elems(p_rsp_out, m_nai+1); } tmpl(void)::print_trace() { int init_cmd_index = 0; bool init_cmd_found = false; int tgt_rsp_index = 0; bool tgt_rsp_found = false; // cmd trace //*-- one initiator has token at one time for(int i=0;iprint_stats(); #endif } #ifdef HI_STATS else m_half_gateway_initiator->print_stats(); #endif } #endif }} // end namespace