import com.xilinx.util.JBitsCommandLineApp;

import com.xilinx.JBits.CoreTemplate.*;

import com.xilinx.JBits.Virtex.RTPCore.SizeException;

import com.xilinx.JBits.Virtex.Devices;
import com.xilinx.JBits.Virtex.JBits;

import com.xilinx.JRoute.Virtex.Router.JRoute;

import com.xilinx.Netlist.SYM.*;

import com.xilinx.JBits.Virtex.RTPCore.Basic.Clock;

public class SetDAfilter extends JBitsCommandLineApp  
{
 
    /* Define this for debug purposes only */
    boolean debug = true;
    
    /** This method creates and places the RTPCores */
    public void
        run() {
       

        try
            {

                JRoute jroute;
                 

                int ROW = 8;
                int COL = 2;
                int WORD_WIDTH = 8;
                int NO_TAPS = 4;

                int [] constants;
                constants = new int[NO_TAPS];
                constants[0]= 1;
                constants[1]= 0;
                constants[2]= 0;
                constants[3]= 1;
         

                Offset dafilterOffset;

         
                if(debug)
                    // verbose mode routing
                    jroute = new JRoute(jbits,System.out); 
                else
                    jroute = new JRoute(jbits);

                Bitstream.setVirtex(jbits, jroute);
                CoreOutput.generateBitstream(true);
                CoreOutput.generateEDIF(false);
                CoreOutput.generateSYM(true);

                /* Create Top level net and bus */
                Net clk = new Net("clk",null);
                Bus Din = new Bus("DataIN",null,WORD_WIDTH);
                Bus Dout = new Bus("DataOUT",null,WORD_WIDTH);

                /* Create Clock Core */
                Clock clock = new Clock("clock", clk);

                /* Create  cores */
                DAfilter filter;
                
                filter = new DAfilter("DA Filter",clk,Dout,Din,constants);
             
         

         
                /* Place the core on row and col position*/
                dafilterOffset = filter.getRelativeOffset();
                dafilterOffset.setVerOffset(Gran.CLB,ROW);
                dafilterOffset.setHorOffset(Gran.CLB,COL);

     

                /* Implement RTPCores */
                clock.implement(0); // Use GCLK0
                filter.implement();
                
         
         
                /* Connect Top level nets */
                try {
                 
                       Bitstream.connect(clk);
         
                } catch ( ConnectionException e) {
                    e.printStackTrace();
                    System.exit(-1);
                }




                /* 
                 * Define SYM pins.
                 */
                try {
  //                             SYM.add(clk);
                    //            SYM.add(load);
                    //           SYM.add(Din);
                    SYM.add(Dout);

                   // SYM.write("Filter2.sym");
                    

                } catch (SYMexception se) {
                    System.out.println(se);
                }

                CoreOutput.writeSymFile("filter.sym");


            }
        catch(Exception e)
            {

                System.out.println(e);
                System.exit(-1);
            }


    }
    

    /* main program */
    public static void 
        main(String args[]) {
        SetDAfilter app = new SetDAfilter();
        app.appName="Test DA core";
        app.parseCommandLine(args);
        app.makeJBits();
        System.out.println("running...");
        app.run();
        app.writeBitstream();

    } /* end main() */
    
}
    
