source: trunk/modules/vci_local_ring_network_2/caba/source/src/vci_local_ring_network_2.cpp @ 8

Last change on this file since 8 was 8, checked in by simerabe, 14 years ago

new ring components for systemcass

  • Property svn:executable set to *
File size: 7.9 KB
Line 
1/* -*- c++ -*-
2 * SOCLIB_LGPL_HEADER_BEGIN
3 *
4 * This file is part of SoCLib, GNU LGPLv2.1.
5 *
6 * SoCLib is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; version 2.1 of the License.
9 *
10 * SoCLib is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with SoCLib; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 * 02110-1301 USA
19 *
20 * SOCLIB_LGPL_HEADER_END
21 *
22 * Authors  : Abdelmalek SI MERABET
23 * Date     : March 2010
24 * Copyright: UPMC - LIP6
25 */
26
27#include <iostream> 
28#include <string>
29#include <stdarg.h>
30#include "alloc_elems.h"
31#include "../include/vci_local_ring_network_2.h"
32
33namespace soclib { namespace caba {
34
35using soclib::common::alloc_elems;
36using soclib::common::dealloc_elems;
37
38#define tmpl(x) template<typename vci_param, int ring_cmd_data_size, int ring_rsp_data_size > x VciLocalRingNetwork2<vci_param, ring_cmd_data_size, ring_rsp_data_size >
39
40////////////////////////////////
41//      constructor
42//
43////////////////////////////////
44tmpl(/**/)::VciLocalRingNetwork2( sc_module_name insname,
45                         const soclib::common::MappingTable &mt,
46                         const soclib::common::IntTab &ringid,
47                         const int &wrapper_fifo_depth,
48                         const int &half_gateway_fifo_depth,
49                         int nb_attached_initiator,
50                         int nb_attached_target)                                             
51                         : soclib::caba::BaseModule(insname), 
52                           m_ns(nb_attached_initiator+nb_attached_target+2), 
53                           m_nai(nb_attached_initiator), 
54                           m_nat(nb_attached_target)
55 {
56       
57
58       
59        p_to_initiator =  soclib::common::alloc_elems<soclib::caba::VciTarget<vci_param> >("p_to_initiator", m_nai);
60        p_to_target = soclib::common::alloc_elems<soclib::caba::VciInitiator<vci_param> >("p_to_target", m_nat);
61
62        m_ring_initiator = new ring_initiator_t*[m_nai];
63        m_ring_target    = new ring_target_t*[m_nat]; 
64        m_ring_signal    = new ring_signal_t[m_ns];
65
66
67        std::ostringstream o;
68        o << name() << "_hg_init";
69
70        m_half_gateway_initiator = new half_gateway_initiator_t(o.str().c_str(), false, half_gateway_fifo_depth, mt, ringid, false);
71
72        std::ostringstream p;
73        p << name() << "_hg_target";
74        m_half_gateway_target    = new half_gateway_target_t(p.str().c_str(), false, half_gateway_fifo_depth, mt, ringid, false);
75
76        for(size_t i=0; i<m_nai; ++i) {
77                bool alloc_init = (i==0);
78                std::ostringstream o;
79                o << name() << "_init_" << i;
80                m_ring_initiator[i] = new ring_initiator_t(o.str().c_str(), alloc_init, wrapper_fifo_depth, mt, ringid, i);
81        }
82
83        for(size_t i=0; i<m_nat; ++i) {
84                bool alloc_target = (i==0);
85                std::ostringstream o;
86                o << name() << "_target_" << i;
87                m_ring_target[i]  = new ring_target_t(o.str().c_str(), alloc_target, wrapper_fifo_depth, mt, ringid, i);
88        }
89
90        SC_METHOD(transition);
91        dont_initialize();
92        sensitive << p_clk.pos();
93
94        SC_METHOD(genMoore);
95        dont_initialize();
96        sensitive << p_clk.neg();
97 }
98//--------------------------//
99tmpl(void)::transition()    //
100//--------------------------//
101{
102
103
104        if ( ! p_resetn.read() ) {
105                for(size_t i=0;i<m_nai;i++) 
106                        m_ring_initiator[i]->reset();
107                for(size_t t=0;t<m_nat;t++)
108                        m_ring_target[t]->reset();
109
110                m_half_gateway_initiator->reset();
111                m_half_gateway_target->reset();
112                return;
113        }
114
115// update ring signals Three iterations
116// this is intended in order to break the loop due to dependency existing between ring signals
117// this rule is based based on relaxation principle
118
119//- 1st
120       for(size_t i=0;i<m_nai;i++) {
121                size_t h = 0;
122                if(i == 0) h = m_ns-1;
123                else h = i-1;
124                m_ring_initiator[i]->update_ring_signals(m_ring_signal[h], m_ring_signal[i]);
125        }
126
127        for(size_t i=0;i<m_nat;i++){
128                m_ring_target[i]->update_ring_signals(m_ring_signal[m_nai+i-1], m_ring_signal[m_nai+i] );
129        }
130
131        m_half_gateway_initiator->update_ring_signals(m_ring_signal[m_nai+m_nat-1], m_ring_signal[m_nai+m_nat] );
132
133        m_half_gateway_target->update_ring_signals(m_ring_signal[m_ns-2], m_ring_signal[m_ns-1] );
134
135//- 2nd
136       for(size_t i=0;i<m_nai;i++) {
137                size_t h = 0;
138                if(i == 0) h = m_ns-1;
139                else h = i-1;
140                m_ring_initiator[i]->update_ring_signals(m_ring_signal[h], m_ring_signal[i]);
141        }
142
143        for(size_t i=0;i<m_nat;i++){
144                m_ring_target[i]->update_ring_signals(m_ring_signal[m_nai+i-1], m_ring_signal[m_nai+i] );
145        }
146
147        m_half_gateway_initiator->update_ring_signals(m_ring_signal[m_nai+m_nat-1], m_ring_signal[m_nai+m_nat] );
148
149        m_half_gateway_target->update_ring_signals(m_ring_signal[m_ns-2], m_ring_signal[m_ns-1] );
150
151
152//- 3rd
153       for(size_t i=0;i<m_nai;i++) {
154                size_t h = 0;
155                if(i == 0) h = m_ns-1;
156                else h = i-1;
157                m_ring_initiator[i]->update_ring_signals(m_ring_signal[h], m_ring_signal[i]);
158        }
159
160        for(size_t i=0;i<m_nat;i++){
161                m_ring_target[i]->update_ring_signals(m_ring_signal[m_nai+i-1], m_ring_signal[m_nai+i] );
162        }
163
164        m_half_gateway_initiator->update_ring_signals(m_ring_signal[m_nai+m_nat-1], m_ring_signal[m_nai+m_nat] );
165
166        m_half_gateway_target->update_ring_signals(m_ring_signal[m_ns-2], m_ring_signal[m_ns-1] );
167
168//-----------------------------------------------//
169// transition                                    //
170//----------------------------------------------//
171
172        for(size_t i=0;i<m_nai;i++) {
173                size_t h = 0;
174                if(i == 0) h = m_ns-1;
175                else h = i-1;
176                m_ring_initiator[i]->transition(p_to_initiator[i], m_ring_signal[h]);
177        }
178        for(size_t t=0;t<m_nat;t++) {
179                m_ring_target[t]->transition(p_to_target[t], m_ring_signal[m_nai+t-1]);
180        }
181
182        m_half_gateway_initiator->transition(p_gate_initiator, m_ring_signal[m_nai+m_nat-1]);
183        m_half_gateway_target->transition(p_gate_target, m_ring_signal[m_nai+m_nat]);
184
185
186/*-------- print
187        for(size_t t=0;t<m_nat;t++) {
188                print_signal(m_nai+t-1);
189                print_vci_target(t);
190        }
191
192        for(size_t i=0;i<m_nai;i++) {
193                size_t h = 0;
194                if(i == 0) h = m_ns-1;
195                else h = i-1;
196                print_signal(h);
197                print_vci_init(i);
198        }
199*/
200}
201
202tmpl(void)::genMoore()
203{
204
205        for(size_t i=0;i<m_nai;i++) 
206                m_ring_initiator[i]->genMoore(p_to_initiator[i]);
207        for(size_t t=0;t<m_nat;t++)
208                m_ring_target[t]->genMoore(p_to_target[t]);   
209
210        m_half_gateway_initiator->genMoore(p_gate_initiator);
211   
212        m_half_gateway_target->genMoore(p_gate_target);
213}   
214//---------------- destructor
215tmpl(/**/)::~VciLocalRingNetwork2()
216    {
217
218        delete m_half_gateway_initiator;
219        delete m_half_gateway_target;
220
221        for(size_t x = 0; x < m_nai; x++)
222                delete m_ring_initiator[x];
223       
224        for(size_t x = 0; x < m_nat; x++)
225                delete m_ring_target[x];
226
227//for(size_t x = 0; x < m_ns; x++)
228//      delete m_ring_signal[x];
229
230        delete [] m_ring_initiator;
231        delete [] m_ring_target;
232        delete [] m_ring_signal;
233       
234        dealloc_elems(p_to_initiator,m_nai);
235        dealloc_elems(p_to_target, m_nat);;       
236    }
237}} // end namespace
Note: See TracBrowser for help on using the repository browser.