// ========== Copyright Header Begin ==========================================
// 
// OpenSPARC T1 Processor File: pcx_dp0.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 ============================================
////////////////////////////////////////////////////////////////////////
/*
//	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 pcx_dp0(/*AUTOARG*/
   // Outputs
   scan_out, pcx_scache0_data_px_l, 
   // Inputs
   shiftenable, scan_in, rclk, arbpc0_pcxdp_shift_px, 
   arbpc0_pcxdp_qsel1_pa, arbpc0_pcxdp_qsel0_pa, 
   arbpc0_pcxdp_q0_hold_pa, arbpc0_pcxdp_grant_pa, spc0_pcx_data_pa, 
   spc1_pcx_data_pa, spc2_pcx_data_pa, spc3_pcx_data_pa, 
   spc4_pcx_data_pa, spc5_pcx_data_pa, spc6_pcx_data_pa, 
   spc7_pcx_data_pa
   );	

              /*AUTOOUTPUT*/
	      // Beginning of automatic outputs (from unused autoinst outputs)
	      output [7:0]    scan_out;		      // From mac0 of pcx_dp_maca_r.v, ...
	      // End of automatics

	      output [`PCX_WIDTH-1:0]  pcx_scache0_data_px_l;  // From mac3 of pcx_dp_macc.v
   

              /*AUTOINPUT*/
	      // Beginning of automatic inputs (from unused autoinst inputs)
	      input [7:0]     arbpc0_pcxdp_grant_pa;  // To mac0 of pcx_dp_maca_r.v, ...
	      input [7:0]     arbpc0_pcxdp_q0_hold_pa;// To mac0 of pcx_dp_maca_r.v, ...
	      input [7:0]     arbpc0_pcxdp_qsel0_pa;  // To mac0 of pcx_dp_maca_r.v, ...
	      input [7:0]     arbpc0_pcxdp_qsel1_pa;  // To mac0 of pcx_dp_maca_r.v, ...
	      input [7:0]     arbpc0_pcxdp_shift_px;  // To mac0 of pcx_dp_maca_r.v, ...
	      input	      rclk;		      // To mac0 of pcx_dp_maca_r.v, ...
	      input [7:0]     scan_in;		      // To mac0 of pcx_dp_maca_r.v, ...
	      input	      shiftenable;	      // To mac7 of pcx_dp_maca_l.v
	      // End of automatics

	      input [`PCX_WIDTH-1:0]   spc0_pcx_data_pa;	      // To mac0 of pcx_dp_maca.v
	      input [`PCX_WIDTH-1:0]   spc1_pcx_data_pa;	      // To mac1 of pcx_dp_macb.v
	      input [`PCX_WIDTH-1:0]   spc2_pcx_data_pa;	      // To mac2 of pcx_dp_macb.v
	      input [`PCX_WIDTH-1:0]   spc3_pcx_data_pa;	      // To mac3 of pcx_dp_macc.v
	      input [`PCX_WIDTH-1:0]   spc4_pcx_data_pa;	      // To mac4 of pcx_dp_macb.v
	      input [`PCX_WIDTH-1:0]   spc5_pcx_data_pa;	      // To mac5 of pcx_dp_macb.v
	      input [`PCX_WIDTH-1:0]   spc6_pcx_data_pa;	      // To mac6 of pcx_dp_macb.v
	      input [`PCX_WIDTH-1:0]   spc7_pcx_data_pa;	      // To mac7 of pcx_dp_maca.v


              /*AUTOWIRE*/
	      // Beginning of automatic wires (for undeclared instantiated-module outputs)
	      wire [129:0]    pcx_col0_data_px_l;     // From mac0 of pcx_dp_maca_r.v
	      wire [129:0]    pcx_col1_data_px_l;     // From mac1 of pcx_dp_macb_r.v
	      wire [129:0]    pcx_col2_data_px_l;     // From mac2 of pcx_dp_macb_r.v
	      wire [129:0]    pcx_col4_data_px_l;     // From mac4 of pcx_dp_macb_l.v
	      wire [129:0]    pcx_col5_data_px_l;     // From mac5 of pcx_dp_macb_l.v
	      wire [129:0]    pcx_col6_data_px_l;     // From mac6 of pcx_dp_macb_l.v
	      wire [129:0]    pcx_col7_data_px_l;     // From mac7 of pcx_dp_maca_l.v
	      wire [7:1]      shiftenable_buf;	      // From mac1 of pcx_dp_macb_r.v, ...
	      // End of automatics

              wire [5:0]      unused;
   

/*
   
// DATAPATH ORGANISATION(pcx_dp0)

   sparc0 sparc1 sparc2 sparc3  sparc4  sparc5  sparc6  sparc7
     |      |      |      |       |       |        |      |
     v      v      v      v       v       v        v      v
   mac0 -> mac1 ->mac2 ->mac3 <- mac4 <- mac5 <- mac6 <- mac7 
(new)ar     br     br     cr      bl      bl       bl     al
(old)a      b      b      c       b       b        b      a 
                          |
            ------buf------
            |
            v
         to sctag0 
 */


   /*
   pcx_dp_maca_r AUTO_TEMPLATE(
			  // Outputs
			  .data_out_px_l	(pcx_col@_data_px_l[129:0]),
		          .shiftenable_buf	(),
			  // Inputs
			  .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[@]),
			  .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[@]),
			  .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[@]),
			  .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[@]),
			  .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[@]),
			  .src_pcx_data_pa({6'b000000,spc@_pcx_data_pa[`PCX_WIDTH-1:0]}),
			  .clk		(clk),
    		         //.tmb_l		(tmb_l),
		         .scan_in	(scan_in[@]),
		         .scan_out	(scan_out[@]),
		         .shiftenable	(shiftenable_buf[@"(+ @ 1)"]));
       
