112855Sgabeblack@google.com/*****************************************************************************
212855Sgabeblack@google.com
312855Sgabeblack@google.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412855Sgabeblack@google.com  more contributor license agreements.  See the NOTICE file distributed
512855Sgabeblack@google.com  with this work for additional information regarding copyright ownership.
612855Sgabeblack@google.com  Accellera licenses this file to you under the Apache License, Version 2.0
712855Sgabeblack@google.com  (the "License"); you may not use this file except in compliance with the
812855Sgabeblack@google.com  License.  You may obtain a copy of the License at
912855Sgabeblack@google.com
1012855Sgabeblack@google.com    http://www.apache.org/licenses/LICENSE-2.0
1112855Sgabeblack@google.com
1212855Sgabeblack@google.com  Unless required by applicable law or agreed to in writing, software
1312855Sgabeblack@google.com  distributed under the License is distributed on an "AS IS" BASIS,
1412855Sgabeblack@google.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512855Sgabeblack@google.com  implied.  See the License for the specific language governing
1612855Sgabeblack@google.com  permissions and limitations under the License.
1712855Sgabeblack@google.com
1812855Sgabeblack@google.com *****************************************************************************/
1912855Sgabeblack@google.com
2012855Sgabeblack@google.com/*****************************************************************************
2112855Sgabeblack@google.com
2212855Sgabeblack@google.com  bubble.h --
2312855Sgabeblack@google.com
2412855Sgabeblack@google.com  Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15
2512855Sgabeblack@google.com
2612855Sgabeblack@google.com *****************************************************************************/
2712855Sgabeblack@google.com
2812855Sgabeblack@google.com/*****************************************************************************
2912855Sgabeblack@google.com
3012855Sgabeblack@google.com  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3112855Sgabeblack@google.com  changes you are making here.
3212855Sgabeblack@google.com
3312855Sgabeblack@google.com      Name, Affiliation, Date:
3412855Sgabeblack@google.com  Description of Modification:
3512855Sgabeblack@google.com
3612855Sgabeblack@google.com *****************************************************************************/
3712855Sgabeblack@google.com
3812855Sgabeblack@google.com/******************************************************************************/
3912855Sgabeblack@google.com/***************************   bubble Class Definition     ********************/
4012855Sgabeblack@google.com/******************************************************************************/
4112855Sgabeblack@google.com
4212855Sgabeblack@google.com#include "common.h"
4312855Sgabeblack@google.com
4412855Sgabeblack@google.comSC_MODULE( BUBBLE )
4512855Sgabeblack@google.com{
4612855Sgabeblack@google.com    SC_HAS_PROCESS( BUBBLE );
4712855Sgabeblack@google.com
4812855Sgabeblack@google.com    sc_in_clk clk;
4912855Sgabeblack@google.com
5012855Sgabeblack@google.com    const sc_signal<bool>& 	reset;
5112855Sgabeblack@google.com    const sc_signal<bool>& 	in_ok;
5212855Sgabeblack@google.com    const sc_signal<bool>& 	out_ok;
5312855Sgabeblack@google.com    	  sc_signal<bool>& 	instrb;
5412855Sgabeblack@google.com    	  sc_signal<bool>& 	outstrb;
5512855Sgabeblack@google.com    const signal_bool_vector    &a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8;// -128 to 127
5612855Sgabeblack@google.com          signal_bool_vector    &d1,&d2,&d3,&d4,&d5,&d6,&d7,&d8;// -128 to 127
5712855Sgabeblack@google.com
5812855Sgabeblack@google.com    BUBBLE( 	sc_module_name  		NAME,
5912855Sgabeblack@google.com	       	      sc_clock& 		TICK_P,
6012855Sgabeblack@google.com    		const sc_signal<bool>& 		RESET,
6112855Sgabeblack@google.com    		const sc_signal<bool>& 		IN_OK,
6212855Sgabeblack@google.com    		const sc_signal<bool>& 		OUT_OK,
6312855Sgabeblack@google.com    	  	      sc_signal<bool>& 		INSTRB,
6412855Sgabeblack@google.com    	  	      sc_signal<bool>& 		OUTSTRB,
6512855Sgabeblack@google.com          	const signal_bool_vector& 	A1,
6612855Sgabeblack@google.com		const signal_bool_vector&	A2,
6712855Sgabeblack@google.com		const signal_bool_vector&	A3,
6812855Sgabeblack@google.com		const signal_bool_vector&	A4,
6912855Sgabeblack@google.com		const signal_bool_vector&	A5,
7012855Sgabeblack@google.com		const signal_bool_vector&	A6,
7112855Sgabeblack@google.com		const signal_bool_vector&	A7,
7212855Sgabeblack@google.com		const signal_bool_vector&	A8,
7312855Sgabeblack@google.com          	      signal_bool_vector& 	D1,
7412855Sgabeblack@google.com		      signal_bool_vector&	D2,
7512855Sgabeblack@google.com		      signal_bool_vector&	D3,
7612855Sgabeblack@google.com		      signal_bool_vector&	D4,
7712855Sgabeblack@google.com		      signal_bool_vector&	D5,
7812855Sgabeblack@google.com		      signal_bool_vector&	D6,
7912855Sgabeblack@google.com		      signal_bool_vector&	D7,
8012855Sgabeblack@google.com		      signal_bool_vector&	D8
8112855Sgabeblack@google.com              )
8212855Sgabeblack@google.com        :
8312855Sgabeblack@google.com		reset	(RESET),
8412855Sgabeblack@google.com		in_ok	(IN_OK),
8512855Sgabeblack@google.com		out_ok	(OUT_OK),
8612855Sgabeblack@google.com		instrb	(INSTRB),
8712855Sgabeblack@google.com		outstrb	(OUTSTRB),
8812855Sgabeblack@google.com		a1	(A1), a2(A2), a3(A3), a4(A4),
8912855Sgabeblack@google.com		a5	(A5), a6(A6), a7(A7), a8(A8),
9012855Sgabeblack@google.com		d1	(D1), d2(D2), d3(D3), d4(D4),
9112855Sgabeblack@google.com		d5	(D5), d6(D6), d7(D7), d8(D8)
9212855Sgabeblack@google.com    {
9312855Sgabeblack@google.com        clk(TICK_P);
9412855Sgabeblack@google.com        SC_CTHREAD( entry, clk.pos() );
9512855Sgabeblack@google.com	reset_signal_is(reset,true);
9612855Sgabeblack@google.com    }
9712855Sgabeblack@google.com    void entry();
9812855Sgabeblack@google.com};
9912855Sgabeblack@google.com
10012855Sgabeblack@google.com/******************************************************************************/
10112855Sgabeblack@google.com/***************************   bubble Entry Function     **********************/
10212855Sgabeblack@google.com/******************************************************************************/
10312855Sgabeblack@google.com/**									     **/
10412855Sgabeblack@google.com/**  This function is most likely a bubble sort algorithm ???		     **/
10512855Sgabeblack@google.com/**									     **/
10612855Sgabeblack@google.com/******************************************************************************/
10712855Sgabeblack@google.comvoid
10812855Sgabeblack@google.comBUBBLE::entry()
10912855Sgabeblack@google.com{
11012855Sgabeblack@google.com  bool_vector B[9];
11112855Sgabeblack@google.com  bool_vector C[9];
11212855Sgabeblack@google.com  int     		minel;
11312855Sgabeblack@google.com  int     		x;
11412855Sgabeblack@google.com  int			i;
11512855Sgabeblack@google.com  int			j;
11612855Sgabeblack@google.com
11712855Sgabeblack@google.com// RESET INITIALIZATION
11812855Sgabeblack@google.com
11912855Sgabeblack@google.com  while(true) {
12012855Sgabeblack@google.com
12112855Sgabeblack@google.com    instrb.write(false);
12212855Sgabeblack@google.com    outstrb.write(false);
12312855Sgabeblack@google.com    minel = -500;
12412855Sgabeblack@google.com    x = 0;
12512855Sgabeblack@google.com    d1.write(0);
12612855Sgabeblack@google.com    d2.write(0);
12712855Sgabeblack@google.com    d3.write(0);
12812855Sgabeblack@google.com    d4.write(0);
12912855Sgabeblack@google.com    d5.write(0);
13012855Sgabeblack@google.com    d6.write(0);
13112855Sgabeblack@google.com    d7.write(0);
13212855Sgabeblack@google.com    d8.write(0);
13312855Sgabeblack@google.com    for (i = 1; i <= 8; i++) {
13412855Sgabeblack@google.com        B[i] = 0;
13512855Sgabeblack@google.com    }
13612855Sgabeblack@google.com    for (i = 1; i <= 8; i++) {
13712855Sgabeblack@google.com        C[i] = 0;
13812855Sgabeblack@google.com    }
13912855Sgabeblack@google.com    wait();
14012855Sgabeblack@google.com
14112855Sgabeblack@google.com// READY SIGNAL FOR INPUT DATA
14212855Sgabeblack@google.com
14312855Sgabeblack@google.com    wait();
14412855Sgabeblack@google.com    instrb.write(true);
14512855Sgabeblack@google.com    wait();
14612855Sgabeblack@google.com
14712855Sgabeblack@google.com// INPUT HANDSHAKE & INPUT READ
14812855Sgabeblack@google.com
14912855Sgabeblack@google.com    do { wait(); } while (!in_ok);
15012855Sgabeblack@google.com
15112855Sgabeblack@google.com    instrb.write(false);
15212855Sgabeblack@google.com    wait();
15312855Sgabeblack@google.com
15412855Sgabeblack@google.com    B[1] = a1.read(); B[2] = a2.read(); B[3] = a3.read(); B[4] = a4.read();
15512855Sgabeblack@google.com    B[5] = a5.read(); B[6] = a6.read(); B[7] = a7.read(); B[8] = a8.read();
15612855Sgabeblack@google.com    wait();
15712855Sgabeblack@google.com
15812855Sgabeblack@google.comlout << "STARTING BUBBLE SORT" << endl;
15912855Sgabeblack@google.com// BUBBLE SORT ALGORITHM
16012855Sgabeblack@google.com
16112855Sgabeblack@google.com    // EVERY ELEMENT
16212855Sgabeblack@google.com    for (i = 1; i <= 7; i++) {
16312855Sgabeblack@google.com
16412855Sgabeblack@google.com      if (B[i].to_int() > B[i+1].to_int()) {  	// if #1
16512855Sgabeblack@google.com         for (j = 1; j <= 8; j++) {
16612855Sgabeblack@google.com           C[j] = B[j];                          	// COPY
16712855Sgabeblack@google.com         }
16812855Sgabeblack@google.com
16912855Sgabeblack@google.com         B[i] = B[i+1];
17012855Sgabeblack@google.com         B[i+1] = C[i];
17112855Sgabeblack@google.com         minel = C[i].to_int();                    	// MOVE
17212855Sgabeblack@google.com
17312855Sgabeblack@google.com         for (j = 1; j <= 8; j++) {
17412855Sgabeblack@google.com           C[j] = B[j];                          	// COPY
17512855Sgabeblack@google.com         }
17612855Sgabeblack@google.com
17712855Sgabeblack@google.com         if (i >= 2) {  // if #2
17812855Sgabeblack@google.com            x = i;
17912855Sgabeblack@google.com            while (x > 1) {
18012855Sgabeblack@google.com 	      if (B[x].to_int() > B[x-1].to_int()) {
18112855Sgabeblack@google.com                  break;
18212855Sgabeblack@google.com              }
18312855Sgabeblack@google.com              else {
18412855Sgabeblack@google.com                  for (j = 1; j <= 8; j++) {
18512855Sgabeblack@google.com                    C[j] = B[j];
18612855Sgabeblack@google.com                  }
18712855Sgabeblack@google.com
18812855Sgabeblack@google.com                  B[x] = B[x-1];
18912855Sgabeblack@google.com                  B[x-1] = C[x];                  	// MOVE
19012855Sgabeblack@google.com
19112855Sgabeblack@google.com                  for (j = 1; j <= 8; j++) {
19212855Sgabeblack@google.com                    C[j] = B[j];               		// COPY
19312855Sgabeblack@google.com	          }
19412855Sgabeblack@google.com	      }  // end else
19512855Sgabeblack@google.com              x = x-1;
19612855Sgabeblack@google.com            }  //  end WHL Loop
19712855Sgabeblack@google.com         }  // end if #2
19812855Sgabeblack@google.com      }  // end if #1;
19912855Sgabeblack@google.com    }  // end FL3 Loop
20012855Sgabeblack@google.com    wait();
20112855Sgabeblack@google.com
20212855Sgabeblack@google.com// WRITE OUTPUT & OUTPUT HANDSHAKE
20312855Sgabeblack@google.com
20412855Sgabeblack@google.com    d1.write(C[1]); d2.write(C[2]); d3.write(C[3]); d4.write(C[4]);
20512855Sgabeblack@google.com    d5.write(C[5]); d6.write(C[6]); d7.write(C[7]); d8.write(C[8]);
20612855Sgabeblack@google.com    outstrb.write(true);	// Ready to give output data
20712855Sgabeblack@google.com    wait();
20812855Sgabeblack@google.com
20912855Sgabeblack@google.com    do { wait(); } while (!out_ok);
21012855Sgabeblack@google.com
21112855Sgabeblack@google.com    outstrb.write(false);
21212855Sgabeblack@google.com    wait();
21312855Sgabeblack@google.com
21412855Sgabeblack@google.com  }  // end Reset Loop
21512855Sgabeblack@google.com
21612855Sgabeblack@google.com}
217