// ========== Copyright Header Begin ==========================================
// 
// OpenSPARC T1 Processor File: cpx_dp6.v
// Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
// 
// The above named program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
// 
// The above named program is distributed in the hope that it will be 
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// License along with this work; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
// 
// ========== Copyright Header End ============================================
////////////////////////////////////////////////////////////////////////
/*
//  Module Name:
//	Description:	datapath portion of CPX
*/
////////////////////////////////////////////////////////////////////////
// Global header file includes
////////////////////////////////////////////////////////////////////////

`include	"sys.h" // system level definition file which contains the 
			// time scale definition

`include "iop.h"


////////////////////////////////////////////////////////////////////////
// Local header file includes / local defines
////////////////////////////////////////////////////////////////////////

module cpx_dp6(/*AUTOARG*/
   // Outputs
   scan_out, cpx_spc6_data_cx_l, 
   // Inputs
   shiftenable, scan_in, rclk, arbcp6_cpxdp_shift_cx, 
   arbcp6_cpxdp_qsel1_ca, arbcp6_cpxdp_qsel0_ca, 
   arbcp6_cpxdp_q0_hold_ca, arbcp6_cpxdp_grant_ca, 
   scache0_cpx_data_ca, scache1_cpx_data_ca, scache2_cpx_data_ca, 
   scache3_cpx_data_ca, io_cpx_data_ca, fp_cpx_data_ca
   );	

              /*AUTOOUTPUT*/
	      // Beginning of automatic outputs (from unused autoinst outputs)
	      output [7:0]    scan_out;		      // From mac0 of cpx_dp_maca_r.v, ...
	      // End of automatics
   