*/



   pcx_dp_maca_r mac0(/*AUTOINST*/
		      // Outputs
		      .data_out_px_l	(pcx_col0_data_px_l[129:0]), // Templated
		      .scan_out		(scan_out[0]),		 // Templated
		      .shiftenable_buf	(),			 // Templated
		      // Inputs
		      .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[0]), // Templated
		      .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[0]), // Templated
		      .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[0]), // Templated
		      .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[0]), // Templated
		      .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[0]), // Templated
		      .src_pcx_data_pa	({6'b000000,spc0_pcx_data_pa[`PCX_WIDTH-1:0]}), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[0]),		 // Templated
		      .shiftenable	(shiftenable_buf[1]));	 // Templated
   /*
   pcx_dp_macb_r AUTO_TEMPLATE(
			  // Outputs
			  .data_out_px_l	(pcx_col@_data_px_l[129:0]),
		          .shiftenable_buf	(shiftenable_buf[@]),
			  // Inputs
			  .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[@]),
			  .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[@]),
			  .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[@]),
			  .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[@]),
			  .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[@]),
			  .src_pcx_data_pa({6'b000000,spc@_pcx_data_pa[`PCX_WIDTH-1:0]}),
        		  .data_prev_px_l	(pcx_col@"(- @ 1)"_data_px_l[129:0]),
			  .clk		(clk),
    		         //.tmb_l		(tmb_l),
		         .scan_in	(scan_in[@]),
		         .scan_out	(scan_out[@]),
		         .shiftenable	(shiftenable_buf[@"(+ @ 1)"]));

   
    */
   pcx_dp_macb_r mac1(/*AUTOINST*/
		      // Outputs
		      .data_out_px_l	(pcx_col1_data_px_l[129:0]), // Templated
		      .scan_out		(scan_out[1]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[1]),	 // Templated
		      // Inputs
		      .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[1]), // Templated
		      .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[1]), // Templated
		      .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[1]), // Templated
		      .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[1]), // Templated
		      .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[1]), // Templated
		      .src_pcx_data_pa	({6'b000000,spc1_pcx_data_pa[`PCX_WIDTH-1:0]}), // Templated
		      .data_prev_px_l	(pcx_col0_data_px_l[129:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[1]),		 // Templated
		      .shiftenable	(shiftenable_buf[2]));	 // Templated	 // Templated		 // Templated		 // Templated
   pcx_dp_macb_r mac2(/*AUTOINST*/
		      // Outputs
		      .data_out_px_l	(pcx_col2_data_px_l[129:0]), // Templated
		      .scan_out		(scan_out[2]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[2]),	 // Templated
		      // Inputs
		      .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[2]), // Templated
		      .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[2]), // Templated
		      .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[2]), // Templated
		      .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[2]), // Templated
		      .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[2]), // Templated
		      .src_pcx_data_pa	({6'b000000,spc2_pcx_data_pa[`PCX_WIDTH-1:0]}), // Templated
		      .data_prev_px_l	(pcx_col1_data_px_l[129:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[2]),		 // Templated
		      .shiftenable	(shiftenable_buf[3]));	 // Templated
      /*
   pcx_dp_macc_r AUTO_TEMPLATE(
			  // Outputs
			  .data_out_px_l	({unused[5:0],pcx_scache0_data_px_l[`PCX_WIDTH-1:0]}),
		          .shiftenable_buf	(shiftenable_buf[@]),
			  // Inputs
			  .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[@]),
			  .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[@]),
			  .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[@]),
			  .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[@]),
			  .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[@]),
			  .src_pcx_data_pa({6'b000000,spc@_pcx_data_pa[`PCX_WIDTH-1:0]}),
        		  .data_crit_px_l	(pcx_col@"(+ @ 1)"_data_px_l[129:0]),
	        	  .data_ncrit_px_l(pcx_col@"(- @ 1)"_data_px_l[129:0]),
       			  .clk		(clk),
    		         //.tmb_l		(tmb_l),
		         .scan_in	(scan_in[@]),
		         .scan_out	(scan_out[@]),
		         .shiftenable	(shiftenable_buf[@"(+ @ 1)"]));

*/
   
   pcx_dp_macc_r mac3(/*AUTOINST*/
		      // Outputs
		      .data_out_px_l	({unused[5:0],pcx_scache0_data_px_l[`PCX_WIDTH-1:0]}), // Templated
		      .scan_out		(scan_out[3]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[3]),	 // Templated
		      // Inputs
		      .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[3]), // Templated
		      .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[3]), // Templated
		      .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[3]), // Templated
		      .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[3]), // Templated
		      .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[3]), // Templated
		      .src_pcx_data_pa	({6'b000000,spc3_pcx_data_pa[`PCX_WIDTH-1:0]}), // Templated
		      .data_crit_px_l	(pcx_col4_data_px_l[129:0]), // Templated
		      .data_ncrit_px_l	(pcx_col2_data_px_l[129:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[3]),		 // Templated
		      .shiftenable	(shiftenable_buf[4]));	 // Templated
   /*
   pcx_dp_macb_l AUTO_TEMPLATE(
			  // Outputs
			  .data_out_px_l	(pcx_col@_data_px_l[129:0]),
		          .shiftenable_buf	(shiftenable_buf[@]),
			  // Inputs
			  .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[@]),
			  .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[@]),
			  .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[@]),
			  .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[@]),
			  .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[@]),
			  .src_pcx_data_pa({6'b000000,spc@_pcx_data_pa[`PCX_WIDTH-1:0]}),
        		  .data_prev_px_l	(pcx_col@"(+ @ 1)"_data_px_l[129:0]),
			  .clk		(clk),
    		         //.tmb_l		(tmb_l),
		         .scan_in	(scan_in[@]),
		         .scan_out	(scan_out[@]),
		         .shiftenable	(shiftenable_buf[@"(+ @ 1)"]));

   
    */

   pcx_dp_macb_l mac4(/*AUTOINST*/
		      // Outputs
		      .data_out_px_l	(pcx_col4_data_px_l[129:0]), // Templated
		      .scan_out		(scan_out[4]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[4]),	 // Templated
		      // Inputs
		      .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[4]), // Templated
		      .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[4]), // Templated
		      .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[4]), // Templated
		      .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[4]), // Templated
		      .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[4]), // Templated
		      .src_pcx_data_pa	({6'b000000,spc4_pcx_data_pa[`PCX_WIDTH-1:0]}), // Templated
		      .data_prev_px_l	(pcx_col5_data_px_l[129:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[4]),		 // Templated
		      .shiftenable	(shiftenable_buf[5]));	 // Templated
   pcx_dp_macb_l mac5(/*AUTOINST*/
		      // Outputs
		      .data_out_px_l	(pcx_col5_data_px_l[129:0]), // Templated
		      .scan_out		(scan_out[5]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[5]),	 // Templated
		      // Inputs
		      .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[5]), // Templated
		      .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[5]), // Templated
		      .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[5]), // Templated
		      .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[5]), // Templated
		      .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[5]), // Templated
		      .src_pcx_data_pa	({6'b000000,spc5_pcx_data_pa[`PCX_WIDTH-1:0]}), // Templated
		      .data_prev_px_l	(pcx_col6_data_px_l[129:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[5]),		 // Templated
		      .shiftenable	(shiftenable_buf[6]));	 // Templated
   pcx_dp_macb_l mac6(/*AUTOINST*/
		      // Outputs
		      .data_out_px_l	(pcx_col6_data_px_l[129:0]), // Templated
		      .scan_out		(scan_out[6]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[6]),	 // Templated
		      // Inputs
		      .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[6]), // Templated
		      .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[6]), // Templated
		      .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[6]), // Templated
		      .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[6]), // Templated
		      .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[6]), // Templated
		      .src_pcx_data_pa	({6'b000000,spc6_pcx_data_pa[`PCX_WIDTH-1:0]}), // Templated
		      .data_prev_px_l	(pcx_col7_data_px_l[129:0]), // Templated
		      .rclk		(rclk),
		      .scan_in		(scan_in[6]),		 // Templated
		      .shiftenable	(shiftenable_buf[7]));	 // Templated
      /*
   pcx_dp_maca_l AUTO_TEMPLATE(
			  // Outputs
			  .data_out_px_l	(pcx_col@_data_px_l[129:0]),
		          .shiftenable_buf      (shiftenable_buf[@]),
			  // Inputs
			  .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[@]),
			  .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[@]),
			  .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[@]),
			  .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[@]),
			  .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[@]),
			  .src_pcx_data_pa({6'b000000,spc@_pcx_data_pa[`PCX_WIDTH-1:0]}),
			  .clk		(clk),
    		         //.tmb_l		(tmb_l),
		         .scan_in	(scan_in[@]),
		         .scan_out	(scan_out[@]),
		         .shiftenable	(shiftenable));

   
    */

   pcx_dp_maca_l mac7(/*AUTOINST*/
		      // Outputs
		      .data_out_px_l	(pcx_col7_data_px_l[129:0]), // Templated
		      .scan_out		(scan_out[7]),		 // Templated
		      .shiftenable_buf	(shiftenable_buf[7]),	 // Templated
		      // Inputs
		      .arb_pcxdp_qsel1_pa(arbpc0_pcxdp_qsel1_pa[7]), // Templated
		      .arb_pcxdp_qsel0_pa(arbpc0_pcxdp_qsel0_pa[7]), // Templated
		      .arb_pcxdp_grant_pa(arbpc0_pcxdp_grant_pa[7]), // Templated
		      .arb_pcxdp_shift_px(arbpc0_pcxdp_shift_px[7]), // Templated
		      .arb_pcxdp_q0_hold_pa(arbpc0_pcxdp_q0_hold_pa[7]), // Templated
		      .src_pcx_data_pa	({6'b000000,spc7_pcx_data_pa[`PCX_WIDTH-1: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












