summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/intersim2/.svn/entries1
-rw-r--r--src/intersim2/.svn/format1
-rw-r--r--src/intersim2/.svn/pristine/04/043985cd8560fd203de2c2d82735f1e5ecf3783d.svn-base79
-rw-r--r--src/intersim2/.svn/pristine/05/05a079244c124bc5d781812aac07878c6956ef46.svn-base1331
-rw-r--r--src/intersim2/.svn/pristine/0a/0a776321c5f55776af796ce2c5543f562d751c17.svn-base270
-rw-r--r--src/intersim2/.svn/pristine/0b/0b0c41499a28f0b7c2fccd583db339989d665677.svn-base155
-rw-r--r--src/intersim2/.svn/pristine/0e/0eae5ca5351f1f31915bc0c3da4a3a1ae19e21c4.svn-base57
-rw-r--r--src/intersim2/.svn/pristine/0f/0fa9e6ee8d633c141585cd663a6307195b79db63.svn-base532
-rw-r--r--src/intersim2/.svn/pristine/10/1008fe454a2dfea0e03f6ab28358479e94cdb719.svn-base61
-rw-r--r--src/intersim2/.svn/pristine/12/125686d82b0fb03524a1bd1dc36fd9172006e780.svn-base673
-rw-r--r--src/intersim2/.svn/pristine/12/1260dd25f0b77d1694bc40d60681090fdb77e795.svn-base186
-rw-r--r--src/intersim2/.svn/pristine/12/129d383ada436691b3879ee38f72c6420d1b3b86.svn-base481
-rw-r--r--src/intersim2/.svn/pristine/13/135d8312fc0bb109518f6bfc62cbbf814c7d587c.svn-base112
-rw-r--r--src/intersim2/.svn/pristine/13/13e96ce60fa5bdc9726f48b5186ae562fcd4bbeb.svn-base53
-rw-r--r--src/intersim2/.svn/pristine/14/14292d017cd222997f376c20ca99e10a17cb7e0c.svn-base319
-rw-r--r--src/intersim2/.svn/pristine/14/14cfb5d4ea815b6697d047697a25ef8cfb9e17de.svn-base57
-rw-r--r--src/intersim2/.svn/pristine/15/1567f00df3a29e4f360b35e014b1f69cf281f55a.svn-base68
-rw-r--r--src/intersim2/.svn/pristine/1a/1abf005acda7eb93dad10f55694f27a84ba74f91.svn-base111
-rw-r--r--src/intersim2/.svn/pristine/1a/1afc46cd26811b568cd238a5bb6cf4a3e9687edf.svn-base54
-rw-r--r--src/intersim2/.svn/pristine/1e/1e4194e8f6ff3aacdde8d0caf868ab69490d6a6c.svn-base447
-rw-r--r--src/intersim2/.svn/pristine/1f/1f35cbdd9ebe1ee0a41e949e03d51d268ac55bad.svn-base97
-rw-r--r--src/intersim2/.svn/pristine/1f/1f6b483285599def0e7fea5379c0af7a176d2736.svn-base223
-rw-r--r--src/intersim2/.svn/pristine/23/235d7e656a8ce9818d81cd7eb47ca78febbe438a.svn-base62
-rw-r--r--src/intersim2/.svn/pristine/24/244c1dc93f9a90c660c06c653d3809b739d40458.svn-base68
-rw-r--r--src/intersim2/.svn/pristine/2a/2a04a186dfedaa33f2a0336556c086868dd6ccfc.svn-base174
-rw-r--r--src/intersim2/.svn/pristine/2c/2ca444c5a28eb3f8aaffcf0702edd18d4fe31fad.svn-base61
-rw-r--r--src/intersim2/.svn/pristine/2e/2e9094d44209e8c6464b2834012a6dc9dd860340.svn-base501
-rw-r--r--src/intersim2/.svn/pristine/2f/2ff946ea4e0a43b74a424e711f7489085c496e3a.svn-base121
-rw-r--r--src/intersim2/.svn/pristine/33/337f567cc4b77aad754f713a5fd363118f925249.svn-base52
-rw-r--r--src/intersim2/.svn/pristine/38/38bf48ff0300a37f3005867f74e32b80297f8b09.svn-base75
-rw-r--r--src/intersim2/.svn/pristine/39/398668283dbbef318596ac5cdfdb72a53973f2d1.svn-base161
-rw-r--r--src/intersim2/.svn/pristine/3a/3a771e1b366aae7e427d29b3f55d7f51045173d5.svn-base71
-rw-r--r--src/intersim2/.svn/pristine/3b/3bdd451bbcde75941cf7ad8caf63c4465c856102.svn-base187
-rw-r--r--src/intersim2/.svn/pristine/3b/3bebc9fde5e475aaa53b6d4abda241d37117421b.svn-base67
-rw-r--r--src/intersim2/.svn/pristine/3c/3c57b304902a442e45bf4e4225aac564cd2bdc26.svn-base62
-rw-r--r--src/intersim2/.svn/pristine/3c/3c8671257ad287c8e877c0942bdc9f16e9f7fe0c.svn-base162
-rw-r--r--src/intersim2/.svn/pristine/3f/3f4cacd217f3c1d154a11537511bf6b6e96a8e6b.svn-base76
-rw-r--r--src/intersim2/.svn/pristine/42/42777bd5ccda83625dfbf29e7aec13f2e773373a.svn-base1999
-rw-r--r--src/intersim2/.svn/pristine/47/471f8248dcd907fcddacc3b42c965e4919cb2f35.svn-base48
-rw-r--r--src/intersim2/.svn/pristine/4d/4d8326ecf3cc79ffda12daf20e4a46b4439ada88.svn-base290
-rw-r--r--src/intersim2/.svn/pristine/52/52025d7789c8bb45a38bad2e58ac67cc26f3b4ed.svn-base99
-rw-r--r--src/intersim2/.svn/pristine/55/5559780a67de13b98fb00d7f052ce254551f229b.svn-base88
-rw-r--r--src/intersim2/.svn/pristine/55/55ee19fa1932804a55ee815f4456c4a6f21a355f.svn-base239
-rw-r--r--src/intersim2/.svn/pristine/56/569d5254648903d6589a32c30a98b3276cdbdebd.svn-base91
-rw-r--r--src/intersim2/.svn/pristine/58/589a6050104bd5e828d72f3efdc31796eae32683.svn-base51
-rw-r--r--src/intersim2/.svn/pristine/59/59bcc26ad66045a58e3f0590f2b12ad7eba5991f.svn-base71
-rw-r--r--src/intersim2/.svn/pristine/5c/5cc61faafce12ea44fa63fb32a14f8f0c74c7338.svn-base66
-rw-r--r--src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base187
-rw-r--r--src/intersim2/.svn/pristine/65/650f86454fd17051ddb2eca80fd985027770a1ba.svn-base49
-rw-r--r--src/intersim2/.svn/pristine/66/6699bbb1b4cb750a8857780e76ee4923ef317c90.svn-base34
-rw-r--r--src/intersim2/.svn/pristine/69/691260433188a985b38ff49ca3f51e6c0b731c0a.svn-base118
-rw-r--r--src/intersim2/.svn/pristine/6c/6c86a0b772d76fae9d90046d17b6ec12b77551d0.svn-base130
-rw-r--r--src/intersim2/.svn/pristine/6d/6d0272df1c727d8c5fa77a3bfa9155d50335a5c6.svn-base95
-rw-r--r--src/intersim2/.svn/pristine/6e/6ee04608f65a1c9be65fcbe3def54f38d00f1bf5.svn-base518
-rw-r--r--src/intersim2/.svn/pristine/70/7052ff59571d88c99070cd8d659460b1534cf1b3.svn-base86
-rw-r--r--src/intersim2/.svn/pristine/72/72bdb07d5ae6b1010a5ae388c45b5fbe2d549f92.svn-base75
-rw-r--r--src/intersim2/.svn/pristine/75/75fab6aaa53ec97ae2f9769ab873fea5abf9516b.svn-base83
-rw-r--r--src/intersim2/.svn/pristine/76/7692129db779b4e8cd14cf7ab6fac567093153b2.svn-base52
-rw-r--r--src/intersim2/.svn/pristine/77/77d1aaef881a98fa412061c4daa8137d12ee6f3f.svn-base158
-rw-r--r--src/intersim2/.svn/pristine/78/78c651a126efa354bfbf06841fb91bf72d970003.svn-base57
-rw-r--r--src/intersim2/.svn/pristine/78/78db9a8009e2eeebfa8c1d67e38108237e7cf1b3.svn-base72
-rw-r--r--src/intersim2/.svn/pristine/7a/7a54a566c36bec4672c4c004940eb007ffb11730.svn-base289
-rw-r--r--src/intersim2/.svn/pristine/7b/7b0efd00926de5ec0c6efc86d8ddfbba35da0f82.svn-base44
-rw-r--r--src/intersim2/.svn/pristine/7b/7b445ae8a3f265094d5af4956c88457b77c18fa5.svn-base220
-rw-r--r--src/intersim2/.svn/pristine/7c/7c4fde53686972fa2db885e0743742173afd1bb9.svn-base57
-rw-r--r--src/intersim2/.svn/pristine/7f/7fdf02535ae5ba5ca9a2b15879dbcdd928095585.svn-base202
-rw-r--r--src/intersim2/.svn/pristine/82/829eb51edd8ef3cc3c06778a3e3a379f352728e1.svn-base254
-rw-r--r--src/intersim2/.svn/pristine/8c/8c5b24b41796edbfedbb98138da7278e7c22d832.svn-base34
-rw-r--r--src/intersim2/.svn/pristine/8e/8e7a59b2896a3ee93a308768d554d28b324b26aa.svn-base2283
-rw-r--r--src/intersim2/.svn/pristine/8f/8fa65cdf95f29e2fd90afe3901d296d085ff768b.svn-base43
-rw-r--r--src/intersim2/.svn/pristine/8f/8fca73abe4a7446a1a53687a6baca97dc056eabf.svn-base34
-rw-r--r--src/intersim2/.svn/pristine/8f/8fd71b46841aae63fcfe44908c2a1827741661fb.svn-base111
-rw-r--r--src/intersim2/.svn/pristine/90/90e277f393024f15eeb6e024bd34ac972b818aaf.svn-base210
-rw-r--r--src/intersim2/.svn/pristine/90/90f780ee11bbe517547a3648019db3592a5e7675.svn-base88
-rw-r--r--src/intersim2/.svn/pristine/94/941911d54bdc048828d97698138c156dd9becc6c.svn-base69
-rw-r--r--src/intersim2/.svn/pristine/95/9532d33b08220b7f51a001451336e589a0a92e97.svn-base69
-rw-r--r--src/intersim2/.svn/pristine/96/968162a2f3ef193e7baffadd696d73fccaf5d69c.svn-base160
-rw-r--r--src/intersim2/.svn/pristine/97/9709aa53e9b91e3103a5c627cfd4c83d5857c451.svn-base187
-rw-r--r--src/intersim2/.svn/pristine/9a/9a6a33f2fd931773aa82485ef360d84c227abb12.svn-base76
-rw-r--r--src/intersim2/.svn/pristine/9a/9a75723858a7c299341d4e68fbb1581f9865b898.svn-base47
-rw-r--r--src/intersim2/.svn/pristine/9a/9aed09bfc8ce0fffa6872c93917412c0577120c2.svn-base322
-rw-r--r--src/intersim2/.svn/pristine/9b/9b149c35e1f088a947ef877a58c79300dd5b074e.svn-base103
-rw-r--r--src/intersim2/.svn/pristine/9e/9ee6cbb1a61d3f7c2992c673ad86d0ed1d245ef8.svn-base116
-rw-r--r--src/intersim2/.svn/pristine/9f/9f3bdc5b32d0fd02e717f7a9c517e280355586fb.svn-base103
-rw-r--r--src/intersim2/.svn/pristine/a4/a4359ad59061eaed8a442687bbf1e8693be96a72.svn-base68
-rw-r--r--src/intersim2/.svn/pristine/ad/ad824944d4de71c9e947f9e386f12aa8c6ec4355.svn-base104
-rw-r--r--src/intersim2/.svn/pristine/af/afde60b791408b0db1c56c113ccfe45105b846eb.svn-base119
-rw-r--r--src/intersim2/.svn/pristine/b0/b0621120b70fa66b06fa3e7adc9b386974b8c0c3.svn-base66
-rw-r--r--src/intersim2/.svn/pristine/b4/b4f5b1485bfafbb63c019d5aadd0f1c58250fbe4.svn-base50
-rw-r--r--src/intersim2/.svn/pristine/b6/b6c4fdbece4c23327c9e321b130c2ec595705f98.svn-base183
-rw-r--r--src/intersim2/.svn/pristine/b7/b755bb8c053f61f95a6ce87cddff8068f0fa19fa.svn-base137
-rw-r--r--src/intersim2/.svn/pristine/b8/b8715f9652140e4746a42ce2c1ca742a6dcc8ab1.svn-base68
-rw-r--r--src/intersim2/.svn/pristine/b9/b92275ee465ac160db13b1f1e271cf80bc843710.svn-base183
-rw-r--r--src/intersim2/.svn/pristine/bf/bf0b085441d2569f393cadb89df82945471cd4d4.svn-base575
-rw-r--r--src/intersim2/.svn/pristine/c3/c3580bf85e8bc6015a74e1f37916987e00accdaa.svn-base146
-rw-r--r--src/intersim2/.svn/pristine/c3/c3dce16b735e5ff4045d124ee30299d4ff39f5b1.svn-base95
-rw-r--r--src/intersim2/.svn/pristine/c5/c5213fecc8710817b2514c72787b0207849f9280.svn-base80
-rw-r--r--src/intersim2/.svn/pristine/cb/cb7c673e590ba7e01169bf437b3753f478aa55ac.svn-base71
-rw-r--r--src/intersim2/.svn/pristine/cd/cdcc1ba4154908a4bfefe5993832475af05a62e6.svn-base53
-rw-r--r--src/intersim2/.svn/pristine/ce/ce3f71fc2f0c6cac1246ba0e26b6af41edef501d.svn-base890
-rw-r--r--src/intersim2/.svn/pristine/d0/d0f90a9d59a9b0c3aa0cf7a6059e041d762561d1.svn-base47
-rw-r--r--src/intersim2/.svn/pristine/d3/d37925d1e5c51c8adc54f266e526d96fd3468e65.svn-base86
-rw-r--r--src/intersim2/.svn/pristine/d6/d61d8cfbf8e0ae5784d8d94c0bb085d6d1e7b214.svn-base60
-rw-r--r--src/intersim2/.svn/pristine/d8/d829c556dee3dc27d19528e00200847c1b338e0e.svn-base37
-rw-r--r--src/intersim2/.svn/pristine/da/dace18d8332403831e17e47c9f2dac7ee20fe786.svn-base125
-rw-r--r--src/intersim2/.svn/pristine/de/de391802bf06c5a01ef346b8b98d27244c296855.svn-base856
-rw-r--r--src/intersim2/.svn/pristine/e0/e0e6b10f519b612fdd24fcc64ea62b4d5fdf89fc.svn-base74
-rw-r--r--src/intersim2/.svn/pristine/e2/e216ca41a2789704029b85d462988590d43813f3.svn-base108
-rw-r--r--src/intersim2/.svn/pristine/e3/e3245c11796bcda90ba6909bb34dced14101b2c3.svn-base346
-rw-r--r--src/intersim2/.svn/pristine/e6/e64fcd97a677ff77ec1692273171f513fe794507.svn-base132
-rw-r--r--src/intersim2/.svn/pristine/eb/ebec0a8c0098e95bd530e52b0baed6d9a60a33c1.svn-base190
-rw-r--r--src/intersim2/.svn/pristine/ec/ec23715e6e01d44320732e4a8fc186d6b209a3bb.svn-base120
-rw-r--r--src/intersim2/.svn/pristine/ef/ef53e3bc23eac89edf00c7903de88ebb2f4084b6.svn-base76
-rw-r--r--src/intersim2/.svn/pristine/f0/f0994d52a0bff0a75bf779e8ec53715b011bfd97.svn-base112
-rw-r--r--src/intersim2/.svn/pristine/f1/f18798b1a209786e47ee28ef3d5c7b5e908e0642.svn-base48
-rw-r--r--src/intersim2/.svn/pristine/f3/f3f385cd24e067dc09ab89284d234593352ee0bf.svn-base153
-rw-r--r--src/intersim2/.svn/pristine/f4/f47cc0dc517c023ddeaf70f92c90e0ecfe343030.svn-base26
-rw-r--r--src/intersim2/.svn/pristine/f4/f48f9ec9cbd794b900c47d4fa1af919f73f844ab.svn-base53
-rw-r--r--src/intersim2/.svn/pristine/f7/f7c0ca6108d1e538b05438c69b603d0d1903688f.svn-base79
-rw-r--r--src/intersim2/.svn/pristine/f8/f88e58811f1c40d35b795e6d317579cc2c3668d0.svn-base2385
-rw-r--r--src/intersim2/.svn/pristine/f9/f9cf31dbae18e4e1930dc0632175d9c420d3c067.svn-base107
-rw-r--r--src/intersim2/.svn/pristine/f9/f9ef776d4727c7e2a1e057f5839da76e854ccae5.svn-base40
-rw-r--r--src/intersim2/.svn/pristine/fa/fad571d200d6232ee119a96b2ae1820f3d6903fa.svn-base676
-rw-r--r--src/intersim2/.svn/pristine/fc/fc7b3404406776df7852a99657a25fb9feadbc84.svn-base55
-rw-r--r--src/intersim2/.svn/wc.dbbin188416 -> 0 bytes
125 files changed, 0 insertions, 26024 deletions
diff --git a/src/intersim2/.svn/entries b/src/intersim2/.svn/entries
deleted file mode 100644
index 48082f7..0000000
--- a/src/intersim2/.svn/entries
+++ /dev/null
@@ -1 +0,0 @@
-12
diff --git a/src/intersim2/.svn/format b/src/intersim2/.svn/format
deleted file mode 100644
index 48082f7..0000000
--- a/src/intersim2/.svn/format
+++ /dev/null
@@ -1 +0,0 @@
-12
diff --git a/src/intersim2/.svn/pristine/04/043985cd8560fd203de2c2d82735f1e5ecf3783d.svn-base b/src/intersim2/.svn/pristine/04/043985cd8560fd203de2c2d82735f1e5ecf3783d.svn-base
deleted file mode 100644
index bccc4db..0000000
--- a/src/intersim2/.svn/pristine/04/043985cd8560fd203de2c2d82735f1e5ecf3783d.svn-base
+++ /dev/null
@@ -1,79 +0,0 @@
-// $Id$
-
-// Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// Redistributions of source code must retain the above copyright notice, this
-// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-// Dragonfly
-//
-
-
-
-
-vc_buf_size = 256;
-
-
-wait_for_tail_credit = 0;
-
-//
-// Router architecture
-//
-vc_allocator = separable_input_first;
-sw_allocator = separable_input_first;
-alloc_iters = 1;
-
-credit_delay = 2;
-routing_delay = 0;
-vc_alloc_delay = 1;
-sw_alloc_delay = 1;
-st_final_delay = 1;
-
-input_speedup = 1;
-output_speedup = 1;
-internal_speedup = 2.0;
-
-
-warmup_periods = 3;
-sim_count = 1;
-
-sample_period = 10000;
-
-
-
-routing_function = min;
-num_vcs = 2;
-
-priority = none;
-traffic = uniform;
-
-injection_rate = 0.8;
-packet_size = 10;
-injection_rate_uses_flits=1;
-
-topology = dragonflynew;
-
-k = 4;
-n = 1;
-
-watch_out=-;
-
diff --git a/src/intersim2/.svn/pristine/05/05a079244c124bc5d781812aac07878c6956ef46.svn-base b/src/intersim2/.svn/pristine/05/05a079244c124bc5d781812aac07878c6956ef46.svn-base
deleted file mode 100644
index 168d973..0000000
--- a/src/intersim2/.svn/pristine/05/05a079244c124bc5d781812aac07878c6956ef46.svn-base
+++ /dev/null
@@ -1,1331 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-//Flattened butterfly simulator
-//Created by John Kim
-//
-//Updated 11/6/2007 by Ted Jiang, now scales
-//with any n such that N = K^3, k is a power of 2
-//however, the change restrict it to a 2D FBfly
-//
-//updated sometimes in december by Ted Jiang, now works for updat to 4
-//dimension.
-//
-//Updated 2/4/08 by Ted Jiang disabling partial networks
-//change concentrations
-//
-//More update 3/31/08 to correctly assign the nodes to the routers
-//UGAL now has added a "mapping" to account for this new assignment
-//of the nodes to the routers
-//
-//Updated by mihelog 27 Aug to add progressive choice of intermediate destination.
-//Also, half of the total vcs are used for non-minimal routing, others for minimal (for UGAL and valiant).
-
-
-#include "booksim.hpp"
-#include <vector>
-#include <sstream>
-#include <limits>
-#include <cmath>
-#include "flatfly_onchip.hpp"
-#include "random_utils.hpp"
-#include "misc_utils.hpp"
-#include "globals.hpp"
-
-
-
-//#define DEBUG_FLATFLY
-
-static int _xcount;
-static int _ycount;
-static int _xrouter;
-static int _yrouter;
-
-FlatFlyOnChip::FlatFlyOnChip( const Configuration &config, const string & name ) :
- Network( config, name )
-{
-
- _ComputeSize( config );
- _Alloc( );
- _BuildNet( config );
-}
-
-void FlatFlyOnChip::_ComputeSize( const Configuration &config )
-{
- _k = config.GetInt( "k" ); // # of routers per dimension
- _n = config.GetInt( "n" ); // dimension
- _c = config.GetInt( "c" ); //concentration, may be different from k
- _r = _c + (_k-1)*_n ; // total radix of the switch ( # of inputs/outputs)
-
- //how many routers in the x or y direction
- _xcount = config.GetInt("x");
- _ycount = config.GetInt("y");
- assert(_xcount == _ycount);
- //configuration of hohw many clients in X and Y per router
- _xrouter = config.GetInt("xr");
- _yrouter = config.GetInt("yr");
- assert(_xrouter == _yrouter);
- gK = _k;
- gN = _n;
- gC = _c;
-
- assert(_c == _xrouter*_yrouter);
-
- _nodes = powi( _k, _n )*_c; //network size
-
- _num_of_switch = _nodes / _c;
- _channels = _num_of_switch * (_r - _c);
- _size = _num_of_switch;
-
-}
-
-void FlatFlyOnChip::_BuildNet( const Configuration &config )
-{
- int _output;
-
- ostringstream router_name;
-
-
- if(gTrace){
-
- cout<<"Setup Finished Router"<<endl;
-
- }
-
- //latency type, noc or conventional network
- bool use_noc_latency;
- use_noc_latency = (config.GetInt("use_noc_latency")==1);
-
- cout << " Flat Bufferfly " << endl;
- cout << " k = " << _k << " n = " << _n << " c = "<<_c<< endl;
- cout << " each switch - total radix = "<< _r << endl;
- cout << " # of switches = "<< _num_of_switch << endl;
- cout << " # of channels = "<< _channels << endl;
- cout << " # of nodes ( size of network ) = " << _nodes << endl;
-
- for ( int node = 0; node < _num_of_switch; ++node ) {
-
- router_name << "router";
- router_name << "_" << node ;
-
- _routers[node] = Router::NewRouter( config, this, router_name.str( ),
- node, _r, _r );
- _timed_modules.push_back(_routers[node]);
-
-
-#ifdef DEBUG_FLATFLY
- cout << " ======== router node : " << node << " ======== " << " router_" << router_name.str() << " router node # : " << node << endl;
-#endif
-
- router_name.str("");
-
- //******************************************************************
- // add inject/eject channels connected to the processor nodes
- //******************************************************************
-
- //as accurately model the length of these channels as possible
- int yleng = -_yrouter/2;
- int xleng = -_xrouter/2;
- bool yodd = _yrouter%2==1;
- bool xodd = _xrouter%2==1;
-
- int y_index = node/(_xcount);
- int x_index = node%(_xcount);
- //estimating distance from client to router
- for (int y = 0; y < _yrouter ; y++) {
- for (int x = 0; x < _xrouter ; x++) {
- //Zero is a naughty number
- if(yleng == 0 && !yodd){
- yleng++;
- }
- if(xleng == 0 && !xodd){
- xleng++;
- }
- int ileng = 1; //at least 1 away
- //measure distance in the y direction
- if(abs(yleng)>1){
- ileng+=(abs(yleng)-1);
- }
- //measure distance in the x direction
- if(abs(xleng)>1){
- ileng+=(abs(xleng)-1);
- }
- //increment for the next client, add Y, if full, reset y add x
- yleng++;
- if(yleng>_yrouter/2){
- yleng= -_yrouter/2;
- xleng++;
- }
- //adopted from the CMESH, the first node has 0,1,8,9 (as an example)
- int link = (_xcount * _xrouter) * (_yrouter * y_index + y) + (_xrouter * x_index + x) ;
-
- if(use_noc_latency){
- _inject[link]->SetLatency(ileng);
- _inject_cred[link]->SetLatency(ileng);
- _eject[link] ->SetLatency(ileng);
- _eject_cred[link]->SetLatency(ileng);
- } else {
- _inject[link]->SetLatency(1);
- _inject_cred[link]->SetLatency(1);
- _eject[link] ->SetLatency(1);
- _eject_cred[link]->SetLatency(1);
- }
- _routers[node]->AddInputChannel( _inject[link], _inject_cred[link] );
-
-#ifdef DEBUG_FLATFLY
- cout << " Adding injection channel " << link << endl;
-#endif
-
- _routers[node]->AddOutputChannel( _eject[link], _eject_cred[link] );
-#ifdef DEBUG_FLATFLY
- cout << " Adding ejection channel " << link << endl;
-#endif
- }
- }
- }
- //******************************************************************
- // add output inter-router channels
- //******************************************************************
-
- //for every router, in every dimension
- for ( int node = 0; node < _num_of_switch; ++node ) {
- for ( int dim = 0; dim < _n; ++dim ) {
-
- //locate itself in every dimension
- int xcurr = node%_k;
- int ycurr = (int)(node/_k);
- int curr3 = node%(_k*_k);
- int curr4 = (int)(node/(_k*_k));
- int curr5 = (int)(node/(_k*_k*_k));//mmm didn't mean to be racist
- int curr6 = (node%(_k*_k*_k));//mmm didn't mean to be racist
-
- //for every other router in the dimension
- for ( int cnt = 0; cnt < (_k ); ++cnt ) {
- int other=0; //the other router that we are trying to connect
- int offset = 0; //silly ness when node< other or when node>other
- //if xdimension
- if(dim == 0){
- other = ycurr * _k +cnt;
- } else if (dim ==1){
- other = cnt * _k + xcurr;
- if(_n==3){
- other+= curr4*_k*_k;
- }
- if(_n==4){
- curr4=((int)(node/(_k*_k)))%_k;
- other+= curr4*_k*_k+curr5*_k*_k*_k;
- }
- }else if (dim ==2){
- other = cnt*_k*_k + curr3;
- if(_n==4){
- other+= curr5*_k*_k*_k;
- }
- }else if (dim ==3){
- other = cnt*_k*_k*_k+curr6;
- }
- assert(dim < 4);
- if(other == node){
-#ifdef DEBUG_FLATFLY
- cout << "ignore channel : " << _output << " to node " << node <<" and "<<other<<endl;
-#endif
- continue;
- }
- //calculate channel length
- int length = 0;
- int oned = abs((node%_xcount)-(other%_xcount));
- int twod = abs(node/_xcount-other/_xcount);
- length = _xrouter*oned + _yrouter *twod;
- //oh the node<other silly ness
- if(node<other){
- offset = -1;
- }
- //node, dimension, router within dimension. Good luck understanding this
- _output = (_k-1) * _n * node + (_k-1) * dim + cnt+offset;
-
-
-#ifdef DEBUG_FLATFLY
- cout << "Adding channel : " << _output << " to node " << node <<" and "<<other<<" with length "<<length<<endl;
-#endif
- if(use_noc_latency){
- _chan[_output]->SetLatency(length);
- _chan_cred[_output]->SetLatency(length);
- } else {
- _chan[_output]->SetLatency(1);
- _chan_cred[_output]->SetLatency(1);
- }
- _routers[node]->AddOutputChannel( _chan[_output], _chan_cred[_output] );
-
- _routers[other]->AddInputChannel( _chan[_output], _chan_cred[_output]);
-
- if(gTrace){
- cout<<"Link "<<_output<<" "<<node<<" "<<other<<" "<<length<<endl;
- }
-
- }
- }
- }
- if(gTrace){
- cout<<"Setup Finished Link"<<endl;
- }
-}
-
-
-int FlatFlyOnChip::GetN( ) const
-{
- return _n;
-}
-
-int FlatFlyOnChip::GetK( ) const
-{
- return _k;
-}
-
-void FlatFlyOnChip::InsertRandomFaults( const Configuration &config )
-{
-
-}
-
-double FlatFlyOnChip::Capacity( ) const
-{
- return (double)_k / 8.0;
-}
-
-
-void FlatFlyOnChip::RegisterRoutingFunctions(){
-
-
- gRoutingFunctionMap["ran_min_flatfly"] = &min_flatfly;
- gRoutingFunctionMap["adaptive_xyyx_flatfly"] = &adaptive_xyyx_flatfly;
- gRoutingFunctionMap["xyyx_flatfly"] = &xyyx_flatfly;
- gRoutingFunctionMap["valiant_flatfly"] = &valiant_flatfly;
- gRoutingFunctionMap["ugal_flatfly"] = &ugal_flatfly_onchip;
- gRoutingFunctionMap["ugal_pni_flatfly"] = &ugal_pni_flatfly_onchip;
- gRoutingFunctionMap["ugal_xyyx_flatfly"] = &ugal_xyyx_flatfly_onchip;
-
-}
-
-//The initial XY or YX minimal routing direction is chosen adaptively
-void adaptive_xyyx_flatfly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = flatfly_transformation(f->dest);
- int targetr = (int)(dest/gC);
-
- if(targetr==r->GetID()){ //if we are at the final router, yay, output to client
- out_port = dest % gC;
-
- } else {
-
- //each class must have at least 2 vcs assigned or else xy_yx will deadlock
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- int out_port_xy = flatfly_outport(dest, r->GetID());
- int out_port_yx = flatfly_outport_yx(dest, r->GetID());
-
- // Route order (XY or YX) determined when packet is injected
- // into the network, adaptively
- bool x_then_y;
- if(in_channel < gC){
- int credit_xy = r->GetUsedCredit(out_port_xy);
- int credit_yx = r->GetUsedCredit(out_port_yx);
- if(credit_xy > credit_yx) {
- x_then_y = false;
- } else if(credit_xy < credit_yx) {
- x_then_y = true;
- } else {
- x_then_y = (RandomInt(1) > 0);
- }
- } else {
- x_then_y = (f->vc < (vcBegin + available_vcs));
- }
-
- if(x_then_y) {
- out_port = out_port_xy;
- vcEnd -= available_vcs;
- } else {
- out_port = out_port_yx;
- vcBegin += available_vcs;
- }
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-//The initial XY or YX minimal routing direction is chosen randomly
-void xyyx_flatfly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = flatfly_transformation(f->dest);
- int targetr = (int)(dest/gC);
-
- if(targetr==r->GetID()){ //if we are at the final router, yay, output to client
- out_port = dest % gC;
-
- } else {
-
- //each class must have at least 2 vcs assigned or else xy_yx will deadlock
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- // randomly select dimension order at first hop
- bool x_then_y = ((in_channel < gC) ?
- (RandomInt(1) > 0) :
- (f->vc < (vcBegin + available_vcs)));
-
- if(x_then_y) {
- out_port = flatfly_outport(dest, r->GetID());
- vcEnd -= available_vcs;
- } else {
- out_port = flatfly_outport_yx(dest, r->GetID());
- vcBegin += available_vcs;
- }
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-int flatfly_outport_yx(int dest, int rID) {
- int dest_rID = (int) (dest / gC);
- int _dim = gN;
- int output = -1, dID, sID;
-
- if(dest_rID==rID){
- return dest % gC;
- }
-
- for (int d=_dim-1;d >= 0; d--) {
- int power = powi(gK,d);
- dID = int(dest_rID / power);
- sID = int(rID / power);
- if ( dID != sID ) {
- output = gC + ((gK-1)*d) - 1;
- if (dID > sID) {
- output += dID;
- } else {
- output += dID + 1;
- }
- return output;
- }
- dest_rID = (int) (dest_rID %power);
- rID = (int) (rID %power);
- }
- if (output == -1) {
- cout << " ERROR ---- FLATFLY_OUTPORT function : output not found yx" << endl;
- exit(-1);
- }
- return -1;
-}
-
-void valiant_flatfly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- if ( in_channel < gC ){
- f->ph = 0;
- f->intm = RandomInt( powi( gK, gN )*gC-1);
- }
-
- int intm = flatfly_transformation(f->intm);
- int dest = flatfly_transformation(f->dest);
-
- if((int)(intm/gC) == r->GetID() || (int)(dest/gC)== r->GetID()){
- f->ph = 1;
- }
-
- if(f->ph == 0) {
- out_port = flatfly_outport(intm, r->GetID());
- } else {
- assert(f->ph == 1);
- out_port = flatfly_outport(dest, r->GetID());
- }
-
- if((int)(dest/gC) != r->GetID()) {
-
- //each class must have at least 2 vcs assigned or else valiant valiant will deadlock
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- if(f->ph == 0) {
- vcEnd -= available_vcs;
- } else {
- // If routing to final destination use the second half of the VCs.
- assert(f->ph == 1);
- vcBegin += available_vcs;
- }
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-void min_flatfly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = flatfly_transformation(f->dest);
- int targetr= (int)(dest/gC);
- //int xdest = ((int)(dest/gC)) % gK;
- //int xcurr = ((r->GetID())) % gK;
-
- //int ydest = ((int)(dest/gC)) / gK;
- //int ycurr = ((r->GetID())) / gK;
-
- if(targetr==r->GetID()){ //if we are at the final router, yay, output to client
- out_port = dest % gC;
- } else{ //else select a dimension at random
- out_port = flatfly_outport(dest, r->GetID());
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-//=============================================================^M
-// route UGAL in the flattened butterfly
-//=============================================================^M
-
-
-//same as ugal except uses xyyx routing
-void ugal_xyyx_flatfly_onchip( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = flatfly_transformation(f->dest);
-
- int rID = r->GetID();
- int _concentration = gC;
- int found;
- int debug = 0;
- int tmp_out_port, _ran_intm;
- int _min_hop, _nonmin_hop, _min_queucnt, _nonmin_queucnt;
- int threshold = 2;
-
-
- if ( in_channel < gC ){
- if(gTrace){
- cout<<"New Flit "<<f->src<<endl;
- }
- f->ph = 0;
- }
-
- if(gTrace){
- int load = 0;
- cout<<"Router "<<rID<<endl;
- cout<<"Input Channel "<<in_channel<<endl;
- //need to modify router to report the buffere depth
- load +=r->GetBufferOccupancy(in_channel);
- cout<<"Rload "<<load<<endl;
- }
-
- if (debug){
- cout << " FLIT ID: " << f->id << " Router: " << rID << " routing from src : " << f->src << " to dest : " << dest << " f->ph: " <<f->ph << " intm: " << f->intm << endl;
- }
- // f->ph == 0 ==> make initial global adaptive decision
- // f->ph == 1 ==> route nonminimaly to random intermediate node
- // f->ph == 2 ==> route minimally to destination
-
- found = 0;
-
- if (f->ph == 1){
- dest = f->intm;
- }
-
- if (dest >= rID*_concentration && dest < (rID+1)*_concentration) {
- if (f->ph == 1) {
- f->ph = 2;
- dest = flatfly_transformation(f->dest);
- if (debug) cout << " done routing to intermediate ";
- }
- else {
- found = 1;
- out_port = dest % gC;
- if (debug) cout << " final routing to destination ";
- }
- }
-
- if (!found) {
-
- int const xy_available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(xy_available_vcs > 0);
-
- // randomly select dimension order at first hop
- bool x_then_y = ((in_channel < gC) ?
- (RandomInt(1) > 0) :
- (f->vc < (vcBegin + xy_available_vcs)));
-
- if (f->ph == 0) {
- //find the min port and min distance
- _min_hop = find_distance(flatfly_transformation(f->src),dest);
- if(x_then_y){
- tmp_out_port = flatfly_outport(dest, rID);
- } else {
- tmp_out_port = flatfly_outport_yx(dest, rID);
- }
- if (f->watch){
- cout << " MIN tmp_out_port: " << tmp_out_port;
- }
- //sum over all vcs of that port
- _min_queucnt = r->GetUsedCredit(tmp_out_port);
-
- //find the nonmin router, nonmin port, nonmin count
- _ran_intm = find_ran_intm(flatfly_transformation(f->src), dest);
- _nonmin_hop = find_distance(flatfly_transformation(f->src),_ran_intm) + find_distance(_ran_intm, dest);
- if(x_then_y){
- tmp_out_port = flatfly_outport(_ran_intm, rID);
- } else {
- tmp_out_port = flatfly_outport_yx(_ran_intm, rID);
- }
-
- if (f->watch){
- cout << " NONMIN tmp_out_port: " << tmp_out_port << endl;
- }
- if (_ran_intm >= rID*_concentration && _ran_intm < (rID+1)*_concentration) {
- _nonmin_queucnt = numeric_limits<int>::max();
- } else {
- _nonmin_queucnt = r->GetUsedCredit(tmp_out_port);
- }
-
- if (debug){
- cout << " _min_hop " << _min_hop << " _min_queucnt: " <<_min_queucnt << " _nonmin_hop: " << _nonmin_hop << " _nonmin_queucnt :" << _nonmin_queucnt << endl;
- }
-
- if (_min_hop * _min_queucnt <= _nonmin_hop * _nonmin_queucnt +threshold) {
-
- if (debug) cout << " Route MINIMALLY " << endl;
- f->ph = 2;
- } else {
- // route non-minimally
- if (debug) { cout << " Route NONMINIMALLY int node: " <<_ran_intm << endl; }
- f->ph = 1;
- f->intm = _ran_intm;
- dest = f->intm;
- if (dest >= rID*_concentration && dest < (rID+1)*_concentration) {
- f->ph = 2;
- dest = flatfly_transformation(f->dest);
- }
- }
- }
-
- //dest here should be == intm if ph==1, or dest == dest if ph == 2
- if(x_then_y){
- out_port = flatfly_outport(dest, rID);
- if(out_port >= gC) {
- vcEnd -= xy_available_vcs;
- }
- } else {
- out_port = flatfly_outport_yx(dest, rID);
- if(out_port >= gC) {
- vcBegin += xy_available_vcs;
- }
- }
-
- // if we haven't reached our destination, restrict VCs appropriately to avoid routing deadlock
- if(out_port >= gC) {
-
- int const ph_available_vcs = xy_available_vcs / 2;
- assert(ph_available_vcs > 0);
-
- if(f->ph == 1) {
- vcEnd -= ph_available_vcs;
- } else {
- assert(f->ph == 2);
- vcBegin += ph_available_vcs;
- }
- }
-
- found = 1;
- }
-
- if (!found) {
- cout << " ERROR: output not found in routing. " << endl;
- cout << *f; exit (-1);
- }
-
- if (out_port >= gN*(gK-1) + gC) {
- cout << " ERROR: output port too big! " << endl;
- cout << " OUTPUT select: " << out_port << endl;
- cout << " router radix: " << gN*(gK-1) + gK << endl;
- exit (-1);
- }
-
- if (debug) cout << " through output port : " << out_port << endl;
- if(gTrace){cout<<"Outport "<<out_port<<endl;cout<<"Stop Mark"<<endl;}
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-
-
-//ugal now uses modified comparison, modefied getcredit
-void ugal_flatfly_onchip( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = flatfly_transformation(f->dest);
-
- int rID = r->GetID();
- int _concentration = gC;
- int found;
- int debug = 0;
- int tmp_out_port, _ran_intm;
- int _min_hop, _nonmin_hop, _min_queucnt, _nonmin_queucnt;
- int threshold = 2;
-
- if ( in_channel < gC ){
- if(gTrace){
- cout<<"New Flit "<<f->src<<endl;
- }
- f->ph = 0;
- }
-
- if(gTrace){
- int load = 0;
- cout<<"Router "<<rID<<endl;
- cout<<"Input Channel "<<in_channel<<endl;
- //need to modify router to report the buffere depth
- load +=r->GetBufferOccupancy(in_channel);
- cout<<"Rload "<<load<<endl;
- }
-
- if (debug){
- cout << " FLIT ID: " << f->id << " Router: " << rID << " routing from src : " << f->src << " to dest : " << dest << " f->ph: " <<f->ph << " intm: " << f->intm << endl;
- }
- // f->ph == 0 ==> make initial global adaptive decision
- // f->ph == 1 ==> route nonminimaly to random intermediate node
- // f->ph == 2 ==> route minimally to destination
-
- found = 0;
-
- if (f->ph == 1){
- dest = f->intm;
- }
-
-
- if (dest >= rID*_concentration && dest < (rID+1)*_concentration) {
-
- if (f->ph == 1) {
- f->ph = 2;
- dest = flatfly_transformation(f->dest);
- if (debug) cout << " done routing to intermediate ";
- }
- else {
- found = 1;
- out_port = dest % gC;
- if (debug) cout << " final routing to destination ";
- }
- }
-
- if (!found) {
-
- if (f->ph == 0) {
- _min_hop = find_distance(flatfly_transformation(f->src),dest);
- _ran_intm = find_ran_intm(flatfly_transformation(f->src), dest);
- tmp_out_port = flatfly_outport(dest, rID);
- if (f->watch){
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << " MIN tmp_out_port: " << tmp_out_port;
- }
-
- _min_queucnt = r->GetUsedCredit(tmp_out_port);
-
- _nonmin_hop = find_distance(flatfly_transformation(f->src),_ran_intm) + find_distance(_ran_intm, dest);
- tmp_out_port = flatfly_outport(_ran_intm, rID);
-
- if (f->watch){
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << " NONMIN tmp_out_port: " << tmp_out_port << endl;
- }
- if (_ran_intm >= rID*_concentration && _ran_intm < (rID+1)*_concentration) {
- _nonmin_queucnt = numeric_limits<int>::max();
- } else {
- _nonmin_queucnt = r->GetUsedCredit(tmp_out_port);
- }
-
- if (debug){
- cout << " _min_hop " << _min_hop << " _min_queucnt: " <<_min_queucnt << " _nonmin_hop: " << _nonmin_hop << " _nonmin_queucnt :" << _nonmin_queucnt << endl;
- }
-
- if (_min_hop * _min_queucnt <= _nonmin_hop * _nonmin_queucnt +threshold) {
-
- if (debug) cout << " Route MINIMALLY " << endl;
- f->ph = 2;
- } else {
- // route non-minimally
- if (debug) { cout << " Route NONMINIMALLY int node: " <<_ran_intm << endl; }
- f->ph = 1;
- f->intm = _ran_intm;
- dest = f->intm;
- if (dest >= rID*_concentration && dest < (rID+1)*_concentration) {
- f->ph = 2;
- dest = flatfly_transformation(f->dest);
- }
- }
- }
-
- // find minimal correct dimension to route through
- out_port = flatfly_outport(dest, rID);
-
- // if we haven't reached our destination, restrict VCs appropriately to avoid routing deadlock
- if(out_port >= gC) {
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
- if(f->ph == 1) {
- vcEnd -= available_vcs;
- } else {
- assert(f->ph == 2);
- vcBegin += available_vcs;
- }
- }
-
- found = 1;
- }
-
- if (!found) {
- cout << " ERROR: output not found in routing. " << endl;
- cout << *f; exit (-1);
- }
-
- if (out_port >= gN*(gK-1) + gC) {
- cout << " ERROR: output port too big! " << endl;
- cout << " OUTPUT select: " << out_port << endl;
- cout << " router radix: " << gN*(gK-1) + gK << endl;
- exit (-1);
- }
-
- if (debug) cout << " through output port : " << out_port << endl;
- if(gTrace) {
- cout<<"Outport "<<out_port<<endl;
- cout<<"Stop Mark"<<endl;
- }
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-
-// partially non-interfering (i.e., packets ordered by hash of destination) UGAL
-void ugal_pni_flatfly_onchip( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = flatfly_transformation(f->dest);
-
- int rID = r->GetID();
- int _concentration = gC;
- int found;
- int debug = 0;
- int tmp_out_port, _ran_intm;
- int _min_hop, _nonmin_hop, _min_queucnt, _nonmin_queucnt;
- int threshold = 2;
-
- if ( in_channel < gC ){
- if(gTrace){
- cout<<"New Flit "<<f->src<<endl;
- }
- f->ph = 0;
- }
-
- if(gTrace){
- int load = 0;
- cout<<"Router "<<rID<<endl;
- cout<<"Input Channel "<<in_channel<<endl;
- //need to modify router to report the buffere depth
- load +=r->GetBufferOccupancy(in_channel);
- cout<<"Rload "<<load<<endl;
- }
-
- if (debug){
- cout << " FLIT ID: " << f->id << " Router: " << rID << " routing from src : " << f->src << " to dest : " << dest << " f->ph: " <<f->ph << " intm: " << f->intm << endl;
- }
- // f->ph == 0 ==> make initial global adaptive decision
- // f->ph == 1 ==> route nonminimaly to random intermediate node
- // f->ph == 2 ==> route minimally to destination
-
- found = 0;
-
- if (f->ph == 1){
- dest = f->intm;
- }
-
-
- if (dest >= rID*_concentration && dest < (rID+1)*_concentration) {
-
- if (f->ph == 1) {
- f->ph = 2;
- dest = flatfly_transformation(f->dest);
- if (debug) cout << " done routing to intermediate ";
- }
- else {
- found = 1;
- out_port = dest % gC;
- if (debug) cout << " final routing to destination ";
- }
- }
-
- if (!found) {
-
- if (f->ph == 0) {
- _min_hop = find_distance(flatfly_transformation(f->src),dest);
- _ran_intm = find_ran_intm(flatfly_transformation(f->src), dest);
- tmp_out_port = flatfly_outport(dest, rID);
- if (f->watch){
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << " MIN tmp_out_port: " << tmp_out_port;
- }
-
- _min_queucnt = r->GetUsedCredit(tmp_out_port);
-
- _nonmin_hop = find_distance(flatfly_transformation(f->src),_ran_intm) + find_distance(_ran_intm, dest);
- tmp_out_port = flatfly_outport(_ran_intm, rID);
-
- if (f->watch){
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << " NONMIN tmp_out_port: " << tmp_out_port << endl;
- }
- if (_ran_intm >= rID*_concentration && _ran_intm < (rID+1)*_concentration) {
- _nonmin_queucnt = numeric_limits<int>::max();
- } else {
- _nonmin_queucnt = r->GetUsedCredit(tmp_out_port);
- }
-
- if (debug){
- cout << " _min_hop " << _min_hop << " _min_queucnt: " <<_min_queucnt << " _nonmin_hop: " << _nonmin_hop << " _nonmin_queucnt :" << _nonmin_queucnt << endl;
- }
-
- if (_min_hop * _min_queucnt <= _nonmin_hop * _nonmin_queucnt +threshold) {
-
- if (debug) cout << " Route MINIMALLY " << endl;
- f->ph = 2;
- } else {
- // route non-minimally
- if (debug) { cout << " Route NONMINIMALLY int node: " <<_ran_intm << endl; }
- f->ph = 1;
- f->intm = _ran_intm;
- dest = f->intm;
- if (dest >= rID*_concentration && dest < (rID+1)*_concentration) {
- f->ph = 2;
- dest = flatfly_transformation(f->dest);
- }
- }
- }
-
- // find minimal correct dimension to route through
- out_port = flatfly_outport(dest, rID);
-
- // if we haven't reached our destination, restrict VCs appropriately to avoid routing deadlock
- if(out_port >= gC) {
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
- if(f->ph == 1) {
- vcEnd -= available_vcs;
- } else {
- assert(f->ph == 2);
- vcBegin += available_vcs;
- }
- }
-
- found = 1;
- }
-
- if (!found) {
- cout << " ERROR: output not found in routing. " << endl;
- cout << *f; exit (-1);
- }
-
- if (out_port >= gN*(gK-1) + gC) {
- cout << " ERROR: output port too big! " << endl;
- cout << " OUTPUT select: " << out_port << endl;
- cout << " router radix: " << gN*(gK-1) + gK << endl;
- exit (-1);
- }
-
- if (debug) cout << " through output port : " << out_port << endl;
- if(gTrace) {
- cout<<"Outport "<<out_port<<endl;
- cout<<"Stop Mark"<<endl;
- }
- }
-
- if(inject || (out_port >= gC)) {
-
- // NOTE: for "proper" flattened butterfly configurations (i.e., ones
- // derived from flattening an actual butterfly), gK and gC are the same!
- assert(gK == gC);
-
- assert(inject ? (f->ph == -1) : (f->ph == 1 || f->ph == 2));
-
- int next_coord = flatfly_transformation(f->dest);
- if(inject) {
- next_coord /= gC;
- next_coord %= gK;
- } else {
- int next_dim = (out_port - gC) / (gK - 1) + 1;
- if(next_dim == gN) {
- next_coord %= gC;
- } else {
- next_coord /= gC;
- for(int d = 0; d < next_dim; ++d) {
- next_coord /= gK;
- }
- next_coord %= gK;
- }
- }
- assert(next_coord >= 0 && next_coord < gK);
- int vcs_per_dest = (vcEnd - vcBegin + 1) / gK;
- assert(vcs_per_dest > 0);
- vcBegin += next_coord * vcs_per_dest;
- vcEnd = vcBegin + vcs_per_dest - 1;
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-
-//=============================================================^M
-// UGAL : calculate distance (hop cnt) between src and destination
-//=============================================================^M
-int find_distance (int src, int dest) {
- int dist = 0;
- int _dim = gN;
- int _dim_size;
-
- int src_tmp= (int) src / gC;
- int dest_tmp = (int) dest / gC;
- int src_id, dest_id;
-
- // cout << " HOP CNT between src: " << src << " dest: " << dest;
- for (int d=0;d < _dim; d++) {
- _dim_size = powi(gK, d )*gC;
- //if ((int)(src / _dim_size) != (int)(dest / _dim_size))
- // dist++;
- src_id = src_tmp % gK;
- dest_id = dest_tmp % gK;
- if (src_id != dest_id)
- dist++;
- src_tmp = (int) (src_tmp / gK);
- dest_tmp = (int) (dest_tmp / gK);
- }
-
- // cout << " : " << dist << endl;
-
- return dist;
-}
-
-//=============================================================^M
-// UGAL : find random node for load balancing
-//=============================================================^M
-int find_ran_intm (int src, int dest) {
- int _dim = gN;
- int _dim_size;
- int _ran_dest = 0;
- int debug = 0;
-
- if (debug)
- cout << " INTM node for src: " << src << " dest: " <<dest << endl;
-
- src = (int) (src / gC);
- dest = (int) (dest / gC);
-
- _ran_dest = RandomInt(gC - 1);
- if (debug) cout << " ............ _ran_dest : " << _ran_dest << endl;
- for (int d=0;d < _dim; d++) {
-
- _dim_size = powi(gK, d)*gC;
- if ((src % gK) == (dest % gK)) {
- _ran_dest += (src % gK) * _dim_size;
- if (debug)
- cout << " share same dimension : " << d << " int node : " << _ran_dest << " src ID : " << src % gK << endl;
- } else {
- // src and dest are in the same dimension "d" + 1
- // ==> thus generate a random destination within
- _ran_dest += RandomInt(gK - 1) * _dim_size;
- if (debug)
- cout << " different dimension : " << d << " int node : " << _ran_dest << " _dim_size: " << _dim_size << endl;
- }
- src = (int) (src / gK);
- dest = (int) (dest / gK);
- }
-
- if (debug) cout << " intermediate destination NODE: " << _ran_dest << endl;
- return _ran_dest;
-}
-
-
-
-//=============================================================
-// UGAL : calculated minimum distance output port for flatfly
-// given the dimension and destination
-//=============================================================
-// starting from DIM 0 (x first)
-int flatfly_outport(int dest, int rID) {
- int dest_rID = (int) (dest / gC);
- int _dim = gN;
- int output = -1, dID, sID;
-
- if(dest_rID==rID){
- return dest % gC;
- }
-
-
- for (int d=0;d < _dim; d++) {
- dID = (dest_rID % gK);
- sID = (rID % gK);
- if ( dID != sID ) {
- output = gC + ((gK-1)*d) - 1;
- if (dID > sID) {
-
- output += dID;
- } else {
- output += dID + 1;
- }
-
- return output;
- }
- dest_rID = (int) (dest_rID / gK);
- rID = (int) (rID / gK);
- }
- if (output == -1) {
- cout << " ERROR ---- FLATFLY_OUTPORT function : output not found " << endl;
- exit(-1);
- }
- return -1;
-}
-
-int flatfly_transformation(int dest){
- //the magic of destination transformation
-
- //destination transformation, translate how the nodes are actually arranged
- //to the easier way of routing
- //this transformation only support 64 nodes
-
- //cout<<"ORiginal destination "<<dest<<endl;
- //router in the x direction = find which column, and then mod by cY to find
- //which horizontal router
- int horizontal = (dest%(_xcount*_xrouter))/(_xrouter);
- int horizontal_rem = (dest%(_xcount*_xrouter))%(_xrouter);
- //router in the y direction = find which row, and then divided by cX to find
- //vertical router
- int vertical = (dest/(_xcount*_xrouter))/(_yrouter);
- int vertical_rem = (dest/(_xcount*_xrouter))%(_yrouter);
- //transform the destination to as if node0 was 0,1,2,3 and so forth
- dest = (vertical*_xcount + horizontal)*gC+_xrouter*vertical_rem+horizontal_rem;
- //cout<<"Transformed destination "<<dest<<endl<<endl;
- return dest;
-}
diff --git a/src/intersim2/.svn/pristine/0a/0a776321c5f55776af796ce2c5543f562d751c17.svn-base b/src/intersim2/.svn/pristine/0a/0a776321c5f55776af796ce2c5543f562d751c17.svn-base
deleted file mode 100644
index 9f8df51..0000000
--- a/src/intersim2/.svn/pristine/0a/0a776321c5f55776af796ce2c5543f562d751c17.svn-base
+++ /dev/null
@@ -1,270 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-////////////////////////////////////////////////////////////////////////
-//
-// FatTree
-//
-// Each level of the hierarchical indirect Network has
-// k^(n-1) Routers. The Routers are organized such that
-// each node has k descendents, and each parent is
-// replicated k times.
-// most routers has 2K ports, excep the top level has only K
-////////////////////////////////////////////////////////////////////////
-//
-// RCS Information:
-// $Author: jbalfour $
-// $Date: 2007/06/26 22:50:48 $
-// $Id$
-//
-////////////////////////////////////////////////////////////////////////
-
-
-#include "booksim.hpp"
-#include <vector>
-#include <sstream>
-#include <cmath>
-
-#include "fattree.hpp"
-#include "misc_utils.hpp"
-
-
- //#define FATTREE_DEBUG
-
-FatTree::FatTree( const Configuration& config,const string & name )
- : Network( config ,name)
-{
-
-
- _ComputeSize( config );
- _Alloc( );
- _BuildNet( config );
-
-}
-
-void FatTree::_ComputeSize( const Configuration& config )
-{
-
- _k = config.GetInt( "k" );
- _n = config.GetInt( "n" );
-
- gK = _k; gN = _n;
-
- _nodes = powi( _k, _n );
-
- //levels * routers_per_level
- _size = _n * powi( _k , _n - 1 );
-
- //(channels per level = k*routers_per_level* up/down) * (levels-1)
- _channels = (2*_k * powi( _k , _n-1 ))*(_n-1);
-
-
-}
-
-
-void FatTree::RegisterRoutingFunctions() {
-
-}
-
-void FatTree::_BuildNet( const Configuration& config )
-{
- cout << "Fat Tree" << endl;
- cout << " k = " << _k << " levels = " << _n << endl;
- cout << " each switch - total radix = "<< 2*_k << endl;
- cout << " # of switches = "<< _size << endl;
- cout << " # of channels = "<< _channels << endl;
- cout << " # of nodes ( size of network ) = " << _nodes << endl;
-
-
- // Number of router positions at each depth of the network
- const int nPos = powi( _k, _n-1);
-
- //
- // Allocate Routers
- //
- ostringstream name;
- int level, pos, id, degree, port;
- for ( level = 0 ; level < _n ; ++level ) {
- for ( pos = 0 ; pos < nPos ; ++pos ) {
-
- if ( level == 0 ) //top routers is zero
- degree = _k;
- else
- degree = 2 * _k;
-
- id = level * nPos + pos;
-
- name.str("");
- name << "router_level" << level << "_" << pos;
- Router * r = Router::NewRouter( config, this, name.str( ), id,
- degree, degree );
- _Router( level, pos ) = r;
- _timed_modules.push_back(r);
- }
- }
-
- //
- // Connect Channels to Routers
- //
-
- //
- // Router Connection Rule: Output Ports <gK Move DOWN Network
- // Output Ports >=gK Move UP Network
- // Input Ports <gK from DOWN Network
- // Input Ports >=gK from up Network
-
- // Connecting Injection & Ejection Channels
- for ( pos = 0 ; pos < nPos ; ++pos ) {
- for(int index = 0; index<_k; index++){
- int link = pos*_k + index;
- _Router( _n-1, pos)->AddInputChannel( _inject[link],
- _inject_cred[link]);
- _Router( _n-1, pos)->AddOutputChannel( _eject[link],
- _eject_cred[link]);
- _inject[link]->SetLatency( 1 );
- _inject_cred[link]->SetLatency( 1 );
- _eject[link]->SetLatency( 1 );
- _eject_cred[link]->SetLatency( 1 );
- }
- }
-
-#ifdef FATTREE_DEBUG
- cout<<"\nAssigning output\n";
-#endif
-
- //channels are numbered sequentially from an output channel perspective
- int chan_per_direction = (_k * powi( _k , _n-1 )); //up or down
- int chan_per_level = 2*(_k * powi( _k , _n-1 )); //up+down
-
- //connect all down output channels
- //level n-1's down channel are injection channels
- for (level = 0; level<_n-1; level++){
- for ( pos = 0; pos < nPos; ++pos ) {
- for ( port = 0; port < _k; ++port ) {
- int link = (level*chan_per_level) + pos*_k + port;
- _Router(level, pos)->AddOutputChannel( _chan[link],
- _chan_cred[link] );
- _chan[link]->SetLatency( 1 );
- _chan_cred[link]->SetLatency( 1 );
-#ifdef FATTREE_DEBUG
- cout<<_Router(level, pos)->Name()<<" "
- <<"down output "<<port<<" "
- <<"channel_id "<<link<<endl;
-#endif
-
- }
- }
- }
- //connect all up output channels
- //level 0 has no up chnanels
- for (level = 1; level<_n; level++){
- for ( pos = 0; pos < nPos; ++pos ) {
- for ( port = 0; port < _k; ++port ) {
- int link = (level*chan_per_level - chan_per_direction) + pos*_k + port ;
- _Router(level, pos)->AddOutputChannel( _chan[link],
- _chan_cred[link] );
- _chan[link]->SetLatency( 1 );
- _chan_cred[link]->SetLatency( 1 );
-#ifdef FATTREE_DEBUG
- cout<<_Router(level, pos)->Name()<<" "
- <<"up output "<<port<<" "
- <<"channel_id "<<link<<endl;
-#endif
- }
- }
- }
-
-#ifdef FATTREE_DEBUG
- cout<<"\nAssigning Input\n";
-#endif
-
- //connect all down input channels
- for (level = 0; level<_n-1; level++){
- //input channel are numbered interleavely, the interleaev depends on level
- int routers_per_neighborhood = powi(_k,_n-1-(level));
- int routers_per_branch = powi(_k,_n-1-(level+1));
- int level_offset = routers_per_neighborhood*_k;
- for ( pos = 0; pos < nPos; ++pos ) {
- int neighborhood = pos/routers_per_neighborhood;
- int neighborhood_pos = pos%routers_per_neighborhood;
- for ( port = 0; port < _k; ++port ) {
- int link =
- ((level+1)*chan_per_level - chan_per_direction) //which levellevel
- +neighborhood*level_offset //region in level
- +port*routers_per_branch*gK //sub region in region
- +(neighborhood_pos)%routers_per_branch*gK //router in subregion
- +(neighborhood_pos)/routers_per_branch; //port on router
-
- _Router(level, pos)->AddInputChannel( _chan[link],
- _chan_cred[link] );
-#ifdef FATTREE_DEBUG
- cout<<_Router(level, pos)->Name()<<" "
- <<"down input "<<port<<" "
- <<"channel_id "<<link<<endl;
-#endif
- }
- }
- }
-
-
- //connect all up input channels
- for (level = 1; level<_n; level++){
- //input channel are numbered interleavely, the interleaev depends on level
- int routers_per_neighborhood = powi(_k,_n-1-(level-1));
- int routers_per_branch = powi(_k,_n-1-(level));
- int level_offset = routers_per_neighborhood*_k;
- for ( pos = 0; pos < nPos; ++pos ) {
- int neighborhood = pos/routers_per_neighborhood;
- int neighborhood_pos = pos%routers_per_neighborhood;
- for ( port = 0; port < _k; ++port ) {
- int link =
- ((level-1)*chan_per_level) //which levellevel
- +neighborhood*level_offset //region in level
- +port*routers_per_branch*gK //sub region in region
- +(neighborhood_pos)%routers_per_branch*gK //router in subregion
- +(neighborhood_pos)/routers_per_branch; //port on router
-
- _Router(level, pos)->AddInputChannel( _chan[link],
- _chan_cred[link] );
-#ifdef FATTREE_DEBUG
- cout<<_Router(level, pos)->Name()<<" "
- <<"up input "<<port<<" "
- <<"channel_id "<<link<<endl;
-#endif
- }
- }
- }
-#ifdef FATTREE_DEBUG
- cout<<"\nChannel assigned\n";
-#endif
-}
-
-Router*& FatTree::_Router( int depth, int pos )
-{
- assert( depth < _n && pos < powi( _k, _n-1) );
- return _routers[depth * powi( _k, _n-1) + pos];
-}
diff --git a/src/intersim2/.svn/pristine/0b/0b0c41499a28f0b7c2fccd583db339989d665677.svn-base b/src/intersim2/.svn/pristine/0b/0b0c41499a28f0b7c2fccd583db339989d665677.svn-base
deleted file mode 100644
index 1f15857..0000000
--- a/src/intersim2/.svn/pristine/0b/0b0c41499a28f0b7c2fccd583db339989d665677.svn-base
+++ /dev/null
@@ -1,155 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*router.cpp
- *
- *The base class of either iq router or event router
- *contains a list of channels and other router configuration variables
- *
- *The older version of the simulator uses an array of flits and credit to
- *simulate the channels. Newer version ueses flitchannel and credit channel
- *which can better model channel delay
- *
- *The older version of the simulator also uses vc_router and chaos router
- *which are replaced by iq rotuer and event router in the present form
- */
-
-#include "booksim.hpp"
-#include <iostream>
-#include <cassert>
-#include "router.hpp"
-
-//////////////////Sub router types//////////////////////
-#include "iq_router.hpp"
-#include "event_router.hpp"
-#include "chaos_router.hpp"
-///////////////////////////////////////////////////////
-
-int const Router::STALL_BUFFER_BUSY = -2;
-int const Router::STALL_BUFFER_CONFLICT = -3;
-int const Router::STALL_BUFFER_FULL = -4;
-int const Router::STALL_BUFFER_RESERVED = -5;
-int const Router::STALL_CROSSBAR_CONFLICT = -6;
-
-Router::Router( const Configuration& config,
- Module *parent, const string & name, int id,
- int inputs, int outputs ) :
-TimedModule( parent, name ), _id( id ), _inputs( inputs ), _outputs( outputs ),
- _partial_internal_cycles(0.0)
-{
- _crossbar_delay = ( config.GetInt( "st_prepare_delay" ) +
- config.GetInt( "st_final_delay" ) );
- _credit_delay = config.GetInt( "credit_delay" );
- _input_speedup = config.GetInt( "input_speedup" );
- _output_speedup = config.GetInt( "output_speedup" );
- _internal_speedup = config.GetFloat( "internal_speedup" );
- _classes = config.GetInt( "classes" );
-
-#ifdef TRACK_FLOWS
- _received_flits.resize(_classes, vector<int>(_inputs, 0));
- _stored_flits.resize(_classes);
- _sent_flits.resize(_classes, vector<int>(_outputs, 0));
- _active_packets.resize(_classes);
- _outstanding_credits.resize(_classes, vector<int>(_outputs, 0));
-#endif
-
-#ifdef TRACK_STALLS
- _buffer_busy_stalls.resize(_classes, 0);
- _buffer_conflict_stalls.resize(_classes, 0);
- _buffer_full_stalls.resize(_classes, 0);
- _buffer_reserved_stalls.resize(_classes, 0);
- _crossbar_conflict_stalls.resize(_classes, 0);
-#endif
-
-}
-
-void Router::AddInputChannel( FlitChannel *channel, CreditChannel *backchannel )
-{
- _input_channels.push_back( channel );
- _input_credits.push_back( backchannel );
- channel->SetSink( this, _input_channels.size() - 1 ) ;
-}
-
-void Router::AddOutputChannel( FlitChannel *channel, CreditChannel *backchannel )
-{
- _output_channels.push_back( channel );
- _output_credits.push_back( backchannel );
- _channel_faults.push_back( false );
- channel->SetSource( this, _output_channels.size() - 1 ) ;
-}
-
-void Router::Evaluate( )
-{
- _partial_internal_cycles += _internal_speedup;
- while( _partial_internal_cycles >= 1.0 ) {
- _InternalStep( );
- _partial_internal_cycles -= 1.0;
- }
-}
-
-void Router::OutChannelFault( int c, bool fault )
-{
- assert( ( c >= 0 ) && ( (size_t)c < _channel_faults.size( ) ) );
-
- _channel_faults[c] = fault;
-}
-
-bool Router::IsFaultyOutput( int c ) const
-{
- assert( ( c >= 0 ) && ( (size_t)c < _channel_faults.size( ) ) );
-
- return _channel_faults[c];
-}
-
-/*Router constructor*/
-Router *Router::NewRouter( const Configuration& config,
- Module *parent, const string & name, int id,
- int inputs, int outputs )
-{
- const string type = config.GetStr( "router" );
- Router *r = NULL;
- if ( type == "iq" ) {
- r = new IQRouter( config, parent, name, id, inputs, outputs );
- } else if ( type == "event" ) {
- r = new EventRouter( config, parent, name, id, inputs, outputs );
- } else if ( type == "chaos" ) {
- r = new ChaosRouter( config, parent, name, id, inputs, outputs );
- } else {
- cerr << "Unknown router type: " << type << endl;
- }
- /*For additional router, add another else if statement*/
- /*Original booksim specifies the router using "flow_control"
- *we now simply call these types.
- */
-
- return r;
-}
-
-
-
-
-
diff --git a/src/intersim2/.svn/pristine/0e/0eae5ca5351f1f31915bc0c3da4a3a1ae19e21c4.svn-base b/src/intersim2/.svn/pristine/0e/0eae5ca5351f1f31915bc0c3da4a3a1ae19e21c4.svn-base
deleted file mode 100644
index 5c54228..0000000
--- a/src/intersim2/.svn/pristine/0e/0eae5ca5351f1f31915bc0c3da4a3a1ae19e21c4.svn-base
+++ /dev/null
@@ -1,57 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _PACKET_REPLY_INFO_HPP_
-#define _PACKET_REPLY_INFO_HPP_
-
-#include <stack>
-
-#include "flit.hpp"
-
-//register the requests to a node
-class PacketReplyInfo {
-
-public:
- int source;
- int time;
- bool record;
- Flit::FlitType type;
-
- static PacketReplyInfo* New();
- void Free();
- static void FreeAll();
-
-private:
-
- static stack<PacketReplyInfo*> _all;
- static stack<PacketReplyInfo*> _free;
-
- PacketReplyInfo() {}
- ~PacketReplyInfo() {}
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/0f/0fa9e6ee8d633c141585cd663a6307195b79db63.svn-base b/src/intersim2/.svn/pristine/0f/0fa9e6ee8d633c141585cd663a6307195b79db63.svn-base
deleted file mode 100644
index a7b540b..0000000
--- a/src/intersim2/.svn/pristine/0f/0fa9e6ee8d633c141585cd663a6307195b79db63.svn-base
+++ /dev/null
@@ -1,532 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "power_module.hpp"
-#include "booksim_config.hpp"
-#include "buffer_monitor.hpp"
-#include "switch_monitor.hpp"
-#include "iq_router.hpp"
-
-Power_Module::Power_Module(Network * n , const Configuration &config)
- : Module( 0, "power_module" ){
-
-
- string pfile = config.GetStr("tech_file");
- PowerConfig pconfig;
- pconfig.ParseFile(pfile);
-
- net = n;
- output_file_name = config.GetStr("power_output_file");
- classes = config.GetInt("classes");
- channel_width = (double)config.GetInt("channel_width");
- channel_sweep = (double)config.GetInt("channel_sweep");
-
- numVC = (double)config.GetInt("num_vcs");
- depthVC = (double)config.GetInt("vc_buf_size");
-
- //////////////////////////////////Constants/////////////////////////////
- //wire length in (mm)
- wire_length = pconfig.GetFloat("wire_length");
- //////////Metal Parameters////////////
- // Wire left/right coupling capacitance [ F/mm ]
- Cw_cpl = pconfig.GetFloat("Cw_cpl");
- // Wire up/down groudn capacitance [ F/mm ]
- Cw_gnd = pconfig.GetFloat("Cw_gnd");
- Cw = 2.0 * Cw_cpl + 2.0 * Cw_gnd ;
- Rw = pconfig.GetFloat("Rw");
- // metal pitch [mm]
- MetalPitch = pconfig.GetFloat("MetalPitch");
-
- //////////Device Parameters////////////
-
- LAMBDA = pconfig.GetFloat("LAMBDA") ; // [um/LAMBDA]
- Cd = pconfig.GetFloat("Cd"); // [F/um] (for Delay)
- Cg = pconfig.GetFloat("Cg"); // [F/um] (for Delay)
- Cgdl = pconfig.GetFloat("Cgdl"); // [F/um] (for Delay)
-
- Cd_pwr = pconfig.GetFloat("Cd_pwr") ; // [F/um] (for Power)
- Cg_pwr = pconfig.GetFloat("Cg_pwr") ; // [F/um] (for Power)
-
- IoffN = pconfig.GetFloat("IoffN"); // [A/um]
- IoffP = pconfig.GetFloat("IoffP"); // [A/um]
- // Leakage from bitlines, two-port cell [A]
- IoffSRAM = pconfig.GetFloat("IoffSRAM");
- // [Ohm] ( D1=1um Inverter)
- R = pconfig.GetFloat("R");
- // [F] ( D1=1um Inverter - for Power )
- Ci_delay = (1.0 + 2.0) * ( Cg + Cgdl );
- // [F] ( D1=1um Inverter - for Power )
- Co_delay = (1.0 + 2.0) * Cd ;
-
-
- Ci = (1.0 + 2.0) * Cg_pwr ;
- Co = (1.0 + 2.0) * Cd_pwr ;
-
- Vdd = pconfig.GetFloat("Vdd");
- FO4 = R * ( 3.0 * Cd + 12 * Cg + 12 * Cgdl);
- tCLK = 20 * FO4;
- fCLK = 1.0 / tCLK;
-
- H_INVD2=(double)pconfig.GetInt("H_INVD2");
- W_INVD2=(double)pconfig.GetInt("W_INVD2") ;
- H_DFQD1=(double)pconfig.GetInt("H_DFQD1");
- W_DFQD1= (double)pconfig.GetInt("W_DFQD1");
- H_ND2D1= (double)pconfig.GetInt("H_ND2D1");
- W_ND2D1=(double)pconfig.GetInt("W_ND2D1");
- H_SRAM=(double)pconfig.GetInt("H_SRAM");
- W_SRAM=(double)pconfig.GetInt("W_SRAM");
-
- ChannelPitch = 2.0 * MetalPitch ;
- CrossbarPitch = 2.0 * MetalPitch ;
-}
-
-Power_Module::~Power_Module(){
-
-
-}
-
-
-//////////////////////////////////////////////
-//Channels
-//////////////////////////////////////////////
-
-void Power_Module::calcChannel(const FlitChannel* f){
- double channelLength = f->GetLatency()* wire_length;
- wire const this_wire = wireOptimize(channelLength);
- double const & K = this_wire.K;
- double const & N = this_wire.N;
- double const & M = this_wire.M;
- //area
- channelArea += areaChannel(K,N,M);
-
- //activity factor;
- const vector<int> temp = f->GetActivity();
- vector<double> a(classes);
- for(int i = 0; i< classes; i++){
-
- a[i] = ((double)temp[i])/totalTime;
- }
-
- //power calculation
- double const bitPower = powerRepeatedWire(channelLength, K,M,N);
-
- channelClkPower += powerWireClk(M,channel_width);
- for(int i = 0; i< classes; i++){
- channelWirePower += bitPower * a[i]*channel_width;
- channelDFFPower += powerWireDFF(M, channel_width, a[i]);
- }
- channelLeakPower+= powerRepeatedWireLeak(K,M,N)*channel_width;
-}
-
-wire const & Power_Module::wireOptimize(double L){
- map<double, wire>::iterator iter = wire_map.find(L);
- if(iter == wire_map.end()){
-
- double W = 64;
- double bestMetric = 100000000 ;
- double bestK = -1;
- double bestM = -1;
- double bestN = -1;
- for (double K = 1.0 ; K < 10 ; K+=0.1 ) {
- for (double N = 1.0 ; N < 40 ; N += 1.0 ) {
- for (double M = 1.0 ; M < 40.0 ; M +=1.0 ) {
- double l = 1.0 * L/( N * M) ;
-
- double k0 = R * (Co_delay + Ci_delay) ;
- double k1 = R/K * Cw + K * Rw * Ci_delay ;
- double k2 = 0.5 * Rw * Cw ;
- double Tw = k0 + (k1 * l) + k2 * (l * l) ;
- double alpha = 0.2 ;
- double power = alpha * W * powerRepeatedWire( L, K, M, N) + powerWireDFF( M, W, alpha ) ;
- double metric = M * M * M * M * power ;
- if ( (N*Tw) < (0.8 * tCLK) ) {
- if ( metric < bestMetric ) {
- bestMetric = metric ;
- bestK = K ;
- bestM = M ;
- bestN = N ;
- }
- }
- }
- }
- }
- cout<<"L = "<<L<<" K = "<<bestK<<" M = "<<bestM<<" N = "<<bestN<<endl;
-
- wire const temp = {L, bestK, bestM, bestN};
- iter = wire_map.insert(make_pair(L, temp)).first;
- }
- return iter->second;
-}
-
-double Power_Module::powerRepeatedWire(double L, double K, double M, double N){
-
- double segments = 1.0 * M * N ;
- double Ca = K * (Ci + Co) + Cw * (L/segments) ;
- double Pa = 0.5 * Ca * Vdd * Vdd * fCLK;
- return Pa * M * N ;
-
-}
-
-double Power_Module::powerRepeatedWireLeak (double K, double M, double N){
- double Pl = K * 0.5 * ( IoffN + 2.0 * IoffP ) * Vdd ;
- return Pl * M * N ;
-
-}
-
-double Power_Module:: powerWireClk (double M, double W){
- // number of clock wires running down one repeater bank
- double columns = H_DFQD1 * MetalPitch / ChannelPitch ;
-
- // length of clock wire
- double clockLength = W * ChannelPitch ;
- double Cclk = (1 + 5.0/16.0 * (1+Co_delay/Ci_delay)) * (clockLength * Cw * columns +W * Ci_delay);
-
- return M * Cclk * (Vdd * Vdd) * fCLK ;
-
-}
-
-double Power_Module::powerWireDFF(double M, double W, double alpha){
- double Cdin = 2 * 0.8 * (Ci + Co) + 2 * ( 2.0/3.0 * 0.8 * Co ) ;
- double Cclk = 2 * 0.8 * (Ci + Co) + 2 * ( 2.0/3.0 * 0.8 * Cg_pwr) ;
- double Cint = (alpha * 0.5) * Cdin + alpha * Cclk ;
-
- return Cint * M * W * (Vdd*Vdd) * fCLK ;
-}
-
-
-///////////////////////////////////////////////////////////////
-//Memory
-//////////////////////////////////////////////////////////////
-void Power_Module::calcBuffer(const BufferMonitor *bm){
- double depth = numVC * depthVC ;
- double Pleak = powerMemoryBitLeak( depth ) * channel_width ;
- //area
-
- const vector<int> reads = bm->GetReads();
- const vector<int> writes = bm->GetWrites();
- for(int i = 0; i<bm->NumInputs(); i++){
- inputArea += areaInputModule( depth );
- inputLeakagePower += Pleak ;
- for(int j = 0; j< classes; j++){
- double ar = ((double)reads[i* classes+j])/totalTime;
- double aw = ((double)writes[i* classes+j])/totalTime;
- if(ar>1 ||aw >1){
- cout<<"activity factor is greater than one, soemthing is stomping memory\n"; exit(-1);
- }
- double Pwl = powerWordLine( channel_width, depth) ;
- double Prd = powerMemoryBitRead( depth ) * channel_width ;
- double Pwr = powerMemoryBitWrite( depth ) * channel_width ;
- inputReadPower += ar * ( Pwl + Prd ) ;
- inputWritePower += aw * ( Pwl + Pwr ) ;
- }
- }
-}
-
-
-double Power_Module::powerWordLine(double memoryWidth, double memoryDepth){
- // wordline capacitance
- double Ccell = 2 * ( 4.0 * LAMBDA ) * Cg_pwr + 6 * MetalPitch * Cw ;
- double Cwl = memoryWidth * Ccell ;
-
- // wordline circuits
- double Warray = 8 * MetalPitch + memoryDepth ;
- double x = 1.0 + (5.0/16.0) * (1 + Co/Ci) ;
- double Cpredecode = x * (Cw * Warray * Ci) ;
- double Cdecode = x * Cwl ;
-
- // bitline circuits
- double Harray = 6 * memoryWidth * MetalPitch ;
- double y = (1 + 0.25) * (1 + Co/Ci) ;
- double Cprecharge = y * ( Cw * Harray + 3 * channel_width * Ci ) ;
- double Cwren = y * ( Cw * Harray + 2 * channel_width * Ci ) ;
-
- double Cbd = Cprecharge + Cwren ;
- double Cwd = 2 * Cpredecode + Cdecode ;
-
- return ( Cbd + Cwd ) * Vdd * Vdd * fCLK ;
-
-}
-
-double Power_Module::powerMemoryBitRead(double memoryDepth){
- // bitline capacitance
- double Ccell = 4.0 * LAMBDA * Cd_pwr + 8 * MetalPitch * Cw ;
- double Cbl = memoryDepth * Ccell ;
- double Vswing = Vdd ;
- return ( Cbl ) * ( Vdd * Vswing ) * fCLK ;
-}
-
-double Power_Module:: powerMemoryBitWrite(double memoryDepth){
- // bitline capacitance
- double Ccell = 4.0 * LAMBDA * Cd_pwr + 8 * MetalPitch * Cw ;
- double Cbl = memoryDepth * Ccell ;
-
- // internal capacitance
- double Ccc = 2 * (Co + Ci) ;
-
- return (0.5 * Ccc * (Vdd*Vdd)) + ( Cbl ) * ( Vdd * Vdd ) * fCLK ;
-}
-
-double Power_Module::powerMemoryBitLeak(double memoryDepth ){
-
- return memoryDepth * IoffSRAM * Vdd ;
-}
-
-///////////////////////////////////////////////////////////////
-//switch
-//////////////////////////////////////////////////////////////
-
-void Power_Module::calcSwitch(const SwitchMonitor* sm){
-
- switchArea += areaCrossbar(sm->NumInputs(), sm->NumOutputs());
- outputArea += areaOutputModule(sm->NumOutputs());
- switchPowerLeak += powerCrossbarLeak(channel_width, sm->NumInputs(), sm->NumOutputs());
-
- const vector<int> activity = sm->GetActivity();
- vector<double> type_activity(classes);
-
- for(int i = 0; i<sm->NumOutputs(); i++){
- for(int k = 0; k<classes; k++){
- type_activity[k] = 0;
- }
- for(int j = 0; j<sm->NumInputs(); j++){
- for(int k = 0; k<classes; k++){
- double a = activity[k+classes*(i+sm->NumOutputs()*j)];
- a = a/totalTime;
- if(a>1){
- cout<<"Switcht activity factor is greater than 1!!!\n";exit(-1);
- }
- double Px = powerCrossbar(channel_width, sm->NumInputs(),sm->NumOutputs(),j,i);
- switchPower += a*channel_width*Px;
- switchPowerCtrl += a *powerCrossbarCtrl(channel_width, sm->NumInputs(),sm->NumOutputs());
- type_activity[k]+=a;
- }
- }
- outputPowerClk += powerWireClk( 1, channel_width ) ;
- for(int k = 0; k<classes; k++){
- outputPower += type_activity[k] * powerWireDFF( 1, channel_width, 1.0 ) ;
- outputCtrlPower += type_activity[k] * powerOutputCtrl(channel_width ) ;
- }
- }
-
-}
-
-double Power_Module::powerCrossbar(double width, double inputs, double outputs, double from, double to){
- // datapath traversal power
- double Wxbar = width * outputs * CrossbarPitch ;
- double Hxbar = width * inputs * CrossbarPitch ;
-
- // wires
- double CwIn = Wxbar * Cw ;
- double CwOut = Hxbar * Cw ;
-
- // cross-points
- double Cxi = (1.0/16.0) * CwOut ;
- double Cxo = 4.0 * Cxi * (Co_delay/Ci_delay) ;
-
- // drivers
- double Cti = (1.0/16.0) * CwIn ;
- double Cto = 4.0 * Cti * (Co_delay/Ci_delay) ;
-
- double CinputDriver = 5.0/16.0 * (1 + Co_delay/Ci_delay) * (0.5 * Cw * Wxbar + Cti) ;
-
- // total switched capacitance
-
- //this maybe missing +Cto
- double Cin = CinputDriver + CwIn + Cti + (outputs * Cxi) ;
- if ( to < outputs/2 ) {
- Cin -= ( 0.5 * CwIn + outputs/2 * Cxi) ;
- }
- //this maybe missing +cti
- double Cout = CwOut + Cto + (inputs * Cxo) ;
- if ( from < inputs/2) {
- Cout -= ( 0.5 * CwOut + (inputs/2 * Cxo)) ;
- }
- return 0.5 * (Cin + Cout) * (Vdd * Vdd * fCLK) ;
-}
-
-
-double Power_Module::powerCrossbarCtrl(double width, double inputs, double outputs){
-
- // datapath traversal power
- double Wxbar = width * outputs * CrossbarPitch ;
- double Hxbar = width * inputs * CrossbarPitch ;
-
- // wires
- double CwIn = Wxbar * Cw ;
-
- // drivers
- double Cti = (5.0/16.0) * CwIn ;
-
- // need some estimate of how many control wires are required
- double Cctrl = width * Cti + (Wxbar + Hxbar) * Cw ;
- double Cdrive = (5.0/16.0) * (1 + Co_delay/Ci_delay) * Cctrl ;
-
- return (Cdrive + Cctrl) * (Vdd*Vdd) * fCLK ;
-
-}
-
-double Power_Module::powerCrossbarLeak (double width, double inputs, double outputs){
- // datapath traversal power
- double Wxbar = width * outputs * CrossbarPitch ;
- double Hxbar = width * inputs * CrossbarPitch ;
-
- // wires
- double CwIn = Wxbar * Cw ;
- double CwOut = Hxbar * Cw ;
- // cross-points
- double Cxi = (1.0/16.0) * CwOut ;
- // drivers
- double Cti = (1.0/16.0) * CwIn ;
-
- return 0.5 * (IoffN + 2 * IoffP)*width*(inputs*outputs*Cxi+inputs*Cti+outputs*Cti)/Ci;
-}
-
-//////////////////////////////////////////////////////////////////
-//output module
-//////////////////////////////////////////////////////////////////
-double Power_Module:: powerOutputCtrl(double width) {
-
- double Woutmod = channel_width * ChannelPitch ;
- double Cen = Ci ;
-
- double Cenable = (1 + 5.0/16.0)*(1.0+Co/Ci)*(Woutmod* Cw + width* Cen) ;
-
- return Cenable * (Vdd*Vdd) * fCLK ;
-
-}
-
-//////////////////////////////////////////////////////////////////
-//area
-//////////////////////////////////////////////////////////////////
-
-double Power_Module:: areaChannel (double K, double N, double M){
-
- double Adff = M * W_DFQD1 * H_DFQD1 ;
- double Ainv = M * N * ( W_INVD2 + 3 * K) * H_INVD2 ;
-
- return channel_width * (Adff + Ainv) * MetalPitch * MetalPitch ;
-}
-
-double Power_Module:: areaCrossbar(double Inputs, double Outputs) {
- return (Inputs * channel_width * CrossbarPitch) * (Outputs * channel_width * CrossbarPitch) ;
-}
-
-double Power_Module:: areaInputModule(double Words) {
- double Asram = ( channel_width * H_SRAM ) * (Words * W_SRAM) ;
- return Asram * (MetalPitch * MetalPitch) ;
-}
-
-double Power_Module:: areaOutputModule(double Outputs) {
- double Adff = Outputs * W_DFQD1 * H_DFQD1 ;
- return channel_width * Adff * MetalPitch * MetalPitch ;
-}
-
-void Power_Module::run(){
- totalTime = GetSimTime();
- channelWirePower=0;
- channelClkPower=0;
- channelDFFPower=0;
- channelLeakPower=0;
- inputReadPower=0;
- inputWritePower=0;
- inputLeakagePower=0;
- switchPower=0;
- switchPowerCtrl=0;
- switchPowerLeak=0;
- outputPower=0;
- outputPowerClk=0;
- outputCtrlPower=0;
- channelArea=0;
- switchArea=0;
- inputArea=0;
- outputArea=0;
- maxInputPort = 0;
- maxOutputPort = 0;
-
- vector<FlitChannel *> inject = net->GetInject();
- vector<FlitChannel *> eject = net->GetEject();
- vector<FlitChannel *> chan = net->GetChannels();
-
- for(int i = 0; i<net->NumNodes(); i++){
- calcChannel(inject[i]);
- }
-
- for(int i = 0; i<net->NumNodes(); i++){
- calcChannel(eject[i]);
- }
-
- for(int i = 0; i<net->NumChannels();i++){
- calcChannel(chan[i]);
- }
-
- vector<Router*> routers = net->GetRouters();
- for(size_t i = 0; i < routers.size(); i++){
- IQRouter* temp = dynamic_cast<IQRouter*>(routers[i]);
- const BufferMonitor * bm = temp->GetBufferMonitor();
- calcBuffer(bm);
- const SwitchMonitor * sm = temp->GetSwitchMonitor();
- calcSwitch(sm);
- }
-
- double totalpower = channelWirePower+channelClkPower+channelDFFPower+channelLeakPower+ inputReadPower+inputWritePower+inputLeakagePower+ switchPower+switchPowerCtrl+switchPowerLeak+outputPower+outputPowerClk+outputCtrlPower;
- double totalarea = channelArea+switchArea+inputArea+outputArea;
- cout<< "-----------------------------------------\n" ;
- cout<< "- OCN Power Summary\n" ;
- cout<< "- Completion Time: "<<totalTime <<"\n" ;
- cout<< "- Flit Widths: "<<channel_width<<"\n" ;
- cout<< "- Channel Wire Power: "<<channelWirePower <<"\n" ;
- cout<< "- Channel Clock Power: "<<channelClkPower <<"\n" ;
- cout<< "- Channel Retiming Power: "<<channelDFFPower <<"\n" ;
- cout<< "- Channel Leakage Power: "<<channelLeakPower <<"\n" ;
-
- cout<< "- Input Read Power: "<<inputReadPower <<"\n" ;
- cout<< "- Input Write Power: "<<inputWritePower <<"\n" ;
- cout<< "- Input Leakage Power: "<<inputLeakagePower <<"\n" ;
-
- cout<< "- Switch Power: "<<switchPower <<"\n" ;
- cout<< "- Switch Control Power: "<<switchPowerCtrl <<"\n" ;
- cout<< "- Switch Leakage Power: "<<switchPowerLeak <<"\n" ;
-
- cout<< "- Output DFF Power: "<<outputPower <<"\n" ;
- cout<< "- Output Clk Power: "<<outputPowerClk <<"\n" ;
- cout<< "- Output Control Power: "<<outputCtrlPower <<"\n" ;
- cout<< "- Total Power: "<<totalpower <<"\n";
- cout<< "-----------------------------------------\n" ;
- cout<< "\n" ;
- cout<< "-----------------------------------------\n" ;
- cout<< "- OCN Area Summary\n" ;
- cout<< "- Channel Area: "<<channelArea<<"\n" ;
- cout<< "- Switch Area: "<<switchArea<<"\n" ;
- cout<< "- Input Area: "<<inputArea<<"\n" ;
- cout<< "- Output Area: "<<outputArea<<"\n" ;
- cout<< "- Total Area: "<<totalarea<<endl;
- cout<< "-----------------------------------------\n" ;
-
-
-
-
-}
diff --git a/src/intersim2/.svn/pristine/10/1008fe454a2dfea0e03f6ab28358479e94cdb719.svn-base b/src/intersim2/.svn/pristine/10/1008fe454a2dfea0e03f6ab28358479e94cdb719.svn-base
deleted file mode 100644
index 96083c5..0000000
--- a/src/intersim2/.svn/pristine/10/1008fe454a2dfea0e03f6ab28358479e94cdb719.svn-base
+++ /dev/null
@@ -1,61 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// SeparableAllocator: Separable Allocator Base Class
-//
-// ----------------------------------------------------------------------
-
-#ifndef _SEPARABLE_HPP_
-#define _SEPARABLE_HPP_
-
-#include <vector>
-
-#include "allocator.hpp"
-
-class Arbiter;
-
-class SeparableAllocator : public SparseAllocator {
-
-protected:
-
- vector<Arbiter*> _input_arb ;
- vector<Arbiter*> _output_arb ;
-
-public:
-
- SeparableAllocator( Module* parent, const string& name, int inputs,
- int outputs, const string& arb_type ) ;
-
- virtual ~SeparableAllocator() ;
-
- virtual void Clear() ;
-
-} ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/12/125686d82b0fb03524a1bd1dc36fd9172006e780.svn-base b/src/intersim2/.svn/pristine/12/125686d82b0fb03524a1bd1dc36fd9172006e780.svn-base
deleted file mode 100644
index f7e44a8..0000000
--- a/src/intersim2/.svn/pristine/12/125686d82b0fb03524a1bd1dc36fd9172006e780.svn-base
+++ /dev/null
@@ -1,673 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <cstdlib>
-
-#include "chaos_router.hpp"
-#include "random_utils.hpp"
-#include "globals.hpp"
-
-ChaosRouter::ChaosRouter( const Configuration& config,
- Module *parent, const string & name, int id,
- int inputs, int outputs )
- : Router( config,
- parent, name,
- id,
- inputs, outputs )
-{
- int i;
-
- if ( inputs != outputs ) {
- Error( "Chaos router must have equal number of input and output ports" );
- }
-
- _buffer_size = config.GetInt( "vc_buf_size" );
- assert(_buffer_size >= config.GetInt( "const_flits_per_packet" ));
-
- _multi_queue_size = config.GetInt( "multi_queue_size" );
-
- _cur_channel = 0;
- _read_stall = 0;
-
- // Routing
-
- string rf = config.GetStr("routing_function") + "_" + config.GetStr("topology");
- map<string, tRoutingFunction>::iterator rf_iter = gRoutingFunctionMap.find(rf);
- if(rf_iter == gRoutingFunctionMap.end()) {
- Error("Invalid routing function: " + rf);
- }
- _rf = rf_iter->second;
-
- _input_route.resize(_inputs);
-
- for ( i = 0; i < _inputs; ++i ) {
- _input_route[i] = new OutputSet( );
- }
-
- _mq_route.resize(_multi_queue_size);
-
- for ( i = 0; i < _multi_queue_size; ++i ) {
- _mq_route[i] = new OutputSet( );
- }
-
- // Alloc pipelines (to simulate processing/transmission delays)
-
- _crossbar_pipe =
- new PipelineFIFO<Flit>( this, "crossbar_pipeline", _outputs,
- _crossbar_delay );
-
- // Input and output queues
-
- _input_frame.resize(_inputs);
- _output_frame.resize(_outputs);
- _multi_queue.resize(_multi_queue_size);
-
- _credit_queue.resize(_inputs);
-
- _input_state.resize(_inputs, empty);
- _input_output_match.resize(_inputs, -1);
- _input_mq_match.resize(_inputs, -1);
-
- _output_matched.resize(_outputs, false);
- _next_queue_cnt.resize(_outputs, 0);
-
- _multi_match.resize(_multi_queue_size, -1);
- _mq_age.resize(_multi_queue_size);
- _mq_matched.resize(_multi_queue_size, false);
- _multi_state.resize(_multi_queue_size, empty);
-
- for ( i = 0; i < _multi_queue_size; ++i ) {
- _multi_state[i] = empty;
- _multi_match[i] = -1;
- _mq_matched[i] = false;
- }
-}
-
-ChaosRouter::~ChaosRouter( )
-{
- int i;
-
- delete _crossbar_pipe;
-
- for ( i = 0; i < _inputs; ++i ) {
- delete _input_route[i];
- }
-
- for ( i = 0; i < _multi_queue_size; ++i ) {
- delete _mq_route[i];
- }
-}
-
-void ChaosRouter::ReadInputs( )
-{
- Flit *f;
- Credit *c;
-
- for ( int input = 0; input < _inputs; ++input ) {
- f = _input_channels[input]->Receive();
-
- if ( f ) {
- _input_frame[input].push( f );
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Flit arriving at " << FullName()
- << " on channel " << input << endl
- << *f;
- }
-
- switch( _input_state[input] ) {
- case empty:
- if ( f->head ) {
- if ( f->tail ) {
- _input_state[input] = full;
- } else {
- _input_state[input] = filling;
- }
- _rf( this, f, input, _input_route[input], false );
- } else {
- cout << *f;
- Error( "Empty buffer received non-head flit!" );
- }
- break;
-
- case filling:
- if ( f->tail ) {
- _input_state[input] = full;
- } else if ( f->head ) {
- Error( "Input buffer received another head before previous tail!" );
- }
- break;
-
- case full:
- Error( "Received flit while full!" );
- break;
-
- case leaving:
- if ( f->head ) {
- _input_state[input] = shared;
-
- if ( f->tail ) {
- Error( "Received single-flit packet in leaving state!" );
- }
- } else {
- cout << *f;
- Error( "Received non-head flit while packet leaving!" );
- }
- break;
-
- case cut_through:
- if ( f->tail ) {
- _input_state[input] = leaving;
- }
- if ( f->head ) {
- cout << *f;
- Error( "Received head flit in cut through buffer!" );
- }
- break;
-
- case shared:
- if ( f->head ) {
- Error( "Shared buffer received another head!" );
- } else if ( f->tail ) {
- cout << "Input " << input << endl;
- cout << *f;
- Error( "Shared buffer received another tail!" );
- }
- break;
- }
- }
- }
-
- // Process incoming credits
-
- for ( int output = 0; output < _outputs; ++output ) {
- c = _output_credits[output]->Receive();
-
- if ( c ) {
- _next_queue_cnt[output]--;
-
- if ( _next_queue_cnt[output] < 0 ) {
- Error( "Next queue count fell below zero!" );
- }
-
- c->Free();
- }
- }
-}
-
-void ChaosRouter::_InternalStep( )
-{
- _NextInterestingChannel( );
- _OutputAdvance( );
-
- _crossbar_pipe->Advance( );
-}
-
-void ChaosRouter::WriteOutputs( )
-{
- _SendFlits( );
- _SendCredits( );
-}
-
-bool ChaosRouter::_IsInjectionChan( int chan ) const
-{
- return ( chan == _inputs - 1 );
-}
-
-bool ChaosRouter::_IsEjectionChan( int chan ) const
-{
- return ( chan == _outputs - 1 );
-}
-
-bool ChaosRouter::_InputReady( int input ) const
-{
- bool ready = false;
-
- if ( ( _input_state[input] == filling ) ||
- ( _input_state[input] == full ) ) {
- ready = true;
- }
-
- return ready;
-}
-
-bool ChaosRouter::_OutputFull( int out ) const
-{
- return ( _output_frame[out].size( ) >= (size_t)_buffer_size );
-}
-
-bool ChaosRouter::_OutputAvail( int out ) const
-{
- return ( ( !_output_matched[out] ) && ( _output_frame[out].empty( ) ) );
- //&& ( _next_queue_cnt[out] == 0 ) );
- //return ( ( !_output_matched[out] ) && !_OutputFull( out ) );
-}
-
-bool ChaosRouter::_MultiQueueFull( int mq ) const
-{
- return ( _multi_queue[mq].size( ) >= (size_t)_buffer_size );
-}
-
-int ChaosRouter::_InputForOutput( int output ) const
-{
- // return an input that prefers this output
-
- int input;
- int offset = RandomInt( _inputs - 1 );
- bool match = false;
-
- for ( int i = 0; ( i < _inputs ) && ( !match ); ++i ) {
- input = ( i + offset ) % _inputs;
-
- if ( _InputReady( input ) &&
- ( ! _input_route[input]->OutputEmpty( output ) ) ) {
- match = true;
- }
- }
-
- return match ? input : -1;
-}
-
-int ChaosRouter::_MultiQueueForOutput( int output ) const
-{
- // return oldest multi queue that prefers the output,
- // or if none prefer and the multi queue is full,
- // return a random entry
-
- int mq_oldest = -1;
- int mq_age;
-
- int m, r;
-
- bool isfull = true;
-
- for ( int i = 0; i < _multi_queue_size; ++i ) {
- if ( ( _multi_match[i] == -1 ) &&
- ( ( _multi_state[i] == full ) ||
- ( _multi_state[i] == filling ) ) ) {
-
- if ( ( !_mq_route[i]->OutputEmpty( output ) ) &&
- ( ( mq_oldest == -1 ) || ( _mq_age[i] > mq_age ) ) ) {
- mq_oldest = i;
- mq_age = _mq_age[i];
- }
- }
-
- // deroute only if all queues contain head flits ...
-
- if ( ( _multi_state[i] != full ) &&
- ( _multi_state[i] != filling ) &&
- ( _multi_state[i] != shared ) ) {
- isfull = false;
- }
- }
-
- // Don't deroute MQs to the ejection channel
- if ( ( mq_oldest == -1 ) && isfull &&
- ( !_IsEjectionChan( output ) ) ) {
- r = RandomInt( _multi_queue_size - 1 );
-
- // Find first routable multi-queue
- for ( int i = 0; i < _multi_queue_size; ++i ) {
- m = ( i + r ) % _multi_queue_size;
- if ( ( _multi_state[m] == filling ) ||
- ( _multi_state[m] == full ) ) {
- mq_oldest = m;
- //cout << "DEROUTING at " << FullName() << endl;
- break;
- }
- }
-
- if ( mq_oldest == -1 ) {
- cout << "write stall" << endl;
- }
- }
-
- return mq_oldest;
-}
-
-int ChaosRouter::_FindAvailMultiQueue( ) const
-{
- // return any empty multi queue slot
-
- int avail = -1;
-
- for ( int i = 0; i < _multi_queue_size; ++i ) {
- if ( ( !_MultiQueueFull( i ) ) &&
- ( !_mq_matched[i] ) ) {
- avail = i;
- break;
- }
- }
-
- return avail;
-}
-
-void ChaosRouter::_NextInterestingChannel( )
-{
- bool interesting;
-
- int mq_index;
- int in_index;
- int mq_avail;
-
- int c;
-
- interesting = false;
- mq_index = -1;
- in_index = -1;
-
- // A channel is interesting if
- //
- // ( output frame available and
- // ( ( a multiqueue packet wants output channel ) or
- // ( an input packet wants output channel ) or
- // ( the multiqueue is full ) ) )
- // or
- // ( the packet at the input channel is stalled )
-
- for ( c = 0; ( c < _inputs ) && ( !interesting ); ++c ) {
- if ( _OutputAvail( _cur_channel ) ) {
- mq_index = _MultiQueueForOutput( _cur_channel );
- in_index = _InputForOutput( _cur_channel );
-
- if ( ( mq_index != -1 ) || ( in_index != -1 ) ) {
- interesting = true;
- }
- }
-
- if ( _input_state[_cur_channel] == full ) {
- interesting = true;
- }
-
- if ( !interesting ) {
- _cur_channel = ( _cur_channel + 1 ) % _inputs;
- }
- }
-
- if ( interesting ) {
- //cout << _cur_channel << " is interesting at " << FullName() << endl;
-
- if ( mq_index != -1 ) {
- //cout << "Match for multi-queue " << mq_index << " at " << FullName()
- // << ", output matched = " << _output_matched[_cur_channel] << endl;
-
- _output_matched[_cur_channel] = true;
- _multi_match[mq_index] = _cur_channel;
- } else if ( in_index != -1 ) {
- _output_matched[_cur_channel] = true;
- _input_output_match[in_index] = _cur_channel;
-
- //cout << "Match for input " << in_index << " at " << FullName() << endl;
-
- if ( _input_state[in_index] == full ) {
- _input_state[in_index] = leaving;
- } else if ( _input_state[in_index] == filling ) {
- _input_state[in_index] = cut_through;
- } else {
- Error( "Tried to route input through crossbar that was not full or filling!" );
- }
- }
-
- // Any non-injection channel that is routable is
- // directed to the multi-queue
- if ( ( ( _input_state[_cur_channel] == filling ) ||
- ( _input_state[_cur_channel] == full ) ) &&
- ( !_IsInjectionChan( _cur_channel ) ) ) {
- ++_read_stall;
- } else {
- // go to next channel for the next cycle
- _cur_channel = ( _cur_channel + 1 ) % _inputs;
- _read_stall = 0;
- }
- }
-
- if ( _read_stall > 0 ) {
- mq_avail = _FindAvailMultiQueue( );
-
- if ( mq_avail != -1 ) {
- if ( _input_state[_cur_channel] == full ) {
- _input_state[_cur_channel] = leaving;
- } else if ( _input_state[_cur_channel] == filling ) {
- _input_state[_cur_channel] = cut_through;
- } else {
- cout << "Input " << _cur_channel << " state = "
- << _input_state[_cur_channel] << endl;
- Error( "Tried to route input throught multi-queue that was not full or filling!" );
- }
-
- _input_mq_match[_cur_channel] = mq_avail;
- _mq_matched[mq_avail] = true;
-
- // go to next channel for the next cycle
- _cur_channel = ( _cur_channel + 1 ) % _inputs;
- _read_stall = 0;
- } else {
- ++_read_stall;
- //cout << "stalling at input " << _cur_channel << " (count = " << _read_stall << ")" << endl;
- }
- }
-}
-
-void ChaosRouter::_OutputAdvance( )
-{
- Flit *f, *f2;
- Credit *c;
- bool advanced;
- int mq;
-
- _crossbar_pipe->WriteAll( 0 );
-
- for ( int i = 0; i < _inputs; ++i ) {
- if ( ( ( _input_output_match[i] != -1 ) ||
- ( _input_mq_match[i] != -1 ) ) &&
- ( !_input_frame[i].empty( ) ) ) {
-
- advanced = false;
- f = _input_frame[i].front( );
-
- /*if ( ! ) {
-
- } else {
- cout << "Input = " << i
- << ", input_output_match = " << _input_output_match[i]
- << ", input_mq_match = " << _input_mq_match[i] << endl;
- Error( "Input queue empty, but matched!" );
- }*/
-
- if ( _input_output_match[i] != -1 ) {
- if ( f->tail ) {
- _output_matched[_input_output_match[i]] = false;
- }
-
- _crossbar_pipe->Write( f, _input_output_match[i] );
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Flit traversing crossbar from input queue "
- << i << " at "
- << FullName() << endl
- << *f;
- }
-
- advanced = true;
-
- } else if ( !_MultiQueueFull( _input_mq_match[i] ) ) {
-
- mq = _input_mq_match[i];
-
- if ( f->head ) {
- _rf( this, f, i, _mq_route[mq], false );
- _mq_age[mq] = 0;
-
- if ( _multi_state[mq] == empty ) {
- _multi_state[mq] = filling;
- } else if ( _multi_state[mq] == leaving ) {
- _multi_state[mq] = shared;
- } else {
- Error( "Multi-queue received head while not empty or leaving!" );
- }
- }
-
- if ( f->tail ) {
- _mq_matched[mq] = false;
-
- if ( _multi_state[mq] == filling ) {
- _multi_state[mq] = full;
- } else if ( _multi_state[mq] == cut_through ) {
- _multi_state[mq] = leaving;
- } else {
- Error( "Multi-queue received tail while not filling or cutting-through!" );
- }
- }
-
- _multi_queue[mq].push( f );
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Flit stored in multiqueue at "
- << FullName() << endl
- << "State = " << _multi_state[mq] << endl
- << *f;
- }
-
- advanced = true;
- }
-
- if ( advanced ) {
- _input_frame[i].pop( );
-
- if ( f->tail ) { // last in packet, update state
- if ( _input_state[i] == leaving ) {
- _input_state[i] = empty;
- } else if ( _input_state[i] == shared ) {
- _input_state[i] = filling;
- f2 = _input_frame[i].front( );
- // update routes
- _rf( this, f2, i, _input_route[i], false );
- }
-
- _input_output_match[i] = -1;
- _input_mq_match[i] = -1;
- }
-
- c = Credit::New( );
- c->vc.insert(0);
- _credit_queue[i].push( c );
- }
- }
- }
-
- for ( int m = 0; m < _multi_queue_size; ++m ) {
- if ( _multi_match[m] != -1 ) {
- if ( _multi_queue[m].empty( ) ) {
- cout << "State = " << _multi_state[m] << endl;
- Error( "Multi queue empty, but matched!" );
- }
- assert( !_multi_queue[m].empty( ) );
- f = _multi_queue[m].front( );
- _multi_queue[m].pop( );
-
- _crossbar_pipe->Write( f, _multi_match[m] );
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Flit traversing crossbar from multiqueue slot "
- << m << " at "
- << FullName() << endl
- << *f;
- }
-
- if ( f->head ) {
- if ( _multi_state[m] == filling ) {
- _multi_state[m] = cut_through;
- } else if ( _multi_state[m] == full ) {
- _multi_state[m] = leaving;
- } else {
- Error( "Multi-queue sent head while not filling or full!" );
- }
- }
-
- if ( f->tail ) {
- _output_matched[_multi_match[m]] = false;
- _multi_match[m] = -1;
-
- if ( _multi_state[m] == shared ) {
- _multi_state[m] = filling;
- } else if ( _multi_state[m] == leaving ) {
- _multi_state[m] = empty;
- } else {
- cout << "State = " << _multi_state[m] << endl;
- cout << *f;
- Error( "Multi-queue sent tail while not leaving or shared!" );
- }
- }
- }
-
- _mq_age[m]++;
- }
-}
-
-
-void ChaosRouter::_SendFlits( )
-{
- for ( int output = 0; output < _outputs; ++output ) {
- Flit *f = _crossbar_pipe->Read( output );
-
- if ( f ) {
- _output_frame[output].push( f );
- f->hops++;
- }
-
- if ( ( _next_queue_cnt[output] < _buffer_size ) &&
- ( !_output_frame[output].empty( ) ) ) {
- _output_channels[output]->Send( _output_frame[output].front( ) );
- _output_frame[output].pop( );
- ++_next_queue_cnt[output];
- }
- }
-}
-
-void ChaosRouter::_SendCredits( )
-{
- for ( int input = 0; input < _inputs; ++input ) {
- if ( !_credit_queue[input].empty( ) ) {
- Credit *c = _credit_queue[input].front( );
- _credit_queue[input].pop( );
- _input_credits[input]->Send( c );
- }
- }
-}
-
-void ChaosRouter::Display( ostream & os ) const
-{
-}
diff --git a/src/intersim2/.svn/pristine/12/1260dd25f0b77d1694bc40d60681090fdb77e795.svn-base b/src/intersim2/.svn/pristine/12/1260dd25f0b77d1694bc40d60681090fdb77e795.svn-base
deleted file mode 100644
index 6488ea4..0000000
--- a/src/intersim2/.svn/pristine/12/1260dd25f0b77d1694bc40d60681090fdb77e795.svn-base
+++ /dev/null
@@ -1,186 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _POWER_MODULE_HPP_
-#define _POWER_MODULE_HPP_
-
-#include <map>
-
-#include "module.hpp"
-#include "network.hpp"
-#include "config_utils.hpp"
-#include "flitchannel.hpp"
-#include "switch_monitor.hpp"
-#include "buffer_monitor.hpp"
-
-struct wire{
- double L;
- double K;
- double M;
- double N;
-};
-
-class Power_Module : public Module {
-
-protected:
- //network undersimulation
- Network * net;
- int classes;
- //all channels are this width
- double channel_width;
- //resimulate all with channel_width decremented by channel_sweep until 0
- double channel_sweep;
- //write result to a tabbed format to file
- string output_file_name;
-
- //buffer depth
- double depthVC;
- //vcs
- double numVC;
-
- //store the property of wires based on length
- map<double, wire> wire_map;
-
- //////////////////////////////////Constants/////////////////////////////
- //wire length in (mm)
- double wire_length;
- //////////Metal Parameters////////////
- // Wire left/right coupling capacitance [ F/mm ]
- double Cw_cpl ;
- // Wire up/down groudn capacitance [ F/mm ]
- double Cw_gnd ;
- double Cw ;
- double Rw ;
- // metal pitch [mm]
- double MetalPitch ;
-
-
- //////////Device Parameters////////////
-
- double LAMBDA ; // [um/LAMBDA]
- double Cd ; // [F/um] (for Delay)
- double Cg ; // [F/um] (for Delay)
- double Cgdl ; // [F/um] (for Delay)
-
- double Cd_pwr; // [F/um] (for Power)
- double Cg_pwr ; // [F/um] (for Power)
-
- double IoffN ; // [A/um]
- double IoffP ; // [A/um]
- // Leakage from bitlines, two-port cell [A]
- double IoffSRAM;
- // [Ohm] ( D1=1um Inverter)
- double R ;
- // [F] ( D1=1um Inverter - for Power )
- double Ci_delay;
- // [F] ( D1=1um Inverter - for Power )
- double Co_delay ;
-
- double Ci ;
- double Co ;
- double Vdd ;
- double FO4 ;
- double tCLK ;
- double fCLK ;
-
- double H_INVD2;
- double W_INVD2;
- double H_DFQD1;
- double W_DFQD1;
- double H_ND2D1;
- double W_ND2D1;
- double H_SRAM;
- double W_SRAM;
- double ChannelPitch ;
- double CrossbarPitch;
- ////////////////////////////////End of Constants/////////////////////////////
-
- /////////////results///////////////////
- double totalTime;
- double channelWirePower;
- double channelClkPower;
- double channelDFFPower;
- double channelLeakPower;
- double inputReadPower;
- double inputWritePower;
- double inputLeakagePower;
- double switchPower;
- double switchPowerCtrl;
- double switchPowerLeak;
- double outputPower;
- double outputPowerClk;
- double outputCtrlPower;
- double channelArea;
- double switchArea;
- double inputArea;
- double outputArea;
- double maxInputPort;
- double maxOutputPort;
-
-
- ////////////////////////
-
- //channels
- void calcChannel(const FlitChannel * f);
- wire const & wireOptimize(double l);
- double powerRepeatedWire(double L, double K, double M, double N);
- double powerRepeatedWireLeak (double K, double M, double N);
- double powerWireClk (double M, double W);
- double powerWireDFF(double M, double W, double alpha);
-
- //memory
- void calcBuffer(const BufferMonitor *bm);
- double powerWordLine(double memoryWidth, double memoryDepth);
- double powerMemoryBitRead(double memoryDepth);
- double powerMemoryBitWrite(double memoryDepth);
- double powerMemoryBitLeak(double memoryDepth );
-
- //switch
- void calcSwitch(const SwitchMonitor *sm);
- double powerCrossbar(double width, double inputs, double outputs, double from, double to);
- double powerCrossbarCtrl(double width, double inputs, double outputs);
- double powerCrossbarLeak (double width, double inputs, double outputs);
-
- //output
- double powerOutputCtrl(double width);
-
- //area
-
- double areaChannel (double K, double N, double M);
- double areaCrossbar(double Inputs, double Outputs) ;
- double areaInputModule(double Words) ;
- double areaOutputModule(double Outputs);
-
-public:
- Power_Module(Network * net, const Configuration &config);
- ~Power_Module();
-
- void run();
-
-
-};
-#endif
diff --git a/src/intersim2/.svn/pristine/12/129d383ada436691b3879ee38f72c6420d1b3b86.svn-base b/src/intersim2/.svn/pristine/12/129d383ada436691b3879ee38f72c6420d1b3b86.svn-base
deleted file mode 100644
index 6aa2d53..0000000
--- a/src/intersim2/.svn/pristine/12/129d383ada436691b3879ee38f72c6420d1b3b86.svn-base
+++ /dev/null
@@ -1,481 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <iostream>
-#include <sstream>
-#include <cassert>
-#include "allocator.hpp"
-
-/////////////////////////////////////////////////////////////////////////
-//Allocator types
-#include "maxsize.hpp"
-#include "pim.hpp"
-#include "islip.hpp"
-#include "loa.hpp"
-#include "wavefront.hpp"
-#include "selalloc.hpp"
-#include "separable_input_first.hpp"
-#include "separable_output_first.hpp"
-//
-/////////////////////////////////////////////////////////////////////////
-
-//==================================================
-// Allocator base class
-//==================================================
-
-Allocator::Allocator( Module *parent, const string& name,
- int inputs, int outputs ) :
-Module( parent, name ), _inputs( inputs ), _outputs( outputs ), _dirty( false )
-{
- _inmatch.resize(_inputs, -1);
- _outmatch.resize(_outputs, -1);
-}
-
-void Allocator::Clear( )
-{
- if(_dirty) {
- _inmatch.assign(_inputs, -1);
- _outmatch.assign(_outputs, -1);
- _dirty = false;
- }
-}
-
-void Allocator::AddRequest( int in, int out, int label, int in_pri,
- int out_pri ) {
-
- assert( ( in >= 0 ) && ( in < _inputs ) );
- assert( ( out >= 0 ) && ( out < _outputs ) );
- assert( label >= 0 );
- _dirty = true;
-}
-
-int Allocator::OutputAssigned( int in ) const
-{
- assert( ( in >= 0 ) && ( in < _inputs ) );
-
- return _inmatch[in];
-}
-
-int Allocator::InputAssigned( int out ) const
-{
- assert( ( out >= 0 ) && ( out < _outputs ) );
-
- return _outmatch[out];
-}
-
-void Allocator::PrintGrants( ostream * os ) const
-{
- if(!os) os = &cout;
-
- *os << "Input grants = [ ";
- for ( int input = 0; input < _inputs; ++input ) {
- if(_inmatch[input] >= 0) {
- *os << input << " -> " << _inmatch[input] << " ";
- }
- }
- *os << "], output grants = [ ";
- for ( int output = 0; output < _outputs; ++output ) {
- if(_outmatch[output] >= 0) {
- *os << output << " -> " << _outmatch[output] << " ";
- }
- }
- *os << "]." << endl;
-}
-
-//==================================================
-// DenseAllocator
-//==================================================
-
-DenseAllocator::DenseAllocator( Module *parent, const string& name,
- int inputs, int outputs ) :
- Allocator( parent, name, inputs, outputs )
-{
- _request.resize(_inputs);
-
- for ( int i = 0; i < _inputs; ++i ) {
- _request[i].resize(_outputs);
- for ( int j = 0; j < _outputs; ++j ) {
- _request[i][j].label = -1;
- }
- }
-}
-
-void DenseAllocator::Clear( )
-{
- for ( int i = 0; i < _inputs; ++i ) {
- for ( int j = 0; j < _outputs; ++j ) {
- _request[i][j].label = -1;
- }
- }
- Allocator::Clear();
-}
-
-int DenseAllocator::ReadRequest( int in, int out ) const
-{
- assert( ( in >= 0 ) && ( in < _inputs ) );
- assert( ( out >= 0 ) && ( out < _outputs ) );
-
- return _request[in][out].label;
-}
-
-bool DenseAllocator::ReadRequest( sRequest &req, int in, int out ) const
-{
- assert( ( in >= 0 ) && ( in < _inputs ) );
- assert( ( out >= 0 ) && ( out < _outputs ) );
-
- req = _request[in][out];
-
- return ( req.label >= 0 );
-}
-
-void DenseAllocator::AddRequest( int in, int out, int label,
- int in_pri, int out_pri )
-{
- Allocator::AddRequest(in, out, label, in_pri, out_pri);
- assert( _request[in][out].label == -1 );
-
- _request[in][out].label = label;
- _request[in][out].in_pri = in_pri;
- _request[in][out].out_pri = out_pri;
-}
-
-void DenseAllocator::RemoveRequest( int in, int out, int label )
-{
- assert( ( in >= 0 ) && ( in < _inputs ) );
- assert( ( out >= 0 ) && ( out < _outputs ) );
-
- _request[in][out].label = -1;
-}
-
-bool DenseAllocator::InputHasRequests( int in ) const
-{
- for(int out = 0; out < _outputs; ++out) {
- if(_request[in][out].label >= 0) {
- return true;
- }
- }
- return false;
-}
-
-bool DenseAllocator::OutputHasRequests( int out ) const
-{
- for(int in = 0; in < _inputs; ++in) {
- if(_request[in][out].label >= 0) {
- return true;
- }
- }
- return false;
-}
-
-int DenseAllocator::NumInputRequests( int in ) const
-{
- int result = 0;
- for(int out = 0; out < _outputs; ++out) {
- if(_request[in][out].label >= 0) {
- ++result;
- }
- }
- return result;
-}
-
-int DenseAllocator::NumOutputRequests( int out ) const
-{
- int result = 0;
- for(int in = 0; in < _inputs; ++in) {
- if(_request[in][out].label >= 0) {
- ++result;
- }
- }
- return result;
-}
-
-void DenseAllocator::PrintRequests( ostream * os ) const
-{
- if(!os) os = &cout;
-
- *os << "Input requests = [ ";
- for ( int input = 0; input < _inputs; ++input ) {
- bool print = false;
- ostringstream ss;
- for ( int output = 0; output < _outputs; ++output ) {
- const sRequest & req = _request[input][output];
- if ( req.label >= 0 ) {
- print = true;
- ss << output << "@" << req.in_pri << " ";
- }
- }
- if(print) {
- *os << input << " -> [ " << ss.str() << "] ";
- }
- }
- *os << "], output requests = [ ";
- for ( int output = 0; output < _outputs; ++output ) {
- bool print = false;
- ostringstream ss;
- for ( int input = 0; input < _inputs; ++input ) {
- const sRequest & req = _request[input][output];
- if ( req.label >= 0 ) {
- print = true;
- ss << input << "@" << req.out_pri << " ";
- }
- }
- if(print) {
- *os << output << " -> [ " << ss.str() << "] ";
- }
- }
- *os << "]." << endl;
-}
-
-//==================================================
-// SparseAllocator
-//==================================================
-
-SparseAllocator::SparseAllocator( Module *parent, const string& name,
- int inputs, int outputs ) :
- Allocator( parent, name, inputs, outputs )
-{
- _in_req.resize(_inputs);
- _out_req.resize(_outputs);
-}
-
-
-void SparseAllocator::Clear( )
-{
- for ( int i = 0; i < _inputs; ++i ) {
- if(!_in_req[i].empty())
- _in_req[i].clear( );
- }
-
- for ( int j = 0; j < _outputs; ++j ) {
- if(!_out_req[j].empty())
- _out_req[j].clear( );
- }
-
- _in_occ.clear( );
- _out_occ.clear( );
-
- Allocator::Clear();
-}
-
-int SparseAllocator::ReadRequest( int in, int out ) const
-{
- sRequest r;
-
- if ( ! ReadRequest( r, in, out ) ) {
- r.label = -1;
- }
-
- return r.label;
-}
-
-bool SparseAllocator::ReadRequest( sRequest &req, int in, int out ) const
-{
- bool found;
-
- assert( ( in >= 0 ) && ( in < _inputs ) );
- assert( ( out >= 0 ) && ( out < _outputs ) );
-
- map<int, sRequest>::const_iterator match = _in_req[in].find(out);
- if ( match != _in_req[in].end( ) ) {
- req = match->second;
- found = true;
- } else {
- found = false;
- }
-
- return found;
-}
-
-void SparseAllocator::AddRequest( int in, int out, int label,
- int in_pri, int out_pri )
-{
- Allocator::AddRequest(in, out, label, in_pri, out_pri);
- assert( _in_req[in].count(out) == 0 );
- assert( _out_req[out].count(in) == 0 );
-
- // insert into occupied inputs set if
- // input is currently empty
- if ( _in_req[in].empty( ) ) {
- _in_occ.insert(in);
- }
-
- // similarly for the output
- if ( _out_req[out].empty( ) ) {
- _out_occ.insert(out);
- }
-
- sRequest req;
- req.port = out;
- req.label = label;
- req.in_pri = in_pri;
- req.out_pri = out_pri;
-
- _in_req[in][out] = req;
-
- req.port = in;
-
- _out_req[out][in] = req;
-}
-
-void SparseAllocator::RemoveRequest( int in, int out, int label )
-{
- assert( ( in >= 0 ) && ( in < _inputs ) );
- assert( ( out >= 0 ) && ( out < _outputs ) );
-
- assert( _in_req[in].count( out ) > 0 );
- assert( _in_req[in][out].label == label );
- _in_req[in].erase( out );
-
- // remove from occupied inputs list if
- // input is now empty
- if ( _in_req[in].empty( ) ) {
- _in_occ.erase(in);
- }
-
- // similarly for the output
- assert( _out_req[out].count( in ) > 0 );
- assert( _out_req[out][in].label == label );
- _out_req[out].erase( in );
-
- if ( _out_req[out].empty( ) ) {
- _out_occ.erase(out);
- }
-}
-
-bool SparseAllocator::InputHasRequests( int in ) const
-{
- return _in_occ.count(in) > 0;
-}
-
-bool SparseAllocator::OutputHasRequests( int out ) const
-{
- return _out_occ.count(out) > 0;
-}
-
-int SparseAllocator::NumInputRequests( int in ) const
-{
- return _in_occ.count(in);
-}
-
-int SparseAllocator::NumOutputRequests( int out ) const
-{
- return _out_occ.count(out);
-}
-
-void SparseAllocator::PrintRequests( ostream * os ) const
-{
- map<int, sRequest>::const_iterator iter;
-
- if(!os) os = &cout;
-
- *os << "Input requests = [ ";
- for ( int input = 0; input < _inputs; ++input ) {
- if(!_in_req[input].empty()) {
- *os << input << " -> [ ";
- for ( iter = _in_req[input].begin( );
- iter != _in_req[input].end( ); iter++ ) {
- *os << iter->second.port << "@" << iter->second.in_pri << " ";
- }
- *os << "] ";
- }
- }
- *os << "], output requests = [ ";
- for ( int output = 0; output < _outputs; ++output ) {
- if(!_out_req[output].empty()) {
- *os << output << " -> ";
- *os << "[ ";
- for ( iter = _out_req[output].begin( );
- iter != _out_req[output].end( ); iter++ ) {
- *os << iter->second.port << "@" << iter->second.out_pri << " ";
- }
- *os << "] ";
- }
- }
- *os << "]." << endl;
-}
-
-//==================================================
-// Global allocator allocation function
-//==================================================
-
-Allocator *Allocator::NewAllocator( Module *parent, const string& name,
- const string &alloc_type,
- int inputs, int outputs,
- Configuration const * const config )
-{
- Allocator *a = 0;
-
- string alloc_name;
- string param_str;
- size_t left = alloc_type.find_first_of('(');
- if(left == string::npos) {
- alloc_name = alloc_type;
- } else {
- alloc_name = alloc_type.substr(0, left);
- size_t right = alloc_type.find_last_of(')');
- if(right == string::npos) {
- param_str = alloc_type.substr(left+1);
- } else {
- param_str = alloc_type.substr(left+1, right-left-1);
- }
- }
- if ( alloc_name == "max_size" ) {
- a = new MaxSizeMatch( parent, name, inputs, outputs );
- } else if ( alloc_name == "pim" ) {
- int iters = param_str.empty() ? (config ? config->GetInt("alloc_iters") : 1) : atoi(param_str.c_str());
- a = new PIM( parent, name, inputs, outputs, iters );
- } else if ( alloc_name == "islip" ) {
- int iters = param_str.empty() ? (config ? config->GetInt("alloc_iters") : 1) : atoi(param_str.c_str());
- a = new iSLIP_Sparse( parent, name, inputs, outputs, iters );
- } else if ( alloc_name == "loa" ) {
- a = new LOA( parent, name, inputs, outputs );
- } else if ( alloc_name == "wavefront" ) {
- a = new Wavefront( parent, name, inputs, outputs );
- } else if ( alloc_name == "rr_wavefront" ) {
- a = new Wavefront( parent, name, inputs, outputs, true );
- } else if ( alloc_name == "select" ) {
- int iters = param_str.empty() ? (config ? config->GetInt("alloc_iters") : 1) : atoi(param_str.c_str());
- a = new SelAlloc( parent, name, inputs, outputs, iters );
- } else if (alloc_name == "separable_input_first") {
- string arb_type = param_str.empty() ? (config ? config->GetStr("arb_type") : "round_robin") : param_str;
- a = new SeparableInputFirstAllocator( parent, name, inputs, outputs,
- arb_type );
- } else if (alloc_name == "separable_output_first") {
- string arb_type = param_str.empty() ? (config ? config->GetStr("arb_type") : "round_robin") : param_str;
- a = new SeparableOutputFirstAllocator( parent, name, inputs, outputs,
- arb_type );
- }
-
-//==================================================
-// Insert new allocators here, add another else if
-//==================================================
-
-
- return a;
-}
-
diff --git a/src/intersim2/.svn/pristine/13/135d8312fc0bb109518f6bfc62cbbf814c7d587c.svn-base b/src/intersim2/.svn/pristine/13/135d8312fc0bb109518f6bfc62cbbf814c7d587c.svn-base
deleted file mode 100644
index 27428d9..0000000
--- a/src/intersim2/.svn/pristine/13/135d8312fc0bb109518f6bfc62cbbf814c7d587c.svn-base
+++ /dev/null
@@ -1,112 +0,0 @@
-/* This program by D E Knuth is in the public domain and freely copyable.
- * It is explained in Seminumerical Algorithms, 3rd edition, Section 3.6
- * (or in the errata to the 2nd edition --- see
- * http://www-cs-faculty.stanford.edu/~knuth/taocp.html
- * in the changes to Volume 2 on pages 171 and following). */
-
-/* N.B. The MODIFICATIONS introduced in the 9th printing (2002) are
- included here; there's no backwards compatibility with the original. */
-
-/* This version also adopts Brendan McKay's suggestion to
- accommodate naive users who forget to call ranf_start(seed). */
-
-/* If you find any bugs, please report them immediately to
- * (and you will be rewarded if the bug is genuine). Thanks! */
-
-/************ see the book for explanations and caveats! *******************/
-/************ in particular, you need two's complement arithmetic **********/
-
-#define KK 100 /* the long lag */
-#define LL 37 /* the short lag */
-#define mod_sum(x,y) (((x)+(y))-(int)((x)+(y))) /* (x+y) mod 1.0 */
-
-double ran_u[KK]; /* the generator state */
-
-#ifdef __STDC__
-void ranf_array(double aa[], int n)
-#else
-void ranf_array(aa,n) /* put n new random fractions in aa */
- double *aa; /* destination */
- int n; /* array length (must be at least KK) */
-#endif
-{
- register int i,j;
- for (j=0;j<KK;j++) aa[j]=ran_u[j];
- for (;j<n;j++) aa[j]=mod_sum(aa[j-KK],aa[j-LL]);
- for (i=0;i<LL;i++,j++) ran_u[i]=mod_sum(aa[j-KK],aa[j-LL]);
- for (;i<KK;i++,j++) ran_u[i]=mod_sum(aa[j-KK],ran_u[i-LL]);
-}
-
-/* the following routines are adapted from exercise 3.6--15 */
-/* after calling ranf_start, get new randoms by, e.g., "x=ranf_arr_next()" */
-
-#define QUALITY 1009 /* recommended quality level for high-res use */
-double ranf_arr_buf[QUALITY];
-double ranf_arr_dummy=-1.0, ranf_arr_started=-1.0;
-double *ranf_arr_ptr=&ranf_arr_dummy; /* the next random fraction, or -1 */
-
-#define TT 70 /* guaranteed separation between streams */
-#define is_odd(s) ((s)&1)
-
-#ifdef __STDC__
-void ranf_start(long seed)
-#else
-void ranf_start(seed) /* do this before using ranf_array */
- long seed; /* selector for different streams */
-#endif
-{
- register int t,s,j;
- double u[KK+KK-1];
- double ulp=(1.0/(1L<<30))/(1L<<22); /* 2 to the -52 */
- double ss=2.0*ulp*((seed&0x3fffffff)+2);
-
- for (j=0;j<KK;j++) {
- u[j]=ss; /* bootstrap the buffer */
- ss+=ss; if (ss>=1.0) ss-=1.0-2*ulp; /* cyclic shift of 51 bits */
- }
- u[1]+=ulp; /* make u[1] (and only u[1]) "odd" */
- for (s=seed&0x3fffffff,t=TT-1; t; ) {
- for (j=KK-1;j>0;j--)
- u[j+j]=u[j],u[j+j-1]=0.0; /* "square" */
- for (j=KK+KK-2;j>=KK;j--) {
- u[j-(KK-LL)]=mod_sum(u[j-(KK-LL)],u[j]);
- u[j-KK]=mod_sum(u[j-KK],u[j]);
- }
- if (is_odd(s)) { /* "multiply by z" */
- for (j=KK;j>0;j--) u[j]=u[j-1];
- u[0]=u[KK]; /* shift the buffer cyclically */
- u[LL]=mod_sum(u[LL],u[KK]);
- }
- if (s) s>>=1; else t--;
- }
- for (j=0;j<LL;j++) ran_u[j+KK-LL]=u[j];
- for (;j<KK;j++) ran_u[j-LL]=u[j];
- for (j=0;j<10;j++) ranf_array(u,KK+KK-1); /* warm things up */
- ranf_arr_ptr=&ranf_arr_started;
-}
-
-#define ranf_arr_next() (*ranf_arr_ptr>=0? *ranf_arr_ptr++: ranf_arr_cycle())
-double ranf_arr_cycle()
-{
- if (ranf_arr_ptr==&ranf_arr_dummy)
- ranf_start(314159L); /* the user forgot to initialize */
- ranf_array(ranf_arr_buf,QUALITY);
- ranf_arr_buf[KK]=-1;
- ranf_arr_ptr=ranf_arr_buf+1;
- return ranf_arr_buf[0];
-}
-
-#include <stdio.h>
-int main()
-{
- register int m; double a[2009]; /* a rudimentary test */
- ranf_start(310952);
- for (m=0;m<2009;m++) ranf_array(a,1009);
- printf("%.20f\n", ran_u[0]); /* 0.36410514377569680455 */
- /* beware of buggy printf routines that do not give full accuracy here! */
- ranf_start(310952);
- for (m=0;m<1009;m++) ranf_array(a,2009);
- printf("%.20f\n", ran_u[0]); /* 0.36410514377569680455 */
- return 0;
-}
diff --git a/src/intersim2/.svn/pristine/13/13e96ce60fa5bdc9726f48b5186ae562fcd4bbeb.svn-base b/src/intersim2/.svn/pristine/13/13e96ce60fa5bdc9726f48b5186ae562fcd4bbeb.svn-base
deleted file mode 100644
index 42bee23..0000000
--- a/src/intersim2/.svn/pristine/13/13e96ce60fa5bdc9726f48b5186ae562fcd4bbeb.svn-base
+++ /dev/null
@@ -1,53 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _BOOKSIM_CONFIG_HPP_
-#define _BOOKSIM_CONFIG_HPP_
-
-#include "config_utils.hpp"
-
-class BookSimConfig : public Configuration {
-protected:
-
-public:
- BookSimConfig( );
-};
-
-#endif
-
-#ifndef _POWER_CONFIG_HPP_
-#define _POWER_CONFIG_HPP_
-
-#include "config_utils.hpp"
-
-class PowerConfig : public Configuration {
-public:
- PowerConfig( );
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/14/14292d017cd222997f376c20ca99e10a17cb7e0c.svn-base b/src/intersim2/.svn/pristine/14/14292d017cd222997f376c20ca99e10a17cb7e0c.svn-base
deleted file mode 100644
index 07259a3..0000000
--- a/src/intersim2/.svn/pristine/14/14292d017cd222997f376c20ca99e10a17cb7e0c.svn-base
+++ /dev/null
@@ -1,319 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*kn.cpp
- *
- *Meshs, cube, torus
- *
- */
-
-#include "booksim.hpp"
-#include <vector>
-#include <sstream>
-#include "kncube.hpp"
-#include "random_utils.hpp"
-#include "misc_utils.hpp"
- //#include "iq_router.hpp"
-
-
-KNCube::KNCube( const Configuration &config, const string & name, bool mesh ) :
-Network( config, name )
-{
- _mesh = mesh;
-
- _ComputeSize( config );
- _Alloc( );
- _BuildNet( config );
-}
-
-void KNCube::_ComputeSize( const Configuration &config )
-{
- _k = config.GetInt( "k" );
- _n = config.GetInt( "n" );
-
- gK = _k; gN = _n;
- _size = powi( _k, _n );
- _channels = 2*_n*_size;
-
- _nodes = _size;
-}
-
-void KNCube::RegisterRoutingFunctions() {
-
-}
-void KNCube::_BuildNet( const Configuration &config )
-{
- int left_node;
- int right_node;
-
- int right_input;
- int left_input;
-
- int right_output;
- int left_output;
-
- ostringstream router_name;
-
- //latency type, noc or conventional network
- bool use_noc_latency;
- use_noc_latency = (config.GetInt("use_noc_latency")==1);
-
- for ( int node = 0; node < _size; ++node ) {
-
- router_name << "router";
-
- if ( _k > 1 ) {
- for ( int dim_offset = _size / _k; dim_offset >= 1; dim_offset /= _k ) {
- router_name << "_" << ( node / dim_offset ) % _k;
- }
- }
-
- _routers[node] = Router::NewRouter( config, this, router_name.str( ),
- node, 2*_n + 1, 2*_n + 1 );
- _timed_modules.push_back(_routers[node]);
-
- router_name.str("");
-
- for ( int dim = 0; dim < _n; ++dim ) {
-
- //find the neighbor
- left_node = _LeftNode( node, dim );
- right_node = _RightNode( node, dim );
-
- //
- // Current (N)ode
- // (L)eft node
- // (R)ight node
- //
- // L--->N<---R
- // L<---N--->R
- //
-
- // torus channel is longer due to wrap around
- int latency = _mesh ? 1 : 2 ;
-
- //get the input channel number
- right_input = _LeftChannel( right_node, dim );
- left_input = _RightChannel( left_node, dim );
-
- //add the input channel
- _routers[node]->AddInputChannel( _chan[right_input], _chan_cred[right_input] );
- _routers[node]->AddInputChannel( _chan[left_input], _chan_cred[left_input] );
-
- //set input channel latency
- if(use_noc_latency){
- _chan[right_input]->SetLatency( latency );
- _chan[left_input]->SetLatency( latency );
- _chan_cred[right_input]->SetLatency( latency );
- _chan_cred[left_input]->SetLatency( latency );
- } else {
- _chan[left_input]->SetLatency( 1 );
- _chan_cred[right_input]->SetLatency( 1 );
- _chan_cred[left_input]->SetLatency( 1 );
- _chan[right_input]->SetLatency( 1 );
- }
- //get the output channel number
- right_output = _RightChannel( node, dim );
- left_output = _LeftChannel( node, dim );
-
- //add the output channel
- _routers[node]->AddOutputChannel( _chan[right_output], _chan_cred[right_output] );
- _routers[node]->AddOutputChannel( _chan[left_output], _chan_cred[left_output] );
-
- //set output channel latency
- if(use_noc_latency){
- _chan[right_output]->SetLatency( latency );
- _chan[left_output]->SetLatency( latency );
- _chan_cred[right_output]->SetLatency( latency );
- _chan_cred[left_output]->SetLatency( latency );
- } else {
- _chan[right_output]->SetLatency( 1 );
- _chan[left_output]->SetLatency( 1 );
- _chan_cred[right_output]->SetLatency( 1 );
- _chan_cred[left_output]->SetLatency( 1 );
-
- }
- }
- //injection and ejection channel, always 1 latency
- _routers[node]->AddInputChannel( _inject[node], _inject_cred[node] );
- _routers[node]->AddOutputChannel( _eject[node], _eject_cred[node] );
- _inject[node]->SetLatency( 1 );
- _eject[node]->SetLatency( 1 );
- }
-}
-
-int KNCube::_LeftChannel( int node, int dim )
-{
- // The base channel for a node is 2*_n*node
- int base = 2*_n*node;
- // The offset for a left channel is 2*dim + 1
- int off = 2*dim + 1;
-
- return ( base + off );
-}
-
-int KNCube::_RightChannel( int node, int dim )
-{
- // The base channel for a node is 2*_n*node
- int base = 2*_n*node;
- // The offset for a right channel is 2*dim
- int off = 2*dim;
- return ( base + off );
-}
-
-int KNCube::_LeftNode( int node, int dim )
-{
- int k_to_dim = powi( _k, dim );
- int loc_in_dim = ( node / k_to_dim ) % _k;
- int left_node;
- // if at the left edge of the dimension, wraparound
- if ( loc_in_dim == 0 ) {
- left_node = node + (_k-1)*k_to_dim;
- } else {
- left_node = node - k_to_dim;
- }
-
- return left_node;
-}
-
-int KNCube::_RightNode( int node, int dim )
-{
- int k_to_dim = powi( _k, dim );
- int loc_in_dim = ( node / k_to_dim ) % _k;
- int right_node;
- // if at the right edge of the dimension, wraparound
- if ( loc_in_dim == ( _k-1 ) ) {
- right_node = node - (_k-1)*k_to_dim;
- } else {
- right_node = node + k_to_dim;
- }
-
- return right_node;
-}
-
-int KNCube::GetN( ) const
-{
- return _n;
-}
-
-int KNCube::GetK( ) const
-{
- return _k;
-}
-
-/*legacy, not sure how this fits into the own scheme of things*/
-void KNCube::InsertRandomFaults( const Configuration &config )
-{
- int num_fails;
- unsigned long prev_seed;
-
- int node, chan;
- int i, j, t, n, c;
- bool available;
-
- bool edge;
-
- num_fails = config.GetInt( "link_failures" );
-
- if ( _size && num_fails ) {
- prev_seed = RandomIntLong( );
- RandomSeed( config.GetInt( "fail_seed" ) );
-
- vector<bool> fail_nodes(_size);
-
- for ( i = 0; i < _size; ++i ) {
- node = i;
-
- // edge test
- edge = false;
- for ( n = 0; n < _n; ++n ) {
- if ( ( ( node % _k ) == 0 ) ||
- ( ( node % _k ) == _k - 1 ) ) {
- edge = true;
- }
- node /= _k;
- }
-
- if ( edge ) {
- fail_nodes[i] = true;
- } else {
- fail_nodes[i] = false;
- }
- }
-
- for ( i = 0; i < num_fails; ++i ) {
- j = RandomInt( _size - 1 );
- available = false;
-
- for ( t = 0; ( t < _size ) && (!available); ++t ) {
- node = ( j + t ) % _size;
-
- if ( !fail_nodes[node] ) {
- // check neighbors
- c = RandomInt( 2*_n - 1 );
-
- for ( n = 0; ( n < 2*_n ) && (!available); ++n ) {
- chan = ( n + c ) % 2*_n;
-
- if ( chan % 1 ) {
- available = fail_nodes[_LeftNode( node, chan/2 )];
- } else {
- available = fail_nodes[_RightNode( node, chan/2 )];
- }
- }
- }
-
- if ( !available ) {
- cout << "skipping " << node << endl;
- }
- }
-
- if ( t == _size ) {
- Error( "Could not find another possible fault channel" );
- }
-
-
- OutChannelFault( node, chan );
- fail_nodes[node] = true;
-
- for ( n = 0; ( n < _n ) && available ; ++n ) {
- fail_nodes[_LeftNode( node, n )] = true;
- fail_nodes[_RightNode( node, n )] = true;
- }
-
- cout << "failure at node " << node << ", channel "
- << chan << endl;
- }
-
- RandomSeed( prev_seed );
- }
-}
-
-double KNCube::Capacity( ) const
-{
- return (double)_k / ( _mesh ? 8.0 : 4.0 );
-}
diff --git a/src/intersim2/.svn/pristine/14/14cfb5d4ea815b6697d047697a25ef8cfb9e17de.svn-base b/src/intersim2/.svn/pristine/14/14cfb5d4ea815b6697d047697a25ef8cfb9e17de.svn-base
deleted file mode 100644
index ba64824..0000000
--- a/src/intersim2/.svn/pristine/14/14cfb5d4ea815b6697d047697a25ef8cfb9e17de.svn-base
+++ /dev/null
@@ -1,57 +0,0 @@
-// $Id$
-
-// Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// Redistributions of source code must retain the above copyright notice, this
-// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-//A single cross 10X10 cross bar under injection mode
-
-topology = fly;
-
-k = 10;
-n = 1;
-
-num_vcs = 8;
-
-vc_buf_size = 8;
-
-vc_allocator = separable_input_first;
-sw_allocator = separable_input_first;
-
-routing_function = dest_tag;
-
-traffic = uniform;
-
-use_read_write = 0;
-
-injection_rate = 1.0;
-
-
-
-
-sample_period = 100000;
-
-routing_delay = 0;
-vc_alloc_delay = 1;
-sw_alloc_delay = 1;
-st_final_delay = 1;
diff --git a/src/intersim2/.svn/pristine/15/1567f00df3a29e4f360b35e014b1f69cf281f55a.svn-base b/src/intersim2/.svn/pristine/15/1567f00df3a29e4f360b35e014b1f69cf281f55a.svn-base
deleted file mode 100644
index 5a20263..0000000
--- a/src/intersim2/.svn/pristine/15/1567f00df3a29e4f360b35e014b1f69cf281f55a.svn-base
+++ /dev/null
@@ -1,68 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _PRIO_ARB_HPP_
-#define _PRIO_ARB_HPP_
-
-#include <list>
-
-#include "module.hpp"
-#include "config_utils.hpp"
-
-class PriorityArbiter : public Module {
- int _rr_ptr;
-
-protected:
- const int _inputs;
-
- struct sRequest {
- int in;
- int label;
- int pri;
- };
-
- list<sRequest> _requests;
-
- int _match;
-
-public:
- PriorityArbiter( const Configuration &config,
- Module *parent, const string& name,
- int inputs );
-
- void Clear( );
-
- void AddRequest( int in, int label = 0, int pri = 0 );
- void RemoveRequest( int in, int label = 0 );
-
- int Match( ) const;
-
- void Arbitrate( );
- void Update( );
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/1a/1abf005acda7eb93dad10f55694f27a84ba74f91.svn-base b/src/intersim2/.svn/pristine/1a/1abf005acda7eb93dad10f55694f27a84ba74f91.svn-base
deleted file mode 100644
index cae1e45..0000000
--- a/src/intersim2/.svn/pristine/1a/1abf005acda7eb93dad10f55694f27a84ba74f91.svn-base
+++ /dev/null
@@ -1,111 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*wavefront.cpp
- *
- *The wave front allocator
- *
- */
-#include "booksim.hpp"
-
-#include "wavefront.hpp"
-
-Wavefront::Wavefront( Module *parent, const string& name,
- int inputs, int outputs, bool skip_diags ) :
- DenseAllocator( parent, name, inputs, outputs ),
- _last_in(-1), _last_out(-1), _skip_diags(skip_diags),
- _square(max(inputs, outputs)), _pri(0), _num_requests(0)
-{
-}
-
-void Wavefront::AddRequest( int in, int out, int label,
- int in_pri, int out_pri )
-{
- DenseAllocator::AddRequest(in, out, label, in_pri, out_pri);
- _num_requests++;
- _last_in = in;
- _last_out = out;
- _priorities.insert(make_pair(out_pri, in_pri));
-}
-
-void Wavefront::Allocate( )
-{
-
- int first_diag = -1;
-
- if(_num_requests == 0)
-
- // bypass allocator completely if there were no requests
- return;
-
- if(_num_requests == 1) {
-
- // if we only had a single request, we can immediately grant it
- _inmatch[_last_in] = _last_out;
- _outmatch[_last_out] = _last_in;
- first_diag = _last_in + _last_out;
-
- } else {
-
- // otherwise we have to loop through the diagonals of request matrix
-
- for(set<pair<int, int> >::const_reverse_iterator iter =
- _priorities.rbegin();
- iter != _priorities.rend(); ++iter) {
-
- for ( int p = 0; p < _square; ++p ) {
- for ( int output = 0; output < _square; ++output ) {
- int input = ( ( _pri + p ) + ( _square - output ) ) % _square;
- if ( ( input < _inputs ) && ( output < _outputs ) &&
- ( _inmatch[input] == -1 ) && ( _outmatch[output] == -1 ) &&
- ( _request[input][output].label != -1 ) &&
- ( _request[input][output].in_pri == iter->second ) &&
- ( _request[input][output].out_pri == iter->first ) ) {
- // Grant!
- _inmatch[input] = output;
- _outmatch[output] = input;
- if(first_diag < 0) {
- first_diag = input + output;
- }
- }
- }
- }
- }
- }
-
- _num_requests = 0;
- _last_in = -1;
- _last_out = -1;
- _priorities.clear();
-
- assert(first_diag >= 0);
-
- // Round-robin the priority diagonal
- _pri = ( ( _skip_diags ? first_diag : _pri ) + 1 ) % _square;
-}
-
-
diff --git a/src/intersim2/.svn/pristine/1a/1afc46cd26811b568cd238a5bb6cf4a3e9687edf.svn-base b/src/intersim2/.svn/pristine/1a/1afc46cd26811b568cd238a5bb6cf4a3e9687edf.svn-base
deleted file mode 100644
index 4df14c7..0000000
--- a/src/intersim2/.svn/pristine/1a/1afc46cd26811b568cd238a5bb6cf4a3e9687edf.svn-base
+++ /dev/null
@@ -1,54 +0,0 @@
-%{
-
-#include "y.tab.h"
-
-static unsigned int lineno = 1;
-
-void config_error(char * msg, int lineno);
-void yyerror(char * msg);
-
-extern int config_input(char *, int);
-#undef YY_INPUT
-#define YY_INPUT(b, r, ms) (r = config_input(b, ms))
-
-%}
-
-Digit [0-9]
-Exponent [eE][+-]?{Digit}+
-DblConst ({Digit}*\.)?{Digit}+{Exponent}?
-StrConst [A-Za-z_\-/\.][A-Za-z0-9_\-/\.\+(\{\,)\}]*
-
-%%
-
- /* Ignore comments and all spaces */
-
-\/\/[^\n]* ;
-[ \t\r]* ;
-
-\n { lineno++; }
-
- /* Commands */
-
-\{[A-Za-z0-9_\-\.(\{\,)\}]+(\,[A-Za-z0-9_\-\.(\{\,)\}]+)*\} { yylval.name = strdup( yytext ); return STR; }
-
--?[0-9]+ { yylval.num = atoi( yytext ); return NUM; }
-
--?[0-9]*\.[0-9]+ { yylval.fnum = atof( yytext ); return FNUM; }
-
--?{DblConst} { yylval.fnum = atof( yytext ); return FNUM;}
-
-{StrConst} { yylval.name = strdup( yytext ); return STR; }
-
-. { return yytext[0]; }
-
-%%
-
-void yyerror( char * msg )
-{
- config_error( msg, lineno );
-}
-
-int yywrap()
-{
- return 1;
-}
diff --git a/src/intersim2/.svn/pristine/1e/1e4194e8f6ff3aacdde8d0caf868ab69490d6a6c.svn-base b/src/intersim2/.svn/pristine/1e/1e4194e8f6ff3aacdde8d0caf868ab69490d6a6c.svn-base
deleted file mode 100644
index f1ad2fd..0000000
--- a/src/intersim2/.svn/pristine/1e/1e4194e8f6ff3aacdde8d0caf868ab69490d6a6c.svn-base
+++ /dev/null
@@ -1,447 +0,0 @@
-// $Id$
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*config_utils.cpp
- *
- *The configuration object which contained the parsed data from the
- *configuration file
- */
-
-#include "booksim.hpp"
-#include <iostream>
-#include <cstring>
-#include <sstream>
-#include <fstream>
-#include <cstdlib>
-
-#include "config_utils.hpp"
-
-Configuration *Configuration::theConfig = 0;
-
-Configuration::Configuration()
-{
- theConfig = this;
- _config_file = 0;
-}
-
-void Configuration::AddStrField(string const & field, string const & value)
-{
- _str_map[field] = value;
-}
-
-void Configuration::Assign(string const & field, string const & value)
-{
- map<string, string>::const_iterator match;
-
- match = _str_map.find(field);
- if(match != _str_map.end()) {
- _str_map[field] = value;
- } else {
- ParseError("Unknown string field: " + field);
- }
-}
-
-void Configuration::Assign(string const & field, int value)
-{
- map<string, int>::const_iterator match;
-
- match = _int_map.find(field);
- if(match != _int_map.end()) {
- _int_map[field] = value;
- } else {
- ParseError("Unknown integer field: " + field);
- }
-}
-
-void Configuration::Assign(string const & field, double value)
-{
- map<string, double>::const_iterator match;
-
- match = _float_map.find(field);
- if(match != _float_map.end()) {
- _float_map[field] = value;
- } else {
- ParseError("Unknown double field: " + field);
- }
-}
-
-string Configuration::GetStr(string const & field) const
-{
- map<string, string>::const_iterator match;
-
- match = _str_map.find(field);
- if(match != _str_map.end()) {
- return match->second;
- } else {
- ParseError("Unknown string field: " + field);
- exit(-1);
- }
-}
-
-int Configuration::GetInt(string const & field) const
-{
- map<string, int>::const_iterator match;
-
- match = _int_map.find(field);
- if(match != _int_map.end()) {
- return match->second;
- } else {
- ParseError("Unknown integer field: " + field);
- exit(-1);
- }
-}
-
-double Configuration::GetFloat(string const & field) const
-{
- map<string,double>::const_iterator match;
-
- match = _float_map.find(field);
- if(match != _float_map.end()) {
- return match->second;
- } else {
- ParseError("Unknown double field: " + field);
- exit(-1);
- }
-}
-
-vector<string> Configuration::GetStrArray(string const & field) const
-{
- string const param_str = GetStr(field);
- return tokenize_str(param_str);
-}
-
-vector<int> Configuration::GetIntArray(string const & field) const
-{
- string const param_str = GetStr(field);
- return tokenize_int(param_str);
-}
-
-vector<double> Configuration::GetFloatArray(string const & field) const
-{
- string const param_str = GetStr(field);
- return tokenize_float(param_str);
-}
-
-void Configuration::ParseFile(string const & filename)
-{
- if((_config_file = fopen(filename.c_str(), "r")) == 0) {
- cerr << "Could not open configuration file " << filename << endl;
- exit(-1);
- }
-
- yyparse();
-
- fclose(_config_file);
- _config_file = 0;
-}
-
-void Configuration::ParseString(string const & str)
-{
- _config_string = str + ';';
- yyparse();
- _config_string = "";
-}
-
-int Configuration::Input(char * line, int max_size)
-{
- int length = 0;
-
- if(_config_file) {
- length = fread(line, 1, max_size, _config_file);
- } else {
- length = _config_string.length();
- _config_string.copy(line, max_size);
- _config_string.clear();
- }
-
- return length;
-}
-
-void Configuration::ParseError(string const & msg, unsigned int lineno) const
-{
- if(lineno) {
- cerr << "Parse error on line " << lineno << " : " << msg << endl;
- } else {
- cerr << "Parse error : " << msg << endl;
- }
-
-
- exit( -1 );
-}
-
-Configuration * Configuration::GetTheConfig()
-{
- return theConfig;
-}
-
-//============================================================
-
-extern "C" void config_error( char const * msg, int lineno )
-{
- Configuration::GetTheConfig( )->ParseError( msg, lineno );
-}
-
-extern "C" void config_assign_string( char const * field, char const * value )
-{
- Configuration::GetTheConfig()->Assign(field, value);
-}
-
-extern "C" void config_assign_int( char const * field, int value )
-{
- Configuration::GetTheConfig()->Assign(field, value);
-}
-
-extern "C" void config_assign_float( char const * field, double value )
-{
- Configuration::GetTheConfig()->Assign(field, value);
-}
-
-extern "C" int config_input(char * line, int max_size)
-{
- return Configuration::GetTheConfig()->Input(line, max_size);
-}
-
-bool ParseArgs(Configuration * cf, int argc, char * * argv)
-{
- bool rc = false;
-
- //all dashed variables are ignored by the arg parser
- for(int i = 1; i < argc; ++i) {
- string arg(argv[i]);
- size_t pos = arg.find('=');
- bool dash = (argv[i][0] =='-');
- if(pos == string::npos && !dash) {
- // parse config file
- cf->ParseFile( argv[i] );
- ifstream in(argv[i]);
- cout << "BEGIN Configuration File: " << argv[i] << endl;
- while (!in.eof()) {
- char c;
- in.get(c);
- cout << c ;
- }
- cout << "END Configuration File: " << argv[i] << endl;
- rc = true;
- } else if(pos != string::npos) {
- // override individual parameter
- cout << "OVERRIDE Parameter: " << arg << endl;
- cf->ParseString(argv[i]);
- }
- }
-
- return rc;
-}
-
-
-//helpful for the GUI, write out nearly all variables contained in a config file.
-//However, it can't and won't write out empty strings since the booksim yacc
-//parser won't be abled to parse blank strings
-void Configuration::WriteFile(string const & filename) {
-
- ostream *config_out= new ofstream(filename.c_str());
-
-
- for(map<string,string>::const_iterator i = _str_map.begin();
- i!=_str_map.end();
- i++){
- //the parser won't read empty strings
- if(i->second[0]!='\0'){
- *config_out<<i->first<<" = "<<i->second<<";"<<endl;
- }
- }
-
- for(map<string, int>::const_iterator i = _int_map.begin();
- i!=_int_map.end();
- i++){
- *config_out<<i->first<<" = "<<i->second<<";"<<endl;
-
- }
-
- for(map<string, double>::const_iterator i = _float_map.begin();
- i!=_float_map.end();
- i++){
- *config_out<<i->first<<" = "<<i->second<<";"<<endl;
-
- }
- config_out->flush();
- delete config_out;
-
-}
-
-
-
-void Configuration::WriteMatlabFile(ostream * config_out) const {
-
-
-
- for(map<string,string>::const_iterator i = _str_map.begin();
- i!=_str_map.end();
- i++){
- //the parser won't read blanks lolz
- if(i->second[0]!='\0'){
- *config_out<<"%"<<i->first<<" = \'"<<i->second<<"\';"<<endl;
- }
- }
-
- for(map<string, int>::const_iterator i = _int_map.begin();
- i!=_int_map.end();
- i++){
- *config_out<<"%"<<i->first<<" = "<<i->second<<";"<<endl;
-
- }
-
- for(map<string, double>::const_iterator i = _float_map.begin();
- i!=_float_map.end();
- i++){
- *config_out<<"%"<<i->first<<" = "<<i->second<<";"<<endl;
-
- }
- config_out->flush();
-
-}
-
-vector<string> tokenize_str(string const & data)
-{
- vector<string> values;
-
- // no elements, no braces --> empty list
- if(data.empty()) {
- return values;
- }
-
- // doesn't start with an opening brace --> treat as single element
- // note that this element can potentially contain nested lists
- if(data[0] != '{') {
- values.push_back(data);
- return values;
- }
-
- size_t start = 1;
- int nested = 0;
-
- size_t curr = start;
-
- while(string::npos != (curr = data.find_first_of("{,}", curr))) {
-
- if(data[curr] == '{') {
- ++nested;
- } else if((data[curr] == '}') && nested) {
- --nested;
- } else if(!nested) {
- if(curr > start) {
- string token = data.substr(start, curr - start);
- values.push_back(token);
- }
- start = curr + 1;
- }
- ++curr;
- }
- assert(!nested);
-
- return values;
-}
-
-vector<int> tokenize_int(string const & data)
-{
- vector<int> values;
-
- // no elements, no braces --> empty list
- if(data.empty()) {
- return values;
- }
-
- // doesn't start with an opening brace --> treat as single element
- // note that this element can potentially contain nested lists
- if(data[0] != '{') {
- values.push_back(atoi(data.c_str()));
- return values;
- }
-
- size_t start = 1;
- int nested = 0;
-
- size_t curr = start;
-
- while(string::npos != (curr = data.find_first_of("{,}", curr))) {
-
- if(data[curr] == '{') {
- ++nested;
- } else if((data[curr] == '}') && nested) {
- --nested;
- } else if(!nested) {
- if(curr > start) {
- string token = data.substr(start, curr - start);
- values.push_back(atoi(token.c_str()));
- }
- start = curr + 1;
- }
- ++curr;
- }
- assert(!nested);
-
- return values;
-}
-
-vector<double> tokenize_float(string const & data)
-{
- vector<double> values;
-
- // no elements, no braces --> empty list
- if(data.empty()) {
- return values;
- }
-
- // doesn't start with an opening brace --> treat as single element
- // note that this element can potentially contain nested lists
- if(data[0] != '{') {
- values.push_back(atof(data.c_str()));
- return values;
- }
-
- size_t start = 1;
- int nested = 0;
-
- size_t curr = start;
-
- while(string::npos != (curr = data.find_first_of("{,}", curr))) {
-
- if(data[curr] == '{') {
- ++nested;
- } else if((data[curr] == '}') && nested) {
- --nested;
- } else if(!nested) {
- if(curr > start) {
- string token = data.substr(start, curr - start);
- values.push_back(atof(token.c_str()));
- }
- start = curr + 1;
- }
- ++curr;
- }
- assert(!nested);
-
- return values;
-}
diff --git a/src/intersim2/.svn/pristine/1f/1f35cbdd9ebe1ee0a41e949e03d51d268ac55bad.svn-base b/src/intersim2/.svn/pristine/1f/1f35cbdd9ebe1ee0a41e949e03d51d268ac55bad.svn-base
deleted file mode 100644
index 9ac579a..0000000
--- a/src/intersim2/.svn/pristine/1f/1f35cbdd9ebe1ee0a41e949e03d51d268ac55bad.svn-base
+++ /dev/null
@@ -1,97 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _PIPEFIFO_HPP_
-#define _PIPEFIFO_HPP_
-
-#include <vector>
-
-#include "module.hpp"
-
-template<class T> class PipelineFIFO : public Module {
- int _lanes;
- int _depth;
-
- int _pipe_len;
- int _pipe_ptr;
-
- vector<vector<T*> > _data;
-
-public:
- PipelineFIFO( Module *parent, const string& name, int lanes, int depth );
- ~PipelineFIFO( );
-
- void Write( T* val, int lane = 0 );
- void WriteAll( T* val );
-
- T* Read( int lane = 0 );
-
- void Advance( );
-};
-
-template<class T> PipelineFIFO<T>::PipelineFIFO( Module *parent,
- const string& name,
- int lanes, int depth ) :
- Module( parent, name ),
- _lanes( lanes ), _depth( depth )
-{
- _pipe_len = depth + 1;
- _pipe_ptr = 0;
-
- _data.resize(_lanes);
- for ( int l = 0; l < _lanes; ++l ) {
- _data[l].resize(_pipe_len, 0);
- }
-}
-
-template<class T> PipelineFIFO<T>::~PipelineFIFO( )
-{
-}
-
-template<class T> void PipelineFIFO<T>::Write( T* val, int lane )
-{
- _data[lane][_pipe_ptr] = val;
-}
-
-template<class T> void PipelineFIFO<T>::WriteAll( T* val )
-{
- for ( int l = 0; l < _lanes; ++l ) {
- _data[l][_pipe_ptr] = val;
- }
-}
-
-template<class T> T* PipelineFIFO<T>::Read( int lane )
-{
- return _data[lane][_pipe_ptr];
-}
-
-template<class T> void PipelineFIFO<T>::Advance( )
-{
- _pipe_ptr = ( _pipe_ptr + 1 ) % _pipe_len;
-}
-
-#endif
diff --git a/src/intersim2/.svn/pristine/1f/1f6b483285599def0e7fea5379c0af7a176d2736.svn-base b/src/intersim2/.svn/pristine/1f/1f6b483285599def0e7fea5379c0af7a176d2736.svn-base
deleted file mode 100644
index baded43..0000000
--- a/src/intersim2/.svn/pristine/1f/1f6b483285599def0e7fea5379c0af7a176d2736.svn-base
+++ /dev/null
@@ -1,223 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*vc.cpp
- *
- *this class describes a virtual channel in a router
- *it includes buffers and virtual channel state and controls
- *
- *This class calls the routing functions
- */
-
-#include <limits>
-#include <sstream>
-
-#include "globals.hpp"
-#include "booksim.hpp"
-#include "vc.hpp"
-
-const char * const VC::VCSTATE[] = {"idle",
- "routing",
- "vc_alloc",
- "active"};
-
-VC::VC( const Configuration& config, int outputs,
- Module *parent, const string& name )
- : Module( parent, name ),
- _state(idle), _out_port(-1), _out_vc(-1), _pri(0), _watched(false),
- _expected_pid(-1), _last_id(-1), _last_pid(-1)
-{
- _lookahead_routing = !config.GetInt("routing_delay");
- _route_set = _lookahead_routing ? NULL : new OutputSet( );
-
- string priority = config.GetStr( "priority" );
- if ( priority == "local_age" ) {
- _pri_type = local_age_based;
- } else if ( priority == "queue_length" ) {
- _pri_type = queue_length_based;
- } else if ( priority == "hop_count" ) {
- _pri_type = hop_count_based;
- } else if ( priority == "none" ) {
- _pri_type = none;
- } else {
- _pri_type = other;
- }
-
- _priority_donation = config.GetInt("vc_priority_donation");
-}
-
-VC::~VC()
-{
- if(!_lookahead_routing) {
- delete _route_set;
- }
-}
-
-void VC::AddFlit( Flit *f )
-{
- assert(f);
-
- if(_expected_pid >= 0) {
- if(f->pid != _expected_pid) {
- ostringstream err;
- err << "Received flit " << f->id << " with unexpected packet ID: " << f->pid
- << " (expected: " << _expected_pid << ")";
- Error(err.str());
- } else if(f->tail) {
- _expected_pid = -1;
- }
- } else if(!f->tail) {
- _expected_pid = f->pid;
- }
-
- // update flit priority before adding to VC buffer
- if(_pri_type == local_age_based) {
- f->pri = numeric_limits<int>::max() - GetSimTime();
- assert(f->pri >= 0);
- } else if(_pri_type == hop_count_based) {
- f->pri = f->hops;
- assert(f->pri >= 0);
- }
-
- _buffer.push_back(f);
- UpdatePriority();
-}
-
-Flit *VC::RemoveFlit( )
-{
- Flit *f = NULL;
- if ( !_buffer.empty( ) ) {
- f = _buffer.front( );
- _buffer.pop_front( );
- _last_id = f->id;
- _last_pid = f->pid;
- UpdatePriority();
- } else {
- Error("Trying to remove flit from empty buffer.");
- }
- return f;
-}
-
-
-
-void VC::SetState( eVCState s )
-{
- Flit * f = FrontFlit();
-
- if(f && f->watch)
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Changing state from " << VC::VCSTATE[_state]
- << " to " << VC::VCSTATE[s] << "." << endl;
-
- _state = s;
-}
-
-const OutputSet *VC::GetRouteSet( ) const
-{
- return _route_set;
-}
-
-void VC::SetRouteSet( OutputSet * output_set )
-{
- _route_set = output_set;
- _out_port = -1;
- _out_vc = -1;
-}
-
-void VC::SetOutput( int port, int vc )
-{
- _out_port = port;
- _out_vc = vc;
-}
-
-void VC::UpdatePriority()
-{
- if(_buffer.empty()) return;
- if(_pri_type == queue_length_based) {
- _pri = _buffer.size();
- } else if(_pri_type != none) {
- Flit * f = _buffer.front();
- if((_pri_type != local_age_based) && _priority_donation) {
- Flit * df = f;
- for(size_t i = 1; i < _buffer.size(); ++i) {
- Flit * bf = _buffer[i];
- if(bf->pri > df->pri) df = bf;
- }
- if((df != f) && (df->watch || f->watch)) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Flit " << df->id
- << " donates priority to flit " << f->id
- << "." << endl;
- }
- f = df;
- }
- if(f->watch)
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Flit " << f->id
- << " sets priority to " << f->pri
- << "." << endl;
- _pri = f->pri;
- }
-}
-
-
-void VC::Route( tRoutingFunction rf, const Router* router, const Flit* f, int in_channel )
-{
- rf( router, f, in_channel, _route_set, false );
- _out_port = -1;
- _out_vc = -1;
-}
-
-// ==== Debug functions ====
-
-void VC::SetWatch( bool watch )
-{
- _watched = watch;
-}
-
-bool VC::IsWatched( ) const
-{
- return _watched;
-}
-
-void VC::Display( ostream & os ) const
-{
- if ( _state != VC::idle ) {
- os << FullName() << ": "
- << " state: " << VCSTATE[_state];
- if(_state == VC::active) {
- os << " out_port: " << _out_port
- << " out_vc: " << _out_vc;
- }
- os << " fill: " << _buffer.size();
- if(!_buffer.empty()) {
- os << " front: " << _buffer.front()->id;
- }
- os << " pri: " << _pri;
- os << endl;
- }
-}
diff --git a/src/intersim2/.svn/pristine/23/235d7e656a8ce9818d81cd7eb47ca78febbe438a.svn-base b/src/intersim2/.svn/pristine/23/235d7e656a8ce9818d81cd7eb47ca78febbe438a.svn-base
deleted file mode 100644
index ef62dfd..0000000
--- a/src/intersim2/.svn/pristine/23/235d7e656a8ce9818d81cd7eb47ca78febbe438a.svn-base
+++ /dev/null
@@ -1,62 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _KNCUBE_HPP_
-#define _KNCUBE_HPP_
-
-#include "network.hpp"
-
-class KNCube : public Network {
-
- bool _mesh;
-
- int _k;
- int _n;
-
- void _ComputeSize( const Configuration &config );
- void _BuildNet( const Configuration &config );
-
- int _LeftChannel( int node, int dim );
- int _RightChannel( int node, int dim );
-
- int _LeftNode( int node, int dim );
- int _RightNode( int node, int dim );
-
-public:
- KNCube( const Configuration &config, const string & name, bool mesh );
- static void RegisterRoutingFunctions();
-
- int GetN( ) const;
- int GetK( ) const;
-
- double Capacity( ) const;
-
- void InsertRandomFaults( const Configuration &config );
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/24/244c1dc93f9a90c660c06c653d3809b739d40458.svn-base b/src/intersim2/.svn/pristine/24/244c1dc93f9a90c660c06c653d3809b739d40458.svn-base
deleted file mode 100644
index 7c6ade8..0000000
--- a/src/intersim2/.svn/pristine/24/244c1dc93f9a90c660c06c653d3809b739d40458.svn-base
+++ /dev/null
@@ -1,68 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _BUFFER_MONITOR_HPP_
-#define _BUFFER_MONITOR_HPP_
-
-#include <vector>
-#include <iostream>
-
-using namespace std;
-
-class Flit;
-
-class BufferMonitor {
- int _cycles ;
- int _inputs ;
- int _classes ;
- vector<int> _reads ;
- vector<int> _writes ;
- int index( int input, int cl ) const ;
-public:
- BufferMonitor( int inputs, int classes ) ;
- void cycle() ;
- void write( int input, Flit const * f ) ;
- void read( int input, Flit const * f ) ;
- inline const vector<int> & GetReads() const {
- return _reads;
- }
- inline const vector<int> & GetWrites() const {
- return _writes;
- }
- inline int NumInputs() const {
- return _inputs;
- }
- inline int NumClasses() const {
- return _classes;
- }
- void display(ostream & os) const;
-
-} ;
-
-ostream & operator<<( ostream & os, BufferMonitor const & obj ) ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/2a/2a04a186dfedaa33f2a0336556c086868dd6ccfc.svn-base b/src/intersim2/.svn/pristine/2a/2a04a186dfedaa33f2a0336556c086868dd6ccfc.svn-base
deleted file mode 100644
index 3bdbd7b..0000000
--- a/src/intersim2/.svn/pristine/2a/2a04a186dfedaa33f2a0336556c086868dd6ccfc.svn-base
+++ /dev/null
@@ -1,174 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _TRAFFIC_HPP_
-#define _TRAFFIC_HPP_
-
-#include <vector>
-#include <set>
-#include "config_utils.hpp"
-
-using namespace std;
-
-class TrafficPattern {
-protected:
- int _nodes;
- TrafficPattern(int nodes);
-public:
- virtual ~TrafficPattern() {}
- virtual void reset();
- virtual int dest(int source) = 0;
- static TrafficPattern * New(string const & pattern, int nodes,
- Configuration const * const config = NULL);
-};
-
-class PermutationTrafficPattern : public TrafficPattern {
-protected:
- PermutationTrafficPattern(int nodes);
-};
-
-class BitPermutationTrafficPattern : public PermutationTrafficPattern {
-protected:
- BitPermutationTrafficPattern(int nodes);
-};
-
-class BitCompTrafficPattern : public BitPermutationTrafficPattern {
-public:
- BitCompTrafficPattern(int nodes);
- virtual int dest(int source);
-};
-
-class TransposeTrafficPattern : public BitPermutationTrafficPattern {
-protected:
- int _shift;
-public:
- TransposeTrafficPattern(int nodes);
- virtual int dest(int source);
-};
-
-class BitRevTrafficPattern : public BitPermutationTrafficPattern {
-public:
- BitRevTrafficPattern(int nodes);
- virtual int dest(int source);
-};
-
-class ShuffleTrafficPattern : public BitPermutationTrafficPattern {
-public:
- ShuffleTrafficPattern(int nodes);
- virtual int dest(int source);
-};
-
-class DigitPermutationTrafficPattern : public PermutationTrafficPattern {
-protected:
- int _k;
- int _n;
- int _xr;
- DigitPermutationTrafficPattern(int nodes, int k, int n, int xr = 1);
-};
-
-class TornadoTrafficPattern : public DigitPermutationTrafficPattern {
-public:
- TornadoTrafficPattern(int nodes, int k, int n, int xr = 1);
- virtual int dest(int source);
-};
-
-class NeighborTrafficPattern : public DigitPermutationTrafficPattern {
-public:
- NeighborTrafficPattern(int nodes, int k, int n, int xr = 1);
- virtual int dest(int source);
-};
-
-class RandomPermutationTrafficPattern : public TrafficPattern {
-private:
- vector<int> _dest;
- inline void randomize(int seed);
-public:
- RandomPermutationTrafficPattern(int nodes, int seed);
- virtual int dest(int source);
-};
-
-class RandomTrafficPattern : public TrafficPattern {
-protected:
- RandomTrafficPattern(int nodes);
-};
-
-class UniformRandomTrafficPattern : public RandomTrafficPattern {
-public:
- UniformRandomTrafficPattern(int nodes);
- virtual int dest(int source);
-};
-
-class UniformBackgroundTrafficPattern : public RandomTrafficPattern {
-private:
- set<int> _excluded;
-public:
- UniformBackgroundTrafficPattern(int nodes, vector<int> excluded_nodes);
- virtual int dest(int source);
-};
-
-class DiagonalTrafficPattern : public RandomTrafficPattern {
-public:
- DiagonalTrafficPattern(int nodes);
- virtual int dest(int source);
-};
-
-class AsymmetricTrafficPattern : public RandomTrafficPattern {
-public:
- AsymmetricTrafficPattern(int nodes);
- virtual int dest(int source);
-};
-
-class Taper64TrafficPattern : public RandomTrafficPattern {
-public:
- Taper64TrafficPattern(int nodes);
- virtual int dest(int source);
-};
-
-class BadPermDFlyTrafficPattern : public DigitPermutationTrafficPattern {
-public:
- BadPermDFlyTrafficPattern(int nodes, int k, int n);
- virtual int dest(int source);
-};
-
-class BadPermYarcTrafficPattern : public DigitPermutationTrafficPattern {
-public:
- BadPermYarcTrafficPattern(int nodes, int k, int n, int xr = 1);
- virtual int dest(int source);
-};
-
-class HotSpotTrafficPattern : public TrafficPattern {
-private:
- vector<int> _hotspots;
- vector<int> _rates;
- int _max_val;
-public:
- HotSpotTrafficPattern(int nodes, vector<int> hotspots,
- vector<int> rates = vector<int>());
- virtual int dest(int source);
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/2c/2ca444c5a28eb3f8aaffcf0702edd18d4fe31fad.svn-base b/src/intersim2/.svn/pristine/2c/2ca444c5a28eb3f8aaffcf0702edd18d4fe31fad.svn-base
deleted file mode 100644
index 9ee46ab..0000000
--- a/src/intersim2/.svn/pristine/2c/2ca444c5a28eb3f8aaffcf0702edd18d4fe31fad.svn-base
+++ /dev/null
@@ -1,61 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _RANDOM_UTILS_HPP_
-#define _RANDOM_UTILS_HPP_
-
- // interface to Knuth's RANARRAY RNG
-void ran_start(long seed);
-long ran_next( );
-void ranf_start(long seed);
-double ranf_next( );
-
-inline void RandomSeed( long seed ) {
- ran_start( seed );
- ranf_start( seed );
-}
-
-inline unsigned long RandomIntLong( ) {
- return ran_next( );
-}
-
-// Returns a random integer in the range [0,max]
-inline int RandomInt( int max ) {
- return ( ran_next( ) % (max+1) );
-}
-
-// Returns a random floating-point value in the rage [0,1]
-inline double RandomFloat( ) {
- return ranf_next( );
-}
-
-// Returns a random floating-point value in the rage [0,max]
-inline double RandomFloat( double max ) {
- return ( ranf_next( ) * max );
-}
-
-#endif
diff --git a/src/intersim2/.svn/pristine/2e/2e9094d44209e8c6464b2834012a6dc9dd860340.svn-base b/src/intersim2/.svn/pristine/2e/2e9094d44209e8c6464b2834012a6dc9dd860340.svn-base
deleted file mode 100644
index 006b06b..0000000
--- a/src/intersim2/.svn/pristine/2e/2e9094d44209e8c6464b2834012a6dc9dd860340.svn-base
+++ /dev/null
@@ -1,501 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*anynet
- *
- *Network setup file format
- *example 1:
- *router 0 router 1 15 router 2
- *
- *Router 0 is connect to router 1 with a 15-cycle channel, and router 0 is connected to
- * router 2 with a 1-cycle channel, the channels latency are unidirectional, so channel
- * from router 1 back to router 0 is only single-cycle because it was not specified
- *
- *example 2:
- *router 0 node 0 node 1 5 node 2 5
- *
- *Router 0 is directly connected to node 0-2. Channel latency is 5cycles for 1 and 2. In
- * this case the latency specification is bidirectional, the injeciton and ejection lat
- * for node 1 and 2 are 5-cycle
- *
- *other notes:
- *
- *Router and node numbers must be sequential starting with 0
- *Credit channel latency follows the channel latency, even though it travels in revse
- * direction this might not be desired
- *
- */
-
-#include "anynet.hpp"
-#include <fstream>
-#include <sstream>
-#include <limits>
-#include <algorithm>
-//this is a hack, I can't easily get the routing talbe out of the network
-map<int, int>* global_routing_table;
-
-AnyNet::AnyNet( const Configuration &config, const string & name )
- : Network( config, name ){
-
- router_list.resize(2);
- _ComputeSize( config );
- _Alloc( );
- _BuildNet( config );
-}
-
-AnyNet::~AnyNet(){
- for(int i = 0; i < 2; ++i) {
- for(map<int, map<int, pair<int,int> > >::iterator iter = router_list[i].begin();
- iter != router_list[i].end();
- ++iter) {
- iter->second.clear();
- }
- }
-}
-
-void AnyNet::_ComputeSize( const Configuration &config ){
- file_name = config.GetStr("network_file");
- if(file_name==""){
- cout<<"No network file name provided"<<endl;
- exit(-1);
- }
- //parse the network description file
- readFile();
-
- _channels =0;
- cout<<"========================Network File Parsed=================\n";
- cout<<"******************node listing**********************\n";
- map<int, int >::iterator iter;
- for(iter = node_list.begin(); iter!=node_list.end(); iter++){
- cout<<"Node "<<iter->first;
- cout<<"\tRouter "<<iter->second<<endl;
- }
-
- map<int, map<int, pair<int,int> > >::iterator iter3;
- cout<<"\n****************router to node listing*************\n";
- for(iter3 = router_list[0].begin(); iter3!=router_list[0].end(); iter3++){
- cout<<"Router "<<iter3->first<<endl;
- map<int, pair<int,int> >::iterator iter2;
- for(iter2 = iter3->second.begin();
- iter2!=iter3->second.end();
- iter2++){
- cout<<"\t Node "<<iter2->first<<" lat "<<iter2->second.second<<endl;
- }
- }
-
- cout<<"\n*****************router to router listing************\n";
- for(iter3 = router_list[1].begin(); iter3!=router_list[1].end(); iter3++){
- cout<<"Router "<<iter3->first<<endl;
- map<int, pair<int,int> >::iterator iter2;
- if(iter3->second.size() == 0){
- cout<<"Caution Router "<<iter3->first
- <<" is not connected to any other Router\n"<<endl;
- }
- for(iter2 = iter3->second.begin();
- iter2!=iter3->second.end();
- iter2++){
- cout<<"\t Router "<<iter2->first<<" lat "<<iter2->second.second<<endl;
- _channels++;
- }
- }
-
- _size = router_list[1].size();
- _nodes = node_list.size();
-
-}
-
-
-
-void AnyNet::_BuildNet( const Configuration &config ){
-
-
- //I need to keep track the output ports for each router during build
- int * outport = (int*)malloc(sizeof(int)*_size);
- for(int i = 0; i<_size; i++){outport[i] = 0;}
-
- cout<<"==========================Node to Router =====================\n";
- //adding the injection/ejection chanenls first
- map<int, map<int, pair<int,int> > >::iterator niter;
- for(niter = router_list[0].begin(); niter!=router_list[0].end(); niter++){
- map<int, map<int, pair<int,int> > >::iterator riter = router_list[1].find(niter->first);
- //calculate radix
- int radix = niter->second.size()+riter->second.size();
- int node = niter->first;
- cout<<"router "<<node<<" radix "<<radix<<endl;
- //decalre the routers
- ostringstream router_name;
- router_name << "router";
- router_name << "_" << node ;
- _routers[node] = Router::NewRouter( config, this, router_name.str( ),
- node, radix, radix );
- _timed_modules.push_back(_routers[node]);
- //add injeciton ejection channels
- map<int, pair<int,int> >::iterator nniter;
- for(nniter = niter->second.begin();nniter!=niter->second.end(); nniter++){
- int link = nniter->first;
- //add the outport port assined to the map
- (niter->second)[link].first = outport[node];
- outport[node]++;
- cout<<"\t connected to node "<<link<<" at outport "<<nniter->second.first
- <<" lat "<<nniter->second.second<<endl;
- _inject[link]->SetLatency(nniter->second.second);
- _inject_cred[link]->SetLatency(nniter->second.second);
- _eject[link]->SetLatency(nniter->second.second);
- _eject_cred[link]->SetLatency(nniter->second.second);
-
- _routers[node]->AddInputChannel( _inject[link], _inject_cred[link] );
- _routers[node]->AddOutputChannel( _eject[link], _eject_cred[link] );
- }
-
- }
-
- cout<<"==========================Router to Router =====================\n";
- //add inter router channels
- //since there is no way to systematically number the channels we just start from 0
- //the map, is a mapping of output->input
- int channel_count = 0;
- for(niter = router_list[0].begin(); niter!=router_list[0].end(); niter++){
- map<int, map<int, pair<int,int> > >::iterator riter = router_list[1].find(niter->first);
- int node = niter->first;
- map<int, pair<int,int> >::iterator rriter;
- cout<<"router "<<node<<endl;
- for(rriter = riter->second.begin();rriter!=riter->second.end(); rriter++){
- int other_node = rriter->first;
- int link = channel_count;
- //add the outport port assined to the map
- (riter->second)[other_node].first = outport[node];
- outport[node]++;
- cout<<"\t connected to router "<<other_node<<" using link "<<link
- <<" at outport "<<rriter->second.first
- <<" lat "<<rriter->second.second<<endl;
-
- _chan[link]->SetLatency(rriter->second.second);
- _chan_cred[link]->SetLatency(rriter->second.second);
-
- _routers[node]->AddOutputChannel( _chan[link], _chan_cred[link] );
- _routers[other_node]->AddInputChannel( _chan[link], _chan_cred[link]);
- channel_count++;
- }
- }
-
- buildRoutingTable();
-
-}
-
-
-void AnyNet::RegisterRoutingFunctions() {
- gRoutingFunctionMap["min_anynet"] = &min_anynet;
-}
-
-void min_anynet( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject ){
- int out_port=-1;
- if(!inject){
- assert(global_routing_table[r->GetID()].count(f->dest)!=0);
- out_port=global_routing_table[r->GetID()][f->dest];
- }
-
-
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-void AnyNet::buildRoutingTable(){
- cout<<"========================== Routing table =====================\n";
- routing_table.resize(_size);
- for(int i = 0; i<_size; i++){
- route(i);
- }
- global_routing_table = &routing_table[0];
-}
-
-
-//11/7/2012
-//basically djistra's, tested on a large dragonfly anynet configuration
-void AnyNet::route(int r_start){
- int* dist = new int[_size];
- int* prev = new int[_size];
- set<int> rlist;
- for(int i = 0; i<_size; i++){
- dist[i] = numeric_limits<int>::max();
- prev[i] = -1;
- rlist.insert(i);
- }
- dist[r_start] = 0;
- while(!rlist.empty()){
- //find min
- int min_dist = numeric_limits<int>::max();
- int min_cand = -1;
- for(set<int>::iterator i = rlist.begin();
- i!=rlist.end();
- i++){
- if(dist[*i]<min_dist){
- min_dist = dist[*i];
- min_cand = *i;
- }
- }
- rlist.erase(min_cand);
-
- //neighbor
- for(map<int,pair<int,int> >::iterator i = router_list[1][min_cand].begin();
- i!=router_list[1][min_cand].end();
- i++){
- int new_dist = dist[min_cand] + i->second.second;//distance is hops not cycles
- if(new_dist < dist[i->first]){
- dist[i->first] = new_dist;
- prev[i->first] = min_cand;
- }
- }
- }
-
- //post process from the prev list
- for(int i = 0; i<_size; i++){
- if(prev[i] ==-1){ //self
- assert(i == r_start);
- for(map<int, pair<int, int> >::iterator iter = router_list[0][i].begin();
- iter!=router_list[0][i].end();
- iter++){
- routing_table[r_start][iter->first]=iter->second.first;
- //cout<<"node "<<iter->first<<" port "<< iter->second.first<<endl;
- }
- } else {
- int distance=0;
- int neighbor=i;
- while(prev[neighbor]!=r_start){
- assert(router_list[1][neighbor].count(prev[neighbor])>0);
- distance+=router_list[1][prev[neighbor]][neighbor].second;//REVERSE lat
- neighbor= prev[neighbor];
- }
- distance+=router_list[1][prev[neighbor]][neighbor].second;//lat
-
- assert( router_list[1][r_start].count(neighbor)!=0);
- int port = router_list[1][r_start][neighbor].first;
- for(map<int, pair<int,int> >::iterator iter = router_list[0][i].begin();
- iter!=router_list[0][i].end();
- iter++){
- routing_table[r_start][iter->first]=port;
- //cout<<"node "<<iter->first<<" port "<< port<<" dist "<<distance<<endl;
- }
- }
- }
-}
-
-
-void AnyNet::readFile(){
-
- ifstream network_list;
- string line;
- enum ParseState{HEAD_TYPE=0,
- HEAD_ID,
- BODY_TYPE,
- BODY_ID,
- LINK_WEIGHT};
- enum ParseType{NODE=0,
- ROUTER,
- UNKNOWN};
-
- network_list.open(file_name.c_str());
- if(!network_list.is_open()){
- cout<<"Anynet:can't open network file "<<file_name<<endl;
- exit(-1);
- }
-
- //loop through the entire file
- while(!network_list.eof()){
- getline(network_list,line);
- if(line==""){
- continue;
- }
-
- ParseState state=HEAD_TYPE;
- //position to parse out white sspace
- int pos = 0;
- int next_pos=-1;
- string temp;
- //the first node and its type
- int head_id = -1;
- ParseType head_type = UNKNOWN;
- //stuff that head are linked to
- ParseType body_type = UNKNOWN;
- int body_id = -1;
- int link_weight = 1;
-
- do{
-
- //skip empty spaces
- next_pos = line.find(" ",pos);
- temp = line.substr(pos,next_pos-pos);
- pos = next_pos+1;
- if(temp=="" || temp==" "){
- continue;
- }
-
- switch(state){
- case HEAD_TYPE:
- if(temp=="router"){
- head_type = ROUTER;
- } else if (temp == "node"){
- head_type = NODE;
- } else {
- cout<<"Anynet:Unknow head of line type "<<temp<<"\n";
- assert(false);
- }
- state=HEAD_ID;
- break;
- case HEAD_ID:
- //need better error check
- head_id = atoi(temp.c_str());
-
- //intialize router structures
- if(router_list[NODE].count(head_id) == 0){
- router_list[NODE][head_id] = map<int, pair<int,int> >();
- }
- if(router_list[ROUTER].count(head_id) == 0){
- router_list[ROUTER][head_id] = map<int, pair<int,int> >();
- }
-
- state=BODY_TYPE;
- break;
- case LINK_WEIGHT:
- if(temp=="router"||
- temp == "node"){
- //ignore
- } else {
- link_weight= atoi(temp.c_str());
- router_list[head_type][head_id][body_id].second=link_weight;
- break;
- }
- //intentionally letting it flow through
- case BODY_TYPE:
- if(temp=="router"){
- body_type = ROUTER;
- } else if (temp == "node"){
- body_type = NODE;
- } else {
- cout<<"Anynet:Unknow body type "<<temp<<"\n";
- assert(false);
- }
- state=BODY_ID;
- break;
- case BODY_ID:
- body_id = atoi(temp.c_str());
- //intialize router structures if necessary
- if(body_type==ROUTER){
- if(router_list[NODE].count(body_id) ==0){
- router_list[NODE][body_id] = map<int, pair<int,int> >();
- }
- if(router_list[ROUTER].count(body_id) == 0){
- router_list[ROUTER][body_id] = map<int, pair<int,int> >();
- }
- }
-
- if(head_type==NODE && body_type==NODE){
-
- cout<<"Anynet:Cannot connect node to node "<<temp<<"\n";
- assert(false);
-
- } else if(head_type==NODE && body_type==ROUTER){
-
- if(node_list.count(head_id)!=0 &&
- node_list[head_id]!=body_id){
- cout<<"Anynet:Node "<<body_id<<" trying to connect to multiple router "
- <<body_id<<" and "<<node_list[head_id]<<endl;
- assert(false);
- }
- node_list[head_id]=body_id;
- router_list[NODE][body_id][head_id]=pair<int, int>(-1,1);
-
- } else if(head_type==ROUTER && body_type==NODE){
- //insert and check node
- if(node_list.count(body_id) != 0 &&
- node_list[body_id]!=head_id){
- cout<<"Anynet:Node "<<body_id<<" trying to connect to multiple router "
- <<body_id<<" and "<<node_list[head_id]<<endl;
- assert(false);
- }
- node_list[body_id] = head_id;
- router_list[NODE][head_id][body_id]=pair<int, int>(-1,1);
-
- } else if(head_type==ROUTER && body_type==ROUTER){
- router_list[ROUTER][head_id][body_id]=pair<int, int>(-1,1);
- if(router_list[ROUTER][body_id].count(head_id)==0){
- router_list[ROUTER][body_id][head_id]=pair<int, int>(-1,1);
- }
- }
- state=LINK_WEIGHT;
- break ;
- default:
- cout<<"Anynet:Unknow parse state\n";
- assert(false);
- break;
- }
-
- } while(pos!=0);
- if(state!=LINK_WEIGHT &&
- state!=BODY_TYPE){
- cout<<"Anynet:Incomplete parse of the line: "<<line<<endl;
- }
-
- }
-
- //map verification, make sure the information contained in bother maps
- //are the same
- assert(router_list[0].size() == router_list[1].size());
-
- //traffic generator assumes node list is sequenctial and starts at 0
- vector<int> node_check;
- for(map<int,int>::iterator i = node_list.begin();
- i!=node_list.end();
- i++){
- node_check.push_back(i->first);
- }
- sort(node_check.begin(), node_check.end());
- for(size_t i = 0; i<node_check.size(); i++){
- if(node_check[i] != i){
- cout<<"Anynet:booksim trafficmanager assumes sequential node numbering starting at 0\n";
- assert(false);
- }
- }
-
-}
-
diff --git a/src/intersim2/.svn/pristine/2f/2ff946ea4e0a43b74a424e711f7489085c496e3a.svn-base b/src/intersim2/.svn/pristine/2f/2ff946ea4e0a43b74a424e711f7489085c496e3a.svn-base
deleted file mode 100644
index 5eacc21..0000000
--- a/src/intersim2/.svn/pristine/2f/2ff946ea4e0a43b74a424e711f7489085c496e3a.svn-base
+++ /dev/null
@@ -1,121 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// Matrix: Matrix Arbiter
-//
-// ----------------------------------------------------------------------
-
-#include "matrix_arb.hpp"
-#include <iostream>
-using namespace std ;
-
-MatrixArbiter::MatrixArbiter( Module *parent, const string &name, int size )
- : Arbiter( parent, name, size ), _last_req(-1) {
- _matrix.resize(size);
- for ( int i = 0 ; i < size ; i++ ) {
- _matrix[i].resize(size);
- for ( int j = 0; j < i; j++ ) {
- _matrix[i][j] = 1;
- }
- }
-}
-
-void MatrixArbiter::PrintState() const {
- cout << "Priority Matrix: " << endl ;
- for ( int r = 0; r < _size ; r++ ) {
- for ( int c = 0 ; c < _size ; c++ ) {
- cout << _matrix[r][c] << " " ;
- }
- cout << endl ;
- }
- cout << endl ;
-}
-
-void MatrixArbiter::UpdateState() {
- // update priority matrix using last grant
- if ( _selected > -1 ) {
- for ( int i = 0; i < _size ; i++ ) {
- if( _selected != i ) {
- _matrix[_selected][i] = 0 ;
- _matrix[i][_selected] = 1 ;
- }
- }
- }
-}
-
-void MatrixArbiter::AddRequest( int input, int id, int pri )
-{
- _last_req = input;
- Arbiter::AddRequest(input, id, pri);
-}
-
-int MatrixArbiter::Arbitrate( int* id, int* pri ) {
-
- // avoid running arbiter if it has not recevied at least two requests
- // (in this case, requests and grants are identical)
- if ( _num_reqs < 2 ) {
-
- _selected = _last_req ;
-
- } else {
-
- _selected = -1 ;
-
- for ( int input = 0 ; input < _size ; input++ ) {
- if(_request[input].valid) {
-
- bool grant = true;
- for ( int i = 0 ; i < _size ; i++ ) {
- if ( _request[i].valid &&
- ( ( ( _request[i].pri == _request[input].pri ) &&
- _matrix[i][input]) ||
- ( _request[i].pri > _request[input].pri )
- ) ) {
- grant = false ;
- break ;
- }
- }
-
- if ( grant ) {
- _selected = input ;
- break ;
- }
- }
-
- }
- }
-
- return Arbiter::Arbitrate(id, pri);
-}
-
-void MatrixArbiter::Clear()
-{
- _last_req = -1;
- Arbiter::Clear();
-}
diff --git a/src/intersim2/.svn/pristine/33/337f567cc4b77aad754f713a5fd363118f925249.svn-base b/src/intersim2/.svn/pristine/33/337f567cc4b77aad754f713a5fd363118f925249.svn-base
deleted file mode 100644
index f9e7801..0000000
--- a/src/intersim2/.svn/pristine/33/337f567cc4b77aad754f713a5fd363118f925249.svn-base
+++ /dev/null
@@ -1,52 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include "misc_utils.hpp"
-
-int powi( int x, int y ) // compute x to the y
-{
- int r = 1;
-
- for ( int i = 0; i < y; ++i ) {
- r *= x;
- }
-
- return r;
-}
-
-int log_two( int x )
-{
- int r = 0;
-
- x >>= 1;
- while( x ) {
- r++; x >>= 1;
- }
-
- return r;
-}
diff --git a/src/intersim2/.svn/pristine/38/38bf48ff0300a37f3005867f74e32b80297f8b09.svn-base b/src/intersim2/.svn/pristine/38/38bf48ff0300a37f3005867f74e32b80297f8b09.svn-base
deleted file mode 100644
index d8db065..0000000
--- a/src/intersim2/.svn/pristine/38/38bf48ff0300a37f3005867f74e32b80297f8b09.svn-base
+++ /dev/null
@@ -1,75 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _BATCHTRAFFICMANAGER_HPP_
-#define _BATCHTRAFFICMANAGER_HPP_
-
-#include <iostream>
-
-#include "config_utils.hpp"
-#include "stats.hpp"
-#include "trafficmanager.hpp"
-
-class BatchTrafficManager : public TrafficManager {
-
-protected:
-
- int _max_outstanding;
- int _batch_size;
- int _batch_count;
- int _last_id;
- int _last_pid;
-
- Stats * _batch_time;
- double _overall_min_batch_time;
- double _overall_avg_batch_time;
- double _overall_max_batch_time;
-
- ostream * _sent_packets_out;
-
- virtual void _RetireFlit( Flit *f, int dest );
-
- virtual int _IssuePacket( int source, int cl );
- virtual void _ClearStats( );
- virtual bool _SingleSim( );
-
- virtual void _UpdateOverallStats( );
-
- virtual string _OverallStatsCSV(int c = 0) const;
-
-public:
-
- BatchTrafficManager( const Configuration &config, const vector<Network *> & net );
- virtual ~BatchTrafficManager( );
-
- virtual void WriteStats( ostream & os = cout ) const;
- virtual void DisplayStats( ostream & os = cout ) const;
- virtual void DisplayOverallStats( ostream & os = cout ) const;
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/39/398668283dbbef318596ac5cdfdb72a53973f2d1.svn-base b/src/intersim2/.svn/pristine/39/398668283dbbef318596ac5cdfdb72a53973f2d1.svn-base
deleted file mode 100644
index 1abff33..0000000
--- a/src/intersim2/.svn/pristine/39/398668283dbbef318596ac5cdfdb72a53973f2d1.svn-base
+++ /dev/null
@@ -1,161 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _BUFFER_HPP_
-#define _BUFFER_HPP_
-
-#include <vector>
-
-#include "vc.hpp"
-#include "flit.hpp"
-#include "outputset.hpp"
-#include "routefunc.hpp"
-#include "config_utils.hpp"
-
-class Buffer : public Module {
-
- int _occupancy;
- int _size;
-
- vector<VC*> _vc;
-
-#ifdef TRACK_BUFFERS
- vector<int> _class_occupancy;
-#endif
-
-public:
-
- Buffer( const Configuration& config, int outputs,
- Module *parent, const string& name );
- ~Buffer();
-
- void AddFlit( int vc, Flit *f );
-
- inline Flit *RemoveFlit( int vc )
- {
- --_occupancy;
-#ifdef TRACK_BUFFERS
- int cl = _vc[vc]->FrontFlit()->cl;
- assert(_class_occupancy[cl] > 0);
- --_class_occupancy[cl];
-#endif
- return _vc[vc]->RemoveFlit( );
- }
-
- inline Flit *FrontFlit( int vc ) const
- {
- return _vc[vc]->FrontFlit( );
- }
-
- inline bool Empty( int vc ) const
- {
- return _vc[vc]->Empty( );
- }
-
- inline bool Full( ) const
- {
- return _occupancy >= _size;
- }
-
- inline VC::eVCState GetState( int vc ) const
- {
- return _vc[vc]->GetState( );
- }
-
- inline void SetState( int vc, VC::eVCState s )
- {
- _vc[vc]->SetState(s);
- }
-
- inline const OutputSet *GetRouteSet( int vc ) const
- {
- return _vc[vc]->GetRouteSet( );
- }
-
- inline void SetRouteSet( int vc, OutputSet * output_set )
- {
- _vc[vc]->SetRouteSet(output_set);
- }
-
- inline void SetOutput( int vc, int out_port, int out_vc )
- {
- _vc[vc]->SetOutput(out_port, out_vc);
- }
-
- inline int GetOutputPort( int vc ) const
- {
- return _vc[vc]->GetOutputPort( );
- }
-
- inline int GetOutputVC( int vc ) const
- {
- return _vc[vc]->GetOutputVC( );
- }
-
- inline int GetPriority( int vc ) const
- {
- return _vc[vc]->GetPriority( );
- }
-
- inline void Route( int vc, tRoutingFunction rf, const Router* router, const Flit* f, int in_channel )
- {
- _vc[vc]->Route(rf, router, f, in_channel);
- }
-
- // ==== Debug functions ====
-
- inline void SetWatch( int vc, bool watch = true )
- {
- _vc[vc]->SetWatch(watch);
- }
-
- inline bool IsWatched( int vc ) const
- {
- return _vc[vc]->IsWatched( );
- }
-
- inline int GetOccupancy( ) const
- {
- return _occupancy;
- }
-
- inline int GetOccupancy( int vc ) const
- {
- return _vc[vc]->GetOccupancy( );
- }
-
-#ifdef TRACK_BUFFERS
- inline int GetOccupancyForClass(int c) const
- {
- return _class_occupancy[c];
- }
-#endif
-
- void Display( ostream & os = cout ) const;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/3a/3a771e1b366aae7e427d29b3f55d7f51045173d5.svn-base b/src/intersim2/.svn/pristine/3a/3a771e1b366aae7e427d29b3f55d7f51045173d5.svn-base
deleted file mode 100644
index 6c15d25..0000000
--- a/src/intersim2/.svn/pristine/3a/3a771e1b366aae7e427d29b3f55d7f51045173d5.svn-base
+++ /dev/null
@@ -1,71 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// TreeArbiter
-//
-// ----------------------------------------------------------------------
-
-#ifndef _TREE_ARB_HPP_
-#define _TREE_ARB_HPP_
-
-#include "arbiter.hpp"
-
-class TreeArbiter : public Arbiter {
-
- int _group_size ;
-
- vector<Arbiter *> _group_arbiters;
- Arbiter * _global_arbiter;
-
- vector<int> _group_reqs;
-
-public:
-
- // Constructors
- TreeArbiter( Module *parent, const string &name, int size, int groups, const string & arb_type ) ;
-
- ~TreeArbiter();
-
- // Print priority matrix to standard output
- virtual void PrintState() const ;
-
- // Update priority matrix based on last aribtration result
- virtual void UpdateState() ;
-
- // Arbitrate amongst requests. Returns winning input and
- // updates pointers to metadata when valid pointers are passed
- virtual int Arbitrate( int* id = 0, int* pri = 0) ;
-
- virtual void AddRequest( int input, int id, int pri ) ;
-
- virtual void Clear();
-
-} ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/3b/3bdd451bbcde75941cf7ad8caf63c4465c856102.svn-base b/src/intersim2/.svn/pristine/3b/3bdd451bbcde75941cf7ad8caf63c4465c856102.svn-base
deleted file mode 100644
index e587a7f..0000000
--- a/src/intersim2/.svn/pristine/3b/3bdd451bbcde75941cf7ad8caf63c4465c856102.svn-base
+++ /dev/null
@@ -1,187 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*main.cpp
- *
- *The starting point of the network simulator
- *-Include all network header files
- *-initilize the network
- *-initialize the traffic manager and set it to run
- *
- *
- */
-#include <sys/time.h>
-
-#include <string>
-#include <cstdlib>
-#include <iostream>
-#include <fstream>
-
-
-
-#include <sstream>
-#include "booksim.hpp"
-#include "routefunc.hpp"
-#include "traffic.hpp"
-#include "booksim_config.hpp"
-#include "trafficmanager.hpp"
-#include "random_utils.hpp"
-#include "network.hpp"
-#include "injection.hpp"
-#include "power_module.hpp"
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//Global declarations
-//////////////////////
-
- /* the current traffic manager instance */
-TrafficManager * trafficManager = NULL;
-
-int GetSimTime() {
- return trafficManager->getTime();
-}
-
-class Stats;
-Stats * GetStats(const std::string & name) {
- Stats* test = trafficManager->getStats(name);
- if(test == 0){
- cout<<"warning statistics "<<name<<" not found"<<endl;
- }
- return test;
-}
-
-/* printing activity factor*/
-bool gPrintActivity;
-
-int gK;//radix
-int gN;//dimension
-int gC;//concentration
-
-int gNodes;
-
-//generate nocviewer trace
-bool gTrace;
-
-ostream * gWatchOut;
-
-
-
-/////////////////////////////////////////////////////////////////////////////
-
-bool Simulate( BookSimConfig const & config )
-{
- vector<Network *> net;
-
- int subnets = config.GetInt("subnets");
- /*To include a new network, must register the network here
- *add an else if statement with the name of the network
- */
- net.resize(subnets);
- for (int i = 0; i < subnets; ++i) {
- ostringstream name;
- name << "network_" << i;
- net[i] = Network::New( config, name.str() );
- }
-
- /*tcc and characterize are legacy
- *not sure how to use them
- */
-
- assert(trafficManager == NULL);
- trafficManager = TrafficManager::New( config, net ) ;
-
- /*Start the simulation run
- */
-
- double total_time; /* Amount of time we've run */
- struct timeval start_time, end_time; /* Time before/after user code */
- total_time = 0.0;
- gettimeofday(&start_time, NULL);
-
- bool result = trafficManager->Run() ;
-
-
- gettimeofday(&end_time, NULL);
- total_time = ((double)(end_time.tv_sec) + (double)(end_time.tv_usec)/1000000.0)
- - ((double)(start_time.tv_sec) + (double)(start_time.tv_usec)/1000000.0);
-
- cout<<"Total run time "<<total_time<<endl;
-
- for (int i=0; i<subnets; ++i) {
-
- ///Power analysis
- if(config.GetInt("sim_power") > 0){
- Power_Module pnet(net[i], config);
- pnet.run();
- }
-
- delete net[i];
- }
-
- delete trafficManager;
- trafficManager = NULL;
-
- return result;
-}
-
-
-int main( int argc, char **argv )
-{
-
- BookSimConfig config;
-
-
- if ( !ParseArgs( &config, argc, argv ) ) {
- cerr << "Usage: " << argv[0] << " configfile... [param=value...]" << endl;
- return 0;
- }
-
-
- /*initialize routing, traffic, injection functions
- */
- InitializeRoutingMap( config );
-
- gPrintActivity = (config.GetInt("print_activity") > 0);
- gTrace = (config.GetInt("viewer_trace") > 0);
-
- string watch_out_file = config.GetStr( "watch_out" );
- if(watch_out_file == "") {
- gWatchOut = NULL;
- } else if(watch_out_file == "-") {
- gWatchOut = &cout;
- } else {
- gWatchOut = new ofstream(watch_out_file.c_str());
- }
-
-
- /*configure and run the simulator
- */
- bool result = Simulate( config );
- return result ? -1 : 0;
-}
diff --git a/src/intersim2/.svn/pristine/3b/3bebc9fde5e475aaa53b6d4abda241d37117421b.svn-base b/src/intersim2/.svn/pristine/3b/3bebc9fde5e475aaa53b6d4abda241d37117421b.svn-base
deleted file mode 100644
index 2e20502..0000000
--- a/src/intersim2/.svn/pristine/3b/3bebc9fde5e475aaa53b6d4abda241d37117421b.svn-base
+++ /dev/null
@@ -1,67 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "switch_monitor.hpp"
-
-#include "flit.hpp"
-
-SwitchMonitor::SwitchMonitor( int inputs, int outputs, int classes )
-: _cycles(0), _inputs(inputs), _outputs(outputs), _classes(classes) {
- _event.resize(inputs * outputs * classes, 0) ;
-}
-
-int SwitchMonitor::index( int input, int output, int cl ) const {
- assert((input >= 0) && (input < _inputs));
- assert((output >= 0) && (output < _outputs));
- assert((cl >= 0) && (cl < _classes));
- return cl + _classes * ( output + _outputs * input ) ;
-}
-
-void SwitchMonitor::cycle() {
- _cycles++ ;
-}
-
-void SwitchMonitor::traversal( int input, int output, Flit const * f ) {
- _event[ index( input, output, f->cl) ]++ ;
-}
-
-void SwitchMonitor::display(ostream & os) const {
- for ( int i = 0 ; i < _inputs ; i++ ) {
- for ( int o = 0 ; o < _outputs ; o++) {
- os << "[" << i << " -> " << o << "] " ;
- for ( int c = 0 ; c < _classes ; c++ ) {
- os << c << ":" << _event[index(i,o,c)] << " " ;
- }
- os << endl ;
- }
- }
-}
-
-ostream & operator<<( ostream & os, SwitchMonitor const & obj ) {
- obj.display(os);
- return os ;
-}
diff --git a/src/intersim2/.svn/pristine/3c/3c57b304902a442e45bf4e4225aac564cd2bdc26.svn-base b/src/intersim2/.svn/pristine/3c/3c57b304902a442e45bf4e4225aac564cd2bdc26.svn-base
deleted file mode 100644
index 37133f0..0000000
--- a/src/intersim2/.svn/pristine/3c/3c57b304902a442e45bf4e4225aac564cd2bdc26.svn-base
+++ /dev/null
@@ -1,62 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _MODULE_HPP_
-#define _MODULE_HPP_
-
-#include "booksim.hpp"
-
-#include <string>
-#include <vector>
-#include <iostream>
-
-class Module {
-private:
- string _name;
- string _fullname;
-
- vector<Module *> _children;
-
-protected:
- void _AddChild( Module *child );
-
-public:
- Module( Module *parent, const string& name );
- virtual ~Module( ) { }
-
- inline const string & Name() const { return _name; }
- inline const string & FullName() const { return _fullname; }
-
- void DisplayHierarchy( int level = 0, ostream & os = cout ) const;
-
- void Error( const string& msg ) const;
- void Debug( const string& msg ) const;
-
- virtual void Display( ostream & os = cout ) const;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/3c/3c8671257ad287c8e877c0942bdc9f16e9f7fe0c.svn-base b/src/intersim2/.svn/pristine/3c/3c8671257ad287c8e877c0942bdc9f16e9f7fe0c.svn-base
deleted file mode 100644
index 2084eec..0000000
--- a/src/intersim2/.svn/pristine/3c/3c8671257ad287c8e877c0942bdc9f16e9f7fe0c.svn-base
+++ /dev/null
@@ -1,162 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <vector>
-#include <sstream>
-
-#include "fly.hpp"
-#include "misc_utils.hpp"
-
-//#define DEBUG_FLY
-
-KNFly::KNFly( const Configuration &config, const string & name ) :
-Network( config, name )
-{
- _ComputeSize( config );
- _Alloc( );
- _BuildNet( config );
-}
-
-void KNFly::_ComputeSize( const Configuration &config )
-{
- _k = config.GetInt( "k" );
- _n = config.GetInt( "n" );
-
- gK = _k; gN = _n;
-
- _nodes = powi( _k, _n );
-
- // n stages of k^(n-1) k x k switches
- _size = _n*powi( _k, _n-1 );
-
- // n-1 sets of wiring between the stages
- _channels = (_n-1)*_nodes;
-}
-
-void KNFly::_BuildNet( const Configuration &config )
-{
- ostringstream router_name;
-
- int per_stage = powi( _k, _n-1 );
-
- int node = 0;
- int c;
-
- for ( int stage = 0; stage < _n; ++stage ) {
- for ( int addr = 0; addr < per_stage; ++addr ) {
-
- router_name << "router_" << stage << "_" << addr;
- _routers[node] = Router::NewRouter( config, this, router_name.str( ),
- node, _k, _k );
- _timed_modules.push_back(_routers[node]);
- router_name.str("");
-
-#ifdef DEBUG_FLY
- cout << "connecting node " << node << " to:" << endl;
-#endif
-
- for ( int port = 0; port < _k; ++port ) {
- // Input connections
- if ( stage == 0 ) {
- c = addr*_k + port;
- _routers[node]->AddInputChannel( _inject[c], _inject_cred[c] );
-#ifdef DEBUG_FLY
- cout << " injection channel " << c << endl;
-#endif
- } else {
- c = _InChannel( stage, addr, port );
- _routers[node]->AddInputChannel( _chan[c], _chan_cred[c] );
- _chan[c]->SetLatency( 1 );
-
-#ifdef DEBUG_FLY
- cout << " input channel " << c << endl;
-#endif
- }
-
- // Output connections
- if ( stage == _n - 1 ) {
- c = addr*_k + port;
- _routers[node]->AddOutputChannel( _eject[c], _eject_cred[c] );
-#ifdef DEBUG_FLY
- cout << " ejection channel " << c << endl;
-#endif
- } else {
- c = _OutChannel( stage, addr, port );
- _routers[node]->AddOutputChannel( _chan[c], _chan_cred[c] );
-#ifdef DEBUG_FLY
- cout << " output channel " << c << endl;
-#endif
- }
- }
-
- ++node;
- }
- }
-}
-
-int KNFly::_OutChannel( int stage, int addr, int port ) const
-{
- return stage*_nodes + addr*_k + port;
-}
-
-int KNFly::_InChannel( int stage, int addr, int port ) const
-{
- int in_addr;
- int in_port;
-
- // Channels are between {node,port}
- // { d_{n-1} ... d_{n-stage} ... d_0 } and
- // { d_{n-1} ... d_0 ... d_{n-stage} }
-
- int shift = powi( _k, _n-stage-1 );
-
- int last_digit = port;
- int zero_digit = ( addr / shift ) % _k;
-
- // swap zero and last digit to get first node's address
- in_addr = addr - zero_digit*shift + last_digit*shift;
- in_port = zero_digit;
-
- return (stage-1)*_nodes + in_addr*_k + in_port;
-}
-
-int KNFly::GetN( ) const
-{
- return _n;
-}
-
-int KNFly::GetK( ) const
-{
- return _k;
-}
-
-double KNFly::Capacity( ) const
-{
- return 1.0;
-}
-
diff --git a/src/intersim2/.svn/pristine/3f/3f4cacd217f3c1d154a11537511bf6b6e96a8e6b.svn-base b/src/intersim2/.svn/pristine/3f/3f4cacd217f3c1d154a11537511bf6b6e96a8e6b.svn-base
deleted file mode 100644
index 43876dc..0000000
--- a/src/intersim2/.svn/pristine/3f/3f4cacd217f3c1d154a11537511bf6b6e96a8e6b.svn-base
+++ /dev/null
@@ -1,76 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _STATS_HPP_
-#define _STATS_HPP_
-
-#include "module.hpp"
-
-class Stats : public Module {
- int _num_samples;
- double _sample_sum;
- double _sample_squared_sum;
-
- //bool _reset;
- double _min;
- double _max;
-
- int _num_bins;
- double _bin_size;
-
- vector<int> _hist;
-
-public:
- Stats( Module *parent, const string &name,
- double bin_size = 1.0, int num_bins = 10 );
-
- void Clear( );
-
- double Average( ) const;
- double Variance( ) const;
- double Max( ) const;
- double Min( ) const;
- double Sum( ) const;
- double SquaredSum( ) const;
- int NumSamples( ) const;
-
- void AddSample( double val );
- inline void AddSample( int val ) {
- AddSample( (double)val );
- }
-
- int GetBin(int b){ return _hist[b];}
-
- void Display( ostream & os = cout ) const;
-
- friend ostream & operator<<(ostream & os, const Stats & s);
-
-};
-
-ostream & operator<<(ostream & os, const Stats & s);
-
-#endif
diff --git a/src/intersim2/.svn/pristine/42/42777bd5ccda83625dfbf29e7aec13f2e773373a.svn-base b/src/intersim2/.svn/pristine/42/42777bd5ccda83625dfbf29e7aec13f2e773373a.svn-base
deleted file mode 100644
index 6260406..0000000
--- a/src/intersim2/.svn/pristine/42/42777bd5ccda83625dfbf29e7aec13f2e773373a.svn-base
+++ /dev/null
@@ -1,1999 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*routefunc.cpp
- *
- *This is where most of the routing functions reside. Some of the topologies
- *has their own "register routing functions" which must be called to access
- *those routing functions.
- *
- *After writing a routing function, don't forget to register it. The reg
- *format is rfname_topologyname.
- *
- */
-
-#include <map>
-#include <cstdlib>
-#include <cassert>
-
-#include "booksim.hpp"
-#include "routefunc.hpp"
-#include "kncube.hpp"
-#include "random_utils.hpp"
-#include "misc_utils.hpp"
-#include "fattree.hpp"
-#include "tree4.hpp"
-#include "qtree.hpp"
-#include "cmesh.hpp"
-
-
-
-map<string, tRoutingFunction> gRoutingFunctionMap;
-
-/* Global information used by routing functions */
-
-int gNumVCs;
-
-/* Add more functions here
- *
- */
-
-// ============================================================
-// Balfour-Schultz
-int gReadReqBeginVC, gReadReqEndVC;
-int gWriteReqBeginVC, gWriteReqEndVC;
-int gReadReplyBeginVC, gReadReplyEndVC;
-int gWriteReplyBeginVC, gWriteReplyEndVC;
-
-// ============================================================
-// QTree: Nearest Common Ancestor
-// ===
-void qtree_nca( const Router *r, const Flit *f,
- int in_channel, OutputSet* outputs, bool inject)
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int height = QTree::HeightFromID( r->GetID() );
- int pos = QTree::PosFromID( r->GetID() );
-
- int dest = f->dest;
-
- for (int i = height+1; i < gN; i++)
- dest /= gK;
- if ( pos == dest / gK )
- // Route down to child
- out_port = dest % gK ;
- else
- // Route up to parent
- out_port = gK;
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-// ============================================================
-// Tree4: Nearest Common Ancestor w/ Adaptive Routing Up
-// ===
-void tree4_anca( const Router *r, const Flit *f,
- int in_channel, OutputSet* outputs, bool inject)
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int range = 1;
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = f->dest;
-
- const int NPOS = 16;
-
- int rH = r->GetID( ) / NPOS;
- int rP = r->GetID( ) % NPOS;
-
- if ( rH == 0 ) {
- dest /= 16;
- out_port = 2 * dest + RandomInt(1);
- } else if ( rH == 1 ) {
- dest /= 4;
- if ( dest / 4 == rP / 2 )
- out_port = dest % 4;
- else {
- out_port = gK;
- range = gK;
- }
- } else {
- if ( dest/4 == rP )
- out_port = dest % 4;
- else {
- out_port = gK;
- range = 2;
- }
- }
-
- // cout << "Router("<<rH<<","<<rP<<"): id= " << f->id << " dest= " << f->dest << " out_port = "
- // << out_port << endl;
-
- }
-
- outputs->Clear( );
-
- for (int i = 0; i < range; ++i)
- outputs->AddRange( out_port + i, vcBegin, vcEnd );
-}
-
-// ============================================================
-// Tree4: Nearest Common Ancestor w/ Random Routing Up
-// ===
-void tree4_nca( const Router *r, const Flit *f,
- int in_channel, OutputSet* outputs, bool inject)
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = f->dest;
-
- const int NPOS = 16;
-
- int rH = r->GetID( ) / NPOS;
- int rP = r->GetID( ) % NPOS;
-
- if ( rH == 0 ) {
- dest /= 16;
- out_port = 2 * dest + RandomInt(1);
- } else if ( rH == 1 ) {
- dest /= 4;
- if ( dest / 4 == rP / 2 )
- out_port = dest % 4;
- else
- out_port = gK + RandomInt(gK-1);
- } else {
- if ( dest/4 == rP )
- out_port = dest % 4;
- else
- out_port = gK + RandomInt(1);
- }
-
- // cout << "Router("<<rH<<","<<rP<<"): id= " << f->id << " dest= " << f->dest << " out_port = "
- // << out_port << endl;
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-// ============================================================
-// FATTREE: Nearest Common Ancestor w/ Random Routing Up
-// ===
-void fattree_nca( const Router *r, const Flit *f,
- int in_channel, OutputSet* outputs, bool inject)
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int dest = f->dest;
- int router_id = r->GetID(); //routers are numbered with smallest at the top level
- int routers_per_level = powi(gK, gN-1);
- int pos = router_id%routers_per_level;
- int router_depth = router_id/ routers_per_level; //which level
- int routers_per_neighborhood = powi(gK,gN-router_depth-1);
- int router_neighborhood = pos/routers_per_neighborhood; //coverage of this tree
- int router_coverage = powi(gK, gN-router_depth); //span of the tree from this router
-
-
- //NCA reached going down
- if(dest <(router_neighborhood+1)* router_coverage &&
- dest >=router_neighborhood* router_coverage){
- //down ports are numbered first
-
- //ejection
- if(router_depth == gN-1){
- out_port = dest%gK;
- } else {
- //find the down port for the destination
- int router_branch_coverage = powi(gK, gN-(router_depth+1));
- out_port = (dest-router_neighborhood* router_coverage)/router_branch_coverage;
- }
- } else {
- //up ports are numbered last
- assert(in_channel<gK);//came from a up channel
- out_port = gK+RandomInt(gK-1);
- }
- }
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-// ============================================================
-// FATTREE: Nearest Common Ancestor w/ Adaptive Routing Up
-// ===
-void fattree_anca( const Router *r, const Flit *f,
- int in_channel, OutputSet* outputs, bool inject)
-{
-
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
-
- int dest = f->dest;
- int router_id = r->GetID(); //routers are numbered with smallest at the top level
- int routers_per_level = powi(gK, gN-1);
- int pos = router_id%routers_per_level;
- int router_depth = router_id/ routers_per_level; //which level
- int routers_per_neighborhood = powi(gK,gN-router_depth-1);
- int router_neighborhood = pos/routers_per_neighborhood; //coverage of this tree
- int router_coverage = powi(gK, gN-router_depth); //span of the tree from this router
-
-
- //NCA reached going down
- if(dest <(router_neighborhood+1)* router_coverage &&
- dest >=router_neighborhood* router_coverage){
- //down ports are numbered first
-
- //ejection
- if(router_depth == gN-1){
- out_port = dest%gK;
- } else {
- //find the down port for the destination
- int router_branch_coverage = powi(gK, gN-(router_depth+1));
- out_port = (dest-router_neighborhood* router_coverage)/router_branch_coverage;
- }
- } else {
- //up ports are numbered last
- assert(in_channel<gK);//came from a up channel
- out_port = gK;
- int random1 = RandomInt(gK-1); // Chose two ports out of the possible at random, compare loads, choose one.
- int random2 = RandomInt(gK-1);
- if (r->GetUsedCredit(out_port + random1) > r->GetUsedCredit(out_port + random2)){
- out_port = out_port + random2;
- }else{
- out_port = out_port + random1;
- }
- }
- }
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-
-
-
-// ============================================================
-// Mesh - adatpive XY,YX Routing
-// pick xy or yx min routing adaptively at the source router
-// ===
-
-int dor_next_mesh( int cur, int dest, bool descending = false );
-
-void adaptive_xy_yx_mesh( const Router *r, const Flit *f,
- int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else if(r->GetID() == f->dest) {
-
- // at destination router, we don't need to separate VCs by dim order
- out_port = 2*gN;
-
- } else {
-
- //each class must have at least 2 vcs assigned or else xy_yx will deadlock
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- int out_port_xy = dor_next_mesh( r->GetID(), f->dest, false );
- int out_port_yx = dor_next_mesh( r->GetID(), f->dest, true );
-
- // Route order (XY or YX) determined when packet is injected
- // into the network, adaptively
- bool x_then_y;
- if(in_channel < 2*gN){
- x_then_y = (f->vc < (vcBegin + available_vcs));
- } else {
- int credit_xy = r->GetUsedCredit(out_port_xy);
- int credit_yx = r->GetUsedCredit(out_port_yx);
- if(credit_xy > credit_yx) {
- x_then_y = false;
- } else if(credit_xy < credit_yx) {
- x_then_y = true;
- } else {
- x_then_y = (RandomInt(1) > 0);
- }
- }
-
- if(x_then_y) {
- out_port = out_port_xy;
- vcEnd -= available_vcs;
- } else {
- out_port = out_port_yx;
- vcBegin += available_vcs;
- }
-
- }
-
- outputs->Clear();
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-
-}
-
-void xy_yx_mesh( const Router *r, const Flit *f,
- int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else if(r->GetID() == f->dest) {
-
- // at destination router, we don't need to separate VCs by dim order
- out_port = 2*gN;
-
- } else {
-
- //each class must have at least 2 vcs assigned or else xy_yx will deadlock
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- // Route order (XY or YX) determined when packet is injected
- // into the network
- bool x_then_y = ((in_channel < 2*gN) ?
- (f->vc < (vcBegin + available_vcs)) :
- (RandomInt(1) > 0));
-
- if(x_then_y) {
- out_port = dor_next_mesh( r->GetID(), f->dest, false );
- vcEnd -= available_vcs;
- } else {
- out_port = dor_next_mesh( r->GetID(), f->dest, true );
- vcBegin += available_vcs;
- }
-
- }
-
- outputs->Clear();
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-
-}
-
-//
-// End Balfour-Schultz
-//=============================================================
-
-//=============================================================
-
-int dor_next_mesh( int cur, int dest, bool descending )
-{
- if ( cur == dest ) {
- return 2*gN; // Eject
- }
-
- int dim_left;
-
- if(descending) {
- for ( dim_left = ( gN - 1 ); dim_left > 0; --dim_left ) {
- if ( ( cur * gK / gNodes ) != ( dest * gK / gNodes ) ) { break; }
- cur = (cur * gK) % gNodes; dest = (dest * gK) % gNodes;
- }
- cur = (cur * gK) / gNodes;
- dest = (dest * gK) / gNodes;
- } else {
- for ( dim_left = 0; dim_left < ( gN - 1 ); ++dim_left ) {
- if ( ( cur % gK ) != ( dest % gK ) ) { break; }
- cur /= gK; dest /= gK;
- }
- cur %= gK;
- dest %= gK;
- }
-
- if ( cur < dest ) {
- return 2*dim_left; // Right
- } else {
- return 2*dim_left + 1; // Left
- }
-}
-
-//=============================================================
-
-void dor_next_torus( int cur, int dest, int in_port,
- int *out_port, int *partition,
- bool balance = false )
-{
- int dim_left;
- int dir;
- int dist2;
-
- for ( dim_left = 0; dim_left < gN; ++dim_left ) {
- if ( ( cur % gK ) != ( dest % gK ) ) { break; }
- cur /= gK; dest /= gK;
- }
-
- if ( dim_left < gN ) {
-
- if ( (in_port/2) != dim_left ) {
- // Turning into a new dimension
-
- cur %= gK; dest %= gK;
- dist2 = gK - 2 * ( ( dest - cur + gK ) % gK );
-
- if ( ( dist2 > 0 ) ||
- ( ( dist2 == 0 ) && ( RandomInt( 1 ) ) ) ) {
- *out_port = 2*dim_left; // Right
- dir = 0;
- } else {
- *out_port = 2*dim_left + 1; // Left
- dir = 1;
- }
-
- if ( partition ) {
- if ( balance ) {
- // Cray's "Partition" allocation
- // Two datelines: one between k-1 and 0 which forces VC 1
- // another between ((k-1)/2) and ((k-1)/2 + 1) which
- // forces VC 0 otherwise any VC can be used
-
- if ( ( ( dir == 0 ) && ( cur > dest ) ) ||
- ( ( dir == 1 ) && ( cur < dest ) ) ) {
- *partition = 1;
- } else if ( ( ( dir == 0 ) && ( cur <= (gK-1)/2 ) && ( dest > (gK-1)/2 ) ) ||
- ( ( dir == 1 ) && ( cur > (gK-1)/2 ) && ( dest <= (gK-1)/2 ) ) ) {
- *partition = 0;
- } else {
- *partition = RandomInt( 1 ); // use either VC set
- }
- } else {
- // Deterministic, fixed dateline between nodes k-1 and 0
-
- if ( ( ( dir == 0 ) && ( cur > dest ) ) ||
- ( ( dir == 1 ) && ( dest < cur ) ) ) {
- *partition = 1;
- } else {
- *partition = 0;
- }
- }
- }
- } else {
- // Inverting the least significant bit keeps
- // the packet moving in the same direction
- *out_port = in_port ^ 0x1;
- }
-
- } else {
- *out_port = 2*gN; // Eject
- }
-}
-
-//=============================================================
-
-void dim_order_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int out_port = inject ? -1 : dor_next_mesh( r->GetID( ), f->dest );
-
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- if ( !inject && f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << vcBegin << ","
- << vcEnd << "]"
- << " at output port " << out_port
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
-
- outputs->Clear();
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void dim_order_ni_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int out_port = inject ? -1 : dor_next_mesh( r->GetID( ), f->dest );
-
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- // at the destination router, we don't need to separate VCs by destination
- if(inject || (r->GetID() != f->dest)) {
-
- int const vcs_per_dest = (vcEnd - vcBegin + 1) / gNodes;
- assert(vcs_per_dest > 0);
-
- vcBegin += f->dest * vcs_per_dest;
- vcEnd = vcBegin + vcs_per_dest - 1;
-
- }
-
- if( !inject && f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << vcBegin << ","
- << vcEnd << "]"
- << " at output port " << out_port
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void dim_order_pni_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int out_port = inject ? -1 : dor_next_mesh( r->GetID(), f->dest );
-
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- if(inject || (r->GetID() != f->dest)) {
- int next_coord = f->dest;
- if(!inject) {
- int out_dim = out_port / 2;
- for(int d = 0; d < out_dim; ++d) {
- next_coord /= gK;
- }
- }
- next_coord %= gK;
- assert(next_coord >= 0 && next_coord < gK);
- int vcs_per_dest = (vcEnd - vcBegin + 1) / gK;
- assert(vcs_per_dest > 0);
- vcBegin += next_coord * vcs_per_dest;
- vcEnd = vcBegin + vcs_per_dest - 1;
- }
-
- if( !inject && f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << vcBegin << ","
- << vcEnd << "]"
- << " at output port " << out_port
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-// Random intermediate in the minimal quadrant defined
-// by the source and destination
-int rand_min_intr_mesh( int src, int dest )
-{
- int dist;
-
- int intm = 0;
- int offset = 1;
-
- for ( int n = 0; n < gN; ++n ) {
- dist = ( dest % gK ) - ( src % gK );
-
- if ( dist > 0 ) {
- intm += offset * ( ( src % gK ) + RandomInt( dist ) );
- } else {
- intm += offset * ( ( dest % gK ) + RandomInt( -dist ) );
- }
-
- offset *= gK;
- dest /= gK; src /= gK;
- }
-
- return intm;
-}
-
-//=============================================================
-
-void romm_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- if ( in_channel == 2*gN ) {
- f->ph = 0; // Phase 0
- f->intm = rand_min_intr_mesh( f->src, f->dest );
- }
-
- if ( ( f->ph == 0 ) && ( r->GetID( ) == f->intm ) ) {
- f->ph = 1; // Go to phase 1
- }
-
- out_port = dor_next_mesh( r->GetID( ), (f->ph == 0) ? f->intm : f->dest );
-
- // at the destination router, we don't need to separate VCs by phase
- if(r->GetID() != f->dest) {
-
- //each class must have at least 2 vcs assigned or else valiant valiant will deadlock
- int available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- if(f->ph == 0) {
- vcEnd -= available_vcs;
- } else {
- assert(f->ph == 1);
- vcBegin += available_vcs;
- }
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void romm_ni_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- // at the destination router, we don't need to separate VCs by destination
- if(inject || (r->GetID() != f->dest)) {
-
- int const vcs_per_dest = (vcEnd - vcBegin + 1) / gNodes;
- assert(vcs_per_dest > 0);
-
- vcBegin += f->dest * vcs_per_dest;
- vcEnd = vcBegin + vcs_per_dest - 1;
-
- }
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- if ( in_channel == 2*gN ) {
- f->ph = 0; // Phase 0
- f->intm = rand_min_intr_mesh( f->src, f->dest );
- }
-
- if ( ( f->ph == 0 ) && ( r->GetID( ) == f->intm ) ) {
- f->ph = 1; // Go to phase 1
- }
-
- out_port = dor_next_mesh( r->GetID( ), (f->ph == 0) ? f->intm : f->dest );
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void min_adapt_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- outputs->Clear( );
-
- if(inject) {
- // injection can use all VCs
- outputs->AddRange(-1, vcBegin, vcEnd);
- return;
- } else if(r->GetID() == f->dest) {
- // ejection can also use all VCs
- outputs->AddRange(2*gN, vcBegin, vcEnd);
- return;
- }
-
- int in_vc;
-
- if ( in_channel == 2*gN ) {
- in_vc = vcEnd; // ignore the injection VC
- } else {
- in_vc = f->vc;
- }
-
- // DOR for the escape channel (VC 0), low priority
- int out_port = dor_next_mesh( r->GetID( ), f->dest );
- outputs->AddRange( out_port, 0, vcBegin, vcBegin );
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << vcBegin << ","
- << vcBegin << "]"
- << " at output port " << out_port
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
-
- if ( in_vc != vcBegin ) { // If not in the escape VC
- // Minimal adaptive for all other channels
- int cur = r->GetID( );
- int dest = f->dest;
-
- for ( int n = 0; n < gN; ++n ) {
- if ( ( cur % gK ) != ( dest % gK ) ) {
- // Add minimal direction in dimension 'n'
- if ( ( cur % gK ) < ( dest % gK ) ) { // Right
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << (vcBegin+1) << ","
- << vcEnd << "]"
- << " at output port " << 2*n
- << " with priority " << 1
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
- outputs->AddRange( 2*n, vcBegin+1, vcEnd, 1 );
- } else { // Left
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << (vcBegin+1) << ","
- << vcEnd << "]"
- << " at output port " << 2*n+1
- << " with priority " << 1
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
- outputs->AddRange( 2*n + 1, vcBegin+1, vcEnd, 1 );
- }
- }
- cur /= gK;
- dest /= gK;
- }
- }
-}
-
-//=============================================================
-
-void planar_adapt_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- outputs->Clear( );
-
- if(inject) {
- // injection can use all VCs
- outputs->AddRange(-1, vcBegin, vcEnd);
- return;
- }
-
- int cur = r->GetID( );
- int dest = f->dest;
-
- if ( cur != dest ) {
-
- int in_vc = f->vc;
- int vc_mult = (vcEnd - vcBegin + 1) / 3;
-
- // Find the first unmatched dimension -- except
- // for when we're in the first dimension because
- // of misrouting in the last adaptive plane.
- // In this case, go to the last dimension instead.
-
- int n;
- for ( n = 0; n < gN; ++n ) {
- if ( ( ( cur % gK ) != ( dest % gK ) ) &&
- !( ( in_channel/2 == 0 ) &&
- ( n == 0 ) &&
- ( in_vc < vcBegin+2*vc_mult ) ) ) {
- break;
- }
-
- cur /= gK;
- dest /= gK;
- }
-
- assert( n < gN );
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "PLANAR ADAPTIVE: flit " << f->id
- << " in adaptive plane " << n << "." << endl;
- }
-
- // We're in adaptive plane n
-
- // Can route productively in d_{i,2}
- bool increase;
- bool fault;
- if ( ( cur % gK ) < ( dest % gK ) ) { // Increasing
- increase = true;
- if ( !r->IsFaultyOutput( 2*n ) ) {
- outputs->AddRange( 2*n, vcBegin+2*vc_mult, vcEnd );
- fault = false;
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "PLANAR ADAPTIVE: increasing in dimension " << n
- << "." << endl;
- }
- } else {
- fault = true;
- }
- } else { // Decreasing
- increase = false;
- if ( !r->IsFaultyOutput( 2*n + 1 ) ) {
- outputs->AddRange( 2*n + 1, vcBegin+2*vc_mult, vcEnd );
- fault = false;
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "PLANAR ADAPTIVE: decreasing in dimension " << n
- << "." << endl;
- }
- } else {
- fault = true;
- }
- }
-
- n = ( n + 1 ) % gN;
- cur /= gK;
- dest /= gK;
-
- if ( !increase ) {
- vcBegin += vc_mult;
- }
- vcEnd = vcBegin + vc_mult - 1;
-
- int d1_min_c;
- if ( ( cur % gK ) < ( dest % gK ) ) { // Increasing in d_{i+1}
- d1_min_c = 2*n;
- } else if ( ( cur % gK ) != ( dest % gK ) ) { // Decreasing in d_{i+1}
- d1_min_c = 2*n + 1;
- } else {
- d1_min_c = -1;
- }
-
- // do we want to 180? if so, the last
- // route was a misroute in this dimension,
- // if there is no fault in d_i, just ignore
- // this dimension, otherwise continue to misroute
- if ( d1_min_c == in_channel ) {
- if ( fault ) {
- d1_min_c = in_channel ^ 1;
- } else {
- d1_min_c = -1;
- }
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "PLANAR ADAPTIVE: avoiding 180 in dimension " << n
- << "." << endl;
- }
- }
-
- if ( d1_min_c != -1 ) {
- if ( !r->IsFaultyOutput( d1_min_c ) ) {
- outputs->AddRange( d1_min_c, vcBegin, vcEnd );
- } else if ( fault ) {
- // major problem ... fault in d_i and d_{i+1}
- r->Error( "There seem to be faults in d_i and d_{i+1}" );
- }
- } else if ( fault ) { // need to misroute!
- bool atedge;
- if ( cur % gK == 0 ) {
- d1_min_c = 2*n;
- atedge = true;
- } else if ( cur % gK == gK - 1 ) {
- d1_min_c = 2*n + 1;
- atedge = true;
- } else {
- d1_min_c = 2*n + RandomInt( 1 ); // random misroute
-
- if ( d1_min_c == in_channel ) { // don't 180
- d1_min_c = in_channel ^ 1;
- }
- atedge = false;
- }
-
- if ( !r->IsFaultyOutput( d1_min_c ) ) {
- outputs->AddRange( d1_min_c, vcBegin, vcEnd );
- } else if ( !atedge && !r->IsFaultyOutput( d1_min_c ^ 1 ) ) {
- outputs->AddRange( d1_min_c ^ 1, vcBegin, vcEnd );
- } else {
- // major problem ... fault in d_i and d_{i+1}
- r->Error( "There seem to be faults in d_i and d_{i+1}" );
- }
- }
- } else {
- outputs->AddRange( 2*gN, vcBegin, vcEnd );
- }
-}
-
-//=============================================================
-/*
- FIXME: This is broken (note that f->dr is never actually modified).
- Even if it were, this should really use f->ph instead of introducing a single-
- use field.
-
-void limited_adapt_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- outputs->Clear( );
-
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- if ( inject ) {
- outputs->AddRange( -1, vcBegin, vcEnd - 1 );
- f->dr = 0; // zero dimension reversals
- return;
- }
-
- int cur = r->GetID( );
- int dest = f->dest;
-
- if ( cur != dest ) {
- if ( ( f->vc != vcEnd ) &&
- ( f->dr != vcEnd - 1 ) ) {
-
- for ( int n = 0; n < gN; ++n ) {
- if ( ( cur % gK ) != ( dest % gK ) ) {
- int min_port;
- if ( ( cur % gK ) < ( dest % gK ) ) {
- min_port = 2*n; // Right
- } else {
- min_port = 2*n + 1; // Left
- }
-
- // Go in a productive direction with high priority
- outputs->AddRange( min_port, vcBegin, vcEnd - 1, 2 );
-
- // Go in the non-productive direction with low priority
- outputs->AddRange( min_port ^ 0x1, vcBegin, vcEnd - 1, 1 );
- } else {
- // Both directions are non-productive
- outputs->AddRange( 2*n, vcBegin, vcEnd - 1, 1 );
- outputs->AddRange( 2*n+1, vcBegin, vcEnd - 1, 1 );
- }
-
- cur /= gK;
- dest /= gK;
- }
-
- } else {
- outputs->AddRange( dor_next_mesh( cur, dest ),
- vcEnd, vcEnd, 0 );
- }
-
- } else { // at destination
- outputs->AddRange( 2*gN, vcBegin, vcEnd );
- }
-}
-*/
-//=============================================================
-
-void valiant_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- if ( in_channel == 2*gN ) {
- f->ph = 0; // Phase 0
- f->intm = RandomInt( gNodes - 1 );
- }
-
- if ( ( f->ph == 0 ) && ( r->GetID( ) == f->intm ) ) {
- f->ph = 1; // Go to phase 1
- }
-
- out_port = dor_next_mesh( r->GetID( ), (f->ph == 0) ? f->intm : f->dest );
-
- // at the destination router, we don't need to separate VCs by phase
- if(r->GetID() != f->dest) {
-
- //each class must have at least 2 vcs assigned or else valiant valiant will deadlock
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- if(f->ph == 0) {
- vcEnd -= available_vcs;
- } else {
- assert(f->ph == 1);
- vcBegin += available_vcs;
- }
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void valiant_torus( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int phase;
- if ( in_channel == 2*gN ) {
- phase = 0; // Phase 0
- f->intm = RandomInt( gNodes - 1 );
- } else {
- phase = f->ph / 2;
- }
-
- if ( ( phase == 0 ) && ( r->GetID( ) == f->intm ) ) {
- phase = 1; // Go to phase 1
- in_channel = 2*gN; // ensures correct vc selection at the beginning of phase 2
- }
-
- int ring_part;
- dor_next_torus( r->GetID( ), (phase == 0) ? f->intm : f->dest, in_channel,
- &out_port, &ring_part, false );
-
- f->ph = 2 * phase + ring_part;
-
- // at the destination router, we don't need to separate VCs by phase, etc.
- if(r->GetID() != f->dest) {
-
- int const ring_available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(ring_available_vcs > 0);
-
- if(ring_part == 0) {
- vcEnd -= ring_available_vcs;
- } else {
- assert(ring_part == 1);
- vcBegin += ring_available_vcs;
- }
-
- int const ph_available_vcs = ring_available_vcs / 2;
- assert(ph_available_vcs > 0);
-
- if(phase == 0) {
- vcEnd -= ph_available_vcs;
- } else {
- assert(phase == 1);
- vcBegin += ph_available_vcs;
- }
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void valiant_ni_torus( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- // at the destination router, we don't need to separate VCs by destination
- if(inject || (r->GetID() != f->dest)) {
-
- int const vcs_per_dest = (vcEnd - vcBegin + 1) / gNodes;
- assert(vcs_per_dest > 0);
-
- vcBegin += f->dest * vcs_per_dest;
- vcEnd = vcBegin + vcs_per_dest - 1;
-
- }
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int phase;
- if ( in_channel == 2*gN ) {
- phase = 0; // Phase 0
- f->intm = RandomInt( gNodes - 1 );
- } else {
- phase = f->ph / 2;
- }
-
- if ( ( f->ph == 0 ) && ( r->GetID( ) == f->intm ) ) {
- f->ph = 1; // Go to phase 1
- in_channel = 2*gN; // ensures correct vc selection at the beginning of phase 2
- }
-
- int ring_part;
- dor_next_torus( r->GetID( ), (f->ph == 0) ? f->intm : f->dest, in_channel,
- &out_port, &ring_part, false );
-
- f->ph = 2 * phase + ring_part;
-
- // at the destination router, we don't need to separate VCs by phase, etc.
- if(r->GetID() != f->dest) {
-
- int const ring_available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(ring_available_vcs > 0);
-
- if(ring_part == 0) {
- vcEnd -= ring_available_vcs;
- } else {
- assert(ring_part == 1);
- vcBegin += ring_available_vcs;
- }
-
- int const ph_available_vcs = ring_available_vcs / 2;
- assert(ph_available_vcs > 0);
-
- if(phase == 0) {
- vcEnd -= ph_available_vcs;
- } else {
- assert(phase == 1);
- vcBegin += ph_available_vcs;
- }
- }
-
- if (f->watch) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << vcBegin << ","
- << vcEnd << "]"
- << " at output port " << out_port
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void dim_order_torus( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int cur = r->GetID( );
- int dest = f->dest;
-
- dor_next_torus( cur, dest, in_channel,
- &out_port, &f->ph, false );
-
-
- // at the destination router, we don't need to separate VCs by ring partition
- if(cur != dest) {
-
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- if ( f->ph == 0 ) {
- vcEnd -= available_vcs;
- } else {
- vcBegin += available_vcs;
- }
- }
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << vcBegin << ","
- << vcEnd << "]"
- << " at output port " << out_port
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void dim_order_ni_torus( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int cur = r->GetID( );
- int dest = f->dest;
-
- dor_next_torus( cur, dest, in_channel,
- &out_port, NULL, false );
-
- // at the destination router, we don't need to separate VCs by destination
- if(cur != dest) {
-
- int const vcs_per_dest = (vcEnd - vcBegin + 1) / gNodes;
- assert(vcs_per_dest);
-
- vcBegin += f->dest * vcs_per_dest;
- vcEnd = vcBegin + vcs_per_dest - 1;
-
- }
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << vcBegin << ","
- << vcEnd << "]"
- << " at output port " << out_port
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void dim_order_bal_torus( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int cur = r->GetID( );
- int dest = f->dest;
-
- dor_next_torus( cur, dest, in_channel,
- &out_port, &f->ph, true );
-
- // at the destination router, we don't need to separate VCs by ring partition
- if(cur != dest) {
-
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- if ( f->ph == 0 ) {
- vcEnd -= available_vcs;
- } else {
- assert(f->ph == 1);
- vcBegin += available_vcs;
- }
- }
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << "Adding VC range ["
- << vcBegin << ","
- << vcEnd << "]"
- << " at output port " << out_port
- << " for flit " << f->id
- << " (input port " << in_channel
- << ", destination " << f->dest << ")"
- << "." << endl;
- }
-
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-//=============================================================
-
-void min_adapt_torus( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- outputs->Clear( );
-
- if(inject) {
- // injection can use all VCs
- outputs->AddRange(-1, vcBegin, vcEnd);
- return;
- } else if(r->GetID() == f->dest) {
- // ejection can also use all VCs
- outputs->AddRange(2*gN, vcBegin, vcEnd);
- }
-
- int in_vc;
- if ( in_channel == 2*gN ) {
- in_vc = vcEnd; // ignore the injection VC
- } else {
- in_vc = f->vc;
- }
-
- int cur = r->GetID( );
- int dest = f->dest;
-
- int out_port;
-
- if ( in_vc > ( vcBegin + 1 ) ) { // If not in the escape VCs
- // Minimal adaptive for all other channels
-
- for ( int n = 0; n < gN; ++n ) {
- if ( ( cur % gK ) != ( dest % gK ) ) {
- int dist2 = gK - 2 * ( ( ( dest % gK ) - ( cur % gK ) + gK ) % gK );
-
- if ( dist2 > 0 ) { /*) ||
- ( ( dist2 == 0 ) && ( RandomInt( 1 ) ) ) ) {*/
- outputs->AddRange( 2*n, vcBegin+3, vcBegin+3, 1 ); // Right
- } else {
- outputs->AddRange( 2*n + 1, vcBegin+3, vcBegin+3, 1 ); // Left
- }
- }
-
- cur /= gK;
- dest /= gK;
- }
-
- // DOR for the escape channel (VCs 0-1), low priority ---
- // trick the algorithm with the in channel. want VC assignment
- // as if we had injected at this node
- dor_next_torus( r->GetID( ), f->dest, 2*gN,
- &out_port, &f->ph, false );
- } else {
- // DOR for the escape channel (VCs 0-1), low priority
- dor_next_torus( cur, dest, in_channel,
- &out_port, &f->ph, false );
- }
-
- if ( f->ph == 0 ) {
- outputs->AddRange( out_port, vcBegin, vcBegin, 0 );
- } else {
- outputs->AddRange( out_port, vcBegin+1, vcBegin+1, 0 );
- }
-}
-
-//=============================================================
-
-void dest_tag_fly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- int stage = ( r->GetID( ) * gK ) / gNodes;
- int dest = f->dest;
-
- while( stage < ( gN - 1 ) ) {
- dest /= gK;
- ++stage;
- }
-
- out_port = dest % gK;
- }
-
- outputs->Clear( );
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
-
-
-
-//=============================================================
-
-void chaos_torus( const Router *r, const Flit *f,
- int in_channel, OutputSet *outputs, bool inject )
-{
- outputs->Clear( );
-
- if(inject) {
- outputs->AddRange(-1, 0, 0);
- return;
- }
-
- int cur = r->GetID( );
- int dest = f->dest;
-
- if ( cur != dest ) {
- for ( int n = 0; n < gN; ++n ) {
-
- if ( ( cur % gK ) != ( dest % gK ) ) {
- int dist2 = gK - 2 * ( ( ( dest % gK ) - ( cur % gK ) + gK ) % gK );
-
- if ( dist2 >= 0 ) {
- outputs->AddRange( 2*n, 0, 0 ); // Right
- }
-
- if ( dist2 <= 0 ) {
- outputs->AddRange( 2*n + 1, 0, 0 ); // Left
- }
- }
-
- cur /= gK;
- dest /= gK;
- }
- } else {
- outputs->AddRange( 2*gN, 0, 0 );
- }
-}
-
-
-//=============================================================
-
-void chaos_mesh( const Router *r, const Flit *f,
- int in_channel, OutputSet *outputs, bool inject )
-{
- outputs->Clear( );
-
- if(inject) {
- outputs->AddRange(-1, 0, 0);
- return;
- }
-
- int cur = r->GetID( );
- int dest = f->dest;
-
- if ( cur != dest ) {
- for ( int n = 0; n < gN; ++n ) {
- if ( ( cur % gK ) != ( dest % gK ) ) {
- // Add minimal direction in dimension 'n'
- if ( ( cur % gK ) < ( dest % gK ) ) { // Right
- outputs->AddRange( 2*n, 0, 0 );
- } else { // Left
- outputs->AddRange( 2*n + 1, 0, 0 );
- }
- }
- cur /= gK;
- dest /= gK;
- }
- } else {
- outputs->AddRange( 2*gN, 0, 0 );
- }
-}
-
-//=============================================================
-
-void InitializeRoutingMap( const Configuration & config )
-{
-
- gNumVCs = config.GetInt( "num_vcs" );
-
- //
- // traffic class partitions
- //
- gReadReqBeginVC = config.GetInt("read_request_begin_vc");
- if(gReadReqBeginVC < 0) {
- gReadReqBeginVC = 0;
- }
- gReadReqEndVC = config.GetInt("read_request_end_vc");
- if(gReadReqEndVC < 0) {
- gReadReqEndVC = gNumVCs / 2 - 1;
- }
- gWriteReqBeginVC = config.GetInt("write_request_begin_vc");
- if(gWriteReqBeginVC < 0) {
- gWriteReqBeginVC = 0;
- }
- gWriteReqEndVC = config.GetInt("write_request_end_vc");
- if(gWriteReqEndVC < 0) {
- gWriteReqEndVC = gNumVCs / 2 - 1;
- }
- gReadReplyBeginVC = config.GetInt("read_reply_begin_vc");
- if(gReadReplyBeginVC < 0) {
- gReadReplyBeginVC = gNumVCs / 2;
- }
- gReadReplyEndVC = config.GetInt("read_reply_end_vc");
- if(gReadReplyEndVC < 0) {
- gReadReplyEndVC = gNumVCs - 1;
- }
- gWriteReplyBeginVC = config.GetInt("write_reply_begin_vc");
- if(gWriteReplyBeginVC < 0) {
- gWriteReplyBeginVC = gNumVCs / 2;
- }
- gWriteReplyEndVC = config.GetInt("write_reply_end_vc");
- if(gWriteReplyEndVC < 0) {
- gWriteReplyEndVC = gNumVCs - 1;
- }
-
- /* Register routing functions here */
-
- // ===================================================
- // Balfour-Schultz
- gRoutingFunctionMap["nca_fattree"] = &fattree_nca;
- gRoutingFunctionMap["anca_fattree"] = &fattree_anca;
- gRoutingFunctionMap["nca_qtree"] = &qtree_nca;
- gRoutingFunctionMap["nca_tree4"] = &tree4_nca;
- gRoutingFunctionMap["anca_tree4"] = &tree4_anca;
- gRoutingFunctionMap["dor_mesh"] = &dim_order_mesh;
- gRoutingFunctionMap["xy_yx_mesh"] = &xy_yx_mesh;
- gRoutingFunctionMap["adaptive_xy_yx_mesh"] = &adaptive_xy_yx_mesh;
- // End Balfour-Schultz
- // ===================================================
-
- gRoutingFunctionMap["dim_order_mesh"] = &dim_order_mesh;
- gRoutingFunctionMap["dim_order_ni_mesh"] = &dim_order_ni_mesh;
- gRoutingFunctionMap["dim_order_pni_mesh"] = &dim_order_pni_mesh;
- gRoutingFunctionMap["dim_order_torus"] = &dim_order_torus;
- gRoutingFunctionMap["dim_order_ni_torus"] = &dim_order_ni_torus;
- gRoutingFunctionMap["dim_order_bal_torus"] = &dim_order_bal_torus;
-
- gRoutingFunctionMap["romm_mesh"] = &romm_mesh;
- gRoutingFunctionMap["romm_ni_mesh"] = &romm_ni_mesh;
-
- gRoutingFunctionMap["min_adapt_mesh"] = &min_adapt_mesh;
- gRoutingFunctionMap["min_adapt_torus"] = &min_adapt_torus;
-
- gRoutingFunctionMap["planar_adapt_mesh"] = &planar_adapt_mesh;
-
- // FIXME: This is broken.
- // gRoutingFunctionMap["limited_adapt_mesh"] = &limited_adapt_mesh;
-
- gRoutingFunctionMap["valiant_mesh"] = &valiant_mesh;
- gRoutingFunctionMap["valiant_torus"] = &valiant_torus;
- gRoutingFunctionMap["valiant_ni_torus"] = &valiant_ni_torus;
-
- gRoutingFunctionMap["dest_tag_fly"] = &dest_tag_fly;
-
- gRoutingFunctionMap["chaos_mesh"] = &chaos_mesh;
- gRoutingFunctionMap["chaos_torus"] = &chaos_torus;
-}
diff --git a/src/intersim2/.svn/pristine/47/471f8248dcd907fcddacc3b42c965e4919cb2f35.svn-base b/src/intersim2/.svn/pristine/47/471f8248dcd907fcddacc3b42c965e4919cb2f35.svn-base
deleted file mode 100644
index 9e65de5..0000000
--- a/src/intersim2/.svn/pristine/47/471f8248dcd907fcddacc3b42c965e4919cb2f35.svn-base
+++ /dev/null
@@ -1,48 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _ISLIP_HPP_
-#define _ISLIP_HPP_
-
-#include <vector>
-
-#include "allocator.hpp"
-
-class iSLIP_Sparse : public SparseAllocator {
- int _iSLIP_iter;
-
- vector<int> _gptrs;
- vector<int> _aptrs;
-
-public:
- iSLIP_Sparse( Module *parent, const string& name,
- int inputs, int outputs, int iters );
-
- void Allocate( );
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/4d/4d8326ecf3cc79ffda12daf20e4a46b4439ada88.svn-base b/src/intersim2/.svn/pristine/4d/4d8326ecf3cc79ffda12daf20e4a46b4439ada88.svn-base
deleted file mode 100644
index d96bd56..0000000
--- a/src/intersim2/.svn/pristine/4d/4d8326ecf3cc79ffda12daf20e4a46b4439ada88.svn-base
+++ /dev/null
@@ -1,290 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*network.cpp
- *
- *This class is the basis of the entire network, it contains, all the routers
- *channels in the network, and is extended by all the network topologies
- *
- */
-
-#include <cassert>
-#include <sstream>
-
-#include "booksim.hpp"
-#include "network.hpp"
-
-#include "kncube.hpp"
-#include "fly.hpp"
-#include "cmesh.hpp"
-#include "flatfly_onchip.hpp"
-#include "qtree.hpp"
-#include "tree4.hpp"
-#include "fattree.hpp"
-#include "anynet.hpp"
-#include "dragonfly.hpp"
-
-
-Network::Network( const Configuration &config, const string & name ) :
- TimedModule( 0, name )
-{
- _size = -1;
- _nodes = -1;
- _channels = -1;
- _classes = config.GetInt("classes");
-}
-
-Network::~Network( )
-{
- for ( int r = 0; r < _size; ++r ) {
- if ( _routers[r] ) delete _routers[r];
- }
- for ( int s = 0; s < _nodes; ++s ) {
- if ( _inject[s] ) delete _inject[s];
- if ( _inject_cred[s] ) delete _inject_cred[s];
- }
- for ( int d = 0; d < _nodes; ++d ) {
- if ( _eject[d] ) delete _eject[d];
- if ( _eject_cred[d] ) delete _eject_cred[d];
- }
- for ( int c = 0; c < _channels; ++c ) {
- if ( _chan[c] ) delete _chan[c];
- if ( _chan_cred[c] ) delete _chan_cred[c];
- }
-}
-
-Network * Network::New(const Configuration & config, const string & name)
-{
- const string topo = config.GetStr( "topology" );
- Network * n = NULL;
- if ( topo == "torus" ) {
- KNCube::RegisterRoutingFunctions() ;
- n = new KNCube( config, name, false );
- } else if ( topo == "mesh" ) {
- KNCube::RegisterRoutingFunctions() ;
- n = new KNCube( config, name, true );
- } else if ( topo == "cmesh" ) {
- CMesh::RegisterRoutingFunctions() ;
- n = new CMesh( config, name );
- } else if ( topo == "fly" ) {
- KNFly::RegisterRoutingFunctions() ;
- n = new KNFly( config, name );
- } else if ( topo == "qtree" ) {
- QTree::RegisterRoutingFunctions() ;
- n = new QTree( config, name );
- } else if ( topo == "tree4" ) {
- Tree4::RegisterRoutingFunctions() ;
- n = new Tree4( config, name );
- } else if ( topo == "fattree" ) {
- FatTree::RegisterRoutingFunctions() ;
- n = new FatTree( config, name );
- } else if ( topo == "flatfly" ) {
- FlatFlyOnChip::RegisterRoutingFunctions() ;
- n = new FlatFlyOnChip( config, name );
- } else if ( topo == "anynet"){
- AnyNet::RegisterRoutingFunctions() ;
- n = new AnyNet(config, name);
- } else if ( topo == "dragonflynew"){
- DragonFlyNew::RegisterRoutingFunctions() ;
- n = new DragonFlyNew(config, name);
- } else {
- cerr << "Unknown topology: " << topo << endl;
- }
-
- /*legacy code that insert random faults in the networks
- *not sure how to use this
- */
- if ( n && ( config.GetInt( "link_failures" ) > 0 ) ) {
- n->InsertRandomFaults( config );
- }
- return n;
-}
-
-void Network::_Alloc( )
-{
- assert( ( _size != -1 ) &&
- ( _nodes != -1 ) &&
- ( _channels != -1 ) );
-
- _routers.resize(_size);
- gNodes = _nodes;
-
- /*booksim used arrays of flits as the channels which makes have capacity of
- *one. To simulate channel latency, flitchannel class has been added
- *which are fifos with depth = channel latency and each cycle the channel
- *shifts by one
- *credit channels are the necessary counter part
- */
- _inject.resize(_nodes);
- _inject_cred.resize(_nodes);
- for ( int s = 0; s < _nodes; ++s ) {
- ostringstream name;
- name << Name() << "_fchan_ingress" << s;
- _inject[s] = new FlitChannel(this, name.str(), _classes);
- _inject[s]->SetSource(NULL, s);
- _timed_modules.push_back(_inject[s]);
- name.str("");
- name << Name() << "_cchan_ingress" << s;
- _inject_cred[s] = new CreditChannel(this, name.str());
- _timed_modules.push_back(_inject_cred[s]);
- }
- _eject.resize(_nodes);
- _eject_cred.resize(_nodes);
- for ( int d = 0; d < _nodes; ++d ) {
- ostringstream name;
- name << Name() << "_fchan_egress" << d;
- _eject[d] = new FlitChannel(this, name.str(), _classes);
- _eject[d]->SetSink(NULL, d);
- _timed_modules.push_back(_eject[d]);
- name.str("");
- name << Name() << "_cchan_egress" << d;
- _eject_cred[d] = new CreditChannel(this, name.str());
- _timed_modules.push_back(_eject_cred[d]);
- }
- _chan.resize(_channels);
- _chan_cred.resize(_channels);
- for ( int c = 0; c < _channels; ++c ) {
- ostringstream name;
- name << Name() << "_fchan_" << c;
- _chan[c] = new FlitChannel(this, name.str(), _classes);
- _timed_modules.push_back(_chan[c]);
- name.str("");
- name << Name() << "_cchan_" << c;
- _chan_cred[c] = new CreditChannel(this, name.str());
- _timed_modules.push_back(_chan_cred[c]);
- }
-}
-
-void Network::ReadInputs( )
-{
- for(deque<TimedModule *>::const_iterator iter = _timed_modules.begin();
- iter != _timed_modules.end();
- ++iter) {
- (*iter)->ReadInputs( );
- }
-}
-
-void Network::Evaluate( )
-{
- for(deque<TimedModule *>::const_iterator iter = _timed_modules.begin();
- iter != _timed_modules.end();
- ++iter) {
- (*iter)->Evaluate( );
- }
-}
-
-void Network::WriteOutputs( )
-{
- for(deque<TimedModule *>::const_iterator iter = _timed_modules.begin();
- iter != _timed_modules.end();
- ++iter) {
- (*iter)->WriteOutputs( );
- }
-}
-
-void Network::WriteFlit( Flit *f, int source )
-{
- assert( ( source >= 0 ) && ( source < _nodes ) );
- _inject[source]->Send(f);
-}
-
-Flit *Network::ReadFlit( int dest )
-{
- assert( ( dest >= 0 ) && ( dest < _nodes ) );
- return _eject[dest]->Receive();
-}
-
-void Network::WriteCredit( Credit *c, int dest )
-{
- assert( ( dest >= 0 ) && ( dest < _nodes ) );
- _eject_cred[dest]->Send(c);
-}
-
-Credit *Network::ReadCredit( int source )
-{
- assert( ( source >= 0 ) && ( source < _nodes ) );
- return _inject_cred[source]->Receive();
-}
-
-void Network::InsertRandomFaults( const Configuration &config )
-{
- Error( "InsertRandomFaults not implemented for this topology!" );
-}
-
-void Network::OutChannelFault( int r, int c, bool fault )
-{
- assert( ( r >= 0 ) && ( r < _size ) );
- _routers[r]->OutChannelFault( c, fault );
-}
-
-double Network::Capacity( ) const
-{
- return 1.0;
-}
-
-/* this function can be heavily modified to display any information
- * neceesary of the network, by default, call display on each router
- * and display the channel utilization rate
- */
-void Network::Display( ostream & os ) const
-{
- for ( int r = 0; r < _size; ++r ) {
- _routers[r]->Display( os );
- }
-}
-
-void Network::DumpChannelMap( ostream & os, string const & prefix ) const
-{
- os << prefix << "source_router,source_port,dest_router,dest_port" << endl;
- for(int c = 0; c < _nodes; ++c)
- os << prefix
- << "-1,"
- << _inject[c]->GetSourcePort() << ','
- << _inject[c]->GetSink()->GetID() << ','
- << _inject[c]->GetSinkPort() << endl;
- for(int c = 0; c < _channels; ++c)
- os << prefix
- << _chan[c]->GetSource()->GetID() << ','
- << _chan[c]->GetSourcePort() << ','
- << _chan[c]->GetSink()->GetID() << ','
- << _chan[c]->GetSinkPort() << endl;
- for(int c = 0; c < _nodes; ++c)
- os << prefix
- << _eject[c]->GetSource()->GetID() << ','
- << _eject[c]->GetSourcePort() << ','
- << "-1,"
- << _eject[c]->GetSinkPort() << endl;
-}
-
-void Network::DumpNodeMap( ostream & os, string const & prefix ) const
-{
- os << prefix << "source_router,dest_router" << endl;
- for(int s = 0; s < _nodes; ++s)
- os << prefix
- << _eject[s]->GetSource()->GetID() << ','
- << _inject[s]->GetSink()->GetID() << endl;
-}
diff --git a/src/intersim2/.svn/pristine/52/52025d7789c8bb45a38bad2e58ac67cc26f3b4ed.svn-base b/src/intersim2/.svn/pristine/52/52025d7789c8bb45a38bad2e58ac67cc26f3b4ed.svn-base
deleted file mode 100644
index 261c411..0000000
--- a/src/intersim2/.svn/pristine/52/52025d7789c8bb45a38bad2e58ac67cc26f3b4ed.svn-base
+++ /dev/null
@@ -1,99 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// File Name: flitchannel.hpp
-//
-// The FlitChannel models a flit channel with a multi-cycle
-// transmission delay. The channel latency can be specified as
-// an integer number of simulator cycles.
-// ----------------------------------------------------------------------
-
-#ifndef FLITCHANNEL_HPP
-#define FLITCHANNEL_HPP
-
-// ----------------------------------------------------------------------
-// $Author: jbalfour $
-// $Date: 2007/06/27 23:10:17 $
-// $Id$
-// ----------------------------------------------------------------------
-
-#include "channel.hpp"
-#include "flit.hpp"
-
-using namespace std;
-
-class Router ;
-
-class FlitChannel : public Channel<Flit> {
-public:
- FlitChannel(Module * parent, string const & name, int classes);
-
- void SetSource(Router const * const router, int port) ;
- inline Router const * const GetSource() const {
- return _routerSource;
- }
- inline int const & GetSourcePort() const {
- return _routerSourcePort;
- }
- void SetSink(Router const * const router, int port) ;
- inline Router const * const GetSink() const {
- return _routerSink;
- }
- inline int const & GetSinkPort() const {
- return _routerSinkPort;
- }
- inline vector<int> const & GetActivity() const {
- return _active;
- }
-
- // Send flit
- virtual void Send(Flit * flit);
-
- virtual void ReadInputs();
- virtual void WriteOutputs();
-
-private:
-
- ////////////////////////////////////////
- //
- // Power Models OBSOLETE
- //
- ////////////////////////////////////////
-
- Router const * _routerSource;
- int _routerSourcePort;
- Router const * _routerSink;
- int _routerSinkPort;
-
- // Statistics for Activity Factors
- vector<int> _active;
- int _idle;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/55/5559780a67de13b98fb00d7f052ce254551f229b.svn-base b/src/intersim2/.svn/pristine/55/5559780a67de13b98fb00d7f052ce254551f229b.svn-base
deleted file mode 100644
index 4387d46..0000000
--- a/src/intersim2/.svn/pristine/55/5559780a67de13b98fb00d7f052ce254551f229b.svn-base
+++ /dev/null
@@ -1,88 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _FlatFlyOnChip_HPP_
-#define _FlatFlyOnChip_HPP_
-
-#include "network.hpp"
-
-#include "routefunc.hpp"
-#include <cassert>
-
-
-class FlatFlyOnChip : public Network {
-
- int _m;
- int _n;
- int _r;
- int _k;
- int _c;
- int _radix;
- int _net_size;
- int _stageout;
- int _numinput;
- int _stages;
- int _num_of_switch;
-
- void _ComputeSize( const Configuration &config );
- void _BuildNet( const Configuration &config );
-
- int _OutChannel( int stage, int addr, int port, int outputs ) const;
- int _InChannel( int stage, int addr, int port ) const;
-
-public:
- FlatFlyOnChip( const Configuration &config, const string & name );
-
- int GetN( ) const;
- int GetK( ) const;
-
- static void RegisterRoutingFunctions() ;
- double Capacity( ) const;
- void InsertRandomFaults( const Configuration &config );
-};
-void adaptive_xyyx_flatfly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-void xyyx_flatfly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-void min_flatfly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-void ugal_xyyx_flatfly_onchip( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-void ugal_flatfly_onchip( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-void ugal_pni_flatfly_onchip( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-void valiant_flatfly( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-
-int find_distance (int src, int dest);
-int find_ran_intm (int src, int dest);
-int flatfly_outport(int dest, int rID);
-int flatfly_transformation(int dest);
-int flatfly_outport_yx(int dest, int rID);
-
-#endif
diff --git a/src/intersim2/.svn/pristine/55/55ee19fa1932804a55ee815f4456c4a6f21a355f.svn-base b/src/intersim2/.svn/pristine/55/55ee19fa1932804a55ee815f4456c4a6f21a355f.svn-base
deleted file mode 100644
index 5d38938..0000000
--- a/src/intersim2/.svn/pristine/55/55ee19fa1932804a55ee815f4456c4a6f21a355f.svn-base
+++ /dev/null
@@ -1,239 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _BUFFER_STATE_HPP_
-#define _BUFFER_STATE_HPP_
-
-#include <vector>
-#include <queue>
-
-#include "module.hpp"
-#include "flit.hpp"
-#include "credit.hpp"
-#include "config_utils.hpp"
-
-class BufferState : public Module {
-
- class BufferPolicy : public Module {
- protected:
- BufferState const * const _buffer_state;
- public:
- BufferPolicy(Configuration const & config, BufferState * parent,
- const string & name);
- virtual void SetMinLatency(int min_latency) {}
- virtual void TakeBuffer(int vc = 0);
- virtual void SendingFlit(Flit const * const f);
- virtual void FreeSlotFor(int vc = 0);
- virtual bool IsFullFor(int vc = 0) const = 0;
- virtual int AvailableFor(int vc = 0) const = 0;
- virtual int LimitFor(int vc = 0) const = 0;
-
- static BufferPolicy * New(Configuration const & config,
- BufferState * parent, const string & name);
- };
-
- class PrivateBufferPolicy : public BufferPolicy {
- protected:
- int _vc_buf_size;
- public:
- PrivateBufferPolicy(Configuration const & config, BufferState * parent,
- const string & name);
- virtual void SendingFlit(Flit const * const f);
- virtual bool IsFullFor(int vc = 0) const;
- virtual int AvailableFor(int vc = 0) const;
- virtual int LimitFor(int vc = 0) const;
- };
-
- class SharedBufferPolicy : public BufferPolicy {
- protected:
- int _buf_size;
- vector<int> _private_buf_vc_map;
- vector<int> _private_buf_size;
- vector<int> _private_buf_occupancy;
- int _shared_buf_size;
- int _shared_buf_occupancy;
- vector<int> _reserved_slots;
- void ProcessFreeSlot(int vc = 0);
- public:
- SharedBufferPolicy(Configuration const & config, BufferState * parent,
- const string & name);
- virtual void SendingFlit(Flit const * const f);
- virtual void FreeSlotFor(int vc = 0);
- virtual bool IsFullFor(int vc = 0) const;
- virtual int AvailableFor(int vc = 0) const;
- virtual int LimitFor(int vc = 0) const;
- };
-
- class LimitedSharedBufferPolicy : public SharedBufferPolicy {
- protected:
- int _vcs;
- int _active_vcs;
- int _max_held_slots;
- public:
- LimitedSharedBufferPolicy(Configuration const & config,
- BufferState * parent,
- const string & name);
- virtual void TakeBuffer(int vc = 0);
- virtual void SendingFlit(Flit const * const f);
- virtual bool IsFullFor(int vc = 0) const;
- virtual int AvailableFor(int vc = 0) const;
- virtual int LimitFor(int vc = 0) const;
- };
-
- class DynamicLimitedSharedBufferPolicy : public LimitedSharedBufferPolicy {
- public:
- DynamicLimitedSharedBufferPolicy(Configuration const & config,
- BufferState * parent,
- const string & name);
- virtual void TakeBuffer(int vc = 0);
- virtual void SendingFlit(Flit const * const f);
- };
-
- class ShiftingDynamicLimitedSharedBufferPolicy : public DynamicLimitedSharedBufferPolicy {
- public:
- ShiftingDynamicLimitedSharedBufferPolicy(Configuration const & config,
- BufferState * parent,
- const string & name);
- virtual void TakeBuffer(int vc = 0);
- virtual void SendingFlit(Flit const * const f);
- };
-
- class FeedbackSharedBufferPolicy : public SharedBufferPolicy {
- protected:
- int _ComputeRTT(int vc, int last_rtt) const;
- int _ComputeLimit(int rtt) const;
- int _ComputeMaxSlots(int vc) const;
- int _vcs;
- vector<int> _occupancy_limit;
- vector<int> _round_trip_time;
- vector<queue<int> > _flit_sent_time;
- int _min_latency;
- int _total_mapped_size;
- int _aging_scale;
- int _offset;
- public:
- FeedbackSharedBufferPolicy(Configuration const & config,
- BufferState * parent, const string & name);
- virtual void SetMinLatency(int min_latency);
- virtual void SendingFlit(Flit const * const f);
- virtual void FreeSlotFor(int vc = 0);
- virtual bool IsFullFor(int vc = 0) const;
- virtual int AvailableFor(int vc = 0) const;
- virtual int LimitFor(int vc = 0) const;
- };
-
- class SimpleFeedbackSharedBufferPolicy : public FeedbackSharedBufferPolicy {
- protected:
- vector<int> _pending_credits;
- public:
- SimpleFeedbackSharedBufferPolicy(Configuration const & config,
- BufferState * parent, const string & name);
- virtual void SendingFlit(Flit const * const f);
- virtual void FreeSlotFor(int vc = 0);
- };
-
- bool _wait_for_tail_credit;
- int _size;
- int _occupancy;
- vector<int> _vc_occupancy;
- int _vcs;
-
- BufferPolicy * _buffer_policy;
-
- vector<int> _in_use_by;
- vector<bool> _tail_sent;
- vector<int> _last_id;
- vector<int> _last_pid;
-
-#ifdef TRACK_BUFFERS
- int _classes;
- vector<queue<int> > _outstanding_classes;
- vector<int> _class_occupancy;
-#endif
-
-public:
-
- BufferState( const Configuration& config,
- Module *parent, const string& name );
-
- ~BufferState();
-
- inline void SetMinLatency(int min_latency) {
- _buffer_policy->SetMinLatency(min_latency);
- }
-
- void ProcessCredit( Credit const * const c );
- void SendingFlit( Flit const * const f );
-
- void TakeBuffer( int vc = 0, int tag = 0 );
-
- inline bool IsFull() const {
- assert(_occupancy <= _size);
- return (_occupancy == _size);
- }
- inline bool IsFullFor( int vc = 0 ) const {
- return _buffer_policy->IsFullFor(vc);
- }
- inline int AvailableFor( int vc = 0 ) const {
- return _buffer_policy->AvailableFor(vc);
- }
- inline int LimitFor( int vc = 0 ) const {
- return _buffer_policy->LimitFor(vc);
- }
- inline bool IsEmptyFor(int vc = 0) const {
- assert((vc >= 0) && (vc < _vcs));
- return (_vc_occupancy[vc] == 0);
- }
- inline bool IsAvailableFor( int vc = 0 ) const {
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- return _in_use_by[vc] < 0;
- }
- inline int UsedBy(int vc = 0) const {
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- return _in_use_by[vc];
- }
-
- inline int Occupancy() const {
- return _occupancy;
- }
-
- inline int OccupancyFor( int vc = 0 ) const {
- assert((vc >= 0) && (vc < _vcs));
- return _vc_occupancy[vc];
- }
-
-#ifdef TRACK_BUFFERS
- inline int OccupancyForClass(int c) const {
- assert((c >= 0) && (c < _classes));
- return _class_occupancy[c];
- }
-#endif
-
- void Display( ostream & os = cout ) const;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/56/569d5254648903d6589a32c30a98b3276cdbdebd.svn-base b/src/intersim2/.svn/pristine/56/569d5254648903d6589a32c30a98b3276cdbdebd.svn-base
deleted file mode 100644
index 5ecb0f9..0000000
--- a/src/intersim2/.svn/pristine/56/569d5254648903d6589a32c30a98b3276cdbdebd.svn-base
+++ /dev/null
@@ -1,91 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// File Name: flitchannel.cpp
-// Author: James Balfour, Rebecca Schultz
-//
-// ----------------------------------------------------------------------
-
-#include "flitchannel.hpp"
-
-#include <iostream>
-#include <iomanip>
-
-#include "router.hpp"
-#include "globals.hpp"
-
-// ----------------------------------------------------------------------
-// $Author: jbalfour $
-// $Date: 2007/06/27 23:10:17 $
-// $Id$
-// ----------------------------------------------------------------------
-FlitChannel::FlitChannel(Module * parent, string const & name, int classes)
-: Channel<Flit>(parent, name), _routerSource(NULL), _routerSourcePort(-1),
- _routerSink(NULL), _routerSinkPort(-1), _idle(0) {
- _active.resize(classes, 0);
-}
-
-void FlitChannel::SetSource(Router const * const router, int port) {
- _routerSource = router;
- _routerSourcePort = port;
-}
-
-void FlitChannel::SetSink(Router const * const router, int port) {
- _routerSink = router;
- _routerSinkPort = port;
-}
-
-void FlitChannel::Send(Flit * f) {
- if(f) {
- ++_active[f->cl];
- } else {
- ++_idle;
- }
- Channel<Flit>::Send(f);
-}
-
-void FlitChannel::ReadInputs() {
- Flit const * const & f = _input;
- if(f && f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Beginning channel traversal for flit " << f->id
- << " with delay " << _delay
- << "." << endl;
- }
- Channel<Flit>::ReadInputs();
-}
-
-void FlitChannel::WriteOutputs() {
- Channel<Flit>::WriteOutputs();
- if(_output && _output->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Completed channel traversal for flit " << _output->id
- << "." << endl;
- }
-}
diff --git a/src/intersim2/.svn/pristine/58/589a6050104bd5e828d72f3efdc31796eae32683.svn-base b/src/intersim2/.svn/pristine/58/589a6050104bd5e828d72f3efdc31796eae32683.svn-base
deleted file mode 100644
index 59249e6..0000000
--- a/src/intersim2/.svn/pristine/58/589a6050104bd5e828d72f3efdc31796eae32683.svn-base
+++ /dev/null
@@ -1,51 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _MAXSIZE_HPP_
-#define _MAXSIZE_HPP_
-
-#include <vector>
-
-#include "allocator.hpp"
-
-class MaxSizeMatch : public DenseAllocator {
- vector<int> _from; // array to hold breadth-first tree
- int *_s; // stack of leaf nodes in tree
- int *_ns; // next stack
- int _prio; // priority pointer to ensure fairness
-
- bool _ShortestAugmenting( );
-
-public:
- MaxSizeMatch( Module *parent, const string& name,
- int inputs, int ouputs );
- ~MaxSizeMatch( );
-
- void Allocate( );
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/59/59bcc26ad66045a58e3f0590f2b12ad7eba5991f.svn-base b/src/intersim2/.svn/pristine/59/59bcc26ad66045a58e3f0590f2b12ad7eba5991f.svn-base
deleted file mode 100644
index 5919b56..0000000
--- a/src/intersim2/.svn/pristine/59/59bcc26ad66045a58e3f0590f2b12ad7eba5991f.svn-base
+++ /dev/null
@@ -1,71 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// Matrix: Matrix Arbiter
-//
-// ----------------------------------------------------------------------
-
-#ifndef _MATRIX_ARB_HPP_
-#define _MATRIX_ARB_HPP_
-
-#include <vector>
-
-#include "arbiter.hpp"
-
-using namespace std;
-
-class MatrixArbiter : public Arbiter {
-
- // Priority matrix
- vector<vector<int> > _matrix ;
-
- int _last_req ;
-
-public:
-
- // Constructors
- MatrixArbiter( Module *parent, const string &name, int size ) ;
-
- // Print priority matrix to standard output
- virtual void PrintState() const ;
-
- // Update priority matrix based on last aribtration result
- virtual void UpdateState() ;
-
- // Arbitrate amongst requests. Returns winning input and
- // updates pointers to metadata when valid pointers are passed
- virtual int Arbitrate( int* id = 0, int* pri = 0) ;
-
- virtual void AddRequest( int input, int id, int pri ) ;
-
- virtual void Clear();
-
-} ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/5c/5cc61faafce12ea44fa63fb32a14f8f0c74c7338.svn-base b/src/intersim2/.svn/pristine/5c/5cc61faafce12ea44fa63fb32a14f8f0c74c7338.svn-base
deleted file mode 100644
index d438ee6..0000000
--- a/src/intersim2/.svn/pristine/5c/5cc61faafce12ea44fa63fb32a14f8f0c74c7338.svn-base
+++ /dev/null
@@ -1,66 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _OUTPUTSET_HPP_
-#define _OUTPUTSET_HPP_
-
-#include <set>
-
-class OutputSet {
-
-
-public:
- struct sSetElement {
- int vc_start;
- int vc_end;
- int pri;
- int output_port;
- };
-
- void Clear( );
- void Add( int output_port, int vc, int pri = 0 );
- void AddRange( int output_port, int vc_start, int vc_end, int pri = 0 );
-
- bool OutputEmpty( int output_port ) const;
- int NumVCs( int output_port ) const;
-
- const set<sSetElement> & GetSet() const;
-
- int GetVC( int output_port, int vc_index, int *pri = 0 ) const;
- bool GetPortVC( int *out_port, int *out_vc ) const;
-private:
- set<sSetElement> _outputs;
-};
-
-inline bool operator<(const OutputSet::sSetElement & se1,
- const OutputSet::sSetElement & se2) {
- return se1.pri > se2.pri; // higher priorities first!
-}
-
-#endif
-
-
diff --git a/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base b/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base
deleted file mode 100644
index 44d597c..0000000
--- a/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base
+++ /dev/null
@@ -1,187 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-////////////////////////////////////////////////////////////////////////
-//
-// QTree: A Quad-Tree Indirect Network.
-//
-//
-////////////////////////////////////////////////////////////////////////
-//
-// RCS Information:
-// $Author: jbalfour $
-// $Date: 2007/05/17 17:14:07 $
-// $Id$
-//
-////////////////////////////////////////////////////////////////////////
-
-#include "booksim.hpp"
-#include <vector>
-#include <sstream>
-#include "qtree.hpp"
-#include "misc_utils.hpp"
-
-QTree::QTree( const Configuration& config, const string & name )
-: Network ( config, name )
-{
- _ComputeSize( config );
- _Alloc( );
- _BuildNet( config );
-}
-
-
-void QTree::_ComputeSize( const Configuration& config )
-{
-
- _k = config.GetInt( "k" );
- _n = config.GetInt( "n" );
-
- assert( _k == 4 && _n == 3 );
-
- gK = _k; gN = _n;
-
- _nodes = powi( _k, _n );
-
- _size = 0;
- for (int i = 0; i < _n; i++)
- _size += powi( _k, i );
-
- _channels = 0;
- for (int j = 1; j < _n; j++)
- _channels += 2 * powi( _k, j );
-
-}
-
-void QTree::RegisterRoutingFunctions(){
-
-}
-
-void QTree::_BuildNet( const Configuration& config )
-{
-
- ostringstream routerName;
- int h, r, pos, port;
-
- for (h = 0; h < _n; h++) {
- for (pos = 0 ; pos < powi( _k, h ) ; ++pos ) {
-
- int id = h * 256 + pos;
- r = _RouterIndex( h, pos );
-
- routerName << "router_" << h << "_" << pos;
-
- int d = ( h == 0 ) ? _k : _k + 1;
- _routers[r] = Router::NewRouter( config, this,
- routerName.str( ),
- id, d, d);
- _timed_modules.push_back(_routers[r]);
- routerName.str("");
- }
- }
-
- // Injection & Ejection Channels
- for ( pos = 0 ; pos < powi( _k, _n-1 ) ; ++pos ) {
- r = _RouterIndex( _n-1, pos );
- for ( port = 0 ; port < _k ; port++ ) {
-
- _routers[r]->AddInputChannel( _inject[_k*pos+port],
- _inject_cred[_k*pos+port]);
-
- _routers[r]->AddOutputChannel( _eject[_k*pos+port],
- _eject_cred[_k*pos+port]);
- }
- }
-
- int c;
- for ( h = 0 ; h < _n ; ++h ) {
- for ( pos = 0 ; pos < powi( _k, h ) ; ++pos ) {
- for ( port = 0 ; port < _k ; port++ ) {
-
- r = _RouterIndex( h, pos );
-
- if ( h < _n-1 ) {
- // Channels to Children Nodes
- c = _InputIndex( h , pos, port );
- _routers[r]->AddInputChannel( _chan[c],
- _chan_cred[c] );
-
- c = _OutputIndex( h, pos, port );
- _routers[r]->AddOutputChannel( _chan[c],
- _chan_cred[c] );
-
- }
- }
- if ( h > 0 ) {
- // Channels to Parent Nodes
- c = _OutputIndex( h - 1, pos / _k, pos % _k );
- _routers[r]->AddInputChannel( _chan[c],
- _chan_cred[c] );
-
- c = _InputIndex( h - 1, pos / _k, pos % _k );
- _routers[r]->AddOutputChannel( _chan[c],
- _chan_cred[c]);
- }
- }
- }
-}
-
-int QTree::_RouterIndex( int height, int pos )
-{
- int r = 0;
- for ( int h = 0; h < height; h++ )
- r += powi( _k, h );
- return (r + pos);
-}
-
-int QTree::_InputIndex( int height, int pos, int port )
-{
- assert( height >= 0 && height < powi( _k,_n-1 ) );
- int c = 0;
- for ( int h = 0; h < height; h++)
- c += powi( _k, h+1 );
- return ( c + _k * pos + port );
-}
-
-int QTree::_OutputIndex( int height, int pos, int port )
-{
- assert( height >= 0 && height < powi( _k,_n-1 ) );
- int c = _channels / 2;
- for ( int h = 0; h < height; h++)
- c += powi( _k, h+1 );
- return ( c + _k * pos + port );
-}
-
-
-int QTree::HeightFromID( int id )
-{
- return id / 256;
-}
-
-int QTree::PosFromID( int id )
-{
- return id % 256;
-}
diff --git a/src/intersim2/.svn/pristine/65/650f86454fd17051ddb2eca80fd985027770a1ba.svn-base b/src/intersim2/.svn/pristine/65/650f86454fd17051ddb2eca80fd985027770a1ba.svn-base
deleted file mode 100644
index 466583e..0000000
--- a/src/intersim2/.svn/pristine/65/650f86454fd17051ddb2eca80fd985027770a1ba.svn-base
+++ /dev/null
@@ -1,49 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _LOA_HPP_
-#define _LOA_HPP_
-
-#include <vector>
-
-#include "allocator.hpp"
-
-class LOA : public DenseAllocator {
- vector<int> _counts;
- vector<int> _req;
-
- vector<int> _rptr;
- vector<int> _gptr;
-
-public:
- LOA( Module *parent, const string& name,
- int inputs, int outputs );
-
- void Allocate( );
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/66/6699bbb1b4cb750a8857780e76ee4923ef317c90.svn-base b/src/intersim2/.svn/pristine/66/6699bbb1b4cb750a8857780e76ee4923ef317c90.svn-base
deleted file mode 100644
index 3667472..0000000
--- a/src/intersim2/.svn/pristine/66/6699bbb1b4cb750a8857780e76ee4923ef317c90.svn-base
+++ /dev/null
@@ -1,34 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _MISC_UTILS_HPP_
-#define _MISC_UTILS_HPP_
-
-int log_two( int x );
-int powi( int x, int y );
-
-#endif
diff --git a/src/intersim2/.svn/pristine/69/691260433188a985b38ff49ca3f51e6c0b731c0a.svn-base b/src/intersim2/.svn/pristine/69/691260433188a985b38ff49ca3f51e6c0b731c0a.svn-base
deleted file mode 100644
index f9e727a..0000000
--- a/src/intersim2/.svn/pristine/69/691260433188a985b38ff49ca3f51e6c0b731c0a.svn-base
+++ /dev/null
@@ -1,118 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _NETWORK_HPP_
-#define _NETWORK_HPP_
-
-#include <vector>
-#include <deque>
-
-#include "module.hpp"
-#include "flit.hpp"
-#include "credit.hpp"
-#include "router.hpp"
-#include "module.hpp"
-#include "timed_module.hpp"
-#include "flitchannel.hpp"
-#include "channel.hpp"
-#include "config_utils.hpp"
-#include "globals.hpp"
-
-typedef Channel<Credit> CreditChannel;
-
-
-class Network : public TimedModule {
-protected:
-
- int _size;
- int _nodes;
- int _channels;
- int _classes;
-
- vector<Router *> _routers;
-
- vector<FlitChannel *> _inject;
- vector<CreditChannel *> _inject_cred;
-
- vector<FlitChannel *> _eject;
- vector<CreditChannel *> _eject_cred;
-
- vector<FlitChannel *> _chan;
- vector<CreditChannel *> _chan_cred;
-
- deque<TimedModule *> _timed_modules;
-
- virtual void _ComputeSize( const Configuration &config ) = 0;
- virtual void _BuildNet( const Configuration &config ) = 0;
-
- void _Alloc( );
-
-public:
- Network( const Configuration &config, const string & name );
- virtual ~Network( );
-
- static Network *New( const Configuration &config, const string & name );
-
- virtual void WriteFlit( Flit *f, int source );
- virtual Flit *ReadFlit( int dest );
-
- virtual void WriteCredit( Credit *c, int dest );
- virtual Credit *ReadCredit( int source );
-
- inline int NumNodes( ) const {return _nodes;}
-
- virtual void InsertRandomFaults( const Configuration &config );
- void OutChannelFault( int r, int c, bool fault = true );
-
- virtual double Capacity( ) const;
-
- virtual void ReadInputs( );
- virtual void Evaluate( );
- virtual void WriteOutputs( );
-
- void Display( ostream & os = cout ) const;
- void DumpChannelMap( ostream & os = cout, string const & prefix = "" ) const;
- void DumpNodeMap( ostream & os = cout, string const & prefix = "" ) const;
-
- int NumChannels() const {return _channels;}
- const vector<FlitChannel *> & GetInject() {return _inject;}
- FlitChannel * GetInject(int index) {return _inject[index];}
- const vector<CreditChannel *> & GetInjectCred() {return _inject_cred;}
- CreditChannel * GetInjectCred(int index) {return _inject_cred[index];}
- const vector<FlitChannel *> & GetEject(){return _eject;}
- FlitChannel * GetEject(int index) {return _eject[index];}
- const vector<CreditChannel *> & GetEjectCred(){return _eject_cred;}
- CreditChannel * GetEjectCred(int index) {return _eject_cred[index];}
- const vector<FlitChannel *> & GetChannels(){return _chan;}
- const vector<CreditChannel *> & GetChannelsCred(){return _chan_cred;}
- const vector<Router *> & GetRouters(){return _routers;}
- Router * GetRouter(int index) {return _routers[index];}
- int NumRouters() const {return _size;}
-};
-
-#endif
-
diff --git a/src/intersim2/.svn/pristine/6c/6c86a0b772d76fae9d90046d17b6ec12b77551d0.svn-base b/src/intersim2/.svn/pristine/6c/6c86a0b772d76fae9d90046d17b6ec12b77551d0.svn-base
deleted file mode 100644
index 58a3ba5..0000000
--- a/src/intersim2/.svn/pristine/6c/6c86a0b772d76fae9d90046d17b6ec12b77551d0.svn-base
+++ /dev/null
@@ -1,130 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*stats.cpp
- *
- *class stores statistics gnerated by the trafficmanager such as the latency
- *hope count of the the flits
- *
- *reset option resets the min and max alues of this statistiscs
- */
-
-#include "booksim.hpp"
-#include <iostream>
-#include <sstream>
-#include <limits>
-#include <cmath>
-#include <cstdio>
-
-#include "stats.hpp"
-
-Stats::Stats( Module *parent, const string &name,
- double bin_size, int num_bins ) :
- Module( parent, name ), _num_bins( num_bins ), _bin_size( bin_size )
-{
- Clear();
-}
-
-void Stats::Clear( )
-{
- _num_samples = 0;
- _sample_sum = 0.0;
- _sample_squared_sum = 0.0;
-
- _hist.assign(_num_bins, 0);
-
- _min = numeric_limits<double>::quiet_NaN();
- _max = -numeric_limits<double>::quiet_NaN();
-
- // _reset = true;
-}
-
-double Stats::Average( ) const
-{
- return _sample_sum / (double)_num_samples;
-}
-
-double Stats::Variance( ) const
-{
- return (_sample_squared_sum * (double)_num_samples - _sample_sum * _sample_sum) / ((double)_num_samples * (double)_num_samples);
-}
-
-double Stats::Min( ) const
-{
- return _min;
-}
-
-double Stats::Max( ) const
-{
- return _max;
-}
-
-double Stats::Sum( ) const
-{
- return _sample_sum;
-}
-
-double Stats::SquaredSum( ) const
-{
- return _sample_squared_sum;
-}
-
-int Stats::NumSamples( ) const
-{
- return _num_samples;
-}
-
-void Stats::AddSample( double val )
-{
- ++_num_samples;
- _sample_sum += val;
-
- // NOTE: the negation ensures that NaN values are handled correctly!
- _max = !(val <= _max) ? val : _max;
- _min = !(val >= _min) ? val : _min;
-
- //double clamp between 0 and num_bins-1
- int b = (int)fmax(floor( val / _bin_size ), 0.0);
- b = (b >= _num_bins) ? (_num_bins - 1) : b;
-
- _hist[b]++;
-}
-
-void Stats::Display( ostream & os ) const
-{
- os << *this << endl;
-}
-
-ostream & operator<<(ostream & os, const Stats & s) {
- vector<int> const & v = s._hist;
- os << "[ ";
- for(size_t i = 0; i < v.size(); ++i) {
- os << v[i] << " ";
- }
- os << "]";
- return os;
-}
diff --git a/src/intersim2/.svn/pristine/6d/6d0272df1c727d8c5fa77a3bfa9155d50335a5c6.svn-base b/src/intersim2/.svn/pristine/6d/6d0272df1c727d8c5fa77a3bfa9155d50335a5c6.svn-base
deleted file mode 100644
index bbda15a..0000000
--- a/src/intersim2/.svn/pristine/6d/6d0272df1c727d8c5fa77a3bfa9155d50335a5c6.svn-base
+++ /dev/null
@@ -1,95 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-////////////////////////////////////////////////////////////////////////
-//
-// CMesh: Mesh topology with concentration and express links along the
-// edge of the network
-//
-////////////////////////////////////////////////////////////////////////
-//
-// RCS Information:
-// $Author: jbalfour $
-// $Date: 2007/06/26 22:49:23 $
-// $Id$
-//
-////////////////////////////////////////////////////////////////////////
-#ifndef _CMESH_HPP_
-#define _CMESH_HPP_
-
-#include "network.hpp"
-#include "routefunc.hpp"
-
-class CMesh : public Network {
-public:
- CMesh( const Configuration &config, const string & name );
- int GetN() const;
- int GetK() const;
-
- static int NodeToRouter( int address ) ;
- static int NodeToPort( int address ) ;
-
- static void RegisterRoutingFunctions() ;
-
-private:
-
- static int _cX ;
- static int _cY ;
-
- static int _memo_NodeShiftX ;
- static int _memo_NodeShiftY ;
- static int _memo_PortShiftY ;
-
- void _ComputeSize( const Configuration &config );
- void _BuildNet( const Configuration& config );
-
- int _k ;
- int _n ;
- int _c ;
- int _xcount;
- int _ycount;
- int _xrouter;
- int _yrouter;
- bool _express_channels;
-};
-
-//
-// Routing Functions
-//
-void xy_yx_cmesh( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject ) ;
-
-void xy_yx_no_express_cmesh( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject ) ;
-
-void dor_cmesh( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject ) ;
-
-void dor_no_express_cmesh( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject ) ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/6e/6ee04608f65a1c9be65fcbe3def54f38d00f1bf5.svn-base b/src/intersim2/.svn/pristine/6e/6ee04608f65a1c9be65fcbe3def54f38d00f1bf5.svn-base
deleted file mode 100644
index 9df88db..0000000
--- a/src/intersim2/.svn/pristine/6e/6ee04608f65a1c9be65fcbe3def54f38d00f1bf5.svn-base
+++ /dev/null
@@ -1,518 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <iostream>
-#include <sstream>
-#include "random_utils.hpp"
-#include "traffic.hpp"
-
-TrafficPattern::TrafficPattern(int nodes)
-: _nodes(nodes)
-{
- if(nodes <= 0) {
- cout << "Error: Traffic patterns require at least one node." << endl;
- exit(-1);
- }
-}
-
-void TrafficPattern::reset()
-{
-
-}
-
-TrafficPattern * TrafficPattern::New(string const & pattern, int nodes,
- Configuration const * const config)
-{
- string pattern_name;
- string param_str;
- size_t left = pattern.find_first_of('(');
- if(left == string::npos) {
- pattern_name = pattern;
- } else {
- pattern_name = pattern.substr(0, left);
- size_t right = pattern.find_last_of(')');
- if(right == string::npos) {
- param_str = pattern.substr(left+1);
- } else {
- param_str = pattern.substr(left+1, right-left-1);
- }
- }
- vector<string> params = tokenize_str(param_str);
-
- TrafficPattern * result = NULL;
- if(pattern_name == "bitcomp") {
- result = new BitCompTrafficPattern(nodes);
- } else if(pattern_name == "transpose") {
- result = new TransposeTrafficPattern(nodes);
- } else if(pattern_name == "bitrev") {
- result = new BitRevTrafficPattern(nodes);
- } else if(pattern_name == "shuffle") {
- result = new ShuffleTrafficPattern(nodes);
- } else if(pattern_name == "randperm") {
- int perm_seed = -1;
- if(params.empty()) {
- if(config) {
- perm_seed = config->GetInt("perm_seed");
- } else {
- cout << "Error: Missing parameter for random permutation traffic pattern: " << pattern << endl;
- exit(-1);
- }
- } else {
- perm_seed = atoi(params[0].c_str());
- }
- result = new RandomPermutationTrafficPattern(nodes, perm_seed);
- } else if(pattern_name == "uniform") {
- result = new UniformRandomTrafficPattern(nodes);
- } else if(pattern_name == "background") {
- vector<int> excludes = tokenize_int(params[0]);
- result = new UniformBackgroundTrafficPattern(nodes, excludes);
- } else if(pattern_name == "diagonal") {
- result = new DiagonalTrafficPattern(nodes);
- } else if(pattern_name == "asymmetric") {
- result = new AsymmetricTrafficPattern(nodes);
- } else if(pattern_name == "taper64") {
- result = new Taper64TrafficPattern(nodes);
- } else if(pattern_name == "bad_dragon") {
- bool missing_params = false;
- int k = -1;
- if(params.size() < 1) {
- if(config) {
- k = config->GetInt("k");
- } else {
- missing_params = true;
- }
- } else {
- k = atoi(params[0].c_str());
- }
- int n = -1;
- if(params.size() < 2) {
- if(config) {
- n = config->GetInt("n");
- } else {
- missing_params = true;
- }
- } else {
- n = atoi(params[1].c_str());
- }
- if(missing_params) {
- cout << "Error: Missing parameters for dragonfly bad permutation traffic pattern: " << pattern << endl;
- exit(-1);
- }
- result = new BadPermDFlyTrafficPattern(nodes, k, n);
- } else if((pattern_name == "tornado") || (pattern_name == "neighbor") ||
- (pattern_name == "badperm_yarc")) {
- bool missing_params = false;
- int k = -1;
- if(params.size() < 1) {
- if(config) {
- k = config->GetInt("k");
- } else {
- missing_params = true;
- }
- } else {
- k = atoi(params[0].c_str());
- }
- int n = -1;
- if(params.size() < 2) {
- if(config) {
- n = config->GetInt("n");
- } else {
- missing_params = true;
- }
- } else {
- n = atoi(params[1].c_str());
- }
- int xr = -1;
- if(params.size() < 3) {
- if(config) {
- xr = config->GetInt("xr");
- } else {
- missing_params = true;
- }
- } else {
- xr = atoi(params[2].c_str());
- }
- if(missing_params) {
- cout << "Error: Missing parameters for digit permutation traffic pattern: " << pattern << endl;
- exit(-1);
- }
- if(pattern_name == "tornado") {
- result = new TornadoTrafficPattern(nodes, k, n, xr);
- } else if(pattern_name == "neighbor") {
- result = new NeighborTrafficPattern(nodes, k, n, xr);
- } else if(pattern_name == "badperm_yarc") {
- result = new BadPermYarcTrafficPattern(nodes, k, n, xr);
- }
- } else if(pattern_name == "hotspot") {
- if(params.empty()) {
- params.push_back("-1");
- }
- vector<int> hotspots = tokenize_int(params[0]);
- for(size_t i = 0; i < hotspots.size(); ++i) {
- if(hotspots[i] < 0) {
- hotspots[i] = RandomInt(nodes - 1);
- }
- }
- vector<int> rates;
- if(params.size() >= 2) {
- rates = tokenize_int(params[1]);
- rates.resize(hotspots.size(), rates.back());
- } else {
- rates.resize(hotspots.size(), 1);
- }
- result = new HotSpotTrafficPattern(nodes, hotspots, rates);
- } else {
- cout << "Error: Unknown traffic pattern: " << pattern << endl;
- exit(-1);
- }
- return result;
-}
-
-PermutationTrafficPattern::PermutationTrafficPattern(int nodes)
- : TrafficPattern(nodes)
-{
-
-}
-
-BitPermutationTrafficPattern::BitPermutationTrafficPattern(int nodes)
- : PermutationTrafficPattern(nodes)
-{
- if((nodes & -nodes) != nodes) {
- cout << "Error: Bit permutation traffic patterns require the number of "
- << "nodes to be a power of two." << endl;
- exit(-1);
- }
-}
-
-BitCompTrafficPattern::BitCompTrafficPattern(int nodes)
- : BitPermutationTrafficPattern(nodes)
-{
-
-}
-
-int BitCompTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- int const mask = _nodes - 1;
- return ~source & mask;
-}
-
-TransposeTrafficPattern::TransposeTrafficPattern(int nodes)
- : BitPermutationTrafficPattern(nodes), _shift(0)
-{
- while(nodes >>= 1) {
- ++_shift;
- }
- if(_shift % 2) {
- cout << "Error: Transpose traffic pattern requires the number of nodes to "
- << "be an even power of two." << endl;
- exit(-1);
- }
- _shift >>= 1;
-}
-
-int TransposeTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- int const mask_lo = (1 << _shift) - 1;
- int const mask_hi = mask_lo << _shift;
- return (((source >> _shift) & mask_lo) | ((source << _shift) & mask_hi));
-}
-
-BitRevTrafficPattern::BitRevTrafficPattern(int nodes)
- : BitPermutationTrafficPattern(nodes)
-{
-
-}
-
-int BitRevTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- int result = 0;
- for(int n = _nodes; n > 1; n >>= 1) {
- result = (result << 1) | (source % 2);
- source >>= 1;
- }
- return result;
-}
-
-ShuffleTrafficPattern::ShuffleTrafficPattern(int nodes)
- : BitPermutationTrafficPattern(nodes)
-{
-
-}
-
-int ShuffleTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- int const shifted = source << 1;
- return ((shifted & (_nodes - 1)) | bool(shifted & _nodes));
-}
-
-DigitPermutationTrafficPattern::DigitPermutationTrafficPattern(int nodes, int k,
- int n, int xr)
- : PermutationTrafficPattern(nodes), _k(k), _n(n), _xr(xr)
-{
-
-}
-
-TornadoTrafficPattern::TornadoTrafficPattern(int nodes, int k, int n, int xr)
- : DigitPermutationTrafficPattern(nodes, k, n, xr)
-{
-
-}
-
-int TornadoTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
-
- int offset = 1;
- int result = 0;
-
- for(int n = 0; n < _n; ++n) {
- result += offset *
- (((source / offset) % (_xr * _k) + ((_xr * _k + 1) / 2 - 1)) % (_xr * _k));
- offset *= (_xr * _k);
- }
- return result;
-}
-
-NeighborTrafficPattern::NeighborTrafficPattern(int nodes, int k, int n, int xr)
- : DigitPermutationTrafficPattern(nodes, k, n, xr)
-{
-
-}
-
-int NeighborTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
-
- int offset = 1;
- int result = 0;
-
- for(int n = 0; n < _n; ++n) {
- result += offset *
- (((source / offset) % (_xr * _k) + 1) % (_xr * _k));
- offset *= (_xr * _k);
- }
- return result;
-}
-
-RandomPermutationTrafficPattern::RandomPermutationTrafficPattern(int nodes,
- int seed)
- : TrafficPattern(nodes)
-{
- _dest.resize(nodes);
- randomize(seed);
-}
-
-void RandomPermutationTrafficPattern::randomize(int seed)
-{
- unsigned long prev_seed = RandomIntLong( );
- RandomSeed(seed);
-
- _dest.assign(_nodes, -1);
-
- for(int i = 0; i < _nodes; ++i) {
- int ind = RandomInt(_nodes - 1 - i);
-
- int j = 0;
- int cnt = 0;
- while((cnt < ind) || (_dest[j] != -1)) {
- if(_dest[j] == -1) {
- ++cnt;
- }
- ++j;
- assert(j < _nodes);
- }
-
- _dest[j] = i;
- }
-
- RandomSeed(prev_seed);
-}
-
-int RandomPermutationTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- assert((_dest[source] >= 0) && (_dest[source] < _nodes));
- return _dest[source];
-}
-
-RandomTrafficPattern::RandomTrafficPattern(int nodes)
- : TrafficPattern(nodes)
-{
-
-}
-
-UniformRandomTrafficPattern::UniformRandomTrafficPattern(int nodes)
- : RandomTrafficPattern(nodes)
-{
-
-}
-
-int UniformRandomTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- return RandomInt(_nodes - 1);
-}
-
-UniformBackgroundTrafficPattern::UniformBackgroundTrafficPattern(int nodes, vector<int> excluded_nodes)
- : RandomTrafficPattern(nodes)
-{
- for(size_t i = 0; i < excluded_nodes.size(); ++i) {
- int const node = excluded_nodes[i];
- assert((node >= 0) && (node < _nodes));
- _excluded.insert(node);
- }
-}
-
-int UniformBackgroundTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
-
- int result;
-
- do {
- result = RandomInt(_nodes - 1);
- } while(_excluded.count(result) > 0);
-
- return result;
-}
-
-DiagonalTrafficPattern::DiagonalTrafficPattern(int nodes)
- : RandomTrafficPattern(nodes)
-{
-
-}
-
-int DiagonalTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- return ((RandomInt(2) == 0) ? ((source + 1) % _nodes) : source);
-}
-
-AsymmetricTrafficPattern::AsymmetricTrafficPattern(int nodes)
- : RandomTrafficPattern(nodes)
-{
-
-}
-
-int AsymmetricTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- int const half = _nodes / 2;
- return (source % half) + (RandomInt(1) ? half : 0);
-}
-
-Taper64TrafficPattern::Taper64TrafficPattern(int nodes)
- : RandomTrafficPattern(nodes)
-{
- if(nodes != 64) {
- cout << "Error: Tthe Taper64 traffic pattern requires the number of nodes "
- << "to be exactly 64." << endl;
- exit(-1);
- }
-}
-
-int Taper64TrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- if(RandomInt(1)) {
- return ((64 + source + 8 * (RandomInt(2) - 1) + (RandomInt(2) - 1)) % 64);
- } else {
- return RandomInt(_nodes - 1);
- }
-}
-
-BadPermDFlyTrafficPattern::BadPermDFlyTrafficPattern(int nodes, int k, int n)
- : DigitPermutationTrafficPattern(nodes, k, n, 1)
-{
-
-}
-
-int BadPermDFlyTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
-
- int const grp_size_routers = 2 * _k;
- int const grp_size_nodes = grp_size_routers * _k;
-
- return ((RandomInt(grp_size_nodes - 1) + ((source / grp_size_nodes) + 1) * grp_size_nodes) % _nodes);
-}
-
-BadPermYarcTrafficPattern::BadPermYarcTrafficPattern(int nodes, int k, int n,
- int xr)
- : DigitPermutationTrafficPattern(nodes, k, n, xr)
-{
-
-}
-
-int BadPermYarcTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
- int const row = source / (_xr * _k);
- return RandomInt((_xr * _k) - 1) * (_xr * _k) + row;
-}
-
-HotSpotTrafficPattern::HotSpotTrafficPattern(int nodes, vector<int> hotspots,
- vector<int> rates)
- : TrafficPattern(nodes), _hotspots(hotspots), _rates(rates), _max_val(-1)
-{
- assert(!_hotspots.empty());
- size_t const size = _hotspots.size();
- _rates.resize(size, _rates.empty() ? 1 : _rates.back());
- for(size_t i = 0; i < size; ++i) {
- int const hotspot = _hotspots[i];
- assert((hotspot >= 0) && (hotspot < _nodes));
- int const rate = _rates[i];
- assert(rate >= 0);
- _max_val += rate;
- }
-}
-
-int HotSpotTrafficPattern::dest(int source)
-{
- assert((source >= 0) && (source < _nodes));
-
- if(_hotspots.size() == 1) {
- return _hotspots[0];
- }
-
- int pct = RandomInt(_max_val);
-
- for(size_t i = 0; i < (_hotspots.size() - 1); ++i) {
- int const limit = _rates[i];
- if(limit > pct) {
- return _hotspots[i];
- } else {
- pct -= limit;
- }
- }
- assert(_rates.back() > pct);
- return _hotspots.back();
-}
diff --git a/src/intersim2/.svn/pristine/70/7052ff59571d88c99070cd8d659460b1534cf1b3.svn-base b/src/intersim2/.svn/pristine/70/7052ff59571d88c99070cd8d659460b1534cf1b3.svn-base
deleted file mode 100644
index 05382f5..0000000
--- a/src/intersim2/.svn/pristine/70/7052ff59571d88c99070cd8d659460b1534cf1b3.svn-base
+++ /dev/null
@@ -1,86 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// SeparableAllocator: Separable Allocator Base Class
-//
-// ----------------------------------------------------------------------
-
-#include "separable.hpp"
-
-#include <sstream>
-
-#include "arbiter.hpp"
-
-SeparableAllocator::SeparableAllocator( Module* parent, const string& name,
- int inputs, int outputs,
- const string& arb_type )
- : SparseAllocator( parent, name, inputs, outputs )
-{
-
- _input_arb.resize(inputs);
-
- for (int i = 0; i < inputs; ++i) {
- ostringstream arb_name("arb_i");
- arb_name << i;
- _input_arb[i] = Arbiter::NewArbiter(this, arb_name.str(), arb_type, outputs);
- }
-
- _output_arb.resize(outputs);
-
- for (int i = 0; i < outputs; ++i) {
- ostringstream arb_name("arb_o");
- arb_name << i;
- _output_arb[i] = Arbiter::NewArbiter(this, arb_name.str( ), arb_type, inputs);
- }
-
-}
-
-SeparableAllocator::~SeparableAllocator() {
-
- for (int i = 0; i < _inputs; ++i) {
- delete _input_arb[i];
- }
-
- for (int i = 0; i < _outputs; ++i) {
- delete _output_arb[i];
- }
-
-}
-
-void SeparableAllocator::Clear() {
- for ( int i = 0 ; i < _inputs ; i++ ) {
- if(_input_arb[i]-> _num_reqs)
- _input_arb[i]->Clear();
- }
- for ( int o = 0; o < _outputs; o++ ) {
- if(_output_arb[o]->_num_reqs)
- _output_arb[o]->Clear();
- }
- SparseAllocator::Clear();
-}
diff --git a/src/intersim2/.svn/pristine/72/72bdb07d5ae6b1010a5ae388c45b5fbe2d549f92.svn-base b/src/intersim2/.svn/pristine/72/72bdb07d5ae6b1010a5ae388c45b5fbe2d549f92.svn-base
deleted file mode 100644
index 8b1f029..0000000
--- a/src/intersim2/.svn/pristine/72/72bdb07d5ae6b1010a5ae388c45b5fbe2d549f92.svn-base
+++ /dev/null
@@ -1,75 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// RoundRobin: Round Robin Arbiter
-//
-// ----------------------------------------------------------------------
-
-#ifndef _ROUNDROBIN_HPP_
-#define _ROUNDROBIN_HPP_
-
-#include "arbiter.hpp"
-
-class RoundRobinArbiter : public Arbiter {
-
- // Priority pointer
- int _pointer ;
-
-public:
-
- // Constructors
- RoundRobinArbiter( Module *parent, const string &name, int size ) ;
-
- // Print priority matrix to standard output
- virtual void PrintState() const ;
-
- // Update priority matrix based on last aribtration result
- virtual void UpdateState() ;
-
- // Arbitrate amongst requests. Returns winning input and
- // updates pointers to metadata when valid pointers are passed
- virtual int Arbitrate( int* id = 0, int* pri = 0) ;
-
- virtual void AddRequest( int input, int id, int pri ) ;
-
- virtual void Clear();
-
- static inline bool Supersedes(int input1, int pri1, int input2, int pri2, int offset, int size)
- {
- // in a round-robin scheme with the given number of positions and current
- // offset, should a request at input1 with priority pri1 supersede a
- // request at input2 with priority pri2?
- return ((pri1 > pri2) ||
- ((pri1 == pri2) &&
- (((input1 - offset + size) % size) < ((input2 - offset + size) % size))));
- }
-
-} ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/75/75fab6aaa53ec97ae2f9769ab873fea5abf9516b.svn-base b/src/intersim2/.svn/pristine/75/75fab6aaa53ec97ae2f9769ab873fea5abf9516b.svn-base
deleted file mode 100644
index cef5539..0000000
--- a/src/intersim2/.svn/pristine/75/75fab6aaa53ec97ae2f9769ab873fea5abf9516b.svn-base
+++ /dev/null
@@ -1,83 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <sstream>
-
-#include "globals.hpp"
-#include "booksim.hpp"
-#include "buffer.hpp"
-
-Buffer::Buffer( const Configuration& config, int outputs,
- Module *parent, const string& name ) :
-Module( parent, name ), _occupancy(0)
-{
- int num_vcs = config.GetInt( "num_vcs" );
-
- _size = config.GetInt("buf_size");
- if(_size < 0) {
- _size = num_vcs * config.GetInt( "vc_buf_size" );
- };
-
- _vc.resize(num_vcs);
-
- for(int i = 0; i < num_vcs; ++i) {
- ostringstream vc_name;
- vc_name << "vc_" << i;
- _vc[i] = new VC(config, outputs, this, vc_name.str( ) );
- }
-
-#ifdef TRACK_BUFFERS
- int classes = config.GetInt("classes");
- _class_occupancy.resize(classes, 0);
-#endif
-}
-
-Buffer::~Buffer()
-{
- for(vector<VC*>::iterator i = _vc.begin(); i != _vc.end(); ++i) {
- delete *i;
- }
-}
-
-void Buffer::AddFlit( int vc, Flit *f )
-{
- if(_occupancy >= _size) {
- Error("Flit buffer overflow.");
- }
- ++_occupancy;
- _vc[vc]->AddFlit(f);
-#ifdef TRACK_BUFFERS
- ++_class_occupancy[f->cl];
-#endif
-}
-
-void Buffer::Display( ostream & os ) const
-{
- for(vector<VC*>::const_iterator i = _vc.begin(); i != _vc.end(); ++i) {
- (*i)->Display(os);
- }
-}
diff --git a/src/intersim2/.svn/pristine/76/7692129db779b4e8cd14cf7ab6fac567093153b2.svn-base b/src/intersim2/.svn/pristine/76/7692129db779b4e8cd14cf7ab6fac567093153b2.svn-base
deleted file mode 100644
index 12898c2..0000000
--- a/src/intersim2/.svn/pristine/76/7692129db779b4e8cd14cf7ab6fac567093153b2.svn-base
+++ /dev/null
@@ -1,52 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// SeparableInputFirstAllocator: Separable Input-First Allocator
-//
-// ----------------------------------------------------------------------
-
-#ifndef _SEPARABLE_INPUT_FIRST_HPP_
-#define _SEPARABLE_INPUT_FIRST_HPP_
-
-#include <set>
-
-#include "separable.hpp"
-
-class SeparableInputFirstAllocator : public SeparableAllocator {
-
-public:
-
- SeparableInputFirstAllocator( Module* parent, const string& name, int inputs,
- int outputs, const string& arb_type ) ;
-
- virtual void Allocate() ;
-
-} ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/77/77d1aaef881a98fa412061c4daa8137d12ee6f3f.svn-base b/src/intersim2/.svn/pristine/77/77d1aaef881a98fa412061c4daa8137d12ee6f3f.svn-base
deleted file mode 100644
index 3622918..0000000
--- a/src/intersim2/.svn/pristine/77/77d1aaef881a98fa412061c4daa8137d12ee6f3f.svn-base
+++ /dev/null
@@ -1,158 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _ALLOCATOR_HPP_
-#define _ALLOCATOR_HPP_
-
-#include <string>
-#include <map>
-#include <set>
-#include <vector>
-
-#include "module.hpp"
-#include "config_utils.hpp"
-
-class Allocator : public Module {
-protected:
- const int _inputs;
- const int _outputs;
-
- bool _dirty;
-
- vector<int> _inmatch;
- vector<int> _outmatch;
-
-public:
-
- struct sRequest {
- int port;
- int label;
- int in_pri;
- int out_pri;
- };
-
- Allocator( Module *parent, const string& name,
- int inputs, int outputs );
-
- virtual void Clear( );
-
- virtual int ReadRequest( int in, int out ) const = 0;
- virtual bool ReadRequest( sRequest &req, int in, int out ) const = 0;
-
- virtual void AddRequest( int in, int out, int label = 1,
- int in_pri = 0, int out_pri = 0 );
- virtual void RemoveRequest( int in, int out, int label = 1 ) = 0;
-
- virtual void Allocate( ) = 0;
-
- int OutputAssigned( int in ) const;
- int InputAssigned( int out ) const;
-
- virtual bool OutputHasRequests( int out ) const = 0;
- virtual bool InputHasRequests( int in ) const = 0;
-
- virtual int NumOutputRequests( int out ) const = 0;
- virtual int NumInputRequests( int in ) const = 0;
-
- virtual void PrintRequests( ostream * os = NULL ) const = 0;
- void PrintGrants( ostream * os = NULL ) const;
-
- static Allocator *NewAllocator( Module *parent, const string& name,
- const string &alloc_type,
- int inputs, int outputs,
- Configuration const * const config = NULL );
-};
-
-//==================================================
-// A dense allocator stores the entire request
-// matrix.
-//==================================================
-
-class DenseAllocator : public Allocator {
-protected:
- vector<vector<sRequest> > _request;
-
-public:
- DenseAllocator( Module *parent, const string& name,
- int inputs, int outputs );
-
- void Clear( );
-
- int ReadRequest( int in, int out ) const;
- bool ReadRequest( sRequest &req, int in, int out ) const;
-
- void AddRequest( int in, int out, int label = 1,
- int in_pri = 0, int out_pri = 0 );
- void RemoveRequest( int in, int out, int label = 1 );
-
- bool OutputHasRequests( int out ) const;
- bool InputHasRequests( int in ) const;
-
- int NumOutputRequests( int out ) const;
- int NumInputRequests( int in ) const;
-
- void PrintRequests( ostream * os = NULL ) const;
-
-};
-
-//==================================================
-// A sparse allocator only stores the requests
-// (allows for a more efficient implementation).
-//==================================================
-
-class SparseAllocator : public Allocator {
-protected:
- set<int> _in_occ;
- set<int> _out_occ;
-
- vector<map<int, sRequest> > _in_req;
- vector<map<int, sRequest> > _out_req;
-
-public:
- SparseAllocator( Module *parent, const string& name,
- int inputs, int outputs );
-
- void Clear( );
-
- int ReadRequest( int in, int out ) const;
- bool ReadRequest( sRequest &req, int in, int out ) const;
-
- void AddRequest( int in, int out, int label = 1,
- int in_pri = 0, int out_pri = 0 );
- void RemoveRequest( int in, int out, int label = 1 );
-
- bool OutputHasRequests( int out ) const;
- bool InputHasRequests( int in ) const;
-
- int NumOutputRequests( int out ) const;
- int NumInputRequests( int in ) const;
-
- void PrintRequests( ostream * os = NULL ) const;
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/78/78c651a126efa354bfbf06841fb91bf72d970003.svn-base b/src/intersim2/.svn/pristine/78/78c651a126efa354bfbf06841fb91bf72d970003.svn-base
deleted file mode 100644
index 1295ab7..0000000
--- a/src/intersim2/.svn/pristine/78/78c651a126efa354bfbf06841fb91bf72d970003.svn-base
+++ /dev/null
@@ -1,57 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _WAVEFRONT_HPP_
-#define _WAVEFRONT_HPP_
-
-#include <set>
-
-#include "allocator.hpp"
-
-class Wavefront : public DenseAllocator {
-
-private:
- int _last_in;
- int _last_out;
- set<pair<int, int> > _priorities;
- bool _skip_diags;
-
-protected:
- int _square;
- int _pri;
- int _num_requests;
-
-public:
- Wavefront( Module *parent, const string& name,
- int inputs, int outputs, bool skip_diags = false );
-
- virtual void AddRequest( int in, int out, int label = 1,
- int in_pri = 0, int out_pri = 0 );
- virtual void Allocate( );
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/78/78db9a8009e2eeebfa8c1d67e38108237e7cf1b3.svn-base b/src/intersim2/.svn/pristine/78/78db9a8009e2eeebfa8c1d67e38108237e7cf1b3.svn-base
deleted file mode 100644
index f8b6b4d..0000000
--- a/src/intersim2/.svn/pristine/78/78db9a8009e2eeebfa8c1d67e38108237e7cf1b3.svn-base
+++ /dev/null
@@ -1,72 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-////////////////////////////////////////////////////////////////////////
-//
-// Tree4: Network with 64 Terminal Nodes arranged in a tree topology
-// with 4 routers at the root of the tree
-//
-////////////////////////////////////////////////////////////////////////
-//
-// RCS Information:
-// $Author: jbalfour $
-// $Date: 2007/06/26 22:49:23 $
-// $Id$
-//
-////////////////////////////////////////////////////////////////////////
-
-#ifndef _TREE4_HPP_
-#define _TREE4_HPP_
-#include <cassert>
-#include "network.hpp"
-
-class Tree4 : public Network {
-
- int _k;
- int _n;
-
- int _channelWidth;
-
- void _ComputeSize( const Configuration& config );
- void _BuildNet( const Configuration& config );
-
-
- Router*& _Router( int height, int pos );
-
- int _WireLatency( int height1, int pos1, int height2, int pos2 );
-
-public:
-
- Tree4( const Configuration& config, const string & name );
- static void RegisterRoutingFunctions() ;
-
- static int HeightFromID( int id );
- static int PosFromID( int id );
- static int SpeedUp( int height );
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/7a/7a54a566c36bec4672c4c004940eb007ffb11730.svn-base b/src/intersim2/.svn/pristine/7a/7a54a566c36bec4672c4c004940eb007ffb11730.svn-base
deleted file mode 100644
index 108d139..0000000
--- a/src/intersim2/.svn/pristine/7a/7a54a566c36bec4672c4c004940eb007ffb11730.svn-base
+++ /dev/null
@@ -1,289 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-////////////////////////////////////////////////////////////////////////
-//
-// Tree4: Network with 64 Terminal Nodes arranged in a tree topology
-// with 4 routers at the root of the tree
-//
-// Level 0 : 4 8 x 8 Routers (8 Descending Links per Router)
-// Level 1 : 8 8 x 8 Routers (4 Descending Links per Router)
-// Level 2 : 16 6 x 6 Routers (4 Descending Links per Router)
-// Level 3 : 64 Terminal Nodes
-//
-////////////////////////////////////////////////////////////////////////
-//
-// RCS Information:
-// $Author: jbalfour $
-// $Date: 2007/06/26 22:49:23 $
-// $Id$
-//
-////////////////////////////////////////////////////////////////////////
-
-#include "booksim.hpp"
-#include <vector>
-#include <sstream>
-#include <cmath>
-
-#include "tree4.hpp"
-#include "misc_utils.hpp"
-
-Tree4::Tree4( const Configuration& config, const string & name )
-: Network ( config, name )
-{
- _ComputeSize( config );
- _Alloc( );
- _BuildNet( config );
-}
-
-void Tree4::_ComputeSize( const Configuration& config )
-{
- int h;
-
- _k = config.GetInt( "k" );
- assert(_k == 4);
- _n = config.GetInt( "n" );
- assert(_n == 3);
-
- gK = _k; gN = _n;
-
- _nodes = powi( _k, _n );
-
- _size = 0;
- for ( h = 0; h < _n; ++h )
- _size += (4 >> h) * powi( _k, h );
-
- _channels = 2 // Two Channels per Connection
- * ( 2 * powi( _k, 1) ) // Number of Middle Routers
- * ( 2 * _k ); // Connectivity of Middle Routers
-}
-
-void Tree4::RegisterRoutingFunctions(){
-
-}
-
-void Tree4::_BuildNet( const Configuration& config )
-{
-
- //
- // Allocate Routers
- //
- ostringstream name;
- int h, pos, nPos, degree, id;
-
- for ( h = 0; h < _n; h++ ) {
- nPos = (4 >> h) * powi( _k, h );
- for ( pos = 0; pos < nPos; ++pos) {
- if ( h < _n-1 )
- degree = 8;
- else
- degree = 6;
-
- name.str("");
- name << "router_" << h << "_" << pos;
- id = h * powi( _k, _n-1 ) + pos;
- Router * r = Router::NewRouter( config, this, name.str( ),
- id, degree, degree );
- _Router( h, pos ) = r;
- _timed_modules.push_back(r);
- }
- }
-
- //
- // Connect Channels to Routers
- //
- int pp, pc;
- //
- // Connection Rule: Output Ports 0:3 Move DOWN Network
- // Output Ports 4:7 Move UP Network
- //
-
- // Injection & Ejection Channels
- nPos = powi( _k, _n - 1 );
- for ( pos = 0 ; pos < nPos ; ++pos ) {
- for ( int port = 0 ; port < _k ; ++port ) {
-
- _Router( _n-1, pos)->AddInputChannel( _inject[_k*pos+port],
- _inject_cred[_k*pos+port]);
-
-
- _inject[_k*pos+port]->SetLatency( 1 );
- _inject_cred[_k*pos+port]->SetLatency( 1 );
-
- _Router( _n-1, pos)->AddOutputChannel( _eject[_k*pos+port],
- _eject_cred[_k*pos+port]);
-
- _eject[_k*pos+port]->SetLatency( 1 );
- _eject_cred[_k*pos+port]->SetLatency( 1 );
-
- }
- }
-
- // Connections between h = 1 and h = 2 Levels
- int c = 0;
- nPos = 2 * powi( _k, 1 );
- for ( pos = 0; pos < nPos; ++pos ) {
- for ( int port = 0; port < _k; ++port ) {
-
- pp = pos;
- pc = _k * ( pos / 2 ) + port;
-
- // cout << "connecting (1,"<<pp<<") <-> (2,"<<pc<<")"<<endl;
-
- _Router( 1, pp)->AddOutputChannel( _chan[c], _chan_cred[c] );
- _Router( 2, pc)->AddInputChannel( _chan[c], _chan_cred[c] );
-
- //_chan[c]->SetLatency( L );
- //_chan_cred[c]->SetLatency( L );
-
- _chan[c]->SetLatency( 1 );
- _chan_cred[c]->SetLatency( 1 );
-
- c++;
-
- _Router(1, pp)->AddInputChannel( _chan[c], _chan_cred[c] );
- _Router(2, pc)->AddOutputChannel( _chan[c], _chan_cred[c] );
-
- //_chan[c]->SetLatency( L );
- //_chan_cred[c]->SetLatency( L );
- _chan[c]->SetLatency( 1 );
- _chan_cred[c]->SetLatency( 1 );
-
- c++;
- }
- }
-
- // Connections between h = 0 and h = 1 Levels
- nPos = 4 * powi( _k, 0 );
- for ( pos = 0; pos < nPos; ++pos ) {
- for ( int port = 0; port < 2 * _k; ++port ) {
- pp = pos;
- pc = port;
-
- // cout << "connecting (0,"<<pp<<") <-> (1,"<<pc<<")"<<endl;
-
- _Router(0, pp)->AddOutputChannel( _chan[c], _chan_cred[c] );
- _Router(1, pc)->AddInputChannel( _chan[c], _chan_cred[c] );
-
- // _chan[c]->SetLatency( L );
- //_chan_cred[c]->SetLatency( L );
- _chan[c]->SetLatency( 1 );
- _chan_cred[c]->SetLatency( 1 );
-
- c++;
-
- _Router(0, pp)->AddInputChannel( _chan[c], _chan_cred[c] );
- _Router(1, pc)->AddOutputChannel( _chan[c], _chan_cred[c] );
-
- // _chan[c]->SetLatency( L );
- // _chan_cred[c]->SetLatency( L );
- _chan[c]->SetLatency( 1 );
- _chan_cred[c]->SetLatency( 1 );
- c++;
- }
- }
-
- // cout << "Used " << c << " of " << _channels << " channels" << endl;
-
-}
-
-Router*& Tree4::_Router( int height, int pos )
-{
- assert( height < _n );
- assert( pos < (4 >> height) * powi( _k, height) );
-
- int i = 0;
- for ( int h = 0; h < height; ++h )
- i += (4 >> h) * powi( _k, h );
- return _routers[i+pos];
-
-}
-
-int Tree4::_WireLatency( int height1, int pos1, int height2, int pos2 )
-{
- int heightChild, heightParent, posChild, posParent;
-
- int L;
-
- if (height1 < height2) {
- heightChild = height2;
- posChild = pos2;
- heightParent = height1;
- posParent = pos1;
- } else {
- heightChild = height1;
- posChild = pos1;
- heightParent = height2;
- posParent = pos2;
- }
-
- int _length_d2_d1 = 2 ;
- int _length_d1_d0_0 = 2 ;
- int _length_d1_d0_1 = 2 ;
- int _length_d1_d0_2 = 6 ;
- int _length_d1_d0_3 = 6 ;
-
- assert( heightChild == heightParent+1 );
-
- // We must decrement the delays by one to account for how the
- // simulator interprets the specified delay (with 0 indicating one
- // cycle of delay).
-
- if ( heightChild == 2 )
- L = _length_d2_d1;
- else {
- if ( posChild == 0 || posChild == 6 )
- switch ( posParent ) {
- case 0: L =_length_d1_d0_0; break;
- case 1: L =_length_d1_d0_1; break;
- case 2: L =_length_d1_d0_2; break;
- case 3: L =_length_d1_d0_3; break;
- }
- if ( posChild == 1 || posChild == 7 )
- switch ( posParent ) {
- case 0: L =_length_d1_d0_3; break;
- case 1: L =_length_d1_d0_2; break;
- case 2: L =_length_d1_d0_1; break;
- case 3: L =_length_d1_d0_0; break;
- }
- if ( posChild == 2 || posChild == 4 )
- switch ( posParent ) {
- case 0: L = _length_d1_d0_0; break;
- case 1: L = _length_d1_d0_1; break;
- case 2: L = _length_d1_d0_2; break;
- case 3: L = _length_d1_d0_3; break;
- }
- if ( posChild == 3|| posChild == 5 )
- switch ( posParent ) {
- case 0: L =_length_d1_d0_3; break;
- case 1: L =_length_d1_d0_2; break;
- case 2: L =_length_d1_d0_1; break;
- case 3: L =_length_d1_d0_0; break;
- }
- }
- return L;
-}
diff --git a/src/intersim2/.svn/pristine/7b/7b0efd00926de5ec0c6efc86d8ddfbba35da0f82.svn-base b/src/intersim2/.svn/pristine/7b/7b0efd00926de5ec0c6efc86d8ddfbba35da0f82.svn-base
deleted file mode 100644
index 5481d1e..0000000
--- a/src/intersim2/.svn/pristine/7b/7b0efd00926de5ec0c6efc86d8ddfbba35da0f82.svn-base
+++ /dev/null
@@ -1,44 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _TIMED_MODULE_HPP_
-#define _TIMED_MODULE_HPP_
-
-#include "module.hpp"
-
-class TimedModule : public Module {
-
-public:
- TimedModule(Module * parent, string const & name) : Module(parent, name) {}
- virtual ~TimedModule() {}
-
- virtual void ReadInputs() = 0;
- virtual void Evaluate() = 0;
- virtual void WriteOutputs() = 0;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/7b/7b445ae8a3f265094d5af4956c88457b77c18fa5.svn-base b/src/intersim2/.svn/pristine/7b/7b445ae8a3f265094d5af4956c88457b77c18fa5.svn-base
deleted file mode 100644
index 46ba99b..0000000
--- a/src/intersim2/.svn/pristine/7b/7b445ae8a3f265094d5af4956c88457b77c18fa5.svn-base
+++ /dev/null
@@ -1,220 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <limits>
-#include <sstream>
-#include <fstream>
-
-#include "packet_reply_info.hpp"
-#include "random_utils.hpp"
-#include "batchtrafficmanager.hpp"
-
-BatchTrafficManager::BatchTrafficManager( const Configuration &config,
- const vector<Network *> & net )
-: TrafficManager(config, net), _last_id(-1), _last_pid(-1),
- _overall_min_batch_time(0), _overall_avg_batch_time(0),
- _overall_max_batch_time(0)
-{
-
- _max_outstanding = config.GetInt ("max_outstanding_requests");
-
- _batch_size = config.GetInt( "batch_size" );
- _batch_count = config.GetInt( "batch_count" );
-
- _batch_time = new Stats( this, "batch_time", 1.0, 1000 );
- _stats["batch_time"] = _batch_time;
-
- string sent_packets_out_file = config.GetStr( "sent_packets_out" );
- if(sent_packets_out_file == "") {
- _sent_packets_out = NULL;
- } else {
- _sent_packets_out = new ofstream(sent_packets_out_file.c_str());
- }
-}
-
-BatchTrafficManager::~BatchTrafficManager( )
-{
- delete _batch_time;
- if(_sent_packets_out) delete _sent_packets_out;
-}
-
-void BatchTrafficManager::_RetireFlit( Flit *f, int dest )
-{
- _last_id = f->id;
- _last_pid = f->pid;
- TrafficManager::_RetireFlit(f, dest);
-}
-
-int BatchTrafficManager::_IssuePacket( int source, int cl )
-{
- int result = 0;
- if(_use_read_write[cl]) { //read write packets
- //check queue for waiting replies.
- //check to make sure it is on time yet
- if(!_repliesPending[source].empty()) {
- if(_repliesPending[source].front()->time <= _time) {
- result = -1;
- }
- } else {
- if((_packet_seq_no[source] < _batch_size) &&
- ((_max_outstanding <= 0) ||
- (_requestsOutstanding[source] < _max_outstanding))) {
-
- //coin toss to determine request type.
- result = (RandomFloat() < 0.5) ? 2 : 1;
-
- _requestsOutstanding[source]++;
- }
- }
- } else { //normal
- if((_packet_seq_no[source] < _batch_size) &&
- ((_max_outstanding <= 0) ||
- (_requestsOutstanding[source] < _max_outstanding))) {
- result = _GetNextPacketSize(cl);
- _requestsOutstanding[source]++;
- }
- }
- if(result != 0) {
- _packet_seq_no[source]++;
- }
- return result;
-}
-
-void BatchTrafficManager::_ClearStats( )
-{
- TrafficManager::_ClearStats();
- _batch_time->Clear( );
-}
-
-bool BatchTrafficManager::_SingleSim( )
-{
- int batch_index = 0;
- while(batch_index < _batch_count) {
- _packet_seq_no.assign(_nodes, 0);
- _last_id = -1;
- _last_pid = -1;
- _sim_state = running;
- int start_time = _time;
- bool batch_complete;
- cout << "Sending batch " << batch_index + 1 << " (" << _batch_size << " packets)..." << endl;
- do {
- _Step();
- batch_complete = true;
- for(int i = 0; i < _nodes; ++i) {
- if(_packet_seq_no[i] < _batch_size) {
- batch_complete = false;
- break;
- }
- }
- if(_sent_packets_out) {
- *_sent_packets_out << _packet_seq_no << endl;
- }
- } while(!batch_complete);
- cout << "Batch injected. Time used is " << _time - start_time << " cycles." << endl;
-
- int sent_time = _time;
- cout << "Waiting for batch to complete..." << endl;
-
- int empty_steps = 0;
-
- bool packets_left = false;
- for(int c = 0; c < _classes; ++c) {
- packets_left |= !_total_in_flight_flits[c].empty();
- }
-
- while( packets_left ) {
- _Step( );
-
- ++empty_steps;
-
- if ( empty_steps % 1000 == 0 ) {
- _DisplayRemaining( );
- cout << ".";
- }
-
- packets_left = false;
- for(int c = 0; c < _classes; ++c) {
- packets_left |= !_total_in_flight_flits[c].empty();
- }
- }
- cout << endl;
- cout << "Batch received. Time used is " << _time - sent_time << " cycles." << endl
- << "Last packet was " << _last_pid << ", last flit was " << _last_id << "." << endl;
-
- _batch_time->AddSample(_time - start_time);
-
- cout << _sim_state << endl;
-
- UpdateStats();
- DisplayStats();
-
- ++batch_index;
- }
- _sim_state = draining;
- _drain_time = _time;
- return 1;
-}
-
-void BatchTrafficManager::_UpdateOverallStats() {
- TrafficManager::_UpdateOverallStats();
- _overall_min_batch_time += _batch_time->Min();
- _overall_avg_batch_time += _batch_time->Average();
- _overall_max_batch_time += _batch_time->Max();
-}
-
-string BatchTrafficManager::_OverallStatsCSV(int c) const
-{
- ostringstream os;
- os << TrafficManager::_OverallStatsCSV(c) << ','
- << _overall_min_batch_time / (double)_total_sims << ','
- << _overall_avg_batch_time / (double)_total_sims << ','
- << _overall_max_batch_time / (double)_total_sims;
- return os.str();
-}
-
-void BatchTrafficManager::WriteStats(ostream & os) const
-{
- TrafficManager::WriteStats(os);
- os << "batch_time = " << _batch_time->Average() << ";" << endl;
-}
-
-void BatchTrafficManager::DisplayStats(ostream & os) const {
- TrafficManager::DisplayStats();
- os << "Minimum batch duration = " << _batch_time->Min() << endl;
- os << "Average batch duration = " << _batch_time->Average() << endl;
- os << "Maximum batch duration = " << _batch_time->Max() << endl;
-}
-
-void BatchTrafficManager::DisplayOverallStats(ostream & os) const {
- TrafficManager::DisplayOverallStats(os);
- os << "Overall min batch duration = " << _overall_min_batch_time / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl
- << "Overall min batch duration = " << _overall_avg_batch_time / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl
- << "Overall min batch duration = " << _overall_max_batch_time / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-}
diff --git a/src/intersim2/.svn/pristine/7c/7c4fde53686972fa2db885e0743742173afd1bb9.svn-base b/src/intersim2/.svn/pristine/7c/7c4fde53686972fa2db885e0743742173afd1bb9.svn-base
deleted file mode 100644
index f7f84ac..0000000
--- a/src/intersim2/.svn/pristine/7c/7c4fde53686972fa2db885e0743742173afd1bb9.svn-base
+++ /dev/null
@@ -1,57 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "packet_reply_info.hpp"
-
-stack<PacketReplyInfo*> PacketReplyInfo::_all;
-stack<PacketReplyInfo*> PacketReplyInfo::_free;
-
-PacketReplyInfo * PacketReplyInfo::New()
-{
- PacketReplyInfo * pr;
- if(_free.empty()) {
- pr = new PacketReplyInfo();
- _all.push(pr);
- } else {
- pr = _free.top();
- _free.pop();
- }
- return pr;
-}
-
-void PacketReplyInfo::Free()
-{
- _free.push(this);
-}
-
-void PacketReplyInfo::FreeAll()
-{
- while(!_all.empty()) {
- delete _all.top();
- _all.pop();
- }
-}
diff --git a/src/intersim2/.svn/pristine/7f/7fdf02535ae5ba5ca9a2b15879dbcdd928095585.svn-base b/src/intersim2/.svn/pristine/7f/7fdf02535ae5ba5ca9a2b15879dbcdd928095585.svn-base
deleted file mode 100644
index b3972d2..0000000
--- a/src/intersim2/.svn/pristine/7f/7fdf02535ae5ba5ca9a2b15879dbcdd928095585.svn-base
+++ /dev/null
@@ -1,202 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _ROUTER_HPP_
-#define _ROUTER_HPP_
-
-#include <string>
-#include <vector>
-
-#include "timed_module.hpp"
-#include "flit.hpp"
-#include "credit.hpp"
-#include "flitchannel.hpp"
-#include "channel.hpp"
-#include "config_utils.hpp"
-
-typedef Channel<Credit> CreditChannel;
-
-class Router : public TimedModule {
-
-protected:
-
- static int const STALL_BUFFER_BUSY;
- static int const STALL_BUFFER_CONFLICT;
- static int const STALL_BUFFER_FULL;
- static int const STALL_BUFFER_RESERVED;
- static int const STALL_CROSSBAR_CONFLICT;
-
- int _id;
-
- int _inputs;
- int _outputs;
-
- int _classes;
-
- int _input_speedup;
- int _output_speedup;
-
- double _internal_speedup;
- double _partial_internal_cycles;
-
- int _crossbar_delay;
- int _credit_delay;
-
- vector<FlitChannel *> _input_channels;
- vector<CreditChannel *> _input_credits;
- vector<FlitChannel *> _output_channels;
- vector<CreditChannel *> _output_credits;
- vector<bool> _channel_faults;
-
-#ifdef TRACK_FLOWS
- vector<vector<int> > _received_flits;
- vector<vector<int> > _stored_flits;
- vector<vector<int> > _sent_flits;
- vector<vector<int> > _outstanding_credits;
- vector<vector<int> > _active_packets;
-#endif
-
-#ifdef TRACK_STALLS
- vector<int> _buffer_busy_stalls;
- vector<int> _buffer_conflict_stalls;
- vector<int> _buffer_full_stalls;
- vector<int> _buffer_reserved_stalls;
- vector<int> _crossbar_conflict_stalls;
-#endif
-
- virtual void _InternalStep() = 0;
-
-public:
- Router( const Configuration& config,
- Module *parent, const string & name, int id,
- int inputs, int outputs );
-
- static Router *NewRouter( const Configuration& config,
- Module *parent, const string & name, int id,
- int inputs, int outputs );
-
- virtual void AddInputChannel( FlitChannel *channel, CreditChannel *backchannel );
- virtual void AddOutputChannel( FlitChannel *channel, CreditChannel *backchannel );
-
- inline FlitChannel * GetInputChannel( int input ) const {
- assert((input >= 0) && (input < _inputs));
- return _input_channels[input];
- }
- inline FlitChannel * GetOutputChannel( int output ) const {
- assert((output >= 0) && (output < _outputs));
- return _output_channels[output];
- }
-
- virtual void ReadInputs( ) = 0;
- virtual void Evaluate( );
- virtual void WriteOutputs( ) = 0;
-
- void OutChannelFault( int c, bool fault = true );
- bool IsFaultyOutput( int c ) const;
-
- inline int GetID( ) const {return _id;}
-
-
- virtual int GetUsedCredit(int o) const = 0;
- virtual int GetBufferOccupancy(int i) const = 0;
-
-#ifdef TRACK_BUFFERS
- virtual int GetUsedCreditForClass(int output, int cl) const = 0;
- virtual int GetBufferOccupancyForClass(int input, int cl) const = 0;
-#endif
-
-#ifdef TRACK_FLOWS
- inline vector<int> const & GetReceivedFlits(int c) const {
- assert((c >= 0) && (c < _classes));
- return _received_flits[c];
- }
- inline vector<int> const & GetStoredFlits(int c) const {
- assert((c >= 0) && (c < _classes));
- return _stored_flits[c];
- }
- inline vector<int> const & GetSentFlits(int c) const {
- assert((c >= 0) && (c < _classes));
- return _sent_flits[c];
- }
- inline vector<int> const & GetOutstandingCredits(int c) const {
- assert((c >= 0) && (c < _classes));
- return _outstanding_credits[c];
- }
-
- inline vector<int> const & GetActivePackets(int c) const {
- assert((c >= 0) && (c < _classes));
- return _active_packets[c];
- }
-
- inline void ResetFlowStats(int c) {
- assert((c >= 0) && (c < _classes));
- _received_flits[c].assign(_received_flits[c].size(), 0);
- _sent_flits[c].assign(_sent_flits[c].size(), 0);
- }
-#endif
-
- virtual vector<int> UsedCredits() const = 0;
- virtual vector<int> FreeCredits() const = 0;
- virtual vector<int> MaxCredits() const = 0;
-
-#ifdef TRACK_STALLS
- inline int GetBufferBusyStalls(int c) const {
- assert((c >= 0) && (c < _classes));
- return _buffer_busy_stalls[c];
- }
- inline int GetBufferConflictStalls(int c) const {
- assert((c >= 0) && (c < _classes));
- return _buffer_conflict_stalls[c];
- }
- inline int GetBufferFullStalls(int c) const {
- assert((c >= 0) && (c < _classes));
- return _buffer_full_stalls[c];
- }
- inline int GetBufferReservedStalls(int c) const {
- assert((c >= 0) && (c < _classes));
- return _buffer_reserved_stalls[c];
- }
- inline int GetCrossbarConflictStalls(int c) const {
- assert((c >= 0) && (c < _classes));
- return _crossbar_conflict_stalls[c];
- }
-
- inline void ResetStallStats(int c) {
- assert((c >= 0) && (c < _classes));
- _buffer_busy_stalls[c] = 0;
- _buffer_conflict_stalls[c] = 0;
- _buffer_full_stalls[c] = 0;
- _buffer_reserved_stalls[c] = 0;
- _crossbar_conflict_stalls[c] = 0;
- }
-#endif
-
- inline int NumInputs() const {return _inputs;}
- inline int NumOutputs() const {return _outputs;}
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/82/829eb51edd8ef3cc3c06778a3e3a379f352728e1.svn-base b/src/intersim2/.svn/pristine/82/829eb51edd8ef3cc3c06778a3e3a379f352728e1.svn-base
deleted file mode 100644
index 89c5e21..0000000
--- a/src/intersim2/.svn/pristine/82/829eb51edd8ef3cc3c06778a3e3a379f352728e1.svn-base
+++ /dev/null
@@ -1,254 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <iostream>
-
-#include "selalloc.hpp"
-#include "random_utils.hpp"
-
-//#define DEBUG_SELALLOC
-
-SelAlloc::SelAlloc( Module *parent, const string& name,
- int inputs, int outputs, int iters ) :
- SparseAllocator( parent, name, inputs, outputs )
-{
- _iter = iters;
-
- _gptrs.resize(outputs, 0);
- _aptrs.resize(inputs, 0);
- _outmask.resize(outputs, 0);
-}
-
-void SelAlloc::Allocate( )
-{
- int input;
- int output;
-
- int input_offset;
- int output_offset;
-
- map<int, sRequest>::iterator p;
- set<int>::iterator outer_iter;
- bool wrapped;
-
- int max_index;
- int max_pri;
-
- vector<int> grants(_outputs, -1);
-
- for ( int iter = 0; iter < _iter; ++iter ) {
- // Grant phase
-
- for( outer_iter = _out_occ.begin( );
- outer_iter != _out_occ.end( ); ++outer_iter ) {
- output = *outer_iter;
-
- // Skip loop if there are no requests
- // or the output is already matched or
- // the output is masked
- if ( ( _out_req[output].empty( ) ) ||
- ( _outmatch[output] != -1 ) ||
- ( _outmask[output] != 0 ) ) {
- continue;
- }
-
- // A round-robin arbiter between input requests
- input_offset = _gptrs[output];
-
- p = _out_req[output].begin( );
- while( ( p != _out_req[output].end( ) ) &&
- ( p->second.port < input_offset ) ) {
- p++;
- }
-
- max_index = -1;
- max_pri = 0;
-
- wrapped = false;
- while( (!wrapped) ||
- ( ( p != _out_req[output].end() ) &&
- ( p->second.port < input_offset ) ) ) {
- if ( p == _out_req[output].end( ) ) {
- if ( wrapped ) { break; }
- // p is valid here because empty lists
- // are skipped (above)
- p = _out_req[output].begin( );
- wrapped = true;
- }
-
- input = p->second.port;
-
- // we know the output is free (above) and
- // if the input is free, check if request is the
- // highest priority so far
- if ( ( _inmatch[input] == -1 ) &&
- ( ( p->second.out_pri > max_pri ) || ( max_index == -1 ) ) ) {
- max_pri = p->second.out_pri;
- max_index = input;
- }
-
- p++;
- }
-
- if ( max_index != -1 ) { // grant
- grants[output] = max_index;
- }
- }
-
-#ifdef DEBUG_SELALLOC
- cout << "grants: ";
- for ( int i = 0; i < _outputs; ++i ) {
- cout << grants[i] << " ";
- }
- cout << endl;
-
- cout << "aptrs: ";
- for ( int i = 0; i < _inputs; ++i ) {
- cout << _aptrs[i] << " ";
- }
- cout << endl;
-#endif
-
- // Accept phase
-
- for ( outer_iter = _in_occ.begin( );
- outer_iter != _in_occ.end( ); ++outer_iter ) {
- input = *outer_iter;
-
- if ( _in_req[input].empty( ) ) {
- continue;
- }
-
- // A round-robin arbiter between output grants
- output_offset = _aptrs[input];
-
- p = _in_req[input].begin( );
- while( ( p != _in_req[input].end( ) ) &&
- ( p->second.port < output_offset ) ) {
- p++;
- }
-
- max_index = -1;
- max_pri = 0;
-
- wrapped = false;
- while( (!wrapped) ||
- ( ( p != _in_req[input].end() ) &&
- ( p->second.port < output_offset ) ) ) {
- if ( p == _in_req[input].end( ) ) {
- if ( wrapped ) { break; }
- // p is valid here because empty lists
- // are skipped (above)
- p = _in_req[input].begin( );
- wrapped = true;
- }
-
- output = p->second.port;
-
- // we know the output is free (above) and
- // if the input is free, check if the highest
- // priroity
- if ( ( grants[output] == input ) &&
- ( !_out_req[output].empty( ) ) &&
- ( ( p->second.in_pri > max_pri ) || ( max_index == -1 ) ) ) {
- max_pri = p->second.in_pri;
- max_index = output;
- }
-
- p++;
- }
-
- if ( max_index != -1 ) {
- // Accept
- output = max_index;
-
- _inmatch[input] = output;
- _outmatch[output] = input;
-
- // Only update pointers if accepted during the 1st iteration
- if ( iter == 0 ) {
- _gptrs[output] = ( input + 1 ) % _inputs;
- _aptrs[input] = ( output + 1 ) % _outputs;
- }
- }
- }
- }
-
-#ifdef DEBUG_SELALLOC
- cout << "input match: ";
- for ( int i = 0; i < _inputs; ++i ) {
- cout << _inmatch[i] << " ";
- }
- cout << endl;
-
- cout << "output match: ";
- for ( int j = 0; j < _outputs; ++j ) {
- cout << _outmatch[j] << " ";
- }
- cout << endl;
-#endif
-}
-
-void SelAlloc::MaskOutput( int out, int mask )
-{
- assert( ( out >= 0 ) && ( out < _outputs ) );
- _outmask[out] = mask;
-}
-
-void SelAlloc::PrintRequests( ostream * os ) const
-{
- map<int, sRequest>::const_iterator iter;
-
- if(!os) os = &cout;
-
- *os << "Input requests = [ ";
- for ( int input = 0; input < _inputs; ++input ) {
- *os << input << " -> [ ";
- for ( iter = _in_req[input].begin( );
- iter != _in_req[input].end( ); iter++ ) {
- *os << iter->second.port << " ";
- }
- *os << "] ";
- }
- *os << "], output requests = [ ";
- for ( int output = 0; output < _outputs; ++output ) {
- *os << output << " -> ";
- if ( _outmask[output] == 0 ) {
- *os << "[ ";
- for ( iter = _out_req[output].begin( );
- iter != _out_req[output].end( ); iter++ ) {
- *os << iter->second.port << " ";
- }
- *os << "] ";
- } else {
- *os << "masked ";
- }
- }
- *os << "]." << endl;
-}
-
diff --git a/src/intersim2/.svn/pristine/8c/8c5b24b41796edbfedbb98138da7278e7c22d832.svn-base b/src/intersim2/.svn/pristine/8c/8c5b24b41796edbfedbb98138da7278e7c22d832.svn-base
deleted file mode 100644
index 48000bf..0000000
--- a/src/intersim2/.svn/pristine/8c/8c5b24b41796edbfedbb98138da7278e7c22d832.svn-base
+++ /dev/null
@@ -1,34 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#define main rng_main
-#include "rng.c"
-
-long ran_next( )
-{
- return ran_arr_next( );
-}
diff --git a/src/intersim2/.svn/pristine/8e/8e7a59b2896a3ee93a308768d554d28b324b26aa.svn-base b/src/intersim2/.svn/pristine/8e/8e7a59b2896a3ee93a308768d554d28b324b26aa.svn-base
deleted file mode 100644
index d92ad08..0000000
--- a/src/intersim2/.svn/pristine/8e/8e7a59b2896a3ee93a308768d554d28b324b26aa.svn-base
+++ /dev/null
@@ -1,2283 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <sstream>
-#include <cmath>
-#include <fstream>
-#include <limits>
-#include <cstdlib>
-
-#include "booksim.hpp"
-#include "booksim_config.hpp"
-#include "trafficmanager.hpp"
-#include "batchtrafficmanager.hpp"
-#include "random_utils.hpp"
-#include "vc.hpp"
-#include "packet_reply_info.hpp"
-
-TrafficManager * TrafficManager::New(Configuration const & config,
- vector<Network *> const & net)
-{
- TrafficManager * result = NULL;
- string sim_type = config.GetStr("sim_type");
- if((sim_type == "latency") || (sim_type == "throughput")) {
- result = new TrafficManager(config, net);
- } else if(sim_type == "batch") {
- result = new BatchTrafficManager(config, net);
- } else {
- cerr << "Unknown simulation type: " << sim_type << endl;
- }
- return result;
-}
-
-TrafficManager::TrafficManager( const Configuration &config, const vector<Network *> & net )
- : Module( 0, "traffic_manager" ), _net(net), _empty_network(false), _deadlock_timer(0), _reset_time(0), _drain_time(-1), _cur_id(0), _cur_pid(0), _time(0)
-{
-
- _nodes = _net[0]->NumNodes( );
- _routers = _net[0]->NumRouters( );
-
- _vcs = config.GetInt("num_vcs");
- _subnets = config.GetInt("subnets");
-
- _subnet.resize(Flit::NUM_FLIT_TYPES);
- _subnet[Flit::READ_REQUEST] = config.GetInt("read_request_subnet");
- _subnet[Flit::READ_REPLY] = config.GetInt("read_reply_subnet");
- _subnet[Flit::WRITE_REQUEST] = config.GetInt("write_request_subnet");
- _subnet[Flit::WRITE_REPLY] = config.GetInt("write_reply_subnet");
-
- // ============ Message priorities ============
-
- string priority = config.GetStr( "priority" );
-
- if ( priority == "class" ) {
- _pri_type = class_based;
- } else if ( priority == "age" ) {
- _pri_type = age_based;
- } else if ( priority == "network_age" ) {
- _pri_type = network_age_based;
- } else if ( priority == "local_age" ) {
- _pri_type = local_age_based;
- } else if ( priority == "queue_length" ) {
- _pri_type = queue_length_based;
- } else if ( priority == "hop_count" ) {
- _pri_type = hop_count_based;
- } else if ( priority == "sequence" ) {
- _pri_type = sequence_based;
- } else if ( priority == "none" ) {
- _pri_type = none;
- } else {
- Error( "Unkown priority value: " + priority );
- }
-
- // ============ Routing ============
-
- string rf = config.GetStr("routing_function") + "_" + config.GetStr("topology");
- map<string, tRoutingFunction>::const_iterator rf_iter = gRoutingFunctionMap.find(rf);
- if(rf_iter == gRoutingFunctionMap.end()) {
- Error("Invalid routing function: " + rf);
- }
- _rf = rf_iter->second;
-
- _lookahead_routing = !config.GetInt("routing_delay");
- _noq = config.GetInt("noq");
- if(_noq) {
- if(!_lookahead_routing) {
- Error("NOQ requires lookahead routing to be enabled.");
- }
- }
-
- // ============ Traffic ============
-
- _classes = config.GetInt("classes");
-
- _use_read_write = config.GetIntArray("use_read_write");
- if(_use_read_write.empty()) {
- _use_read_write.push_back(config.GetInt("use_read_write"));
- }
- _use_read_write.resize(_classes, _use_read_write.back());
-
- _write_fraction = config.GetFloatArray("write_fraction");
- if(_write_fraction.empty()) {
- _write_fraction.push_back(config.GetFloat("write_fraction"));
- }
- _write_fraction.resize(_classes, _write_fraction.back());
-
- _read_request_size = config.GetIntArray("read_request_size");
- if(_read_request_size.empty()) {
- _read_request_size.push_back(config.GetInt("read_request_size"));
- }
- _read_request_size.resize(_classes, _read_request_size.back());
-
- _read_reply_size = config.GetIntArray("read_reply_size");
- if(_read_reply_size.empty()) {
- _read_reply_size.push_back(config.GetInt("read_reply_size"));
- }
- _read_reply_size.resize(_classes, _read_reply_size.back());
-
- _write_request_size = config.GetIntArray("write_request_size");
- if(_write_request_size.empty()) {
- _write_request_size.push_back(config.GetInt("write_request_size"));
- }
- _write_request_size.resize(_classes, _write_request_size.back());
-
- _write_reply_size = config.GetIntArray("write_reply_size");
- if(_write_reply_size.empty()) {
- _write_reply_size.push_back(config.GetInt("write_reply_size"));
- }
- _write_reply_size.resize(_classes, _write_reply_size.back());
-
- string packet_size_str = config.GetStr("packet_size");
- if(packet_size_str.empty()) {
- _packet_size.push_back(vector<int>(1, config.GetInt("packet_size")));
- } else {
- vector<string> packet_size_strings = tokenize_str(packet_size_str);
- for(size_t i = 0; i < packet_size_strings.size(); ++i) {
- _packet_size.push_back(tokenize_int(packet_size_strings[i]));
- }
- }
- _packet_size.resize(_classes, _packet_size.back());
-
- string packet_size_rate_str = config.GetStr("packet_size_rate");
- if(packet_size_rate_str.empty()) {
- int rate = config.GetInt("packet_size_rate");
- assert(rate >= 0);
- for(int c = 0; c < _classes; ++c) {
- int size = _packet_size[c].size();
- _packet_size_rate.push_back(vector<int>(size, rate));
- _packet_size_max_val.push_back(size * rate - 1);
- }
- } else {
- vector<string> packet_size_rate_strings = tokenize_str(packet_size_rate_str);
- packet_size_rate_strings.resize(_classes, packet_size_rate_strings.back());
- for(int c = 0; c < _classes; ++c) {
- vector<int> rates = tokenize_int(packet_size_rate_strings[c]);
- rates.resize(_packet_size[c].size(), rates.back());
- _packet_size_rate.push_back(rates);
- int size = rates.size();
- int max_val = -1;
- for(int i = 0; i < size; ++i) {
- int rate = rates[i];
- assert(rate >= 0);
- max_val += rate;
- }
- _packet_size_max_val.push_back(max_val);
- }
- }
-
- for(int c = 0; c < _classes; ++c) {
- if(_use_read_write[c]) {
- _packet_size[c] =
- vector<int>(1, (_read_request_size[c] + _read_reply_size[c] +
- _write_request_size[c] + _write_reply_size[c]) / 2);
- _packet_size_rate[c] = vector<int>(1, 1);
- _packet_size_max_val[c] = 0;
- }
- }
-
- _load = config.GetFloatArray("injection_rate");
- if(_load.empty()) {
- _load.push_back(config.GetFloat("injection_rate"));
- }
- _load.resize(_classes, _load.back());
-
- if(config.GetInt("injection_rate_uses_flits")) {
- for(int c = 0; c < _classes; ++c)
- _load[c] /= _GetAveragePacketSize(c);
- }
-
- _traffic = config.GetStrArray("traffic");
- _traffic.resize(_classes, _traffic.back());
-
- _traffic_pattern.resize(_classes);
-
- _class_priority = config.GetIntArray("class_priority");
- if(_class_priority.empty()) {
- _class_priority.push_back(config.GetInt("class_priority"));
- }
- _class_priority.resize(_classes, _class_priority.back());
-
- vector<string> injection_process = config.GetStrArray("injection_process");
- injection_process.resize(_classes, injection_process.back());
-
- _injection_process.resize(_classes);
-
- for(int c = 0; c < _classes; ++c) {
- _traffic_pattern[c] = TrafficPattern::New(_traffic[c], _nodes, &config);
- _injection_process[c] = InjectionProcess::New(injection_process[c], _nodes, _load[c], &config);
- }
-
- // ============ Injection VC states ============
-
- _buf_states.resize(_nodes);
- _last_vc.resize(_nodes);
- _last_class.resize(_nodes);
-
- for ( int source = 0; source < _nodes; ++source ) {
- _buf_states[source].resize(_subnets);
- _last_class[source].resize(_subnets, 0);
- _last_vc[source].resize(_subnets);
- for ( int subnet = 0; subnet < _subnets; ++subnet ) {
- ostringstream tmp_name;
- tmp_name << "terminal_buf_state_" << source << "_" << subnet;
- BufferState * bs = new BufferState( config, this, tmp_name.str( ) );
- int vc_alloc_delay = config.GetInt("vc_alloc_delay");
- int sw_alloc_delay = config.GetInt("sw_alloc_delay");
- int router_latency = config.GetInt("routing_delay") + (config.GetInt("speculative") ? max(vc_alloc_delay, sw_alloc_delay) : (vc_alloc_delay + sw_alloc_delay));
- int min_latency = 1 + _net[subnet]->GetInject(source)->GetLatency() + router_latency + _net[subnet]->GetInjectCred(source)->GetLatency();
- bs->SetMinLatency(min_latency);
- _buf_states[source][subnet] = bs;
- _last_vc[source][subnet].resize(_classes, -1);
- }
- }
-
-#ifdef TRACK_FLOWS
- _outstanding_credits.resize(_classes);
- for(int c = 0; c < _classes; ++c) {
- _outstanding_credits[c].resize(_subnets, vector<int>(_nodes, 0));
- }
- _outstanding_classes.resize(_nodes);
- for(int n = 0; n < _nodes; ++n) {
- _outstanding_classes[n].resize(_subnets, vector<queue<int> >(_vcs));
- }
-#endif
-
- // ============ Injection queues ============
-
- _qtime.resize(_nodes);
- _qdrained.resize(_nodes);
- _partial_packets.resize(_nodes);
-
- for ( int s = 0; s < _nodes; ++s ) {
- _qtime[s].resize(_classes);
- _qdrained[s].resize(_classes);
- _partial_packets[s].resize(_classes);
- }
-
- _total_in_flight_flits.resize(_classes);
- _measured_in_flight_flits.resize(_classes);
- _retired_packets.resize(_classes);
-
- _packet_seq_no.resize(_nodes);
- _repliesPending.resize(_nodes);
- _requestsOutstanding.resize(_nodes);
-
- _hold_switch_for_packet = config.GetInt("hold_switch_for_packet");
-
- // ============ Simulation parameters ============
-
- _total_sims = config.GetInt( "sim_count" );
-
- _router.resize(_subnets);
- for (int i=0; i < _subnets; ++i) {
- _router[i] = _net[i]->GetRouters();
- }
-
- //seed the network
- RandomSeed(config.GetInt("seed"));
-
- _measure_latency = (config.GetStr("sim_type") == "latency");
-
- _sample_period = config.GetInt( "sample_period" );
- _max_samples = config.GetInt( "max_samples" );
- _warmup_periods = config.GetInt( "warmup_periods" );
-
- _measure_stats = config.GetIntArray( "measure_stats" );
- if(_measure_stats.empty()) {
- _measure_stats.push_back(config.GetInt("measure_stats"));
- }
- _measure_stats.resize(_classes, _measure_stats.back());
- _pair_stats = (config.GetInt("pair_stats")==1);
-
- _latency_thres = config.GetFloatArray( "latency_thres" );
- if(_latency_thres.empty()) {
- _latency_thres.push_back(config.GetFloat("latency_thres"));
- }
- _latency_thres.resize(_classes, _latency_thres.back());
-
- _warmup_threshold = config.GetFloatArray( "warmup_thres" );
- if(_warmup_threshold.empty()) {
- _warmup_threshold.push_back(config.GetFloat("warmup_thres"));
- }
- _warmup_threshold.resize(_classes, _warmup_threshold.back());
-
- _acc_warmup_threshold = config.GetFloatArray( "acc_warmup_thres" );
- if(_acc_warmup_threshold.empty()) {
- _acc_warmup_threshold.push_back(config.GetFloat("acc_warmup_thres"));
- }
- _acc_warmup_threshold.resize(_classes, _acc_warmup_threshold.back());
-
- _stopping_threshold = config.GetFloatArray( "stopping_thres" );
- if(_stopping_threshold.empty()) {
- _stopping_threshold.push_back(config.GetFloat("stopping_thres"));
- }
- _stopping_threshold.resize(_classes, _stopping_threshold.back());
-
- _acc_stopping_threshold = config.GetFloatArray( "acc_stopping_thres" );
- if(_acc_stopping_threshold.empty()) {
- _acc_stopping_threshold.push_back(config.GetFloat("acc_stopping_thres"));
- }
- _acc_stopping_threshold.resize(_classes, _acc_stopping_threshold.back());
-
- _include_queuing = config.GetInt( "include_queuing" );
-
- _print_csv_results = config.GetInt( "print_csv_results" );
- _deadlock_warn_timeout = config.GetInt( "deadlock_warn_timeout" );
-
- string watch_file = config.GetStr( "watch_file" );
- if((watch_file != "") && (watch_file != "-")) {
- _LoadWatchList(watch_file);
- }
-
- vector<int> watch_flits = config.GetIntArray("watch_flits");
- for(size_t i = 0; i < watch_flits.size(); ++i) {
- _flits_to_watch.insert(watch_flits[i]);
- }
-
- vector<int> watch_packets = config.GetIntArray("watch_packets");
- for(size_t i = 0; i < watch_packets.size(); ++i) {
- _packets_to_watch.insert(watch_packets[i]);
- }
-
- string stats_out_file = config.GetStr( "stats_out" );
- if(stats_out_file == "") {
- _stats_out = NULL;
- } else if(stats_out_file == "-") {
- _stats_out = &cout;
- } else {
- _stats_out = new ofstream(stats_out_file.c_str());
- config.WriteMatlabFile(_stats_out);
- }
-
-#ifdef TRACK_FLOWS
- _injected_flits.resize(_classes, vector<int>(_nodes, 0));
- _ejected_flits.resize(_classes, vector<int>(_nodes, 0));
- string injected_flits_out_file = config.GetStr( "injected_flits_out" );
- if(injected_flits_out_file == "") {
- _injected_flits_out = NULL;
- } else {
- _injected_flits_out = new ofstream(injected_flits_out_file.c_str());
- }
- string received_flits_out_file = config.GetStr( "received_flits_out" );
- if(received_flits_out_file == "") {
- _received_flits_out = NULL;
- } else {
- _received_flits_out = new ofstream(received_flits_out_file.c_str());
- }
- string stored_flits_out_file = config.GetStr( "stored_flits_out" );
- if(stored_flits_out_file == "") {
- _stored_flits_out = NULL;
- } else {
- _stored_flits_out = new ofstream(stored_flits_out_file.c_str());
- }
- string sent_flits_out_file = config.GetStr( "sent_flits_out" );
- if(sent_flits_out_file == "") {
- _sent_flits_out = NULL;
- } else {
- _sent_flits_out = new ofstream(sent_flits_out_file.c_str());
- }
- string outstanding_credits_out_file = config.GetStr( "outstanding_credits_out" );
- if(outstanding_credits_out_file == "") {
- _outstanding_credits_out = NULL;
- } else {
- _outstanding_credits_out = new ofstream(outstanding_credits_out_file.c_str());
- }
- string ejected_flits_out_file = config.GetStr( "ejected_flits_out" );
- if(ejected_flits_out_file == "") {
- _ejected_flits_out = NULL;
- } else {
- _ejected_flits_out = new ofstream(ejected_flits_out_file.c_str());
- }
- string active_packets_out_file = config.GetStr( "active_packets_out" );
- if(active_packets_out_file == "") {
- _active_packets_out = NULL;
- } else {
- _active_packets_out = new ofstream(active_packets_out_file.c_str());
- }
-#endif
-
-#ifdef TRACK_CREDITS
- string used_credits_out_file = config.GetStr( "used_credits_out" );
- if(used_credits_out_file == "") {
- _used_credits_out = NULL;
- } else {
- _used_credits_out = new ofstream(used_credits_out_file.c_str());
- }
- string free_credits_out_file = config.GetStr( "free_credits_out" );
- if(free_credits_out_file == "") {
- _free_credits_out = NULL;
- } else {
- _free_credits_out = new ofstream(free_credits_out_file.c_str());
- }
- string max_credits_out_file = config.GetStr( "max_credits_out" );
- if(max_credits_out_file == "") {
- _max_credits_out = NULL;
- } else {
- _max_credits_out = new ofstream(max_credits_out_file.c_str());
- }
-#endif
-
- // ============ Statistics ============
-
- _plat_stats.resize(_classes);
- _overall_min_plat.resize(_classes, 0.0);
- _overall_avg_plat.resize(_classes, 0.0);
- _overall_max_plat.resize(_classes, 0.0);
-
- _nlat_stats.resize(_classes);
- _overall_min_nlat.resize(_classes, 0.0);
- _overall_avg_nlat.resize(_classes, 0.0);
- _overall_max_nlat.resize(_classes, 0.0);
-
- _flat_stats.resize(_classes);
- _overall_min_flat.resize(_classes, 0.0);
- _overall_avg_flat.resize(_classes, 0.0);
- _overall_max_flat.resize(_classes, 0.0);
-
- _frag_stats.resize(_classes);
- _overall_min_frag.resize(_classes, 0.0);
- _overall_avg_frag.resize(_classes, 0.0);
- _overall_max_frag.resize(_classes, 0.0);
-
- if(_pair_stats){
- _pair_plat.resize(_classes);
- _pair_nlat.resize(_classes);
- _pair_flat.resize(_classes);
- }
-
- _hop_stats.resize(_classes);
- _overall_hop_stats.resize(_classes, 0.0);
-
- _sent_packets.resize(_classes);
- _overall_min_sent_packets.resize(_classes, 0.0);
- _overall_avg_sent_packets.resize(_classes, 0.0);
- _overall_max_sent_packets.resize(_classes, 0.0);
- _accepted_packets.resize(_classes);
- _overall_min_accepted_packets.resize(_classes, 0.0);
- _overall_avg_accepted_packets.resize(_classes, 0.0);
- _overall_max_accepted_packets.resize(_classes, 0.0);
-
- _sent_flits.resize(_classes);
- _overall_min_sent.resize(_classes, 0.0);
- _overall_avg_sent.resize(_classes, 0.0);
- _overall_max_sent.resize(_classes, 0.0);
- _accepted_flits.resize(_classes);
- _overall_min_accepted.resize(_classes, 0.0);
- _overall_avg_accepted.resize(_classes, 0.0);
- _overall_max_accepted.resize(_classes, 0.0);
-
-#ifdef TRACK_STALLS
- _buffer_busy_stalls.resize(_classes);
- _buffer_conflict_stalls.resize(_classes);
- _buffer_full_stalls.resize(_classes);
- _buffer_reserved_stalls.resize(_classes);
- _crossbar_conflict_stalls.resize(_classes);
- _overall_buffer_busy_stalls.resize(_classes, 0);
- _overall_buffer_conflict_stalls.resize(_classes, 0);
- _overall_buffer_full_stalls.resize(_classes, 0);
- _overall_buffer_reserved_stalls.resize(_classes, 0);
- _overall_crossbar_conflict_stalls.resize(_classes, 0);
-#endif
-
- for ( int c = 0; c < _classes; ++c ) {
- ostringstream tmp_name;
-
- tmp_name << "plat_stat_" << c;
- _plat_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 1000 );
- _stats[tmp_name.str()] = _plat_stats[c];
- tmp_name.str("");
-
- tmp_name << "nlat_stat_" << c;
- _nlat_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 1000 );
- _stats[tmp_name.str()] = _nlat_stats[c];
- tmp_name.str("");
-
- tmp_name << "flat_stat_" << c;
- _flat_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 1000 );
- _stats[tmp_name.str()] = _flat_stats[c];
- tmp_name.str("");
-
- tmp_name << "frag_stat_" << c;
- _frag_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 100 );
- _stats[tmp_name.str()] = _frag_stats[c];
- tmp_name.str("");
-
- tmp_name << "hop_stat_" << c;
- _hop_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 20 );
- _stats[tmp_name.str()] = _hop_stats[c];
- tmp_name.str("");
-
- if(_pair_stats){
- _pair_plat[c].resize(_nodes*_nodes);
- _pair_nlat[c].resize(_nodes*_nodes);
- _pair_flat[c].resize(_nodes*_nodes);
- }
-
- _sent_packets[c].resize(_nodes, 0);
- _accepted_packets[c].resize(_nodes, 0);
- _sent_flits[c].resize(_nodes, 0);
- _accepted_flits[c].resize(_nodes, 0);
-
-#ifdef TRACK_STALLS
- _buffer_busy_stalls[c].resize(_subnets*_routers, 0);
- _buffer_conflict_stalls[c].resize(_subnets*_routers, 0);
- _buffer_full_stalls[c].resize(_subnets*_routers, 0);
- _buffer_reserved_stalls[c].resize(_subnets*_routers, 0);
- _crossbar_conflict_stalls[c].resize(_subnets*_routers, 0);
-#endif
- if(_pair_stats){
- for ( int i = 0; i < _nodes; ++i ) {
- for ( int j = 0; j < _nodes; ++j ) {
- tmp_name << "pair_plat_stat_" << c << "_" << i << "_" << j;
- _pair_plat[c][i*_nodes+j] = new Stats( this, tmp_name.str( ), 1.0, 250 );
- _stats[tmp_name.str()] = _pair_plat[c][i*_nodes+j];
- tmp_name.str("");
-
- tmp_name << "pair_nlat_stat_" << c << "_" << i << "_" << j;
- _pair_nlat[c][i*_nodes+j] = new Stats( this, tmp_name.str( ), 1.0, 250 );
- _stats[tmp_name.str()] = _pair_nlat[c][i*_nodes+j];
- tmp_name.str("");
-
- tmp_name << "pair_flat_stat_" << c << "_" << i << "_" << j;
- _pair_flat[c][i*_nodes+j] = new Stats( this, tmp_name.str( ), 1.0, 250 );
- _stats[tmp_name.str()] = _pair_flat[c][i*_nodes+j];
- tmp_name.str("");
- }
- }
- }
- }
-
- _slowest_flit.resize(_classes, -1);
- _slowest_packet.resize(_classes, -1);
-
-
-
-}
-
-TrafficManager::~TrafficManager( )
-{
-
- for ( int source = 0; source < _nodes; ++source ) {
- for ( int subnet = 0; subnet < _subnets; ++subnet ) {
- delete _buf_states[source][subnet];
- }
- }
-
- for ( int c = 0; c < _classes; ++c ) {
- delete _plat_stats[c];
- delete _nlat_stats[c];
- delete _flat_stats[c];
- delete _frag_stats[c];
- delete _hop_stats[c];
-
- delete _traffic_pattern[c];
- delete _injection_process[c];
- if(_pair_stats){
- for ( int i = 0; i < _nodes; ++i ) {
- for ( int j = 0; j < _nodes; ++j ) {
- delete _pair_plat[c][i*_nodes+j];
- delete _pair_nlat[c][i*_nodes+j];
- delete _pair_flat[c][i*_nodes+j];
- }
- }
- }
- }
-
- if(gWatchOut && (gWatchOut != &cout)) delete gWatchOut;
- if(_stats_out && (_stats_out != &cout)) delete _stats_out;
-
-#ifdef TRACK_FLOWS
- if(_injected_flits_out) delete _injected_flits_out;
- if(_received_flits_out) delete _received_flits_out;
- if(_stored_flits_out) delete _stored_flits_out;
- if(_sent_flits_out) delete _sent_flits_out;
- if(_outstanding_credits_out) delete _outstanding_credits_out;
- if(_ejected_flits_out) delete _ejected_flits_out;
- if(_active_packets_out) delete _active_packets_out;
-#endif
-
-#ifdef TRACK_CREDITS
- if(_used_credits_out) delete _used_credits_out;
- if(_free_credits_out) delete _free_credits_out;
- if(_max_credits_out) delete _max_credits_out;
-#endif
-
- PacketReplyInfo::FreeAll();
- Flit::FreeAll();
- Credit::FreeAll();
-}
-
-
-void TrafficManager::_RetireFlit( Flit *f, int dest )
-{
- _deadlock_timer = 0;
-
- assert(_total_in_flight_flits[f->cl].count(f->id) > 0);
- _total_in_flight_flits[f->cl].erase(f->id);
-
- if(f->record) {
- assert(_measured_in_flight_flits[f->cl].count(f->id) > 0);
- _measured_in_flight_flits[f->cl].erase(f->id);
- }
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << dest << " | "
- << "Retiring flit " << f->id
- << " (packet " << f->pid
- << ", src = " << f->src
- << ", dest = " << f->dest
- << ", hops = " << f->hops
- << ", flat = " << f->atime - f->itime
- << ")." << endl;
- }
-
- if ( f->head && ( f->dest != dest ) ) {
- ostringstream err;
- err << "Flit " << f->id << " arrived at incorrect output " << dest;
- Error( err.str( ) );
- }
-
- if((_slowest_flit[f->cl] < 0) ||
- (_flat_stats[f->cl]->Max() < (f->atime - f->itime)))
- _slowest_flit[f->cl] = f->id;
- _flat_stats[f->cl]->AddSample( f->atime - f->itime);
- if(_pair_stats){
- _pair_flat[f->cl][f->src*_nodes+dest]->AddSample( f->atime - f->itime );
- }
-
- if ( f->tail ) {
- Flit * head;
- if(f->head) {
- head = f;
- } else {
- map<int, Flit *>::iterator iter = _retired_packets[f->cl].find(f->pid);
- assert(iter != _retired_packets[f->cl].end());
- head = iter->second;
- _retired_packets[f->cl].erase(iter);
- assert(head->head);
- assert(f->pid == head->pid);
- }
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << dest << " | "
- << "Retiring packet " << f->pid
- << " (plat = " << f->atime - head->ctime
- << ", nlat = " << f->atime - head->itime
- << ", frag = " << (f->atime - head->atime) - (f->id - head->id) // NB: In the spirit of solving problems using ugly hacks, we compute the packet length by taking advantage of the fact that the IDs of flits within a packet are contiguous.
- << ", src = " << head->src
- << ", dest = " << head->dest
- << ")." << endl;
- }
-
- //code the source of request, look carefully, its tricky ;)
- if (f->type == Flit::READ_REQUEST || f->type == Flit::WRITE_REQUEST) {
- PacketReplyInfo* rinfo = PacketReplyInfo::New();
- rinfo->source = f->src;
- rinfo->time = f->atime;
- rinfo->record = f->record;
- rinfo->type = f->type;
- _repliesPending[dest].push_back(rinfo);
- } else {
- if(f->type == Flit::READ_REPLY || f->type == Flit::WRITE_REPLY ){
- _requestsOutstanding[dest]--;
- } else if(f->type == Flit::ANY_TYPE) {
- _requestsOutstanding[f->src]--;
- }
-
- }
-
- // Only record statistics once per packet (at tail)
- // and based on the simulation state
- if ( ( _sim_state == warming_up ) || f->record ) {
-
- _hop_stats[f->cl]->AddSample( f->hops );
-
- if((_slowest_packet[f->cl] < 0) ||
- (_plat_stats[f->cl]->Max() < (f->atime - head->itime)))
- _slowest_packet[f->cl] = f->pid;
- _plat_stats[f->cl]->AddSample( f->atime - head->ctime);
- _nlat_stats[f->cl]->AddSample( f->atime - head->itime);
- _frag_stats[f->cl]->AddSample( (f->atime - head->atime) - (f->id - head->id) );
-
- if(_pair_stats){
- _pair_plat[f->cl][f->src*_nodes+dest]->AddSample( f->atime - head->ctime );
- _pair_nlat[f->cl][f->src*_nodes+dest]->AddSample( f->atime - head->itime );
- }
- }
-
- if(f != head) {
- head->Free();
- }
-
- }
-
- if(f->head && !f->tail) {
- _retired_packets[f->cl].insert(make_pair(f->pid, f));
- } else {
- f->Free();
- }
-}
-
-int TrafficManager::_IssuePacket( int source, int cl )
-{
- int result = 0;
- if(_use_read_write[cl]){ //use read and write
- //check queue for waiting replies.
- //check to make sure it is on time yet
- if (!_repliesPending[source].empty()) {
- if(_repliesPending[source].front()->time <= _time) {
- result = -1;
- }
- } else {
-
- //produce a packet
- if(_injection_process[cl]->test(source)) {
-
- //coin toss to determine request type.
- result = (RandomFloat() < _write_fraction[cl]) ? 2 : 1;
-
- _requestsOutstanding[source]++;
- }
- }
- } else { //normal mode
- result = _injection_process[cl]->test(source) ? 1 : 0;
- _requestsOutstanding[source]++;
- }
- if(result != 0) {
- _packet_seq_no[source]++;
- }
- return result;
-}
-
-void TrafficManager::_GeneratePacket( int source, int stype,
- int cl, int time )
-{
- assert(stype!=0);
-
- Flit::FlitType packet_type = Flit::ANY_TYPE;
- int size = _GetNextPacketSize(cl); //input size
- int pid = _cur_pid++;
- assert(_cur_pid);
- int packet_destination = _traffic_pattern[cl]->dest(source);
- bool record = false;
- bool watch = gWatchOut && (_packets_to_watch.count(pid) > 0);
- if(_use_read_write[cl]){
- if(stype > 0) {
- if (stype == 1) {
- packet_type = Flit::READ_REQUEST;
- size = _read_request_size[cl];
- } else if (stype == 2) {
- packet_type = Flit::WRITE_REQUEST;
- size = _write_request_size[cl];
- } else {
- ostringstream err;
- err << "Invalid packet type: " << packet_type;
- Error( err.str( ) );
- }
- } else {
- PacketReplyInfo* rinfo = _repliesPending[source].front();
- if (rinfo->type == Flit::READ_REQUEST) {//read reply
- size = _read_reply_size[cl];
- packet_type = Flit::READ_REPLY;
- } else if(rinfo->type == Flit::WRITE_REQUEST) { //write reply
- size = _write_reply_size[cl];
- packet_type = Flit::WRITE_REPLY;
- } else {
- ostringstream err;
- err << "Invalid packet type: " << rinfo->type;
- Error( err.str( ) );
- }
- packet_destination = rinfo->source;
- time = rinfo->time;
- record = rinfo->record;
- _repliesPending[source].pop_front();
- rinfo->Free();
- }
- }
-
- if ((packet_destination <0) || (packet_destination >= _nodes)) {
- ostringstream err;
- err << "Incorrect packet destination " << packet_destination
- << " for stype " << packet_type;
- Error( err.str( ) );
- }
-
- if ( ( _sim_state == running ) ||
- ( ( _sim_state == draining ) && ( time < _drain_time ) ) ) {
- record = _measure_stats[cl];
- }
-
- int subnetwork = ((packet_type == Flit::ANY_TYPE) ?
- RandomInt(_subnets-1) :
- _subnet[packet_type]);
-
- if ( watch ) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << source << " | "
- << "Enqueuing packet " << pid
- << " at time " << time
- << "." << endl;
- }
-
- for ( int i = 0; i < size; ++i ) {
- Flit * f = Flit::New();
- f->id = _cur_id++;
- assert(_cur_id);
- f->pid = pid;
- f->watch = watch | (gWatchOut && (_flits_to_watch.count(f->id) > 0));
- f->subnetwork = subnetwork;
- f->src = source;
- f->ctime = time;
- f->record = record;
- f->cl = cl;
-
- _total_in_flight_flits[f->cl].insert(make_pair(f->id, f));
- if(record) {
- _measured_in_flight_flits[f->cl].insert(make_pair(f->id, f));
- }
-
- if(gTrace){
- cout<<"New Flit "<<f->src<<endl;
- }
- f->type = packet_type;
-
- if ( i == 0 ) { // Head flit
- f->head = true;
- //packets are only generated to nodes smaller or equal to limit
- f->dest = packet_destination;
- } else {
- f->head = false;
- f->dest = -1;
- }
- switch( _pri_type ) {
- case class_based:
- f->pri = _class_priority[cl];
- assert(f->pri >= 0);
- break;
- case age_based:
- f->pri = numeric_limits<int>::max() - time;
- assert(f->pri >= 0);
- break;
- case sequence_based:
- f->pri = numeric_limits<int>::max() - _packet_seq_no[source];
- assert(f->pri >= 0);
- break;
- default:
- f->pri = 0;
- }
- if ( i == ( size - 1 ) ) { // Tail flit
- f->tail = true;
- } else {
- f->tail = false;
- }
-
- f->vc = -1;
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << source << " | "
- << "Enqueuing flit " << f->id
- << " (packet " << f->pid
- << ") at time " << time
- << "." << endl;
- }
-
- _partial_packets[source][cl].push_back( f );
- }
-}
-
-void TrafficManager::_Inject(){
-
- for ( int input = 0; input < _nodes; ++input ) {
- for ( int c = 0; c < _classes; ++c ) {
- // Potentially generate packets for any (input,class)
- // that is currently empty
- if ( _partial_packets[input][c].empty() ) {
- bool generated = false;
- while( !generated && ( _qtime[input][c] <= _time ) ) {
- int stype = _IssuePacket( input, c );
-
- if ( stype != 0 ) { //generate a packet
- _GeneratePacket( input, stype, c,
- _include_queuing==1 ?
- _qtime[input][c] : _time );
- generated = true;
- }
- // only advance time if this is not a reply packet
- if(!_use_read_write[c] || (stype >= 0)){
- ++_qtime[input][c];
- }
- }
-
- if ( ( _sim_state == draining ) &&
- ( _qtime[input][c] > _drain_time ) ) {
- _qdrained[input][c] = true;
- }
- }
- }
- }
-}
-
-void TrafficManager::_Step( )
-{
- bool flits_in_flight = false;
- for(int c = 0; c < _classes; ++c) {
- flits_in_flight |= !_total_in_flight_flits[c].empty();
- }
- if(flits_in_flight && (_deadlock_timer++ >= _deadlock_warn_timeout)){
- _deadlock_timer = 0;
- cout << "WARNING: Possible network deadlock.\n";
- }
-
- vector<map<int, Flit *> > flits(_subnets);
-
- for ( int subnet = 0; subnet < _subnets; ++subnet ) {
- for ( int n = 0; n < _nodes; ++n ) {
- Flit * const f = _net[subnet]->ReadFlit( n );
- if ( f ) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << n << " | "
- << "Ejecting flit " << f->id
- << " (packet " << f->pid << ")"
- << " from VC " << f->vc
- << "." << endl;
- }
- flits[subnet].insert(make_pair(n, f));
- if((_sim_state == warming_up) || (_sim_state == running)) {
- ++_accepted_flits[f->cl][n];
- if(f->tail) {
- ++_accepted_packets[f->cl][n];
- }
- }
- }
-
- Credit * const c = _net[subnet]->ReadCredit( n );
- if ( c ) {
-#ifdef TRACK_FLOWS
- for(set<int>::const_iterator iter = c->vc.begin(); iter != c->vc.end(); ++iter) {
- int const vc = *iter;
- assert(!_outstanding_classes[n][subnet][vc].empty());
- int cl = _outstanding_classes[n][subnet][vc].front();
- _outstanding_classes[n][subnet][vc].pop();
- assert(_outstanding_credits[cl][subnet][n] > 0);
- --_outstanding_credits[cl][subnet][n];
- }
-#endif
- _buf_states[n][subnet]->ProcessCredit(c);
- c->Free();
- }
- }
- _net[subnet]->ReadInputs( );
- }
-
- if ( !_empty_network ) {
- _Inject();
- }
-
- for(int subnet = 0; subnet < _subnets; ++subnet) {
-
- for(int n = 0; n < _nodes; ++n) {
-
- Flit * f = NULL;
-
- BufferState * const dest_buf = _buf_states[n][subnet];
-
- int const last_class = _last_class[n][subnet];
-
- int class_limit = _classes;
-
- if(_hold_switch_for_packet) {
- list<Flit *> const & pp = _partial_packets[n][last_class];
- if(!pp.empty() && !pp.front()->head &&
- !dest_buf->IsFullFor(pp.front()->vc)) {
- f = pp.front();
- assert(f->vc == _last_vc[n][subnet][last_class]);
-
- // if we're holding the connection, we don't need to check that class
- // again in the for loop
- --class_limit;
- }
- }
-
- for(int i = 1; i <= class_limit; ++i) {
-
- int const c = (last_class + i) % _classes;
-
- list<Flit *> const & pp = _partial_packets[n][c];
-
- if(pp.empty()) {
- continue;
- }
-
- Flit * const cf = pp.front();
- assert(cf);
- assert(cf->cl == c);
-
- if(cf->subnetwork != subnet) {
- continue;
- }
-
- if(f && (f->pri >= cf->pri)) {
- continue;
- }
-
- if(cf->head && cf->vc == -1) { // Find first available VC
-
- OutputSet route_set;
- _rf(NULL, cf, -1, &route_set, true);
- set<OutputSet::sSetElement> const & os = route_set.GetSet();
- assert(os.size() == 1);
- OutputSet::sSetElement const & se = *os.begin();
- assert(se.output_port == -1);
- int vc_start = se.vc_start;
- int vc_end = se.vc_end;
- int vc_count = vc_end - vc_start + 1;
- if(_noq) {
- assert(_lookahead_routing);
- const FlitChannel * inject = _net[subnet]->GetInject(n);
- const Router * router = inject->GetSink();
- assert(router);
- int in_channel = inject->GetSinkPort();
-
- // NOTE: Because the lookahead is not for injection, but for the
- // first hop, we have to temporarily set cf's VC to be non-negative
- // in order to avoid seting of an assertion in the routing function.
- cf->vc = vc_start;
- _rf(router, cf, in_channel, &cf->la_route_set, false);
- cf->vc = -1;
-
- if(cf->watch) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << n << " | "
- << "Generating lookahead routing info for flit " << cf->id
- << " (NOQ)." << endl;
- }
- set<OutputSet::sSetElement> const sl = cf->la_route_set.GetSet();
- assert(sl.size() == 1);
- int next_output = sl.begin()->output_port;
- vc_count /= router->NumOutputs();
- vc_start += next_output * vc_count;
- vc_end = vc_start + vc_count - 1;
- assert(vc_start >= se.vc_start && vc_start <= se.vc_end);
- assert(vc_end >= se.vc_start && vc_end <= se.vc_end);
- assert(vc_start <= vc_end);
- }
- if(cf->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Finding output VC for flit " << cf->id
- << ":" << endl;
- }
- for(int i = 1; i <= vc_count; ++i) {
- int const lvc = _last_vc[n][subnet][c];
- int const vc =
- (lvc < vc_start || lvc > vc_end) ?
- vc_start :
- (vc_start + (lvc - vc_start + i) % vc_count);
- assert((vc >= vc_start) && (vc <= vc_end));
- if(!dest_buf->IsAvailableFor(vc)) {
- if(cf->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Output VC " << vc << " is busy." << endl;
- }
- } else {
- if(dest_buf->IsFullFor(vc)) {
- if(cf->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Output VC " << vc << " is full." << endl;
- }
- } else {
- if(cf->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Selected output VC " << vc << "." << endl;
- }
- cf->vc = vc;
- break;
- }
- }
- }
- }
-
- if(cf->vc == -1) {
- if(cf->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "No output VC found for flit " << cf->id
- << "." << endl;
- }
- } else {
- if(dest_buf->IsFullFor(cf->vc)) {
- if(cf->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Selected output VC " << cf->vc
- << " is full for flit " << cf->id
- << "." << endl;
- }
- } else {
- f = cf;
- }
- }
- }
-
- if(f) {
-
- assert(f->subnetwork == subnet);
-
- int const c = f->cl;
-
- if(f->head) {
-
- if (_lookahead_routing) {
- if(!_noq) {
- const FlitChannel * inject = _net[subnet]->GetInject(n);
- const Router * router = inject->GetSink();
- assert(router);
- int in_channel = inject->GetSinkPort();
- _rf(router, f, in_channel, &f->la_route_set, false);
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << n << " | "
- << "Generating lookahead routing info for flit " << f->id
- << "." << endl;
- }
- } else if(f->watch) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << n << " | "
- << "Already generated lookahead routing info for flit " << f->id
- << " (NOQ)." << endl;
- }
- } else {
- f->la_route_set.Clear();
- }
-
- dest_buf->TakeBuffer(f->vc);
- _last_vc[n][subnet][c] = f->vc;
- }
-
- _last_class[n][subnet] = c;
-
- _partial_packets[n][c].pop_front();
-
-#ifdef TRACK_FLOWS
- ++_outstanding_credits[c][subnet][n];
- _outstanding_classes[n][subnet][f->vc].push(c);
-#endif
-
- dest_buf->SendingFlit(f);
-
- if(_pri_type == network_age_based) {
- f->pri = numeric_limits<int>::max() - _time;
- assert(f->pri >= 0);
- }
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << n << " | "
- << "Injecting flit " << f->id
- << " into subnet " << subnet
- << " at time " << _time
- << " with priority " << f->pri
- << "." << endl;
- }
- f->itime = _time;
-
- // Pass VC "back"
- if(!_partial_packets[n][c].empty() && !f->tail) {
- Flit * const nf = _partial_packets[n][c].front();
- nf->vc = f->vc;
- }
-
- if((_sim_state == warming_up) || (_sim_state == running)) {
- ++_sent_flits[c][n];
- if(f->head) {
- ++_sent_packets[c][n];
- }
- }
-
-#ifdef TRACK_FLOWS
- ++_injected_flits[c][n];
-#endif
-
- _net[subnet]->WriteFlit(f, n);
-
- }
- }
- }
-
- for(int subnet = 0; subnet < _subnets; ++subnet) {
- for(int n = 0; n < _nodes; ++n) {
- map<int, Flit *>::const_iterator iter = flits[subnet].find(n);
- if(iter != flits[subnet].end()) {
- Flit * const f = iter->second;
-
- f->atime = _time;
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | "
- << "node" << n << " | "
- << "Injecting credit for VC " << f->vc
- << " into subnet " << subnet
- << "." << endl;
- }
- Credit * const c = Credit::New();
- c->vc.insert(f->vc);
- _net[subnet]->WriteCredit(c, n);
-
-#ifdef TRACK_FLOWS
- ++_ejected_flits[f->cl][n];
-#endif
-
- _RetireFlit(f, n);
- }
- }
- flits[subnet].clear();
- _net[subnet]->Evaluate( );
- _net[subnet]->WriteOutputs( );
- }
-
- ++_time;
- assert(_time);
- if(gTrace){
- cout<<"TIME "<<_time<<endl;
- }
-
-}
-
-bool TrafficManager::_PacketsOutstanding( ) const
-{
- for ( int c = 0; c < _classes; ++c ) {
- if ( _measure_stats[c] ) {
- if ( _measured_in_flight_flits[c].empty() ) {
-
- for ( int s = 0; s < _nodes; ++s ) {
- if ( !_qdrained[s][c] ) {
-#ifdef DEBUG_DRAIN
- cout << "waiting on queue " << s << " class " << c;
- cout << ", time = " << _time << " qtime = " << _qtime[s][c] << endl;
-#endif
- return true;
- }
- }
- } else {
-#ifdef DEBUG_DRAIN
- cout << "in flight = " << _measured_in_flight_flits[c].size() << endl;
-#endif
- return true;
- }
- }
- }
- return false;
-}
-
-void TrafficManager::_ClearStats( )
-{
- _slowest_flit.assign(_classes, -1);
- _slowest_packet.assign(_classes, -1);
-
- for ( int c = 0; c < _classes; ++c ) {
-
- _plat_stats[c]->Clear( );
- _nlat_stats[c]->Clear( );
- _flat_stats[c]->Clear( );
-
- _frag_stats[c]->Clear( );
-
- _sent_packets[c].assign(_nodes, 0);
- _accepted_packets[c].assign(_nodes, 0);
- _sent_flits[c].assign(_nodes, 0);
- _accepted_flits[c].assign(_nodes, 0);
-
-#ifdef TRACK_STALLS
- _buffer_busy_stalls[c].assign(_subnets*_routers, 0);
- _buffer_conflict_stalls[c].assign(_subnets*_routers, 0);
- _buffer_full_stalls[c].assign(_subnets*_routers, 0);
- _buffer_reserved_stalls[c].assign(_subnets*_routers, 0);
- _crossbar_conflict_stalls[c].assign(_subnets*_routers, 0);
-#endif
- if(_pair_stats){
- for ( int i = 0; i < _nodes; ++i ) {
- for ( int j = 0; j < _nodes; ++j ) {
- _pair_plat[c][i*_nodes+j]->Clear( );
- _pair_nlat[c][i*_nodes+j]->Clear( );
- _pair_flat[c][i*_nodes+j]->Clear( );
- }
- }
- }
- _hop_stats[c]->Clear();
-
- }
-
- _reset_time = _time;
-}
-
-void TrafficManager::_ComputeStats( const vector<int> & stats, int *sum, int *min, int *max, int *min_pos, int *max_pos ) const
-{
- int const count = stats.size();
- assert(count > 0);
-
- if(min_pos) {
- *min_pos = 0;
- }
- if(max_pos) {
- *max_pos = 0;
- }
-
- if(min) {
- *min = stats[0];
- }
- if(max) {
- *max = stats[0];
- }
-
- *sum = stats[0];
-
- for ( int i = 1; i < count; ++i ) {
- int curr = stats[i];
- if ( min && ( curr < *min ) ) {
- *min = curr;
- if ( min_pos ) {
- *min_pos = i;
- }
- }
- if ( max && ( curr > *max ) ) {
- *max = curr;
- if ( max_pos ) {
- *max_pos = i;
- }
- }
- *sum += curr;
- }
-}
-
-void TrafficManager::_DisplayRemaining( ostream & os ) const
-{
- for(int c = 0; c < _classes; ++c) {
-
- map<int, Flit *>::const_iterator iter;
- int i;
-
- os << "Class " << c << ":" << endl;
-
- os << "Remaining flits: ";
- for ( iter = _total_in_flight_flits[c].begin( ), i = 0;
- ( iter != _total_in_flight_flits[c].end( ) ) && ( i < 10 );
- iter++, i++ ) {
- os << iter->first << " ";
- }
- if(_total_in_flight_flits[c].size() > 10)
- os << "[...] ";
-
- os << "(" << _total_in_flight_flits[c].size() << " flits)" << endl;
-
- os << "Measured flits: ";
- for ( iter = _measured_in_flight_flits[c].begin( ), i = 0;
- ( iter != _measured_in_flight_flits[c].end( ) ) && ( i < 10 );
- iter++, i++ ) {
- os << iter->first << " ";
- }
- if(_measured_in_flight_flits[c].size() > 10)
- os << "[...] ";
-
- os << "(" << _measured_in_flight_flits[c].size() << " flits)" << endl;
-
- }
-}
-
-bool TrafficManager::_SingleSim( )
-{
- int converged = 0;
-
- //once warmed up, we require 3 converging runs to end the simulation
- vector<double> prev_latency(_classes, 0.0);
- vector<double> prev_accepted(_classes, 0.0);
- bool clear_last = false;
- int total_phases = 0;
- while( ( total_phases < _max_samples ) &&
- ( ( _sim_state != running ) ||
- ( converged < 3 ) ) ) {
-
- if ( clear_last || (( ( _sim_state == warming_up ) && ( ( total_phases % 2 ) == 0 ) )) ) {
- clear_last = false;
- _ClearStats( );
- }
-
-
- for ( int iter = 0; iter < _sample_period; ++iter )
- _Step( );
-
- //cout << _sim_state << endl;
-
- UpdateStats();
- DisplayStats();
-
- int lat_exc_class = -1;
- int lat_chg_exc_class = -1;
- int acc_chg_exc_class = -1;
-
- for(int c = 0; c < _classes; ++c) {
-
- if(_measure_stats[c] == 0) {
- continue;
- }
-
- double cur_latency = _plat_stats[c]->Average( );
-
- int total_accepted_count;
- _ComputeStats( _accepted_flits[c], &total_accepted_count );
- double total_accepted_rate = (double)total_accepted_count / (double)(_time - _reset_time);
- double cur_accepted = total_accepted_rate / (double)_nodes;
-
- double latency_change = fabs((cur_latency - prev_latency[c]) / cur_latency);
- prev_latency[c] = cur_latency;
-
- double accepted_change = fabs((cur_accepted - prev_accepted[c]) / cur_accepted);
- prev_accepted[c] = cur_accepted;
-
- double latency = (double)_plat_stats[c]->Sum();
- double count = (double)_plat_stats[c]->NumSamples();
-
- map<int, Flit *>::const_iterator iter;
- for(iter = _total_in_flight_flits[c].begin();
- iter != _total_in_flight_flits[c].end();
- iter++) {
- latency += (double)(_time - iter->second->ctime);
- count++;
- }
-
- if((lat_exc_class < 0) &&
- (_latency_thres[c] >= 0.0) &&
- ((latency / count) > _latency_thres[c])) {
- lat_exc_class = c;
- }
-
- cout << "latency change = " << latency_change << endl;
- if(lat_chg_exc_class < 0) {
- if((_sim_state == warming_up) &&
- (_warmup_threshold[c] >= 0.0) &&
- (latency_change > _warmup_threshold[c])) {
- lat_chg_exc_class = c;
- } else if((_sim_state == running) &&
- (_stopping_threshold[c] >= 0.0) &&
- (latency_change > _stopping_threshold[c])) {
- lat_chg_exc_class = c;
- }
- }
-
- cout << "throughput change = " << accepted_change << endl;
- if(acc_chg_exc_class < 0) {
- if((_sim_state == warming_up) &&
- (_acc_warmup_threshold[c] >= 0.0) &&
- (accepted_change > _acc_warmup_threshold[c])) {
- acc_chg_exc_class = c;
- } else if((_sim_state == running) &&
- (_acc_stopping_threshold[c] >= 0.0) &&
- (accepted_change > _acc_stopping_threshold[c])) {
- acc_chg_exc_class = c;
- }
- }
-
- }
-
- // Fail safe for latency mode, throughput will ust continue
- if ( _measure_latency && ( lat_exc_class >= 0 ) ) {
-
- cout << "Average latency for class " << lat_exc_class << " exceeded " << _latency_thres[lat_exc_class] << " cycles. Aborting simulation." << endl;
- converged = 0;
- _sim_state = draining;
- _drain_time = _time;
- if(_stats_out) {
- WriteStats(*_stats_out);
- }
- break;
-
- }
-
- if ( _sim_state == warming_up ) {
- if ( ( _warmup_periods > 0 ) ?
- ( total_phases + 1 >= _warmup_periods ) :
- ( ( !_measure_latency || ( lat_chg_exc_class < 0 ) ) &&
- ( acc_chg_exc_class < 0 ) ) ) {
- cout << "Warmed up ..." << "Time used is " << _time << " cycles" <<endl;
- clear_last = true;
- _sim_state = running;
- }
- } else if(_sim_state == running) {
- if ( ( !_measure_latency || ( lat_chg_exc_class < 0 ) ) &&
- ( acc_chg_exc_class < 0 ) ) {
- ++converged;
- } else {
- converged = 0;
- }
- }
- ++total_phases;
- }
-
- if ( _sim_state == running ) {
- ++converged;
-
- _sim_state = draining;
- _drain_time = _time;
-
- if ( _measure_latency ) {
- cout << "Draining all recorded packets ..." << endl;
- int empty_steps = 0;
- while( _PacketsOutstanding( ) ) {
- _Step( );
-
- ++empty_steps;
-
- if ( empty_steps % 1000 == 0 ) {
-
- int lat_exc_class = -1;
-
- for(int c = 0; c < _classes; c++) {
-
- double threshold = _latency_thres[c];
-
- if(threshold < 0.0) {
- continue;
- }
-
- double acc_latency = _plat_stats[c]->Sum();
- double acc_count = (double)_plat_stats[c]->NumSamples();
-
- map<int, Flit *>::const_iterator iter;
- for(iter = _total_in_flight_flits[c].begin();
- iter != _total_in_flight_flits[c].end();
- iter++) {
- acc_latency += (double)(_time - iter->second->ctime);
- acc_count++;
- }
-
- if((acc_latency / acc_count) > threshold) {
- lat_exc_class = c;
- break;
- }
- }
-
- if(lat_exc_class >= 0) {
- cout << "Average latency for class " << lat_exc_class << " exceeded " << _latency_thres[lat_exc_class] << " cycles. Aborting simulation." << endl;
- converged = 0;
- _sim_state = warming_up;
- if(_stats_out) {
- WriteStats(*_stats_out);
- }
- break;
- }
-
- _DisplayRemaining( );
-
- }
- }
- }
- } else {
- cout << "Too many sample periods needed to converge" << endl;
- }
-
- return ( converged > 0 );
-}
-
-bool TrafficManager::Run( )
-{
- for ( int sim = 0; sim < _total_sims; ++sim ) {
-
- _time = 0;
-
- //remove any pending request from the previous simulations
- _requestsOutstanding.assign(_nodes, 0);
- for (int i=0;i<_nodes;i++) {
- while(!_repliesPending[i].empty()) {
- _repliesPending[i].front()->Free();
- _repliesPending[i].pop_front();
- }
- }
-
- //reset queuetime for all sources
- for ( int s = 0; s < _nodes; ++s ) {
- _qtime[s].assign(_classes, 0);
- _qdrained[s].assign(_classes, false);
- }
-
- // warm-up ...
- // reset stats, all packets after warmup_time marked
- // converge
- // draing, wait until all packets finish
- _sim_state = warming_up;
-
- _ClearStats( );
-
- for(int c = 0; c < _classes; ++c) {
- _traffic_pattern[c]->reset();
- _injection_process[c]->reset();
- }
-
- if ( !_SingleSim( ) ) {
- cout << "Simulation unstable, ending ..." << endl;
- return false;
- }
-
- // Empty any remaining packets
- cout << "Draining remaining packets ..." << endl;
- _empty_network = true;
- int empty_steps = 0;
-
- bool packets_left = false;
- for(int c = 0; c < _classes; ++c) {
- packets_left |= !_total_in_flight_flits[c].empty();
- }
-
- while( packets_left ) {
- _Step( );
-
- ++empty_steps;
-
- if ( empty_steps % 1000 == 0 ) {
- _DisplayRemaining( );
- }
-
- packets_left = false;
- for(int c = 0; c < _classes; ++c) {
- packets_left |= !_total_in_flight_flits[c].empty();
- }
- }
- //wait until all the credits are drained as well
- while(Credit::OutStanding()!=0){
- _Step();
- }
- _empty_network = false;
-
- //for the love of god don't ever say "Time taken" anywhere else
- //the power script depend on it
- cout << "Time taken is " << _time << " cycles" <<endl;
-
- if(_stats_out) {
- WriteStats(*_stats_out);
- }
- _UpdateOverallStats();
- }
-
- DisplayOverallStats();
- if(_print_csv_results) {
- DisplayOverallStatsCSV();
- }
-
- return true;
-}
-
-void TrafficManager::_UpdateOverallStats() {
- for ( int c = 0; c < _classes; ++c ) {
-
- if(_measure_stats[c] == 0) {
- continue;
- }
-
- _overall_min_plat[c] += _plat_stats[c]->Min();
- _overall_avg_plat[c] += _plat_stats[c]->Average();
- _overall_max_plat[c] += _plat_stats[c]->Max();
- _overall_min_nlat[c] += _nlat_stats[c]->Min();
- _overall_avg_nlat[c] += _nlat_stats[c]->Average();
- _overall_max_nlat[c] += _nlat_stats[c]->Max();
- _overall_min_flat[c] += _flat_stats[c]->Min();
- _overall_avg_flat[c] += _flat_stats[c]->Average();
- _overall_max_flat[c] += _flat_stats[c]->Max();
-
- _overall_min_frag[c] += _frag_stats[c]->Min();
- _overall_avg_frag[c] += _frag_stats[c]->Average();
- _overall_max_frag[c] += _frag_stats[c]->Max();
-
- _overall_hop_stats[c] += _hop_stats[c]->Average();
-
- int count_min, count_sum, count_max;
- double rate_min, rate_sum, rate_max;
- double rate_avg;
- double time_delta = (double)(_drain_time - _reset_time);
- _ComputeStats( _sent_flits[c], &count_sum, &count_min, &count_max );
- rate_min = (double)count_min / time_delta;
- rate_sum = (double)count_sum / time_delta;
- rate_max = (double)count_max / time_delta;
- rate_avg = rate_sum / (double)_nodes;
- _overall_min_sent[c] += rate_min;
- _overall_avg_sent[c] += rate_avg;
- _overall_max_sent[c] += rate_max;
- _ComputeStats( _sent_packets[c], &count_sum, &count_min, &count_max );
- rate_min = (double)count_min / time_delta;
- rate_sum = (double)count_sum / time_delta;
- rate_max = (double)count_max / time_delta;
- rate_avg = rate_sum / (double)_nodes;
- _overall_min_sent_packets[c] += rate_min;
- _overall_avg_sent_packets[c] += rate_avg;
- _overall_max_sent_packets[c] += rate_max;
- _ComputeStats( _accepted_flits[c], &count_sum, &count_min, &count_max );
- rate_min = (double)count_min / time_delta;
- rate_sum = (double)count_sum / time_delta;
- rate_max = (double)count_max / time_delta;
- rate_avg = rate_sum / (double)_nodes;
- _overall_min_accepted[c] += rate_min;
- _overall_avg_accepted[c] += rate_avg;
- _overall_max_accepted[c] += rate_max;
- _ComputeStats( _accepted_packets[c], &count_sum, &count_min, &count_max );
- rate_min = (double)count_min / time_delta;
- rate_sum = (double)count_sum / time_delta;
- rate_max = (double)count_max / time_delta;
- rate_avg = rate_sum / (double)_nodes;
- _overall_min_accepted_packets[c] += rate_min;
- _overall_avg_accepted_packets[c] += rate_avg;
- _overall_max_accepted_packets[c] += rate_max;
-
-#ifdef TRACK_STALLS
- _ComputeStats(_buffer_busy_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- _overall_buffer_busy_stalls[c] += rate_avg;
- _ComputeStats(_buffer_conflict_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- _overall_buffer_conflict_stalls[c] += rate_avg;
- _ComputeStats(_buffer_full_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- _overall_buffer_full_stalls[c] += rate_avg;
- _ComputeStats(_buffer_reserved_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- _overall_buffer_reserved_stalls[c] += rate_avg;
- _ComputeStats(_crossbar_conflict_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- _overall_crossbar_conflict_stalls[c] += rate_avg;
-#endif
-
- }
-}
-
-void TrafficManager::WriteStats(ostream & os) const {
-
- os << "%=================================" << endl;
-
- for(int c = 0; c < _classes; ++c) {
-
- if(_measure_stats[c] == 0) {
- continue;
- }
-
- //c+1 due to matlab array starting at 1
- os << "plat(" << c+1 << ") = " << _plat_stats[c]->Average() << ";" << endl
- << "plat_hist(" << c+1 << ",:) = " << *_plat_stats[c] << ";" << endl
- << "nlat(" << c+1 << ") = " << _nlat_stats[c]->Average() << ";" << endl
- << "nlat_hist(" << c+1 << ",:) = " << *_nlat_stats[c] << ";" << endl
- << "flat(" << c+1 << ") = " << _flat_stats[c]->Average() << ";" << endl
- << "flat_hist(" << c+1 << ",:) = " << *_flat_stats[c] << ";" << endl
- << "frag_hist(" << c+1 << ",:) = " << *_frag_stats[c] << ";" << endl
- << "hops(" << c+1 << ",:) = " << *_hop_stats[c] << ";" << endl;
- if(_pair_stats){
- os<< "pair_sent(" << c+1 << ",:) = [ ";
- for(int i = 0; i < _nodes; ++i) {
- for(int j = 0; j < _nodes; ++j) {
- os << _pair_plat[c][i*_nodes+j]->NumSamples() << " ";
- }
- }
- os << "];" << endl
- << "pair_plat(" << c+1 << ",:) = [ ";
- for(int i = 0; i < _nodes; ++i) {
- for(int j = 0; j < _nodes; ++j) {
- os << _pair_plat[c][i*_nodes+j]->Average( ) << " ";
- }
- }
- os << "];" << endl
- << "pair_nlat(" << c+1 << ",:) = [ ";
- for(int i = 0; i < _nodes; ++i) {
- for(int j = 0; j < _nodes; ++j) {
- os << _pair_nlat[c][i*_nodes+j]->Average( ) << " ";
- }
- }
- os << "];" << endl
- << "pair_flat(" << c+1 << ",:) = [ ";
- for(int i = 0; i < _nodes; ++i) {
- for(int j = 0; j < _nodes; ++j) {
- os << _pair_flat[c][i*_nodes+j]->Average( ) << " ";
- }
- }
- }
-
- double time_delta = (double)(_drain_time - _reset_time);
-
- os << "];" << endl
- << "sent_packets(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _nodes; ++d ) {
- os << (double)_sent_packets[c][d] / time_delta << " ";
- }
- os << "];" << endl
- << "accepted_packets(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _nodes; ++d ) {
- os << (double)_accepted_packets[c][d] / time_delta << " ";
- }
- os << "];" << endl
- << "sent_flits(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _nodes; ++d ) {
- os << (double)_sent_flits[c][d] / time_delta << " ";
- }
- os << "];" << endl
- << "accepted_flits(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _nodes; ++d ) {
- os << (double)_accepted_flits[c][d] / time_delta << " ";
- }
- os << "];" << endl
- << "sent_packet_size(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _nodes; ++d ) {
- os << (double)_sent_flits[c][d] / (double)_sent_packets[c][d] << " ";
- }
- os << "];" << endl
- << "accepted_packet_size(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _nodes; ++d ) {
- os << (double)_accepted_flits[c][d] / (double)_accepted_packets[c][d] << " ";
- }
- os << "];" << endl;
-#ifdef TRACK_STALLS
- os << "buffer_busy_stalls(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _subnets*_routers; ++d ) {
- os << (double)_buffer_busy_stalls[c][d] / time_delta << " ";
- }
- os << "];" << endl
- << "buffer_conflict_stalls(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _subnets*_routers; ++d ) {
- os << (double)_buffer_conflict_stalls[c][d] / time_delta << " ";
- }
- os << "];" << endl
- << "buffer_full_stalls(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _subnets*_routers; ++d ) {
- os << (double)_buffer_full_stalls[c][d] / time_delta << " ";
- }
- os << "];" << endl
- << "buffer_reserved_stalls(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _subnets*_routers; ++d ) {
- os << (double)_buffer_reserved_stalls[c][d] / time_delta << " ";
- }
- os << "];" << endl
- << "crossbar_conflict_stalls(" << c+1 << ",:) = [ ";
- for ( int d = 0; d < _subnets*_routers; ++d ) {
- os << (double)_crossbar_conflict_stalls[c][d] / time_delta << " ";
- }
- os << "];" << endl;
-#endif
- }
-}
-
-void TrafficManager::UpdateStats() {
-#if defined(TRACK_FLOWS) || defined(TRACK_STALLS)
- for(int c = 0; c < _classes; ++c) {
-#ifdef TRACK_FLOWS
- {
- char trail_char = (c == _classes - 1) ? '\n' : ',';
- if(_injected_flits_out) *_injected_flits_out << _injected_flits[c] << trail_char;
- _injected_flits[c].assign(_nodes, 0);
- if(_ejected_flits_out) *_ejected_flits_out << _ejected_flits[c] << trail_char;
- _ejected_flits[c].assign(_nodes, 0);
- }
-#endif
- for(int subnet = 0; subnet < _subnets; ++subnet) {
-#ifdef TRACK_FLOWS
- if(_outstanding_credits_out) *_outstanding_credits_out << _outstanding_credits[c][subnet] << ',';
- if(_stored_flits_out) *_stored_flits_out << vector<int>(_nodes, 0) << ',';
-#endif
- for(int router = 0; router < _routers; ++router) {
- Router * const r = _router[subnet][router];
-#ifdef TRACK_FLOWS
- char trail_char =
- ((router == _routers - 1) && (subnet == _subnets - 1) && (c == _classes - 1)) ? '\n' : ',';
- if(_received_flits_out) *_received_flits_out << r->GetReceivedFlits(c) << trail_char;
- if(_stored_flits_out) *_stored_flits_out << r->GetStoredFlits(c) << trail_char;
- if(_sent_flits_out) *_sent_flits_out << r->GetSentFlits(c) << trail_char;
- if(_outstanding_credits_out) *_outstanding_credits_out << r->GetOutstandingCredits(c) << trail_char;
- if(_active_packets_out) *_active_packets_out << r->GetActivePackets(c) << trail_char;
- r->ResetFlowStats(c);
-#endif
-#ifdef TRACK_STALLS
- _buffer_busy_stalls[c][subnet*_routers+router] += r->GetBufferBusyStalls(c);
- _buffer_conflict_stalls[c][subnet*_routers+router] += r->GetBufferConflictStalls(c);
- _buffer_full_stalls[c][subnet*_routers+router] += r->GetBufferFullStalls(c);
- _buffer_reserved_stalls[c][subnet*_routers+router] += r->GetBufferReservedStalls(c);
- _crossbar_conflict_stalls[c][subnet*_routers+router] += r->GetCrossbarConflictStalls(c);
- r->ResetStallStats(c);
-#endif
- }
- }
- }
-#ifdef TRACK_FLOWS
- if(_injected_flits_out) *_injected_flits_out << flush;
- if(_received_flits_out) *_received_flits_out << flush;
- if(_stored_flits_out) *_stored_flits_out << flush;
- if(_sent_flits_out) *_sent_flits_out << flush;
- if(_outstanding_credits_out) *_outstanding_credits_out << flush;
- if(_ejected_flits_out) *_ejected_flits_out << flush;
- if(_active_packets_out) *_active_packets_out << flush;
-#endif
-#endif
-
-#ifdef TRACK_CREDITS
- for(int s = 0; s < _subnets; ++s) {
- for(int n = 0; n < _nodes; ++n) {
- BufferState const * const bs = _buf_states[n][s];
- for(int v = 0; v < _vcs; ++v) {
- if(_used_credits_out) *_used_credits_out << bs->OccupancyFor(v) << ',';
- if(_free_credits_out) *_free_credits_out << bs->AvailableFor(v) << ',';
- if(_max_credits_out) *_max_credits_out << bs->LimitFor(v) << ',';
- }
- }
- for(int r = 0; r < _routers; ++r) {
- Router const * const rtr = _router[s][r];
- char trail_char =
- ((r == _routers - 1) && (s == _subnets - 1)) ? '\n' : ',';
- if(_used_credits_out) *_used_credits_out << rtr->UsedCredits() << trail_char;
- if(_free_credits_out) *_free_credits_out << rtr->FreeCredits() << trail_char;
- if(_max_credits_out) *_max_credits_out << rtr->MaxCredits() << trail_char;
- }
- }
- if(_used_credits_out) *_used_credits_out << flush;
- if(_free_credits_out) *_free_credits_out << flush;
- if(_max_credits_out) *_max_credits_out << flush;
-#endif
-
-}
-
-void TrafficManager::DisplayStats(ostream & os) const {
-
- for(int c = 0; c < _classes; ++c) {
-
- if(_measure_stats[c] == 0) {
- continue;
- }
-
- cout << "Class " << c << ":" << endl;
-
- cout
- << "Packet latency average = " << _plat_stats[c]->Average() << endl
- << "\tminimum = " << _plat_stats[c]->Min() << endl
- << "\tmaximum = " << _plat_stats[c]->Max() << endl
- << "Network latency average = " << _nlat_stats[c]->Average() << endl
- << "\tminimum = " << _nlat_stats[c]->Min() << endl
- << "\tmaximum = " << _nlat_stats[c]->Max() << endl
- << "Slowest packet = " << _slowest_packet[c] << endl
- << "Flit latency average = " << _flat_stats[c]->Average() << endl
- << "\tminimum = " << _flat_stats[c]->Min() << endl
- << "\tmaximum = " << _flat_stats[c]->Max() << endl
- << "Slowest flit = " << _slowest_flit[c] << endl
- << "Fragmentation average = " << _frag_stats[c]->Average() << endl
- << "\tminimum = " << _frag_stats[c]->Min() << endl
- << "\tmaximum = " << _frag_stats[c]->Max() << endl;
-
- int count_sum, count_min, count_max;
- double rate_sum, rate_min, rate_max;
- double rate_avg;
- int sent_packets, sent_flits, accepted_packets, accepted_flits;
- int min_pos, max_pos;
- double time_delta = (double)(_time - _reset_time);
- _ComputeStats(_sent_packets[c], &count_sum, &count_min, &count_max, &min_pos, &max_pos);
- rate_sum = (double)count_sum / time_delta;
- rate_min = (double)count_min / time_delta;
- rate_max = (double)count_max / time_delta;
- rate_avg = rate_sum / (double)_nodes;
- sent_packets = count_sum;
- cout << "Injected packet rate average = " << rate_avg << endl
- << "\tminimum = " << rate_min
- << " (at node " << min_pos << ")" << endl
- << "\tmaximum = " << rate_max
- << " (at node " << max_pos << ")" << endl;
- _ComputeStats(_accepted_packets[c], &count_sum, &count_min, &count_max, &min_pos, &max_pos);
- rate_sum = (double)count_sum / time_delta;
- rate_min = (double)count_min / time_delta;
- rate_max = (double)count_max / time_delta;
- rate_avg = rate_sum / (double)_nodes;
- accepted_packets = count_sum;
- cout << "Accepted packet rate average = " << rate_avg << endl
- << "\tminimum = " << rate_min
- << " (at node " << min_pos << ")" << endl
- << "\tmaximum = " << rate_max
- << " (at node " << max_pos << ")" << endl;
- _ComputeStats(_sent_flits[c], &count_sum, &count_min, &count_max, &min_pos, &max_pos);
- rate_sum = (double)count_sum / time_delta;
- rate_min = (double)count_min / time_delta;
- rate_max = (double)count_max / time_delta;
- rate_avg = rate_sum / (double)_nodes;
- sent_flits = count_sum;
- cout << "Injected flit rate average = " << rate_avg << endl
- << "\tminimum = " << rate_min
- << " (at node " << min_pos << ")" << endl
- << "\tmaximum = " << rate_max
- << " (at node " << max_pos << ")" << endl;
- _ComputeStats(_accepted_flits[c], &count_sum, &count_min, &count_max, &min_pos, &max_pos);
- rate_sum = (double)count_sum / time_delta;
- rate_min = (double)count_min / time_delta;
- rate_max = (double)count_max / time_delta;
- rate_avg = rate_sum / (double)_nodes;
- accepted_flits = count_sum;
- cout << "Accepted flit rate average= " << rate_avg << endl
- << "\tminimum = " << rate_min
- << " (at node " << min_pos << ")" << endl
- << "\tmaximum = " << rate_max
- << " (at node " << max_pos << ")" << endl;
-
- cout << "Injected packet length average = " << (double)sent_flits / (double)sent_packets << endl
- << "Accepted packet length average = " << (double)accepted_flits / (double)accepted_packets << endl;
-
- cout << "Total in-flight flits = " << _total_in_flight_flits[c].size()
- << " (" << _measured_in_flight_flits[c].size() << " measured)"
- << endl;
-
-#ifdef TRACK_STALLS
- _ComputeStats(_buffer_busy_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- os << "Buffer busy stall rate = " << rate_avg << endl;
- _ComputeStats(_buffer_conflict_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- os << "Buffer conflict stall rate = " << rate_avg << endl;
- _ComputeStats(_buffer_full_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- os << "Buffer full stall rate = " << rate_avg << endl;
- _ComputeStats(_buffer_reserved_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- os << "Buffer reserved stall rate = " << rate_avg << endl;
- _ComputeStats(_crossbar_conflict_stalls[c], &count_sum);
- rate_sum = (double)count_sum / time_delta;
- rate_avg = rate_sum / (double)(_subnets*_routers);
- os << "Crossbar conflict stall rate = " << rate_avg << endl;
-#endif
-
- }
-}
-
-void TrafficManager::DisplayOverallStats( ostream & os ) const {
-
- os << "====== Overall Traffic Statistics ======" << endl;
- for ( int c = 0; c < _classes; ++c ) {
-
- if(_measure_stats[c] == 0) {
- continue;
- }
-
- os << "====== Traffic class " << c << " ======" << endl;
-
- os << "Packet latency average = " << _overall_avg_plat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tminimum = " << _overall_min_plat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tmaximum = " << _overall_max_plat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Network latency average = " << _overall_avg_nlat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tminimum = " << _overall_min_nlat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tmaximum = " << _overall_max_nlat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Flit latency average = " << _overall_avg_flat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tminimum = " << _overall_min_flat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tmaximum = " << _overall_max_flat[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Fragmentation average = " << _overall_avg_frag[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tminimum = " << _overall_min_frag[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tmaximum = " << _overall_max_frag[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Injected packet rate average = " << _overall_avg_sent_packets[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tminimum = " << _overall_min_sent_packets[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tmaximum = " << _overall_max_sent_packets[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Accepted packet rate average = " << _overall_avg_accepted_packets[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tminimum = " << _overall_min_accepted_packets[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tmaximum = " << _overall_max_accepted_packets[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Injected flit rate average = " << _overall_avg_sent[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tminimum = " << _overall_min_sent[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tmaximum = " << _overall_max_sent[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Accepted flit rate average = " << _overall_avg_accepted[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tminimum = " << _overall_min_accepted[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
- os << "\tmaximum = " << _overall_max_accepted[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Injected packet size average = " << _overall_avg_sent[c] / _overall_avg_sent_packets[c]
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Accepted packet size average = " << _overall_avg_accepted[c] / _overall_avg_accepted_packets[c]
- << " (" << _total_sims << " samples)" << endl;
-
- os << "Hops average = " << _overall_hop_stats[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-
-#ifdef TRACK_STALLS
- os << "Buffer busy stall rate = " << (double)_overall_buffer_busy_stalls[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl
- << "Buffer conflict stall rate = " << (double)_overall_buffer_conflict_stalls[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl
- << "Buffer full stall rate = " << (double)_overall_buffer_full_stalls[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl
- << "Buffer reserved stall rate = " << (double)_overall_buffer_reserved_stalls[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl
- << "Crossbar conflict stall rate = " << (double)_overall_crossbar_conflict_stalls[c] / (double)_total_sims
- << " (" << _total_sims << " samples)" << endl;
-#endif
-
- }
-
-}
-
-string TrafficManager::_OverallStatsCSV(int c) const
-{
- ostringstream os;
- os << _traffic[c]
- << ',' << _use_read_write[c]
- << ',' << _load[c]
- << ',' << _overall_min_plat[c] / (double)_total_sims
- << ',' << _overall_avg_plat[c] / (double)_total_sims
- << ',' << _overall_max_plat[c] / (double)_total_sims
- << ',' << _overall_min_nlat[c] / (double)_total_sims
- << ',' << _overall_avg_nlat[c] / (double)_total_sims
- << ',' << _overall_max_nlat[c] / (double)_total_sims
- << ',' << _overall_min_flat[c] / (double)_total_sims
- << ',' << _overall_avg_flat[c] / (double)_total_sims
- << ',' << _overall_max_flat[c] / (double)_total_sims
- << ',' << _overall_min_frag[c] / (double)_total_sims
- << ',' << _overall_avg_frag[c] / (double)_total_sims
- << ',' << _overall_max_frag[c] / (double)_total_sims
- << ',' << _overall_min_sent_packets[c] / (double)_total_sims
- << ',' << _overall_avg_sent_packets[c] / (double)_total_sims
- << ',' << _overall_max_sent_packets[c] / (double)_total_sims
- << ',' << _overall_min_accepted_packets[c] / (double)_total_sims
- << ',' << _overall_avg_accepted_packets[c] / (double)_total_sims
- << ',' << _overall_max_accepted_packets[c] / (double)_total_sims
- << ',' << _overall_min_sent[c] / (double)_total_sims
- << ',' << _overall_avg_sent[c] / (double)_total_sims
- << ',' << _overall_max_sent[c] / (double)_total_sims
- << ',' << _overall_min_accepted[c] / (double)_total_sims
- << ',' << _overall_avg_accepted[c] / (double)_total_sims
- << ',' << _overall_max_accepted[c] / (double)_total_sims
- << ',' << _overall_avg_sent[c] / _overall_avg_sent_packets[c]
- << ',' << _overall_avg_accepted[c] / _overall_avg_accepted_packets[c]
- << ',' << _overall_hop_stats[c] / (double)_total_sims;
-
-#ifdef TRACK_STALLS
- os << ',' << (double)_overall_buffer_busy_stalls[c] / (double)_total_sims
- << ',' << (double)_overall_buffer_conflict_stalls[c] / (double)_total_sims
- << ',' << (double)_overall_buffer_full_stalls[c] / (double)_total_sims
- << ',' << (double)_overall_buffer_reserved_stalls[c] / (double)_total_sims
- << ',' << (double)_overall_crossbar_conflict_stalls[c] / (double)_total_sims;
-#endif
-
- return os.str();
-}
-
-void TrafficManager::DisplayOverallStatsCSV(ostream & os) const {
- for(int c = 0; c < _classes; ++c) {
- os << "results:" << c << ',' << _OverallStatsCSV() << endl;
- }
-}
-
-//read the watchlist
-void TrafficManager::_LoadWatchList(const string & filename){
- ifstream watch_list;
- watch_list.open(filename.c_str());
-
- string line;
- if(watch_list.is_open()) {
- while(!watch_list.eof()) {
- getline(watch_list, line);
- if(line != "") {
- if(line[0] == 'p') {
- _packets_to_watch.insert(atoi(line.c_str()+1));
- } else {
- _flits_to_watch.insert(atoi(line.c_str()));
- }
- }
- }
-
- } else {
- Error("Unable to open flit watch file: " + filename);
- }
-}
-
-int TrafficManager::_GetNextPacketSize(int cl) const
-{
- assert(cl >= 0 && cl < _classes);
-
- vector<int> const & psize = _packet_size[cl];
- int sizes = psize.size();
-
- if(sizes == 1) {
- return psize[0];
- }
-
- vector<int> const & prate = _packet_size_rate[cl];
- int max_val = _packet_size_max_val[cl];
-
- int pct = RandomInt(max_val);
-
- for(int i = 0; i < (sizes - 1); ++i) {
- int const limit = prate[i];
- if(limit > pct) {
- return psize[i];
- } else {
- pct -= limit;
- }
- }
- assert(prate.back() > pct);
- return psize.back();
-}
-
-double TrafficManager::_GetAveragePacketSize(int cl) const
-{
- vector<int> const & psize = _packet_size[cl];
- int sizes = psize.size();
- if(sizes == 1) {
- return (double)psize[0];
- }
- vector<int> const & prate = _packet_size_rate[cl];
- int sum = 0;
- for(int i = 0; i < sizes; ++i) {
- sum += psize[i] * prate[i];
- }
- return (double)sum / (double)(_packet_size_max_val[cl] + 1);
-}
diff --git a/src/intersim2/.svn/pristine/8f/8fa65cdf95f29e2fd90afe3901d296d085ff768b.svn-base b/src/intersim2/.svn/pristine/8f/8fa65cdf95f29e2fd90afe3901d296d085ff768b.svn-base
deleted file mode 100644
index bc0c5ba..0000000
--- a/src/intersim2/.svn/pristine/8f/8fa65cdf95f29e2fd90afe3901d296d085ff768b.svn-base
+++ /dev/null
@@ -1,43 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _BOOKSIM_HPP_
-#define _BOOKSIM_HPP_
-
-#include <string>
-#include <cstdlib>
-#include <cstring>
-#include <climits>
-#include <cassert>
-#ifdef _WIN32_
-#pragma warning (disable: 4786)
-#include <ostream>
-#endif
-
-using namespace std;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/8f/8fca73abe4a7446a1a53687a6baca97dc056eabf.svn-base b/src/intersim2/.svn/pristine/8f/8fca73abe4a7446a1a53687a6baca97dc056eabf.svn-base
deleted file mode 100644
index b1a60ea..0000000
--- a/src/intersim2/.svn/pristine/8f/8fca73abe4a7446a1a53687a6baca97dc056eabf.svn-base
+++ /dev/null
@@ -1,34 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#define main rng_double_main
-#include "rng-double.c"
-
-double ranf_next( )
-{
- return ranf_arr_next( );
-}
diff --git a/src/intersim2/.svn/pristine/8f/8fd71b46841aae63fcfe44908c2a1827741661fb.svn-base b/src/intersim2/.svn/pristine/8f/8fd71b46841aae63fcfe44908c2a1827741661fb.svn-base
deleted file mode 100644
index a10b781..0000000
--- a/src/intersim2/.svn/pristine/8f/8fd71b46841aae63fcfe44908c2a1827741661fb.svn-base
+++ /dev/null
@@ -1,111 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// Arbiter: Base class for Matrix and Round Robin Arbiter
-//
-// ----------------------------------------------------------------------
-
-#include "arbiter.hpp"
-#include "roundrobin_arb.hpp"
-#include "matrix_arb.hpp"
-#include "tree_arb.hpp"
-
-#include <limits>
-#include <cassert>
-
-using namespace std ;
-
-Arbiter::Arbiter( Module *parent, const string &name, int size )
- : Module( parent, name ),
- _size(size), _selected(-1), _highest_pri(numeric_limits<int>::min()),
- _best_input(-1), _num_reqs(0)
-{
- _request.resize(size);
- for ( int i = 0 ; i < size ; i++ )
- _request[i].valid = false ;
-}
-
-void Arbiter::AddRequest( int input, int id, int pri )
-{
- assert( 0 <= input && input < _size ) ;
- assert( !_request[input].valid );
-
- _num_reqs++ ;
- _request[input].valid = true ;
- _request[input].id = id ;
- _request[input].pri = pri ;
-}
-
-int Arbiter::Arbitrate( int* id, int* pri )
-{
- if ( _selected != -1 ) {
- if ( id )
- *id = _request[_selected].id ;
- if ( pri )
- *pri = _request[_selected].pri ;
- }
-
- assert((_selected >= 0) || (_num_reqs == 0));
-
- return _selected ;
-}
-
-void Arbiter::Clear()
-{
- if(_num_reqs > 0) {
-
- // clear the request vector
- for ( int i = 0; i < _size ; i++ )
- _request[i].valid = false ;
- _num_reqs = 0 ;
- _selected = -1;
- }
-}
-
-Arbiter *Arbiter::NewArbiter( Module *parent, const string& name,
- const string &arb_type, int size)
-{
- Arbiter *a = NULL;
- if(arb_type == "round_robin") {
- a = new RoundRobinArbiter( parent, name, size );
- } else if(arb_type == "matrix") {
- a = new MatrixArbiter( parent, name, size );
- } else if(arb_type.substr(0, 5) == "tree(") {
- size_t left = 4;
- size_t middle = arb_type.find_first_of(',');
- assert(middle != string::npos);
- size_t right = arb_type.find_last_of(')');
- assert(right != string::npos);
- string groups_str = arb_type.substr(left+1, middle-left-1);
- int groups = atoi(groups_str.c_str());
- string sub_arb_type = arb_type.substr(middle+1, right-middle-1);
- a = new TreeArbiter( parent, name, size, groups, sub_arb_type );
- } else assert(false);
- return a;
-}
diff --git a/src/intersim2/.svn/pristine/90/90e277f393024f15eeb6e024bd34ac972b818aaf.svn-base b/src/intersim2/.svn/pristine/90/90e277f393024f15eeb6e024bd34ac972b818aaf.svn-base
deleted file mode 100644
index 0fda1c1..0000000
--- a/src/intersim2/.svn/pristine/90/90e277f393024f15eeb6e024bd34ac972b818aaf.svn-base
+++ /dev/null
@@ -1,210 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- Neither the name of the Stanford University nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <iostream>
-
-#include "maxsize.hpp"
-
-// shortest augmenting path:
-//
-// for all unmatched left nodes,
-// push node onto work stack
-// end
-//
-// for all j,
-// from[j] = undefined
-// end
-//
-// do,
-//
-// while( !stack.empty ),
-//
-// nl = stack.pop
-// for each edge (nl,j),
-// if ( ( lmatch[nl] != j ) && ( from[j] == undefined ) ),
-// if ( rmatch[j] == undefined ),
-// stop // augmenting path found
-// else
-// from[j] = nl
-// newstack.push( rmatch[j] )
-// end
-// end
-// end
-// end
-//
-// stack = newstack
-// end
-//
-
-//#define DEBUG_MAXSIZE
-//#define PRINT_MATCHING
-
-MaxSizeMatch::MaxSizeMatch( Module *parent, const string& name,
- int inputs, int outputs ) :
- DenseAllocator( parent, name, inputs, outputs )
-{
- _from.resize(outputs);
- _s = new int [inputs];
- _ns = new int [inputs];
- _prio = 0;
-}
-
-MaxSizeMatch::~MaxSizeMatch( )
-{
- delete [] _s;
- delete [] _ns;
-}
-
-void MaxSizeMatch::Allocate( )
-{
-
- // augment as many times as possible
- // (this is an O(N^3) maximum-size matching algorithm)
- while( _ShortestAugmenting( ) );
-
- // next time, start at next input to ensure fairness
- _prio = (_prio + 1) % _inputs;
-}
-
-
-bool MaxSizeMatch::_ShortestAugmenting( )
-{
- int i, j, jn;
- int slen, nslen;
-
- // start with empty stack
- slen = 0;
-
- // push all unassigned inputs to the stack
- for ( i = 0; i < _inputs; ++i ) {
- j = (i + _prio) % _inputs;
- if ( _inmatch[j] == -1 ) { // start with unmatched left nodes
- _s[slen++] = j;
- }
- }
-
- _from.assign(_inputs, -1);
-
- for ( int iter = 0; iter < _inputs; iter++ ) {
- nslen = 0;
-
- for ( int e = 0; e < slen; ++e ) {
- i = _s[e];
-
- for ( j = 0; j < _outputs; ++j ) {
- if ( ( _request[i][j].label != -1 ) && // edge (i,j) exists
- ( _inmatch[i] != j ) && // (i,j) is not contained in the current matching
- ( _from[j] == -1 ) ) { // no shorter path to j exists
-
- _from[j] = i; // how did we get to j?
-
-#ifdef DEBUG_MAXSIZE
- cout << " got to " << j << " from " << i << endl;
-#endif
- if ( _outmatch[j] == -1 ) { // j is unmatched -- augmenting path found
- goto found_augmenting;
- } else { // j is matched
- _ns[nslen] = _outmatch[j]; // add the destination of this edge to the leaf nodes
- nslen++;
-
-#ifdef DEBUG_MAXSIZE
- cout << " adding " << _outmatch[j] << endl;
-#endif
- }
- }
- }
- }
-
- // no augmenting path found yet, swap stacks
- int * t = _s;
- _s = _ns;
- _ns = t;
- slen = nslen;
- }
-
- return false; // no augmenting paths
-
- found_augmenting:
-
- // the augmenting path ends at node j on the right
-
-#ifdef DEBUG_MAXSIZE
- cout << "Found path: " << j << "c <- ";
-#endif
-
- i = _from[j];
- _outmatch[j] = i;
-
-#ifdef DEBUG_MAXSIZE
- cout << i;
-#endif
-
- while ( _inmatch[i] != -1 ) { // loop until the end of the path
- jn = _inmatch[i]; // remove previous edge (i,jn) and add (i,j)
- _inmatch[i] = j;
-
-#ifdef DEBUG_MAXSIZE
- cout << " <- " << j << "c <- ";
-#endif
-
- j = jn; // add edge from (jn,in)
- i = _from[j];
- _outmatch[j] = i;
-
-#ifdef DEBUG_MAXSIZE
- cout << i;
-#endif
- }
-
-#ifdef DEBUG_MAXSIZE
- cout << endl;
-#endif
-
- _inmatch[i] = j;
-
-#ifdef PRINT_MATCHING
- cout << "left matching: ";
-
- for ( i = 0; i < _inputs; i++ ) {
- cout << _inmatch[i] << " ";
- }
- cout << endl;
-
- cout << "right matching: ";
- for ( i = 0; i < _outputs; i++ ) {
- cout << _outmatch[i] << " ";
- }
- cout << endl;
-#endif
-
- return true;
-}
diff --git a/src/intersim2/.svn/pristine/90/90f780ee11bbe517547a3648019db3592a5e7675.svn-base b/src/intersim2/.svn/pristine/90/90f780ee11bbe517547a3648019db3592a5e7675.svn-base
deleted file mode 100644
index 8cdb445..0000000
--- a/src/intersim2/.svn/pristine/90/90f780ee11bbe517547a3648019db3592a5e7675.svn-base
+++ /dev/null
@@ -1,88 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*module.cpp
- *
- *The basic class that is extended by all other components of the network
- *Provides the basic hierarchy structure and basic fuctions
- *
- */
-
-#include <iostream>
-#include <cstdlib>
-
-#include "booksim.hpp"
-#include "module.hpp"
-
-Module::Module( Module *parent, const string& name )
-{
- _name = name;
-
- if ( parent ) {
- parent->_AddChild( this );
- _fullname = parent->_fullname + "/" + name;
- } else {
- _fullname = name;
- }
-}
-
-void Module::_AddChild( Module *child )
-{
- _children.push_back( child );
-}
-
-void Module::DisplayHierarchy( int level, ostream & os ) const
-{
- vector<Module *>::const_iterator mod_iter;
-
- for ( int l = 0; l < level; l++ ) {
- os << " ";
- }
-
- os << _name << endl;
-
- for ( mod_iter = _children.begin( );
- mod_iter != _children.end( ); mod_iter++ ) {
- (*mod_iter)->DisplayHierarchy( level + 1 );
- }
-}
-
-void Module::Error( const string& msg ) const
-{
- cout << "Error in " << _fullname << " : " << msg << endl;
- exit( -1 );
-}
-
-void Module::Debug( const string& msg ) const
-{
- cout << "Debug (" << _fullname << ") : " << msg << endl;
-}
-
-void Module::Display( ostream & os ) const
-{
- os << "Display method not implemented for " << _fullname << endl;
-}
diff --git a/src/intersim2/.svn/pristine/94/941911d54bdc048828d97698138c156dd9becc6c.svn-base b/src/intersim2/.svn/pristine/94/941911d54bdc048828d97698138c156dd9becc6c.svn-base
deleted file mode 100644
index 715878a..0000000
--- a/src/intersim2/.svn/pristine/94/941911d54bdc048828d97698138c156dd9becc6c.svn-base
+++ /dev/null
@@ -1,69 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-////////////////////////////////////////////////////////////////////////
-//
-// QTree: A Quad-Tree Indirect Network.
-//
-//
-////////////////////////////////////////////////////////////////////////
-//
-// RCS Information:
-// $Author: jbalfour $
-// $Date: 2007/05/17 17:14:07 $
-// $Id$
-//
-////////////////////////////////////////////////////////////////////////
-
-#ifndef _QTREE_HPP_
-#define _QTREE_HPP_
-#include <cassert>
-#include "network.hpp"
-
-class QTree : public Network {
-
- int _k;
- int _n;
-
- void _ComputeSize( const Configuration& config );
- void _BuildNet( const Configuration& config );
-
- int _RouterIndex( int height, int pos );
- int _InputIndex( int height, int pos, int port );
- int _OutputIndex( int height, int pos, int port );
-
-public:
-
- QTree( const Configuration& config, const string & name );
- static void RegisterRoutingFunctions() ;
-
- static int HeightFromID( int id );
- static int PosFromID( int id );
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/95/9532d33b08220b7f51a001451336e589a0a92e97.svn-base b/src/intersim2/.svn/pristine/95/9532d33b08220b7f51a001451336e589a0a92e97.svn-base
deleted file mode 100644
index 2afa56a..0000000
--- a/src/intersim2/.svn/pristine/95/9532d33b08220b7f51a001451336e589a0a92e97.svn-base
+++ /dev/null
@@ -1,69 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _ANYNET_HPP_
-#define _ANYNET_HPP_
-
-#include "network.hpp"
-#include "routefunc.hpp"
-#include <cassert>
-#include <string>
-#include <map>
-#include <list>
-
-class AnyNet : public Network {
-
- string file_name;
- //associtation between nodes and routers
- map<int, int > node_list;
- //[link type][src router][dest router]=(port, latency)
- vector<map<int, map<int, pair<int,int> > > > router_list;
- //stores minimal routing information from every router to every node
- //[router][dest_node]=port
- vector<map<int, int> > routing_table;
-
- void _ComputeSize( const Configuration &config );
- void _BuildNet( const Configuration &config );
- void readFile();
- void buildRoutingTable();
- void route(int r_start);
-
-public:
- AnyNet( const Configuration &config, const string & name );
- ~AnyNet();
-
- int GetN( ) const{ return -1;}
- int GetK( ) const{ return -1;}
-
- static void RegisterRoutingFunctions();
- double Capacity( ) const {return -1;}
- void InsertRandomFaults( const Configuration &config ){}
-};
-
-void min_anynet( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-#endif
diff --git a/src/intersim2/.svn/pristine/96/968162a2f3ef193e7baffadd696d73fccaf5d69c.svn-base b/src/intersim2/.svn/pristine/96/968162a2f3ef193e7baffadd696d73fccaf5d69c.svn-base
deleted file mode 100644
index 70c9052..0000000
--- a/src/intersim2/.svn/pristine/96/968162a2f3ef193e7baffadd696d73fccaf5d69c.svn-base
+++ /dev/null
@@ -1,160 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <cassert>
-
-#include "prio_arb.hpp"
-
-
-PriorityArbiter::PriorityArbiter( const Configuration &config,
- Module *parent, const string& name,
- int inputs )
-: Module( parent, name ), _rr_ptr(0), _inputs( inputs )
-{
-
-}
-
-void PriorityArbiter::Clear( )
-{
- _requests.clear( );
-}
-
-void PriorityArbiter::AddRequest( int in, int label, int pri )
-{
- sRequest r;
- list<sRequest>::iterator insert_point;
-
- r.in = in; r.label = label; r.pri = pri;
-
- insert_point = _requests.begin( );
- while( ( insert_point != _requests.end( ) ) &&
- ( insert_point->in < in ) ) {
- insert_point++;
- }
-
- bool del = false;
- bool add = true;
-
- // For consistant behavior, delete the existing request
- // if it is for the same input and has a higher
- // priority
-
- if ( ( insert_point != _requests.end( ) ) &&
- ( insert_point->in == in ) ) {
- if ( insert_point->pri < pri ) {
- del = true;
- } else {
- add = false;
- }
- }
-
- if ( add ) {
- _requests.insert( insert_point, r );
- }
-
- if ( del ) {
- _requests.erase( insert_point );
- }
-}
-
-void PriorityArbiter::RemoveRequest( int in, int label )
-{
- list<sRequest>::iterator erase_point;
-
- erase_point = _requests.begin( );
- while( ( erase_point != _requests.end( ) ) &&
- ( erase_point->in < in ) ) {
- erase_point++;
- }
-
- assert( erase_point != _requests.end( ) );
- _requests.erase( erase_point );
-}
-
-int PriorityArbiter::Match( ) const
-{
- return _match;
-}
-
-void PriorityArbiter::Arbitrate( )
-{
- list<sRequest>::iterator p;
-
- int max_index, max_pri;
- bool wrapped;
-
- //MERGENOTE
- //booksim does not have this if statement
- //as far as I can tell they are identical in function
- if ( _requests.begin( ) != _requests.end( ) ) {
- // A round-robin arbiter between input requests
- p = _requests.begin( );
- while( ( p != _requests.end( ) ) &&
- ( p->in < _rr_ptr ) ) {
- p++;
- }
-
- max_index = -1;
- max_pri = 0;
-
- wrapped = false;
- while( (!wrapped) || ( p->in < _rr_ptr ) ) {
- if ( p == _requests.end( ) ) {
- if ( wrapped ) { break; }
- // p is valid here because empty lists
- // are skipped (above)
- p = _requests.begin( );
- wrapped = true;
- }
-
- // check if request is the highest priority so far
- if ( ( p->pri > max_pri ) || ( max_index == -1 ) ) {
- max_pri = p->pri;
- max_index = p->in;
- }
-
- p++;
- }
-
- _match = max_index; // -1 for no match
- if ( _match != -1 ) {
- _rr_ptr = ( _match + 1 ) % _inputs;
- }
-
- } else {
- _match = -1;
- }
-}
-
-//MERGENOTE
-//added update function to priorityarbiter
-
-void PriorityArbiter::Update( )
-{
- _rr_ptr = ( _rr_ptr + 1 ) % _inputs;
-}
diff --git a/src/intersim2/.svn/pristine/97/9709aa53e9b91e3103a5c627cfd4c83d5857c451.svn-base b/src/intersim2/.svn/pristine/97/9709aa53e9b91e3103a5c627cfd4c83d5857c451.svn-base
deleted file mode 100644
index e262f47..0000000
--- a/src/intersim2/.svn/pristine/97/9709aa53e9b91e3103a5c627cfd4c83d5857c451.svn-base
+++ /dev/null
@@ -1,187 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _EVENT_ROUTER_HPP_
-#define _EVENT_ROUTER_HPP_
-
-#include <string>
-#include <queue>
-#include <vector>
-
-#include "module.hpp"
-#include "router.hpp"
-#include "buffer.hpp"
-#include "vc.hpp"
-#include "prio_arb.hpp"
-#include "routefunc.hpp"
-#include "outputset.hpp"
-#include "pipefifo.hpp"
-
-class EventNextVCState : public Module {
-public:
- enum eNextVCState { idle, busy, tail_pending };
-
- struct tWaiting {
- int input;
- int vc;
- int id;
- int pres;
- bool watch;
- };
-
-private:
- int _buf_size;
- int _vcs;
-
- vector<int> _credits;
- vector<int> _presence;
- vector<int> _input;
- vector<int> _inputVC;
-
- vector<list<tWaiting *> > _waiting;
-
- vector<eNextVCState> _state;
-
-public:
-
- EventNextVCState( const Configuration& config,
- Module *parent, const string& name );
-
- eNextVCState GetState( int vc ) const;
- int GetPresence( int vc ) const;
- int GetCredits( int vc ) const;
- int GetInput( int vc ) const;
- int GetInputVC( int vc ) const;
-
- bool IsWaiting( int vc ) const;
- bool IsInputWaiting( int vc, int w_input, int w_vc ) const;
-
- void PushWaiting( int vc, tWaiting *w );
- void IncrWaiting( int vc, int w_input, int w_vc );
- tWaiting *PopWaiting( int vc );
-
- void SetState( int vc, eNextVCState state );
- void SetCredits( int vc, int value );
- void SetPresence( int vc, int value );
- void SetInput( int vc, int input );
- void SetInputVC( int vc, int in_vc );
-};
-
-class EventRouter : public Router {
- int _vcs;
-
- int _vct;
-
- vector<Buffer *> _buf;
- vector<vector<bool> > _active;
-
- tRoutingFunction _rf;
-
- vector<EventNextVCState *> _output_state;
-
- PipelineFIFO<Flit> *_crossbar_pipe;
- PipelineFIFO<Credit> *_credit_pipe;
-
- vector<queue<Flit *> > _input_buffer;
- vector<queue<Flit *> > _output_buffer;
-
- vector<queue<Credit *> > _in_cred_buffer;
- vector<queue<Credit *> > _out_cred_buffer;
-
- struct tArrivalEvent {
- int input;
- int output;
- int src_vc;
- int dst_vc;
- bool head;
- bool tail;
-
- int id; // debug
- bool watch; // debug
- };
-
- PipelineFIFO<tArrivalEvent> *_arrival_pipe;
- vector<queue<tArrivalEvent *> > _arrival_queue;
- vector<PriorityArbiter*> _arrival_arbiter;
-
- struct tTransportEvent {
- int input;
- int src_vc;
- int dst_vc;
-
- int id; // debug
- bool watch; // debug
- };
-
- vector<queue<tTransportEvent *> > _transport_queue;
- vector<PriorityArbiter*> _transport_arbiter;
-
- vector<bool> _transport_free;
- vector<int> _transport_match;
-
- void _ReceiveFlits( );
- void _ReceiveCredits( );
-
- void _IncomingFlits( );
- void _ArrivalRequests( int input );
- void _ArrivalArb( int output );
- void _SendTransport( int input, int output, tArrivalEvent *aevt );
- void _ProcessWaiting( int output, int out_vc );
- void _TransportRequests( int output );
- void _TransportArb( int input );
- void _OutputQueuing( );
-
- void _SendFlits( );
- void _SendCredits( );
-
- virtual void _InternalStep( );
-
-public:
- EventRouter( const Configuration& config,
- Module *parent, const string & name, int id,
- int inputs, int outputs );
- virtual ~EventRouter( );
-
- virtual void ReadInputs( );
- virtual void WriteOutputs( );
-
- virtual int GetUsedCredit(int o) const {return 0;}
- virtual int GetBufferOccupancy(int i) const {return 0;}
-
-#ifdef TRACK_BUFFERS
- virtual int GetUsedCreditForClass(int output, int cl) const {return 0;}
- virtual int GetBufferOccupancyForClass(int input, int cl) const {return 0;}
-#endif
-
- virtual vector<int> UsedCredits() const { return vector<int>(); }
- virtual vector<int> FreeCredits() const { return vector<int>(); }
- virtual vector<int> MaxCredits() const { return vector<int>(); }
-
- void Display( ostream & os = cout ) const;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/9a/9a6a33f2fd931773aa82485ef360d84c227abb12.svn-base b/src/intersim2/.svn/pristine/9a/9a6a33f2fd931773aa82485ef360d84c227abb12.svn-base
deleted file mode 100644
index 98d07bb..0000000
--- a/src/intersim2/.svn/pristine/9a/9a6a33f2fd931773aa82485ef360d84c227abb12.svn-base
+++ /dev/null
@@ -1,76 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-////////////////////////////////////////////////////////////////////////
-//
-// FatTree
-//
-////////////////////////////////////////////////////////////////////////
-//
-// RCS Information:
-// $Author: jbalfour $
-// $Date: 2007/06/26 22:49:23 $
-// $Id$
-//
-////////////////////////////////////////////////////////////////////////
-
-#ifndef _FatTree_HPP_
-#define _FatTree_HPP_
-
-#include "network.hpp"
-
-class FatTree : public Network {
-
- int _k;
- int _n;
-
-
- void _ComputeSize( const Configuration& config );
- void _BuildNet( const Configuration& config );
-
- Router*& _Router( int depth, int pos );
-
- int _mapSize;
- int* _inputChannelMap;
- int* _outputChannelMap;
- int* _latencyMap;
-
-
-
-public:
-
- FatTree( const Configuration& config ,const string & name );
- static void RegisterRoutingFunctions() ;
-
- //
- // Methods to Assit Routing Functions
- //
- static int PreferedPort( const Router* r, int index );
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/9a/9a75723858a7c299341d4e68fbb1581f9865b898.svn-base b/src/intersim2/.svn/pristine/9a/9a75723858a7c299341d4e68fbb1581f9865b898.svn-base
deleted file mode 100644
index c0bdc89..0000000
--- a/src/intersim2/.svn/pristine/9a/9a75723858a7c299341d4e68fbb1581f9865b898.svn-base
+++ /dev/null
@@ -1,47 +0,0 @@
-// $Id$
-
-// Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// Redistributions of source code must retain the above copyright notice, this
-// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-//concentrated mesh configuration file running batch mode
-//xr, yr, x, y, are use to indicate how the concnetration is formed.
-
-topology = cmesh;
-
-k = 4;
-n = 2;
-c = 4;
-xr = 2;
-yr = 2;
-
-x = 4;
-y = 4;
-
-routing_function = dor_no_express;
-
-traffic = bitcomp;
-
-use_read_write = 0;
-
-batch_size = 2000;
diff --git a/src/intersim2/.svn/pristine/9a/9aed09bfc8ce0fffa6872c93917412c0577120c2.svn-base b/src/intersim2/.svn/pristine/9a/9aed09bfc8ce0fffa6872c93917412c0577120c2.svn-base
deleted file mode 100644
index 1d446a5..0000000
--- a/src/intersim2/.svn/pristine/9a/9aed09bfc8ce0fffa6872c93917412c0577120c2.svn-base
+++ /dev/null
@@ -1,322 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _TRAFFICMANAGER_HPP_
-#define _TRAFFICMANAGER_HPP_
-
-#include <list>
-#include <map>
-#include <set>
-#include <cassert>
-
-#include "module.hpp"
-#include "config_utils.hpp"
-#include "network.hpp"
-#include "flit.hpp"
-#include "buffer_state.hpp"
-#include "stats.hpp"
-#include "traffic.hpp"
-#include "routefunc.hpp"
-#include "outputset.hpp"
-#include "injection.hpp"
-
-//register the requests to a node
-class PacketReplyInfo;
-
-class TrafficManager : public Module {
-
-private:
-
- vector<vector<int> > _packet_size;
- vector<vector<int> > _packet_size_rate;
- vector<int> _packet_size_max_val;
-
-protected:
- int _nodes;
- int _routers;
- int _vcs;
-
- vector<Network *> _net;
- vector<vector<Router *> > _router;
-
- // ============ Traffic ============
-
- int _classes;
-
- vector<double> _load;
-
- vector<int> _use_read_write;
- vector<double> _write_fraction;
-
- vector<int> _read_request_size;
- vector<int> _read_reply_size;
- vector<int> _write_request_size;
- vector<int> _write_reply_size;
-
- vector<string> _traffic;
-
- vector<int> _class_priority;
-
- vector<vector<int> > _last_class;
-
- vector<TrafficPattern *> _traffic_pattern;
- vector<InjectionProcess *> _injection_process;
-
- // ============ Message priorities ============
-
- enum ePriority { class_based, age_based, network_age_based, local_age_based, queue_length_based, hop_count_based, sequence_based, none };
-
- ePriority _pri_type;
-
- // ============ Injection VC states ============
-
- vector<vector<BufferState *> > _buf_states;
-#ifdef TRACK_FLOWS
- vector<vector<vector<int> > > _outstanding_credits;
- vector<vector<vector<queue<int> > > > _outstanding_classes;
-#endif
- vector<vector<vector<int> > > _last_vc;
-
- // ============ Routing ============
-
- tRoutingFunction _rf;
- bool _lookahead_routing;
- bool _noq;
-
- // ============ Injection queues ============
-
- vector<vector<int> > _qtime;
- vector<vector<bool> > _qdrained;
- vector<vector<list<Flit *> > > _partial_packets;
-
- vector<map<int, Flit *> > _total_in_flight_flits;
- vector<map<int, Flit *> > _measured_in_flight_flits;
- vector<map<int, Flit *> > _retired_packets;
- bool _empty_network;
-
- bool _hold_switch_for_packet;
-
- // ============ physical sub-networks ==========
-
- int _subnets;
-
- vector<int> _subnet;
-
- // ============ deadlock ==========
-
- int _deadlock_timer;
- int _deadlock_warn_timeout;
-
- // ============ request & replies ==========================
-
- vector<int> _packet_seq_no;
- vector<list<PacketReplyInfo*> > _repliesPending;
- vector<int> _requestsOutstanding;
-
- // ============ Statistics ============
-
- vector<Stats *> _plat_stats;
- vector<double> _overall_min_plat;
- vector<double> _overall_avg_plat;
- vector<double> _overall_max_plat;
-
- vector<Stats *> _nlat_stats;
- vector<double> _overall_min_nlat;
- vector<double> _overall_avg_nlat;
- vector<double> _overall_max_nlat;
-
- vector<Stats *> _flat_stats;
- vector<double> _overall_min_flat;
- vector<double> _overall_avg_flat;
- vector<double> _overall_max_flat;
-
- vector<Stats *> _frag_stats;
- vector<double> _overall_min_frag;
- vector<double> _overall_avg_frag;
- vector<double> _overall_max_frag;
-
- vector<vector<Stats *> > _pair_plat;
- vector<vector<Stats *> > _pair_nlat;
- vector<vector<Stats *> > _pair_flat;
-
- vector<Stats *> _hop_stats;
- vector<double> _overall_hop_stats;
-
- vector<vector<int> > _sent_packets;
- vector<double> _overall_min_sent_packets;
- vector<double> _overall_avg_sent_packets;
- vector<double> _overall_max_sent_packets;
- vector<vector<int> > _accepted_packets;
- vector<double> _overall_min_accepted_packets;
- vector<double> _overall_avg_accepted_packets;
- vector<double> _overall_max_accepted_packets;
- vector<vector<int> > _sent_flits;
- vector<double> _overall_min_sent;
- vector<double> _overall_avg_sent;
- vector<double> _overall_max_sent;
- vector<vector<int> > _accepted_flits;
- vector<double> _overall_min_accepted;
- vector<double> _overall_avg_accepted;
- vector<double> _overall_max_accepted;
-
-#ifdef TRACK_STALLS
- vector<vector<int> > _buffer_busy_stalls;
- vector<vector<int> > _buffer_conflict_stalls;
- vector<vector<int> > _buffer_full_stalls;
- vector<vector<int> > _buffer_reserved_stalls;
- vector<vector<int> > _crossbar_conflict_stalls;
- vector<double> _overall_buffer_busy_stalls;
- vector<double> _overall_buffer_conflict_stalls;
- vector<double> _overall_buffer_full_stalls;
- vector<double> _overall_buffer_reserved_stalls;
- vector<double> _overall_crossbar_conflict_stalls;
-#endif
-
- vector<int> _slowest_packet;
- vector<int> _slowest_flit;
-
- map<string, Stats *> _stats;
-
- // ============ Simulation parameters ============
-
- enum eSimState { warming_up, running, draining, done };
- eSimState _sim_state;
-
- bool _measure_latency;
-
- int _reset_time;
- int _drain_time;
-
- int _total_sims;
- int _sample_period;
- int _max_samples;
- int _warmup_periods;
-
- int _include_queuing;
-
- vector<int> _measure_stats;
- bool _pair_stats;
-
- vector<double> _latency_thres;
-
- vector<double> _stopping_threshold;
- vector<double> _acc_stopping_threshold;
-
- vector<double> _warmup_threshold;
- vector<double> _acc_warmup_threshold;
-
- int _cur_id;
- int _cur_pid;
- int _time;
-
- set<int> _flits_to_watch;
- set<int> _packets_to_watch;
-
- bool _print_csv_results;
-
- //flits to watch
- ostream * _stats_out;
-
-#ifdef TRACK_FLOWS
- vector<vector<int> > _injected_flits;
- vector<vector<int> > _ejected_flits;
- ostream * _injected_flits_out;
- ostream * _received_flits_out;
- ostream * _stored_flits_out;
- ostream * _sent_flits_out;
- ostream * _outstanding_credits_out;
- ostream * _ejected_flits_out;
- ostream * _active_packets_out;
-#endif
-
-#ifdef TRACK_CREDITS
- ostream * _used_credits_out;
- ostream * _free_credits_out;
- ostream * _max_credits_out;
-#endif
-
- // ============ Internal methods ============
-protected:
-
- virtual void _RetireFlit( Flit *f, int dest );
-
- void _Inject();
- void _Step( );
-
- bool _PacketsOutstanding( ) const;
-
- virtual int _IssuePacket( int source, int cl );
- void _GeneratePacket( int source, int size, int cl, int time );
-
- virtual void _ClearStats( );
-
- void _ComputeStats( const vector<int> & stats, int *sum, int *min = NULL, int *max = NULL, int *min_pos = NULL, int *max_pos = NULL ) const;
-
- virtual bool _SingleSim( );
-
- void _DisplayRemaining( ostream & os = cout ) const;
-
- void _LoadWatchList(const string & filename);
-
- virtual void _UpdateOverallStats();
-
- virtual string _OverallStatsCSV(int c = 0) const;
-
- int _GetNextPacketSize(int cl) const;
- double _GetAveragePacketSize(int cl) const;
-
-public:
-
- static TrafficManager * New(Configuration const & config,
- vector<Network *> const & net);
-
- TrafficManager( const Configuration &config, const vector<Network *> & net );
- virtual ~TrafficManager( );
-
- bool Run( );
-
- virtual void WriteStats( ostream & os = cout ) const ;
- virtual void UpdateStats( ) ;
- virtual void DisplayStats( ostream & os = cout ) const ;
- virtual void DisplayOverallStats( ostream & os = cout ) const ;
- virtual void DisplayOverallStatsCSV( ostream & os = cout ) const ;
-
- inline int getTime() { return _time;}
- Stats * getStats(const string & name) { return _stats[name]; }
-
-};
-
-template<class T>
-ostream & operator<<(ostream & os, const vector<T> & v) {
- for(size_t i = 0; i < v.size() - 1; ++i) {
- os << v[i] << ",";
- }
- os << v[v.size()-1];
- return os;
-}
-
-#endif
diff --git a/src/intersim2/.svn/pristine/9b/9b149c35e1f088a947ef877a58c79300dd5b074e.svn-base b/src/intersim2/.svn/pristine/9b/9b149c35e1f088a947ef877a58c79300dd5b074e.svn-base
deleted file mode 100644
index 8409322..0000000
--- a/src/intersim2/.svn/pristine/9b/9b149c35e1f088a947ef877a58c79300dd5b074e.svn-base
+++ /dev/null
@@ -1,103 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// SeparableInputFirstAllocator: Separable Input-First Allocator
-//
-// ----------------------------------------------------------------------
-
-#include "separable_input_first.hpp"
-
-#include "booksim.hpp"
-#include "arbiter.hpp"
-
-#include <vector>
-#include <iostream>
-#include <cstring>
-
-SeparableInputFirstAllocator::
-SeparableInputFirstAllocator( Module* parent, const string& name, int inputs,
- int outputs, const string& arb_type )
- : SeparableAllocator( parent, name, inputs, outputs, arb_type )
-{}
-
-void SeparableInputFirstAllocator::Allocate() {
-
- set<int>::const_iterator port_iter = _in_occ.begin();
- while(port_iter != _in_occ.end()) {
-
- const int & input = *port_iter;
-
- // add requests to the input arbiter
-
- map<int, sRequest>::const_iterator req_iter = _in_req[input].begin();
- while(req_iter != _in_req[input].end()) {
-
- const sRequest & req = req_iter->second;
-
- _input_arb[input]->AddRequest(req.port, req.label, req.in_pri);
-
- ++req_iter;
- }
-
- // Execute the input arbiters and propagate the grants to the
- // output arbiters.
-
- int label = -1;
- const int output = _input_arb[input]->Arbitrate(&label, NULL);
- assert(output > -1);
-
- const sRequest & req = _out_req[output][input];
- assert((req.port == input) && (req.label == label));
-
- _output_arb[output]->AddRequest(req.port, req.label, req.out_pri);
-
- ++port_iter;
- }
-
- port_iter = _out_occ.begin();
- while(port_iter != _out_occ.end()) {
-
- const int & output = *port_iter;
-
- // Execute the output arbiters.
-
- const int input = _output_arb[output]->Arbitrate(NULL, NULL);
-
- if(input > -1) {
- assert((_inmatch[input] == -1) && (_outmatch[output] == -1));
-
- _inmatch[input] = output ;
- _outmatch[output] = input ;
- _input_arb[input]->UpdateState() ;
- _output_arb[output]->UpdateState() ;
- }
-
- ++port_iter;
- }
-}
diff --git a/src/intersim2/.svn/pristine/9e/9ee6cbb1a61d3f7c2992c673ad86d0ed1d245ef8.svn-base b/src/intersim2/.svn/pristine/9e/9ee6cbb1a61d3f7c2992c673ad86d0ed1d245ef8.svn-base
deleted file mode 100644
index ec440d8..0000000
--- a/src/intersim2/.svn/pristine/9e/9ee6cbb1a61d3f7c2992c673ad86d0ed1d245ef8.svn-base
+++ /dev/null
@@ -1,116 +0,0 @@
-// $Id$
-
-// Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// Redistributions of source code must retain the above copyright notice, this
-// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-//A flattened butterfly configurate file with many tweaks from the
-//default settings.
-
-
-// Flow control
-// Total number of VCs must match the above assignments
-num_vcs = 8;
-vc_buf_size = 4;
-
-wait_for_tail_credit = 0;
-
-//
-// Router architectureq
-//
-vc_allocator = islip;
-sw_allocator = islip;
-alloc_iters = 1;
-
-credit_delay = 2;
-routing_delay = 0;
-vc_alloc_delay = 1;
-sw_alloc_delay = 1;
-st_final_delay = 1;
-
-input_speedup = 1;
-output_speedup = 1;
-internal_speedup = 1.0;
-
-//
-// Traffic
-//
-
-warmup_periods = 3;
-
-sample_period = 1000;
-
-sim_count = 1;
-
-traffic = uniform;
-
-
-// Flatfly
-//
-// #node = k^(n+1)
-//
-// x, y, specifies the arrangement of routers in x and y dim
-// xr, yr specifiies the arayment of clients in a router
-//
-topology = flatfly;
-subnets = 1;
-
-c = 4;
-k = 4;
-n = 2;
-
-x = 4;
-y = 4;
-xr = 2;
-yr = 2;
-
-//
-// Routing
-//
-
-routing_function = ran_min;
-
-//1: batch mode, 0: injection mode
-use_read_write = 0;
-
-//for injection mode
-packet_size = 1;
-injection_rate = 0.1;
-
-//for batch mode
-read_request_size=1;
-write_request_size=1;
-read_reply_size=1;
-write_reply_size=1;
-
-read_request_begin_vc = 0;
-read_request_end_vc = 3;
-write_reply_begin_vc = 4;
-write_reply_end_vc = 7;
-read_reply_begin_vc = 4;
-read_reply_end_vc = 7;
-write_request_begin_vc = 0;
-write_request_end_vc = 3;
-
-//latency: drains all packet, throughput:no drain?
-sim_type = latency;
diff --git a/src/intersim2/.svn/pristine/9f/9f3bdc5b32d0fd02e717f7a9c517e280355586fb.svn-base b/src/intersim2/.svn/pristine/9f/9f3bdc5b32d0fd02e717f7a9c517e280355586fb.svn-base
deleted file mode 100644
index 748506d..0000000
--- a/src/intersim2/.svn/pristine/9f/9f3bdc5b32d0fd02e717f7a9c517e280355586fb.svn-base
+++ /dev/null
@@ -1,103 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// SeparableOutputFirstAllocator: Separable Output-First Allocator
-//
-// ----------------------------------------------------------------------
-
-#include "separable_output_first.hpp"
-
-#include "booksim.hpp"
-#include "arbiter.hpp"
-
-#include <vector>
-#include <iostream>
-#include <cstring>
-
-SeparableOutputFirstAllocator::
-SeparableOutputFirstAllocator( Module* parent, const string& name, int inputs,
- int outputs, const string& arb_type )
- : SeparableAllocator( parent, name, inputs, outputs, arb_type )
-{}
-
-void SeparableOutputFirstAllocator::Allocate() {
-
- set<int>::const_iterator port_iter = _out_occ.begin();
- while(port_iter != _out_occ.end()) {
-
- const int & output = *port_iter;
-
- // add requests to the output arbiter
-
- map<int, sRequest>::const_iterator req_iter = _out_req[output].begin();
- while(req_iter != _out_req[output].end()) {
-
- const sRequest & req = req_iter->second;
-
- _output_arb[output]->AddRequest(req.port, req.label, req.out_pri);
-
- ++req_iter;
- }
-
- // Execute the output arbiter and propagate the grants to the
- // input arbiters.
-
- int label = -1;
- const int input = _output_arb[output]->Arbitrate(&label, NULL);
- assert(input > -1);
-
- const sRequest & req = _in_req[input][output];
- assert((req.port == output) && (req.label == label));
-
- _input_arb[input]->AddRequest(req.port, req.label, req.in_pri);
-
- ++port_iter;
- }
-
- port_iter = _in_occ.begin();
- while(port_iter != _in_occ.end()) {
-
- const int & input = *port_iter;
-
- // Execute the input arbiters.
-
- const int output = _input_arb[input]->Arbitrate(NULL, NULL);
-
- if(output > -1) {
- assert((_inmatch[input] == -1) && (_outmatch[output] == -1));
-
- _inmatch[input] = output;
- _outmatch[output] = input;
- _input_arb[input]->UpdateState() ;
- _output_arb[output]->UpdateState() ;
- }
-
- ++port_iter;
- }
-}
diff --git a/src/intersim2/.svn/pristine/a4/a4359ad59061eaed8a442687bbf1e8693be96a72.svn-base b/src/intersim2/.svn/pristine/a4/a4359ad59061eaed8a442687bbf1e8693be96a72.svn-base
deleted file mode 100644
index dccabf7..0000000
--- a/src/intersim2/.svn/pristine/a4/a4359ad59061eaed8a442687bbf1e8693be96a72.svn-base
+++ /dev/null
@@ -1,68 +0,0 @@
-// $Id$
-
-// Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// Redistributions of source code must retain the above copyright notice, this
-// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-//8X8 mesh with 20 flits per packet under injection mode
-//injection rate here is packet per cycle, NOT flit per cycle
-
-// Topology
-
-topology = mesh;
-k = 8;
-n = 2;
-
-// Routing
-routing_function = dor;
-
-// Flow control
-num_vcs = 8;
-vc_buf_size = 8;
-wait_for_tail_credit = 1;
-
-// Router architecture
-vc_allocator = islip;
-sw_allocator = islip;
-alloc_iters = 1;
-
-credit_delay = 2;
-routing_delay = 0;
-vc_alloc_delay = 1;
-sw_alloc_delay = 1;
-
-input_speedup = 2;
-output_speedup = 1;
-internal_speedup = 1.0;
-
-
-// Traffic
-traffic = transpose;
-packet_size = 20;
-
-
-// Simulation
-sim_type = latency;
-
-injection_rate = 0.005;
-
diff --git a/src/intersim2/.svn/pristine/ad/ad824944d4de71c9e947f9e386f12aa8c6ec4355.svn-base b/src/intersim2/.svn/pristine/ad/ad824944d4de71c9e947f9e386f12aa8c6ec4355.svn-base
deleted file mode 100644
index c05ef50..0000000
--- a/src/intersim2/.svn/pristine/ad/ad824944d4de71c9e947f9e386f12aa8c6ec4355.svn-base
+++ /dev/null
@@ -1,104 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _FLIT_HPP_
-#define _FLIT_HPP_
-
-#include <iostream>
-#include <stack>
-
-#include "booksim.hpp"
-#include "outputset.hpp"
-
-class Flit {
-
-public:
-
- const static int NUM_FLIT_TYPES = 5;
- enum FlitType { READ_REQUEST = 0,
- READ_REPLY = 1,
- WRITE_REQUEST = 2,
- WRITE_REPLY = 3,
- ANY_TYPE = 4 };
- FlitType type;
-
- int vc;
-
- int cl;
-
- bool head;
- bool tail;
-
- int ctime;
- int itime;
- int atime;
-
- int id;
- int pid;
-
- bool record;
-
- int src;
- int dest;
-
- int pri;
-
- int hops;
- bool watch;
- int subnetwork;
-
- // intermediate destination (if any)
- mutable int intm;
-
- // phase in multi-phase algorithms
- mutable int ph;
-
- // Fields for arbitrary data
- void* data ;
-
- // Lookahead route info
- OutputSet la_route_set;
-
- void Reset();
-
- static Flit * New();
- void Free();
- static void FreeAll();
-
-private:
-
- Flit();
- ~Flit() {}
-
- static stack<Flit *> _all;
- static stack<Flit *> _free;
-
-};
-
-ostream& operator<<( ostream& os, const Flit& f );
-
-#endif
diff --git a/src/intersim2/.svn/pristine/af/afde60b791408b0db1c56c113ccfe45105b846eb.svn-base b/src/intersim2/.svn/pristine/af/afde60b791408b0db1c56c113ccfe45105b846eb.svn-base
deleted file mode 100644
index 665e5b3..0000000
--- a/src/intersim2/.svn/pristine/af/afde60b791408b0db1c56c113ccfe45105b846eb.svn-base
+++ /dev/null
@@ -1,119 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// TreeArbiter
-//
-// ----------------------------------------------------------------------
-
-#include "tree_arb.hpp"
-#include <iostream>
-#include <sstream>
-
-using namespace std ;
-
-TreeArbiter::TreeArbiter( Module *parent, const string &name,
- int size, int groups, const string & arb_type )
- : Arbiter( parent, name, size ) {
- assert(size % groups == 0);
- _group_arbiters.resize(groups);
- _group_reqs.resize(groups, 0);
- _group_size = size / groups;
- for(int i = 0; i < groups; ++i) {
- ostringstream group_arb_name;
- group_arb_name << "group_arb" << i;
- _group_arbiters[i] = Arbiter::NewArbiter(this, group_arb_name.str(), arb_type, _group_size);
- }
- _global_arbiter = Arbiter::NewArbiter(this, "global_arb", arb_type, groups);
-}
-
-TreeArbiter::~TreeArbiter() {
- for(int i = 0; i < (int)_group_arbiters.size(); ++i) {
- delete _group_arbiters[i];
- }
- delete _global_arbiter;
-}
-
-void TreeArbiter::PrintState() const {
- for(int i = 0; i < (int)_group_arbiters.size(); ++i) {
- cout << "Group arbiter " << i << ":" << endl;
- _group_arbiters[i]->PrintState();
- }
- cout << "Global arbiter:" << endl;
- _global_arbiter->PrintState();
-}
-
-void TreeArbiter::UpdateState() {
- if(_selected > -1) {
- int last_winner = _global_arbiter->LastWinner();
- assert(last_winner >= 0 && last_winner < (int)_group_arbiters.size());
- _group_arbiters[last_winner]->UpdateState();
- _global_arbiter->UpdateState();
- }
-}
-
-void TreeArbiter::AddRequest( int input, int id, int pri )
-{
- Arbiter::AddRequest(input, id, pri);
- int group_index = input / _group_size;
- _group_arbiters[group_index]->AddRequest( input % _group_size, id, pri );
- ++_group_reqs[group_index];
-}
-
-int TreeArbiter::Arbitrate( int* id, int* pri ) {
- if(!_num_reqs) {
- return -1;
- }
- for(int i = 0; i < (int)_group_arbiters.size(); ++i) {
- if(_group_reqs[i]) {
- int group_id, group_pri;
- _group_arbiters[i]->Arbitrate(&group_id, &group_pri);
- _global_arbiter->AddRequest(i, group_id, group_pri);
- }
- }
- int group = _global_arbiter->Arbitrate(NULL, NULL);
- assert(group >= 0 && group < (int)_group_arbiters.size());
- int group_sel = _group_arbiters[group]->LastWinner();
- assert(group_sel >= 0 && group_sel < _group_size);
- _selected = group * _group_size + group_sel;
- assert(_selected >= 0 && _selected < _size);
- return Arbiter::Arbitrate(id, pri);
-}
-
-void TreeArbiter::Clear()
-{
- if(!_num_reqs) {
- return;
- }
- for(int i = 0; i < (int)_group_arbiters.size(); ++i) {
- _group_arbiters[i]->Clear();
- _group_reqs[i] = 0;
- }
- _global_arbiter->Clear();
- Arbiter::Clear();
-}
diff --git a/src/intersim2/.svn/pristine/b0/b0621120b70fa66b06fa3e7adc9b386974b8c0c3.svn-base b/src/intersim2/.svn/pristine/b0/b0621120b70fa66b06fa3e7adc9b386974b8c0c3.svn-base
deleted file mode 100644
index 21c879a..0000000
--- a/src/intersim2/.svn/pristine/b0/b0621120b70fa66b06fa3e7adc9b386974b8c0c3.svn-base
+++ /dev/null
@@ -1,66 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _SWITCH_MONITOR_HPP_
-#define _SWITCH_MONITOR_HPP_
-
-#include <vector>
-#include <iostream>
-
-using namespace std;
-
-class Flit;
-
-class SwitchMonitor {
- int _cycles ;
- int _inputs ;
- int _outputs ;
- int _classes ;
- vector<int> _event ;
- int index( int input, int output, int cl ) const ;
-public:
- SwitchMonitor( int inputs, int outputs, int classes ) ;
- void cycle() ;
- vector<int> const & GetActivity() const {
- return _event;
- }
- inline int const & NumInputs() const {
- return _inputs;
- }
- inline int const & NumOutputs() const {
- return _outputs;
- }
- inline int const & NumClasses() const {
- return _classes;
- }
- void traversal( int input, int output, Flit const * f ) ;
- void display(ostream & os) const;
-} ;
-
-ostream & operator<<( ostream & os, SwitchMonitor const & obj ) ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/b4/b4f5b1485bfafbb63c019d5aadd0f1c58250fbe4.svn-base b/src/intersim2/.svn/pristine/b4/b4f5b1485bfafbb63c019d5aadd0f1c58250fbe4.svn-base
deleted file mode 100644
index eb45bc2..0000000
--- a/src/intersim2/.svn/pristine/b4/b4f5b1485bfafbb63c019d5aadd0f1c58250fbe4.svn-base
+++ /dev/null
@@ -1,50 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// SeparableOutputFirstAllocator: Separable Output-First Allocator
-//
-// ----------------------------------------------------------------------
-
-#ifndef _SEPARABLE_OUTPUT_FIRST_HPP_
-#define _SEPARABLE_OUTPUT_FIRST_HPP_
-
-#include "separable.hpp"
-
-class SeparableOutputFirstAllocator : public SeparableAllocator {
-
-public:
-
- SeparableOutputFirstAllocator( Module* parent, const string& name, int inputs,
- int outputs, const string& arb_type ) ;
-
- virtual void Allocate() ;
-
-} ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/b6/b6c4fdbece4c23327c9e321b130c2ec595705f98.svn-base b/src/intersim2/.svn/pristine/b6/b6c4fdbece4c23327c9e321b130c2ec595705f98.svn-base
deleted file mode 100644
index aeb258a..0000000
--- a/src/intersim2/.svn/pristine/b6/b6c4fdbece4c23327c9e321b130c2ec595705f98.svn-base
+++ /dev/null
@@ -1,183 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _IQ_ROUTER_HPP_
-#define _IQ_ROUTER_HPP_
-
-#include <string>
-#include <deque>
-#include <queue>
-#include <set>
-#include <map>
-
-#include "router.hpp"
-#include "routefunc.hpp"
-
-using namespace std;
-
-class VC;
-class Flit;
-class Credit;
-class Buffer;
-class BufferState;
-class Allocator;
-class SwitchMonitor;
-class BufferMonitor;
-
-class IQRouter : public Router {
-
- int _vcs;
-
- bool _vc_busy_when_full;
- bool _vc_prioritize_empty;
- bool _vc_shuffle_requests;
-
- bool _speculative;
- bool _spec_check_elig;
- bool _spec_check_cred;
- bool _spec_mask_by_reqs;
-
- bool _active;
-
- int _routing_delay;
- int _vc_alloc_delay;
- int _sw_alloc_delay;
-
- map<int, Flit *> _in_queue_flits;
-
- deque<pair<int, pair<Credit *, int> > > _proc_credits;
-
- deque<pair<int, pair<int, int> > > _route_vcs;
- deque<pair<int, pair<pair<int, int>, int> > > _vc_alloc_vcs;
- deque<pair<int, pair<pair<int, int>, int> > > _sw_hold_vcs;
- deque<pair<int, pair<pair<int, int>, int> > > _sw_alloc_vcs;
-
- deque<pair<int, pair<Flit *, pair<int, int> > > > _crossbar_flits;
-
- map<int, Credit *> _out_queue_credits;
-
- vector<Buffer *> _buf;
- vector<BufferState *> _next_buf;
-
- Allocator *_vc_allocator;
- Allocator *_sw_allocator;
- Allocator *_spec_sw_allocator;
-
- vector<int> _vc_rr_offset;
- vector<int> _sw_rr_offset;
-
- tRoutingFunction _rf;
-
- int _output_buffer_size;
- vector<queue<Flit *> > _output_buffer;
-
- vector<queue<Credit *> > _credit_buffer;
-
- bool _hold_switch_for_packet;
- vector<int> _switch_hold_in;
- vector<int> _switch_hold_out;
- vector<int> _switch_hold_vc;
-
- bool _noq;
- vector<vector<int> > _noq_next_output_port;
- vector<vector<int> > _noq_next_vc_start;
- vector<vector<int> > _noq_next_vc_end;
-
-#ifdef TRACK_FLOWS
- vector<vector<queue<int> > > _outstanding_classes;
-#endif
-
- bool _ReceiveFlits( );
- bool _ReceiveCredits( );
-
- virtual void _InternalStep( );
-
- bool _SWAllocAddReq(int input, int vc, int output);
-
- void _InputQueuing( );
-
- void _RouteEvaluate( );
- void _VCAllocEvaluate( );
- void _SWHoldEvaluate( );
- void _SWAllocEvaluate( );
- void _SwitchEvaluate( );
-
- void _RouteUpdate( );
- void _VCAllocUpdate( );
- void _SWHoldUpdate( );
- void _SWAllocUpdate( );
- void _SwitchUpdate( );
-
- void _OutputQueuing( );
-
- void _SendFlits( );
- void _SendCredits( );
-
- void _UpdateNOQ(int input, int vc, Flit const * f);
-
- // ----------------------------------------
- //
- // Router Power Modellingyes
- //
- // ----------------------------------------
-
- SwitchMonitor * _switchMonitor ;
- BufferMonitor * _bufferMonitor ;
-
-public:
-
- IQRouter( Configuration const & config,
- Module *parent, string const & name, int id,
- int inputs, int outputs );
-
- virtual ~IQRouter( );
-
- virtual void AddOutputChannel(FlitChannel * channel, CreditChannel * backchannel);
-
- virtual void ReadInputs( );
- virtual void WriteOutputs( );
-
- void Display( ostream & os = cout ) const;
-
- virtual int GetUsedCredit(int o) const;
- virtual int GetBufferOccupancy(int i) const;
-
-#ifdef TRACK_BUFFERS
- virtual int GetUsedCreditForClass(int output, int cl) const;
- virtual int GetBufferOccupancyForClass(int input, int cl) const;
-#endif
-
- virtual vector<int> UsedCredits() const;
- virtual vector<int> FreeCredits() const;
- virtual vector<int> MaxCredits() const;
-
- SwitchMonitor const * const GetSwitchMonitor() const {return _switchMonitor;}
- BufferMonitor const * const GetBufferMonitor() const {return _bufferMonitor;}
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/b7/b755bb8c053f61f95a6ce87cddff8068f0fa19fa.svn-base b/src/intersim2/.svn/pristine/b7/b755bb8c053f61f95a6ce87cddff8068f0fa19fa.svn-base
deleted file mode 100644
index df0f9fc..0000000
--- a/src/intersim2/.svn/pristine/b7/b755bb8c053f61f95a6ce87cddff8068f0fa19fa.svn-base
+++ /dev/null
@@ -1,137 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _VC_HPP_
-#define _VC_HPP_
-
-#include <deque>
-
-#include "flit.hpp"
-#include "outputset.hpp"
-#include "routefunc.hpp"
-#include "config_utils.hpp"
-
-class VC : public Module {
-public:
- enum eVCState { state_min = 0, idle = state_min, routing, vc_alloc, active,
- state_max = active };
- struct state_info_t {
- int cycles;
- };
- static const char * const VCSTATE[];
-
-private:
-
- deque<Flit *> _buffer;
-
- eVCState _state;
-
- OutputSet *_route_set;
- int _out_port, _out_vc;
-
- enum ePrioType { local_age_based, queue_length_based, hop_count_based, none, other };
-
- ePrioType _pri_type;
-
- int _pri;
-
- int _priority_donation;
-
- bool _watched;
-
- int _expected_pid;
-
- int _last_id;
- int _last_pid;
-
- bool _lookahead_routing;
-
-public:
-
- VC( const Configuration& config, int outputs,
- Module *parent, const string& name );
- ~VC();
-
- void AddFlit( Flit *f );
- inline Flit *FrontFlit( ) const
- {
- return _buffer.empty() ? NULL : _buffer.front();
- }
-
- Flit *RemoveFlit( );
-
-
- inline bool Empty( ) const
- {
- return _buffer.empty( );
- }
-
- inline VC::eVCState GetState( ) const
- {
- return _state;
- }
-
-
- void SetState( eVCState s );
-
- const OutputSet *GetRouteSet( ) const;
- void SetRouteSet( OutputSet * output_set );
-
- void SetOutput( int port, int vc );
-
- inline int GetOutputPort( ) const
- {
- return _out_port;
- }
-
-
- inline int GetOutputVC( ) const
- {
- return _out_vc;
- }
-
- void UpdatePriority();
-
- inline int GetPriority( ) const
- {
- return _pri;
- }
- void Route( tRoutingFunction rf, const Router* router, const Flit* f, int in_channel );
-
- inline int GetOccupancy() const
- {
- return (int)_buffer.size();
- }
-
- // ==== Debug functions ====
-
- void SetWatch( bool watch = true );
- bool IsWatched( ) const;
- void Display( ostream & os = cout ) const;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/b8/b8715f9652140e4746a42ce2c1ca742a6dcc8ab1.svn-base b/src/intersim2/.svn/pristine/b8/b8715f9652140e4746a42ce2c1ca742a6dcc8ab1.svn-base
deleted file mode 100644
index 3e8f5ae..0000000
--- a/src/intersim2/.svn/pristine/b8/b8715f9652140e4746a42ce2c1ca742a6dcc8ab1.svn-base
+++ /dev/null
@@ -1,68 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _INJECTION_HPP_
-#define _INJECTION_HPP_
-
-#include "config_utils.hpp"
-
-using namespace std;
-
-class InjectionProcess {
-protected:
- int _nodes;
- double _rate;
- InjectionProcess(int nodes, double rate);
-public:
- virtual ~InjectionProcess() {}
- virtual bool test(int source) = 0;
- virtual void reset();
- static InjectionProcess * New(string const & inject, int nodes, double load,
- Configuration const * const config = NULL);
-};
-
-class BernoulliInjectionProcess : public InjectionProcess {
-public:
- BernoulliInjectionProcess(int nodes, double rate);
- virtual bool test(int source);
-};
-
-class OnOffInjectionProcess : public InjectionProcess {
-private:
- double _alpha;
- double _beta;
- double _r1;
- vector<int> _initial;
- vector<int> _state;
-public:
- OnOffInjectionProcess(int nodes, double rate, double alpha, double beta,
- double r1, vector<int> initial);
- virtual void reset();
- virtual bool test(int source);
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/b9/b92275ee465ac160db13b1f1e271cf80bc843710.svn-base b/src/intersim2/.svn/pristine/b9/b92275ee465ac160db13b1f1e271cf80bc843710.svn-base
deleted file mode 100644
index 1819d18..0000000
--- a/src/intersim2/.svn/pristine/b9/b92275ee465ac160db13b1f1e271cf80bc843710.svn-base
+++ /dev/null
@@ -1,183 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <iostream>
-
-#include "islip.hpp"
-#include "random_utils.hpp"
-
-//#define DEBUG_ISLIP
-
-iSLIP_Sparse::iSLIP_Sparse( Module *parent, const string& name,
- int inputs, int outputs, int iters ) :
- SparseAllocator( parent, name, inputs, outputs ),
- _iSLIP_iter(iters)
-{
- _gptrs.resize(_outputs, 0);
- _aptrs.resize(_inputs, 0);
-}
-
-void iSLIP_Sparse::Allocate( )
-{
- int input;
- int output;
-
- int input_offset;
- int output_offset;
-
- map<int, sRequest>::iterator p;
- bool wrapped;
-
- for ( int iter = 0; iter < _iSLIP_iter; ++iter ) {
- // Grant phase
-
- vector<int> grants(_outputs, -1);
-
- for ( output = 0; output < _outputs; ++output ) {
-
- // Skip loop if there are no requests
- // or the output is already matched
- if ( ( _out_req[output].empty( ) ) ||
- ( _outmatch[output] != -1 ) ) {
- continue;
- }
-
- // A round-robin arbiter between input requests
- input_offset = _gptrs[output];
-
- p = _out_req[output].begin( );
- while( ( p != _out_req[output].end( ) ) &&
- ( p->second.port < input_offset ) ) {
- p++;
- }
-
- wrapped = false;
- while( (!wrapped) ||
- ( ( p != _out_req[output].end( ) ) &&
- ( p->second.port < input_offset ) ) ) {
- if ( p == _out_req[output].end( ) ) {
- if ( wrapped ) { break; }
- // p is valid here because empty lists
- // are skipped (above)
- p = _out_req[output].begin( );
- wrapped = true;
- }
-
- input = p->second.port;
-
- // we know the output is free (above) and
- // if the input is free, grant request
- if ( _inmatch[input] == -1 ) {
- grants[output] = input;
- break;
- }
-
- p++;
- }
- }
-
-#ifdef DEBUG_ISLIP
- cout << "grants: ";
- for ( int i = 0; i < _outputs; ++i ) {
- cout << grants[i] << " ";
- }
- cout << endl;
-
- cout << "aptrs: ";
- for ( int i = 0; i < _inputs; ++i ) {
- cout << _aptrs[i] << " ";
- }
- cout << endl;
-#endif
-
- // Accept phase
-
- for ( input = 0; input < _inputs; ++input ) {
-
- if ( _in_req[input].empty( ) ) {
- continue;
- }
-
- // A round-robin arbiter between output grants
- output_offset = _aptrs[input];
-
- p = _in_req[input].begin( );
- while( ( p != _in_req[input].end( ) ) &&
- ( p->second.port < output_offset ) ) {
- p++;
- }
-
- wrapped = false;
- while( (!wrapped) ||
- ( ( p != _in_req[input].end( ) ) &&
- ( p->second.port < output_offset ) ) ) {
- if ( p == _in_req[input].end( ) ) {
- if ( wrapped ) { break; }
- // p is valid here because empty lists
- // are skipped (above)
- p = _in_req[input].begin( );
- wrapped = true;
- }
-
- output = p->second.port;
-
- // we know the output is free (above) and
- // if the input is free, grant request
- if ( grants[output] == input ) {
- // Accept
- _inmatch[input] = output;
- _outmatch[output] = input;
-
- // Only update pointers if accepted during the 1st iteration
- if ( iter == 0 ) {
- _gptrs[output] = ( input + 1 ) % _inputs;
- _aptrs[input] = ( output + 1 ) % _outputs;
- }
-
- break;
- }
-
- p++;
- }
- }
- }
-
-#ifdef DEBUG_ISLIP
- cout << "input match: ";
- for ( int i = 0; i < _inputs; ++i ) {
- cout << _inmatch[i] << " ";
- }
- cout << endl;
-
- cout << "output match: ";
- for ( int j = 0; j < _outputs; ++j ) {
- cout << _outmatch[j] << " ";
- }
- cout << endl;
-#endif
-}
diff --git a/src/intersim2/.svn/pristine/bf/bf0b085441d2569f393cadb89df82945471cd4d4.svn-base b/src/intersim2/.svn/pristine/bf/bf0b085441d2569f393cadb89df82945471cd4d4.svn-base
deleted file mode 100644
index 01a2281..0000000
--- a/src/intersim2/.svn/pristine/bf/bf0b085441d2569f393cadb89df82945471cd4d4.svn-base
+++ /dev/null
@@ -1,575 +0,0 @@
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this list
- of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
- Neither the name of the Stanford University nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <vector>
-#include <sstream>
-
-#include "dragonfly.hpp"
-#include "random_utils.hpp"
-#include "misc_utils.hpp"
-#include "globals.hpp"
-
-#define DRAGON_LATENCY
-
-int gP, gA, gG;
-
-//calculate the hop count between src and estination
-int dragonflynew_hopcnt(int src, int dest)
-{
- int hopcnt;
- int dest_grp_ID, src_grp_ID;
- int src_hopcnt, dest_hopcnt;
- int src_intm, dest_intm;
- int grp_output, dest_grp_output;
- int grp_output_RID;
-
- int _grp_num_routers= gA;
- int _grp_num_nodes =_grp_num_routers*gP;
-
- dest_grp_ID = int(dest/_grp_num_nodes);
- src_grp_ID = int(src / _grp_num_nodes);
-
- //source and dest are in the same group, either 0-1 hop
- if (dest_grp_ID == src_grp_ID) {
- if ((int)(dest / gP) == (int)(src /gP))
- hopcnt = 0;
- else
- hopcnt = 1;
-
- } else {
- //source and dest are in the same group
- //find the number of hops in the source group
- //find the number of hops in the dest group
- if (src_grp_ID > dest_grp_ID) {
- grp_output = dest_grp_ID;
- dest_grp_output = src_grp_ID - 1;
- }
- else {
- grp_output = dest_grp_ID - 1;
- dest_grp_output = src_grp_ID;
- }
- grp_output_RID = ((int) (grp_output / (gP))) + src_grp_ID * _grp_num_routers;
- src_intm = grp_output_RID * gP;
-
- grp_output_RID = ((int) (dest_grp_output / (gP))) + dest_grp_ID * _grp_num_routers;
- dest_intm = grp_output_RID * gP;
-
- //hop count in source group
- if ((int)( src_intm / gP) == (int)( src / gP ) )
- src_hopcnt = 0;
- else
- src_hopcnt = 1;
-
- //hop count in destination group
- if ((int)( dest_intm / gP) == (int)( dest / gP ) ){
- dest_hopcnt = 0;
- }else{
- dest_hopcnt = 1;
- }
-
- //tally
- hopcnt = src_hopcnt + 1 + dest_hopcnt;
- }
-
- return hopcnt;
-}
-
-
-//packet output port based on the source, destination and current location
-int dragonfly_port(int rID, int source, int dest){
- int _grp_num_routers= gA;
- int _grp_num_nodes =_grp_num_routers*gP;
-
- int out_port = -1;
- int grp_ID = int(rID / _grp_num_routers);
- int dest_grp_ID = int(dest/_grp_num_nodes);
- int grp_output=-1;
- int grp_RID=-1;
- int group_dest=-1;
-
- //which router within this group the packet needs to go to
- if (dest_grp_ID == grp_ID) {
- grp_RID = int(dest / gP);
- } else {
- if (grp_ID > dest_grp_ID) {
- grp_output = dest_grp_ID;
- } else {
- grp_output = dest_grp_ID - 1;
- }
- grp_RID = int(grp_output /gP) + grp_ID * _grp_num_routers;
- group_dest = grp_RID * gP;
- }
-
- //At the last hop
- if (dest >= rID*gP && dest < (rID+1)*gP) {
- out_port = dest%gP;
- } else if (grp_RID == rID) {
- //At the optical link
- out_port = gP + (gA-1) + grp_output %(gP);
- } else {
- //need to route within a group
- assert(grp_RID!=-1);
-
- if (rID < grp_RID){
- out_port = (grp_RID % _grp_num_routers) - 1 + gP;
- }else{
- out_port = (grp_RID % _grp_num_routers) + gP;
- }
- }
-
- assert(out_port!=-1);
- return out_port;
-}
-
-
-DragonFlyNew::DragonFlyNew( const Configuration &config, const string & name ) :
- Network( config, name )
-{
-
- _ComputeSize( config );
- _Alloc( );
- _BuildNet( config );
-}
-
-void DragonFlyNew::_ComputeSize( const Configuration &config )
-{
-
- // LIMITATION
- // -- only one dimension between the group
- // _n == # of dimensions within a group
- // _p == # of processors within a router
- // inter-group ports : _p
- // terminal ports : _p
- // intra-group ports : 2*_p - 1
- _p = config.GetInt( "k" ); // # of ports in each switch
- _n = config.GetInt( "n" );
-
-
- assert(_n==1);
- // dimension
-
- if (_n == 1)
- _k = _p + _p + 2*_p - 1;
- else
- _k = _p + _p + 2*_p;
-
-
- // FIX...
- gK = _p; gN = _n;
-
- // with 1 dimension, total of 2p routers per group
- // N = 2p * p * (2p^2 + 1)
- // a = # of routers per group
- // = 2p (if n = 1)
- // = p^(n) (if n > 2)
- // g = # of groups
- // = a * p + 1
- // N = a * p * g;
-
- if (_n == 1)
- _a = 2 * _p;
- else
- _a = powi(_p, _n);
-
- _g = _a * _p + 1;
- _nodes = _a * _p * _g;
-
- _num_of_switch = _nodes / _p;
- _channels = _num_of_switch * (_k - _p);
- _size = _num_of_switch;
-
-
-
- gG = _g;
- gP = _p;
- gA = _a;
- _grp_num_routers = gA;
- _grp_num_nodes =_grp_num_routers*gP;
-
-}
-
-void DragonFlyNew::_BuildNet( const Configuration &config )
-{
-
- int _output=-1;
- int _input=-1;
- int _dim_ID=-1;
- int _num_ports_per_switch=-1;
- int _dim_size=-1;
- int c;
-
- ostringstream router_name;
-
-
-
- cout << " Dragonfly " << endl;
- cout << " p = " << _p << " n = " << _n << endl;
- cout << " each switch - total radix = "<< _k << endl;
- cout << " # of switches = "<< _num_of_switch << endl;
- cout << " # of channels = "<< _channels << endl;
- cout << " # of nodes ( size of network ) = " << _nodes << endl;
- cout << " # of groups (_g) = " << _g << endl;
- cout << " # of routers per group (_a) = " << _a << endl;
-
- for ( int node = 0; node < _num_of_switch; ++node ) {
- // ID of the group
- int grp_ID;
- grp_ID = (int) (node/_a);
- router_name << "router";
-
- router_name << "_" << node ;
-
- _routers[node] = Router::NewRouter( config, this, router_name.str( ),
- node, _k, _k );
- _timed_modules.push_back(_routers[node]);
-
- router_name.str("");
-
- for ( int cnt = 0; cnt < _p; ++cnt ) {
- c = _p * node + cnt;
- _routers[node]->AddInputChannel( _inject[c], _inject_cred[c] );
-
- }
-
- for ( int cnt = 0; cnt < _p; ++cnt ) {
- c = _p * node + cnt;
- _routers[node]->AddOutputChannel( _eject[c], _eject_cred[c] );
-
- }
-
- // add OUPUT channels
- // _k == # of processor per router
- // need 2*_k routers --thus,
- // 2_k-1 outputs channels within group
- // _k-1 outputs for intra-group
-
- //
-
- if (_n > 1 ) { cout << " ERROR: n>1 dimension NOT supported yet... " << endl; exit(-1); }
-
- //********************************************
- // connect OUTPUT channels
- //********************************************
- // add intra-group output channel
- for ( int dim = 0; dim < _n; ++dim ) {
- for ( int cnt = 0; cnt < (2*_p -1); ++cnt ) {
- _output = (2*_p-1 + _p) * _n * node + (2*_p-1) * dim + cnt;
-
- _routers[node]->AddOutputChannel( _chan[_output], _chan_cred[_output] );
-
-#ifdef DRAGON_LATENCY
- _chan[_output]->SetLatency(10);
- _chan_cred[_output]->SetLatency(10);
-#endif
- }
- }
-
- // add inter-group output channel
-
- for ( int cnt = 0; cnt < _p; ++cnt ) {
- _output = (2*_p-1 + _p) * node + (2*_p - 1) + cnt;
-
- // _chan[_output].global = true;
- _routers[node]->AddOutputChannel( _chan[_output], _chan_cred[_output] );
-#ifdef DRAGON_LATENCY
- _chan[_output]->SetLatency(100);
- _chan_cred[_output]->SetLatency(100);
-#endif
- }
-
-
- //********************************************
- // connect INPUT channels
- //********************************************
- // # of non-local nodes
- _num_ports_per_switch = (_k - _p);
-
-
- // intra-group GROUP channels
- for ( int dim = 0; dim < _n; ++dim ) {
-
- _dim_size = powi(_k,dim);
-
- _dim_ID = ((int) (node / ( powi(_p, dim))));
-
-
-
- // NODE ID withing group
- _dim_ID = node % _a;
-
-
-
-
- for ( int cnt = 0; cnt < (2*_p-1); ++cnt ) {
-
- if ( cnt < _dim_ID) {
-
- _input = grp_ID * _num_ports_per_switch * _a -
- (_dim_ID - cnt) * _num_ports_per_switch +
- _dim_ID * _num_ports_per_switch +
- (_dim_ID - 1);
- }
- else {
-
- _input = grp_ID * _num_ports_per_switch * _a +
- _dim_ID * _num_ports_per_switch +
- (cnt - _dim_ID + 1) * _num_ports_per_switch +
- _dim_ID;
-
- }
-
- if (_input < 0) {
- cout << " ERROR: _input less than zero " << endl;
- exit(-1);
- }
-
-
- _routers[node]->AddInputChannel( _chan[_input], _chan_cred[_input] );
- }
- }
-
-
- // add INPUT channels -- "optical" channels connecting the groups
- int _grp_num_routers;
- int grp_output;
- int grp_ID2;
-
- for ( int cnt = 0; cnt < _p; ++cnt ) {
- // _dim_ID
- grp_output = _dim_ID* _p + cnt;
-
- _grp_num_routers = powi(_k, _n-1);
- grp_ID2 = (int) ((grp_ID - 1) / (_k - 1));
-
- if ( grp_ID > grp_output) {
-
- _input = (grp_output) * _num_ports_per_switch * _a + // starting point of group
- (_num_ports_per_switch - _p) * (int) ((grp_ID - 1) / _p) + // find the correct router within grp
- (_num_ports_per_switch - _p) + // add offset within router
- grp_ID - 1;
- } else {
-
- _input = (grp_output + 1) * _num_ports_per_switch * _a +
- (_num_ports_per_switch - _p) * (int) ((grp_ID) / _p) + // find the correct router within grp
- (_num_ports_per_switch - _p) +
- grp_ID;
- }
-
- _routers[node]->AddInputChannel( _chan[_input], _chan_cred[_input] );
- }
-
- }
-
- cout<<"Done links"<<endl;
-}
-
-
-int DragonFlyNew::GetN( ) const
-{
- return _n;
-}
-
-int DragonFlyNew::GetK( ) const
-{
- return _k;
-}
-
-void DragonFlyNew::InsertRandomFaults( const Configuration &config )
-{
-
-}
-
-double DragonFlyNew::Capacity( ) const
-{
- return (double)_k / 8.0;
-}
-
-void DragonFlyNew::RegisterRoutingFunctions(){
-
- gRoutingFunctionMap["min_dragonflynew"] = &min_dragonflynew;
- gRoutingFunctionMap["ugal_dragonflynew"] = &ugal_dragonflynew;
-}
-
-
-void min_dragonflynew( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- outputs->Clear( );
-
- if(inject) {
- int inject_vc= RandomInt(gNumVCs-1);
- outputs->AddRange(-1, inject_vc, inject_vc);
- return;
- }
-
- int _grp_num_routers= gA;
-
- int dest = f->dest;
- int rID = r->GetID();
-
- int grp_ID = int(rID / _grp_num_routers);
- int debug = f->watch;
- int out_port = -1;
- int out_vc = 0;
- int dest_grp_ID=-1;
-
- if ( in_channel < gP ) {
- out_vc = 0;
- f->ph = 0;
- if (dest_grp_ID == grp_ID) {
- f->ph = 1;
- }
- }
-
-
- out_port = dragonfly_port(rID, f->src, dest);
-
- //optical dateline
- if (out_port >=gP + (gA-1)) {
- f->ph = 1;
- }
-
- out_vc = f->ph;
- if (debug)
- *gWatchOut << GetSimTime() << " | " << r->FullName() << " | "
- << " through output port : " << out_port
- << " out vc: " << out_vc << endl;
- outputs->AddRange( out_port, out_vc, out_vc );
-}
-
-
-//Basic adaptive routign algorithm for the dragonfly
-void ugal_dragonflynew( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- //need 3 VCs for deadlock freedom
-
- assert(gNumVCs==3);
- outputs->Clear( );
- if(inject) {
- int inject_vc= RandomInt(gNumVCs-1);
- outputs->AddRange(-1, inject_vc, inject_vc);
- return;
- }
-
- //this constant biases the adaptive decision toward minimum routing
- //negative value woudl biases it towards nonminimum routing
- int adaptive_threshold = 30;
-
- int _grp_num_routers= gA;
- int _grp_num_nodes =_grp_num_routers*gP;
- int _network_size = gA * gP * gG;
-
-
- int dest = f->dest;
- int rID = r->GetID();
- int grp_ID = (int) (rID / _grp_num_routers);
- int dest_grp_ID = int(dest/_grp_num_nodes);
-
- int debug = f->watch;
- int out_port = -1;
- int out_vc = 0;
- int min_queue_size, min_hopcnt;
- int nonmin_queue_size, nonmin_hopcnt;
- int intm_grp_ID;
- int intm_rID;
-
- if(debug){
- cout<<"At router "<<rID<<endl;
- }
- int min_router_output, nonmin_router_output;
-
- //at the source router, make the adaptive routing decision
- if ( in_channel < gP ) {
- //dest are in the same group, only use minimum routing
- if (dest_grp_ID == grp_ID) {
- f->ph = 2;
- } else {
- //select a random node
- f->intm =RandomInt(_network_size - 1);
- intm_grp_ID = (int)(f->intm/_grp_num_nodes);
- if (debug){
- cout<<"Intermediate node "<<f->intm<<" grp id "<<intm_grp_ID<<endl;
- }
-
- //random intermediate are in the same group, use minimum routing
- if(grp_ID == intm_grp_ID){
- f->ph = 1;
- } else {
- //congestion metrics using queue length, obtained by GetUsedCredit()
- min_hopcnt = dragonflynew_hopcnt(f->src, f->dest);
- min_router_output = dragonfly_port(rID, f->src, f->dest);
- min_queue_size = max(r->GetUsedCredit(min_router_output), 0) ;
-
-
- nonmin_hopcnt = dragonflynew_hopcnt(f->src, f->intm) +
- dragonflynew_hopcnt(f->intm,f->dest);
- nonmin_router_output = dragonfly_port(rID, f->src, f->intm);
- nonmin_queue_size = max(r->GetUsedCredit(nonmin_router_output), 0);
-
- //congestion comparison, could use hopcnt instead of 1 and 2
- if ((1 * min_queue_size ) <= (2 * nonmin_queue_size)+adaptive_threshold ) {
- if (debug) cout << " MINIMAL routing " << endl;
- f->ph = 1;
- } else {
- f->ph = 0;
- }
- }
- }
- }
-
- //transition from nonminimal phase to minimal
- if(f->ph==0){
- intm_rID= (int)(f->intm/gP);
- if( rID == intm_rID){
- f->ph = 1;
- }
- }
-
- //port assignement based on the phase
- if(f->ph == 0){
- out_port = dragonfly_port(rID, f->src, f->intm);
- } else if(f->ph == 1){
- out_port = dragonfly_port(rID, f->src, f->dest);
- } else if(f->ph == 2){
- out_port = dragonfly_port(rID, f->src, f->dest);
- } else {
- assert(false);
- }
-
- //optical dateline
- if (f->ph == 1 && out_port >=gP + (gA-1)) {
- f->ph = 2;
- }
-
- //vc assignemnt based on phase
- out_vc = f->ph;
-
- outputs->AddRange( out_port, out_vc, out_vc );
-}
diff --git a/src/intersim2/.svn/pristine/c3/c3580bf85e8bc6015a74e1f37916987e00accdaa.svn-base b/src/intersim2/.svn/pristine/c3/c3580bf85e8bc6015a74e1f37916987e00accdaa.svn-base
deleted file mode 100644
index 076ca87..0000000
--- a/src/intersim2/.svn/pristine/c3/c3580bf85e8bc6015a74e1f37916987e00accdaa.svn-base
+++ /dev/null
@@ -1,146 +0,0 @@
-# $Id $
-
-# Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# Redistributions of source code must retain the above copyright notice, this
-# list of conditions and the following disclaimer.
-# Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-
-#
-# Makefile
-#
-LEX = flex
-YACC = bison -y
-DEFINE =
-INCPATH = -I. -Iarbiters -Iallocators -Irouters -Inetworks -Ipower
-CPPFLAGS += -Wall $(INCPATH) $(DEFINE)
-CPPFLAGS += -O3
-CPPFLAGS += -g
-LFLAGS +=
-
-
-OBJDIR := obj
-PROG := booksim
-
-# simulator source files
-CPP_SRCS = main.cpp \
- config_utils.cpp \
- booksim_config.cpp \
- module.cpp \
- buffer.cpp \
- vc.cpp \
- routefunc.cpp \
- traffic.cpp \
- flitchannel.cpp \
- trafficmanager.cpp \
- batchtrafficmanager.cpp \
- packet_reply_info.cpp \
- buffer_state.cpp \
- stats.cpp \
- credit.cpp \
- outputset.cpp \
- flit.cpp \
- injection.cpp\
- misc_utils.cpp\
- rng_wrapper.cpp\
- rng_double_wrapper.cpp\
- power_module.cpp \
- switch_monitor.cpp \
- buffer_monitor.cpp
-
-
-
-LEX_OBJS = ${OBJDIR}/lex.yy.o
-YACC_OBJS = ${OBJDIR}/y.tab.o
-
-# networks
-NETWORKS:= $(wildcard networks/*.cpp)
-ALLOCATORS:= $(wildcard allocators/*.cpp)
-ARBITERS:= $(wildcard arbiters/*.cpp)
-ROUTERS:= $(wildcard routers/*.cpp)
-POWER:= $(wildcard power/*.cpp)
-
-#--- Make rules ---
-OBJS := $(LEX_OBJS) $(YACC_OBJS)\
- $(CPP_SRCS:%.cpp=${OBJDIR}/%.o)\
- $(NETWORKS:networks/%.cpp=${OBJDIR}/%.o)\
- $(ALLOCATORS:allocators/%.cpp=${OBJDIR}/%.o)\
- $(ARBITERS:arbiters/%.cpp=${OBJDIR}/%.o)\
- $(ROUTERS:routers/%.cpp=${OBJDIR}/%.o)\
- $(POWER:power/%.cpp=${OBJDIR}/%.o)
-
-.PHONY: clean
-
-all:$(PROG)
-
-$(PROG): $(OBJS)
- $(CXX) $(LFLAGS) $^ -o $@
-
-# rules to compile simulator
-
-
-${LEX_OBJS}: lex.yy.c y.tab.h
- $(CC) $(CPPFLAGS) -c $< -o $@
-
-${YACC_OBJS}: y.tab.c y.tab.h
- $(CC) $(CPPFLAGS) -c $< -o $@
-
-${OBJDIR}/%.o: %.cpp
- $(CXX) $(CPPFLAGS) -c $< -o $@
-
-# rules to compile networks
-${OBJDIR}/%.o: networks/%.cpp
- $(CXX) $(CPPFLAGS) -c $< -o $@
-
-# rules to compile arbiters
-${OBJDIR}/%.o: arbiters/%.cpp
- $(CXX) $(CPPFLAGS) -c $< -o $@
-
-# rules to compile allocators
-${OBJDIR}/%.o: allocators/%.cpp
- $(CXX) $(CPPFLAGS) -c $< -o $@
-
-# rules to compile routers
-${OBJDIR}/%.o: routers/%.cpp
- $(CXX) $(CPPFLAGS) -c $< -o $@
-
-# rules to compile power classes
-${OBJDIR}/%.o: power/%.cpp
- $(CXX) $(CPPFLAGS) -c $< -o $@
-
-clean:
- rm -f $(OBJS)
- rm -f $(PROG)
- rm -f *~
- rm -f allocators/*~
- rm -f arbiters/*~
- rm -f networks/*~
- rm -f runfiles/*~
- rm -f routers/*~
- rm -f examples/*~
- rm -f y.tab.c y.tab.h lex.yy.c
- rm -f moc_bgui.cpp
-
-y.tab.c y.tab.h: config.y
- $(YACC) -d $<
-
-lex.yy.c: config.l
- $(LEX) $<
diff --git a/src/intersim2/.svn/pristine/c3/c3dce16b735e5ff4045d124ee30299d4ff39f5b1.svn-base b/src/intersim2/.svn/pristine/c3/c3dce16b735e5ff4045d124ee30299d4ff39f5b1.svn-base
deleted file mode 100644
index 7d12faf..0000000
--- a/src/intersim2/.svn/pristine/c3/c3dce16b735e5ff4045d124ee30299d4ff39f5b1.svn-base
+++ /dev/null
@@ -1,95 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _CONFIG_UTILS_HPP_
-#define _CONFIG_UTILS_HPP_
-
-#include "booksim.hpp"
-
-#include<cstdio>
-#include<string>
-#include<map>
-#include<vector>
-
-extern "C" int yyparse();
-
-class Configuration {
- static Configuration * theConfig;
- FILE * _config_file;
- string _config_string;
-
-protected:
- map<string,string> _str_map;
- map<string,int> _int_map;
- map<string,double> _float_map;
-
-public:
- Configuration();
-
- void AddStrField(string const & field, string const & value);
-
- void Assign(string const & field, string const & value);
- void Assign(string const & field, int value);
- void Assign(string const & field, double value);
-
- string GetStr(string const & field) const;
- int GetInt(string const & field) const;
- double GetFloat(string const & field) const;
-
- vector<string> GetStrArray(const string & field) const;
- vector<int> GetIntArray(const string & field) const;
- vector<double> GetFloatArray(const string & field) const;
-
- void ParseFile(string const & filename);
- void ParseString(string const & str);
- int Input(char * line, int max_size);
- void ParseError(string const & msg, unsigned int lineno = 0) const;
-
- void WriteFile(string const & filename);
- void WriteMatlabFile(ostream * o) const;
-
- inline const map<string, string> & GetStrMap() const {
- return _str_map;
- }
- inline const map<string, int> & GetIntMap() const {
- return _int_map;
- }
- inline const map<string, double> & GetFloatMap() const {
- return _float_map;
- }
-
- static Configuration * GetTheConfig();
-
-};
-
-bool ParseArgs(Configuration * cf, int argc, char **argv);
-
-vector<string> tokenize_str(string const & data);
-vector<int> tokenize_int(string const & data);
-vector<double> tokenize_float(string const & data);
-
-#endif
diff --git a/src/intersim2/.svn/pristine/c5/c5213fecc8710817b2514c72787b0207849f9280.svn-base b/src/intersim2/.svn/pristine/c5/c5213fecc8710817b2514c72787b0207849f9280.svn-base
deleted file mode 100644
index 13bd09d..0000000
--- a/src/intersim2/.svn/pristine/c5/c5213fecc8710817b2514c72787b0207849f9280.svn-base
+++ /dev/null
@@ -1,80 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// RoundRobin: RoundRobin Arbiter
-//
-// ----------------------------------------------------------------------
-
-#include "roundrobin_arb.hpp"
-#include <iostream>
-#include <limits>
-
-using namespace std ;
-
-RoundRobinArbiter::RoundRobinArbiter( Module *parent, const string &name,
- int size )
- : Arbiter( parent, name, size ), _pointer( 0 ) {
-}
-
-void RoundRobinArbiter::PrintState() const {
- cout << "Round Robin Priority Pointer: " << endl ;
- cout << " _pointer = " << _pointer << endl ;
-}
-
-void RoundRobinArbiter::UpdateState() {
- // update priority matrix using last grant
- if ( _selected > -1 )
- _pointer = ( _selected + 1 ) % _size ;
-}
-
-void RoundRobinArbiter::AddRequest( int input, int id, int pri )
-{
- if(!_request[input].valid || (_request[input].pri < pri)) {
- if((_num_reqs == 0) ||
- Supersedes(input, pri, _best_input, _highest_pri, _pointer,_size )) {
- _highest_pri = pri;
- _best_input = input;
- }
- }
- Arbiter::AddRequest(input, id, pri);
-}
-
-int RoundRobinArbiter::Arbitrate( int* id, int* pri ) {
-
- _selected = _best_input;
-
- return Arbiter::Arbitrate(id, pri);
-}
-
-void RoundRobinArbiter::Clear()
-{
- _highest_pri = numeric_limits<int>::min();
- _best_input = -1;
- Arbiter::Clear();
-}
diff --git a/src/intersim2/.svn/pristine/cb/cb7c673e590ba7e01169bf437b3753f478aa55ac.svn-base b/src/intersim2/.svn/pristine/cb/cb7c673e590ba7e01169bf437b3753f478aa55ac.svn-base
deleted file mode 100644
index 7f6b286..0000000
--- a/src/intersim2/.svn/pristine/cb/cb7c673e590ba7e01169bf437b3753f478aa55ac.svn-base
+++ /dev/null
@@ -1,71 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "buffer_monitor.hpp"
-
-#include "flit.hpp"
-
-BufferMonitor::BufferMonitor( int inputs, int classes )
-: _cycles(0), _inputs(inputs), _classes(classes) {
- _reads.resize(inputs * classes, 0) ;
- _writes.resize(inputs * classes, 0) ;
-}
-
-int BufferMonitor::index( int input, int cl ) const {
- assert((input >= 0) && (input < _inputs));
- assert((cl >= 0) && (cl < _classes));
- return cl + _classes * input ;
-}
-
-void BufferMonitor::cycle() {
- _cycles++ ;
-}
-
-void BufferMonitor::write( int input, Flit const * f ) {
- _writes[ index(input, f->cl) ]++ ;
-}
-
-void BufferMonitor::read( int input, Flit const * f ) {
- _reads[ index(input, f->cl) ]++ ;
-}
-
-void BufferMonitor::display(ostream & os) const {
- for ( int i = 0 ; i < _inputs ; i++ ) {
- os << "[ " << i << " ] " ;
- for ( int c = 0 ; c < _classes ; c++ ) {
- os << "Type=" << c
- << ":(R#" << _reads[ index( i, c) ] << ","
- << "W#" << _writes[ index( i, c) ] << ")" << " " ;
- }
- os << endl ;
- }
-}
-
-ostream & operator<<( ostream & os, BufferMonitor const & obj ) {
- obj.display(os);
- return os ;
-}
diff --git a/src/intersim2/.svn/pristine/cd/cdcc1ba4154908a4bfefe5993832475af05a62e6.svn-base b/src/intersim2/.svn/pristine/cd/cdcc1ba4154908a4bfefe5993832475af05a62e6.svn-base
deleted file mode 100644
index c1983d4..0000000
--- a/src/intersim2/.svn/pristine/cd/cdcc1ba4154908a4bfefe5993832475af05a62e6.svn-base
+++ /dev/null
@@ -1,53 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _GLOBALS_HPP_
-#define _GLOBALS_HPP_
-#include <string>
-#include <vector>
-#include <iostream>
-
-/*all declared in main.cpp*/
-
-int GetSimTime();
-
-class Stats;
-Stats * GetStats(const std::string & name);
-
-extern bool gPrintActivity;
-
-extern int gK;
-extern int gN;
-extern int gC;
-
-extern int gNodes;
-
-extern bool gTrace;
-
-extern std::ostream * gWatchOut;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/ce/ce3f71fc2f0c6cac1246ba0e26b6af41edef501d.svn-base b/src/intersim2/.svn/pristine/ce/ce3f71fc2f0c6cac1246ba0e26b6af41edef501d.svn-base
deleted file mode 100644
index 1894af7..0000000
--- a/src/intersim2/.svn/pristine/ce/ce3f71fc2f0c6cac1246ba0e26b6af41edef501d.svn-base
+++ /dev/null
@@ -1,890 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <cstdlib>
-#include <cassert>
-
-#include "event_router.hpp"
-#include "stats.hpp"
-#include "globals.hpp"
-
-EventRouter::EventRouter( const Configuration& config,
- Module *parent, const string & name, int id,
- int inputs, int outputs )
- : Router( config,
- parent, name,
- id,
- inputs, outputs )
-{
- ostringstream module_name;
-
- _vcs = config.GetInt( "num_vcs" );
-
- // Cut-through mode --- packets are not broken
- // up and input buffers are assumed to be
- // expressed in units of maximum size packets.
-
- _vct = config.GetInt( "vct" );
-
- // Routing
-
- string rf = config.GetStr("routing_function") + "_" + config.GetStr("topology");
- map<string, tRoutingFunction>::iterator rf_iter = gRoutingFunctionMap.find(rf);
- if(rf_iter == gRoutingFunctionMap.end()) {
- Error("Invalid routing function: " + rf);
- }
- _rf = rf_iter->second;
-
- // Alloc VC's
-
- _buf.resize(_inputs);
- _active.resize(_inputs);
-
- for ( int i = 0; i < _inputs; ++i ) {
- module_name << "buf_" << i;
- _buf[i] = new Buffer( config, _outputs, this, module_name.str( ) );
- module_name.seekp( 0, ios::beg );
- _active[i].resize(_vcs, false);
- }
-
- // Alloc next VCs' state
-
- _output_state.resize(_outputs);
-
- for ( int o = 0; o < _outputs; ++o ) {
- module_name << "output" << o << "_vc_state";
- _output_state[o] = new EventNextVCState(config, this, module_name.str());
- module_name.seekp( 0, ios::beg );
- }
-
- // Alloc arbiters
-
- _arrival_arbiter.resize(_outputs);
-
- for ( int o = 0; o < _outputs; ++o ) {
- module_name << "arrival_arb_output" << o;
- _arrival_arbiter[o] =
- new PriorityArbiter( config, this, module_name.str( ), _inputs );
- module_name.seekp( 0, ios::beg );
- }
-
- _transport_arbiter.resize(_inputs);
-
- for ( int i = 0; i < _inputs; ++i ) {
- module_name << "transport_arb_input" << i;
- _transport_arbiter[i] =
- new PriorityArbiter( config, this, module_name.str( ), _outputs );
- module_name.seekp( 0, ios::beg );
- }
-
- // Alloc pipelines (to simulate processing/transmission delays)
-
- _crossbar_pipe =
- new PipelineFIFO<Flit>( this, "crossbar_pipeline", _outputs,
- _crossbar_delay );
-
- _credit_pipe =
- new PipelineFIFO<Credit>( this, "credit_pipeline", _inputs,
- _credit_delay );
-
- _arrival_pipe =
- new PipelineFIFO<tArrivalEvent>( this, "arrival_pipeline", _inputs,
- 0 /* FIX THIS EVENTUALLY */);
-
- // Queues
-
- _input_buffer.resize(_inputs);
- _output_buffer.resize(_outputs);
-
- _in_cred_buffer.resize(_inputs);
- _out_cred_buffer.resize(_outputs);
-
- _arrival_queue.resize(_inputs);
- _transport_queue.resize(_outputs);
-
- // Misc.
-
- _transport_free.resize(_inputs, true);
- _transport_match.resize(_inputs, -1);
-}
-
-EventRouter::~EventRouter( )
-{
- for ( int i = 0; i < _inputs; ++i ) {
- delete _buf[i];
- }
-
- for ( int o = 0; o < _outputs; ++o ) {
- delete _output_state[o];
- }
-
- for ( int o = 0; o < _outputs; ++o ) {
- delete _arrival_arbiter[o];
- }
-
- for ( int i = 0; i < _inputs; ++i ) {
- delete _transport_arbiter[i];
- }
-
- delete _crossbar_pipe;
- delete _credit_pipe;
- delete _arrival_pipe;
-}
-
-void EventRouter::ReadInputs( )
-{
- _ReceiveFlits( );
- _ReceiveCredits( );
-}
-
-void EventRouter::_InternalStep( )
-{
- // Receive incoming flits
- _IncomingFlits( );
-
- // The input pipe simulates routing delay
- _arrival_pipe->Advance( );
-
- // Clear output requests
- for ( int output = 0; output < _outputs; ++output ) {
- _arrival_arbiter[output]->Clear( );
- }
-
- // Check input arrival queues and generate
- // requests for the outputs
- for ( int input = 0; input < _inputs; ++input ) {
- _ArrivalRequests( input );
- }
-
- // Arbitrate between requests at outputs
- for ( int output = 0; output < _outputs; ++output ) {
- _ArrivalArb( output );
- }
-
- for ( int input = 0; input < _inputs; ++input ) {
- _transport_arbiter[input]->Clear( );
- }
-
- _crossbar_pipe->WriteAll( 0 );
- _credit_pipe->WriteAll( 0 );
-
- // Generate transport events and their
- // requests for the inputs
- for ( int output = 0; output < _outputs; ++output ) {
- _TransportRequests( output );
- }
-
- // Arbitrate between requests at inputs
- for ( int input = 0; input < _inputs; ++input ) {
- _TransportArb( input );
- }
-
- _crossbar_pipe->Advance( );
- _credit_pipe->Advance( );
-
- _OutputQueuing( );
-}
-
-void EventRouter::WriteOutputs( )
-{
- _SendFlits( );
- _SendCredits( );
-}
-
-void EventRouter::_ReceiveFlits( )
-{
- Flit *f;
-
- for ( int input = 0; input < _inputs; ++input ) {
- f = _input_channels[input]->Receive();
-
- if ( f ) {
- _input_buffer[input].push( f );
- }
- }
-}
-
-void EventRouter::_ReceiveCredits( )
-{
- Credit *c;
-
- for ( int output = 0; output < _outputs; ++output ) {
- c = _output_credits[output]->Receive();
-
- if ( c ) {
- _out_cred_buffer[output].push( c );
- }
- }
-}
-
-void EventRouter::_ProcessWaiting( int output, int out_vc )
-{
- // out_vc just sent the transport event for out_vc,
- // check if any events are queued on that vc. if so,
- // generate another transport event and set the
- // owner of the vc, otherwise set the vc to idle.
-
- int credits;
-
- tTransportEvent *tevt;
-
- EventNextVCState::tWaiting *w;
-
- if ( _output_state[output]->IsWaiting( out_vc ) ) {
-
- // State remains as busy, but the waiting VC takes over
- w = _output_state[output]->PopWaiting( out_vc );
-
- _output_state[output]->SetState( out_vc, EventNextVCState::busy );
- _output_state[output]->SetInput( out_vc, w->input );
- _output_state[output]->SetInputVC( out_vc, w->vc );
-
- if ( w->watch ) {
- cout << "Dequeuing waiting arrival event at " << FullName()
- << " for flit " << w->id << endl;
- }
-
- credits = _output_state[output]->GetCredits( out_vc );
-
- // Try to queue a transmit event for a waiting packet
- if ( credits > 0 ) {
- tevt = new tTransportEvent;
- tevt->src_vc = w->vc;
- tevt->dst_vc = out_vc;
- tevt->input = w->input;
- tevt->watch = w->watch; // just to have something here
- tevt->id = w->id;
-
- _transport_queue[output].push( tevt );
-
- if ( tevt->watch ) {
- cout << "Injecting transport event at " << FullName()
- << " for flit " << tevt->id << endl;
- }
-
- credits--;
- _output_state[output]->SetCredits( out_vc, credits );
- _output_state[output]->SetPresence( out_vc, w->pres - 1 );
-
- } else {
- // No credits available, just store presence
- _output_state[output]->SetPresence( out_vc, w->pres );
- }
-
- delete w;
-
- } else {
- // Tail sent, none waiting => VC is idle
- _output_state[output]->SetState( out_vc, EventNextVCState::idle );
- }
-}
-
-void EventRouter::_IncomingFlits( )
-{
- Flit *f;
- Buffer *cur_buf;
-
- tArrivalEvent *aevt;
-
- _arrival_pipe->WriteAll( 0 );
-
- for ( int input = 0; input < _inputs; ++input ) {
- if ( !_input_buffer[input].empty( ) ) {
- f = _input_buffer[input].front( );
- _input_buffer[input].pop( );
-
- cur_buf = _buf[input];
- int vc = f->vc;
-
- cur_buf->AddFlit( vc, f );
-
- // Head flit arriving at idle VC
- if ( !_active[input][vc] ) {
-
- if ( !f->head ) {
- cout << "Non-head flit:" << endl;
- cout << *f;
- Error( "Received non-head flit at idle VC" );
- }
-
- const OutputSet *route_set;
- int out_vc, out_port;
-
- cur_buf->Route( vc, _rf, this, f, input );
- route_set = cur_buf->GetRouteSet( vc );
-
- if ( !route_set->GetPortVC( &out_port, &out_vc ) ) {
- Error( "The event-driven router requires routing functions with a single (port,vc) output" );
- }
-
- cur_buf->SetOutput( vc, out_port, out_vc );
- _active[input][vc] = true;
- } else {
- if ( f->head ) {
- cout << *f;
- Error( "Received head flit at non-idle VC." );
- }
- }
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Received flit at " << FullName() << ". Output port = "
- << cur_buf->GetOutputPort( vc ) << ", output VC = "
- << cur_buf->GetOutputVC( vc ) << endl
- << *f;
- }
-
- // In cut-through mode, only head flits generate arrivals,
- // otherwise all flits generate
-
- if ( ( !_vct ) || ( _vct && f->head ) ) {
- // Add the arrival event to a delay pipeline to
- // account for routing/decoding time
-
- aevt = new tArrivalEvent;
-
- aevt->input = input;
- aevt->output = cur_buf->GetOutputPort( vc );
- aevt->src_vc = f->vc;
- aevt->dst_vc = cur_buf->GetOutputVC( vc );
- aevt->head = f->head;
- aevt->tail = f->tail;
-
- //if ( f->head && f->tail ) {
- // Error( "Head/tail packets not supported." );
- //}
-
- aevt->watch = f->watch;
- aevt->id = f->id;
-
- _arrival_pipe->Write( aevt, input );
-
- if ( aevt->watch ) {
- cout << "Injected arrival event at " << FullName()
- << " for flit " << aevt->id << endl;
- }
- }
- }
- }
-}
-
-void EventRouter::_ArrivalRequests( int input )
-{
- tArrivalEvent *aevt;
-
- aevt = _arrival_pipe->Read( input );
- if ( aevt ) {
- _arrival_queue[input].push( aevt );
- }
-
- if ( !_arrival_queue[input].empty( ) ) {
- aevt = _arrival_queue[input].front( );
- _arrival_arbiter[aevt->output]->AddRequest( input );
- }
-}
-
-void EventRouter::_SendTransport( int input, int output, tArrivalEvent *aevt )
-{
- // Try to send a transport event
-
- tTransportEvent *tevt;
-
- int credits;
- int pres;
-
- credits = _output_state[output]->GetCredits( aevt->dst_vc );
-
- if ( credits > 0 ) {
- // Take a credit and queue a transport event
- credits--;
- _output_state[output]->SetCredits( aevt->dst_vc, credits );
-
- tevt = new tTransportEvent;
- tevt->src_vc = aevt->src_vc;
- tevt->dst_vc = aevt->dst_vc;
- tevt->input = input;
- tevt->watch = aevt->watch;
- tevt->id = aevt->id;
-
- _transport_queue[output].push( tevt );
-
- if ( tevt->watch ) {
- cout << "Injecting transport event at " << FullName()
- << " for flit " << tevt->id << endl;
- }
- } else {
- if ( aevt->watch ) {
- cout << "No credits available at " << FullName()
- << " for flit " << aevt->id << " storing presence." << endl;
- }
-
- // No credits available, just store presence
- pres = _output_state[output]->GetPresence( aevt->dst_vc );
- _output_state[output]->SetPresence( aevt->dst_vc, pres + 1 );
- }
-}
-
-void EventRouter::_ArrivalArb( int output )
-{
- tArrivalEvent *aevt;
- tTransportEvent *tevt;
- Credit *c;
-
- EventNextVCState::tWaiting *w;
-
- int input;
- int credits;
- int pres;
-
- // Incoming credits can produce or enable
- // transport events --- process them first
-
- if ( !_out_cred_buffer[output].empty( ) ) {
- c = _out_cred_buffer[output].front( );
- _out_cred_buffer[output].pop( );
-
- assert( c->vc.size() == 1 );
- int vc = *c->vc.begin();
-
- EventNextVCState::eNextVCState state =
- _output_state[output]->GetState( vc );
-
- credits = _output_state[output]->GetCredits( vc );
- pres = _output_state[output]->GetPresence( vc );
-
- if ( _vct ) {
- // In cut-through mode, only head credits indicate a change in
- // channel state.
-
- if ( c->head ) {
- credits++;
- _output_state[output]->SetCredits( vc, credits );
- _ProcessWaiting( output, vc );
- }
- } else {
- credits++;
- _output_state[output]->SetCredits( vc, credits );
-
- if ( c->tail ) { // tail flit -- recycle VC
- if ( state != EventNextVCState::busy ) {
- Error( "Received tail credit at non-busy output VC" );
- }
-
- _ProcessWaiting( output, vc );
- } else if ( ( state == EventNextVCState::busy ) && ( pres > 0 ) ) {
- // Flit is present => generate transport event
-
- tevt = new tTransportEvent;
- tevt->input = _output_state[output]->GetInput( vc );
- tevt->src_vc = _output_state[output]->GetInputVC( vc );
- tevt->dst_vc = vc;
- tevt->watch = false;
- tevt->id = -1;
-
- _transport_queue[output].push( tevt );
-
- pres--;
- credits--;
- _output_state[output]->SetPresence( vc, pres );
- _output_state[output]->SetCredits( vc, credits );
- }
- }
-
- c->Free();
- }
-
- // Now process arrival events
-
- _arrival_arbiter[output]->Arbitrate( );
- input = _arrival_arbiter[output]->Match( );
-
- if ( input != -1 ) {
- // Winning arrival event gets access to output
-
- aevt = _arrival_queue[input].front( );
- _arrival_queue[input].pop( );
-
- if ( aevt->watch ) {
- cout << "Processing arrival event at " << FullName()
- << " for flit " << aevt->id << endl;
- }
-
- EventNextVCState::eNextVCState state =
- _output_state[output]->GetState( aevt->dst_vc );
-
- if ( aevt->head ) { // Head flits
- if ( state == EventNextVCState::idle ) {
- // Allocate the output VC and queue a transport event
- _output_state[output]->SetState( aevt->dst_vc, EventNextVCState::busy );
- _output_state[output]->SetInput( aevt->dst_vc, input );
- _output_state[output]->SetInputVC( aevt->dst_vc, aevt->src_vc );
-
- _SendTransport( input, output, aevt );
- } else {
- // VC busy => queue a waiting event
-
- w = new EventNextVCState::tWaiting;
-
- w->input = input;
- w->vc = aevt->src_vc;
- w->id = aevt->id;
- w->watch = aevt->watch;
- w->pres = 1;
-
- _output_state[output]->PushWaiting( aevt->dst_vc, w );
- }
- } else {
- if ( _vct ) {
- Error( "Received arrival event for non-head flit in cut-through mode" );
- }
-
- if ( state != EventNextVCState::busy ) {
- cout << "flit id = " << aevt->id << endl;
- Error( "Received a body flit at a non-busy output VC" );
- }
-
- if ( ( !_output_state[output]->IsInputWaiting( aevt->dst_vc, input, aevt->src_vc ) ) &&
- ( input == _output_state[output]->GetInput( aevt->dst_vc ) ) &&
- ( aevt->src_vc == _output_state[output]->GetInputVC( aevt->dst_vc ) ) ) {
- // Body flit part of the current active VC => queue transport event
- // (the weird IsInputWaiting call handles a body flit waiting in addition
- // to a head flit)
-
- _SendTransport( input, output, aevt );
- } else {
-
- // VC busy with a differnet transaction => update waiting event
- _output_state[output]->IncrWaiting( aevt->dst_vc, input, aevt->src_vc );
- }
- }
-
- delete aevt;
- }
-}
-
-void EventRouter::_TransportRequests( int output )
-{
- tTransportEvent *tevt;
-
- if ( !_transport_queue[output].empty( ) ) {
- tevt = _transport_queue[output].front( );
- _transport_arbiter[tevt->input]->AddRequest( output );
- }
-}
-
-void EventRouter::_TransportArb( int input )
-{
- tTransportEvent *tevt;
-
- int output;
- Buffer *cur_buf;
- Flit *f;
- Credit *c;
-
- if ( _transport_free[input] ) {
- _transport_arbiter[input]->Arbitrate( );
- output = _transport_arbiter[input]->Match( );
- } else {
- output = _transport_match[input];
- }
-
- if ( output != -1 ) {
- // This completes the match from input to output =>
- // one flit can be transferred
-
- tevt = _transport_queue[output].front( );
-
- if ( tevt->watch ) {
- cout << "Processing transport event at " << FullName()
- << " for flit " << tevt->id << endl;
- }
-
- cur_buf = _buf[input];
- int vc = tevt->src_vc;
-
- // Some sanity checking first
-
- if ( !_active[input][vc] ) {
- Error( "Non-active VC received grant." );
- }
-
- if ( cur_buf->Empty( vc ) ) {
- return; //Error( "Empty VC received grant." );
- }
-
- if ( tevt->dst_vc != cur_buf->GetOutputVC( vc ) ) {
- Error( "Transport event's VC does not match input's destination VC." );
- }
-
- f = cur_buf->RemoveFlit( vc );
-
- if ( _vct ) {
- if ( f->tail ) {
- _transport_free[input] = true;
- _transport_match[input] = -1;
-
- _transport_queue[output].pop( );
- delete tevt;
-
- _active[input][vc] = false;
- } else {
- _transport_free[input] = false;
- _transport_match[input] = output;
- }
- } else {
- _transport_free[input] = true;
- _transport_match[input] = -1;
-
- _transport_queue[output].pop( );
- delete tevt;
-
- if ( f->tail ) {
- _active[input][vc] = false;
- }
- }
-
- c = Credit::New( );
- c->vc.insert(f->vc);
- c->head = f->head;
- c->tail = f->tail;
- c->id = f->id;
- _credit_pipe->Write( c, input );
-
- if ( f->watch && c->tail ) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << FullName() << " sending tail credit back for flit " << f->id << endl;
- }
-
- // Update and forward the flit to the crossbar
-
- f->hops++;
- f->vc = cur_buf->GetOutputVC( vc );
- _crossbar_pipe->Write( f, output );
-
- if ( f->watch ) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Forwarding flit through crossbar at " << FullName() << ":" << endl
- << *f;
- }
- }
-}
-
-void EventRouter::_OutputQueuing( )
-{
- Flit *f;
- Credit *c;
-
- for ( int output = 0; output < _outputs; ++output ) {
- f = _crossbar_pipe->Read( output );
-
- if ( f ) {
- _output_buffer[output].push( f );
- }
- }
-
- for ( int input = 0; input < _inputs; ++input ) {
- c = _credit_pipe->Read( input );
-
- if ( c ) {
- _in_cred_buffer[input].push( c );
- }
- }
-}
-
-void EventRouter::_SendFlits( )
-{
- for ( int output = 0; output < _outputs; ++output ) {
- if ( !_output_buffer[output].empty( ) ) {
- Flit *f = _output_buffer[output].front( );
- _output_buffer[output].pop( );
- _output_channels[output]->Send( f );
- }
- }
-}
-
-void EventRouter::_SendCredits( )
-{
- for ( int input = 0; input < _inputs; ++input ) {
- if ( !_in_cred_buffer[input].empty( ) ) {
- Credit *c = _in_cred_buffer[input].front( );
- _in_cred_buffer[input].pop( );
- _input_credits[input]->Send( c );
- }
- }
-}
-
-void EventRouter::Display( ostream & os ) const
-{
- for ( int input = 0; input < _inputs; ++input ) {
- _buf[input]->Display( os );
- }
-}
-
-EventNextVCState::EventNextVCState( const Configuration& config,
- Module *parent, const string& name ) :
- Module( parent, name )
-{
- _buf_size = config.GetInt( "vc_buf_size" );
- _vcs = config.GetInt( "num_vcs" );
-
- _credits.resize(_vcs, _buf_size);
- _presence.resize(_vcs, 0);
- _input.resize(_vcs);
- _inputVC.resize(_vcs);
- _waiting.resize(_vcs);
- _state.resize(_vcs, idle);
-}
-
-EventNextVCState::eNextVCState EventNextVCState::GetState( int vc ) const
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- return _state[vc];
-}
-
-int EventNextVCState::GetPresence( int vc ) const
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- return _presence[vc];
-}
-
-int EventNextVCState::GetCredits( int vc ) const
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- return _credits[vc];
-}
-
-int EventNextVCState::GetInput( int vc ) const
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- return _input[vc];
-}
-
-int EventNextVCState::GetInputVC( int vc ) const
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- return _inputVC[vc];
-}
-
-bool EventNextVCState::IsWaiting( int vc ) const
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- return !_waiting[vc].empty( );
-}
-
-void EventNextVCState::PushWaiting( int vc, tWaiting *w )
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
-
- if ( w->watch ) {
- cout << FullName() << " pushing flit " << w->id
- << " onto a waiting queue of length " << _waiting[vc].size( ) << endl;
- }
-
- _waiting[vc].push_back( w );
-}
-
-void EventNextVCState::IncrWaiting( int vc, int w_input, int w_vc )
-{
- list<tWaiting *>::iterator match;
-
- // search for match
- for ( match = _waiting[vc].begin( ); match != _waiting[vc].end( ); match++ ) {
- if ( ( (*match)->input == w_input ) &&
- ( (*match)->vc == w_vc ) ) break;
- }
-
- if ( match != _waiting[vc].end( ) ) {
- (*match)->pres++;
- } else {
- Error( "Did not find match in IncrWaiting" );
- }
-}
-
-bool EventNextVCState::IsInputWaiting( int vc, int w_input, int w_vc ) const
-{
- list<tWaiting *>::const_iterator match;
- bool r;
-
- // search for match
- for ( match = _waiting[vc].begin( ); match != _waiting[vc].end( ); match++ ) {
- if ( ( (*match)->input == w_input ) &&
- ( (*match)->vc == w_vc ) ) break;
- }
-
- if ( match != _waiting[vc].end( ) ) {
- r = true;
- } else {
- r = false;
- }
-
- return r;
-}
-
-EventNextVCState::tWaiting *EventNextVCState::PopWaiting( int vc )
-{
- tWaiting *w;
-
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
-
- w = _waiting[vc].front( );
- _waiting[vc].pop_front( );
-
- return w;
-}
-
-void EventNextVCState::SetState( int vc, eNextVCState state )
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- _state[vc] = state;
-}
-
-void EventNextVCState::SetCredits( int vc, int value )
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- _credits[vc] = value;
-}
-
-void EventNextVCState::SetPresence( int vc, int value )
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- _presence[vc] = value;
-}
-
-void EventNextVCState::SetInput( int vc, int input )
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- _input[vc] = input;
-}
-
-void EventNextVCState::SetInputVC( int vc, int in_vc )
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
- _inputVC[vc] = in_vc;
-}
diff --git a/src/intersim2/.svn/pristine/d0/d0f90a9d59a9b0c3aa0cf7a6059e041d762561d1.svn-base b/src/intersim2/.svn/pristine/d0/d0f90a9d59a9b0c3aa0cf7a6059e041d762561d1.svn-base
deleted file mode 100644
index 3e4549a..0000000
--- a/src/intersim2/.svn/pristine/d0/d0f90a9d59a9b0c3aa0cf7a6059e041d762561d1.svn-base
+++ /dev/null
@@ -1,47 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _PIM_HPP_
-#define _PIM_HPP_
-
-#include <vector>
-
-#include "allocator.hpp"
-
-class PIM : public DenseAllocator {
- int _PIM_iter;
-
-public:
- PIM( Module *parent, const string& name,
- int inputs, int outputs, int iters );
-
- ~PIM( );
-
- void Allocate( );
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/d3/d37925d1e5c51c8adc54f266e526d96fd3468e65.svn-base b/src/intersim2/.svn/pristine/d3/d37925d1e5c51c8adc54f266e526d96fd3468e65.svn-base
deleted file mode 100644
index 6fc6ffc..0000000
--- a/src/intersim2/.svn/pristine/d3/d37925d1e5c51c8adc54f266e526d96fd3468e65.svn-base
+++ /dev/null
@@ -1,86 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// Arbiter: Base class for Matrix and Round Robin Arbiter
-//
-// ----------------------------------------------------------------------
-
-#ifndef _ARBITER_HPP_
-#define _ARBITER_HPP_
-
-#include <vector>
-
-#include "module.hpp"
-
-class Arbiter : public Module {
-
-protected:
-
- typedef struct {
- bool valid ;
- int id ;
- int pri ;
- } entry_t ;
-
- vector<entry_t> _request ;
- int _size ;
-
- int _selected ;
- int _highest_pri;
- int _best_input;
-
-public:
- int _num_reqs ;
- // Constructors
- Arbiter( Module *parent, const string &name, int size ) ;
-
- // Print priority matrix to standard output
- virtual void PrintState() const = 0 ;
-
- // Register request with arbiter
- virtual void AddRequest( int input, int id, int pri ) ;
-
- // Update priority matrix based on last aribtration result
- virtual void UpdateState() = 0 ;
-
- // Arbitrate amongst requests. Returns winning input and
- // updates pointers to metadata when valid pointers are passed
- virtual int Arbitrate( int* id = 0, int* pri = 0 ) ;
-
- virtual void Clear();
-
- inline int LastWinner() const {
- return _selected;
- }
-
- static Arbiter *NewArbiter( Module *parent, const string &name,
- const string &arb_type, int size );
-} ;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/d6/d61d8cfbf8e0ae5784d8d94c0bb085d6d1e7b214.svn-base b/src/intersim2/.svn/pristine/d6/d61d8cfbf8e0ae5784d8d94c0bb085d6d1e7b214.svn-base
deleted file mode 100644
index 6d9a906..0000000
--- a/src/intersim2/.svn/pristine/d6/d61d8cfbf8e0ae5784d8d94c0bb085d6d1e7b214.svn-base
+++ /dev/null
@@ -1,60 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _CREDIT_HPP_
-#define _CREDIT_HPP_
-
-#include <set>
-#include <stack>
-
-class Credit {
-
-public:
-
- set<int> vc;
-
- // these are only used by the event router
- bool head, tail;
- int id;
-
- void Reset();
-
- static Credit * New();
- void Free();
- static void FreeAll();
- static int OutStanding();
-private:
-
- static stack<Credit *> _all;
- static stack<Credit *> _free;
-
- Credit();
- ~Credit() {}
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/d8/d829c556dee3dc27d19528e00200847c1b338e0e.svn-base b/src/intersim2/.svn/pristine/d8/d829c556dee3dc27d19528e00200847c1b338e0e.svn-base
deleted file mode 100644
index 377d467..0000000
--- a/src/intersim2/.svn/pristine/d8/d829c556dee3dc27d19528e00200847c1b338e0e.svn-base
+++ /dev/null
@@ -1,37 +0,0 @@
-%{
-
-int yylex(void);
-void yyerror(char * msg);
-void config_assign_string( char const * field, char const * value );
-void config_assign_int( char const * field, int value );
-void config_assign_float( char const * field, double value );
-
-#ifdef _WIN32
-#pragma warning ( disable : 4102 )
-#pragma warning ( disable : 4244 )
-#endif
-
-%}
-
-%union {
- char *name;
- int num;
- double fnum;
-}
-
-%token <name> STR
-%token <num> NUM
-%token <fnum> FNUM
-
-%%
-
-commands : commands command
- | command
-;
-
-command : STR '=' STR ';' { config_assign_string( $1, $3 ); free( $1 ); free( $3 ); }
- | STR '=' NUM ';' { config_assign_int( $1, $3 ); free( $1 ); }
- | STR '=' FNUM ';' { config_assign_float( $1, $3 ); free( $1 ); }
-;
-
-%%
diff --git a/src/intersim2/.svn/pristine/da/dace18d8332403831e17e47c9f2dac7ee20fe786.svn-base b/src/intersim2/.svn/pristine/da/dace18d8332403831e17e47c9f2dac7ee20fe786.svn-base
deleted file mode 100644
index eba0184..0000000
--- a/src/intersim2/.svn/pristine/da/dace18d8332403831e17e47c9f2dac7ee20fe786.svn-base
+++ /dev/null
@@ -1,125 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-//////////////////////////////////////////////////////////////////////
-//
-// File Name: channel.hpp
-//
-// The Channel models a generic channel with a multi-cycle
-// transmission delay. The channel latency can be specified as
-// an integer number of simulator cycles.
-//
-/////
-#ifndef _CHANNEL_HPP
-#define _CHANNEL_HPP
-
-#include <queue>
-#include <cassert>
-
-#include "globals.hpp"
-#include "module.hpp"
-#include "timed_module.hpp"
-
-using namespace std;
-
-template<typename T>
-class Channel : public TimedModule {
-public:
- Channel(Module * parent, string const & name);
- virtual ~Channel() {}
-
- // Physical Parameters
- void SetLatency(int cycles);
- int GetLatency() const { return _delay ; }
-
- // Send data
- virtual void Send(T * data);
-
- // Receive data
- virtual T * Receive();
-
- virtual void ReadInputs();
- virtual void Evaluate() {}
- virtual void WriteOutputs();
-
-protected:
- int _delay;
- T * _input;
- T * _output;
- queue<pair<int, T *> > _wait_queue;
-
-};
-
-template<typename T>
-Channel<T>::Channel(Module * parent, string const & name)
- : TimedModule(parent, name), _delay(1), _input(0), _output(0) {
-}
-
-template<typename T>
-void Channel<T>::SetLatency(int cycles) {
- if(cycles <= 0) {
- Error("Channel must have positive delay.");
- }
- _delay = cycles ;
-}
-
-template<typename T>
-void Channel<T>::Send(T * data) {
- _input = data;
-}
-
-template<typename T>
-T * Channel<T>::Receive() {
- return _output;
-}
-
-template<typename T>
-void Channel<T>::ReadInputs() {
- if(_input) {
- _wait_queue.push(make_pair(GetSimTime() + _delay - 1, _input));
- _input = 0;
- }
-}
-
-template<typename T>
-void Channel<T>::WriteOutputs() {
- _output = 0;
- if(_wait_queue.empty()) {
- return;
- }
- pair<int, T *> const & item = _wait_queue.front();
- int const & time = item.first;
- if(GetSimTime() < time) {
- return;
- }
- assert(GetSimTime() == time);
- _output = item.second;
- assert(_output);
- _wait_queue.pop();
-}
-
-#endif
diff --git a/src/intersim2/.svn/pristine/de/de391802bf06c5a01ef346b8b98d27244c296855.svn-base b/src/intersim2/.svn/pristine/de/de391802bf06c5a01ef346b8b98d27244c296855.svn-base
deleted file mode 100644
index 08bb021..0000000
--- a/src/intersim2/.svn/pristine/de/de391802bf06c5a01ef346b8b98d27244c296855.svn-base
+++ /dev/null
@@ -1,856 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// ----------------------------------------------------------------------
-//
-// CMesh: Network with <Int> Terminal Nodes arranged in a concentrated
-// mesh topology
-//
-// ----------------------------------------------------------------------
-
-// ----------------------------------------------------------------------
-// $Author: jbalfour $
-// $Date: 2007/06/28 17:24:35 $
-// $Id$
-// Modified 11/6/2007 by Ted Jiang
-// Now handeling n = most power of 2: 16, 64, 256, 1024
-// ----------------------------------------------------------------------
-#include "booksim.hpp"
-#include <vector>
-#include <sstream>
-#include <cassert>
-#include "random_utils.hpp"
-#include "misc_utils.hpp"
-#include "cmesh.hpp"
-
-int CMesh::_cX = 0 ;
-int CMesh::_cY = 0 ;
-int CMesh::_memo_NodeShiftX = 0 ;
-int CMesh::_memo_NodeShiftY = 0 ;
-int CMesh::_memo_PortShiftY = 0 ;
-
-CMesh::CMesh( const Configuration& config, const string & name )
- : Network(config, name)
-{
- _ComputeSize( config );
- _Alloc();
- _BuildNet(config);
-}
-
-void CMesh::RegisterRoutingFunctions() {
- gRoutingFunctionMap["dor_cmesh"] = &dor_cmesh;
- gRoutingFunctionMap["dor_no_express_cmesh"] = &dor_no_express_cmesh;
- gRoutingFunctionMap["xy_yx_cmesh"] = &xy_yx_cmesh;
- gRoutingFunctionMap["xy_yx_no_express_cmesh"] = &xy_yx_no_express_cmesh;
-}
-
-void CMesh::_ComputeSize( const Configuration &config ) {
-
- int k = config.GetInt( "k" );
- int n = config.GetInt( "n" );
- assert(n <= 2); // broken for n > 2
- int c = config.GetInt( "c" );
- assert(c == 4); // broken for c != 4
-
- ostringstream router_name;
- //how many routers in the x or y direction
- _xcount = config.GetInt("x");
- _ycount = config.GetInt("y");
- assert(_xcount == _ycount); // broken for asymmetric topologies
- //configuration of hohw many clients in X and Y per router
- _xrouter = config.GetInt("xr");
- _yrouter = config.GetInt("yr");
- assert(_xrouter == _yrouter); // broken for asymmetric concentration
-
- gK = _k = k ;
- gN = _n = n ;
- gC = _c = c ;
-
- assert(c == _xrouter*_yrouter);
-
- _nodes = _c * powi( _k, _n); // Number of nodes in network
- _size = powi( _k, _n); // Number of routers in network
- _channels = 2 * _n * _size; // Number of channels in network
-
- _cX = _c / _n ; // Concentration in X Dimension
- _cY = _c / _cX ; // Concentration in Y Dimension
-
- //
- _memo_NodeShiftX = _cX >> 1 ;
- _memo_NodeShiftY = log_two(gK * _cX) + ( _cY >> 1 ) ;
- _memo_PortShiftY = log_two(gK * _cX) ;
-
-}
-
-void CMesh::_BuildNet( const Configuration& config ) {
-
- int x_index ;
- int y_index ;
-
- //standard trace configuration
- if(gTrace){
- cout<<"Setup Finished Router"<<endl;
- }
-
- //latency type, noc or conventional network
- bool use_noc_latency;
- use_noc_latency = (config.GetInt("use_noc_latency")==1);
-
- ostringstream name;
- // The following vector is used to check that every
- // processor in the system is connected to the network
- vector<bool> channel_vector(_nodes, false) ;
-
- //
- // Routers and Channel
- //
- for (int node = 0; node < _size; ++node) {
-
- // Router index derived from mesh index
- y_index = node / _k ;
- x_index = node % _k ;
-
- const int degree_in = 2 *_n + _c ;
- const int degree_out = 2 *_n + _c ;
-
- name << "router_" << y_index << '_' << x_index;
- _routers[node] = Router::NewRouter( config,
- this,
- name.str(),
- node,
- degree_in,
- degree_out);
- _timed_modules.push_back(_routers[node]);
- name.str("");
-
- //
- // Port Numbering: as best as I can determine, the order in
- // which the input and output channels are added to the
- // router determines the associated port number that must be
- // used by the router. Output port number increases with
- // each new channel
- //
-
- //
- // Processing node channels
- //
- for (int y = 0; y < _cY ; y++) {
- for (int x = 0; x < _cX ; x++) {
- int link = (_k * _cX) * (_cY * y_index + y) + (_cX * x_index + x) ;
- assert( link >= 0 ) ;
- assert( link < _nodes ) ;
- assert( channel_vector[ link ] == false ) ;
- channel_vector[link] = true ;
- // Ingress Ports
- _routers[node]->AddInputChannel(_inject[link], _inject_cred[link]);
- // Egress Ports
- _routers[node]->AddOutputChannel(_eject[link], _eject_cred[link]);
- //injeciton ejection latency is 1
- _inject[link]->SetLatency( 1 );
- _eject[link]->SetLatency( 1 );
- }
- }
-
- //
- // router to router channels
- //
- const int x = node % _k ;
- const int y = node / _k ;
- const int offset = powi( _k, _n ) ;
-
- //the channel number of the input output channels.
- int px_out = _k * y + x + 0 * offset ;
- int nx_out = _k * y + x + 1 * offset ;
- int py_out = _k * y + x + 2 * offset ;
- int ny_out = _k * y + x + 3 * offset ;
- int px_in = _k * y + ((x+1)) + 1 * offset ;
- int nx_in = _k * y + ((x-1)) + 0 * offset ;
- int py_in = _k * ((y+1)) + x + 3 * offset ;
- int ny_in = _k * ((y-1)) + x + 2 * offset ;
-
- // Express Channels
- if (x == 0){
- // Router on left edge of mesh. Connect to -x output of
- // another router on the left edge of the mesh.
- if (y < _k / 2 )
- nx_in = _k * (y + _k/2) + x + offset ;
- else
- nx_in = _k * (y - _k/2) + x + offset ;
- }
-
- if (x == (_k-1)){
- // Router on right edge of mesh. Connect to +x output of
- // another router on the right edge of the mesh.
- if (y < _k / 2)
- px_in = _k * (y + _k/2) + x ;
- else
- px_in = _k * (y - _k/2) + x ;
- }
-
- if (y == 0) {
- // Router on bottom edge of mesh. Connect to -y output of
- // another router on the bottom edge of the mesh.
- if (x < _k / 2)
- ny_in = _k * y + (x + _k/2) + 3 * offset ;
- else
- ny_in = _k * y + (x - _k/2) + 3 * offset ;
- }
-
- if (y == (_k-1)) {
- // Router on top edge of mesh. Connect to +y output of
- // another router on the top edge of the mesh
- if (x < _k / 2)
- py_in = _k * y + (x + _k/2) + 2 * offset ;
- else
- py_in = _k * y + (x - _k/2) + 2 * offset ;
- }
-
- /*set latency and add the channels*/
-
- // Port 0: +x channel
- if(use_noc_latency) {
- int const px_latency = (x == _k-1) ? (_cY*_k/2) : _cX;
- _chan[px_out]->SetLatency( px_latency );
- _chan_cred[px_out]->SetLatency( px_latency );
- } else {
- _chan[px_out]->SetLatency( 1 );
- _chan_cred[px_out]->SetLatency( 1 );
- }
- _routers[node]->AddOutputChannel( _chan[px_out], _chan_cred[px_out] );
- _routers[node]->AddInputChannel( _chan[px_in], _chan_cred[px_in] );
-
- if(gTrace) {
- cout<<"Link "<<" "<<px_out<<" "<<px_in<<" "<<node<<" "<<_chan[px_out]->GetLatency()<<endl;
- }
-
- // Port 1: -x channel
- if(use_noc_latency) {
- int const nx_latency = (x == 0) ? (_cY*_k/2) : _cX;
- _chan[nx_out]->SetLatency( nx_latency );
- _chan_cred[nx_out]->SetLatency( nx_latency );
- } else {
- _chan[nx_out]->SetLatency( 1 );
- _chan_cred[nx_out]->SetLatency( 1 );
- }
- _routers[node]->AddOutputChannel( _chan[nx_out], _chan_cred[nx_out] );
- _routers[node]->AddInputChannel( _chan[nx_in], _chan_cred[nx_in] );
-
- if(gTrace){
- cout<<"Link "<<" "<<nx_out<<" "<<nx_in<<" "<<node<<" "<<_chan[nx_out]->GetLatency()<<endl;
- }
-
- // Port 2: +y channel
- if(use_noc_latency) {
- int const py_latency = (y == _k-1) ? (_cX*_k/2) : _cY;
- _chan[py_out]->SetLatency( py_latency );
- _chan_cred[py_out]->SetLatency( py_latency );
- } else {
- _chan[py_out]->SetLatency( 1 );
- _chan_cred[py_out]->SetLatency( 1 );
- }
- _routers[node]->AddOutputChannel( _chan[py_out], _chan_cred[py_out] );
- _routers[node]->AddInputChannel( _chan[py_in], _chan_cred[py_in] );
-
- if(gTrace){
- cout<<"Link "<<" "<<py_out<<" "<<py_in<<" "<<node<<" "<<_chan[py_out]->GetLatency()<<endl;
- }
-
- // Port 3: -y channel
- if(use_noc_latency){
- int const ny_latency = (y == 0) ? (_cX*_k/2) : _cY;
- _chan[ny_out]->SetLatency( ny_latency );
- _chan_cred[ny_out]->SetLatency( ny_latency );
- } else {
- _chan[ny_out]->SetLatency( 1 );
- _chan_cred[ny_out]->SetLatency( 1 );
- }
- _routers[node]->AddOutputChannel( _chan[ny_out], _chan_cred[ny_out] );
- _routers[node]->AddInputChannel( _chan[ny_in], _chan_cred[ny_in] );
-
- if(gTrace){
- cout<<"Link "<<" "<<ny_out<<" "<<ny_in<<" "<<node<<" "<<_chan[ny_out]->GetLatency()<<endl;
- }
-
- }
-
- // Check that all processors were connected to the network
- for ( int i = 0 ; i < _nodes ; i++ )
- assert( channel_vector[i] == true ) ;
-
- if(gTrace){
- cout<<"Setup Finished Link"<<endl;
- }
-}
-
-
-// ----------------------------------------------------------------------
-//
-// Routing Helper Functions
-//
-// ----------------------------------------------------------------------
-
-int CMesh::NodeToRouter( int address ) {
-
- int y = (address / (_cX*gK))/_cY ;
- int x = (address % (_cX*gK))/_cY ;
- int router = y*gK + x ;
-
- return router ;
-}
-
-int CMesh::NodeToPort( int address ) {
-
- const int maskX = _cX - 1 ;
- const int maskY = _cY - 1 ;
-
- int x = address & maskX ;
- int y = (int)(address/(2*gK)) & maskY ;
-
- return (gC / 2) * y + x;
-}
-
-// ----------------------------------------------------------------------
-//
-// Routing Functions
-//
-// ----------------------------------------------------------------------
-
-// Concentrated Mesh: X-Y
-int cmesh_xy( int cur, int dest ) {
-
- const int POSITIVE_X = 0 ;
- const int NEGATIVE_X = 1 ;
- const int POSITIVE_Y = 2 ;
- const int NEGATIVE_Y = 3 ;
-
- int cur_y = cur / gK;
- int cur_x = cur % gK;
- int dest_y = dest / gK;
- int dest_x = dest % gK;
-
- // Dimension-order Routing: x , y
- if (cur_x < dest_x) {
- // Express?
- if ((dest_x - cur_x) > 1){
- if (cur_y == 0)
- return gC + NEGATIVE_Y ;
- if (cur_y == (gK-1))
- return gC + POSITIVE_Y ;
- }
- return gC + POSITIVE_X ;
- }
- if (cur_x > dest_x) {
- // Express ?
- if ((cur_x - dest_x) > 1){
- if (cur_y == 0)
- return gC + NEGATIVE_Y ;
- if (cur_y == (gK-1))
- return gC + POSITIVE_Y ;
- }
- return gC + NEGATIVE_X ;
- }
- if (cur_y < dest_y) {
- // Express?
- if ((dest_y - cur_y) > 1) {
- if (cur_x == 0)
- return gC + NEGATIVE_X ;
- if (cur_x == (gK-1))
- return gC + POSITIVE_X ;
- }
- return gC + POSITIVE_Y ;
- }
- if (cur_y > dest_y) {
- // Express ?
- if ((cur_y - dest_y) > 1 ){
- if (cur_x == 0)
- return gC + NEGATIVE_X ;
- if (cur_x == (gK-1))
- return gC + POSITIVE_X ;
- }
- return gC + NEGATIVE_Y ;
- }
- return 0;
-}
-
-// Concentrated Mesh: Y-X
-int cmesh_yx( int cur, int dest ) {
- const int POSITIVE_X = 0 ;
- const int NEGATIVE_X = 1 ;
- const int POSITIVE_Y = 2 ;
- const int NEGATIVE_Y = 3 ;
-
- int cur_y = cur / gK ;
- int cur_x = cur % gK ;
- int dest_y = dest / gK ;
- int dest_x = dest % gK ;
-
- // Dimension-order Routing: y, x
- if (cur_y < dest_y) {
- // Express?
- if ((dest_y - cur_y) > 1) {
- if (cur_x == 0)
- return gC + NEGATIVE_X ;
- if (cur_x == (gK-1))
- return gC + POSITIVE_X ;
- }
- return gC + POSITIVE_Y ;
- }
- if (cur_y > dest_y) {
- // Express ?
- if ((cur_y - dest_y) > 1 ){
- if (cur_x == 0)
- return gC + NEGATIVE_X ;
- if (cur_x == (gK-1))
- return gC + POSITIVE_X ;
- }
- return gC + NEGATIVE_Y ;
- }
- if (cur_x < dest_x) {
- // Express?
- if ((dest_x - cur_x) > 1){
- if (cur_y == 0)
- return gC + NEGATIVE_Y ;
- if (cur_y == (gK-1))
- return gC + POSITIVE_Y ;
- }
- return gC + POSITIVE_X ;
- }
- if (cur_x > dest_x) {
- // Express ?
- if ((cur_x - dest_x) > 1){
- if (cur_y == 0)
- return gC + NEGATIVE_Y ;
- if (cur_y == (gK-1))
- return gC + POSITIVE_Y ;
- }
- return gC + NEGATIVE_X ;
- }
- return 0;
-}
-
-void xy_yx_cmesh( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
-
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- // Current Router
- int cur_router = r->GetID();
-
- // Destination Router
- int dest_router = CMesh::NodeToRouter( f->dest ) ;
-
- if (dest_router == cur_router) {
-
- // Forward to processing element
- out_port = CMesh::NodeToPort( f->dest );
-
- } else {
-
- // Forward to neighbouring router
-
- //each class must have at least 2 vcs assigned or else xy_yx will deadlock
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- // randomly select dimension order at first hop
- bool x_then_y = ((in_channel < gC) ?
- (RandomInt(1) > 0) :
- (f->vc < (vcBegin + available_vcs)));
-
- if(x_then_y) {
- out_port = cmesh_xy( cur_router, dest_router );
- vcEnd -= available_vcs;
- } else {
- out_port = cmesh_yx( cur_router, dest_router );
- vcBegin += available_vcs;
- }
- }
-
- }
-
- outputs->Clear();
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-
-// ----------------------------------------------------------------------
-//
-// Concentrated Mesh: Random XY-YX w/o Express Links
-//
-// <int> cur: current router address
-/// <int> dest: destination router address
-//
-// ----------------------------------------------------------------------
-
-int cmesh_xy_no_express( int cur, int dest ) {
-
- const int POSITIVE_X = 0 ;
- const int NEGATIVE_X = 1 ;
- const int POSITIVE_Y = 2 ;
- const int NEGATIVE_Y = 3 ;
-
- const int cur_y = cur / gK ;
- const int cur_x = cur % gK ;
- const int dest_y = dest / gK ;
- const int dest_x = dest % gK ;
-
-
- // Note: channel numbers bellow gC (degree of concentration) are
- // injection and ejection links
-
- // Dimension-order Routing: X , Y
- if (cur_x < dest_x) {
- return gC + POSITIVE_X ;
- }
- if (cur_x > dest_x) {
- return gC + NEGATIVE_X ;
- }
- if (cur_y < dest_y) {
- return gC + POSITIVE_Y ;
- }
- if (cur_y > dest_y) {
- return gC + NEGATIVE_Y ;
- }
- return 0;
-}
-
-int cmesh_yx_no_express( int cur, int dest ) {
-
- const int POSITIVE_X = 0 ;
- const int NEGATIVE_X = 1 ;
- const int POSITIVE_Y = 2 ;
- const int NEGATIVE_Y = 3 ;
-
- const int cur_y = cur / gK ;
- const int cur_x = cur % gK ;
- const int dest_y = dest / gK ;
- const int dest_x = dest % gK ;
-
- // Note: channel numbers bellow gC (degree of concentration) are
- // injection and ejection links
-
- // Dimension-order Routing: X , Y
- if (cur_y < dest_y) {
- return gC + POSITIVE_Y ;
- }
- if (cur_y > dest_y) {
- return gC + NEGATIVE_Y ;
- }
- if (cur_x < dest_x) {
- return gC + POSITIVE_X ;
- }
- if (cur_x > dest_x) {
- return gC + NEGATIVE_X ;
- }
- return 0;
-}
-
-void xy_yx_no_express_cmesh( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- // Current Router
- int cur_router = r->GetID();
-
- // Destination Router
- int dest_router = CMesh::NodeToRouter( f->dest );
-
- if (dest_router == cur_router) {
-
- // Forward to processing element
- out_port = CMesh::NodeToPort( f->dest );
-
- } else {
-
- // Forward to neighbouring router
-
- //each class must have at least 2 vcs assigned or else xy_yx will deadlock
- int const available_vcs = (vcEnd - vcBegin + 1) / 2;
- assert(available_vcs > 0);
-
- // randomly select dimension order at first hop
- bool x_then_y = ((in_channel < gC) ?
- (RandomInt(1) > 0) :
- (f->vc < (vcBegin + available_vcs)));
-
- if(x_then_y) {
- out_port = cmesh_xy_no_express( cur_router, dest_router );
- vcEnd -= available_vcs;
- } else {
- out_port = cmesh_yx_no_express( cur_router, dest_router );
- vcBegin += available_vcs;
- }
- }
- }
-
- outputs->Clear();
-
- outputs->AddRange( out_port , vcBegin, vcEnd );
-}
-//============================================================
-//
-//=====
-int cmesh_next( int cur, int dest ) {
-
- const int POSITIVE_X = 0 ;
- const int NEGATIVE_X = 1 ;
- const int POSITIVE_Y = 2 ;
- const int NEGATIVE_Y = 3 ;
-
- int cur_y = cur / gK ;
- int cur_x = cur % gK ;
- int dest_y = dest / gK ;
- int dest_x = dest % gK ;
-
- // Dimension-order Routing: x , y
- if (cur_x < dest_x) {
- // Express?
- if ((dest_x - cur_x) > gK/2-1){
- if (cur_y == 0)
- return gC + NEGATIVE_Y ;
- if (cur_y == (gK-1))
- return gC + POSITIVE_Y ;
- }
- return gC + POSITIVE_X ;
- }
- if (cur_x > dest_x) {
- // Express ?
- if ((cur_x - dest_x) > gK/2-1){
- if (cur_y == 0)
- return gC + NEGATIVE_Y ;
- if (cur_y == (gK-1))
- return gC + POSITIVE_Y ;
- }
- return gC + NEGATIVE_X ;
- }
- if (cur_y < dest_y) {
- // Express?
- if ((dest_y - cur_y) > gK/2-1) {
- if (cur_x == 0)
- return gC + NEGATIVE_X ;
- if (cur_x == (gK-1))
- return gC + POSITIVE_X ;
- }
- return gC + POSITIVE_Y ;
- }
- if (cur_y > dest_y) {
- // Express ?
- if ((cur_y - dest_y) > gK/2-1){
- if (cur_x == 0)
- return gC + NEGATIVE_X ;
- if (cur_x == (gK-1))
- return gC + POSITIVE_X ;
- }
- return gC + NEGATIVE_Y ;
- }
-
- assert(false);
- return -1;
-}
-
-void dor_cmesh( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- // Current Router
- int cur_router = r->GetID();
-
- // Destination Router
- int dest_router = CMesh::NodeToRouter( f->dest ) ;
-
- if (dest_router == cur_router) {
-
- // Forward to processing element
- out_port = CMesh::NodeToPort( f->dest ) ;
-
- } else {
-
- // Forward to neighbouring router
- out_port = cmesh_next( cur_router, dest_router );
- }
- }
-
- outputs->Clear();
-
- outputs->AddRange( out_port, vcBegin, vcEnd);
-}
-
-//============================================================
-//
-//=====
-int cmesh_next_no_express( int cur, int dest ) {
-
- const int POSITIVE_X = 0 ;
- const int NEGATIVE_X = 1 ;
- const int POSITIVE_Y = 2 ;
- const int NEGATIVE_Y = 3 ;
-
- //magic constant 2, which is supose to be _cX and _cY
- int cur_y = cur/gK ;
- int cur_x = cur%gK ;
- int dest_y = dest/gK;
- int dest_x = dest%gK ;
-
- // Dimension-order Routing: x , y
- if (cur_x < dest_x) {
- return gC + POSITIVE_X ;
- }
- if (cur_x > dest_x) {
- return gC + NEGATIVE_X ;
- }
- if (cur_y < dest_y) {
- return gC + POSITIVE_Y ;
- }
- if (cur_y > dest_y) {
- return gC + NEGATIVE_Y ;
- }
- assert(false);
- return -1;
-}
-
-void dor_no_express_cmesh( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject )
-{
- // ( Traffic Class , Routing Order ) -> Virtual Channel Range
- int vcBegin = 0, vcEnd = gNumVCs-1;
- if ( f->type == Flit::READ_REQUEST ) {
- vcBegin = gReadReqBeginVC;
- vcEnd = gReadReqEndVC;
- } else if ( f->type == Flit::WRITE_REQUEST ) {
- vcBegin = gWriteReqBeginVC;
- vcEnd = gWriteReqEndVC;
- } else if ( f->type == Flit::READ_REPLY ) {
- vcBegin = gReadReplyBeginVC;
- vcEnd = gReadReplyEndVC;
- } else if ( f->type == Flit::WRITE_REPLY ) {
- vcBegin = gWriteReplyBeginVC;
- vcEnd = gWriteReplyEndVC;
- }
- assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0)));
-
- int out_port;
-
- if(inject) {
-
- out_port = -1;
-
- } else {
-
- // Current Router
- int cur_router = r->GetID();
-
- // Destination Router
- int dest_router = CMesh::NodeToRouter( f->dest ) ;
-
- if (dest_router == cur_router) {
-
- // Forward to processing element
- out_port = CMesh::NodeToPort( f->dest );
-
- } else {
-
- // Forward to neighbouring router
- out_port = cmesh_next_no_express( cur_router, dest_router );
- }
- }
-
- outputs->Clear();
-
- outputs->AddRange( out_port, vcBegin, vcEnd );
-}
diff --git a/src/intersim2/.svn/pristine/e0/e0e6b10f519b612fdd24fcc64ea62b4d5fdf89fc.svn-base b/src/intersim2/.svn/pristine/e0/e0e6b10f519b612fdd24fcc64ea62b4d5fdf89fc.svn-base
deleted file mode 100644
index 02228ef..0000000
--- a/src/intersim2/.svn/pristine/e0/e0e6b10f519b612fdd24fcc64ea62b4d5fdf89fc.svn-base
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-
-
-#ifndef _DragonFly_HPP_
-#define _DragonFly_HPP_
-
-#include "network.hpp"
-#include "routefunc.hpp"
-
-class DragonFlyNew : public Network {
-
- int _m;
- int _n;
- int _r;
- int _k;
- int _p, _a, _g;
- int _radix;
- int _net_size;
- int _stageout;
- int _numinput;
- int _stages;
- int _num_of_switch;
- int _grp_num_routers;
- int _grp_num_nodes;
-
-
- void _ComputeSize( const Configuration &config );
- void _BuildNet( const Configuration &config );
-
-
-
-public:
- DragonFlyNew( const Configuration &config, const string & name );
-
- int GetN( ) const;
- int GetK( ) const;
-
- double Capacity( ) const;
- static void RegisterRoutingFunctions();
- void InsertRandomFaults( const Configuration &config );
-
-};
-int dragonfly_port(int rID, int source, int dest);
-
-void ugal_dragonflynew( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-void min_dragonflynew( const Router *r, const Flit *f, int in_channel,
- OutputSet *outputs, bool inject );
-
-#endif
diff --git a/src/intersim2/.svn/pristine/e2/e216ca41a2789704029b85d462988590d43813f3.svn-base b/src/intersim2/.svn/pristine/e2/e216ca41a2789704029b85d462988590d43813f3.svn-base
deleted file mode 100644
index c27740f..0000000
--- a/src/intersim2/.svn/pristine/e2/e216ca41a2789704029b85d462988590d43813f3.svn-base
+++ /dev/null
@@ -1,108 +0,0 @@
-/* This program by D E Knuth is in the public domain and freely copyable.
- * It is explained in Seminumerical Algorithms, 3rd edition, Section 3.6
- * (or in the errata to the 2nd edition --- see
- * http://www-cs-faculty.stanford.edu/~knuth/taocp.html
- * in the changes to Volume 2 on pages 171 and following). */
-
-/* N.B. The MODIFICATIONS introduced in the 9th printing (2002) are
- included here; there's no backwards compatibility with the original. */
-
-/* This version also adopts Brendan McKay's suggestion to
- accommodate naive users who forget to call ran_start(seed). */
-
-/* If you find any bugs, please report them immediately to
- * (and you will be rewarded if the bug is genuine). Thanks! */
-
-/************ see the book for explanations and caveats! *******************/
-/************ in particular, you need two's complement arithmetic **********/
-
-#define KK 100 /* the long lag */
-#define LL 37 /* the short lag */
-#define MM (1L<<30) /* the modulus */
-#define mod_diff(x,y) (((x)-(y))&(MM-1)) /* subtraction mod MM */
-
-long ran_x[KK]; /* the generator state */
-
-#ifdef __STDC__
-void ran_array(long aa[],int n)
-#else
-void ran_array(aa,n) /* put n new random numbers in aa */
- long *aa; /* destination */
- int n; /* array length (must be at least KK) */
-#endif
-{
- register int i,j;
- for (j=0;j<KK;j++) aa[j]=ran_x[j];
- for (;j<n;j++) aa[j]=mod_diff(aa[j-KK],aa[j-LL]);
- for (i=0;i<LL;i++,j++) ran_x[i]=mod_diff(aa[j-KK],aa[j-LL]);
- for (;i<KK;i++,j++) ran_x[i]=mod_diff(aa[j-KK],ran_x[i-LL]);
-}
-
-/* the following routines are from exercise 3.6--15 */
-/* after calling ran_start, get new randoms by, e.g., "x=ran_arr_next()" */
-
-#define QUALITY 1009 /* recommended quality level for high-res use */
-long ran_arr_buf[QUALITY];
-long ran_arr_dummy=-1, ran_arr_started=-1;
-long *ran_arr_ptr=&ran_arr_dummy; /* the next random number, or -1 */
-
-#define TT 70 /* guaranteed separation between streams */
-#define is_odd(x) ((x)&1) /* units bit of x */
-
-#ifdef __STDC__
-void ran_start(long seed)
-#else
-void ran_start(seed) /* do this before using ran_array */
- long seed; /* selector for different streams */
-#endif
-{
- register int t,j;
- long x[KK+KK-1]; /* the preparation buffer */
- register long ss=(seed+2)&(MM-2);
- for (j=0;j<KK;j++) {
- x[j]=ss; /* bootstrap the buffer */
- ss<<=1; if (ss>=MM) ss-=MM-2; /* cyclic shift 29 bits */
- }
- x[1]++; /* make x[1] (and only x[1]) odd */
- for (ss=seed&(MM-1),t=TT-1; t; ) {
- for (j=KK-1;j>0;j--) x[j+j]=x[j], x[j+j-1]=0; /* "square" */
- for (j=KK+KK-2;j>=KK;j--)
- x[j-(KK-LL)]=mod_diff(x[j-(KK-LL)],x[j]),
- x[j-KK]=mod_diff(x[j-KK],x[j]);
- if (is_odd(ss)) { /* "multiply by z" */
- for (j=KK;j>0;j--) x[j]=x[j-1];
- x[0]=x[KK]; /* shift the buffer cyclically */
- x[LL]=mod_diff(x[LL],x[KK]);
- }
- if (ss) ss>>=1; else t--;
- }
- for (j=0;j<LL;j++) ran_x[j+KK-LL]=x[j];
- for (;j<KK;j++) ran_x[j-LL]=x[j];
- for (j=0;j<10;j++) ran_array(x,KK+KK-1); /* warm things up */
- ran_arr_ptr=&ran_arr_started;
-}
-
-#define ran_arr_next() (*ran_arr_ptr>=0? *ran_arr_ptr++: ran_arr_cycle())
-long ran_arr_cycle()
-{
- if (ran_arr_ptr==&ran_arr_dummy)
- ran_start(314159L); /* the user forgot to initialize */
- ran_array(ran_arr_buf,QUALITY);
- ran_arr_buf[KK]=-1;
- ran_arr_ptr=ran_arr_buf+1;
- return ran_arr_buf[0];
-}
-
-#include <stdio.h>
-int main()
-{
- register int m; long a[2009];
- ran_start(310952L);
- for (m=0;m<=2009;m++) ran_array(a,1009);
- printf("%ld\n", a[0]); /* 995235265 */
- ran_start(310952L);
- for (m=0;m<=1009;m++) ran_array(a,2009);
- printf("%ld\n", a[0]); /* 995235265 */
- return 0;
-}
diff --git a/src/intersim2/.svn/pristine/e3/e3245c11796bcda90ba6909bb34dced14101b2c3.svn-base b/src/intersim2/.svn/pristine/e3/e3245c11796bcda90ba6909bb34dced14101b2c3.svn-base
deleted file mode 100644
index e6f382c..0000000
--- a/src/intersim2/.svn/pristine/e3/e3245c11796bcda90ba6909bb34dced14101b2c3.svn-base
+++ /dev/null
@@ -1,346 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*booksim_config.cpp
- *
- *Contains all the configurable parameters in a network
- *
- */
-
-
-#include "booksim.hpp"
-#include "booksim_config.hpp"
-
-BookSimConfig::BookSimConfig( )
-{
- //========================================================
- // Network options
- //========================================================
-
- // Channel length listing file
- AddStrField( "channel_file", "" ) ;
-
- // Physical sub-networks
- _int_map["subnets"] = 1;
-
- //==== Topology options =======================
- AddStrField( "topology", "torus" );
- _int_map["k"] = 8; //network radix
- _int_map["n"] = 2; //network dimension
- _int_map["c"] = 1; //concentration
- AddStrField( "routing_function", "none" );
-
- //simulator tries to correclty adjust latency for node/router placement
- _int_map["use_noc_latency"] = 1;
-
-
- //used for noc latency calcualtion for network with concentration
- _int_map["x"] = 8; //number of routers in X
- _int_map["y"] = 8; //number of routers in Y
- _int_map["xr"] = 1; //number of nodes per router in X only if c>1
- _int_map["yr"] = 1; //number of nodes per router in Y only if c>1
-
-
- _int_map["link_failures"] = 0; //legacy
- _int_map["fail_seed"] = 0; //legacy
-
- //==== Single-node options ===============================
-
- _int_map["in_ports"] = 5;
- _int_map["out_ports"] = 5;
-
- //========================================================
- // Router options
- //========================================================
-
- //==== General options ===================================
-
- AddStrField( "router", "iq" );
-
- _int_map["output_delay"] = 0;
- _int_map["credit_delay"] = 0;
- _float_map["internal_speedup"] = 1.0;
-
- //with switch speedup flits requires otuput buffering
- //full output buffer will cancel switch allocation requests
- //default setting is unlimited
- _int_map["output_buffer_size"] = -1;
-
- // enable next-hop-output queueing
- _int_map["noq"] = 0;
-
- //==== Input-queued ======================================
-
- // Control of virtual channel speculation
- _int_map["speculative"] = 0 ;
- _int_map["spec_check_elig"] = 1 ;
- _int_map["spec_check_cred"] = 1 ;
- _int_map["spec_mask_by_reqs"] = 0 ;
- AddStrField("spec_sw_allocator", "prio");
-
- _int_map["num_vcs"] = 16;
- _int_map["vc_buf_size"] = 8; //per vc buffer size
- _int_map["buf_size"] = -1; //shared buffer size
- AddStrField("buffer_policy", "private"); //buffer sharing policy
-
- _int_map["private_bufs"] = -1;
- _int_map["private_buf_size"] = 1;
- AddStrField("private_buf_size", "");
- _int_map["private_buf_start_vc"] = -1;
- AddStrField("private_buf_start_vc", "");
- _int_map["private_buf_end_vc"] = -1;
- AddStrField("private_buf_end_vc", "");
-
- _int_map["max_held_slots"] = -1;
-
- _int_map["feedback_aging_scale"] = 1;
- _int_map["feedback_offset"] = 0;
-
- _int_map["wait_for_tail_credit"] = 0; // reallocate a VC before a tail credit?
- _int_map["vc_busy_when_full"] = 0; // mark VCs as in use when they have no credit available
- _int_map["vc_prioritize_empty"] = 0; // prioritize empty VCs over non-empty ones in VC allocation
- _int_map["vc_priority_donation"] = 0; // allow high-priority flits to donate their priority to low-priority that they are queued up behind
- _int_map["vc_shuffle_requests"] = 0; // rearrange VC allocator requests to avoid unfairness
-
- _int_map["hold_switch_for_packet"] = 0; // hold a switch config for the entire packet
-
- _int_map["input_speedup"] = 1; // expansion of input ports into crossbar
- _int_map["output_speedup"] = 1; // expansion of output ports into crossbar
-
- _int_map["routing_delay"] = 1;
- _int_map["vc_alloc_delay"] = 1;
- _int_map["sw_alloc_delay"] = 1;
- _int_map["st_prepare_delay"] = 0;
- _int_map["st_final_delay"] = 1;
-
- //==== Event-driven =====================================
-
- _int_map["vct"] = 0;
-
- //==== Allocators ========================================
-
- AddStrField( "vc_allocator", "islip" );
- AddStrField( "sw_allocator", "islip" );
-
- AddStrField( "arb_type", "round_robin" );
-
- _int_map["alloc_iters"] = 1;
-
- //==== Traffic ========================================
-
- _int_map["classes"] = 1;
-
- AddStrField( "traffic", "uniform" );
-
- _int_map["class_priority"] = 0;
- AddStrField("class_priority", ""); // workaraound to allow for vector specification
-
- _int_map["perm_seed"] = 0; // seed value for random permuation trafficpattern generator
-
- _float_map["injection_rate"] = 0.1;
- AddStrField("injection_rate", ""); // workaraound to allow for vector specification
-
- _int_map["injection_rate_uses_flits"] = 0;
-
- // number of flits per packet
- _int_map["packet_size"] = 1;
- AddStrField("packet_size", ""); // workaraound to allow for vector specification
-
- // if multiple values are specified per class, set probabilities for each
- _int_map["packet_size_rate"] = 1;
- AddStrField("packet_size_rate", ""); // workaraound to allow for vector specification
-
- AddStrField( "injection_process", "bernoulli" );
-
- _float_map["burst_alpha"] = 0.5; // burst interval
- _float_map["burst_beta"] = 0.5; // burst length
- _float_map["burst_r1"] = -1.0; // burst rate
-
- AddStrField( "priority", "none" ); // message priorities
-
- _int_map["batch_size"] = 1000;
- _int_map["batch_count"] = 1;
- _int_map["max_outstanding_requests"] = 0; // 0 = unlimited
-
- // Use read/write request reply scheme
- _int_map["use_read_write"] = 0;
- AddStrField("use_read_write", ""); // workaraound to allow for vector specification
- _float_map["write_fraction"] = 0.5;
- AddStrField("write_fraction", "");
-
- // Control assignment of packets to VCs
- _int_map["read_request_begin_vc"] = 0;
- _int_map["read_request_end_vc"] = 5;
- _int_map["write_request_begin_vc"] = 2;
- _int_map["write_request_end_vc"] = 7;
- _int_map["read_reply_begin_vc"] = 8;
- _int_map["read_reply_end_vc"] = 13;
- _int_map["write_reply_begin_vc"] = 10;
- _int_map["write_reply_end_vc"] = 15;
-
- // Control Injection of Packets into Replicated Networks
- _int_map["read_request_subnet"] = 0;
- _int_map["read_reply_subnet"] = 0;
- _int_map["write_request_subnet"] = 0;
- _int_map["write_reply_subnet"] = 0;
-
- // Set packet length in flits
- _int_map["read_request_size"] = 1;
- AddStrField("read_request_size", ""); // workaraound to allow for vector specification
- _int_map["write_request_size"] = 1;
- AddStrField("write_request_size", ""); // workaraound to allow for vector specification
- _int_map["read_reply_size"] = 1;
- AddStrField("read_reply_size", ""); // workaraound to allow for vector specification
- _int_map["write_reply_size"] = 1;
- AddStrField("write_reply_size", ""); // workaraound to allow for vector specification
-
- //==== Simulation parameters ==========================
-
- // types:
- // latency - average + latency distribution for a particular injection rate
- // throughput - sustained throughput for a particular injection rate
-
- AddStrField( "sim_type", "latency" );
-
- _int_map["warmup_periods"] = 3; // number of samples periods to "warm-up" the simulation
-
- _int_map["sample_period"] = 1000; // how long between measurements
- _int_map["max_samples"] = 10; // maximum number of sample periods in a simulation
-
- // whether or not to measure statistics for a given traffic class
- _int_map["measure_stats"] = 1;
- AddStrField("measure_stats", ""); // workaround to allow for vector specification
- //whether to enable per pair statistics, caution N^2 memory usage
- _int_map["pair_stats"] = 0;
-
- // if avg. latency exceeds the threshold, assume unstable
- _float_map["latency_thres"] = 500.0;
- AddStrField("latency_thres", ""); // workaround to allow for vector specification
-
- // consider warmed up once relative change in latency / throughput between successive iterations is smaller than this
- _float_map["warmup_thres"] = 0.05;
- AddStrField("warmup_thres", ""); // workaround to allow for vector specification
- _float_map["acc_warmup_thres"] = 0.05;
- AddStrField("acc_warmup_thres", ""); // workaround to allow for vector specification
-
- // consider converged once relative change in latency / throughput between successive iterations is smaller than this
- _float_map["stopping_thres"] = 0.05;
- AddStrField("stopping_thres", ""); // workaround to allow for vector specification
- _float_map["acc_stopping_thres"] = 0.05;
- AddStrField("acc_stopping_thres", ""); // workaround to allow for vector specification
-
- _int_map["sim_count"] = 1; // number of simulations to perform
-
-
- _int_map["include_queuing"] =1; // non-zero includes source queuing latency
-
- // _int_map["reorder"] = 0; // know what you're doing
-
- //_int_map["flit_timing"] = 0; // know what you're doing
- //_int_map["split_packets"] = 0; // know what you're doing
-
- _int_map["seed"] = 0; //random seed for simulation, e.g. traffic
-
- _int_map["print_activity"] = 0;
-
- _int_map["print_csv_results"] = 0;
-
- _int_map["deadlock_warn_timeout"] = 256;
-
- _int_map["viewer_trace"] = 0;
-
- AddStrField("watch_file", "");
-
- AddStrField("watch_flits", "");
- AddStrField("watch_packets", "");
- AddStrField("watch_transactions", "");
-
- AddStrField("watch_out", "");
-
- AddStrField("stats_out", "");
-
-#ifdef TRACK_FLOWS
- AddStrField("injected_flits_out", "");
- AddStrField("received_flits_out", "");
- AddStrField("stored_flits_out", "");
- AddStrField("sent_flits_out", "");
- AddStrField("outstanding_credits_out", "");
- AddStrField("ejected_flits_out", "");
- AddStrField("active_packets_out", "");
-#endif
-
-#ifdef TRACK_CREDITS
- AddStrField("used_credits_out", "");
- AddStrField("free_credits_out", "");
- AddStrField("max_credits_out", "");
-#endif
-
- // batch only -- packet sequence numbers
- AddStrField("sent_packets_out", "");
-
- //==================Power model params=====================
- _int_map["sim_power"] = 0;
- AddStrField("power_output_file","pwr_tmp");
- AddStrField("tech_file", "");
- _int_map["channel_width"] = 128;
- _int_map["channel_sweep"] = 0;
-
- //==================Network file===========================
- AddStrField("network_file","");
-}
-
-
-
-PowerConfig::PowerConfig( )
-{
-
- _int_map["H_INVD2"] = 0;
- _int_map["W_INVD2"] = 0;
- _int_map["H_DFQD1"] = 0;
- _int_map["W_DFQD1"] = 0;
- _int_map["H_ND2D1"] = 0;
- _int_map["W_ND2D1"] = 0;
- _int_map["H_SRAM"] = 0;
- _int_map["W_SRAM"] = 0;
- _float_map["Vdd"] = 0;
- _float_map["R"] = 0;
- _float_map["IoffSRAM"] = 0;
- _float_map["IoffP"] = 0;
- _float_map["IoffN"] = 0;
- _float_map["Cg_pwr"] = 0;
- _float_map["Cd_pwr"] = 0;
- _float_map["Cgdl"] = 0;
- _float_map["Cg"] = 0;
- _float_map["Cd"] = 0;
- _float_map["LAMBDA"] = 0;
- _float_map["MetalPitch"] = 0;
- _float_map["Rw"] = 0;
- _float_map["Cw_gnd"] = 0;
- _float_map["Cw_cpl"] = 0;
- _float_map["wire_length"] = 0;
-
-}
diff --git a/src/intersim2/.svn/pristine/e6/e64fcd97a677ff77ec1692273171f513fe794507.svn-base b/src/intersim2/.svn/pristine/e6/e64fcd97a677ff77ec1692273171f513fe794507.svn-base
deleted file mode 100644
index 265f6cd..0000000
--- a/src/intersim2/.svn/pristine/e6/e64fcd97a677ff77ec1692273171f513fe794507.svn-base
+++ /dev/null
@@ -1,132 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _CHAOS_ROUTER_HPP_
-#define _CHAOS_ROUTER_HPP_
-
-#include <string>
-#include <queue>
-#include <vector>
-
-#include "module.hpp"
-#include "router.hpp"
-#include "allocator.hpp"
-#include "routefunc.hpp"
-#include "outputset.hpp"
-#include "buffer_state.hpp"
-#include "pipefifo.hpp"
-#include "vc.hpp"
-
-class ChaosRouter : public Router {
-
- tRoutingFunction _rf;
-
- vector<OutputSet*> _input_route;
- vector<OutputSet*> _mq_route;
-
- enum eQState {
- empty, // input avail
- filling, // >**H ready to send
- full, // T****H ready to send
- leaving, // T***> input avail
- cut_through, // >***>
- shared // >**HT**>
- };
-
- PipelineFIFO<Flit> *_crossbar_pipe;
-
- int _multi_queue_size;
- int _buffer_size;
-
- vector<queue<Flit *> > _input_frame;
- vector<queue<Flit *> > _output_frame;
- vector<queue<Flit *> > _multi_queue;
-
- vector<int> _next_queue_cnt;
-
- vector<queue<Credit *> > _credit_queue;
-
- vector<eQState> _input_state;
- vector<eQState> _multi_state;
-
- vector<int> _input_output_match;
- vector<int> _input_mq_match;
- vector<int> _multi_match;
-
- vector<int> _mq_age;
-
- vector<bool> _output_matched;
- vector<bool> _mq_matched;
-
- int _cur_channel;
- int _read_stall;
-
- bool _IsInjectionChan( int chan ) const;
- bool _IsEjectionChan( int chan ) const;
-
- bool _InputReady( int input ) const;
- bool _OutputFull( int out ) const;
- bool _OutputAvail( int out ) const;
- bool _MultiQueueFull( int mq ) const;
-
- int _InputForOutput( int output ) const;
- int _MultiQueueForOutput( int output ) const;
- int _FindAvailMultiQueue( ) const;
-
- void _NextInterestingChannel( );
- void _OutputAdvance( );
- void _SendFlits( );
- void _SendCredits( );
-
- virtual void _InternalStep( );
-
-public:
- ChaosRouter( const Configuration& config,
- Module *parent, const string & name, int id,
- int inputs, int outputs );
-
- virtual ~ChaosRouter( );
-
- virtual void ReadInputs( );
- virtual void WriteOutputs( );
-
- virtual int GetUsedCredit(int out) const {return 0;}
- virtual int GetBufferOccupancy(int i) const {return 0;}
-
-#ifdef TRACK_BUFFERS
- virtual int GetUsedCreditForClass(int output, int cl) const {return 0;}
- virtual int GetBufferOccupancyForClass(int input, int cl) const {return 0;}
-#endif
-
- virtual vector<int> UsedCredits() const { return vector<int>(); }
- virtual vector<int> FreeCredits() const { return vector<int>(); }
- virtual vector<int> MaxCredits() const { return vector<int>(); }
-
- void Display( ostream & os = cout ) const;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/eb/ebec0a8c0098e95bd530e52b0baed6d9a60a33c1.svn-base b/src/intersim2/.svn/pristine/eb/ebec0a8c0098e95bd530e52b0baed6d9a60a33c1.svn-base
deleted file mode 100644
index 9da2282..0000000
--- a/src/intersim2/.svn/pristine/eb/ebec0a8c0098e95bd530e52b0baed6d9a60a33c1.svn-base
+++ /dev/null
@@ -1,190 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <iostream>
-#include <vector>
-#include <cassert>
-#include <limits>
-#include "random_utils.hpp"
-#include "injection.hpp"
-
-using namespace std;
-
-InjectionProcess::InjectionProcess(int nodes, double rate)
- : _nodes(nodes), _rate(rate)
-{
- if(nodes <= 0) {
- cout << "Error: Number of nodes must be greater than zero." << endl;
- exit(-1);
- }
- if((rate < 0.0) || (rate > 1.0)) {
- cout << "Error: Injection process must have load between 0.0 and 1.0."
- << endl;
- exit(-1);
- }
-}
-
-void InjectionProcess::reset()
-{
-
-}
-
-InjectionProcess * InjectionProcess::New(string const & inject, int nodes,
- double load,
- Configuration const * const config)
-{
- string process_name;
- string param_str;
- size_t left = inject.find_first_of('(');
- if(left == string::npos) {
- process_name = inject;
- } else {
- process_name = inject.substr(0, left);
- size_t right = inject.find_last_of(')');
- if(right == string::npos) {
- param_str = inject.substr(left+1);
- } else {
- param_str = inject.substr(left+1, right-left-1);
- }
- }
- vector<string> params = tokenize_str(param_str);
-
- InjectionProcess * result = NULL;
- if(process_name == "bernoulli") {
- result = new BernoulliInjectionProcess(nodes, load);
- } else if(process_name == "on_off") {
- bool missing_params = false;
- double alpha = numeric_limits<double>::quiet_NaN();
- if(params.size() < 1) {
- if(config) {
- alpha = config->GetFloat("burst_alpha");
- } else {
- missing_params = true;
- }
- } else {
- alpha = atof(params[0].c_str());
- }
- double beta = numeric_limits<double>::quiet_NaN();
- if(params.size() < 2) {
- if(config) {
- beta = config->GetFloat("burst_beta");
- } else {
- missing_params = true;
- }
- } else {
- beta = atof(params[1].c_str());
- }
- double r1 = numeric_limits<double>::quiet_NaN();
- if(params.size() < 3) {
- r1 = config ? config->GetFloat("burst_r1") : -1.0;
- } else {
- r1 = atof(params[2].c_str());
- }
- if(missing_params) {
- cout << "Missing parameters for injection process: " << inject << endl;
- exit(-1);
- }
- if((alpha < 0.0 && beta < 0.0) ||
- (alpha < 0.0 && r1 < 0.0) ||
- (beta < 0.0 && r1 < 0.0) ||
- (alpha >= 0.0 && beta >= 0.0 && r1 >= 0.0)) {
- cout << "Invalid parameters for injection process: " << inject << endl;
- exit(-1);
- }
- vector<int> initial(nodes);
- if(params.size() > 3) {
- initial = tokenize_int(params[2]);
- initial.resize(nodes, initial.back());
- } else {
- for(int n = 0; n < nodes; ++n) {
- initial[n] = RandomInt(1);
- }
- }
- result = new OnOffInjectionProcess(nodes, load, alpha, beta, r1, initial);
- } else {
- cout << "Invalid injection process: " << inject << endl;
- exit(-1);
- }
- return result;
-}
-
-//=============================================================
-
-BernoulliInjectionProcess::BernoulliInjectionProcess(int nodes, double rate)
- : InjectionProcess(nodes, rate)
-{
-
-}
-
-bool BernoulliInjectionProcess::test(int source)
-{
- assert((source >= 0) && (source < _nodes));
- return (RandomFloat() < _rate);
-}
-
-//=============================================================
-
-OnOffInjectionProcess::OnOffInjectionProcess(int nodes, double rate,
- double alpha, double beta,
- double r1, vector<int> initial)
- : InjectionProcess(nodes, rate),
- _alpha(alpha), _beta(beta), _r1(r1), _initial(initial)
-{
- assert(alpha <= 1.0);
- assert(beta <= 1.0);
- assert(r1 <= 1.0);
- if(alpha < 0.0) {
- assert(beta >= 0.0);
- assert(r1 >= 0.0);
- _alpha = beta * rate / (r1 - rate);
- } else if(beta < 0.0) {
- assert(alpha >= 0.0);
- assert(r1 >= 0.0);
- _beta = alpha * (r1 - rate) / rate;
- } else {
- assert(r1 < 0.0);
- _r1 = rate * (alpha + beta) / alpha;
- }
- reset();
-}
-
-void OnOffInjectionProcess::reset()
-{
- _state = _initial;
-}
-
-bool OnOffInjectionProcess::test(int source)
-{
- assert((source >= 0) && (source < _nodes));
-
- // advance state
- _state[source] =
- _state[source] ? (RandomFloat() >= _beta) : (RandomFloat() < _alpha);
-
- // generate packet
- return _state[source] && (RandomFloat() < _r1);
-}
diff --git a/src/intersim2/.svn/pristine/ec/ec23715e6e01d44320732e4a8fc186d6b209a3bb.svn-base b/src/intersim2/.svn/pristine/ec/ec23715e6e01d44320732e4a8fc186d6b209a3bb.svn-base
deleted file mode 100644
index 8a9833d..0000000
--- a/src/intersim2/.svn/pristine/ec/ec23715e6e01d44320732e4a8fc186d6b209a3bb.svn-base
+++ /dev/null
@@ -1,120 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <iostream>
-
-#include "pim.hpp"
-#include "random_utils.hpp"
-
-//#define DEBUG_PIM
-
-PIM::PIM( Module *parent, const string& name,
- int inputs, int outputs, int iters ) :
- DenseAllocator( parent, name, inputs, outputs ),
- _PIM_iter(iters)
-{
-}
-
-PIM::~PIM( )
-{
-}
-
-void PIM::Allocate( )
-{
- int input;
- int output;
-
- int input_offset;
- int output_offset;
-
- for ( int iter = 0; iter < _PIM_iter; ++iter ) {
- // Grant phase --- outputs randomly choose
- // between one of their requests
-
- vector<int> grants(_outputs, -1);
-
- for ( output = 0; output < _outputs; ++output ) {
-
- // A random arbiter between input requests
- input_offset = RandomInt( _inputs - 1 );
-
- for ( int i = 0; i < _inputs; ++i ) {
- input = ( i + input_offset ) % _inputs;
-
- if ( ( _request[input][output].label != -1 ) &&
- ( _inmatch[input] == -1 ) &&
- ( _outmatch[output] == -1 ) ) {
-
- // Grant
- grants[output] = input;
- break;
- }
- }
- }
-
- // Accept phase -- inputs randomly choose
- // between input_speedup of their grants
-
- for ( input = 0; input < _inputs; ++input ) {
-
- // A random arbiter between output grants
- output_offset = RandomInt( _outputs - 1 );
-
- for ( int o = 0; o < _outputs; ++o ) {
- output = ( o + output_offset ) % _outputs;
-
- if ( grants[output] == input ) {
-
- // Accept
- _inmatch[input] = output;
- _outmatch[output] = input;
-
- break;
- }
- }
- }
- }
-
-#ifdef DEBUG_PIM
- if ( _outputs == 8 ) {
- cout << "input match: " << endl;
- for ( int i = 0; i < _inputs; ++i ) {
- cout << " from " << i << " to " << _inmatch[i] << endl;
- }
- cout << endl;
- }
-
- cout << "output match: ";
- for ( int j = 0; j < _outputs; ++j ) {
- cout << _outmatch[j] << " ";
- }
- cout << endl;
-#endif
-}
-
-
diff --git a/src/intersim2/.svn/pristine/ef/ef53e3bc23eac89edf00c7903de88ebb2f4084b6.svn-base b/src/intersim2/.svn/pristine/ef/ef53e3bc23eac89edf00c7903de88ebb2f4084b6.svn-base
deleted file mode 100644
index b4202ff..0000000
--- a/src/intersim2/.svn/pristine/ef/ef53e3bc23eac89edf00c7903de88ebb2f4084b6.svn-base
+++ /dev/null
@@ -1,76 +0,0 @@
-// $Id: dragonflyconfig 3555 2011-05-16 23:37:55Z dub $
-
-// Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// Redistributions of source code must retain the above copyright notice, this
-// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-
-hold_switch_for_packet=1;
-
-vc_buf_size = 16;
-
-
-wait_for_tail_credit = 0;
-
-//
-// Router architecture
-//
-vc_allocator = separable_input_first;
-sw_allocator = separable_input_first;
-alloc_iters = 1;
-
-credit_delay = 2;
-routing_delay = 0;
-vc_alloc_delay = 1;
-sw_alloc_delay = 1;
-st_final_delay = 1;
-
-input_speedup = 1;
-output_speedup = 1;
-internal_speedup = 1.0;
-
-
-warmup_periods = 3;
-sim_count = 1;
-
-sample_period = 10000;
-
-
-
-routing_function = nca;
-num_vcs = 4;
-
-priority = none;
-traffic = uniform;
-
-injection_rate = 0.6;
-packet_size = 1;
-injection_rate_uses_flits=1;
-
-topology = fattree;
-
-
-k = 4;
-n = 3;
-
-watch_out=-; \ No newline at end of file
diff --git a/src/intersim2/.svn/pristine/f0/f0994d52a0bff0a75bf779e8ec53715b011bfd97.svn-base b/src/intersim2/.svn/pristine/f0/f0994d52a0bff0a75bf779e8ec53715b011bfd97.svn-base
deleted file mode 100644
index c2640f9..0000000
--- a/src/intersim2/.svn/pristine/f0/f0994d52a0bff0a75bf779e8ec53715b011bfd97.svn-base
+++ /dev/null
@@ -1,112 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "booksim.hpp"
-#include <iostream>
-
-#include "loa.hpp"
-#include "random_utils.hpp"
-
-LOA::LOA( Module *parent, const string& name,
- int inputs, int outputs ) :
- DenseAllocator( parent, name, inputs, outputs )
-{
- _req.resize(inputs);
- _counts.resize(outputs);
-
- _rptr.resize(inputs);
- _gptr.resize(outputs);
-}
-
-void LOA::Allocate( )
-{
- int input;
- int output;
-
- int input_offset;
- int output_offset;
-
- int lonely;
- int lonely_cnt;
-
- // Count phase --- the number of requests
- // per output is counted
-
- for ( int j = 0; j < _outputs; ++j ) {
- _counts[j] = 0;
- for ( int i = 0; i < _inputs; ++i ) {
- _counts[j] += ( _request[i][j].label != -1 ) ? 1 : 0;
- }
- }
-
- // Request phase
- for ( input = 0; input < _inputs; ++input ) {
-
- // Find the lonely output
- output_offset = _rptr[input];
- lonely = -1;
- lonely_cnt = _inputs + 1;
-
- for ( int o = 0; o < _outputs; ++o ) {
- output = ( o + output_offset ) % _outputs;
-
- if ( ( _request[input][output].label != -1 ) &&
- ( _counts[output] < lonely_cnt ) ) {
- lonely = output;
- lonely_cnt = _counts[output];
- }
- }
-
- // Request the lonely output (-1 for no request)
- _req[input] = lonely;
- }
-
- // Grant phase
- for ( output = 0; output < _outputs; ++output ) {
- input_offset = _gptr[output];
-
- for ( int i = 0; i < _inputs; ++i ) {
- input = ( i + input_offset ) % _inputs;
-
- if ( _req[input] == output ) {
- // Grant!
-
- _inmatch[input] = output;
- _outmatch[output] = input;
-
- _rptr[input] = ( _rptr[input] + 1 ) % _outputs;
- _gptr[output] = ( _gptr[output] + 1 ) % _inputs;
-
- break;
- }
- }
- }
-
-
-}
-
-
diff --git a/src/intersim2/.svn/pristine/f1/f18798b1a209786e47ee28ef3d5c7b5e908e0642.svn-base b/src/intersim2/.svn/pristine/f1/f18798b1a209786e47ee28ef3d5c7b5e908e0642.svn-base
deleted file mode 100644
index 835d627..0000000
--- a/src/intersim2/.svn/pristine/f1/f18798b1a209786e47ee28ef3d5c7b5e908e0642.svn-base
+++ /dev/null
@@ -1,48 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _ROUTEFUNC_HPP_
-#define _ROUTEFUNC_HPP_
-
-#include "flit.hpp"
-#include "router.hpp"
-#include "outputset.hpp"
-#include "config_utils.hpp"
-
-typedef void (*tRoutingFunction)( const Router *, const Flit *, int in_channel, OutputSet *, bool );
-
-void InitializeRoutingMap( const Configuration & config );
-
-extern map<string, tRoutingFunction> gRoutingFunctionMap;
-
-extern int gNumVCs;
-extern int gReadReqBeginVC, gReadReqEndVC;
-extern int gWriteReqBeginVC, gWriteReqEndVC;
-extern int gReadReplyBeginVC, gReadReplyEndVC;
-extern int gWriteReplyBeginVC, gWriteReplyEndVC;
-
-#endif
diff --git a/src/intersim2/.svn/pristine/f3/f3f385cd24e067dc09ab89284d234593352ee0bf.svn-base b/src/intersim2/.svn/pristine/f3/f3f385cd24e067dc09ab89284d234593352ee0bf.svn-base
deleted file mode 100644
index 7d5e0e3..0000000
--- a/src/intersim2/.svn/pristine/f3/f3f385cd24e067dc09ab89284d234593352ee0bf.svn-base
+++ /dev/null
@@ -1,153 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*outputset.cpp
- *
- *output set assigns a flit which output to go to in a router
- *used by the VC class
- *the output assignment is done by the routing algorithms..
- *
- */
-
-#include <cassert>
-
-#include "booksim.hpp"
-#include "outputset.hpp"
-
-void OutputSet::Clear( )
-{
- _outputs.clear( );
-}
-
-void OutputSet::Add( int output_port, int vc, int pri )
-{
- AddRange( output_port, vc, vc, pri );
-}
-
-void OutputSet::AddRange( int output_port, int vc_start, int vc_end, int pri )
-{
-
- sSetElement s;
-
- s.vc_start = vc_start;
- s.vc_end = vc_end;
- s.pri = pri;
- s.output_port = output_port;
- _outputs.insert( s );
-}
-
-//legacy support, for performance, just use GetSet()
-int OutputSet::NumVCs( int output_port ) const
-{
- int total = 0;
- set<sSetElement>::const_iterator i = _outputs.begin( );
- while(i!=_outputs.end( )){
- if(i->output_port == output_port){
- total += (i->vc_end - i->vc_start + 1);
- }
- i++;
- }
- return total;
-}
-
-bool OutputSet::OutputEmpty( int output_port ) const
-{
- set<sSetElement>::const_iterator i = _outputs.begin( );
- while(i!=_outputs.end( )){
- if(i->output_port == output_port){
- return false;
- }
- i++;
- }
- return true;
-}
-
-
-const set<OutputSet::sSetElement> & OutputSet::GetSet() const{
- return _outputs;
-}
-
-//legacy support, for performance, just use GetSet()
-int OutputSet::GetVC( int output_port, int vc_index, int *pri ) const
-{
-
- int range;
- int remaining = vc_index;
- int vc = -1;
-
- if ( pri ) { *pri = -1; }
-
- set<sSetElement>::const_iterator i = _outputs.begin( );
- while(i!=_outputs.end( )){
- if(i->output_port == output_port){
- range = i->vc_end - i->vc_start + 1;
- if ( remaining >= range ) {
- remaining -= range;
- } else {
- vc = i->vc_start + remaining;
- if ( pri ) {
- *pri = i->pri;
- }
- break;
- }
- }
- i++;
- }
- return vc;
-}
-
-//legacy support, for performance, just use GetSet()
-bool OutputSet::GetPortVC( int *out_port, int *out_vc ) const
-{
-
-
- bool single_output = false;
- int used_outputs = 0;
-
- set<sSetElement>::const_iterator i = _outputs.begin( );
- if(i!=_outputs.end( )){
- used_outputs = i->output_port;
- }
- while(i!=_outputs.end( )){
-
- if ( i->vc_start == i->vc_end ) {
- *out_vc = i->vc_start;
- *out_port = i->output_port;
- single_output = true;
- } else {
- // multiple vc's selected
- break;
- }
- if (used_outputs != i->output_port) {
- // multiple outputs selected
- single_output = false;
- break;
- }
- i++;
- }
- return single_output;
-}
diff --git a/src/intersim2/.svn/pristine/f4/f47cc0dc517c023ddeaf70f92c90e0ecfe343030.svn-base b/src/intersim2/.svn/pristine/f4/f47cc0dc517c023ddeaf70f92c90e0ecfe343030.svn-base
deleted file mode 100644
index c953713..0000000
--- a/src/intersim2/.svn/pristine/f4/f47cc0dc517c023ddeaf70f92c90e0ecfe343030.svn-base
+++ /dev/null
@@ -1,26 +0,0 @@
-// 2007 ITRS predictions for a 32nm high-performance library
-H_INVD2 = 8;//int
-W_INVD2 = 3;//int
-H_DFQD1 = 8;//int
-W_DFQD1 = 16;//int
-H_ND2D1 = 8;//int
-W_ND2D1 = 3;//int
-H_SRAM = 8;//int
-W_SRAM = 6;//int
-Vdd = 0.9;//float
-R = 606.321;//float
-IoffSRAM = 0.00000032;//float
-// 70 C
-IoffP = 0.00000102;//float
-IoffN = 0.00000102;//float
-Cg_pwr = 0.000000000000000534;//float
-Cd_pwr = 0.000000000000000267;//float
-Cgdl = 0.0000000000000001068;//float
-Cg = 0.000000000000000534;//float
-Cd = 0.000000000000000267;//float
-LAMBDA = 0.016;//float
-MetalPitch = 0.000080;//float
-Rw = 0.720044;//float
-Cw_gnd = 0.000000000000267339;//float
-Cw_cpl = 0.000000000000267339;//float
-wire_length = 2.0;//float \ No newline at end of file
diff --git a/src/intersim2/.svn/pristine/f4/f48f9ec9cbd794b900c47d4fa1af919f73f844ab.svn-base b/src/intersim2/.svn/pristine/f4/f48f9ec9cbd794b900c47d4fa1af919f73f844ab.svn-base
deleted file mode 100644
index be47efa..0000000
--- a/src/intersim2/.svn/pristine/f4/f48f9ec9cbd794b900c47d4fa1af919f73f844ab.svn-base
+++ /dev/null
@@ -1,53 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _FLY_HPP_
-#define _FLY_HPP_
-
-#include "network.hpp"
-
-class KNFly : public Network {
-
- int _k;
- int _n;
-
- void _ComputeSize( const Configuration &config );
- void _BuildNet( const Configuration &config );
-
- int _OutChannel( int stage, int addr, int port ) const;
- int _InChannel( int stage, int addr, int port ) const;
-
-public:
- KNFly( const Configuration &config, const string & name );
-
- int GetN( ) const;
- int GetK( ) const;
- static void RegisterRoutingFunctions(){};
- double Capacity( ) const;
-};
-
-#endif
diff --git a/src/intersim2/.svn/pristine/f7/f7c0ca6108d1e538b05438c69b603d0d1903688f.svn-base b/src/intersim2/.svn/pristine/f7/f7c0ca6108d1e538b05438c69b603d0d1903688f.svn-base
deleted file mode 100644
index b6b3ffb..0000000
--- a/src/intersim2/.svn/pristine/f7/f7c0ca6108d1e538b05438c69b603d0d1903688f.svn-base
+++ /dev/null
@@ -1,79 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*credit.cpp
- *
- *A class for credits
- */
-
-#include "booksim.hpp"
-#include "credit.hpp"
-
-stack<Credit *> Credit::_all;
-stack<Credit *> Credit::_free;
-
-Credit::Credit()
-{
- Reset();
-}
-
-void Credit::Reset()
-{
- vc.clear();
- head = false;
- tail = false;
- id = -1;
-}
-
-Credit * Credit::New() {
- Credit * c;
- if(_free.empty()) {
- c = new Credit();
- _all.push(c);
- } else {
- c = _free.top();
- c->Reset();
- _free.pop();
- }
- return c;
-}
-
-void Credit::Free() {
- _free.push(this);
-}
-
-void Credit::FreeAll() {
- while(!_all.empty()) {
- delete _all.top();
- _all.pop();
- }
-}
-
-
-int Credit::OutStanding(){
- return _all.size()-_free.size();
-}
diff --git a/src/intersim2/.svn/pristine/f8/f88e58811f1c40d35b795e6d317579cc2c3668d0.svn-base b/src/intersim2/.svn/pristine/f8/f88e58811f1c40d35b795e6d317579cc2c3668d0.svn-base
deleted file mode 100644
index b2db309..0000000
--- a/src/intersim2/.svn/pristine/f8/f88e58811f1c40d35b795e6d317579cc2c3668d0.svn-base
+++ /dev/null
@@ -1,2385 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "iq_router.hpp"
-
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <iomanip>
-#include <cstdlib>
-#include <cassert>
-#include <limits>
-
-#include "globals.hpp"
-#include "random_utils.hpp"
-#include "vc.hpp"
-#include "routefunc.hpp"
-#include "outputset.hpp"
-#include "buffer.hpp"
-#include "buffer_state.hpp"
-#include "roundrobin_arb.hpp"
-#include "allocator.hpp"
-#include "switch_monitor.hpp"
-#include "buffer_monitor.hpp"
-
-IQRouter::IQRouter( Configuration const & config, Module *parent,
- string const & name, int id, int inputs, int outputs )
-: Router( config, parent, name, id, inputs, outputs ), _active(false)
-{
- _vcs = config.GetInt( "num_vcs" );
-
- _vc_busy_when_full = (config.GetInt("vc_busy_when_full") > 0);
- _vc_prioritize_empty = (config.GetInt("vc_prioritize_empty") > 0);
- _vc_shuffle_requests = (config.GetInt("vc_shuffle_requests") > 0);
-
- _speculative = (config.GetInt("speculative") > 0);
- _spec_check_elig = (config.GetInt("spec_check_elig") > 0);
- _spec_check_cred = (config.GetInt("spec_check_cred") > 0);
- _spec_mask_by_reqs = (config.GetInt("spec_mask_by_reqs") > 0);
-
- _routing_delay = config.GetInt( "routing_delay" );
- _vc_alloc_delay = config.GetInt( "vc_alloc_delay" );
- if(!_vc_alloc_delay) {
- Error("VC allocator cannot have zero delay.");
- }
- _sw_alloc_delay = config.GetInt( "sw_alloc_delay" );
- if(!_sw_alloc_delay) {
- Error("Switch allocator cannot have zero delay.");
- }
-
- // Routing
- string const rf = config.GetStr("routing_function") + "_" + config.GetStr("topology");
- map<string, tRoutingFunction>::const_iterator rf_iter = gRoutingFunctionMap.find(rf);
- if(rf_iter == gRoutingFunctionMap.end()) {
- Error("Invalid routing function: " + rf);
- }
- _rf = rf_iter->second;
-
- // Alloc VC's
- _buf.resize(_inputs);
- for ( int i = 0; i < _inputs; ++i ) {
- ostringstream module_name;
- module_name << "buf_" << i;
- _buf[i] = new Buffer(config, _outputs, this, module_name.str( ) );
- module_name.str("");
- }
-
- // Alloc next VCs' buffer state
- _next_buf.resize(_outputs);
- for (int j = 0; j < _outputs; ++j) {
- ostringstream module_name;
- module_name << "next_vc_o" << j;
- _next_buf[j] = new BufferState( config, this, module_name.str( ) );
- module_name.str("");
- }
-
- // Alloc allocators
- string vc_alloc_type = config.GetStr( "vc_allocator" );
- if(vc_alloc_type == "piggyback") {
- if(!_speculative) {
- Error("Piggyback VC allocation requires speculative switch allocation to be enabled.");
- }
- _vc_allocator = NULL;
- _vc_rr_offset.resize(_outputs*_classes, -1);
- } else {
- _vc_allocator = Allocator::NewAllocator( this, "vc_allocator",
- vc_alloc_type,
- _vcs*_inputs,
- _vcs*_outputs );
-
- if ( !_vc_allocator ) {
- Error("Unknown vc_allocator type: " + vc_alloc_type);
- }
- }
-
- string sw_alloc_type = config.GetStr( "sw_allocator" );
- _sw_allocator = Allocator::NewAllocator( this, "sw_allocator",
- sw_alloc_type,
- _inputs*_input_speedup,
- _outputs*_output_speedup );
-
- if ( !_sw_allocator ) {
- Error("Unknown sw_allocator type: " + sw_alloc_type);
- }
-
- string spec_sw_alloc_type = config.GetStr( "spec_sw_allocator" );
- if ( _speculative && ( spec_sw_alloc_type != "prio" ) ) {
- _spec_sw_allocator = Allocator::NewAllocator( this, "spec_sw_allocator",
- spec_sw_alloc_type,
- _inputs*_input_speedup,
- _outputs*_output_speedup );
- if ( !_spec_sw_allocator ) {
- Error("Unknown spec_sw_allocator type: " + spec_sw_alloc_type);
- }
- } else {
- _spec_sw_allocator = NULL;
- }
-
- _sw_rr_offset.resize(_inputs*_input_speedup);
- for(int i = 0; i < _inputs*_input_speedup; ++i)
- _sw_rr_offset[i] = i % _input_speedup;
-
- _noq = config.GetInt("noq") > 0;
- if(_noq) {
- if(_routing_delay) {
- Error("NOQ requires lookahead routing to be enabled.");
- }
- if(_vcs < _outputs) {
- Error("NOQ requires at least as many VCs as router outputs.");
- }
- }
- _noq_next_output_port.resize(_inputs, vector<int>(_vcs, -1));
- _noq_next_vc_start.resize(_inputs, vector<int>(_vcs, -1));
- _noq_next_vc_end.resize(_inputs, vector<int>(_vcs, -1));
-
- // Output queues
- _output_buffer_size = config.GetInt("output_buffer_size");
- _output_buffer.resize(_outputs);
- _credit_buffer.resize(_inputs);
-
- // Switch configuration (when held for multiple cycles)
- _hold_switch_for_packet = (config.GetInt("hold_switch_for_packet") > 0);
- _switch_hold_in.resize(_inputs*_input_speedup, -1);
- _switch_hold_out.resize(_outputs*_output_speedup, -1);
- _switch_hold_vc.resize(_inputs*_input_speedup, -1);
-
- _bufferMonitor = new BufferMonitor(inputs, _classes);
- _switchMonitor = new SwitchMonitor(inputs, outputs, _classes);
-
-#ifdef TRACK_FLOWS
- for(int c = 0; c < _classes; ++c) {
- _stored_flits[c].resize(_inputs, 0);
- _active_packets[c].resize(_inputs, 0);
- }
- _outstanding_classes.resize(_outputs, vector<queue<int> >(_vcs));
-#endif
-}
-
-IQRouter::~IQRouter( )
-{
-
- if(gPrintActivity) {
- cout << Name() << ".bufferMonitor:" << endl ;
- cout << *_bufferMonitor << endl ;
-
- cout << Name() << ".switchMonitor:" << endl ;
- cout << "Inputs=" << _inputs ;
- cout << "Outputs=" << _outputs ;
- cout << *_switchMonitor << endl ;
- }
-
- for(int i = 0; i < _inputs; ++i)
- delete _buf[i];
-
- for(int j = 0; j < _outputs; ++j)
- delete _next_buf[j];
-
- delete _vc_allocator;
- delete _sw_allocator;
- if(_spec_sw_allocator)
- delete _spec_sw_allocator;
-
- delete _bufferMonitor;
- delete _switchMonitor;
-}
-
-void IQRouter::AddOutputChannel(FlitChannel * channel, CreditChannel * backchannel)
-{
- int alloc_delay = _speculative ? max(_vc_alloc_delay, _sw_alloc_delay) : (_vc_alloc_delay + _sw_alloc_delay);
- int min_latency = 1 + _crossbar_delay + channel->GetLatency() + _routing_delay + alloc_delay + backchannel->GetLatency() + _credit_delay;
- _next_buf[_output_channels.size()]->SetMinLatency(min_latency);
- Router::AddOutputChannel(channel, backchannel);
-}
-
-void IQRouter::ReadInputs( )
-{
- bool have_flits = _ReceiveFlits( );
- bool have_credits = _ReceiveCredits( );
- _active = _active || have_flits || have_credits;
-}
-
-void IQRouter::_InternalStep( )
-{
- if(!_active) {
- return;
- }
-
- _InputQueuing( );
- bool activity = !_proc_credits.empty();
-
- if(!_route_vcs.empty())
- _RouteEvaluate( );
- if(_vc_allocator) {
- _vc_allocator->Clear();
- if(!_vc_alloc_vcs.empty())
- _VCAllocEvaluate( );
- }
- if(_hold_switch_for_packet) {
- if(!_sw_hold_vcs.empty())
- _SWHoldEvaluate( );
- }
- _sw_allocator->Clear();
- if(_spec_sw_allocator)
- _spec_sw_allocator->Clear();
- if(!_sw_alloc_vcs.empty())
- _SWAllocEvaluate( );
- if(!_crossbar_flits.empty())
- _SwitchEvaluate( );
-
- if(!_route_vcs.empty()) {
- _RouteUpdate( );
- activity = activity || !_route_vcs.empty();
- }
- if(!_vc_alloc_vcs.empty()) {
- _VCAllocUpdate( );
- activity = activity || !_vc_alloc_vcs.empty();
- }
- if(_hold_switch_for_packet) {
- if(!_sw_hold_vcs.empty()) {
- _SWHoldUpdate( );
- activity = activity || !_sw_hold_vcs.empty();
- }
- }
- if(!_sw_alloc_vcs.empty()) {
- _SWAllocUpdate( );
- activity = activity || !_sw_alloc_vcs.empty();
- }
- if(!_crossbar_flits.empty()) {
- _SwitchUpdate( );
- activity = activity || !_crossbar_flits.empty();
- }
-
- _active = activity;
-
- _OutputQueuing( );
-
- _bufferMonitor->cycle( );
- _switchMonitor->cycle( );
-}
-
-void IQRouter::WriteOutputs( )
-{
- _SendFlits( );
- _SendCredits( );
-}
-
-
-//------------------------------------------------------------------------------
-// read inputs
-//------------------------------------------------------------------------------
-
-bool IQRouter::_ReceiveFlits( )
-{
- bool activity = false;
- for(int input = 0; input < _inputs; ++input) {
- Flit * const f = _input_channels[input]->Receive();
- if(f) {
-
-#ifdef TRACK_FLOWS
- ++_received_flits[f->cl][input];
-#endif
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Received flit " << f->id
- << " from channel at input " << input
- << "." << endl;
- }
- _in_queue_flits.insert(make_pair(input, f));
- activity = true;
- }
- }
- return activity;
-}
-
-bool IQRouter::_ReceiveCredits( )
-{
- bool activity = false;
- for(int output = 0; output < _outputs; ++output) {
- Credit * const c = _output_credits[output]->Receive();
- if(c) {
- _proc_credits.push_back(make_pair(GetSimTime() + _credit_delay,
- make_pair(c, output)));
- activity = true;
- }
- }
- return activity;
-}
-
-
-//------------------------------------------------------------------------------
-// input queuing
-//------------------------------------------------------------------------------
-
-void IQRouter::_InputQueuing( )
-{
- for(map<int, Flit *>::const_iterator iter = _in_queue_flits.begin();
- iter != _in_queue_flits.end();
- ++iter) {
-
- int const input = iter->first;
- assert((input >= 0) && (input < _inputs));
-
- Flit * const f = iter->second;
- assert(f);
-
- int const vc = f->vc;
- assert((vc >= 0) && (vc < _vcs));
-
- Buffer * const cur_buf = _buf[input];
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Adding flit " << f->id
- << " to VC " << vc
- << " at input " << input
- << " (state: " << VC::VCSTATE[cur_buf->GetState(vc)];
- if(cur_buf->Empty(vc)) {
- *gWatchOut << ", empty";
- } else {
- assert(cur_buf->FrontFlit(vc));
- *gWatchOut << ", front: " << cur_buf->FrontFlit(vc)->id;
- }
- *gWatchOut << ")." << endl;
- }
- cur_buf->AddFlit(vc, f);
-
-#ifdef TRACK_FLOWS
- ++_stored_flits[f->cl][input];
- if(f->head) ++_active_packets[f->cl][input];
-#endif
-
- _bufferMonitor->write(input, f) ;
-
- if(cur_buf->GetState(vc) == VC::idle) {
- assert(cur_buf->FrontFlit(vc) == f);
- assert(cur_buf->GetOccupancy(vc) == 1);
- assert(f->head);
- assert(_switch_hold_vc[input*_input_speedup + vc%_input_speedup] != vc);
- if(_routing_delay) {
- cur_buf->SetState(vc, VC::routing);
- _route_vcs.push_back(make_pair(-1, make_pair(input, vc)));
- } else {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Using precomputed lookahead routing information for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
- cur_buf->SetRouteSet(vc, &f->la_route_set);
- cur_buf->SetState(vc, VC::vc_alloc);
- if(_speculative) {
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(make_pair(input, vc),
- -1)));
- }
- if(_vc_allocator) {
- _vc_alloc_vcs.push_back(make_pair(-1, make_pair(make_pair(input, vc),
- -1)));
- }
- if(_noq) {
- _UpdateNOQ(input, vc, f);
- }
- }
- } else if((cur_buf->GetState(vc) == VC::active) &&
- (cur_buf->FrontFlit(vc) == f)) {
- if(_switch_hold_vc[input*_input_speedup + vc%_input_speedup] == vc) {
- _sw_hold_vcs.push_back(make_pair(-1, make_pair(make_pair(input, vc),
- -1)));
- } else {
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(make_pair(input, vc),
- -1)));
- }
- }
- }
- _in_queue_flits.clear();
-
- while(!_proc_credits.empty()) {
-
- pair<int, pair<Credit *, int> > const & item = _proc_credits.front();
-
- int const time = item.first;
- if(GetSimTime() < time) {
- break;
- }
-
- Credit * const c = item.second.first;
- assert(c);
-
- int const output = item.second.second;
- assert((output >= 0) && (output < _outputs));
-
- BufferState * const dest_buf = _next_buf[output];
-
-#ifdef TRACK_FLOWS
- for(set<int>::const_iterator iter = c->vc.begin(); iter != c->vc.end(); ++iter) {
- int const vc = *iter;
- assert(!_outstanding_classes[output][vc].empty());
- int cl = _outstanding_classes[output][vc].front();
- _outstanding_classes[output][vc].pop();
- assert(_outstanding_credits[cl][output] > 0);
- --_outstanding_credits[cl][output];
- }
-#endif
-
- dest_buf->ProcessCredit(c);
- c->Free();
- _proc_credits.pop_front();
- }
-}
-
-
-//------------------------------------------------------------------------------
-// routing
-//------------------------------------------------------------------------------
-
-void IQRouter::_RouteEvaluate( )
-{
- assert(_routing_delay);
-
- for(deque<pair<int, pair<int, int> > >::iterator iter = _route_vcs.begin();
- iter != _route_vcs.end();
- ++iter) {
-
- int const time = iter->first;
- if(time >= 0) {
- break;
- }
- iter->first = GetSimTime() + _routing_delay - 1;
-
- int const input = iter->second.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = iter->second.second;
- assert((vc >= 0) && (vc < _vcs));
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert(cur_buf->GetState(vc) == VC::routing);
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
- assert(f->head);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Beginning routing for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
- }
-}
-
-void IQRouter::_RouteUpdate( )
-{
- assert(_routing_delay);
-
- while(!_route_vcs.empty()) {
-
- pair<int, pair<int, int> > const & item = _route_vcs.front();
-
- int const time = item.first;
- if((time < 0) || (GetSimTime() < time)) {
- break;
- }
- assert(GetSimTime() == time);
-
- int const input = item.second.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = item.second.second;
- assert((vc >= 0) && (vc < _vcs));
-
- Buffer * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert(cur_buf->GetState(vc) == VC::routing);
-
- Flit * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
- assert(f->head);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Completed routing for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
-
- cur_buf->Route(vc, _rf, this, f, input);
- cur_buf->SetState(vc, VC::vc_alloc);
- if(_speculative) {
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second, -1)));
- }
- if(_vc_allocator) {
- _vc_alloc_vcs.push_back(make_pair(-1, make_pair(item.second, -1)));
- }
- // NOTE: No need to handle NOQ here, as it requires lookahead routing!
- _route_vcs.pop_front();
- }
-}
-
-
-//------------------------------------------------------------------------------
-// VC allocation
-//------------------------------------------------------------------------------
-
-void IQRouter::_VCAllocEvaluate( )
-{
- assert(_vc_allocator);
-
- bool watched = false;
-
- for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _vc_alloc_vcs.begin();
- iter != _vc_alloc_vcs.end();
- ++iter) {
-
- int const time = iter->first;
- if(time >= 0) {
- break;
- }
-
- int const input = iter->second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = iter->second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- assert(iter->second.second == -1);
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert(cur_buf->GetState(vc) == VC::vc_alloc);
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
- assert(f->head);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Beginning VC allocation for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
-
- OutputSet const * const route_set = cur_buf->GetRouteSet(vc);
- assert(route_set);
-
- int const out_priority = cur_buf->GetPriority(vc);
- set<OutputSet::sSetElement> const setlist = route_set->GetSet();
-
- bool elig = false;
- bool cred = false;
- bool reserved = false;
-
- assert(!_noq || (setlist.size() == 1));
-
- for(set<OutputSet::sSetElement>::const_iterator iset = setlist.begin();
- iset != setlist.end();
- ++iset) {
-
- int const out_port = iset->output_port;
- assert((out_port >= 0) && (out_port < _outputs));
-
- BufferState const * const dest_buf = _next_buf[out_port];
-
- int vc_start;
- int vc_end;
-
- if(_noq && _noq_next_output_port[input][vc] >= 0) {
- assert(!_routing_delay);
- vc_start = _noq_next_vc_start[input][vc];
- vc_end = _noq_next_vc_end[input][vc];
- } else {
- vc_start = iset->vc_start;
- vc_end = iset->vc_end;
- }
- assert(vc_start >= 0 && vc_start < _vcs);
- assert(vc_end >= 0 && vc_end < _vcs);
- assert(vc_end >= vc_start);
-
- for(int out_vc = vc_start; out_vc <= vc_end; ++out_vc) {
- assert((out_vc >= 0) && (out_vc < _vcs));
-
- int in_priority = iset->pri;
- if(_vc_prioritize_empty && !dest_buf->IsEmptyFor(out_vc)) {
- assert(in_priority >= 0);
- in_priority += numeric_limits<int>::min();
- }
-
- // On the input input side, a VC might request several output VCs.
- // These VCs can be prioritized by the routing function, and this is
- // reflected in "in_priority". On the output side, if multiple VCs are
- // requesting the same output VC, the priority of VCs is based on the
- // actual packet priorities, which is reflected in "out_priority".
-
- if(!dest_buf->IsAvailableFor(out_vc)) {
- if(f->watch) {
- int const use_input_and_vc = dest_buf->UsedBy(out_vc);
- int const use_input = use_input_and_vc / _vcs;
- int const use_vc = use_input_and_vc % _vcs;
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " VC " << out_vc
- << " at output " << out_port
- << " is in use by VC " << use_vc
- << " at input " << use_input;
- Flit * cf = _buf[use_input]->FrontFlit(use_vc);
- if(cf) {
- *gWatchOut << " (front flit: " << cf->id << ")";
- } else {
- *gWatchOut << " (empty)";
- }
- *gWatchOut << "." << endl;
- }
- } else {
- elig = true;
- if(_vc_busy_when_full && dest_buf->IsFullFor(out_vc)) {
- if(f->watch)
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " VC " << out_vc
- << " at output " << out_port
- << " is full." << endl;
- reserved |= !dest_buf->IsFull();
- } else {
- cred = true;
- if(f->watch){
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Requesting VC " << out_vc
- << " at output " << out_port
- << " (in_pri: " << in_priority
- << ", out_pri: " << out_priority
- << ")." << endl;
- watched = true;
- }
- int const input_and_vc
- = _vc_shuffle_requests ? (vc*_inputs + input) : (input*_vcs + vc);
- _vc_allocator->AddRequest(input_and_vc, out_port*_vcs + out_vc,
- 0, in_priority, out_priority);
- }
- }
- }
- }
- if(!elig) {
- iter->second.second = STALL_BUFFER_BUSY;
- } else if(_vc_busy_when_full && !cred) {
- iter->second.second = reserved ? STALL_BUFFER_RESERVED : STALL_BUFFER_FULL;
- }
- }
-
- if(watched) {
- *gWatchOut << GetSimTime() << " | " << _vc_allocator->FullName() << " | ";
- _vc_allocator->PrintRequests( gWatchOut );
- }
-
- _vc_allocator->Allocate();
-
- if(watched) {
- *gWatchOut << GetSimTime() << " | " << _vc_allocator->FullName() << " | ";
- _vc_allocator->PrintGrants( gWatchOut );
- }
-
- for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _vc_alloc_vcs.begin();
- iter != _vc_alloc_vcs.end();
- ++iter) {
-
- int const time = iter->first;
- if(time >= 0) {
- break;
- }
- iter->first = GetSimTime() + _vc_alloc_delay - 1;
-
- int const input = iter->second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = iter->second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- if(iter->second.second < -1) {
- continue;
- }
-
- assert(iter->second.second == -1);
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert(cur_buf->GetState(vc) == VC::vc_alloc);
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
- assert(f->head);
-
- int const input_and_vc
- = _vc_shuffle_requests ? (vc*_inputs + input) : (input*_vcs + vc);
- int const output_and_vc = _vc_allocator->OutputAssigned(input_and_vc);
-
- if(output_and_vc >= 0) {
-
- int const match_output = output_and_vc / _vcs;
- assert((match_output >= 0) && (match_output < _outputs));
- int const match_vc = output_and_vc % _vcs;
- assert((match_vc >= 0) && (match_vc < _vcs));
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Assigning VC " << match_vc
- << " at output " << match_output
- << " to VC " << vc
- << " at input " << input
- << "." << endl;
- }
-
- iter->second.second = output_and_vc;
-
- } else {
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "VC allocation failed for VC " << vc
- << " at input " << input
- << "." << endl;
- }
-
- iter->second.second = STALL_BUFFER_CONFLICT;
-
- }
- }
-
- if(_vc_alloc_delay <= 1) {
- return;
- }
-
- for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _vc_alloc_vcs.begin();
- iter != _vc_alloc_vcs.end();
- ++iter) {
-
- int const time = iter->first;
- assert(time >= 0);
- if(GetSimTime() < time) {
- break;
- }
-
- assert(iter->second.second != -1);
-
- int const output_and_vc = iter->second.second;
-
- if(output_and_vc >= 0) {
-
- int const match_output = output_and_vc / _vcs;
- assert((match_output >= 0) && (match_output < _outputs));
- int const match_vc = output_and_vc % _vcs;
- assert((match_vc >= 0) && (match_vc < _vcs));
-
- BufferState const * const dest_buf = _next_buf[match_output];
-
- int const input = iter->second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = iter->second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert(cur_buf->GetState(vc) == VC::vc_alloc);
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
- assert(f->head);
-
- if(!dest_buf->IsAvailableFor(match_vc)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Discarding previously generated grant for VC " << vc
- << " at input " << input
- << ": VC " << match_vc
- << " at output " << match_output
- << " is no longer available." << endl;
- }
- iter->second.second = STALL_BUFFER_BUSY;
- } else if(_vc_busy_when_full && dest_buf->IsFullFor(match_vc)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Discarding previously generated grant for VC " << vc
- << " at input " << input
- << ": VC " << match_vc
- << " at output " << match_output
- << " has become full." << endl;
- }
- iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED;
- }
- }
- }
-}
-
-void IQRouter::_VCAllocUpdate( )
-{
- assert(_vc_allocator);
-
- while(!_vc_alloc_vcs.empty()) {
-
- pair<int, pair<pair<int, int>, int> > const & item = _vc_alloc_vcs.front();
-
- int const time = item.first;
- if((time < 0) || (GetSimTime() < time)) {
- break;
- }
- assert(GetSimTime() == time);
-
- int const input = item.second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = item.second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- assert(item.second.second != -1);
-
- Buffer * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert(cur_buf->GetState(vc) == VC::vc_alloc);
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
- assert(f->head);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Completed VC allocation for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
-
- int const output_and_vc = item.second.second;
-
- if(output_and_vc >= 0) {
-
- int const match_output = output_and_vc / _vcs;
- assert((match_output >= 0) && (match_output < _outputs));
- int const match_vc = output_and_vc % _vcs;
- assert((match_vc >= 0) && (match_vc < _vcs));
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Acquiring assigned VC " << match_vc
- << " at output " << match_output
- << "." << endl;
- }
-
- BufferState * const dest_buf = _next_buf[match_output];
- assert(dest_buf->IsAvailableFor(match_vc));
-
- dest_buf->TakeBuffer(match_vc, input*_vcs + vc);
-
- cur_buf->SetOutput(vc, match_output, match_vc);
- cur_buf->SetState(vc, VC::active);
- if(!_speculative) {
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, -1)));
- }
- } else {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " No output VC allocated." << endl;
- }
-
-#ifdef TRACK_STALLS
- assert((output_and_vc == STALL_BUFFER_BUSY) ||
- (output_and_vc == STALL_BUFFER_CONFLICT));
- if(output_and_vc == STALL_BUFFER_BUSY) {
- ++_buffer_busy_stalls[f->cl];
- } else if(output_and_vc == STALL_BUFFER_CONFLICT) {
- ++_buffer_conflict_stalls[f->cl];
- }
-#endif
-
- _vc_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, -1)));
- }
- _vc_alloc_vcs.pop_front();
- }
-}
-
-
-//------------------------------------------------------------------------------
-// switch holding
-//------------------------------------------------------------------------------
-
-void IQRouter::_SWHoldEvaluate( )
-{
- assert(_hold_switch_for_packet);
-
- for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _sw_hold_vcs.begin();
- iter != _sw_hold_vcs.end();
- ++iter) {
-
- int const time = iter->first;
- if(time >= 0) {
- break;
- }
- iter->first = GetSimTime();
-
- int const input = iter->second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = iter->second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- assert(iter->second.second == -1);
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert(cur_buf->GetState(vc) == VC::active);
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Beginning held switch allocation for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
-
- int const expanded_input = input * _input_speedup + vc % _input_speedup;
- assert(_switch_hold_vc[expanded_input] == vc);
-
- int const match_port = cur_buf->GetOutputPort(vc);
- assert((match_port >= 0) && (match_port < _outputs));
- int const match_vc = cur_buf->GetOutputVC(vc);
- assert((match_vc >= 0) && (match_vc < _vcs));
-
- int const expanded_output = match_port*_output_speedup + input%_output_speedup;
- assert(_switch_hold_in[expanded_input] == expanded_output);
-
- BufferState const * const dest_buf = _next_buf[match_port];
-
- if(dest_buf->IsFullFor(match_vc)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Unable to reuse held connection from input " << input
- << "." << (expanded_input % _input_speedup)
- << " to output " << match_port
- << "." << (expanded_output % _output_speedup)
- << ": No credit available." << endl;
- }
- iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED;
- } else {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Reusing held connection from input " << input
- << "." << (expanded_input % _input_speedup)
- << " to output " << match_port
- << "." << (expanded_output % _output_speedup)
- << "." << endl;
- }
- iter->second.second = expanded_output;
- }
- }
-}
-
-void IQRouter::_SWHoldUpdate( )
-{
- assert(_hold_switch_for_packet);
-
- while(!_sw_hold_vcs.empty()) {
-
- pair<int, pair<pair<int, int>, int> > const & item = _sw_hold_vcs.front();
-
- int const time = item.first;
- if(time < 0) {
- break;
- }
- assert(GetSimTime() == time);
-
- int const input = item.second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = item.second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- assert(item.second.second != -1);
-
- Buffer * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert(cur_buf->GetState(vc) == VC::active);
-
- Flit * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Completed held switch allocation for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
-
- int const expanded_input = input * _input_speedup + vc % _input_speedup;
- assert(_switch_hold_vc[expanded_input] == vc);
-
- int const expanded_output = item.second.second;
-
- if(expanded_output >= 0 && ( _output_buffer_size==-1 || _output_buffer[expanded_output].size()<size_t(_output_buffer_size))) {
-
- assert(_switch_hold_in[expanded_input] == expanded_output);
- assert(_switch_hold_out[expanded_output] == expanded_input);
-
- int const output = expanded_output / _output_speedup;
- assert((output >= 0) && (output < _outputs));
- assert(cur_buf->GetOutputPort(vc) == output);
-
- int const match_vc = cur_buf->GetOutputVC(vc);
- assert((match_vc >= 0) && (match_vc < _vcs));
-
- BufferState * const dest_buf = _next_buf[output];
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Scheduling switch connection from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << "." << endl;
- }
-
- cur_buf->RemoveFlit(vc);
-
-#ifdef TRACK_FLOWS
- --_stored_flits[f->cl][input];
- if(f->tail) --_active_packets[f->cl][input];
-#endif
-
- _bufferMonitor->read(input, f) ;
-
- f->hops++;
- f->vc = match_vc;
-
- if(!_routing_delay && f->head) {
- const FlitChannel * channel = _output_channels[output];
- const Router * router = channel->GetSink();
- if(router) {
- if(_noq) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Updating lookahead routing information for flit " << f->id
- << " (NOQ)." << endl;
- }
- int next_output_port = _noq_next_output_port[input][vc];
- assert(next_output_port >= 0);
- _noq_next_output_port[input][vc] = -1;
- int next_vc_start = _noq_next_vc_start[input][vc];
- assert(next_vc_start >= 0 && next_vc_start < _vcs);
- _noq_next_vc_start[input][vc] = -1;
- int next_vc_end = _noq_next_vc_end[input][vc];
- assert(next_vc_end >= 0 && next_vc_end < _vcs);
- _noq_next_vc_end[input][vc] = -1;
- f->la_route_set.Clear();
- f->la_route_set.AddRange(next_output_port, next_vc_start, next_vc_end);
- } else {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Updating lookahead routing information for flit " << f->id
- << "." << endl;
- }
- int in_channel = channel->GetSinkPort();
- _rf(router, f, in_channel, &f->la_route_set, false);
- }
- } else {
- f->la_route_set.Clear();
- }
- }
-
-#ifdef TRACK_FLOWS
- ++_outstanding_credits[f->cl][output];
- _outstanding_classes[output][f->vc].push(f->cl);
-#endif
-
- dest_buf->SendingFlit(f);
-
- _crossbar_flits.push_back(make_pair(-1, make_pair(f, make_pair(expanded_input, expanded_output))));
-
- if(_out_queue_credits.count(input) == 0) {
- _out_queue_credits.insert(make_pair(input, Credit::New()));
- }
- _out_queue_credits.find(input)->second->vc.insert(vc);
-
- if(cur_buf->Empty(vc)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Cancelling held connection from input " << input
- << "." << (expanded_input % _input_speedup)
- << " to " << output
- << "." << (expanded_output % _output_speedup)
- << ": No more flits." << endl;
- }
- _switch_hold_vc[expanded_input] = -1;
- _switch_hold_in[expanded_input] = -1;
- _switch_hold_out[expanded_output] = -1;
- if(f->tail) {
- cur_buf->SetState(vc, VC::idle);
- }
- } else {
- Flit * const nf = cur_buf->FrontFlit(vc);
- assert(nf);
- assert(nf->vc == vc);
- if(f->tail) {
- assert(nf->head);
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Cancelling held connection from input " << input
- << "." << (expanded_input % _input_speedup)
- << " to " << output
- << "." << (expanded_output % _output_speedup)
- << ": End of packet." << endl;
- }
- _switch_hold_vc[expanded_input] = -1;
- _switch_hold_in[expanded_input] = -1;
- _switch_hold_out[expanded_output] = -1;
- if(_routing_delay) {
- cur_buf->SetState(vc, VC::routing);
- _route_vcs.push_back(make_pair(-1, item.second.first));
- } else {
- if(nf->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Using precomputed lookahead routing information for VC " << vc
- << " at input " << input
- << " (front: " << nf->id
- << ")." << endl;
- }
- cur_buf->SetRouteSet(vc, &nf->la_route_set);
- cur_buf->SetState(vc, VC::vc_alloc);
- if(_speculative) {
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first,
- -1)));
- }
- if(_vc_allocator) {
- _vc_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first,
- -1)));
- }
- if(_noq) {
- _UpdateNOQ(input, vc, nf);
- }
- }
- } else {
- _sw_hold_vcs.push_back(make_pair(-1, make_pair(item.second.first,
- -1)));
- }
- }
- } else {
- //when internal speedup >1.0, the buffer stall stats may not be accruate
- assert((expanded_output == STALL_BUFFER_FULL) ||
- (expanded_output == STALL_BUFFER_RESERVED) || !( _output_buffer_size==-1 || _output_buffer[expanded_output].size()<size_t(_output_buffer_size)));
-
- int const held_expanded_output = _switch_hold_in[expanded_input];
- assert(held_expanded_output >= 0);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Cancelling held connection from input " << input
- << "." << (expanded_input % _input_speedup)
- << " to " << (held_expanded_output / _output_speedup)
- << "." << (held_expanded_output % _output_speedup)
- << ": Flit not sent." << endl;
- }
- _switch_hold_vc[expanded_input] = -1;
- _switch_hold_in[expanded_input] = -1;
- _switch_hold_out[held_expanded_output] = -1;
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first,
- -1)));
- }
- _sw_hold_vcs.pop_front();
- }
-}
-
-
-//------------------------------------------------------------------------------
-// switch allocation
-//------------------------------------------------------------------------------
-
-bool IQRouter::_SWAllocAddReq(int input, int vc, int output)
-{
- assert(input >= 0 && input < _inputs);
- assert(vc >= 0 && vc < _vcs);
- assert(output >= 0 && output < _outputs);
-
- // When input_speedup > 1, the virtual channel buffers are interleaved to
- // create multiple input ports to the switch. Similarily, the output ports
- // are interleaved based on their originating input when output_speedup > 1.
-
- int const expanded_input = input * _input_speedup + vc % _input_speedup;
- int const expanded_output = output * _output_speedup + input % _output_speedup;
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert((cur_buf->GetState(vc) == VC::active) ||
- (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)));
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
-
- if((_switch_hold_in[expanded_input] < 0) &&
- (_switch_hold_out[expanded_output] < 0)) {
-
- Allocator * allocator = _sw_allocator;
- int prio = cur_buf->GetPriority(vc);
-
- if(_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)) {
- if(_spec_sw_allocator) {
- allocator = _spec_sw_allocator;
- } else {
- assert(prio >= 0);
- prio += numeric_limits<int>::min();
- }
- }
-
- Allocator::sRequest req;
-
- if(allocator->ReadRequest(req, expanded_input, expanded_output)) {
- if(RoundRobinArbiter::Supersedes(vc, prio, req.label, req.in_pri,
- _sw_rr_offset[expanded_input], _vcs)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Replacing earlier request from VC " << req.label
- << " for output " << output
- << "." << (expanded_output % _output_speedup)
- << " with priority " << req.in_pri
- << " (" << ((cur_buf->GetState(vc) == VC::active) ?
- "non-spec" :
- "spec")
- << ", pri: " << prio
- << ")." << endl;
- }
- allocator->RemoveRequest(expanded_input, expanded_output, req.label);
- allocator->AddRequest(expanded_input, expanded_output, vc, prio, prio);
- return true;
- }
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Output " << output
- << "." << (expanded_output % _output_speedup)
- << " was already requested by VC " << req.label
- << " with priority " << req.in_pri
- << " (pri: " << prio
- << ")." << endl;
- }
- return false;
- }
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Requesting output " << output
- << "." << (expanded_output % _output_speedup)
- << " (" << ((cur_buf->GetState(vc) == VC::active) ?
- "non-spec" :
- "spec")
- << ", pri: " << prio
- << ")." << endl;
- }
- allocator->AddRequest(expanded_input, expanded_output, vc, prio, prio);
- return true;
- }
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Ignoring output " << output
- << "." << (expanded_output % _output_speedup)
- << " due to switch hold (";
- if(_switch_hold_in[expanded_input] >= 0) {
- *gWatchOut << "input: " << input
- << "." << (expanded_input % _input_speedup);
- if(_switch_hold_out[expanded_output] >= 0) {
- *gWatchOut << ", ";
- }
- }
- if(_switch_hold_out[expanded_output] >= 0) {
- *gWatchOut << "output: " << output
- << "." << (expanded_output % _output_speedup);
- }
- *gWatchOut << ")." << endl;
- }
- return false;
-}
-
-void IQRouter::_SWAllocEvaluate( )
-{
- bool watched = false;
-
- for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _sw_alloc_vcs.begin();
- iter != _sw_alloc_vcs.end();
- ++iter) {
-
- int const time = iter->first;
- if(time >= 0) {
- break;
- }
-
- int const input = iter->second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = iter->second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- assert(iter->second.second == -1);
-
- assert(_switch_hold_vc[input * _input_speedup + vc % _input_speedup] != vc);
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert((cur_buf->GetState(vc) == VC::active) ||
- (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)));
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Beginning switch allocation for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
-
- if(cur_buf->GetState(vc) == VC::active) {
-
- int const dest_output = cur_buf->GetOutputPort(vc);
- assert((dest_output >= 0) && (dest_output < _outputs));
- int const dest_vc = cur_buf->GetOutputVC(vc);
- assert((dest_vc >= 0) && (dest_vc < _vcs));
-
- BufferState const * const dest_buf = _next_buf[dest_output];
-
- if(dest_buf->IsFullFor(dest_vc) || ( _output_buffer_size!=-1 && _output_buffer[dest_output].size()>=(size_t)(_output_buffer_size))) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " VC " << dest_vc
- << " at output " << dest_output
- << " is full." << endl;
- }
- iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED;
- continue;
- }
- bool const requested = _SWAllocAddReq(input, vc, dest_output);
- watched |= requested && f->watch;
- continue;
- }
- assert(_speculative && (cur_buf->GetState(vc) == VC::vc_alloc));
- assert(f->head);
-
- // The following models the speculative VC allocation aspects of the
- // pipeline. An input VC with a request in for an egress virtual channel
- // will also speculatively bid for the switch regardless of whether the VC
- // allocation succeeds.
-
- OutputSet const * const route_set = cur_buf->GetRouteSet(vc);
- assert(route_set);
-
- set<OutputSet::sSetElement> const setlist = route_set->GetSet();
-
- assert(!_noq || (setlist.size() == 1));
-
- for(set<OutputSet::sSetElement>::const_iterator iset = setlist.begin();
- iset != setlist.end();
- ++iset) {
-
- int const dest_output = iset->output_port;
- assert((dest_output >= 0) && (dest_output < _outputs));
-
- // for lower levels of speculation, ignore credit availability and always
- // issue requests for all output ports in route set
-
- BufferState const * const dest_buf = _next_buf[dest_output];
-
- bool elig = false;
- bool cred = false;
-
- if(_spec_check_elig) {
-
- // for higher levels of speculation, check if at least one suitable VC
- // is available at the current output
-
- int vc_start;
- int vc_end;
-
- if(_noq && _noq_next_output_port[input][vc] >= 0) {
- assert(!_routing_delay);
- vc_start = _noq_next_vc_start[input][vc];
- vc_end = _noq_next_vc_end[input][vc];
- } else {
- vc_start = iset->vc_start;
- vc_end = iset->vc_end;
- }
- assert(vc_start >= 0 && vc_start < _vcs);
- assert(vc_end >= 0 && vc_end < _vcs);
- assert(vc_end >= vc_start);
-
- for(int dest_vc = vc_start; dest_vc <= vc_end; ++dest_vc) {
- assert((dest_vc >= 0) && (dest_vc < _vcs));
-
- if(dest_buf->IsAvailableFor(dest_vc) && ( _output_buffer_size==-1 || _output_buffer[dest_output].size()<(size_t)(_output_buffer_size))) {
- elig = true;
- if(!_spec_check_cred || !dest_buf->IsFullFor(dest_vc)) {
- cred = true;
- break;
- }
- }
- }
- }
-
- if(_spec_check_elig && !elig) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Output " << dest_output
- << " has no suitable VCs available." << endl;
- }
- iter->second.second = STALL_BUFFER_BUSY;
- } else if(_spec_check_cred && !cred) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " All suitable VCs at output " << dest_output
- << " are full." << endl;
- }
- iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED;
- } else {
- bool const requested = _SWAllocAddReq(input, vc, dest_output);
- watched |= requested && f->watch;
- }
- }
- }
-
- if(watched) {
- *gWatchOut << GetSimTime() << " | " << _sw_allocator->FullName() << " | ";
- _sw_allocator->PrintRequests(gWatchOut);
- if(_spec_sw_allocator) {
- *gWatchOut << GetSimTime() << " | " << _spec_sw_allocator->FullName() << " | ";
- _spec_sw_allocator->PrintRequests(gWatchOut);
- }
- }
-
- _sw_allocator->Allocate();
- if(_spec_sw_allocator)
- _spec_sw_allocator->Allocate();
-
- if(watched) {
- *gWatchOut << GetSimTime() << " | " << _sw_allocator->FullName() << " | ";
- _sw_allocator->PrintGrants(gWatchOut);
- if(_spec_sw_allocator) {
- *gWatchOut << GetSimTime() << " | " << _spec_sw_allocator->FullName() << " | ";
- _spec_sw_allocator->PrintGrants(gWatchOut);
- }
- }
-
- for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _sw_alloc_vcs.begin();
- iter != _sw_alloc_vcs.end();
- ++iter) {
-
- int const time = iter->first;
- if(time >= 0) {
- break;
- }
- iter->first = GetSimTime() + _sw_alloc_delay - 1;
-
- int const input = iter->second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = iter->second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- if(iter->second.second < -1) {
- continue;
- }
-
- assert(iter->second.second == -1);
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert((cur_buf->GetState(vc) == VC::active) ||
- (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)));
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
-
- int const expanded_input = input * _input_speedup + vc % _input_speedup;
-
- int expanded_output = _sw_allocator->OutputAssigned(expanded_input);
-
- if(expanded_output >= 0) {
- assert((expanded_output % _output_speedup) == (input % _output_speedup));
- int const granted_vc = _sw_allocator->ReadRequest(expanded_input, expanded_output);
- if(granted_vc == vc) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Assigning output " << (expanded_output / _output_speedup)
- << "." << (expanded_output % _output_speedup)
- << " to VC " << vc
- << " at input " << input
- << "." << (vc % _input_speedup)
- << "." << endl;
- }
- _sw_rr_offset[expanded_input] = (vc + _input_speedup) % _vcs;
- iter->second.second = expanded_output;
- } else {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Switch allocation failed for VC " << vc
- << " at input " << input
- << ": Granted to VC " << granted_vc << "." << endl;
- }
- iter->second.second = STALL_CROSSBAR_CONFLICT;
- }
- } else if(_spec_sw_allocator) {
- expanded_output = _spec_sw_allocator->OutputAssigned(expanded_input);
- if(expanded_output >= 0) {
- assert((expanded_output % _output_speedup) == (input % _output_speedup));
- if(_spec_mask_by_reqs &&
- _sw_allocator->OutputHasRequests(expanded_output)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Discarding speculative grant for VC " << vc
- << " at input " << input
- << "." << (vc % _input_speedup)
- << " because output " << (expanded_output / _output_speedup)
- << "." << (expanded_output % _output_speedup)
- << " has non-speculative requests." << endl;
- }
- iter->second.second = STALL_CROSSBAR_CONFLICT;
- } else if(!_spec_mask_by_reqs &&
- (_sw_allocator->InputAssigned(expanded_output) >= 0)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Discarding speculative grant for VC " << vc
- << " at input " << input
- << "." << (vc % _input_speedup)
- << " because output " << (expanded_output / _output_speedup)
- << "." << (expanded_output % _output_speedup)
- << " has a non-speculative grant." << endl;
- }
- iter->second.second = STALL_CROSSBAR_CONFLICT;
- } else {
- int const granted_vc = _spec_sw_allocator->ReadRequest(expanded_input,
- expanded_output);
- if(granted_vc == vc) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Assigning output " << (expanded_output / _output_speedup)
- << "." << (expanded_output % _output_speedup)
- << " to VC " << vc
- << " at input " << input
- << "." << (vc % _input_speedup)
- << "." << endl;
- }
- _sw_rr_offset[expanded_input] = (vc + _input_speedup) % _vcs;
- iter->second.second = expanded_output;
- } else {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Switch allocation failed for VC " << vc
- << " at input " << input
- << ": Granted to VC " << granted_vc << "." << endl;
- }
- iter->second.second = STALL_CROSSBAR_CONFLICT;
- }
- }
- } else {
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Switch allocation failed for VC " << vc
- << " at input " << input
- << ": No output granted." << endl;
- }
-
- iter->second.second = STALL_CROSSBAR_CONFLICT;
-
- }
- } else {
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Switch allocation failed for VC " << vc
- << " at input " << input
- << ": No output granted." << endl;
- }
-
- iter->second.second = STALL_CROSSBAR_CONFLICT;
-
- }
- }
-
- if(!_speculative && (_sw_alloc_delay <= 1)) {
- return;
- }
-
- for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _sw_alloc_vcs.begin();
- iter != _sw_alloc_vcs.end();
- ++iter) {
-
- int const time = iter->first;
- assert(time >= 0);
- if(GetSimTime() < time) {
- break;
- }
-
- assert(iter->second.second != -1);
-
- int const expanded_output = iter->second.second;
-
- if(expanded_output >= 0) {
-
- int const output = expanded_output / _output_speedup;
- assert((output >= 0) && (output < _outputs));
-
- BufferState const * const dest_buf = _next_buf[output];
-
- int const input = iter->second.first.first;
- assert((input >= 0) && (input < _inputs));
- assert((input % _output_speedup) == (expanded_output % _output_speedup));
- int const vc = iter->second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- int const expanded_input = input * _input_speedup + vc % _input_speedup;
- assert(_switch_hold_vc[expanded_input] != vc);
-
- Buffer const * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert((cur_buf->GetState(vc) == VC::active) ||
- (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)));
-
- Flit const * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
-
- if((_switch_hold_in[expanded_input] >= 0) ||
- (_switch_hold_out[expanded_output] >= 0)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Discarding grant from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << " due to conflict with held connection at ";
- if(_switch_hold_in[expanded_input] >= 0) {
- *gWatchOut << "input";
- }
- if((_switch_hold_in[expanded_input] >= 0) &&
- (_switch_hold_out[expanded_output] >= 0)) {
- *gWatchOut << " and ";
- }
- if(_switch_hold_out[expanded_output] >= 0) {
- *gWatchOut << "output";
- }
- *gWatchOut << "." << endl;
- }
- iter->second.second = STALL_CROSSBAR_CONFLICT;
- } else if(_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)) {
-
- assert(f->head);
-
- if(_vc_allocator) { // separate VC and switch allocators
-
- int const input_and_vc =
- _vc_shuffle_requests ? (vc*_inputs + input) : (input*_vcs + vc);
- int const output_and_vc = _vc_allocator->OutputAssigned(input_and_vc);
-
- if(output_and_vc < 0) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Discarding grant from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << " due to misspeculation." << endl;
- }
- iter->second.second = -1; // stall is counted in VC allocation path!
- } else if((output_and_vc / _vcs) != output) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Discarding grant from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << " due to port mismatch between VC and switch allocator." << endl;
- }
- iter->second.second = STALL_BUFFER_CONFLICT; // count this case as if we had failed allocation
- } else if(dest_buf->IsFullFor((output_and_vc % _vcs))) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Discarding grant from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << " due to lack of credit." << endl;
- }
- iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED;
- }
-
- } else { // VC allocation is piggybacked onto switch allocation
-
- OutputSet const * const route_set = cur_buf->GetRouteSet(vc);
- assert(route_set);
-
- set<OutputSet::sSetElement> const setlist = route_set->GetSet();
-
- bool busy = true;
- bool full = true;
- bool reserved = false;
-
- assert(!_noq || (setlist.size() == 1));
-
- for(set<OutputSet::sSetElement>::const_iterator iset = setlist.begin();
- iset != setlist.end();
- ++iset) {
- if(iset->output_port == output) {
-
- int vc_start;
- int vc_end;
-
- if(_noq && _noq_next_output_port[input][vc] >= 0) {
- assert(!_routing_delay);
- vc_start = _noq_next_vc_start[input][vc];
- vc_end = _noq_next_vc_end[input][vc];
- } else {
- vc_start = iset->vc_start;
- vc_end = iset->vc_end;
- }
- assert(vc_start >= 0 && vc_start < _vcs);
- assert(vc_end >= 0 && vc_end < _vcs);
- assert(vc_end >= vc_start);
-
- for(int out_vc = vc_start; out_vc <= vc_end; ++out_vc) {
- assert((out_vc >= 0) && (out_vc < _vcs));
- if(dest_buf->IsAvailableFor(out_vc)) {
- busy = false;
- if(!dest_buf->IsFullFor(out_vc)) {
- full = false;
- break;
- } else if(!dest_buf->IsFull()) {
- reserved = true;
- }
- }
- }
- if(!full) {
- break;
- }
- }
- }
-
- if(busy) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Discarding grant from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << " because no suitable output VC for piggyback allocation is available." << endl;
- }
- iter->second.second = STALL_BUFFER_BUSY;
- } else if(full) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Discarding grant from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << " because all suitable output VCs for piggyback allocation are full." << endl;
- }
- iter->second.second = reserved ? STALL_BUFFER_RESERVED : STALL_BUFFER_FULL;
- }
-
- }
-
- } else {
- assert(cur_buf->GetOutputPort(vc) == output);
-
- int const match_vc = cur_buf->GetOutputVC(vc);
- assert((match_vc >= 0) && (match_vc < _vcs));
-
- if(dest_buf->IsFullFor(match_vc)) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Discarding grant from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << " due to lack of credit." << endl;
- }
- iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED;
- }
- }
- }
- }
-}
-
-void IQRouter::_SWAllocUpdate( )
-{
- while(!_sw_alloc_vcs.empty()) {
-
- pair<int, pair<pair<int, int>, int> > const & item = _sw_alloc_vcs.front();
-
- int const time = item.first;
- if((time < 0) || (GetSimTime() < time)) {
- break;
- }
- assert(GetSimTime() == time);
-
- int const input = item.second.first.first;
- assert((input >= 0) && (input < _inputs));
- int const vc = item.second.first.second;
- assert((vc >= 0) && (vc < _vcs));
-
- Buffer * const cur_buf = _buf[input];
- assert(!cur_buf->Empty(vc));
- assert((cur_buf->GetState(vc) == VC::active) ||
- (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)));
-
- Flit * const f = cur_buf->FrontFlit(vc);
- assert(f);
- assert(f->vc == vc);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Completed switch allocation for VC " << vc
- << " at input " << input
- << " (front: " << f->id
- << ")." << endl;
- }
-
- int const expanded_output = item.second.second;
-
- if(expanded_output >= 0) {
-
- int const expanded_input = input * _input_speedup + vc % _input_speedup;
- assert(_switch_hold_vc[expanded_input] < 0);
- assert(_switch_hold_in[expanded_input] < 0);
- assert(_switch_hold_out[expanded_output] < 0);
-
- int const output = expanded_output / _output_speedup;
- assert((output >= 0) && (output < _outputs));
-
- BufferState * const dest_buf = _next_buf[output];
-
- int match_vc;
-
- if(!_vc_allocator && (cur_buf->GetState(vc) == VC::vc_alloc)) {
-
- assert(f->head);
-
- int const cl = f->cl;
- assert((cl >= 0) && (cl < _classes));
-
- int const vc_offset = _vc_rr_offset[output*_classes+cl];
-
- match_vc = -1;
- int match_prio = numeric_limits<int>::min();
-
- const OutputSet * route_set = cur_buf->GetRouteSet(vc);
- set<OutputSet::sSetElement> const setlist = route_set->GetSet();
-
- assert(!_noq || (setlist.size() == 1));
-
- for(set<OutputSet::sSetElement>::const_iterator iset = setlist.begin();
- iset != setlist.end();
- ++iset) {
- if(iset->output_port == output) {
-
- int vc_start;
- int vc_end;
-
- if(_noq && _noq_next_output_port[input][vc] >= 0) {
- assert(!_routing_delay);
- vc_start = _noq_next_vc_start[input][vc];
- vc_end = _noq_next_vc_end[input][vc];
- } else {
- vc_start = iset->vc_start;
- vc_end = iset->vc_end;
- }
- assert(vc_start >= 0 && vc_start < _vcs);
- assert(vc_end >= 0 && vc_end < _vcs);
- assert(vc_end >= vc_start);
-
- for(int out_vc = vc_start; out_vc <= vc_end; ++out_vc) {
- assert((out_vc >= 0) && (out_vc < _vcs));
-
- int vc_prio = iset->pri;
- if(_vc_prioritize_empty && !dest_buf->IsEmptyFor(out_vc)) {
- assert(vc_prio >= 0);
- vc_prio += numeric_limits<int>::min();
- }
-
- // FIXME: This check should probably be performed in Evaluate(),
- // not Update(), as the latter can cause the outcome to depend on
- // the order of evaluation!
- if(dest_buf->IsAvailableFor(out_vc) &&
- !dest_buf->IsFullFor(out_vc) &&
- ((match_vc < 0) ||
- RoundRobinArbiter::Supersedes(out_vc, vc_prio,
- match_vc, match_prio,
- vc_offset, _vcs))) {
- match_vc = out_vc;
- match_prio = vc_prio;
- }
- }
- }
- }
- assert(match_vc >= 0);
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Allocating VC " << match_vc
- << " at output " << output
- << " via piggyback VC allocation." << endl;
- }
-
- cur_buf->SetState(vc, VC::active);
- cur_buf->SetOutput(vc, output, match_vc);
- dest_buf->TakeBuffer(match_vc, input*_vcs + vc);
-
- _vc_rr_offset[output*_classes+cl] = (match_vc + 1) % _vcs;
-
- } else {
-
- assert(cur_buf->GetOutputPort(vc) == output);
-
- match_vc = cur_buf->GetOutputVC(vc);
-
- }
- assert((match_vc >= 0) && (match_vc < _vcs));
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " Scheduling switch connection from input " << input
- << "." << (vc % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << "." << endl;
- }
-
- cur_buf->RemoveFlit(vc);
-
-#ifdef TRACK_FLOWS
- --_stored_flits[f->cl][input];
- if(f->tail) --_active_packets[f->cl][input];
-#endif
-
- _bufferMonitor->read(input, f) ;
-
- f->hops++;
- f->vc = match_vc;
-
- if(!_routing_delay && f->head) {
- const FlitChannel * channel = _output_channels[output];
- const Router * router = channel->GetSink();
- if(router) {
- if(_noq) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Updating lookahead routing information for flit " << f->id
- << " (NOQ)." << endl;
- }
- int next_output_port = _noq_next_output_port[input][vc];
- assert(next_output_port >= 0);
- _noq_next_output_port[input][vc] = -1;
- int next_vc_start = _noq_next_vc_start[input][vc];
- assert(next_vc_start >= 0 && next_vc_start < _vcs);
- _noq_next_vc_start[input][vc] = -1;
- int next_vc_end = _noq_next_vc_end[input][vc];
- assert(next_vc_end >= 0 && next_vc_end < _vcs);
- _noq_next_vc_end[input][vc] = -1;
- f->la_route_set.Clear();
- f->la_route_set.AddRange(next_output_port, next_vc_start, next_vc_end);
- } else {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Updating lookahead routing information for flit " << f->id
- << "." << endl;
- }
- int in_channel = channel->GetSinkPort();
- _rf(router, f, in_channel, &f->la_route_set, false);
- }
- } else {
- f->la_route_set.Clear();
- }
- }
-
-#ifdef TRACK_FLOWS
- ++_outstanding_credits[f->cl][output];
- _outstanding_classes[output][f->vc].push(f->cl);
-#endif
-
- dest_buf->SendingFlit(f);
-
- _crossbar_flits.push_back(make_pair(-1, make_pair(f, make_pair(expanded_input, expanded_output))));
-
- if(_out_queue_credits.count(input) == 0) {
- _out_queue_credits.insert(make_pair(input, Credit::New()));
- }
- _out_queue_credits.find(input)->second->vc.insert(vc);
-
- if(cur_buf->Empty(vc)) {
- if(f->tail) {
- cur_buf->SetState(vc, VC::idle);
- }
- } else {
- Flit * const nf = cur_buf->FrontFlit(vc);
- assert(nf);
- assert(nf->vc == vc);
- if(f->tail) {
- assert(nf->head);
- if(_routing_delay) {
- cur_buf->SetState(vc, VC::routing);
- _route_vcs.push_back(make_pair(-1, item.second.first));
- } else {
- if(nf->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Using precomputed lookahead routing information for VC " << vc
- << " at input " << input
- << " (front: " << nf->id
- << ")." << endl;
- }
- cur_buf->SetRouteSet(vc, &nf->la_route_set);
- cur_buf->SetState(vc, VC::vc_alloc);
- if(_speculative) {
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first,
- -1)));
- }
- if(_vc_allocator) {
- _vc_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first,
- -1)));
- }
- if(_noq) {
- _UpdateNOQ(input, vc, nf);
- }
- }
- } else {
- if(_hold_switch_for_packet) {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Setting up switch hold for VC " << vc
- << " at input " << input
- << "." << (expanded_input % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << "." << endl;
- }
- _switch_hold_vc[expanded_input] = vc;
- _switch_hold_in[expanded_input] = expanded_output;
- _switch_hold_out[expanded_output] = expanded_input;
- _sw_hold_vcs.push_back(make_pair(-1, make_pair(item.second.first,
- -1)));
- } else {
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first,
- -1)));
- }
- }
- }
- } else {
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << " No output port allocated." << endl;
- }
-
-#ifdef TRACK_STALLS
- assert((expanded_output == -1) || // for stalls that are accounted for in VC allocation path
- (expanded_output == STALL_BUFFER_BUSY) ||
- (expanded_output == STALL_BUFFER_CONFLICT) ||
- (expanded_output == STALL_BUFFER_FULL) ||
- (expanded_output == STALL_BUFFER_RESERVED) ||
- (expanded_output == STALL_CROSSBAR_CONFLICT));
- if(expanded_output == STALL_BUFFER_BUSY) {
- ++_buffer_busy_stalls[f->cl];
- } else if(expanded_output == STALL_BUFFER_CONFLICT) {
- ++_buffer_conflict_stalls[f->cl];
- } else if(expanded_output == STALL_BUFFER_FULL) {
- ++_buffer_full_stalls[f->cl];
- } else if(expanded_output == STALL_BUFFER_RESERVED) {
- ++_buffer_reserved_stalls[f->cl];
- } else if(expanded_output == STALL_CROSSBAR_CONFLICT) {
- ++_crossbar_conflict_stalls[f->cl];
- }
-#endif
-
- _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, -1)));
- }
- _sw_alloc_vcs.pop_front();
- }
-}
-
-
-//------------------------------------------------------------------------------
-// switch traversal
-//------------------------------------------------------------------------------
-
-void IQRouter::_SwitchEvaluate( )
-{
- for(deque<pair<int, pair<Flit *, pair<int, int> > > >::iterator iter = _crossbar_flits.begin();
- iter != _crossbar_flits.end();
- ++iter) {
-
- int const time = iter->first;
- if(time >= 0) {
- break;
- }
- iter->first = GetSimTime() + _crossbar_delay - 1;
-
- Flit const * const f = iter->second.first;
- assert(f);
-
- int const expanded_input = iter->second.second.first;
- int const expanded_output = iter->second.second.second;
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Beginning crossbar traversal for flit " << f->id
- << " from input " << (expanded_input / _input_speedup)
- << "." << (expanded_input % _input_speedup)
- << " to output " << (expanded_output / _output_speedup)
- << "." << (expanded_output % _output_speedup)
- << "." << endl;
- }
- }
-}
-
-void IQRouter::_SwitchUpdate( )
-{
- while(!_crossbar_flits.empty()) {
-
- pair<int, pair<Flit *, pair<int, int> > > const & item = _crossbar_flits.front();
-
- int const time = item.first;
- if((time < 0) || (GetSimTime() < time)) {
- break;
- }
- assert(GetSimTime() == time);
-
- Flit * const f = item.second.first;
- assert(f);
-
- int const expanded_input = item.second.second.first;
- int const input = expanded_input / _input_speedup;
- assert((input >= 0) && (input < _inputs));
- int const expanded_output = item.second.second.second;
- int const output = expanded_output / _output_speedup;
- assert((output >= 0) && (output < _outputs));
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Completed crossbar traversal for flit " << f->id
- << " from input " << input
- << "." << (expanded_input % _input_speedup)
- << " to output " << output
- << "." << (expanded_output % _output_speedup)
- << "." << endl;
- }
- _switchMonitor->traversal(input, output, f) ;
-
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Buffering flit " << f->id
- << " at output " << output
- << "." << endl;
- }
- _output_buffer[output].push(f);
- //the output buffer size isn't precise due to flits in flight
- //but there is a maximum bound based on output speed up and ST traversal
- assert(_output_buffer[output].size()<=(size_t)_output_buffer_size+ _crossbar_delay* _output_speedup+( _output_speedup-1) ||_output_buffer_size==-1);
- _crossbar_flits.pop_front();
- }
-}
-
-
-//------------------------------------------------------------------------------
-// output queuing
-//------------------------------------------------------------------------------
-
-void IQRouter::_OutputQueuing( )
-{
- for(map<int, Credit *>::const_iterator iter = _out_queue_credits.begin();
- iter != _out_queue_credits.end();
- ++iter) {
-
- int const input = iter->first;
- assert((input >= 0) && (input < _inputs));
-
- Credit * const c = iter->second;
- assert(c);
- assert(!c->vc.empty());
-
- _credit_buffer[input].push(c);
- }
- _out_queue_credits.clear();
-}
-
-//------------------------------------------------------------------------------
-// write outputs
-//------------------------------------------------------------------------------
-
-void IQRouter::_SendFlits( )
-{
- for ( int output = 0; output < _outputs; ++output ) {
- if ( !_output_buffer[output].empty( ) ) {
- Flit * const f = _output_buffer[output].front( );
- assert(f);
- _output_buffer[output].pop( );
-
-#ifdef TRACK_FLOWS
- ++_sent_flits[f->cl][output];
-#endif
-
- if(f->watch)
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Sending flit " << f->id
- << " to channel at output " << output
- << "." << endl;
- if(gTrace) {
- cout << "Outport " << output << endl << "Stop Mark" << endl;
- }
- _output_channels[output]->Send( f );
- }
- }
-}
-
-void IQRouter::_SendCredits( )
-{
- for ( int input = 0; input < _inputs; ++input ) {
- if ( !_credit_buffer[input].empty( ) ) {
- Credit * const c = _credit_buffer[input].front( );
- assert(c);
- _credit_buffer[input].pop( );
- _input_credits[input]->Send( c );
- }
- }
-}
-
-
-//------------------------------------------------------------------------------
-// misc.
-//------------------------------------------------------------------------------
-
-void IQRouter::Display( ostream & os ) const
-{
- for ( int input = 0; input < _inputs; ++input ) {
- _buf[input]->Display( os );
- }
-}
-
-int IQRouter::GetUsedCredit(int o) const
-{
- assert((o >= 0) && (o < _outputs));
- BufferState const * const dest_buf = _next_buf[o];
- return dest_buf->Occupancy();
-}
-
-int IQRouter::GetBufferOccupancy(int i) const {
- assert(i >= 0 && i < _inputs);
- return _buf[i]->GetOccupancy();
-}
-
-#ifdef TRACK_BUFFERS
-int IQRouter::GetUsedCreditForClass(int output, int cl) const
-{
- assert((output >= 0) && (output < _outputs));
- BufferState const * const dest_buf = _next_buf[output];
- return dest_buf->OccupancyForClass(cl);
-}
-
-int IQRouter::GetBufferOccupancyForClass(int input, int cl) const
-{
- assert((input >= 0) && (input < _inputs));
- return _buf[input]->GetOccupancyForClass(cl);
-}
-#endif
-
-vector<int> IQRouter::UsedCredits() const
-{
- vector<int> result(_outputs*_vcs);
- for(int o = 0; o < _outputs; ++o) {
- for(int v = 0; v < _vcs; ++v) {
- result[o*_vcs+v] = _next_buf[o]->OccupancyFor(v);
- }
- }
- return result;
-}
-
-vector<int> IQRouter::FreeCredits() const
-{
- vector<int> result(_outputs*_vcs);
- for(int o = 0; o < _outputs; ++o) {
- for(int v = 0; v < _vcs; ++v) {
- result[o*_vcs+v] = _next_buf[o]->AvailableFor(v);
- }
- }
- return result;
-}
-
-vector<int> IQRouter::MaxCredits() const
-{
- vector<int> result(_outputs*_vcs);
- for(int o = 0; o < _outputs; ++o) {
- for(int v = 0; v < _vcs; ++v) {
- result[o*_vcs+v] = _next_buf[o]->LimitFor(v);
- }
- }
- return result;
-}
-
-void IQRouter::_UpdateNOQ(int input, int vc, Flit const * f) {
- assert(!_routing_delay);
- assert(f);
- assert(f->vc == vc);
- assert(f->head);
- set<OutputSet::sSetElement> sl = f->la_route_set.GetSet();
- assert(sl.size() == 1);
- int out_port = sl.begin()->output_port;
- const FlitChannel * channel = _output_channels[out_port];
- const Router * router = channel->GetSink();
- if(router) {
- int in_channel = channel->GetSinkPort();
- OutputSet nos;
- _rf(router, f, in_channel, &nos, false);
- sl = nos.GetSet();
- assert(sl.size() == 1);
- OutputSet::sSetElement const & se = *sl.begin();
- int next_output_port = se.output_port;
- assert(next_output_port >= 0);
- assert(_noq_next_output_port[input][vc] < 0);
- _noq_next_output_port[input][vc] = next_output_port;
- int next_vc_count = (se.vc_end - se.vc_start + 1) / router->NumOutputs();
- int next_vc_start = se.vc_start + next_output_port * next_vc_count;
- assert(next_vc_start >= 0 && next_vc_start < _vcs);
- assert(_noq_next_vc_start[input][vc] < 0);
- _noq_next_vc_start[input][vc] = next_vc_start;
- int next_vc_end = se.vc_start + (next_output_port + 1) * next_vc_count - 1;
- assert(next_vc_end >= 0 && next_vc_end < _vcs);
- assert(_noq_next_vc_end[input][vc] < 0);
- _noq_next_vc_end[input][vc] = next_vc_end;
- assert(next_vc_start <= next_vc_end);
- if(f->watch) {
- *gWatchOut << GetSimTime() << " | " << FullName() << " | "
- << "Computing lookahead routing information for flit " << f->id
- << " (NOQ)." << endl;
- }
- }
-}
diff --git a/src/intersim2/.svn/pristine/f9/f9cf31dbae18e4e1930dc0632175d9c420d3c067.svn-base b/src/intersim2/.svn/pristine/f9/f9cf31dbae18e4e1930dc0632175d9c420d3c067.svn-base
deleted file mode 100644
index d58d4a1..0000000
--- a/src/intersim2/.svn/pristine/f9/f9cf31dbae18e4e1930dc0632175d9c420d3c067.svn-base
+++ /dev/null
@@ -1,107 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*flit.cpp
- *
- *flit struct is a flit, carries all the control signals that a flit needs
- *Add additional signals as necessary. Flits has no concept of length
- *it is a singluar object.
- *
- *When adding objects make sure to set a default value in this constructor
- */
-
-#include "booksim.hpp"
-#include "flit.hpp"
-
-stack<Flit *> Flit::_all;
-stack<Flit *> Flit::_free;
-
-ostream& operator<<( ostream& os, const Flit& f )
-{
- os << " Flit ID: " << f.id << " (" << &f << ")"
- << " Packet ID: " << f.pid
- << " Type: " << f.type
- << " Head: " << f.head
- << " Tail: " << f.tail << endl;
- os << " Source: " << f.src << " Dest: " << f.dest << " Intm: "<<f.intm<<endl;
- os << " Creation time: " << f.ctime << " Injection time: " << f.itime << " Arrival time: " << f.atime << " Phase: "<<f.ph<< endl;
- os << " VC: " << f.vc << endl;
- return os;
-}
-
-Flit::Flit()
-{
- Reset();
-}
-
-void Flit::Reset()
-{
- type = ANY_TYPE ;
- vc = -1 ;
- cl = -1 ;
- head = false ;
- tail = false ;
- ctime = -1 ;
- itime = -1 ;
- atime = -1 ;
- id = -1 ;
- pid = -1 ;
- hops = 0 ;
- watch = false ;
- record = false ;
- intm = 0;
- src = -1;
- dest = -1;
- pri = 0;
- intm =-1;
- ph = -1;
- data = 0;
-}
-
-Flit * Flit::New() {
- Flit * f;
- if(_free.empty()) {
- f = new Flit;
- _all.push(f);
- } else {
- f = _free.top();
- f->Reset();
- _free.pop();
- }
- return f;
-}
-
-void Flit::Free() {
- _free.push(this);
-}
-
-void Flit::FreeAll() {
- while(!_all.empty()) {
- delete _all.top();
- _all.pop();
- }
-}
diff --git a/src/intersim2/.svn/pristine/f9/f9ef776d4727c7e2a1e057f5839da76e854ccae5.svn-base b/src/intersim2/.svn/pristine/f9/f9ef776d4727c7e2a1e057f5839da76e854ccae5.svn-base
deleted file mode 100644
index 024104e..0000000
--- a/src/intersim2/.svn/pristine/f9/f9ef776d4727c7e2a1e057f5839da76e854ccae5.svn-base
+++ /dev/null
@@ -1,40 +0,0 @@
-// $Id$
-
-// Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// Redistributions of source code must retain the above copyright notice, this
-// list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-
-//simple 8X8 torus under injection mode
-
-
-// Topology
-topology = torus;
-k = 8;
-n = 2;
-// Routing
-routing_function = dim_order;
-// Flow control
-num_vcs = 2;
-// Traffic
-traffic = uniform;
-injection_rate = 0.15;
diff --git a/src/intersim2/.svn/pristine/fa/fad571d200d6232ee119a96b2ae1820f3d6903fa.svn-base b/src/intersim2/.svn/pristine/fa/fad571d200d6232ee119a96b2ae1820f3d6903fa.svn-base
deleted file mode 100644
index 174d030..0000000
--- a/src/intersim2/.svn/pristine/fa/fad571d200d6232ee119a96b2ae1820f3d6903fa.svn-base
+++ /dev/null
@@ -1,676 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*buffer_state.cpp
- *
- * This class is the buffere state of the next router down the channel
- * tracks the credit and how much of the buffer is in use
- */
-
-#include <iostream>
-#include <sstream>
-#include <cstdlib>
-#include <cassert>
-#include <limits>
-
-#include "booksim.hpp"
-#include "buffer_state.hpp"
-#include "random_utils.hpp"
-#include "globals.hpp"
-
-//#define DEBUG_FEEDBACK
-//#define DEBUG_SIMPLEFEEDBACK
-
-BufferState::BufferPolicy::BufferPolicy(Configuration const & config, BufferState * parent, const string & name)
-: Module(parent, name), _buffer_state(parent)
-{
-}
-
-void BufferState::BufferPolicy::TakeBuffer(int vc) {
-}
-
-void BufferState::BufferPolicy::SendingFlit(Flit const * const f) {
-}
-
-void BufferState::BufferPolicy::FreeSlotFor(int vc) {
-}
-
-BufferState::BufferPolicy * BufferState::BufferPolicy::New(Configuration const & config, BufferState * parent, const string & name)
-{
- BufferPolicy * sp = NULL;
- string buffer_policy = config.GetStr("buffer_policy");
- if(buffer_policy == "private") {
- sp = new PrivateBufferPolicy(config, parent, name);
- } else if(buffer_policy == "shared") {
- sp = new SharedBufferPolicy(config, parent, name);
- } else if(buffer_policy == "limited") {
- sp = new LimitedSharedBufferPolicy(config, parent, name);
- } else if(buffer_policy == "dynamic") {
- sp = new DynamicLimitedSharedBufferPolicy(config, parent, name);
- } else if(buffer_policy == "shifting") {
- sp = new ShiftingDynamicLimitedSharedBufferPolicy(config, parent, name);
- } else if(buffer_policy == "feedback") {
- sp = new FeedbackSharedBufferPolicy(config, parent, name);
- } else if(buffer_policy == "simplefeedback") {
- sp = new SimpleFeedbackSharedBufferPolicy(config, parent, name);
- } else {
- cout << "Unknown buffer policy: " << buffer_policy << endl;
- }
- return sp;
-}
-
-BufferState::PrivateBufferPolicy::PrivateBufferPolicy(Configuration const & config, BufferState * parent, const string & name)
- : BufferPolicy(config, parent, name)
-{
- int const vcs = config.GetInt( "num_vcs" );
- int const buf_size = config.GetInt("buf_size");
- if(buf_size <= 0) {
- _vc_buf_size = config.GetInt("vc_buf_size");
- } else {
- _vc_buf_size = buf_size / vcs;
- }
- assert(_vc_buf_size > 0);
-}
-
-void BufferState::PrivateBufferPolicy::SendingFlit(Flit const * const f)
-{
- int const vc = f->vc;
- if(_buffer_state->OccupancyFor(vc) > _vc_buf_size) {
- ostringstream err;
- err << "Buffer overflow for VC " << vc;
- Error(err.str());
- }
-}
-
-bool BufferState::PrivateBufferPolicy::IsFullFor(int vc) const
-{
- return (_buffer_state->OccupancyFor(vc) >= _vc_buf_size);
-}
-
-int BufferState::PrivateBufferPolicy::AvailableFor(int vc) const
-{
- return _vc_buf_size - _buffer_state->OccupancyFor(vc);
-}
-
-int BufferState::PrivateBufferPolicy::LimitFor(int vc) const
-{
- return _vc_buf_size;
-}
-
-BufferState::SharedBufferPolicy::SharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name)
- : BufferPolicy(config, parent, name), _shared_buf_occupancy(0)
-{
- int const vcs = config.GetInt( "num_vcs" );
- int num_private_bufs = config.GetInt("private_bufs");
- if(num_private_bufs < 0) {
- num_private_bufs = vcs;
- } else if(num_private_bufs == 0) {
- num_private_bufs = 1;
- }
-
- _private_buf_occupancy.resize(num_private_bufs, 0);
-
- _buf_size = config.GetInt("buf_size");
- if(_buf_size < 0) {
- _buf_size = vcs * config.GetInt("vc_buf_size");
- }
-
- _private_buf_size = config.GetIntArray("private_buf_size");
- if(_private_buf_size.empty()) {
- int const bs = config.GetInt("private_buf_size");
- if(bs < 0) {
- _private_buf_size.push_back(_buf_size / num_private_bufs);
- } else {
- _private_buf_size.push_back(bs);
- }
- }
- _private_buf_size.resize(num_private_bufs, _private_buf_size.back());
-
- vector<int> start_vc = config.GetIntArray("private_buf_start_vc");
- if(start_vc.empty()) {
- int const sv = config.GetInt("private_buf_start_vc");
- if(sv < 0) {
- start_vc.resize(num_private_bufs);
- for(int i = 0; i < num_private_bufs; ++i) {
- start_vc[i] = i * vcs / num_private_bufs;
- }
- } else {
- start_vc.push_back(sv);
- }
- }
-
- vector<int> end_vc = config.GetIntArray("private_buf_end_vc");
- if(end_vc.empty()) {
- int const ev = config.GetInt("private_buf_end_vc");
- if(ev < 0) {
- end_vc.resize(num_private_bufs);
- for(int i = 0; i < num_private_bufs; ++i) {
- end_vc[i] = (i + 1) * vcs / num_private_bufs - 1;
- }
- } else {
- end_vc.push_back(ev);
- }
- }
-
- _private_buf_vc_map.resize(vcs, -1);
- _shared_buf_size = _buf_size;
- for(int i = 0; i < num_private_bufs; ++i) {
- _shared_buf_size -= _private_buf_size[i];
- assert(start_vc[i] <= end_vc[i]);
- for(int v = start_vc[i]; v <= end_vc[i]; ++v) {
- assert(_private_buf_vc_map[v] < 0);
- _private_buf_vc_map[v] = i;
- }
- }
- assert(_shared_buf_size >= 0);
-
- _reserved_slots.resize(vcs, 0);
-}
-
-void BufferState::SharedBufferPolicy::ProcessFreeSlot(int vc)
-{
- int i = _private_buf_vc_map[vc];
- --_private_buf_occupancy[i];
- if(_private_buf_occupancy[i] < 0) {
- ostringstream err;
- err << "Private buffer occupancy fell below zero for buffer " << i;
- Error(err.str());
- } else if(_private_buf_occupancy[i] >= _private_buf_size[i]) {
- --_shared_buf_occupancy;
- if(_shared_buf_occupancy < 0) {
- Error("Shared buffer occupancy fell below zero.");
- }
- }
-}
-
-void BufferState::SharedBufferPolicy::SendingFlit(Flit const * const f)
-{
- int const vc = f->vc;
- if(_reserved_slots[vc] > 0) {
- --_reserved_slots[vc];
- } else {
- int i = _private_buf_vc_map[vc];
- ++_private_buf_occupancy[i];
- if(_private_buf_occupancy[i] > _private_buf_size[i]) {
- ++_shared_buf_occupancy;
- if(_shared_buf_occupancy > _shared_buf_size) {
- Error("Shared buffer overflow.");
- }
- }
- }
- if(f->tail) {
- while(_reserved_slots[vc]) {
- --_reserved_slots[vc];
- ProcessFreeSlot(vc);
- }
- }
-}
-
-void BufferState::SharedBufferPolicy::FreeSlotFor(int vc)
-{
- if(!_buffer_state->IsAvailableFor(vc) && _buffer_state->IsEmptyFor(vc)) {
- ++_reserved_slots[vc];
- } else {
- ProcessFreeSlot(vc);
- }
-}
-
-bool BufferState::SharedBufferPolicy::IsFullFor(int vc) const
-{
- int i = _private_buf_vc_map[vc];
- return ((_reserved_slots[vc] == 0) &&
- (_private_buf_occupancy[i] >= _private_buf_size[i]) &&
- (_shared_buf_occupancy >= _shared_buf_size));
-}
-
-int BufferState::SharedBufferPolicy::AvailableFor(int vc) const
-{
- int i = _private_buf_vc_map[vc];
- return (_reserved_slots[vc] +
- max(_private_buf_size[i] - _private_buf_occupancy[i], 0) +
- (_shared_buf_size - _shared_buf_occupancy));
-}
-
-int BufferState::SharedBufferPolicy::LimitFor(int vc) const
-{
- int i = _private_buf_vc_map[vc];
- return (_private_buf_size[i] + _shared_buf_size);
-}
-
-BufferState::LimitedSharedBufferPolicy::LimitedSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name)
- : SharedBufferPolicy(config, parent, name), _active_vcs(0)
-{
- _vcs = config.GetInt("num_vcs");
- _max_held_slots = config.GetInt("max_held_slots");
- if(_max_held_slots < 0) {
- _max_held_slots = _buf_size;
- }
-}
-
-void BufferState::LimitedSharedBufferPolicy::TakeBuffer(int vc)
-{
- ++_active_vcs;
- if(_active_vcs > _vcs) {
- Error("Number of active VCs is too large.");
- }
-}
-
-void BufferState::LimitedSharedBufferPolicy::SendingFlit(Flit const * const f)
-{
- SharedBufferPolicy::SendingFlit(f);
- if(f->tail) {
- --_active_vcs;
- if(_active_vcs < 0) {
- Error("Number of active VCs fell below zero.");
- }
- }
-}
-
-bool BufferState::LimitedSharedBufferPolicy::IsFullFor(int vc) const
-{
- return (SharedBufferPolicy::IsFullFor(vc) ||
- (_buffer_state->OccupancyFor(vc) >= _max_held_slots));
-}
-
-int BufferState::LimitedSharedBufferPolicy::AvailableFor(int vc) const
-{
- return min(SharedBufferPolicy::AvailableFor(vc),
- _max_held_slots - _buffer_state->OccupancyFor(vc));
-}
-
-int BufferState::LimitedSharedBufferPolicy::LimitFor(int vc) const
-{
- return min(SharedBufferPolicy::LimitFor(vc), _max_held_slots);
-}
-
-BufferState::DynamicLimitedSharedBufferPolicy::DynamicLimitedSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name)
- : LimitedSharedBufferPolicy(config, parent, name)
-{
- _max_held_slots = _buf_size;
-}
-
-void BufferState::DynamicLimitedSharedBufferPolicy::TakeBuffer(int vc)
-{
- LimitedSharedBufferPolicy::TakeBuffer(vc);
- assert(_active_vcs > 0);
- _max_held_slots = _buf_size / _active_vcs;
- assert(_max_held_slots > 0);
-}
-
-void BufferState::DynamicLimitedSharedBufferPolicy::SendingFlit(Flit const * const f)
-{
- LimitedSharedBufferPolicy::SendingFlit(f);
- if(f->tail && _active_vcs) {
- _max_held_slots = _buf_size / _active_vcs;
- }
- assert(_max_held_slots > 0);
-}
-
-BufferState::ShiftingDynamicLimitedSharedBufferPolicy::ShiftingDynamicLimitedSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name)
- : DynamicLimitedSharedBufferPolicy(config, parent, name)
-{
-
-}
-
-void BufferState::ShiftingDynamicLimitedSharedBufferPolicy::TakeBuffer(int vc)
-{
- LimitedSharedBufferPolicy::TakeBuffer(vc);
- assert(_active_vcs);
- int i = _active_vcs - 1;
- _max_held_slots = _buf_size;
- while(i) {
- _max_held_slots >>= 1;
- i >>= 1;
- }
- assert(_max_held_slots > 0);
-}
-
-void BufferState::ShiftingDynamicLimitedSharedBufferPolicy::SendingFlit(Flit const * const f)
-{
- LimitedSharedBufferPolicy::SendingFlit(f);
- if(f->tail && _active_vcs) {
- int i = _active_vcs - 1;
- _max_held_slots = _buf_size;
- while(i) {
- _max_held_slots >>= 1;
- i >>= 1;
- }
- }
- assert(_max_held_slots > 0);
-}
-
-BufferState::FeedbackSharedBufferPolicy::FeedbackSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name)
- : SharedBufferPolicy(config, parent, name)
-{
- _aging_scale = config.GetInt("feedback_aging_scale");
- _offset = config.GetInt("feedback_offset");
- _vcs = config.GetInt("num_vcs");
-
- _occupancy_limit.resize(_vcs, _buf_size);
- _round_trip_time.resize(_vcs, -1);
- _flit_sent_time.resize(_vcs);
- _total_mapped_size = _buf_size * _vcs;
- _min_latency = -1;
-}
-
-void BufferState::FeedbackSharedBufferPolicy::SetMinLatency(int min_latency)
-{
-#ifdef DEBUG_FEEDBACK
- cerr << FullName() << ": Setting minimum latency to "
- << min_latency << "." << endl;
-#endif
- _min_latency = min_latency;
-}
-
-void BufferState::FeedbackSharedBufferPolicy::SendingFlit(Flit const * const f)
-{
- SharedBufferPolicy::SendingFlit(f);
- _flit_sent_time[f->vc].push(GetSimTime());
-}
-
-int BufferState::FeedbackSharedBufferPolicy::_ComputeRTT(int vc, int last_rtt) const
-{
- // compute moving average of round-trip time
- int rtt = _round_trip_time[vc];
- if(rtt < 0) {
- return last_rtt;
- }
- return ((rtt << _aging_scale) + last_rtt - rtt) >> _aging_scale;
-}
-
-int BufferState::FeedbackSharedBufferPolicy::_ComputeLimit(int rtt) const
-{
- // for every cycle that the measured average round trip time exceeded the
- // observed minimum round trip time, reduce buffer occupancy limit by one
- assert(_min_latency >= 0);
- return max((_min_latency << 1) - rtt + _offset, 1);
-}
-
-int BufferState::FeedbackSharedBufferPolicy::_ComputeMaxSlots(int vc) const
-{
- int max_slots = _occupancy_limit[vc];
- if(!_flit_sent_time[vc].empty()) {
- int min_rtt = GetSimTime() - _flit_sent_time[vc].front();
- int rtt = _ComputeRTT(vc, min_rtt);
- int limit = _ComputeLimit(rtt);
- max_slots = min(max_slots, limit);
- }
- return max_slots;
-}
-
-void BufferState::FeedbackSharedBufferPolicy::FreeSlotFor(int vc)
-{
- SharedBufferPolicy::FreeSlotFor(vc);
- assert(!_flit_sent_time[vc].empty());
- int const last_rtt = GetSimTime() - _flit_sent_time[vc].front();
-#ifdef DEBUG_FEEDBACK
- cerr << FullName() << ": Probe for VC "
- << vc << " came back after "
- << last_rtt << " cycles."
- << endl;
-#endif
- _flit_sent_time[vc].pop();
-
- int rtt = _ComputeRTT(vc, last_rtt);
-#ifdef DEBUG_FEEDBACK
- int old_rtt = _round_trip_time[vc];
- if(rtt != old_rtt) {
- cerr << FullName() << ": Updating RTT estimate for VC "
- << vc << " from "
- << old_rtt << " to "
- << rtt << " cycles."
- << endl;
- }
-#endif
- _round_trip_time[vc] = rtt;
-
- int limit = _ComputeLimit(rtt);
-#ifdef DEBUG_FEEDBACK
- int old_limit = _occupancy_limit[vc];
- int old_mapped_size = _total_mapped_size;
-#endif
- _total_mapped_size += (limit - _occupancy_limit[vc]);
- _occupancy_limit[vc] = limit;
-#ifdef DEBUG_FEEDBACK
- if(limit != old_limit) {
- cerr << FullName() << ": Occupancy limit for VC "
- << vc << " changed from "
- << old_limit << " to "
- << limit << " slots."
- << endl;
- cerr << FullName() << ": Total mapped buffer space changed from "
- << old_mapped_size << " to "
- << _total_mapped_size << " slots."
- << endl;
- }
-#endif
-}
-
-bool BufferState::FeedbackSharedBufferPolicy::IsFullFor(int vc) const
-{
- if(SharedBufferPolicy::IsFullFor(vc)) {
- return true;
- }
- return (_buffer_state->OccupancyFor(vc) >= _ComputeMaxSlots(vc));
-}
-
-int BufferState::FeedbackSharedBufferPolicy::AvailableFor(int vc) const
-{
- return min(SharedBufferPolicy::AvailableFor(vc),
- _ComputeMaxSlots(vc) - _buffer_state->OccupancyFor(vc));
-}
-
-int BufferState::FeedbackSharedBufferPolicy::LimitFor(int vc) const
-{
- return min(SharedBufferPolicy::LimitFor(vc), _ComputeMaxSlots(vc));
-}
-
-BufferState::SimpleFeedbackSharedBufferPolicy::SimpleFeedbackSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name)
- : FeedbackSharedBufferPolicy(config, parent, name)
-{
- _pending_credits.resize(_vcs, 0);
-}
-
-void BufferState::SimpleFeedbackSharedBufferPolicy::SendingFlit(Flit const * const f)
-{
- int const & vc = f->vc;
- if(_flit_sent_time[vc].empty()) {
- assert(_buffer_state->OccupancyFor(vc) > 0);
- _pending_credits[vc] = _buffer_state->OccupancyFor(vc) - 1;
-#ifdef DEBUG_SIMPLEFEEDBACK
- cerr << FullName() << ": Sending probe flit for VC "
- << vc << "; "
- << _pending_credits[vc] << " non-probe flits in flight."
- << endl;
-#endif
- FeedbackSharedBufferPolicy::SendingFlit(f);
- return;
- }
- SharedBufferPolicy::SendingFlit(f);
-}
-
-void BufferState::SimpleFeedbackSharedBufferPolicy::FreeSlotFor(int vc)
-{
- if(!_flit_sent_time[vc].empty() && _pending_credits[vc] == 0) {
-#ifdef DEBUG_SIMPLEFEEDBACK
- cerr << FullName() << ": Probe credit for VC "
- << vc << " came back." << endl;
-#endif
- FeedbackSharedBufferPolicy::FreeSlotFor(vc);
- return;
- }
- if(_pending_credits[vc] > 0) {
- assert(!_flit_sent_time[vc].empty());
- --_pending_credits[vc];
-#ifdef DEBUG_SIMPLEFEEDBACK
- cerr << FullName() << ": Ignoring non-probe credit for VC "
- << vc << "; "
- << _pending_credits[vc] << " remaining."
- << endl;
-#endif
- }
- SharedBufferPolicy::FreeSlotFor(vc);
-}
-
-BufferState::BufferState( const Configuration& config, Module *parent, const string& name ) :
- Module( parent, name ), _occupancy(0)
-{
- _vcs = config.GetInt( "num_vcs" );
- _size = config.GetInt("buf_size");
- if(_size < 0) {
- _size = _vcs * config.GetInt("vc_buf_size");
- }
-
- _buffer_policy = BufferPolicy::New(config, this, "policy");
-
- _wait_for_tail_credit = config.GetInt( "wait_for_tail_credit" );
-
- _vc_occupancy.resize(_vcs, 0);
-
- _in_use_by.resize(_vcs, -1);
- _tail_sent.resize(_vcs, false);
-
- _last_id.resize(_vcs, -1);
- _last_pid.resize(_vcs, -1);
-
-#ifdef TRACK_BUFFERS
- _classes = config.GetInt("classes");
- _outstanding_classes.resize(_vcs);
- _class_occupancy.resize(_classes, 0);
-#endif
-}
-
-BufferState::~BufferState()
-{
- delete _buffer_policy;
-}
-
-void BufferState::ProcessCredit( Credit const * const c )
-{
- assert( c );
-
- set<int>::iterator iter = c->vc.begin();
- while(iter != c->vc.end()) {
-
- int const vc = *iter;
-
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
-
- if ( ( _wait_for_tail_credit ) &&
- ( _in_use_by[vc] < 0 ) ) {
- ostringstream err;
- err << "Received credit for idle VC " << vc;
- Error( err.str() );
- }
- --_occupancy;
- if(_occupancy < 0) {
- Error("Buffer occupancy fell below zero.");
- }
- --_vc_occupancy[vc];
- if(_vc_occupancy[vc] < 0) {
- ostringstream err;
- err << "Buffer occupancy fell below zero for VC " << vc;
- Error(err.str());
- }
- if(_wait_for_tail_credit && !_vc_occupancy[vc] && _tail_sent[vc]) {
- assert(_in_use_by[vc] >= 0);
- _in_use_by[vc] = -1;
- }
-
-#ifdef TRACK_BUFFERS
- assert(!_outstanding_classes[vc].empty());
- int cl = _outstanding_classes[vc].front();
- _outstanding_classes[vc].pop();
- assert((cl >= 0) && (cl < _classes));
- assert(_class_occupancy[cl] > 0);
- --_class_occupancy[cl];
-#endif
-
- _buffer_policy->FreeSlotFor(vc);
-
- ++iter;
- }
-}
-
-
-void BufferState::SendingFlit( Flit const * const f )
-{
- int const vc = f->vc;
-
- assert( f && ( vc >= 0 ) && ( vc < _vcs ) );
-
- ++_occupancy;
- if(_occupancy > _size) {
- Error("Buffer overflow.");
- }
-
- ++_vc_occupancy[vc];
-
- _buffer_policy->SendingFlit(f);
-
-#ifdef TRACK_BUFFERS
- _outstanding_classes[vc].push(f->cl);
- ++_class_occupancy[f->cl];
-#endif
-
- if ( f->tail ) {
- _tail_sent[vc] = true;
-
- if ( !_wait_for_tail_credit ) {
- assert(_in_use_by[vc] >= 0);
- _in_use_by[vc] = -1;
- }
- }
- _last_id[vc] = f->id;
- _last_pid[vc] = f->pid;
-}
-
-void BufferState::TakeBuffer( int vc, int tag )
-{
- assert( ( vc >= 0 ) && ( vc < _vcs ) );
-
- if ( _in_use_by[vc] >= 0 ) {
- ostringstream err;
- err << "Buffer taken while in use for VC " << vc;
- Error( err.str() );
- }
- _in_use_by[vc] = tag;
- _tail_sent[vc] = false;
- _buffer_policy->TakeBuffer(vc);
-}
-
-void BufferState::Display( ostream & os ) const
-{
- os << FullName() << " :" << endl;
- os << " occupied = " << _occupancy << endl;
- for ( int v = 0; v < _vcs; ++v ) {
- os << " VC " << v << ": ";
- os << "in_use_by = " << _in_use_by[v]
- << ", tail_sent = " << _tail_sent[v]
- << ", occupied = " << _vc_occupancy[v] << endl;
- }
-}
diff --git a/src/intersim2/.svn/pristine/fc/fc7b3404406776df7852a99657a25fb9feadbc84.svn-base b/src/intersim2/.svn/pristine/fc/fc7b3404406776df7852a99657a25fb9feadbc84.svn-base
deleted file mode 100644
index 2388b6c..0000000
--- a/src/intersim2/.svn/pristine/fc/fc7b3404406776df7852a99657a25fb9feadbc84.svn-base
+++ /dev/null
@@ -1,55 +0,0 @@
-// $Id$
-
-/*
- Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef _SELALLOC_HPP_
-#define _SELALLOC_HPP_
-
-#include <vector>
-
-#include "allocator.hpp"
-
-class SelAlloc : public SparseAllocator {
- int _iter;
-
- vector<int> _aptrs;
- vector<int> _gptrs;
-
- vector<int> _outmask;
-
-public:
- SelAlloc( Module *parent, const string& name,
- int inputs, int outputs, int iters );
-
- void Allocate( );
-
- void MaskOutput( int out, int mask = 1 );
-
- virtual void PrintRequests( ostream * os = NULL ) const;
-
-};
-
-#endif
diff --git a/src/intersim2/.svn/wc.db b/src/intersim2/.svn/wc.db
deleted file mode 100644
index 4c38197..0000000
--- a/src/intersim2/.svn/wc.db
+++ /dev/null
Binary files differ