output  [`CPX_WIDTH-1:0]  cpx_spc6_data_cx_l;   
   

              /*AUTOINPUT*/
	      // Beginning of automatic inputs (from unused autoinst inputs)
	      input [5:0]     arbcp6_cpxdp_grant_ca;  // To mac0 of cpx_dp_maca_r.v, ...
	      input [5:0]     arbcp6_cpxdp_q0_hold_ca;// To mac0 of cpx_dp_maca_r.v, ...
	      input [5:0]     arbcp6_cpxdp_qsel0_ca;  // To mac0 of cpx_dp_maca_r.v, ...
	      input [5:0]     arbcp6_cpxdp_qsel1_ca;  // To mac0 of cpx_dp_maca_r.v, ...
	      input [5:0]     arbcp6_cpxdp_shift_cx;  // To mac0 of cpx_dp_maca_r.v, ...
	      input	      rclk;		      // To mac0 of cpx_dp_maca_r.v, ...
	      input [7:0]     scan_in;		      // To mac0 of cpx_dp_maca_r.v, ...
	      input	      shiftenable;	      // To mac7 of cpx_dp_macc_l.v
	      // End of automatics

input  [`CPX_WIDTH-1:0]  scache0_cpx_data_ca;
input  [`CPX_WIDTH-1:0]  scache1_cpx_data_ca;
input  [`CPX_WIDTH-1:0]  scache2_cpx_data_ca;
input  [`CPX_WIDTH-1:0]  scache3_cpx_data_ca;
input  [`CPX_WIDTH-1:0]  io_cpx_data_ca;
input  [`CPX_WIDTH-1:0]  fp_cpx_data_ca;


              /*AUTOWIRE*/
	      // Beginning of automatic wires (for undeclared instantiated-module outputs)
	      wire [149:0]    cpx_col0_data_cx_l;     // From mac0 of cpx_dp_maca_r.v
	      wire [149:0]    cpx_col1_data_cx_l;     // From mac1 of cpx_dp_macb_r.v
	      wire [149:0]    cpx_col3_data_cx_l;     // From mac3 of cpx_dp_macb_r.v
	      wire [149:0]    cpx_col4_data_cx_l;     // From mac4 of cpx_dp_macb_r.v
	      wire [149:0]    cpx_col6_data_cx_l;     // From mac6 of cpx_dp_macb_r.v
	      wire [7:1]      shiftenable_buf;	      // From mac1 of cpx_dp_macb_r.v, ...
	      // End of automatics
   
wire  [4:0]  unused;

/*   assign cpx_spc_data_cx_l[149:0] =(cpx_dest0_data_cx_l[149:0] |
					    cpx_dest1_data_cx_l[149:0] |
					    cpx_dest2_data_cx_l[149:0] |
					    cpx_dest3_data_cx_l[149:0] |
					    cpx_dest4_data_cx_l[149:0] |
					    cpx_dest5_data_cx_l[149:0]);
*/

/*
   
// DATAPATH ORGANISATION(cpx_dp6)
NEW:
                                           	  to sparc6 cx2 flops
                                                   	  ^
                                                   	  |   
   mac0 -> mac1 -> -----> mac3 -> mac4 -> ------>mac6 <- mac7
     a      br              br      br             br      cl
     ^      ^               ^       ^              ^       ^
     |      |               |       |              |       |
   sctag0  sctag1           io 	  sctag2         sctag3	   fp

OLD:
                                           to sparc6 cx2 flops
                                                   ^
                                                   |   
   mac0 -> mac1 -> -----> mac3 -> mac4 -> ------>mac6 <- mac7
     a      b               b       b              c       a
     ^      ^               ^       ^              ^       ^
     |      |               |       |              |       |
   sctag0  fp             sctag1  sctag2          io    sctag3

 */

   wire         [149:0]   tied_hi;
   assign   tied_hi = 150'b111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;
   
       /*
   cpx_dp_maca_r AUTO_TEMPLATE(
			  // Outputs
			  .data_out_cx_l	(cpx_col@_data_cx_l[149:0]),
		          .shiftenable_buf	(),
			  // Inputs
			  .src_cpx_data_ca({5'b00000,scache@_cpx_data_ca[`CPX_WIDTH-1:0]}),
			  .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[@]),
			  .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[@]),
			  .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[@]),
			  .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[@]),
			  .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[@]),
           			  .clk		(clk),			 
		    //.tmb_l		(tmb_l),
		    .scan_in		(scan_in[@]),
		    .scan_out		(scan_out[@]),
		    .shiftenable	(shiftenable_buf[@"(+ @ 1)"]));

   
    */
   
 

   cpx_dp_maca_r mac0(/*AUTOINST*/
		      // Outputs
		      .data_out_cx_l	(cpx_col0_data_cx_l[149:0]), // Templated
		      .scan_out		(scan_out[0]),		 // Templated
		      .shiftenable_buf	(),			 // Templated
		      // Inputs
		      .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[0]), // Templated
		      .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[0]), // Templated
		      .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[0]), // Templated
		      .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[0]), // Templated
		      .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[0]), // Templated
		      .src_cpx_data_ca	({5'b00000,scache0_cpx_data_ca[`CPX_WIDTH-1:0]}), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[0]),		 // Templated
		      .shiftenable	(shiftenable_buf[1]));	 // Templated
      /*
   cpx_dp_macb_r AUTO_TEMPLATE(
			  // Outputs
			  .data_out_cx_l	(cpx_col@_data_cx_l[149:0]),
		          .shiftenable_buf	(shiftenable_buf[@]),
			  // Inputs
			  .src_cpx_data_ca({5'b00000,scache@_cpx_data_ca[`CPX_WIDTH-1:0]}),
			  .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[@]),
			  .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[@]),
			  .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[@]),
			  .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[@]),
			  .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[@]),
			  .data_prev_cx_l(cpx_col@"(- @ 1)"_data_cx_l[149:0]),
           			  .clk		(clk),			 
		    //.tmb_l		(tmb_l),
		    .scan_in		(scan_in[@]),
		    .scan_out		(scan_out[@]),
		    .shiftenable	(shiftenable_buf[@"(+ @ 2)"]));

   
    */

   cpx_dp_macb_r mac1(/*AUTOINST*/
		      // Outputs
		      .data_out_cx_l	(cpx_col1_data_cx_l[149:0]), // Templated
		      .scan_out		(scan_out[1]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[1]),	 // Templated
		      // Inputs
		      .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[1]), // Templated
		      .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[1]), // Templated
		      .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[1]), // Templated
		      .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[1]), // Templated
		      .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[1]), // Templated
		      .src_cpx_data_ca	({5'b00000,scache1_cpx_data_ca[`CPX_WIDTH-1:0]}), // Templated
		      .data_prev_cx_l	(cpx_col0_data_cx_l[149:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[1]),		 // Templated
		      .shiftenable	(shiftenable_buf[3]));	 // Templated
      /*
   cpx_dp_macb_r AUTO_TEMPLATE(
			  // Outputs
			  .data_out_cx_l	(cpx_col@_data_cx_l[149:0]),
		          .shiftenable_buf	(shiftenable_buf[@]),
			  // Inputs
			  .src_cpx_data_ca({5'b00000,io_cpx_data_ca[`CPX_WIDTH-1:0]}),
			  .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[@"(+ @ 1)"]),
			  .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[@"(+ @ 1)"]),
			  .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[@"(+ @ 1)"]),
			  .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[@"(+ @ 1)"]),
			  .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[@"(+ @ 1)"]),
			  .data_prev_cx_l(cpx_col@"(- @ 2)"_data_cx_l[149:0]),
           			  .clk		(clk),			 
		    //.tmb_l		(tmb_l),
		    .scan_in		(scan_in[@]),
		    .scan_out		(scan_out[@]),
		    .shiftenable	(shiftenable_buf[@"(+ @ 1)"]));

   
    */

   cpx_dp_macb_r mac3(/*AUTOINST*/
		      // Outputs
		      .data_out_cx_l	(cpx_col3_data_cx_l[149:0]), // Templated
		      .scan_out		(scan_out[3]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[3]),	 // Templated
		      // Inputs
		      .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[4]), // Templated
		      .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[4]), // Templated
		      .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[4]), // Templated
		      .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[4]), // Templated
		      .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[4]), // Templated
		      .src_cpx_data_ca	({5'b00000,io_cpx_data_ca[`CPX_WIDTH-1:0]}), // Templated
		      .data_prev_cx_l	(cpx_col1_data_cx_l[149:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[3]),		 // Templated
		      .shiftenable	(shiftenable_buf[4]));	 // Templated
      /*
   cpx_dp_macb_r AUTO_TEMPLATE(
			  // Outputs
			  .data_out_cx_l	(cpx_col@_data_cx_l[149:0]),
		          .shiftenable_buf	(shiftenable_buf[@]),
			  // Inputs
			  .src_cpx_data_ca({5'b00000,scache@"(- @ 2)"_cpx_data_ca[`CPX_WIDTH-1:0]}),
			  .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[@"(- @ 2)"]),
			  .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[@"(- @ 2)"]),
			  .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[@"(- @ 2)"]),
			  .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[@"(- @ 2)"]),
			  .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[@"(- @ 2)"]),
			  .data_prev_cx_l(cpx_col@"(- @ 1)"_data_cx_l[149:0]),
           			  .clk		(clk),			 
		    //.tmb_l		(tmb_l),
		    .scan_in		(scan_in[@]),
		    .scan_out		(scan_out[@]),
		    .shiftenable	(shiftenable_buf[@"(+ @ 2)"]));

   
    */

   cpx_dp_macb_r mac4(/*AUTOINST*/
		      // Outputs
		      .data_out_cx_l	(cpx_col4_data_cx_l[149:0]), // Templated
		      .scan_out		(scan_out[4]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[4]),	 // Templated
		      // Inputs
		      .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[2]), // Templated
		      .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[2]), // Templated
		      .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[2]), // Templated
		      .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[2]), // Templated
		      .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[2]), // Templated
		      .src_cpx_data_ca	({5'b00000,scache2_cpx_data_ca[`CPX_WIDTH-1:0]}), // Templated
		      .data_prev_cx_l	(cpx_col3_data_cx_l[149:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[4]),		 // Templated
		      .shiftenable	(shiftenable_buf[6]));	 // Templated
      /*
   cpx_dp_macb_r AUTO_TEMPLATE(
			  // Outputs
			  .data_out_cx_l	(cpx_col@_data_cx_l[149:0]),
		          .shiftenable_buf	(shiftenable_buf[@]),
			  // Inputs
			  .src_cpx_data_ca({5'b00000,scache@"(- @ 3)"_cpx_data_ca[`CPX_WIDTH-1:0]}),
			  .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[@"(- @ 3)"]),
			  .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[@"(- @ 3)"]),
			  .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[@"(- @ 3)"]),
			  .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[@"(- @ 3)"]),
			  .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[@"(- @ 3)"]),
			  .data_prev_cx_l(cpx_col@"(- @ 2)"_data_cx_l[149:0]),
           			  .clk		(clk),			 
		    //.tmb_l		(tmb_l),
		    .scan_in		(scan_in[@]),
		    .scan_out		(scan_out[@]),
		    .shiftenable	(shiftenable_buf[@"(+ @ 1)"]));

   
    */

   cpx_dp_macb_r mac6(/*AUTOINST*/
		      // Outputs
		      .data_out_cx_l	(cpx_col6_data_cx_l[149:0]), // Templated
		      .scan_out		(scan_out[6]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[6]),	 // Templated
		      // Inputs
		      .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[3]), // Templated
		      .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[3]), // Templated
		      .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[3]), // Templated
		      .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[3]), // Templated
		      .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[3]), // Templated
		      .src_cpx_data_ca	({5'b00000,scache3_cpx_data_ca[`CPX_WIDTH-1:0]}), // Templated
		      .data_prev_cx_l	(cpx_col4_data_cx_l[149:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[6]),		 // Templated
		      .shiftenable	(shiftenable_buf[7]));	 // Templated
      /*
   cpx_dp_macc_l AUTO_TEMPLATE(
			  // Outputs
	  		  .data_out_cx_l	({unused[4:0],cpx_spc@"(- @ 1)"_data_cx_l[`CPX_WIDTH-1:0]}),
		          .shiftenable_buf	(shiftenable_buf[@]),
//	  		  .data_out_cx_l	(cpx_col@_data_cx_l[149:0]),
			  // Inputs
			  .src_cpx_data_ca({5'b00000,fp_cpx_data_ca[`CPX_WIDTH-1:0]}),
			  .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[5]),
			  .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[5]),
			  .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[5]),
			  .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[5]),
			  .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[5]),
			  .data_crit_cx_l(cpx_col@"(- @ 1)"_data_cx_l[149:0]),
			  .data_ncrit_cx_l(tied_hi[149:0]),
		    //.tmb_l		(tmb_l),
		    .scan_in		(scan_in[@]),
		    .scan_out		(scan_out[@]),
		    .shiftenable	(shiftenable));

   
    */


   cpx_dp_macc_l mac7(/*AUTOINST*/
		      // Outputs
		      .data_out_cx_l	({unused[4:0],cpx_spc6_data_cx_l[`CPX_WIDTH-1:0]}), // Templated
		      .scan_out		(scan_out[7]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[7]),	 // Templated
		      // Inputs
		      .arb_cpxdp_qsel1_ca(arbcp6_cpxdp_qsel1_ca[5]), // Templated
		      .arb_cpxdp_qsel0_ca(arbcp6_cpxdp_qsel0_ca[5]), // Templated
		      .arb_cpxdp_grant_ca(arbcp6_cpxdp_grant_ca[5]), // Templated
		      .arb_cpxdp_shift_cx(arbcp6_cpxdp_shift_cx[5]), // Templated
		      .arb_cpxdp_q0_hold_ca(arbcp6_cpxdp_q0_hold_ca[5]), // Templated
		      .src_cpx_data_ca	({5'b00000,fp_cpx_data_ca[`CPX_WIDTH-1:0]}), // Templated
		      .data_crit_cx_l	(cpx_col6_data_cx_l[149:0]), // Templated
		      .data_ncrit_cx_l	(tied_hi[149:0]),	 // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[7]),		 // Templated
		      .shiftenable	(shiftenable));		 // Templated
// Code start here 
//
// Local Variables:
// verilog-library-directories:("." "../../../../../common/rtl")
// End:



endmodule












