Index: trunk/Top/W1.v
===================================================================
--- trunk/Top/W1.v	(revision 8)
+++ trunk/Top/W1.v	(revision 10)
@@ -31,5 +31,5 @@
    inout         ddr3_ck,
    inout         ddr3_ck_n,
-   output        ddr3_reset,
+   //output        ddr3_reset,
    output [12:0] ddr3_a,
    output [ 2:0] ddr3_ba,
@@ -410,5 +410,5 @@
     .ddr3_ck(ddr3_ck), 
     .ddr3_ck_n(ddr3_ck_n), 
-    .ddr3_reset(ddr3_reset),
+    //.ddr3_reset(ddr3_reset),
     .ddr3_a(ddr3_a), 
     .ddr3_ba(ddr3_ba), 
Index: trunk/synplicity/proj_1.prj
===================================================================
--- trunk/synplicity/proj_1.prj	(revision 8)
+++ trunk/synplicity/proj_1.prj	(revision 10)
@@ -4,269 +4,269 @@
 
 #project files
-add_file -verilog "../trunk/T1-common/include/xst_defines.h"
-add_file -verilog "../trunk/Top/W1.v"
-add_file -verilog "../trunk/OC-UART/raminfr.v"
-add_file -verilog "../trunk/OC-UART/timescale.v"
-add_file -verilog "../trunk/OC-UART/uart_debug_if.v"
-add_file -verilog "../trunk/OC-UART/uart_defines.v"
-add_file -verilog "../trunk/OC-UART/uart_receiver.v"
-add_file -verilog "../trunk/OC-UART/uart_regs.v"
-add_file -verilog "../trunk/OC-UART/uart_rfifo.v"
-add_file -verilog "../trunk/OC-UART/uart_sync_flops.v"
-add_file -verilog "../trunk/OC-UART/uart_tfifo.v"
-add_file -verilog "../trunk/OC-UART/uart_top.v"
-add_file -verilog "../trunk/OC-UART/uart_transmitter.v"
-add_file -verilog "../trunk/OC-UART/uart_wb.v"
-add_file -verilog "../trunk/NOR-flash/WBFLASH.v"
-add_file -verilog "../trunk/os2wb/l1ddir.v"
-add_file -verilog "../trunk/os2wb/l1dir.v"
-add_file -verilog "../trunk/os2wb/l1idir.v"
-add_file -verilog "../trunk/os2wb/os2wb.v"
-add_file -verilog "../trunk/os2wb/os2wb_dual.v"
-add_file -verilog "../trunk/os2wb/rst_ctrl.v"
-add_file -verilog "../trunk/os2wb/s1_top.v"
-add_file -verilog "../trunk/T1-common/common/cluster_header.v"
-add_file -verilog "../trunk/T1-common/common/cluster_header_ctu.v"
-add_file -verilog "../trunk/T1-common/common/cluster_header_dup.v"
-add_file -verilog "../trunk/T1-common/common/cluster_header_sync.v"
-add_file -verilog "../trunk/T1-common/common/cmp_sram_redhdr.v"
-add_file -verilog "../trunk/T1-common/common/dbl_buf.v"
-add_file -verilog "../trunk/T1-common/common/swrvr_clib.v"
-add_file -verilog "../trunk/T1-common/common/swrvr_dlib.v"
-add_file -verilog "../trunk/T1-common/common/sync_pulse_synchronizer.v"
-add_file -verilog "../trunk/T1-common/common/synchronizer_asr.v"
-add_file -verilog "../trunk/T1-common/common/synchronizer_asr_dup.v"
-add_file -verilog "../trunk/T1-common/common/test_stub_bist.v"
-add_file -verilog "../trunk/T1-common/common/test_stub_scan.v"
-add_file -verilog "../trunk/T1-common/common/ucb_bus_in.v"
-add_file -verilog "../trunk/T1-common/common/ucb_bus_out.v"
-add_file -verilog "../trunk/T1-common/common/ucb_flow_2buf.v"
-add_file -verilog "../trunk/T1-common/common/ucb_flow_jbi.v"
-add_file -verilog "../trunk/T1-common/common/ucb_flow_spi.v"
-add_file -verilog "../trunk/T1-common/common/ucb_noflow.v"
-add_file -verilog "../trunk/T1-common/m1/m1.V"
-add_file -verilog "../trunk/T1-common/srams/bw_r_cm16x40.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_cm16x40b.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_dcd.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_dcm.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_efa.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_frf.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_icd.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_idct.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_irf.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_irf_fpga1.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_irf_register.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_l2d.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_l2d_32k.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_l2d_rep_bot.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_l2d_rep_top.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_l2t.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_rf16x128d.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_rf16x160.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_rf16x32.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_rf32x108.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_rf32x152b.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_rf32x80.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_scm.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_tlb.v"
-add_file -verilog "../trunk/T1-common/srams/bw_r_tlb_fpga.v"
-add_file -verilog "../trunk/T1-common/srams/bw_rf_16x65.v"
-add_file -verilog "../trunk/T1-common/srams/bw_rf_16x81.v"
-add_file -verilog "../trunk/T1-common/srams/regfile_1w_4r.v"
-add_file -verilog "../trunk/T1-common/u1/u1.V"
-add_file -verilog "../trunk/T1-FPU/bw_clk_cl_fpu_cmp.v"
-add_file -verilog "../trunk/T1-FPU/fpu.v"
-add_file -verilog "../trunk/T1-FPU/fpu_add.v"
-add_file -verilog "../trunk/T1-FPU/fpu_add_ctl.v"
-add_file -verilog "../trunk/T1-FPU/fpu_add_exp_dp.v"
-add_file -verilog "../trunk/T1-FPU/fpu_add_frac_dp.v"
-add_file -verilog "../trunk/T1-FPU/fpu_cnt_lead0_53b.v"
-add_file -verilog "../trunk/T1-FPU/fpu_cnt_lead0_64b.v"
-add_file -verilog "../trunk/T1-FPU/fpu_cnt_lead0_lvl1.v"
-add_file -verilog "../trunk/T1-FPU/fpu_cnt_lead0_lvl2.v"
-add_file -verilog "../trunk/T1-FPU/fpu_cnt_lead0_lvl3.v"
-add_file -verilog "../trunk/T1-FPU/fpu_cnt_lead0_lvl4.v"
-add_file -verilog "../trunk/T1-FPU/fpu_denorm_3b.v"
-add_file -verilog "../trunk/T1-FPU/fpu_denorm_3to1.v"
-add_file -verilog "../trunk/T1-FPU/fpu_denorm_frac.v"
-add_file -verilog "../trunk/T1-FPU/fpu_div.v"
-add_file -verilog "../trunk/T1-FPU/fpu_div_ctl.v"
-add_file -verilog "../trunk/T1-FPU/fpu_div_exp_dp.v"
-add_file -verilog "../trunk/T1-FPU/fpu_div_frac_dp.v"
-add_file -verilog "../trunk/T1-FPU/fpu_in.v"
-add_file -verilog "../trunk/T1-FPU/fpu_in2_gt_in1_2b.v"
-add_file -verilog "../trunk/T1-FPU/fpu_in2_gt_in1_3b.v"
-add_file -verilog "../trunk/T1-FPU/fpu_in2_gt_in1_3to1.v"
-add_file -verilog "../trunk/T1-FPU/fpu_in2_gt_in1_frac.v"
-add_file -verilog "../trunk/T1-FPU/fpu_in_ctl.v"
-add_file -verilog "../trunk/T1-FPU/fpu_in_dp.v"
-add_file -verilog "../trunk/T1-FPU/fpu_mul.v"
-add_file -verilog "../trunk/T1-FPU/fpu_mul_ctl.v"
-add_file -verilog "../trunk/T1-FPU/fpu_mul_exp_dp.v"
-add_file -verilog "../trunk/T1-FPU/fpu_mul_frac_dp.v"
-add_file -verilog "../trunk/T1-FPU/fpu_out.v"
-add_file -verilog "../trunk/T1-FPU/fpu_out_ctl.v"
-add_file -verilog "../trunk/T1-FPU/fpu_out_dp.v"
-add_file -verilog "../trunk/T1-FPU/fpu_rptr_groups.v"
-add_file -verilog "../trunk/T1-FPU/fpu_rptr_macros.v"
-add_file -verilog "../trunk/T1-FPU/fpu_rptr_min_global.v"
-add_file -verilog "../trunk/WB/wb_conbus_arb.v"
-add_file -verilog "../trunk/WB/wb_conbus_defines.v"
-add_file -verilog "../trunk/WB/wb_conbus_top.v"
-add_file -verilog "../trunk/WB2ALTDDR3/dram_wb.v"
-add_file -verilog "../xup5lx110t/cachedir.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram_fifo.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/pcx_fifo.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/dram.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_chipscope.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_ctrl.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_idelay_ctrl.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_infrastructure.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_mem_if_top.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_calib.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_ctl_io.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_dm_iob.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_dq_iob.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_dqs_iob.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_init.v"
-add_file -vhdl -lib work "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_init.vhd"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_io.v"
-add_file -vhdl -lib work "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_io.vhd"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_top.v"
-add_file -vhdl -lib work "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_top.vhd"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_write.v"
-add_file -vhdl -lib work "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_phy_write.vhd"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_top.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_usr_addr_fifo.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_usr_rd.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_usr_top.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/dram/user_design/rtl/ddr2_usr_wr.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_alu.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_alu_16eql.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_aluadder64.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_aluaddsub.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_alulogic.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_aluor32.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_aluspr.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_aluzcmp64.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_byp.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_byp_eccgen.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_div.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_div_32eql.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_div_yreg.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_ecc.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_ecc_dec.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_ecl.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_ecl_cnt6.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_ecl_divcntl.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_ecl_eccctl.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_ecl_mdqctl.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_ecl_wb.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_eclbyplog.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_eclbyplog_rs1.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_eclccr.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_eclcomp7.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_reg.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_rml.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_rml_cwp.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_rml_inc3.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_rndrob.v"
-add_file -verilog "../trunk/T1-CPU/exu/sparc_exu_shft.v"
-add_file -verilog "../trunk/T1-CPU/ffu/sparc_ffu.v"
-add_file -verilog "../trunk/T1-CPU/ffu/sparc_ffu_ctl.v"
-add_file -verilog "../trunk/T1-CPU/ffu/sparc_ffu_ctl_visctl.v"
-add_file -verilog "../trunk/T1-CPU/ffu/sparc_ffu_dp.v"
-add_file -verilog "../trunk/T1-CPU/ffu/sparc_ffu_part_add32.v"
-add_file -verilog "../trunk/T1-CPU/ffu/sparc_ffu_vis.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_cmp35.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_ctr5.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_dcl.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_dec.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_errctl.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_errdp.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_fcl.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_fdp.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_ifqctl.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_ifqdp.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_imd.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_incr46.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_invctl.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_lfsr5.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_lru4.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_mbist.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_milfsm.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_par16.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_par32.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_par34.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_rndrob.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_sscan.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_swl.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_swpla.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_thrcmpl.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_thrfsm.v"
-add_file -verilog "../trunk/T1-CPU/ifu/sparc_ifu_wseldp.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_asi_decode.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_dc_parity_gen.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_dcache_lfsr.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_dcdp.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_dctl.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_dctldp.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_excpctl.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_pcx_qmon.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_qctl1.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_qctl2.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_qdp1.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_qdp2.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_rrobin_picker2.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_stb_ctl.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_stb_ctldp.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_stb_rwctl.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_stb_rwdp.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_tagdp.v"
-add_file -verilog "../trunk/T1-CPU/lsu/lsu_tlbdp.v"
-add_file -verilog "../trunk/T1-CPU/mul/mul64.v"
-add_file -verilog "../trunk/T1-CPU/mul/sparc_mul_cntl.v"
-add_file -verilog "../trunk/T1-CPU/mul/sparc_mul_dp.v"
-add_file -verilog "../trunk/T1-CPU/mul/sparc_mul_top.v"
-add_file -verilog "../trunk/T1-CPU/rtl/bw_clk_cl_sparc_cmp.v"
-add_file -verilog "../trunk/T1-CPU/rtl/cpx_spc_buf.v"
-add_file -verilog "../trunk/T1-CPU/rtl/cpx_spc_rpt.v"
-add_file -verilog "../trunk/T1-CPU/rtl/sparc.v"
-add_file -verilog "../trunk/T1-CPU/rtl/spc_pcx_buf.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_ctl.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_lsurpt.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_lsurpt1.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_maaddr.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_maaeqb.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_mactl.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_madp.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_maexp.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_mald.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_mamul.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_mared.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_mast.v"
-add_file -verilog "../trunk/T1-CPU/spu/spu_wen.v"
-add_file -verilog "../trunk/T1-CPU/tlu/sparc_tlu_dec64.v"
-add_file -verilog "../trunk/T1-CPU/tlu/sparc_tlu_intctl.v"
-add_file -verilog "../trunk/T1-CPU/tlu/sparc_tlu_intdp.v"
-add_file -verilog "../trunk/T1-CPU/tlu/sparc_tlu_penc64.v"
-add_file -verilog "../trunk/T1-CPU/tlu/sparc_tlu_zcmp64.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_addern_32.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_hyperv.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_incr64.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_misctl.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_mmu_ctl.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_mmu_dp.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_pib.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_prencoder16.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_rrobin_picker.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_tcl.v"
-add_file -verilog "../trunk/T1-CPU/tlu/tlu_tdp.v"
-add_file -verilog "../xup5lx110t/ipcore_dir/pll.v"
+add_file -verilog "../T1-common/include/xst_defines.h"
+add_file -verilog "../Top/W1.v"
+add_file -verilog "../OC-UART/raminfr.v"
+add_file -verilog "../OC-UART/timescale.v"
+add_file -verilog "../OC-UART/uart_debug_if.v"
+add_file -verilog "../OC-UART/uart_defines.v"
+add_file -verilog "../OC-UART/uart_receiver.v"
+add_file -verilog "../OC-UART/uart_regs.v"
+add_file -verilog "../OC-UART/uart_rfifo.v"
+add_file -verilog "../OC-UART/uart_sync_flops.v"
+add_file -verilog "../OC-UART/uart_tfifo.v"
+add_file -verilog "../OC-UART/uart_top.v"
+add_file -verilog "../OC-UART/uart_transmitter.v"
+add_file -verilog "../OC-UART/uart_wb.v"
+add_file -verilog "../NOR-flash/WBFLASH.v"
+add_file -verilog "../os2wb/l1ddir.v"
+add_file -verilog "../os2wb/l1dir.v"
+add_file -verilog "../os2wb/l1idir.v"
+add_file -verilog "../os2wb/os2wb.v"
+add_file -verilog "../os2wb/os2wb_dual.v"
+add_file -verilog "../os2wb/rst_ctrl.v"
+add_file -verilog "../os2wb/s1_top.v"
+add_file -verilog "../T1-common/common/cluster_header.v"
+add_file -verilog "../T1-common/common/cluster_header_ctu.v"
+add_file -verilog "../T1-common/common/cluster_header_dup.v"
+add_file -verilog "../T1-common/common/cluster_header_sync.v"
+add_file -verilog "../T1-common/common/cmp_sram_redhdr.v"
+add_file -verilog "../T1-common/common/dbl_buf.v"
+add_file -verilog "../T1-common/common/swrvr_clib.v"
+add_file -verilog "../T1-common/common/swrvr_dlib.v"
+add_file -verilog "../T1-common/common/sync_pulse_synchronizer.v"
+add_file -verilog "../T1-common/common/synchronizer_asr.v"
+add_file -verilog "../T1-common/common/synchronizer_asr_dup.v"
+add_file -verilog "../T1-common/common/test_stub_bist.v"
+add_file -verilog "../T1-common/common/test_stub_scan.v"
+add_file -verilog "../T1-common/common/ucb_bus_in.v"
+add_file -verilog "../T1-common/common/ucb_bus_out.v"
+add_file -verilog "../T1-common/common/ucb_flow_2buf.v"
+add_file -verilog "../T1-common/common/ucb_flow_jbi.v"
+add_file -verilog "../T1-common/common/ucb_flow_spi.v"
+add_file -verilog "../T1-common/common/ucb_noflow.v"
+add_file -verilog "../T1-common/m1/m1.V"
+add_file -verilog "../T1-common/srams/bw_r_cm16x40.v"
+add_file -verilog "../T1-common/srams/bw_r_cm16x40b.v"
+add_file -verilog "../T1-common/srams/bw_r_dcd.v"
+add_file -verilog "../T1-common/srams/bw_r_dcm.v"
+add_file -verilog "../T1-common/srams/bw_r_efa.v"
+add_file -verilog "../T1-common/srams/bw_r_frf.v"
+add_file -verilog "../T1-common/srams/bw_r_icd.v"
+add_file -verilog "../T1-common/srams/bw_r_idct.v"
+add_file -verilog "../T1-common/srams/bw_r_irf.v"
+add_file -verilog "../T1-common/srams/bw_r_irf_fpga1.v"
+add_file -verilog "../T1-common/srams/bw_r_irf_register.v"
+add_file -verilog "../T1-common/srams/bw_r_l2d.v"
+add_file -verilog "../T1-common/srams/bw_r_l2d_32k.v"
+add_file -verilog "../T1-common/srams/bw_r_l2d_rep_bot.v"
+add_file -verilog "../T1-common/srams/bw_r_l2d_rep_top.v"
+add_file -verilog "../T1-common/srams/bw_r_l2t.v"
+add_file -verilog "../T1-common/srams/bw_r_rf16x128d.v"
+add_file -verilog "../T1-common/srams/bw_r_rf16x160.v"
+add_file -verilog "../T1-common/srams/bw_r_rf16x32.v"
+add_file -verilog "../T1-common/srams/bw_r_rf32x108.v"
+add_file -verilog "../T1-common/srams/bw_r_rf32x152b.v"
+add_file -verilog "../T1-common/srams/bw_r_rf32x80.v"
+add_file -verilog "../T1-common/srams/bw_r_scm.v"
+add_file -verilog "../T1-common/srams/bw_r_tlb.v"
+add_file -verilog "../T1-common/srams/bw_r_tlb_fpga.v"
+add_file -verilog "../T1-common/srams/bw_rf_16x65.v"
+add_file -verilog "../T1-common/srams/bw_rf_16x81.v"
+add_file -verilog "../T1-common/srams/regfile_1w_4r.v"
+add_file -verilog "../T1-common/u1/u1.V"
+add_file -verilog "../T1-FPU/bw_clk_cl_fpu_cmp.v"
+add_file -verilog "../T1-FPU/fpu.v"
+add_file -verilog "../T1-FPU/fpu_add.v"
+add_file -verilog "../T1-FPU/fpu_add_ctl.v"
+add_file -verilog "../T1-FPU/fpu_add_exp_dp.v"
+add_file -verilog "../T1-FPU/fpu_add_frac_dp.v"
+add_file -verilog "../T1-FPU/fpu_cnt_lead0_53b.v"
+add_file -verilog "../T1-FPU/fpu_cnt_lead0_64b.v"
+add_file -verilog "../T1-FPU/fpu_cnt_lead0_lvl1.v"
+add_file -verilog "../T1-FPU/fpu_cnt_lead0_lvl2.v"
+add_file -verilog "../T1-FPU/fpu_cnt_lead0_lvl3.v"
+add_file -verilog "../T1-FPU/fpu_cnt_lead0_lvl4.v"
+add_file -verilog "../T1-FPU/fpu_denorm_3b.v"
+add_file -verilog "../T1-FPU/fpu_denorm_3to1.v"
+add_file -verilog "../T1-FPU/fpu_denorm_frac.v"
+add_file -verilog "../T1-FPU/fpu_div.v"
+add_file -verilog "../T1-FPU/fpu_div_ctl.v"
+add_file -verilog "../T1-FPU/fpu_div_exp_dp.v"
+add_file -verilog "../T1-FPU/fpu_div_frac_dp.v"
+add_file -verilog "../T1-FPU/fpu_in.v"
+add_file -verilog "../T1-FPU/fpu_in2_gt_in1_2b.v"
+add_file -verilog "../T1-FPU/fpu_in2_gt_in1_3b.v"
+add_file -verilog "../T1-FPU/fpu_in2_gt_in1_3to1.v"
+add_file -verilog "../T1-FPU/fpu_in2_gt_in1_frac.v"
+add_file -verilog "../T1-FPU/fpu_in_ctl.v"
+add_file -verilog "../T1-FPU/fpu_in_dp.v"
+add_file -verilog "../T1-FPU/fpu_mul.v"
+add_file -verilog "../T1-FPU/fpu_mul_ctl.v"
+add_file -verilog "../T1-FPU/fpu_mul_exp_dp.v"
+add_file -verilog "../T1-FPU/fpu_mul_frac_dp.v"
+add_file -verilog "../T1-FPU/fpu_out.v"
+add_file -verilog "../T1-FPU/fpu_out_ctl.v"
+add_file -verilog "../T1-FPU/fpu_out_dp.v"
+add_file -verilog "../T1-FPU/fpu_rptr_groups.v"
+add_file -verilog "../T1-FPU/fpu_rptr_macros.v"
+add_file -verilog "../T1-FPU/fpu_rptr_min_global.v"
+add_file -verilog "../WB/wb_conbus_arb.v"
+add_file -verilog "../WB/wb_conbus_defines.v"
+add_file -verilog "../WB/wb_conbus_top.v"
+add_file -verilog "../WB2ALTDDR3/dram_wb.v"
+add_file -verilog "../Xilinx/cachedir.v"
+add_file -verilog "../Xilinx/dram_fifo.v"
+add_file -verilog "../Xilinx/pcx_fifo.v"
+add_file -verilog "../Xilinx/dram.v"
+add_file -verilog "../Xilinx/ddr2_chipscope.v"
+add_file -verilog "../Xilinx/ddr2_ctrl.v"
+add_file -verilog "../Xilinx/ddr2_idelay_ctrl.v"
+add_file -verilog "../Xilinx/ddr2_infrastructure.v"
+add_file -verilog "../Xilinx/ddr2_mem_if_top.v"
+add_file -verilog "../Xilinx/ddr2_phy_calib.v"
+add_file -verilog "../Xilinx/ddr2_phy_ctl_io.v"
+add_file -verilog "../Xilinx/ddr2_phy_dm_iob.v"
+add_file -verilog "../Xilinx/ddr2_phy_dq_iob.v"
+add_file -verilog "../Xilinx/ddr2_phy_dqs_iob.v"
+add_file -verilog "../Xilinx/ddr2_phy_init.v"
+#add_file -vhdl -lib work "../Xilinx/ddr2_phy_init.vhd"
+add_file -verilog "../Xilinx/ddr2_phy_io.v"
+#add_file -vhdl -lib work "../Xilinx/ddr2_phy_io.vhd"
+add_file -verilog "../Xilinx/ddr2_phy_top.v"
+#add_file -vhdl -lib work "../Xilinx/ddr2_phy_top.vhd"
+add_file -verilog "../Xilinx/ddr2_phy_write.v"
+#add_file -vhdl -lib work "../Xilinx/ddr2_phy_write.vhd"
+add_file -verilog "../Xilinx/ddr2_top.v"
+add_file -verilog "../Xilinx/ddr2_usr_addr_fifo.v"
+add_file -verilog "../Xilinx/ddr2_usr_rd.v"
+add_file -verilog "../Xilinx/ddr2_usr_top.v"
+add_file -verilog "../Xilinx/ddr2_usr_wr.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_alu.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_alu_16eql.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_aluadder64.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_aluaddsub.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_alulogic.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_aluor32.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_aluspr.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_aluzcmp64.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_byp.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_byp_eccgen.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_div.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_div_32eql.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_div_yreg.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_ecc.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_ecc_dec.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_ecl.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_ecl_cnt6.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_ecl_divcntl.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_ecl_eccctl.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_ecl_mdqctl.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_ecl_wb.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_eclbyplog.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_eclbyplog_rs1.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_eclccr.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_eclcomp7.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_reg.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_rml.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_rml_cwp.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_rml_inc3.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_rndrob.v"
+add_file -verilog "../T1-CPU/exu/sparc_exu_shft.v"
+add_file -verilog "../T1-CPU/ffu/sparc_ffu.v"
+add_file -verilog "../T1-CPU/ffu/sparc_ffu_ctl.v"
+add_file -verilog "../T1-CPU/ffu/sparc_ffu_ctl_visctl.v"
+add_file -verilog "../T1-CPU/ffu/sparc_ffu_dp.v"
+add_file -verilog "../T1-CPU/ffu/sparc_ffu_part_add32.v"
+add_file -verilog "../T1-CPU/ffu/sparc_ffu_vis.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_cmp35.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_ctr5.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_dcl.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_dec.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_errctl.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_errdp.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_fcl.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_fdp.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_ifqctl.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_ifqdp.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_imd.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_incr46.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_invctl.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_lfsr5.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_lru4.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_mbist.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_milfsm.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_par16.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_par32.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_par34.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_rndrob.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_sscan.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_swl.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_swpla.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_thrcmpl.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_thrfsm.v"
+add_file -verilog "../T1-CPU/ifu/sparc_ifu_wseldp.v"
+add_file -verilog "../T1-CPU/lsu/lsu.v"
+add_file -verilog "../T1-CPU/lsu/lsu_asi_decode.v"
+add_file -verilog "../T1-CPU/lsu/lsu_dc_parity_gen.v"
+add_file -verilog "../T1-CPU/lsu/lsu_dcache_lfsr.v"
+add_file -verilog "../T1-CPU/lsu/lsu_dcdp.v"
+add_file -verilog "../T1-CPU/lsu/lsu_dctl.v"
+add_file -verilog "../T1-CPU/lsu/lsu_dctldp.v"
+add_file -verilog "../T1-CPU/lsu/lsu_excpctl.v"
+add_file -verilog "../T1-CPU/lsu/lsu_pcx_qmon.v"
+add_file -verilog "../T1-CPU/lsu/lsu_qctl1.v"
+add_file -verilog "../T1-CPU/lsu/lsu_qctl2.v"
+add_file -verilog "../T1-CPU/lsu/lsu_qdp1.v"
+add_file -verilog "../T1-CPU/lsu/lsu_qdp2.v"
+add_file -verilog "../T1-CPU/lsu/lsu_rrobin_picker2.v"
+add_file -verilog "../T1-CPU/lsu/lsu_stb_ctl.v"
+add_file -verilog "../T1-CPU/lsu/lsu_stb_ctldp.v"
+add_file -verilog "../T1-CPU/lsu/lsu_stb_rwctl.v"
+add_file -verilog "../T1-CPU/lsu/lsu_stb_rwdp.v"
+add_file -verilog "../T1-CPU/lsu/lsu_tagdp.v"
+add_file -verilog "../T1-CPU/lsu/lsu_tlbdp.v"
+add_file -verilog "../T1-CPU/mul/mul64.v"
+add_file -verilog "../T1-CPU/mul/sparc_mul_cntl.v"
+add_file -verilog "../T1-CPU/mul/sparc_mul_dp.v"
+add_file -verilog "../T1-CPU/mul/sparc_mul_top.v"
+add_file -verilog "../T1-CPU/rtl/bw_clk_cl_sparc_cmp.v"
+add_file -verilog "../T1-CPU/rtl/cpx_spc_buf.v"
+add_file -verilog "../T1-CPU/rtl/cpx_spc_rpt.v"
+add_file -verilog "../T1-CPU/rtl/sparc.v"
+add_file -verilog "../T1-CPU/rtl/spc_pcx_buf.v"
+add_file -verilog "../T1-CPU/spu/spu.v"
+add_file -verilog "../T1-CPU/spu/spu_ctl.v"
+add_file -verilog "../T1-CPU/spu/spu_lsurpt.v"
+add_file -verilog "../T1-CPU/spu/spu_lsurpt1.v"
+add_file -verilog "../T1-CPU/spu/spu_maaddr.v"
+add_file -verilog "../T1-CPU/spu/spu_maaeqb.v"
+add_file -verilog "../T1-CPU/spu/spu_mactl.v"
+add_file -verilog "../T1-CPU/spu/spu_madp.v"
+add_file -verilog "../T1-CPU/spu/spu_maexp.v"
+add_file -verilog "../T1-CPU/spu/spu_mald.v"
+add_file -verilog "../T1-CPU/spu/spu_mamul.v"
+add_file -verilog "../T1-CPU/spu/spu_mared.v"
+add_file -verilog "../T1-CPU/spu/spu_mast.v"
+add_file -verilog "../T1-CPU/spu/spu_wen.v"
+add_file -verilog "../T1-CPU/tlu/sparc_tlu_dec64.v"
+add_file -verilog "../T1-CPU/tlu/sparc_tlu_intctl.v"
+add_file -verilog "../T1-CPU/tlu/sparc_tlu_intdp.v"
+add_file -verilog "../T1-CPU/tlu/sparc_tlu_penc64.v"
+add_file -verilog "../T1-CPU/tlu/sparc_tlu_zcmp64.v"
+add_file -verilog "../T1-CPU/tlu/tlu.v"
+add_file -verilog "../T1-CPU/tlu/tlu_addern_32.v"
+add_file -verilog "../T1-CPU/tlu/tlu_hyperv.v"
+add_file -verilog "../T1-CPU/tlu/tlu_incr64.v"
+add_file -verilog "../T1-CPU/tlu/tlu_misctl.v"
+add_file -verilog "../T1-CPU/tlu/tlu_mmu_ctl.v"
+add_file -verilog "../T1-CPU/tlu/tlu_mmu_dp.v"
+add_file -verilog "../T1-CPU/tlu/tlu_pib.v"
+add_file -verilog "../T1-CPU/tlu/tlu_prencoder16.v"
+add_file -verilog "../T1-CPU/tlu/tlu_rrobin_picker.v"
+add_file -verilog "../T1-CPU/tlu/tlu_tcl.v"
+add_file -verilog "../T1-CPU/tlu/tlu_tdp.v"
+add_file -verilog "../Xilinx/pll.v"
 
 
Index: trunk/synplicity/rev_1/W1.ucf
===================================================================
--- trunk/synplicity/rev_1/W1.ucf	(revision 9)
+++ trunk/synplicity/rev_1/W1.ucf	(revision 10)
@@ -1,2 +1,19 @@
+# Constrain per PLL (da pll_arwz.ucf )
+# Generated by Xilinx Architecture Wizard
+# --- UCF Template Only ---
+# Cut and paste these attributes into the project's UCF file, if desired
+INST PLL_INST BANDWIDTH = OPTIMIZED;
+INST PLL_INST CLKIN1_PERIOD = 5.000;
+INST PLL_INST CLKIN2_PERIOD = 10.000;
+INST PLL_INST CLKOUT0_DIVIDE = 8;
+INST PLL_INST CLKOUT0_PHASE = 0.000;
+INST PLL_INST CLKOUT0_DUTY_CYCLE = 0.500;
+INST PLL_INST COMPENSATION = SYSTEM_SYNCHRONOUS;
+INST PLL_INST DIVCLK_DIVIDE = 1;
+INST PLL_INST CLKFBOUT_MULT = 2;
+INST PLL_INST CLKFBOUT_PHASE = 0.0;
+INST PLL_INST REF_JITTER = 0.005000;
+
+
 ########################## segnali globali 
 
Index: trunk/synplicity/rev_1/pcx_fifo.ngc
===================================================================
--- trunk/synplicity/rev_1/pcx_fifo.ngc	(revision 10)
+++ trunk/synplicity/rev_1/pcx_fifo.ngc	(revision 10)
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.6e
+$6:a40<,[o}e~g`n;"2*726&;$?,)?40008456789:;<=>?0123452739:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?01234567811;<=>743324>6?8;:;<=>?012;472<81LM=6?<;0,351=6;90BB][[:ekm844>294::6?<0;MVPUSS2me~x1?=9;2=53=6=3CE\XZ5RECG@WS;9=0;2<84148JJUSS2^XJHI\Z<0694;7138<1EC^ZT;PGEABUD5;>6=0>6:35>LHW]]0\^LJKRM>21?69928?7?=<30580?OIX\^1XDK@FGUFEI:4294:;6:5IORVP?RNMFLM[HOZ<283:4c<=3CE\XZ5psmd[`kw|pUdk|h=694;423<0BB][[:qplcZcjx}sTxe|jsi]bwvcu|5>1<3<:;48JJUSS2yxdkRkbpu{\pmtb{aUeijo{e=694;7c3<0BB][[:qplcZ`rdeUdk|h=694;433<0BB][[:qplcZ`rdeUdk|h^cpw`ts4=0;2?:45;KMTPR=x{elSk{cl^vkv`uoWgolmyk34;2=55=2~er:==zif0302(563?;:7;:5IORVP?BN4?91<3?=;769KPRW]]0OC18<:1<2<>0=G\^[YY4kauc\gjsi|5?1<3?m;78LQQVR\3xoSio{a^alqkr;=3:5=o59:NWWTPR={UomyoPcnwmp93=8780:L:46@CB<>0FIHKJML??;7DE2C@ANOLMJ;HI6028<?OIX\^1HD^37;2=55=?2@D[YY4XEM>4>5868221EC^ZT;UFQ91=87;:754@UURVP?BHX5=1<3?8;98LQQVR\3OHO]O]IU[?3?69<22N4L64912:45679912<=7?0123456>89397L<<;@NO=>GTQGIT^HI>0:@BED55:;HJMLHJED18FP4?3K_XSD@IO09@6>EB991HJ5O7A9CFBDGFIHK:>6MGEBI\HLEBFZOTXT^J3:AOV<=DGDGBXYKK159@KWCXOLDN^LZFOO]JJCI03JXNMYKK1:F4?ADN\LXY96JF<1<5?AO;994=7IG310<5?AO;9;4=7IG312<5?AO;9=4=7IG314<5?AO;9?4=7IG316<5?AO;914=7IG318<6?AO;97<0HD2=0?48@L:597<0HD2=2?48@L:5;7<0HD2=4?48@L:5=7<0HD2=6?48@L:5?7<0HD2=8?48@L:517?0HD2=>79GM9576?1OE1=>>79GM9556?1OE1=<>79GM9536?1OE1=:>79GM9516?1OE1=8>79GM95?6?1OE1=6>49GM959>2NB09>16:FJ8179>2NB09<16:FJ8159>2NB09:16:FJ8139>2NB09816:FJ8119>2NB09616:FJ81?9=2NB0909;EK?15813MC79<09;EK?17813MC79>09;EK?11813MC79809;EK?13813MC79:09;EK?1=813MC7940:;EK?1;0<L@6=<384DH>55;0<L@6=>364DH>57?69>2NB0;=15:FJ83823MC7;3;4DH>;:0=CA535:6JFP=2=2>BNX5;5:6JFP=0=2>BNX595:6JFP=6=2>BNX5?5:6JFP=4=<>BNX5=1<384DHR?3;3<LF6;2;5KO=33:3=CG5;:2;5KO=31:3=CG5;82;5KO=37:3=CG5;>2;5KO=35:3=CG5;<2;5KO=3;:3=CG5;2285KO=3=2>BH4;:5:6J@<33=2>BH4;85:6J@<31=2>BH4;>5:6J@<37=2>BH4;<5:6J@<35=2>BH4;25:6J@<3;=1>BH4;4=7IA331<5?AI;;84=7IA333<5?AI;;:4=7IA335<5?AI;;<4=7IA337<5?AI;;>4=7IA339<5?AI;;04>7IA33?48@J:387<0HB2;1?48@J:3:7<0HB2;3?48@J:3<7<0HB2;5?48@J:3>7<0HB2;7?48@J:307<0HB2;9?78@J:36?1OC1;?>79GK9366?1OC1;=>79GK9346?1OC1;;>79GK9326?1OC1;9>79GK9306?1OC1;7>79GK93>6<1OC1;16:FL8369>2ND0;?16:FL834902ND0;=50?48@J:1;7?0HB29>49GK919=2ND050:;EM?=;0<LFZ7<384DNR?5;0<LFZ7>384DNR?7;0<LFZ78384DNR?1;0<LFZ7:364DNR?3?69>2ND\1916:FL[WC@k2OHO]O]IU[?4;e<MJI[M_G[Y=3=g>CDKYKYEYW32?a8AFEWI[C_U1=1c:G@GUGUA]S783m4EBASEWOSQ5?5o6KLCQCQMQ_;>7o0INM_ASKW]91=87i0INM_ASKW]919j2OESHML_SGB@f=BFVOHOR]LRT@`?@HXMJIT[_G[E39E60=AIEYN>6HK3:DGG1=ALJO87KJ_4:DGT@2<NMXN46HI50DE10773OLMJ5:=1GDEBC@AN81L?6IAD09J6>O7:2C:>6G=2:K06>O3:2C>46GAIUR\45><AGC_\R>>8:KMMQVX8;20ECG[P^20<>OIA]ZT<964IOKWTZ6202CEEY^P07:8MKOSXV:<46GAIUR\4=><AGC_\R>68:KMMQVX8H20ECG[P^2A<>OIA]ZT<N64IOKWTZ6C02CEEY^P0D:8MKOSXV:M56GAIUQWEQC03@DBXR>?7:KMMQY79>1BBDZP0358MKOSW99<7D@FT^273>OIA]U;9:5FNHV\431<AGC_S=98;HLJPZ6??2CEEYQ?969JJLRX8H=0ECG[_1@4?LHN\V:H;6GAIU]3@2=NF@^T<H94IOKW[5@03@DBXR??7:KMMQY69>1BBDZP1358MKOSW89<7D@FT^373>OIA]U:9:5FNHV\531<AGC_S<98;HLJPZ7??2CEEYQ>969JJLRX9H=0ECG[_0@4?LHN\V;H;6GAIU]2@2=NF@^T=H94IOKW[4@03@DBXR<?7:KMMQY59>1BBDZP2358MKOSW;9<7D@FT^073>OIA]U99:5FNHV\631<AGC_S?98;HLJPZ4??2CEEYQ=969JJLRX:H=0ECG[_3@4?LHN\V8H;6GAIU]1@2=NF@^T>H94IOKW[7@03@DBXR=?7:KMMQY49>1BBDZP3358MKOSW:9<7D@FT^173>OIA]U89:5FNHV\731<AGC_S>98;HLJPZ5??2CEEYQ<969JJLRX;H=0ECG[_2@4?LHN\V9H;6GAIU]0@2=NF@^T?H94IOKW[6@03@DBXR:?7:KMMQY39>1BBDZP4358MKOSW=9<7D@FT^673>OIA]U?9:5FNHV\031<AGC_S998;HLJPZ2??2CEEYQ;969JJLRX<H=0ECG[_5@4?LHN\V>H;6GAIU]7@2=NF@^T8H94IOKW[1@03@DBXR;?7:KMMQY29>1BBDZP5358MKOSW<9<7D@FT^773>OIA]U>9:5FNHV\131<AGC_S898;HLJPZ3??2CEEYQ:969JJLRX=H=0ECG[_4@4?LHN\V?H;6GAIU]6@2=NF@^T9H94IOKW[0@03@DBXR8?7:KMMQY19>1BBDZP6358MKOSW?9<7D@FT^473>OIA]U=9:5FNHV\231<AGC_S;98;HLJPZ0??2CEEYQ9969JJLRX>H=0ECG[_7@4?LHN\V<H;6GAIU]5@2=NF@^T:H94IOKW[3@03@DBXR9?7:KMMQY09>1BBDZP7358MKOSW>9<7D@FT^573>OIA]U<9:5FNHV\331<AGC_S:98;HLJPZ1??2CEEYQ8969JJLRX?H=0ECG[_6@4?LHN\V=H;6GAIU]4@2=NF@^T;H94IOKW[2@>3@DBXRHFLD18MKP13EEJHHJ8;MMDMFGK<2F^X?:4LTV00>JR\=>0@XZ:4:NVP33<EZMDBn5BakmqR`ttafdh7@gaosTfvvohf;1E=95A1127?K779=1E==<;;O3371=I99>?7C??559M55033G;;;95A11:7?K771:1E=<:4N0330>H698>0B<?=4:L2562<F8;?86@>1468J471<2D:=::4N03;0>H69090B<<;;O3141=I9;;?7C?=259M57533G;9895A1377?K75>=1E=?9;;O31<1=I9;387C?<4:L2752<F89:86@>3368J454<2D:?9:4N0160>H6;?>0B<=84:L27=2<F892?6@>459M51633G;?=95A1500?K72;2D::>5A1668J411<2D:;::4N05;0>H6?090B<6;;O3;41=I91;?7C?7259M5=533G;3895A1977?K7?>=1E=59;;O3;<1=I91387C?64:L2=52<F83:86@>9368J4?4<2D:59:4N0;60>H61?>0B<784:L2==2<F832?6@=059M65633G8;=95A2107?K47;=1E>=:;;O0311=I:9<?7C<?759M65>33G8;5>5A2068J777<2D9=<:4N3310>H59:>0B??;4:L1502<F;;=86@=1668J77?<2D9=4=4N307?K458=1E>??;;O0161=I:;9?7C<=459M67333G89:95A2357?K450=1E>?7<;O000>H5;9>0B?=>4:L1772<F;9886@=3568J752<2D9?;:4N3140>H5;1>0B?=63:L101=I:=:?7C<;159M61433G8??95A2567?K43==1E>98;;O0731=I:=2?7C<;929M602<F;?;86@=5068J735<2D99>:4N3770>H5=<>0B?;94:L1122<F;?386@=5818J7033G8=<95A2737?K41:=1E>;=;;O0501=I:???7C<9659M63133G8=495A27;0?K40<2D9;=:4N3520>H5?;>0B?9<4:L1312<F;=>86@=7768J710<2D9;5:4N35:7>H50=1E>5>;;O0;51=I:18?7C<7359M6=233G83995A2947?K4??=1E>56;;O0;=6=I:0>0B?7?4:L1=42<F;3986@=9268J7?3<2D958:4N3;50>H51>>0B?774:L1=<5<F::?7C=?059M75733G9;>95A3117?K57<=1E?=;;;O1326=I;8>0B>??3:L066=I;:90B>:<;O167>H4>:1E?:=4N2:0?K5>:2D??6@;029M045<F=887C:<3:L706=I<<90B98<;O647>H30:1E84<4N418J0643G?:?6@:229M165<F<>87C;:3:L626=I=>90B86<;O7:7>H18:1E:<=4N700?K04;2D=8>5A6418J3043G<<?6@9829M2<5<F>:87C9>3:L466=I?:90B::<;O567>H0>:1E;:=4N6:0?K1>;2D3<>5A8018J=443G28?6@7429M<05<F1<87C683:L;<6=I0090B4><;O;27>H>::1E5>=4N860?K?2;2D2:>5A9618J<>43G32j6@M_CWPTLHXX[E[_:5AEUULVN2<FFDN=6A=;NI2?U2<XHX_m6^FN^@VWLB_j2ZBBRLZSOCNA6=WZL;0]<5]d:PBIG51[MZTIU^n;SFB@ATK494i7_JNDEPO8469j2XOMIJ]L=32:g=ULHNO^A2>2?`8VAGCL[F7=>0m;SFB@ATK48>5h6\KAEFQH972294i7_JNDEPO8439i2XOMIJ]L=3=e>TCIMNY@1<1a:PGEABUD595m6\KAEFQH929i2XOMIJ]L=7=e>TCIMNY@181a:PGEABUD5=5m6\KAEFQH9>9i2XOMIJ]L=;=e>TCIMNYY1>1b:PGEABU]5;;2o5]D@FGVP:697h0^IOKDSW?578e3[NJHI\Z<01=`>TCIMNYY1?;:1<a?WBFLMX^0<:1a:PGEABU]5;5m6\KAEFQQ949i2XOMIJ]U=1=e>TCIMNYY1:1a:PGEABU]5?5m6\KAEFQQ909i2XOMIJ]U=5=e>TCIMNYY161a:PGEABU]535:6\KCMIO2>TCKEA^96\KEON6?WBBF\=0^I\LLJN4?WBUKEA^:6\JGBGO2>TBOJO^86]NFD:8WDPBLH^J;6]MIUGQV45<[@GTOBBCIRKLJZEOMJA37^GB_LMGA==TC@ZT\D@9;RMVVFC23ZX]MA:4SRPO0>UTZ\h0XDK@FGQPVGJe3]CNCKH\SS@V`>RNMFLM[HOC<1<g?QOBGOL\ILB31?f8PLCHNO]NMA2=>g9WM@IAN^OJ@1=50?f8PLCHNO]NMA2<>e9WM@IAN^OJY1>1d:VJAJ@A_LK^0<0k;UKFKC@PMH_7>3h4THGLBCQBI\686=0k;UKFKC@PMH_7?3:4TXRF6d=R8&myj#|i/fn3*wb(o{;%~kyit.PBIZTCWLDTJZH[13;8Q5)`zo$yj"ic0/pg+bt6&{l|jy!]AL]QABIR\VOE=?j4U1-dvc(un&mg<#|k/fp2*w`pn}%hy|Pfvdw[vrf|l6;2?j4U1-dvc(un&mg<#|k/fp2*w`pn}%hy|Pfvdw[vrf|l6:2?m4U1-dvc(un&mg<#|k/fp2*w`pn}%hy|Pfvdw[vrf|lU;>n5Z0.eqb+ta'nf;"j gs3-vcqa|&i~~Qiwgv\wqgsmV;896[?/fpe*w`(oe:%~i!hr0,qbr`s'jy~Rhxfu]ppdrbWds<=>><1<02>S7'nxm"h gm2-va)`z8$yjzh{/bwqvZ`pn}Uxxlzj_lw{4566494:?85Z0.eqb+ta'nf;"j gs3-vcqa|&i~~Qiwgv\wqgsmVg~t=>?1=3=73=R8&myj#|i/fn3*wb(o{;%~kyit.avvwYao~Tyo{e^ov|56795;5=?64U1-dvc(un&mg<#|k/fp2*w`pn}%na}zv_guepZ`e:>1^<"i}f/pe+bj7&{n$k?!rguep*cjx}sTjzh{_h0e?P6(o{l%~k!hl1,q`*au9'xm{kz elrw}Z`pn}UbS`{w012375=R8&myj#|i/fn3*wb(o{;%~kyit.gntqXn~lSdQbuy23457582_;#j|i.sd,ci6)zm%l~~}!rrvp+fijx98?7X> gsd-vc)`d9$yh"i}sr,qwqu(kfg{<R]X0368Q5)`zo$yj"ic0/pg+btt{'xxx~!lolr3[VQ6:=1^<"i}f/pe+bj7&{n$k}|.sqww*ehey:T_Z<=9:W3+bta&{l$ka>!re-dvvu)zz~x#ob_dosp|YajVc8=6[?/fpe*w`(oe:%~i!hrrq-vvrt'{kfShctx]efZoXe|r;<=><4:W3+bta&{l$ka>!re-dvvu)zz~x#ob_dosp|YajVcTaxv?01226=543\:$kh!rg-dh5(ul&my~ }suq,vdkXmdzuRhm_h]nq}678992?>5Z0.eqb+ta'nf;"j gsqp*wus{&xjaRkbpu{\bgYnWds<=>?9200?P6(o{l%~k!hl1,q`*twf}x$Anaznu]`kphs:=1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~by?=4:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmp7433\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|d??:4U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov777=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Usc2?>03\MKPX8;i0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPxnp?5;76:j1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQwos>1:475k2_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfexRv`r=1=544d3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSua}<5<254`<]9%l~k }f.eo4+tc'{zex!lotlw8586n2_;#j|i.sd,ci6)zm%y|cz}/bmvjq:668l0Y=!hrg,qb*ak8'xo#~ats-`kphs4;4:j6[?/fpe*w`(oe:%~i!}povq+firf}682<h4U1-dvc(un&mg<#|k/srmpw)dg|d090>e:W3+bta&{l$ka>!re-qtkru'je~byQ?1d9V4*aun'xm#jb?.sf,vuhsz&idyczP10g8Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_33f?P6(o{l%~k!hl1,q`*twf}x$ob{at^12a>S7'nxm"h gm2-va)uxg~y#naznu]767=R8&myj#|i/fn3*wb(zyd~"m`uov\`4:76;80Y=!hrg,qb*ak8'xo#~ats-`kphsWm;7=3<=;T2,cw`)zo%l`= }d.psjqt(kfexRj><3<16>S7'nxm"h gm2-va)uxg~y#naznu]g5959:;1^<"i}f/pe+bj7&{n$~}`{r.alqkrXl86?2??4U1-dvc(un&mg<#|k/srmpw)dg|dSi?P0338Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_e3\577<]9%l~k }f.eo4+tc'{zex!lotlw[a7X:;;0Y=!hrg,qb*ak8'xo#~ats-`kphsWm;T???4U1-dvc(un&mg<#|k/srmpw)dg|dSi?P4368Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_omw4566:11^<"i}f/pe+bj7&~x$kz}|.vqww*tfeVl~`aQib^k11>S7'nxm"h gm2-sw)`zy%{~z|/scn[cskdVc9h6[?/fpe*w`(oe:%{!hwrq-svrt'{kfSk{cl^k\ip~789:8<6[?/fpe*w`(oe:%{!hwrq-svrt'{kfSk{cl^k\ip~789::<:=?;T2,cw`)zo%l`= xr.etwv(p{}y$~lcPftno[lYj}q:;<=?;43d8Q5)`zo$yj"ic0/uq+bqt{'}xx~!}al]eqijXaVg~t=>?0732`>S7'nxm"h gm2-sw)uidU|~Rka_h317>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|;>0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|Vidycz>259V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjq45<2_;#j|i.sd,ci6){%||cz}/LalqkrXkfex><;;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw064<]9%l~k }f.eo4+qu'~zex!BcnwmpZeh}g~Ttb|30?32[LHQW98h7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_ymq84869;i0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|VidyczPxnp?6;76:j1^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~byQwos>0:475k2_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRv`r=6=547a3\:$kh!rg-dh5(pz&}{by| cnwmp9699o1^<"i}f/pe+bj7&~x${}`{r.alqkr;97;m7X> gsd-vc)`d9$|~"ynup,gjsi|585=k5Z0.eqb+ta'nf;"z| wqlwv*eh}g~7?3?i;T2,cw`)zo%l`= xr.usjqt(kfex1:11d9V4*aun'xm#jb?.vp,suhsz&idyczP00g8Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_03f?P6(o{l%~k!hl1,tv*qwf}x$ob{at^02a>S7'nxm"h gm2-sw)pxg~y#naznu]05`=R8&myj#|i/fn3*rt(yd~"m`uov\074<]9%l~k }f.eo4+qu'~zex!lotlw[a7;87897X> gsd-vc)`d9$|~"ynup,gjsi|Vn:0<0=2:W3+bta&{l$ka>!ws-ttkru'je~byQk1=0=67=R8&myj#|i/fn3*rt(yd~"m`uov\`4:46;80Y=!hrg,qb*ak8'}y#z~ats-`kphsWm;783<>;T2,cw`)zo%l`= xr.usjqt(kfexRj>_102?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f2[4463\:$kh!rg-dh5(pz&}{by| cnwmpZb6W;8:7X> gsd-vc)`d9$|~"ynup,gjsi|Vn:S><>;T2,cw`)zo%l`= xr.usjqt(kfexRj>_507?P6(o{l%~k!hl1,tv*qwf}x$ob{at^llp56798=0Y=!hrg,qb*kbe&ndyyQf<1<2=>S7'nxm"h mdo,`jssW`6:<=0>9:W3+bta&{l$ahc dnww[l:6884:56[?/fpe*w`(elg$hb{{_h>2478612_;#j|i.sd,i`k(lfSd2>02<2=>S7'nxm"h mdo,`jssW`6:<90>9:W3+bta&{l$ahc dnww[l:68<4:56[?/fpe*w`(elg$hb{{_h>2438612_;#j|i.sd,i`k(lfSd2>06<2=>S7'nxm"h mdo,`jssW`6:<50>9:W3+bta&{l$ahc dnww[l:6804:46[?/fpe*w`(elg$hb{{_h>24;7>3\:$kh!rg-nah)cg|~Te1?>0?3:?P6(o{l%~k!bel-gkprXa5;:=3?6;T2,cw`)zo%fi`!kotv\m976:7;27X> gsd-vc)jmd%ocxzPi=327;7>3\:$kh!rg-nah)cg|~Te1?>4?3:?P6(o{l%~k!bel-gkprXa5;:93?6;T2,cw`)zo%fi`!kotv\m976>7;27X> gsd-vc)jmd%ocxzPi=323;7>3\:$kh!rg-nah)cg|~Te1?>8?3:?P6(o{l%~k!bel-gkprXa5;:53?7;T2,cw`)zo%fi`!kotv\m9766830Y=!hrg,qb*kbe&ndyyQf<003:4?<]9%l~k }f.ofi*bh}}Ub0<<>>0;8Q5)`zo$yj"cjm.flqqYn48892<74U1-dvc(un&gna"j`uu]j84446830Y=!hrg,qb*kbe&ndyyQf<007:4?<]9%l~k }f.ofi*bh}}Ub0<<:>0;8Q5)`zo$yj"cjm.flqqYn488=2<74U1-dvc(un&gna"j`uu]j84406830Y=!hrg,qb*kbe&ndyyQf<00;:4?<]9%l~k }f.ofi*bh}}Ub0<<6>0:8Q5)`zo$yj"cjm.flqqYn4885=55Z0.eqb+ta'dof#iazt^k?568602_;#j|i.sd,i`k(lfSd2>4?3;?P6(o{l%~k!bel-gkprXa5;>2<64U1-dvc(un&gna"j`uu]j8409911^<"i}f/pe+hcj'me~xRg316<2<>S7'nxm"h mdo,`jssW`6:43?7;T2,cw`)zo%fi`!kotv\m97>68=0Y=!hrg,qb*kbe&ndyyQf<0<2<>S7'nxm"h mdo,`jssW`69<3?7;T2,cw`)zo%fi`!kotv\m9466820Y=!hrg,qb*kbe&ndyyQf<30=5==R8&myj#|i/lgn+air|Vc7>>0>8:W3+bta&{l$ahc dnww[l:5<7;37X> gsd-vc)jmd%ocxzPi=06:4><]9%l~k }f.ofi*bh}}Ub0?81199V4*aun'xm#`kb/emvpZo;:>4:46[?/fpe*w`(elg$hb{{_h>1<;7?3\:$kh!rg-nah)cg|~Te1<6>058Q5)`zo$yj"cjm.flqqYn4;4:46[?/fpe*w`(elg$hb{{_h>04;7?3\:$kh!rg-nah)cg|~Te1=>>0:8Q5)`zo$yj"cjm.flqqYn4:85=55Z0.eqb+ta'dof#iazt^k?768602_;#j|i.sd,i`k(lfSd2<4?3;?P6(o{l%~k!bel-gkprXa59>2<64U1-dvc(un&gna"j`uu]j8609911^<"i}f/pe+hcj'me~xRg336<2<>S7'nxm"h mdo,`jssW`6843?7;T2,cw`)zo%fi`!kotv\m95>68=0Y=!hrg,qb*kbe&ndyyQf<2<2<>S7'nxm"h mdo,`jssW`6?<3?7;T2,cw`)zo%fi`!kotv\m9266820Y=!hrg,qb*kbe&ndyyQf<50=5==R8&myj#|i/lgn+air|Vc78>0>8:W3+bta&{l$ahc dnww[l:3<7;37X> gsd-vc)jmd%ocxzPi=66:4><]9%l~k }f.ofi*bh}}Ub0981199V4*aun'xm#`kb/emvpZo;<>4:46[?/fpe*w`(elg$hb{{_h>7<;7?3\:$kh!rg-nah)cg|~Te1:6>058Q5)`zo$yj"cjm.flqqYn4=4:46[?/fpe*w`(elg$hb{{_h>64;7?3\:$kh!rg-nah)cg|~Te1;>>0:8Q5)`zo$yj"cjm.flqqYn4<85=55Z0.eqb+ta'dof#iazt^k?168602_;#j|i.sd,i`k(lfSd2:4?3;?P6(o{l%~k!bel-gkprXa5?>2<64U1-dvc(un&gna"j`uu]j8009911^<"i}f/pe+hcj'me~xRg356<2<>S7'nxm"h mdo,`jssW`6>43?7;T2,cw`)zo%fi`!kotv\m93>68=0Y=!hrg,qb*kbe&ndyyQf<4<2<>S7'nxm"h mdo,`jssW`6=<3?7;T2,cw`)zo%fi`!kotv\m9066820Y=!hrg,qb*kbe&ndyyQf<70=5==R8&myj#|i/lgn+air|Vc7:>0>8:W3+bta&{l$ahc dnww[l:1<7;37X> gsd-vc)jmd%ocxzPi=46:4><]9%l~k }f.ofi*bh}}Ub0;81199V4*aun'xm#`kb/emvpZo;>>4:46[?/fpe*w`(elg$hb{{_h>5<;7?3\:$kh!rg-nah)cg|~Te186>058Q5)`zo$yj"cjm.flqqYn4?4:46[?/fpe*w`(elg$hb{{_h>44;7?3\:$kh!rg-nah)cg|~Te19>>0:8Q5)`zo$yj"cjm.flqqYn4>85=55Z0.eqb+ta'dof#iazt^k?368602_;#j|i.sd,i`k(lfSd284?3;?P6(o{l%~k!bel-gkprXa5=>2<64U1-dvc(un&gna"j`uu]j8209911^<"i}f/pe+hcj'me~xRg376<2<>S7'nxm"h mdo,`jssW`6<43?7;T2,cw`)zo%fi`!kotv\m91>68=0Y=!hrg,qb*kbe&ndyyQf<6<2<>S7'nxm"h mdo,`jssW`63<3?7;T2,cw`)zo%fi`!kotv\m9>66820Y=!hrg,qb*kbe&ndyyQf<90=5==R8&myj#|i/lgn+air|Vc74>0>8:W3+bta&{l$ahc dnww[l:?<7;37X> gsd-vc)jmd%ocxzPi=:6:4><]9%l~k }f.ofi*bh}}Ub0581199V4*aun'xm#`kb/emvpZo;0>4:46[?/fpe*w`(elg$hb{{_h>;<;7?3\:$kh!rg-nah)cg|~Te166>058Q5)`zo$yj"cjm.flqqYn414:46[?/fpe*w`(elg$hb{{_h>:4;7?3\:$kh!rg-nah)cg|~Te17>>0:8Q5)`zo$yj"cjm.flqqYn4085=55Z0.eqb+ta'dof#iazt^k?=68602_;#j|i.sd,i`k(lfSd264?3;?P6(o{l%~k!bel-gkprXa53>2<64U1-dvc(un&gna"j`uu]j8<09911^<"i}f/pe+hcj'me~xRg396<2<>S7'nxm"h mdo,`jssW`6243?7;T2,cw`)zo%fi`!kotv\m9?>68=0Y=!hrg,qb*kbe&ndyyQf<8<22>S7'nxm"h mdo,`jssW`U;=;5Z0.eqb+ta'dof#iazt^k\541<]9%l~k }f.ofi*bh}}UbS<>>8:W3+bta&{l$ahc dnww[lY689;37X> gsd-vc)jmd%ocxzPi^3354><]9%l~k }f.ofi*bh}}UbS<>=199V4*aun'xm#`kb/emvpZoX999:46[?/fpe*w`(elg$hb{{_h]2417?3\:$kh!rg-nah)cg|~TeR??50:8Q5)`zo$yj"cjm.flqqYnW8:==55Z0.eqb+ta'dof#iazt^k\551602_;#j|i.sd,i`k(lfSdQ>093;?P6(o{l%~k!bel-gkprXaV;;5<94U1-dvc(un&gna"j`uu]j[47602_;#j|i.sd,i`k(lfSdQ>113;?P6(o{l%~k!bel-gkprXaV;:=<64U1-dvc(un&gna"j`uu]j[475911^<"i}f/pe+hcj'me~xRgP1012<>S7'nxm"h mdo,`jssW`U:=9?7;T2,cw`)zo%fi`!kotv\mZ76=820Y=!hrg,qb*kbe&ndyyQf_0355==R8&myj#|i/lgn+air|VcT=<9>8:W3+bta&{l$ahc dnww[lY691;37X> gsd-vc)jmd%ocxzPi^32=41<]9%l~k }f.ofi*bh}}UbS<<>8:W3+bta&{l$ahc dnww[lY6:9;37X> gsd-vc)jmd%ocxzPi^3154><]9%l~k }f.ofi*bh}}UbS<<=199V4*aun'xm#`kb/emvpZoX9;9:46[?/fpe*w`(elg$hb{{_h]2617?3\:$kh!rg-nah)cg|~TeR?=50:8Q5)`zo$yj"cjm.flqqYnW88==55Z0.eqb+ta'dof#iazt^k\571602_;#j|i.sd,i`k(lfSdQ>293;?P6(o{l%~k!bel-gkprXaV;95<94U1-dvc(un&gna"j`uu]j[456?2_;#j|i.sd,i`k(lfSdQ>4058Q5)`zo$yj"cjm.flqqYnW8?:;6[?/fpe*w`(elg$hb{{_h]2241<]9%l~k }f.ofi*bh}}UbS<9>7:W3+bta&{l$ahc dnww[lY608=0Y=!hrg,qb*kbe&ndyyQf_0;22>S7'nxm"h mdo,`jssW`U9=:5Z0.eqb+ta'dof#iazt^k\65703\:$kh!rg-nah)cg|~TeR<>169V4*aun'xm#`kb/emvpZoX:;;<7X> gsd-vc)jmd%ocxzPi^0052=R8&myj#|i/lgn+air|VcT>9?8;T2,cw`)zo%fi`!kotv\mZ429>1^<"i}f/pe+hcj'me~xRgP2734?P6(o{l%~k!bel-gkprXaV8<=:5Z0.eqb+ta'dof#iazt^k\6=703\:$kh!rg-nah)cg|~TeR<6179V4*aun'xm#`kb/emvpZoX;8=0Y=!hrg,qb*kbe&ndyyQf_2223>S7'nxm"h mdo,`jssW`U8=<94U1-dvc(un&gna"j`uu]j[646?2_;#j|i.sd,i`k(lfSdQ<3058Q5)`zo$yj"cjm.flqqYnW:>:;6[?/fpe*w`(elg$hb{{_h]0141<]9%l~k }f.ofi*bh}}UbS>8>7:W3+bta&{l$ahc dnww[lY4?8=0Y=!hrg,qb*kbe&ndyyQf_2:23>S7'nxm"h mdo,`jssW`U85<84U1-dvc(un&gna"j`uu]j[1703\:$kh!rg-nah)cg|~TeR:?169V4*aun'xm#`kb/emvpZoX<8;<7X> gsd-vc)jmd%ocxzPi^6152=R8&myj#|i/lgn+air|VcT8>?8;T2,cw`)zo%fi`!kotv\mZ239>1^<"i}f/pe+hcj'me~xRgP4434?P6(o{l%~k!bel-gkprXaV>==:5Z0.eqb+ta'dof#iazt^k\02703\:$kh!rg-nah)cg|~TeR:7169V4*aun'xm#`kb/emvpZoX<0;=7X> gsd-vc)jmd%ocxzPi^723>S7'nxm"h mdo,`jssW`U><<94U1-dvc(un&gna"j`uu]j[076?2_;#j|i.sd,i`k(lfSdQ:2058Q5)`zo$yj"cjm.flqqYnW<9:;6[?/fpe*w`(elg$hb{{_h]6041<]9%l~k }f.ofi*bh}}UbS8;>7:W3+bta&{l$ahc dnww[lY2>8=0Y=!hrg,qb*kbe&ndyyQf_4523>S7'nxm"h mdo,`jssW`U>4<94U1-dvc(un&gna"j`uu]j[0?6>2_;#j|i.sd,i`k(lfSdQ9169V4*aun'xm#`kb/emvpZoX>9;<7X> gsd-vc)jmd%ocxzPi^4252=R8&myj#|i/lgn+air|VcT:??8;T2,cw`)zo%fi`!kotv\mZ049>1^<"i}f/pe+hcj'me~xRgP6534?P6(o{l%~k!bel-gkprXaV<>=:5Z0.eqb+ta'dof#iazt^k\23703\:$kh!rg-nah)cg|~TeR88169V4*aun'xm#`kb/emvpZoX>1;<7X> gsd-vc)jmd%ocxzPi^4:53=R8&myj#|i/lgn+air|VcT;<94U1-dvc(un&gna"j`uu]j[266?2_;#j|i.sd,i`k(lfSdQ81058Q5)`zo$yj"cjm.flqqYnW>8:;6[?/fpe*w`(elg$hb{{_h]4741<]9%l~k }f.ofi*bh}}UbS::>7:W3+bta&{l$ahc dnww[lY0=8=0Y=!hrg,qb*kbe&ndyyQf_6423>S7'nxm"h mdo,`jssW`U<;<94U1-dvc(un&gna"j`uu]j[2>6?2_;#j|i.sd,i`k(lfSdQ89048Q5)`zo$yj"cjm.flqqYnW1;<7X> gsd-vc)jmd%ocxzPi^:352=R8&myj#|i/lgn+air|VcT4<?8;T2,cw`)zo%fi`!kotv\mZ>59>1^<"i}f/pe+hcj'me~xRgP8234?P6(o{l%~k!bel-gkprXaV2?=:5Z0.eqb+ta'dof#iazt^k\<0703\:$kh!rg-nah)cg|~TeR69169V4*aun'xm#`kb/emvpZoX0>;<7X> gsd-vc)jmd%ocxzPi^:;52=R8&myj#|i/lgn+air|VcT44?9;T2,cw`)zo%fi`!kotv\mZ?6?2_;#j|i.sd,i`k(lfSdQ60058Q5)`zo$yj"cjm.flqqYnW0;:;6[?/fpe*w`(elg$hb{{_h]:641<]9%l~k }f.ofi*bh}}UbS4=>7:W3+bta&{l$ahc dnww[lY><8=0Y=!hrg,qb*kbe&ndyyQf_8723>S7'nxm"h mdo,`jssW`U2:<94U1-dvc(un&gna"j`uu]j[<16?2_;#j|i.sd,i`k(lfSdQ68058Q5)`zo$yj"cjm.flqqYnW03:56[?/fpe*w`(elg$hb{{_lgn8586j2_;#j|i.sd,i`k(lfS`kb<023:4d<]9%l~k }f.ofi*bh}}Ufi`2>00<2f>S7'nxm"h mdo,`jssWdof0<>=>0`8Q5)`zo$yj"cjm.flqqYjmd6:<>0>b:W3+bta&{l$ahc dnww[hcj48:?2<l4U1-dvc(un&gna"j`uu]nah:68<4:n6[?/fpe*w`(elg$hb{{_lgn846168h0Y=!hrg,qb*kbe&ndyyQbel>24286j2_;#j|i.sd,i`k(lfS`kb<02;:4d<]9%l~k }f.ofi*bh}}Ufi`2>08<2e>S7'nxm"h mdo,`jssWdof0<>11c9V4*aun'xm#`kb/emvpZkbe5;:<3?m;T2,cw`)zo%fi`!kotv\i`k;98;5=o5Z0.eqb+ta'dof#iazt^ofi976:7;i7X> gsd-vc)jmd%ocxzPmdo?54599k1^<"i}f/pe+hcj'me~xRcjm=320;7e3\:$kh!rg-nah)cg|~Tahc3107=5g=R8&myj#|i/lgn+air|Vgna1?>6?3a?P6(o{l%~k!bel-gkprXelg7=<911c9V4*aun'xm#`kb/emvpZkbe5;:43?m;T2,cw`)zo%fi`!kotv\i`k;9835=l5Z0.eqb+ta'dof#iazt^ofi97668h0Y=!hrg,qb*kbe&ndyyQbel>26586j2_;#j|i.sd,i`k(lfS`kb<002:4d<]9%l~k }f.ofi*bh}}Ufi`2>23<2f>S7'nxm"h mdo,`jssWdof0<<<>0`8Q5)`zo$yj"cjm.flqqYjmd6:>90>b:W3+bta&{l$ahc dnww[hcj488>2<l4U1-dvc(un&gna"j`uu]nah:6:?4:n6[?/fpe*w`(elg$hb{{_lgn844068h0Y=!hrg,qb*kbe&ndyyQbel>26=86j2_;#j|i.sd,i`k(lfS`kb<00::4g<]9%l~k }f.ofi*bh}}Ufi`2>2?3b?P6(o{l%~k!bel-gkprXelg7=>0>a:W3+bta&{l$ahc dnww[hcj48>5=l5Z0.eqb+ta'dof#iazt^ofi97268k0Y=!hrg,qb*kbe&ndyyQbel>22;7f3\:$kh!rg-nah)cg|~Tahc316<2e>S7'nxm"h mdo,`jssWdof0<611`9V4*aun'xm#`kb/emvpZkbe5;22<74U1-dvc(un&gna"j`uu]nah:668k0Y=!hrg,qb*kbe&ndyyQbel>14;7f3\:$kh!rg-nah)cg|~Tahc320<2e>S7'nxm"h mdo,`jssWdof0?<11`9V4*aun'xm#`kb/emvpZkbe5882<o4U1-dvc(un&gna"j`uu]nah:5<7;j7X> gsd-vc)jmd%ocxzPmdo?6086i2_;#j|i.sd,i`k(lfS`kb<34=5d=R8&myj#|i/lgn+air|Vgna1<8>0c8Q5)`zo$yj"cjm.flqqYjmd6943?n;T2,cw`)zo%fi`!kotv\i`k;:04:56[?/fpe*w`(elg$hb{{_lgn8786i2_;#j|i.sd,i`k(lfS`kb<22=5d=R8&myj#|i/lgn+air|Vgna1=>>0c8Q5)`zo$yj"cjm.flqqYjmd68>3?n;T2,cw`)zo%fi`!kotv\i`k;;:4:m6[?/fpe*w`(elg$hb{{_lgn86299h1^<"i}f/pe+hcj'me~xRcjm=16:4g<]9%l~k }f.ofi*bh}}Ufi`2<6?3b?P6(o{l%~k!bel-gkprXelg7?:0>a:W3+bta&{l$ahc dnww[hcj4:25=l5Z0.eqb+ta'dof#iazt^ofi95>6830Y=!hrg,qb*kbe&ndyyQbel>0:4g<]9%l~k }f.ofi*bh}}Ufi`2;0?3b?P6(o{l%~k!bel-gkprXelg78<0>a:W3+bta&{l$ahc dnww[hcj4=85=l5Z0.eqb+ta'dof#iazt^ofi92468k0Y=!hrg,qb*kbe&ndyyQbel>70;7f3\:$kh!rg-nah)cg|~Tahc344<2e>S7'nxm"h mdo,`jssWdof09811`9V4*aun'xm#`kb/emvpZkbe5><2<o4U1-dvc(un&gna"j`uu]nah:307;j7X> gsd-vc)jmd%ocxzPmdo?0<8612_;#j|i.sd,i`k(lfS`kb<5<2e>S7'nxm"h mdo,`jssWdof08>11`9V4*aun'xm#`kb/emvpZkbe5?:2<o4U1-dvc(un&gna"j`uu]nah:2:7;j7X> gsd-vc)jmd%ocxzPmdo?1686i2_;#j|i.sd,i`k(lfS`kb<46=5d=R8&myj#|i/lgn+air|Vgna1;:>0c8Q5)`zo$yj"cjm.flqqYjmd6>:3?n;T2,cw`)zo%fi`!kotv\i`k;=>4:m6[?/fpe*w`(elg$hb{{_lgn80>99h1^<"i}f/pe+hcj'me~xRcjm=7::4?<]9%l~k }f.ofi*bh}}Ufi`2:>0c8Q5)`zo$yj"cjm.flqqYjmd6=<3?n;T2,cw`)zo%fi`!kotv\i`k;>84:m6[?/fpe*w`(elg$hb{{_lgn83499h1^<"i}f/pe+hcj'me~xRcjm=40:4g<]9%l~k }f.ofi*bh}}Ufi`294?3b?P6(o{l%~k!bel-gkprXelg7:80>a:W3+bta&{l$ahc dnww[hcj4?<5=l5Z0.eqb+ta'dof#iazt^ofi90068k0Y=!hrg,qb*kbe&ndyyQbel>5<;7f3\:$kh!rg-nah)cg|~Tahc368<2=>S7'nxm"h mdo,`jssWdof0;0>a:W3+bta&{l$ahc dnww[hcj4>:5=l5Z0.eqb+ta'dof#iazt^ofi91668k0Y=!hrg,qb*kbe&ndyyQbel>46;7f3\:$kh!rg-nah)cg|~Tahc372<2e>S7'nxm"h mdo,`jssWdof0::11`9V4*aun'xm#`kb/emvpZkbe5=>2<o4U1-dvc(un&gna"j`uu]nah:0>7;j7X> gsd-vc)jmd%ocxzPmdo?3286i2_;#j|i.sd,i`k(lfS`kb<6:=5d=R8&myj#|i/lgn+air|Vgna196>0;8Q5)`zo$yj"cjm.flqqYjmd6<2<o4U1-dvc(un&gna"j`uu]nah:?87;j7X> gsd-vc)jmd%ocxzPmdo?<486i2_;#j|i.sd,i`k(lfS`kb<90=5d=R8&myj#|i/lgn+air|Vgna16<>0c8Q5)`zo$yj"cjm.flqqYjmd6383?n;T2,cw`)zo%fi`!kotv\i`k;0<4:m6[?/fpe*w`(elg$hb{{_lgn8=099h1^<"i}f/pe+hcj'me~xRcjm=:4:4g<]9%l~k }f.ofi*bh}}Ufi`278?3b?P6(o{l%~k!bel-gkprXelg7440>9:W3+bta&{l$ahc dnww[hcj414:m6[?/fpe*w`(elg$hb{{_lgn8<699h1^<"i}f/pe+hcj'me~xRcjm=;2:4g<]9%l~k }f.ofi*bh}}Ufi`262?3b?P6(o{l%~k!bel-gkprXelg75>0>a:W3+bta&{l$ahc dnww[hcj40>5=l5Z0.eqb+ta'dof#iazt^ofi9?268k0Y=!hrg,qb*kbe&ndyyQbel>:2;7f3\:$kh!rg-nah)cg|~Tahc396<2e>S7'nxm"h mdo,`jssWdof04611`9V4*aun'xm#`kb/emvpZkbe5322<74U1-dvc(un&gna"j`uu]nah:>6>l0Y=!hrg,qb*kbe&mia#immf,dfhaf&gmnon mmf-ahnYjmdUlick}aumq+sgkam$hy| r`ookjv\8T$ym` }/w7\jjoia}$ym`!\DQ,TMACXX[CF?; aoda`awt)[MZ<j6[?/fpe*w`(elg$koc!gcod*bdjoh$ekhml.cod+gjlWdofSjkaescwkw)qieco"n}{r.pbiiihxR;V"ob.s-u1Zhhagc"ob/RFS*ROCMVZYE@=9.omfgfcuz'YO\<l4U1-dvc(un&gna"zbp^pbiZtcWld:o6[?/fpe*w`(elg$x`~Pr`o\vaYbf8;<7X> gsd-vc)uidUyijazt^gm5a=R8&myj#|i/sqwfim(ZZ^TJXBC_FGM5a=R8&myj#|i/sqwfim(zmUyyQnssgd65=R8&myj#|i/sqwfim(zmUyyQnssgd[a7582_;#j|i.sd,vvredb%yhR||t^cpv`aXl;;h7X> gsd-vc)u{}hgg"|k_sqw[fijj8n0Y=!hrg,qb*tt|kf`#jPrrv\gjke98o0Y=!hrg,qb*tt|kf`#jPrrv\v`a;87;n7X> gsd-vc)u{}hgg"|k_sqw[wc`4;4:h6[?/fpe*w`(zz~i`f!}d^pppZtboV::h6[?/fpe*w`(zz~i`f!}d^pppZtboV8:;6[?/fpe*w`(zz~i`f!}su]g541<]9%l~k }f.pppgjl'{ySi<>7:W3+bta&{l$~~zmlj-qwqYc;8n0Y=!hrg,qb*tt|kf`#z|Prrv\evtbo;:0Y=!hrg,qb*tt|kf`#z|Prrv\evtboVn:>=5Z0.eqb+ta'{ynae ws]qwqYf{{olSi<>c:W3+bta&{l$~~zmlj-tvZtt|Vidao?k;T2,cw`)zo%yylck.uq[wusWjefn<?j;T2,cw`)zo%yylck.uq[wusW{ol0<0>d:W3+bta&{l$~~zmlj-tvZtt|VxnkR?n;TQFVZGKAHYh7X]JR^TJWLDKM:1]ON74VHGT[Q_WM?1\IA2?>79TAI:66?1\IA2=>79TAI:46?1\IA2;>79TAI:26?1\IA29>99TAI:0294=7ZKC<6<5?RCR494=7ZKZ<0<5?RCR4;4=7ZKZ<2<5?RCR4=4=7ZKZ<4<5?RCR4?437ZKZ<683:3=PM\6<2l5XR@FGVI:76k1\^LJKRM>24;d<_[KOH_B310<a?RTFLMXG0<<1b:UQEABUD5;82o5XR@FGVI:6<7n0[_OKDSN?50<76k1\^LJKRM>21;g<_[KOH_B31?c8SWGCL[F7>3o4WSCG@WJ;;7k0[_OKDSN?0;g<_[KOH_B35?c8SWGCL[F7:3o4WSCG@WJ;?7k0[_OKDSN?<;g<_[KOH_B39?c8SWGCL[_7<3l4WSCG@WS;994i7Z\NDEPV8479j2]YMIJ]U=31:g=PZHNO^X2>3?f8SWGCL[_7=94?>c9TVDBCZ\6:83o4WSCG@WS;97k0[_OKDSW?6;g<_[KOH_[33?c8SWGCL[_783o4WSCG@WS;=7k0[_OKDSW?2;g<_[KOH_[37?c8SWGCL[_743o4WSCG@WS;17<0[_MCKM48SWEKC\?0[_KAL49TV@HR9m1SEAGAX,ZGF%6)9)Y_YO.?.0"BWFON>2RXXAGM7:ZPPZAIL>1S_YQYCB`8\ZEHZLUBBKA9;Yfa[Lba3QncS]|fmWgqwlii991Sh`QBakmqR`ttafd:<6Vkm^OjjjtQm{ybccm4amolwqYbey~rn6ocmnqw[cskd?1imnezpe9aefmrxVgj~fk}3:aooa=ci}kTob{at)2*`>bf|hUhcx`{(0+g?agsiVidycz'2(f8`drfWje~by&<)e9geqgXkfex%:&d:fbpdYdg|d$8'i;ecweZeh}g~797>17:famqcuz?1oec&?)79gmk.6!>1oec&>0(:8`lh/99:"46jfn)335,><l`d#==<&8:fjj-77; 20hd`'116*<>bnf!;;9$64dhl+550.02nbb%??7(:8`lh/992"46jfn)33=,1<l`d#=<'7;ekm,477!11oec&>10+;?aoi 8;9%55kio*256/?3mce$<?;)99gmk.69<#37iga(035-==cag":=:'7;ekm,47?!11oec&>18+4?aoi 88"46jfn)314,><l`d#=??&8:fjj-75: 20hd`'131*<>bnf!;98$64dhl+573.02nbb%?=6(:8`lh/9;="46jfn)31<,><l`d#=?7&7:fjj-74!>1oec&>4(58`lh/9<#<7iga(04*3>bnf!;<%:5kio*2<,1<l`d#=4'9;ekm,7/03mce$?>&7:fjj-46!>1oec&=2(58`lh/::#<7iga(36*3>bnf!8>%:5kio*12,1<l`d#>:'8;ekm,7>.?2nbb%<6)79gmk.4!>1oec&<0(58`lh/;8#<7iga(20*3>bnf!98%:5kio*00,1<l`d#?8'8;ekm,60.?2nbb%=8)69gmk.40 =0hd`'38+5?aoi =#<7iga(52*3>bnf!>:%:5kio*76,1<l`d#8>'8;ekm,12.?2nbb%::)69gmk.3> =0hd`'46+4?aoi =2";6jfn)6:-3=cag">%:5kio*64,1<l`d#9<'8;ekm,04.?2nbb%;<)69gmk.2< =0hd`'54+4?aoi <<";6jfn)74-2=cag">4$94dhl+1</13mce$;'8;ekm,36.?2nbb%8>)69gmk.1: =0hd`'62+4?aoi ?>";6jfn)46-2=cag"=:$94dhl+22/03mce$;6&7:fjj-0>!?1oec&8)69gmk.08 =0hd`'70+4?aoi >8";6jfn)50-2=cag"<8$94dhl+30/03mce$:8&7:fjj-10!>1oec&88(58`lh/?0#=7iga(9+4?aoi 1:";6jfn):2-2=cag"3>$94dhl+<6/03mce$5:&7:fjj->2!>1oec&76(58`lh/0>#<7iga(9:*3>bnf!22%;5kio*:-2=cag"2<$94dhl+=4/03mce$4<&7:fjj-?4!>1oec&64(58`lh/1<#<7iga(84*3>bnf!3<%:5kio*:<,1<l`d#54'9;ekm858?3mce0<>?>99gmk:688437iga<021:==cag6:<>07;ekm8463611oec2>04<;?aoi48:=255kio>2428?3mce0<>7>99gmk:6804<7iga<02=<>bnf5;:<364dhl?547902nbb1?>2?:8`lh;989546jfn=320;><l`d7=<;18:fjj976>720hd`3105=<>bnf5;:4364dhl?54?9?2nbb1?>>99gmk:6:9437iga<002:==cag6:>?07;ekm8444611oec2>25<;?aoi488>255kio>2638?3mce0<<8>99gmk:6:14j7iga<00:>58?3mce0<<6>69gmk:6:7=0hd`312<4?aoi48>5;6jfn=36:2=cag6::394dhl?52803mce0<617:fjj97>6?1oec2>>69gmk:587=0hd`320<4?aoi4;85;6jfn=00:2=cag698394dhl?60803mce0?817:fjj9406>1oec2=8?58`lh;:04=7iga<3<4?aoi4::5;6jfn=12:2=cag68>394dhl?76803mce0>:17:fjj9526>1oec2<6?58`lh;;>4<7iga<2:=3>bnf5922;5kio>0:2=cag6?<394dhl?04803mce09<17:fjj9246>1oec2;4?58`lh;<<4<7iga<54=3>bnf5><2:5kio>7<;1<l`d78409;ekm81803mce08>17:fjj9366>1oec2:2?58`lh;=:4<7iga<46=3>bnf5?>2:5kio>62;1<l`d79:08;ekm80>9?2nbb1;6>79gmk:26>1oec290?58`lh;>84<7iga<70=3>bnf5<82:5kio>50;1<l`d7:808;ekm8309?2nbb188>69gmk:107=0hd`368<5?aoi4?4<7iga<62=3>bnf5=:2:5kio>46;1<l`d7;>08;ekm8229?2nbb19:>69gmk:0>7=0hd`376<4?aoi4>25;6jfn=5::3=cag6<2:5kio>;4;1<l`d74<08;ekm8=49?2nbb16<>69gmk:?<7=0hd`384<4?aoi41<5;6jfn=:4:2=cag634394dhl?<<813mce0508;ekm8<69?2nbb17>>69gmk:>:7=0hd`392<4?aoi40>5;6jfn=;6:2=cag62:394dhl?=2803mce04617:fjj9?>6?1oec26>69gkpr/8 =0hb{{(0+;?air|!;;%45kotv+556.12ndyy&>00+:?air|!;;>$74dnww,464!01ocxz'116*=>bh}}":<8'6;emvp-77> 30hb{{(024-<=cg|~#==6&9:flqq.680#37iazt)32-<=cg|~#=<>&9:flqq.698#27iazt)326,?<lf$<?<)89gkpr/98>"56j`uu*250/>3me~x%?>6(;8`jss 8;<%45kotv+54>.12ndyy&>18+;?air|!;9%45kotv+576.12ndyy&>20+:?air|!;9>$74dnww,444!01ocxz'136*=>bh}}":>8'6;emvp-75> 30hb{{(004-<=cg|~#=?6&9:flqq.6:0#37iazt)30-==cg|~#=9'7;emvp-72!11ocxz'17+;?air|!;<%55kotv+5=/?3me~x%?6)69gkpr/: 20hb{{(32*<>bh}}"9=$64dnww,74.02ndyy&=3(:8`jss ;>"46j`uu*11,><lf$?8&8:flqq.5? 20hb{{(3:*<>bh}}"95$94dnww,6/?3me~x%=?)99gkpr/;8#37iazt)11-==cg|~#?>'7;emvp-53!11ocxz'34+;?air|!9=%55kotv+72/?3me~x%=7)99gkpr/;0#<7iazt)6*<>bh}}"?<$64dnww,17.02ndyy&;2(:8`jss =9"46j`uu*70,><lf$9;&8:flqq.3> 20hb{{(55*<>bh}}"?4$64dnww,1?.?2ndyy&:)99gkpr/=9#37iazt)72-==cg|~#9?'7;emvp-34!11ocxz'55+;?air|!?>%55kotv+13/?3me~x%;8)99gkpr/=1#37iazt)7:-2=cg|~#:$64dnww,36.02ndyy&91(:8`jss ?8"46j`uu*57,><lf$;:&8:flqq.1= 20hb{{(74*<>bh}}"=;$64dnww,3>.02ndyy&99(58`jss >#37iazt)53-==cg|~#;<'7;emvp-15!11ocxz'72+;?air|!=?%55kotv+30/?3me~x%99)99gkpr/?>#37iazt)5;-==cg|~#;4'8;emvp->.02ndyy&70(:8`jss 1;"46j`uu*;6,><lf$5=&8:flqq.?< 20hb{{(97*<>bh}}"3:$64dnww,=1.02ndyy&78(:8`jss 13";6j`uu*:-==cg|~#5='7;emvp-?6!11ocxz'93+;?air|!38%55kotv+=1/?3me~x%7:)99gkpr/1?#37iazt);4-==cg|~#55'7;emvp-?>!>1ocxz30?;8`jss48:;245kotv?557912ndyy2>03<:?air|5;;?374dnww8463601ocxz3117==>bh}}6:<;06;emvp977?730hb{{<02;:<=cg|~7==718:flqq:68730hb{{<033:<=cg|~7=<?19:flqq:69;427iazt=327;?<lf0<?;>89gkpr;98?556j`uu>2538>3me~x1?>7?;8`jss48;3245kotv?54?902ndyy2>1?;8`jss488;245kotv?577912ndyy2>23<:?air|5;9?374dnww8443601ocxz3137==>bh}}6:>;06;emvp975?730hb{{<00;:g=cg|~7=?750?;8`jss4882255kotv?578?3me~x1?<>99gkpr;9=437iazt=36:==cg|~7=;07;emvp970611ocxz319<;?air|5;22:5kotv?5;><lf0?>18:flqq:59720hb{{<30=<>bh}}69?364dnww872902ndyy2=5?:8`jss4;<546j`uu>13;><lf0?618:flqq:517=0hb{{<3<;?air|59;255kotv?748?3me~x1==>99gkpr;;:437iazt=17:==cg|~7?807;emvp951611ocxz336<;?air|593255kotv?7<803me~x1=18:flqq:38720hb{{<53=<>bh}}6?>364dnww815902ndyy2;4?:8`jss4=?546j`uu>72;><lf09918:flqq:30720hb{{<5;=3>bh}}6?255kotv?158?3me~x1;>>99gkpr;=;437iazt=70:==cg|~79907;emvp932611ocxz357<;?air|5?<255kotv?1=8?3me~x1;6>69gkpr;=720hb{{<72=<>bh}}6==364dnww834902ndyy293?:8`jss4?>546j`uu>51;><lf0;818:flqq:1?720hb{{<7:=<>bh}}6=5394dnww838?3me~x19?>99gkpr;?8437iazt=51:==cg|~7;>07;emvp913611ocxz374<;?air|5==255kotv?328?3me~x197>99gkpr;?04<7iazt=5=<>bh}}63<364dnww8=7902ndyy272?:8`jss419546j`uu>;0;><lf05;18:flqq:?>720hb{{<95=<>bh}}634364dnww8=?9?2ndyy27>99gkpr;19437iazt=;2:==cg|~75?07;emvp9?4611ocxz395<;?air|53>255kotv?=38?3me~x178>99gkpr;11437iazt=;::2=cg|~75364eeke6kac=2of|yw=f:djbjY`mgoymya}_w4\6)&_aecet-M@RD"Dakcui}ey,<<!359eqijc3`dainzkbhvfvwb<ag`noy}miugqv2=nf}Uh`f64nfaaqljc02e}ihcov:8tf~Xn`ld>;5cy]emci+n`ldSjkaescwkwYq>V8'BB@J,OMMA6b33yisSkgio-djbjY`mgoymya}_w4\6)}dWakxSd`{_bnh95*dWakxS~||t<2/gZtcWoxn}0?#c^gmegjbW{yS~wac<3/gZnf{VxoSio{a^alqkr:8%iThd`Pwhfwl8748%iTdl}Pws]geqgXkfex0>#c^dvhiYadhmxS}{_wco94*dW`g{`hcjnucwmjhX|pzn1="l_tqf[`kemmnnhR|jg<2/gZquWoxn}0?#c^wpaZbh}}Uyy3>,b]vjacunee|Saax=1.`[mgtWf|n~kb`w<2/gZvumeejhRbntdl`}86+kVndyyQxievk9457$jUfjaa_wco94*dW{nThh~{h<11(fYbz{eySd`eebvjkkYsqyo6<!mPh`q\qkbbzofd{0>#c^jbwZgkefySk{cl<2/gZnf{Vxxx0?#c^fbpdYdg|dSzgkti?5(fYoizU|~Rolk<2/gZstmVoho0>#c^alihiiWjfdof3>,b]tvZgdcVfd{0>#c^pg[uhszV}bhyf25-a\qvcXn~lSio{a^alqkr:9%iTdl}PamolwqYbey~r1="l_sf\`drfWje~byQxievk93*dWf|n~kb`w^nls86+kV}yS}`{r^uj`qn:=%iT|ah_dosp|Ysqyo6<!mPws]geqgXkfexRyfduj>2)eXx{ogcljPrdep94*dWme~xR||t^tbh86+kVbjRjnt`]`kphs59&hS}|`g^dvhiYs`{oxdR`jg`vf[sgk5::'oRy}_egspm;4:%iT|ah_dosp|Ys`{oxdR`jg`vf[sgk5<&hS}|`g^gntqX|axneQnsrgqpZpfd4>'oRfns^tbhlb:8%iT|ah_gwohZrozlycSl}|esv\rdj:;8&hc`~`ndlw[kgjm4zhtRhffn.`[sgkamUgcz3?,b]svlkXn`ldSywe<726}15$jU{~biPftno[qwm4:'oRcjmnpz[qwm4;'q?<4pbz\bl`hWocmcRijndpbpjtX~?U9Su}{_0c8twi`Wlg{xt?;;qplcZcjx}sTxe|jsi*3-42<x{elShctx]wlwct`!;"=95rne\ahvsqV~c~h}g(3+20>vugnUna}zv_ujqavn/; ;?7}|`g^gntqX|axne&;)048twi`Wlg{xtQ{hsgpl92=87;i7}|`g^gntqX|axneQnsrgqp-6.9k1{~biPelrw}ZrozlycSl}|esv+5,7e3yxdkRkbpu{\pmtb{aUj~k}t)0*5g=wzfmTi`~{y^vkv`uoWhyxiz'3(3a?uthoVof|ywPtipfwmYf{zoyx%:&1e9svjaXmdzuRzgrdqk[dutm{~787>11c9svjaXmdzuRzgrdqk[kc`i}o#<$?m;qplcZcjx}sTxe|jsi]mabgsm!;"=o5rne\ahvsqV~c~h}g_ogdeqc/: ;i7}|`g^gntqX|axneQaefcwa-5.9k1{~biPelrw}ZrozlycSckhaug+0,7c3yxdkRkbpu{\pmtb{aUeijo{e=694;?<x{elSk{cl018twi`Wog`Rzgrdqk,5/6;2zycjQiumn\pmtb{a":%<=4psmd[cskdV~c~h}g(3+27>vugnUmyabPtipfwm.4!890|ah_gwohZrozlyc$9'>5:rqkbYa}efTxe|jsi>7>586i2zycjQiumn\pmtb{aUj~k}t)2*5d=wzfmTjxbc_ujqavnXizyn~y&>)0c8twi`Wog`Rzgrdqk[dutm{~#>$?n;qplcZ`rdeUdk|h^cpw`ts :#:m6~}of]eqijX|axneQnsrgqp-2.9j1{~biPftno[qnumzbTm~}jru>7>586i2zycjQiumn\pmtb{aUeijo{e)2*5d=wzfmTjxbc_ujqavnXflmjxh&>)0c8twi`Wog`Rzgrdqk[kc`i}o#>$?n;qplcZ`rdeUdk|h^lfcdrb :#:m6~}of]eqijX|axneQaefcwa-2.9j1{~biPftno[qnumzbTbhintd>7>5813{nToae>0:pg[agsiVidycz'0(33?wbXlh~jSnaznu*2-46<zmUomyoPcnwmp-4.991yhRjnt`]`kphs :#:<6|k_ecweZeh}g~#8$??;sf\`drfWje~by&:)028vaYci}kTob{at=2=57=ulVnjxlQlotlw80<76<1yhRka6:pg[wus;2xxx:5|bhvfvw2<{{y=95{mq-\gb)wkqUmeka!nfm7?qtrm01~bik}fmmt1>pfd`n=7z|Pabi5?rtXkea:<6y}_ecweZeh}g~#<$??;vp\`drfWje~by&>)028swYci}kTob{at)0*55=pzVnjxlQlotlw,6/682}ySio{a^alqkr/< ;;7z|Pd`vb[firf}">%<<4ws]geqgXkfex1;50?78swYbf?1|~R||t|BCtage3IJs;:m5F;695~U413=8n765120gf`d=:kl99v`:2382?k35;3<0(8<?:43a?xU4?3=8n765120gf`d=:kl996]>828407<72899hokm:3`e63=T;>0<8?4?:011`gce2;hm>55k75694?7=9rY8579<b;:9564cjlh1>oh=5:tW6a2=83;1=7?k1zQ0=?14j321=><kbd`96g`5=2.?i>4>859U177=:r:4o4>;t3;g?6<u-82i7?6;c570?6=99k1?7??azJ7a4=];809wl46:|&1a1<0<=1/9<h572f8m2102900e:66:188k25b2900c:=l:188m04?2900e:96:188k33?290/>l>56e:8j7?a2910c;;8:18'6d6=>m20b?7i:098k331290/>l>56e:8j7?a2;10c;;::18'6d6=>m20b?7i:298k333290/>l>56e:8j7?a2=10c;;<:18'6d6=>m20b?7i:498k335290/>l>56e:8j7?a2?10c;;>:18'6d6=>m20b?7i:698k337290/>l>56e:8j7?a2110c;:i:18'6d6=>m20b?7i:898k32c290/>l>56e:8j7?a2h10c;:l:18'6d6=>m20b?7i:c98k32e290/>l>56e:8j7?a2j10c;:n:18'6d6=>m20b?7i:e98k32>290/>l>56e:8j7?a2l10c;:7:18'6d6=>m20b?7i:g98k320290/>l>56e:8j7?a28:07b8;6;29 7g72?n37c<6f;32?>i1<<0;6)<n0;4g<>h51o0:>65`65694?"5i90=h55a28d956=<g?>96=4+2`292a><f;3m6<:4;n475?6=,;k;6;j7;o0:b?7232e=8=4?:%0b4?0c02d95k4>6:9l26`=83.9m=49d99m6<`=9>10c;=j:18'6d6=>m20b?7i:0:8?j04l3:1(?o?:7f;?k4>n3;276a93b83>!4f83<o46`=9g82e>=h>:h1<7*=a185`==i:0l1=o54o71b>5<#:h:1:i64n3;e>4e<3f<857>5$3c3>3b?3g82j7?k;:m5f2<72-8j<78k8:l1=c<6m21d:o850;&1e5<1l11e>4h51g98k3d2290/>l>56e:8j7?a2;:07b8m4;29 7g72?n37c<6f;02?>i1j:0;6)<n0;4g<>h51o09>65`6c094?"5i90=h55a28d966=<g?h:6=4+2`292a><f;3m6?:4;n4a4?6=,;k;6;j7;o0:b?4232e=mk4?:%0b4?0c02d95k4=6:9l2dc=83.9m=49d99m6<`=:>10c;ol:18'6d6=>m20b?7i:3:8?j0fj3:1(?o?:7f;?k4>n38276a9a`83>!4f83<o46`=9g81e>=h>h31<7*=a185`==i:0l1>o54o7c;>5<#:h:1:i64n3;e>7e<3f<j;7>5$3c3>3b?3g82j7<k;:m5e3<72-8j<78k8:l1=c<5m21d:l;50;&1e5<1l11e>4h52g98k3g3290/>l>56e:8j7?a2::07b8n3;29 7g72?n37c<6f;12?>i1i80;6)<n0;4g<>h51o08>65`6`294?"5i90=h55a28d976=<g?3m6=4+2`292a><f;3m6>:4;n4:a?6=,;k;6;j7;o0:b?5232e=5i4?:%0b4?0c02d95k4<6:9l2<e=83.9m=49d99m6<`=;>10c;7m:18'6d6=>m20b?7i:2:8?j0>i3:1(?o?:7f;?k4>n39276a99883>!4f83<o46`=9g80e>=h>021<7*=a185`==i:0l1?o54o7;5>5<#:h:1:i64n3;e>6e<3f<297>5$3c3>3b?3g82j7=k;:m5=1<72-8j<78k8:l1=c<4m21d:4=50;&1e5<1l11e>4h53g98k3?5290/>l>56e:8j7?a2=:07b861;29 7g72?n37c<6f;62?>i1190;6)<n0;4g<>h51o0?>65`69d94?"5i90=h55a28d906=<g?2n6=4+2`292a><f;3m69:4;n4;`?6=,;k;6;j7;o0:b?2232e=4o4?:%0b4?0c02d95k4;6:9l2=g=83.9m=49d99m6<`=<>10c;66:18'6d6=>m20b?7i:5:8?j0?03:1(?o?:7f;?k4>n3>276a98683>!4f83<o46`=9g87e>=h>1<1<7*=a185`==i:0l18o54o7:6>5<#:h:1:i64n3;e>1e<3f<387>5$3c3>3b?3g82j7:k;:m5<6<72-8j<78k8:l1=c<3m21d:5<50;&1e5<1l11e>4h54g98k3>7290/>l>56e:8j7?a2<:07b88f;29 7g72?n37c<6f;72?>i1?l0;6)<n0;4g<>h51o0>>65`66f94?"5i90=h55a28d916=<g?=h6=4+2`292a><f;3m68:4;n44f?6=,;k;6;j7;o0:b?3232e=;l4?:%0b4?0c02d95k4:6:9l22?=83.9m=49d99m6<`==>10c;97:18'6d6=>m20b?7i:4:8?j00?3:1(?o?:7f;?k4>n3?276a97483>!4f83<o46`=9g86e>=h>>>1<7*=a185`==i:0l19o54o750>5<#:h:1:i64n3;e>0e<3f<<>7>5$3c3>3b?3g82j7;k;:m534<72-8j<78k8:l1=c<2m21d::>50;&1e5<1l11e>4h55g98k30a290/>l>56e:8j7?a2?:07b89e;29 7g72?n37c<6f;42?>i1>m0;6)<n0;4g<>h51o0=>65`67a94?"5i90=h55a28d926=<g?<j6=4+2`292a><f;3m6;:4;n45=?6=,;k;6;j7;o0:b?0232e=:54?:%0b4?0c02d95k496:9l231=83.9m=49d99m6<`=>>10c;89:18'6d6=>m20b?7i:7:8?j01=3:1(?o?:7f;?k4>n3<276a96583>!4f83<o46`=9g85e>=h>?91<7*=a185`==i:0l1:o54o741>5<#:h:1:i64n3;e>3e<3f<==7>5$3c3>3b?3g82j78k;:m51c<72-8j<78k8:l1=c<1m21d:8k50;&1e5<1l11e>4h56g98k33c290/>l>56e:8j7?a2>:07b8:c;29 7g72?n37c<6f;52?>i1=k0;6)<n0;4g<>h51o0<>65`64c94?"5i90=h55a28d936=<g??26=4+2`292a><f;3m6::4;n47a?6=,;k;6;j7;o0:b?1232e=8>4?:%0b4?0c02d95k486:9l26>=83.9m=49d99m6<`=?>10c;ok:18'6d6=>m20b?7i:6:8?j0f:3:1(?o?:7f;?k4>n3=276a99683>!4f83<o46`=9g84e>=h>1i1<7*=a185`==i:0l1;o54o7:2>5<#:h:1:i64n3;e>2e<3f<<:7>5$3c3>3b?3g82j79k;:m52g<72-8j<78k8:l1=c<0m21d:;>50;&1e5<1l11e>4h57g98k350290/>l>56e:8j7?a21:07b8<6;29 7g72?n37c<6f;:2?>o2=:0;6)<n0;7g7>h51o0;76g:5383>!4f83?o?6`=9g82?>o2=80;6)<n0;7g7>h51o0976g:5183>!4f83?o?6`=9g80?>o2<o0;6)<n0;7g7>h51o0?76g:4d83>!4f83?o?6`=9g86?>o2<m0;6)<n0;7g7>h51o0=76g:4b83>!4f83?o?6`=9g84?>o2<k0;6)<n0;7g7>h51o0376g:4`83>!4f83?o?6`=9g8:?>o2<10;6)<n0;7g7>h51o0j76g:4683>!4f83?o?6`=9g8a?>o2<?0;6)<n0;7g7>h51o0h76g:4483>!4f83?o?6`=9g8g?>o2<=0;6)<n0;7g7>h51o0n76g:4283>!4f83?o?6`=9g8e?>o2<;0;6)<n0;7g7>h51o0:<65f55394?"5i90>h>5a28d954=<a<>;6=4+2`291a5<f;3m6<<4;h70b?6=,;k;68j<;o0:b?7432c>?i4?:%0b4?3c;2d95k4>4:9j16e=83.9m=4:d29m6<`=9<10e8=m:18'6d6==m90b?7i:048?l34i3:1(?o?:4f0?k4>n3;<76g:3883>!4f83?o?6`=9g82<>=n=:21<7*=a186`6=i:0l1=454i414>5<#:h:19i=4n3;e>4g<3`?8:7>5$3c3>0b43g82j7?m;:k670<72-8j<7;k3:l1=c<6k21b9>:50;&1e5<2l:1e>4h51e98m0d5290/>l>55e18j7?a28o07d;m1;29 7g72<n87c<6f;3e?>o2j90;6)<n0;7g7>h51o09<65f5`d94?"5i90>h>5a28d964=<a<kn6=4+2`291a5<f;3m6?<4;h7b`?6=,;k;68j<;o0:b?4432c>mn4?:%0b4?3c;2d95k4=4:9j1dd=83.9m=4:d29m6<`=:<10e8on:18'6d6==m90b?7i:348?l3f13:1(?o?:4f0?k4>n38<76g:a683>!4f83?o?6`=9g81<>=n=h<1<7*=a186`6=i:0l1>454i4c6>5<#:h:19i=4n3;e>7g<3`?j87>5$3c3>0b43g82j7<m;:k6e6<72-8j<7;k3:l1=c<5k21b9l<50;&1e5<2l:1e>4h52e98m0g6290/>l>55e18j7?a2;o07d;n0;29 7g72<n87c<6f;0e?>o21o0;6)<n0;7g7>h51o08<65f58g94?"5i90>h>5a28d974=<a<3h6=4+2`291a5<f;3m6><4;h7:f?6=,;k;68j<;o0:b?5432c>5l4?:%0b4?3c;2d95k4<4:9j1<?=83.9m=4:d29m6<`=;<10e877:18'6d6==m90b?7i:248?l3>?3:1(?o?:4f0?k4>n39<76g:9783>!4f83?o?6`=9g80<>=n=0?1<7*=a186`6=i:0l1?454i4;7>5<#:h:19i=4n3;e>6g<3`?2?7>5$3c3>0b43g82j7=m;:k6=4<72-8j<7;k3:l1=c<4k21b94>50;&1e5<2l:1e>4h53e98m0>a290/>l>55e18j7?a2:o07d;7e;29 7g72<n87c<6f;1e?>o20m0;6)<n0;7g7>h51o0?<65f59a94?"5i90>h>5a28d904=<a<2i6=4+2`291a5<f;3m69<4;h7;e?6=,;k;68j<;o0:b?2432c>444?:%0b4?3c;2d95k4;4:9j1=>=83.9m=4:d29m6<`=<<10e869:18'6d6==m90b?7i:548?l3?=3:1(?o?:4f0?k4>n3><76g:8583>!4f83?o?6`=9g87<>=n=191<7*=a186`6=i:0l18454i4:1>5<#:h:19i=4n3;e>1g<3`?3=7>5$3c3>0b43g82j7:m;:k6<5<72-8j<7;k3:l1=c<3k21b9:h50;&1e5<2l:1e>4h54e98m01b290/>l>55e18j7?a2=o07d;8d;29 7g72<n87c<6f;6e?>o2?k0;6)<n0;7g7>h51o0><65f56c94?"5i90>h>5a28d914=<a<=26=4+2`291a5<f;3m68<4;h74<?6=,;k;68j<;o0:b?3432c>;:4?:%0b4?3c;2d95k4:4:9j120=83.9m=4:d29m6<`==<10e89::18'6d6==m90b?7i:448?l30<3:1(?o?:4f0?k4>n3?<76g:7283>!4f83?o?6`=9g86<>=n=>81<7*=a186`6=i:0l19454i453>5<#:h:19i=4n3;e>0g<3`?=j7>5$3c3>0b43g82j7;m;:k62`<72-8j<7;k3:l1=c<2k21b9;j50;&1e5<2l:1e>4h55e98m00d290/>l>55e18j7?a2<o07d;9b;29 7g72<n87c<6f;7e?>o2>h0;6)<n0;7g7>h51o0=<65f57;94?"5i90>h>5a28d924=<a<<36=4+2`291a5<f;3m6;<4;h753?6=,;k;68j<;o0:b?0432c>:84?:%0b4?3c;2d95k494:9j132=83.9m=4:d29m6<`=><10e88<:18'6d6==m90b?7i:748?l31:3:1(?o?:4f0?k4>n3<<76g:6083>!4f83?o?6`=9g85<>=n=?:1<7*=a186`6=i:0l1:454i47e>5<#:h:19i=4n3;e>3g<3`?>i7>5$3c3>0b43g82j78m;:k61a<72-8j<7;k3:l1=c<1k21b98m50;&1e5<2l:1e>4h56e98m03f290/>l>55e18j7?a2?o07d;:9;29 7g72<n87c<6f;4e?>o2=10;6)<n0;7g7>h51o0<<65f54594?"5i90>h>5a28d934=<a<?=6=4+2`291a5<f;3m6:<4;h761?6=,;k;68j<;o0:b?1432c>994?:%0b4?3c;2d95k484:9j11?=83.9m=4:d29m6<`=?<10e8=j:18'6d6==m90b?7i:648?l34;3:1(?o?:4f0?k4>n3=<76g:a983>!4f83?o?6`=9g84<>=n=0n1<7*=a186`6=i:0l1;454i4;1>5<#:h:19i=4n3;e>2g<3`?3;7>5$3c3>0b43g82j79m;:k63f<72-8j<7;k3:l1=c<0k21b9:?50;&1e5<2l:1e>4h57e98m001290/>l>55e18j7?a2>o07d;:b;29 7g72<n87c<6f;5e?>o2;;0;6)<n0;7g7>h51o03<65f52394?"5i90>h>5a28d9<4=<j=o96=4>:183M2b92.9i94;e39l6<b=831vnh650;394?6|@=o:7)<j4;g;?jc02900qo=?:1820`<dj3;o=vF;e09Y74<6>r;?6<=51482`?7128=1=54n:882a?7a28n1=k4n:0g951<>2821=:4>6;36>45=u-8n879;7:&01?13=2.8479;6:&1==<51j1b;8=50;&1e5<0==1e>4h50:9j304=83.9m=48559m6<`=921b;8?50;&1e5<0==1e>4h52:9j306=83.9m=48559m6<`=;21b;9h50;&1e5<0==1e>4h54:9j316=831b;:650;9j32d=831d;:h50;9j31b=83.9m=484d9m6<`=821b;9m50;&1e5<0<l1e>4h51:9j31d=83.9m=484d9m6<`=:21b;9o50;&1e5<0<l1e>4h53:9j31?=83.9m=484d9m6<`=<21b;:950;9l315=831b;8750;&1e5<0=h1e>4h50:9j30>=83.9m=485`9m6<`=921b;8950;&1e5<0=h1e>4h52:9j300=83.9m=485`9m6<`=;21b;8;50;&1e5<0=h1e>4h54:9l173=831d9?k50;&1e5<2:o1e>4h50:9l17b=83.9m=4:2g9m6<`=921d9?m50;&1e5<2:o1e>4h52:9l17d=83.9m=4:2g9m6<`=;21d9?o50;&1e5<2:o1e>4h54:9l17?=83.9m=4:2g9m6<`==21d;8l50;9j3=?=831b;;>50;&1e5<0>81e>4h50:9j30`=83.9m=48609m6<`=921b;8k50;&1e5<0>81e>4h52:9j30b=83.9m=48609m6<`=;21b;8m50;&1e5<0>81e>4h54:9l36c=831d;>m50;9j3=7=831b9?950;9j330=83.9m=48669m6<`=821b;;;50;&1e5<0>>1e>4h51:9j332=83.9m=48669m6<`=:21b;;=50;&1e5<0>>1e>4h53:9j334=83.9m=48669m6<`=<21b;;m50;&1e5<0>m1e>4h50:9j33d=83.9m=486e9m6<`=921b;;o50;&1e5<0>m1e>4h52:9j33?=83.9m=486e9m6<`=;21b;;650;&1e5<0>m1e>4h54:9l172=831b;9?50;9j17>=831b;5o50;9l32g=831d;5>50;9j32?=831d:8650;&1e5<1l11e>4h50:9l201=83.9m=49d99m6<`=921d:8850;&1e5<1l11e>4h52:9l203=83.9m=49d99m6<`=;21d:8:50;&1e5<1l11e>4h54:9l205=83.9m=49d99m6<`==21d:8<50;&1e5<1l11e>4h56:9l207=83.9m=49d99m6<`=?21d:8>50;&1e5<1l11e>4h58:9l21`=83.9m=49d99m6<`=121d:9j50;&1e5<1l11e>4h5a:9l21e=83.9m=49d99m6<`=j21d:9l50;&1e5<1l11e>4h5c:9l21g=83.9m=49d99m6<`=l21d:9750;&1e5<1l11e>4h5e:9l21>=83.9m=49d99m6<`=n21d:9950;&1e5<1l11e>4h51198k321290/>l>56e:8j7?a28;07b8;5;29 7g72?n37c<6f;31?>i1<=0;6)<n0;4g<>h51o0:?65`65094?"5i90=h55a28d951=<g?>:6=4+2`292a><f;3m6<;4;n474?6=,;k;6;j7;o0:b?7132e=?k4?:%0b4?0c02d95k4>7:9l26c=83.9m=49d99m6<`=9110c;=k:18'6d6=>m20b?7i:0;8?j04k3:1(?o?:7f;?k4>n3;j76a93c83>!4f83<o46`=9g82f>=h>:k1<7*=a185`==i:0l1=n54o71:>5<#:h:1:i64n3;e>4b<3f<i;7>5$3c3>3b?3g82j7?j;:m5f3<72-8j<78k8:l1=c<6n21d:o;50;&1e5<1l11e>4h52198k3d3290/>l>56e:8j7?a2;;07b8m3;29 7g72?n37c<6f;01?>i1j;0;6)<n0;4g<>h51o09?65`6c394?"5i90=h55a28d961=<g?h;6=4+2`292a><f;3m6?;4;n4bb?6=,;k;6;j7;o0:b?4132e=mh4?:%0b4?0c02d95k4=7:9l2de=83.9m=49d99m6<`=:110c;om:18'6d6=>m20b?7i:3;8?j0fi3:1(?o?:7f;?k4>n38j76a9a883>!4f83<o46`=9g81f>=h>h21<7*=a185`==i:0l1>n54o7c4>5<#:h:1:i64n3;e>7b<3f<j:7>5$3c3>3b?3g82j7<j;:m5e0<72-8j<78k8:l1=c<5n21d:l:50;&1e5<1l11e>4h53198k3g4290/>l>56e:8j7?a2:;07b8n1;29 7g72?n37c<6f;11?>i1i90;6)<n0;4g<>h51o08?65`68d94?"5i90=h55a28d971=<g?3n6=4+2`292a><f;3m6>;4;n4:`?6=,;k;6;j7;o0:b?5132e=5n4?:%0b4?0c02d95k4<7:9l2<d=83.9m=49d99m6<`=;110c;7n:18'6d6=>m20b?7i:2;8?j0>13:1(?o?:7f;?k4>n39j76a99983>!4f83<o46`=9g80f>=h>0<1<7*=a185`==i:0l1?n54o7;6>5<#:h:1:i64n3;e>6b<3f<287>5$3c3>3b?3g82j7=j;:m5=6<72-8j<78k8:l1=c<4n21d:4<50;&1e5<1l11e>4h54198k3?6290/>l>56e:8j7?a2=;07b860;29 7g72?n37c<6f;61?>i10o0;6)<n0;4g<>h51o0??65`69g94?"5i90=h55a28d901=<g?2o6=4+2`292a><f;3m69;4;n4;f?6=,;k;6;j7;o0:b?2132e=4l4?:%0b4?0c02d95k4;7:9l2=?=83.9m=49d99m6<`=<110c;67:18'6d6=>m20b?7i:5;8?j0??3:1(?o?:7f;?k4>n3>j76a98783>!4f83<o46`=9g87f>=h>1?1<7*=a185`==i:0l18n54o7:7>5<#:h:1:i64n3;e>1b<3f<3?7>5$3c3>3b?3g82j7:j;:m5<7<72-8j<78k8:l1=c<3n21d:5>50;&1e5<1l11e>4h55198k31a290/>l>56e:8j7?a2<;07b88e;29 7g72?n37c<6f;71?>i1?m0;6)<n0;4g<>h51o0>?65`66a94?"5i90=h55a28d911=<g?=i6=4+2`292a><f;3m68;4;n44e?6=,;k;6;j7;o0:b?3132e=;44?:%0b4?0c02d95k4:7:9l22>=83.9m=49d99m6<`==110c;98:18'6d6=>m20b?7i:4;8?j00=3:1(?o?:7f;?k4>n3?j76a97583>!4f83<o46`=9g86f>=h>>91<7*=a185`==i:0l19n54o751>5<#:h:1:i64n3;e>0b<3f<<=7>5$3c3>3b?3g82j7;j;:m535<72-8j<78k8:l1=c<2n21d:;h50;&1e5<1l11e>4h56198k30b290/>l>56e:8j7?a2?;07b89d;29 7g72?n37c<6f;41?>i1>j0;6)<n0;4g<>h51o0=?65`67c94?"5i90=h55a28d921=<g?<26=4+2`292a><f;3m6;;4;n45<?6=,;k;6;j7;o0:b?0132e=::4?:%0b4?0c02d95k497:9l230=83.9m=49d99m6<`=>110c;8::18'6d6=>m20b?7i:7;8?j01<3:1(?o?:7f;?k4>n3<j76a96283>!4f83<o46`=9g85f>=h>?81<7*=a185`==i:0l1:n54o742>5<#:h:1:i64n3;e>3b<3f<>j7>5$3c3>3b?3g82j78j;:m51`<72-8j<78k8:l1=c<1n21d:8j50;&1e5<1l11e>4h57198k33d290/>l>56e:8j7?a2>;07b8:b;29 7g72?n37c<6f;51?>i1=h0;6)<n0;4g<>h51o0<?65`64;94?"5i90=h55a28d931=<g?>n6=4+2`292a><f;3m6:;4;n477?6=,;k;6;j7;o0:b?1132e=?54?:%0b4?0c02d95k487:9l2db=83.9m=49d99m6<`=?110c;o=:18'6d6=>m20b?7i:6;8?j0>?3:1(?o?:7f;?k4>n3=j76a98b83>!4f83<o46`=9g84f>=h>1;1<7*=a185`==i:0l1;n54o755>5<#:h:1:i64n3;e>2b<3f<=n7>5$3c3>3b?3g82j79j;:m525<72-8j<78k8:l1=c<0n21d:>950;&1e5<1l11e>4h58198k351290/>l>56e:8j7?a21;07d;:3;29 7g72<n87c<6f;28?l32:3:1(?o?:4f0?k4>n3;07d;:1;29 7g72<n87c<6f;08?l3283:1(?o?:4f0?k4>n3907d;;f;29 7g72<n87c<6f;68?l33m3:1(?o?:4f0?k4>n3?07d;;d;29 7g72<n87c<6f;48?l33k3:1(?o?:4f0?k4>n3=07d;;b;29 7g72<n87c<6f;:8?l33i3:1(?o?:4f0?k4>n3307d;;8;29 7g72<n87c<6f;c8?l33?3:1(?o?:4f0?k4>n3h07d;;6;29 7g72<n87c<6f;a8?l33=3:1(?o?:4f0?k4>n3n07d;;4;29 7g72<n87c<6f;g8?l33;3:1(?o?:4f0?k4>n3l07d;;2;29 7g72<n87c<6f;33?>o2<80;6)<n0;7g7>h51o0:=65f55294?"5i90>h>5a28d957=<a<9m6=4+2`291a5<f;3m6<=4;h70`?6=,;k;68j<;o0:b?7332c>?n4?:%0b4?3c;2d95k4>5:9j16d=83.9m=4:d29m6<`=9?10e8=n:18'6d6==m90b?7i:058?l3413:1(?o?:4f0?k4>n3;376g:3983>!4f83?o?6`=9g82=>=n=:=1<7*=a186`6=i:0l1=l54i415>5<#:h:19i=4n3;e>4d<3`?897>5$3c3>0b43g82j7?l;:k671<72-8j<7;k3:l1=c<6l21b9o<50;&1e5<2l:1e>4h51d98m0d6290/>l>55e18j7?a28l07d;m0;29 7g72<n87c<6f;03?>o2io0;6)<n0;7g7>h51o09=65f5`g94?"5i90>h>5a28d967=<a<ko6=4+2`291a5<f;3m6?=4;h7bg?6=,;k;68j<;o0:b?4332c>mo4?:%0b4?3c;2d95k4=5:9j1dg=83.9m=4:d29m6<`=:?10e8o6:18'6d6==m90b?7i:358?l3f?3:1(?o?:4f0?k4>n38376g:a783>!4f83?o?6`=9g81=>=n=h?1<7*=a186`6=i:0l1>l54i4c7>5<#:h:19i=4n3;e>7d<3`?j?7>5$3c3>0b43g82j7<l;:k6e7<72-8j<7;k3:l1=c<5l21b9l?50;&1e5<2l:1e>4h52d98m0g7290/>l>55e18j7?a2;l07d;6f;29 7g72<n87c<6f;13?>o21l0;6)<n0;7g7>h51o08=65f58a94?"5i90>h>5a28d977=<a<3i6=4+2`291a5<f;3m6>=4;h7:e?6=,;k;68j<;o0:b?5332c>544?:%0b4?3c;2d95k4<5:9j1<>=83.9m=4:d29m6<`=;?10e878:18'6d6==m90b?7i:258?l3>>3:1(?o?:4f0?k4>n39376g:9483>!4f83?o?6`=9g80=>=n=0>1<7*=a186`6=i:0l1?l54i4;0>5<#:h:19i=4n3;e>6d<3`?2=7>5$3c3>0b43g82j7=l;:k6=5<72-8j<7;k3:l1=c<4l21b95h50;&1e5<2l:1e>4h53d98m0>b290/>l>55e18j7?a2:l07d;7d;29 7g72<n87c<6f;63?>o20j0;6)<n0;7g7>h51o0?=65f59`94?"5i90>h>5a28d907=<a<2j6=4+2`291a5<f;3m69=4;h7;=?6=,;k;68j<;o0:b?2332c>454?:%0b4?3c;2d95k4;5:9j1=0=83.9m=4:d29m6<`=<?10e86::18'6d6==m90b?7i:558?l3?<3:1(?o?:4f0?k4>n3>376g:8283>!4f83?o?6`=9g87=>=n=181<7*=a186`6=i:0l18l54i4:2>5<#:h:19i=4n3;e>1d<3`?3<7>5$3c3>0b43g82j7:l;:k63c<72-8j<7;k3:l1=c<3l21b9:k50;&1e5<2l:1e>4h54d98m01c290/>l>55e18j7?a2=l07d;8b;29 7g72<n87c<6f;73?>o2?h0;6)<n0;7g7>h51o0>=65f56;94?"5i90>h>5a28d917=<a<=36=4+2`291a5<f;3m68=4;h743?6=,;k;68j<;o0:b?3332c>;;4?:%0b4?3c;2d95k4:5:9j123=83.9m=4:d29m6<`==?10e89;:18'6d6==m90b?7i:458?l30;3:1(?o?:4f0?k4>n3?376g:7383>!4f83?o?6`=9g86=>=n=>:1<7*=a186`6=i:0l19l54i44e>5<#:h:19i=4n3;e>0d<3`?=i7>5$3c3>0b43g82j7;l;:k62a<72-8j<7;k3:l1=c<2l21b9;m50;&1e5<2l:1e>4h55d98m00e290/>l>55e18j7?a2<l07d;9a;29 7g72<n87c<6f;43?>o2>00;6)<n0;7g7>h51o0==65f57:94?"5i90>h>5a28d927=<a<<<6=4+2`291a5<f;3m6;=4;h751?6=,;k;68j<;o0:b?0332c>:94?:%0b4?3c;2d95k495:9j135=83.9m=4:d29m6<`=>?10e88=:18'6d6==m90b?7i:758?l3193:1(?o?:4f0?k4>n3<376g:6183>!4f83?o?6`=9g85=>=n=<l1<7*=a186`6=i:0l1:l54i47f>5<#:h:19i=4n3;e>3d<3`?>h7>5$3c3>0b43g82j78l;:k61f<72-8j<7;k3:l1=c<1l21b98o50;&1e5<2l:1e>4h56d98m03>290/>l>55e18j7?a2?l07d;:8;29 7g72<n87c<6f;53?>o2=>0;6)<n0;7g7>h51o0<=65f54494?"5i90>h>5a28d937=<a<?>6=4+2`291a5<f;3m6:=4;h760?6=,;k;68j<;o0:b?1332c>844?:%0b4?3c;2d95k485:9j16c=83.9m=4:d29m6<`=??10e8=<:18'6d6==m90b?7i:658?l3f03:1(?o?:4f0?k4>n3=376g:9e83>!4f83?o?6`=9g84=>=n=081<7*=a186`6=i:0l1;l54i4:4>5<#:h:19i=4n3;e>2d<3`?<o7>5$3c3>0b43g82j79l;:k634<72-8j<7;k3:l1=c<0l21b9;850;&1e5<2l:1e>4h57d98m03e290/>l>55e18j7?a2>l07d;<2;29 7g72<n87c<6f;:3?>o2;80;6)<n0;7g7>h51o03=65f53494?=h?>>1<7*=a18433=i:0l1<65`76194?"5i90<;;5a28d95>=h?>81<7*=a18433=i:0l1>65`76394?"5i90<;;5a28d97>=h?>:1<7*=a18433=i:0l1865`77d94?"5i90<;;5a28d91>=h?1=1<7*=a184<==i:0l1<65`79494?"5i90<455a28d95>=h?1?1<7*=a184<==i:0l1>65`79694?"5i90<455a28d97>=h?191<7*=a184<==i:0l1865`79094?"5i90<455a28d91>=h?=21<75f72d94?=h=::1<75f77g94?=h?>o1<75m50f94?7=83:p(?k;:d:8L07d3A>n=6aj7;29?xd29l0;6<4?:1y'6`2=<l80D8?l;I6f5>i51m0;66sm2g594?2=83:p(?k;:d08L07d3A>n=6*>0184?l552900e>o50;9j6d7=831d>l<50;9~f67e290?6=4?{%0f0?c53A?:o6F;e09'556=?2c8>7>5;h1b>5<<a;k:6=44o3c1>5<<uk9:o7>54;294~"5m=0n>6F:1b9K0`7<,8:;6:5f3383>>o4i3:17d<n1;29?j4f:3:17pl;cb83>1<729q/>h:5e19K14e<@=o:7)??0;38m64=831b?;4?::k0e?6=3f8j>7>5;|`7`=<72=0;6=u+2d69a7=O=8i0D9k>;I0f?!7?i3=<h6*>0184?l552900e>o50;9j6d7=831d>l<50;9~f1ea29086=4?{%0f0?ba3A?:o6F;e09K6`=#91k1;:j4$023>4=n;;0;66g<a;29?j4f:3:17pl;dc83>6<729q/>h:5dg9K14e<@=o:7E<j;%3;e?10l2.:<=4>;h11>5<<a:k1<75`2`094?=zj=n<6=4;:183!4b<3o97E;>c:J7a4=O:l1/=5o576f8 4672>1b??4?::k0e?6=3`8j=7>5;n0b6?6=3th?oh4?:283>5}#:l>1hk5G50a8L1c63A8n7)?7a;54`>"6890:7d==:188m6g=831d>l<50;9~f1b>290>6=4?{%0f0?c43A?:o6F;e09K6`=#91k1;:j4i2094?=n;:0;66g<a;29?l4f93:17b<n2;29?xd3lh0;6>4?:1y'6`2=lo1C9<m4H5g2?M4b3-;3m798d:&245<63`996=44i2c94?=h:h81<75rb5ag>5<2290;w)<j4;g0?M36k2B?i<5G2d9'5=g=?>n0e><50;9j76<722c8m7>5;h0b5?6=3f8j>7>5;|`7`3<72=0;6=u+2d69a7=O=8i0D9k>;I0f?!7?i3=<h6*>0184?l552900e>o50;9j6d7=831d>l<50;9~f1b2290?6=4?{%0f0?c53A?:o6F;e09'556=?2c8>7>5;h1b>5<<a;k:6=44o3c1>5<<uk>o87>54;294~"5m=0n>6F:1b9K0`7<,8:;6:5f3383>>o4i3:17d<n1;29?j4f:3:17pl;dg83>1<729q/>h:5e39K14e<@=o:7)??0;58m64=831b?l4?::k1e4<722e9m?4?::a75`=83?1<7>t$3g7>`7<@<;h7E:j1:&245<63`996=44i2194?=n;?0;66g<a;29?j4f:3:17pl<0d83>0<729q/>h:5e09K14e<@=o:7)??0;38m64=831b?>4?::k02?6=3`9j6=44o3c1>5<<uk9;o7>55;294~"5m=0n=6F:1b9K0`7<,8:;6<5f3383>>o4;3:17d=9:188m6g=831d>l<50;9~f66e290>6=4?{%0f0?c43A?:o6F;e09'556=?2c8>7>5;h10>5<<a:k1<75f2`394?=h:h81<75rb22g>5<2290;w)<j4;g2?M36k2B?i<5+11295>o4:3:17d=<:188m60=831b?l4?::m1e7<722wi?<750;794?6|,;o?6h?4H43`?M2b92.:<=4>;h11>5<<a:91<75f3783>>o4i3:17b<n2;29?xd4910;684?:1y'6`2=m81C9<m4H5g2?!7783;0e><50;9j76<722c8:7>5;h1b>5<<g;k96=44}c123?6==3:1<v*=e58f5>N29j1C8h?4$023>4=n;;0;66g<3;29?l512900e>o50;9l6d4=831vn>?9:186>5<7s-8n87k>;I72g>N3m81/==>51:k06?6=3`986=44i2494?=n;h0;66a=a383>>{e;8?1<7;50;2x 7c32l;0D8?l;I6f5>"6890:7d==:188m65=831b?;4?::k0e?6=3f8j>7>5;|`1ac<72=0;6=u+2d69a7=O=8i0D9k>;%334?1<a:81<75f3`83>>o5i80;66a=a383>>{e:o:1<7:50;2x 7c32l80D8?l;I6f5>"6890<7d==:188m6g=831b>l?50;9l6d4=831vn?kn:187>5<7s-8n87k?;I72g>N3m81/==>51:k06?6=3`9=6=44i2c94?=h:h81<75rb3g:>5<3290;w)<j4;g3?M36k2B?i<5+11295>o4:3:17d=9:188m6g=831d>l<50;9~f652290>6=4?{%0f0?c63A?:o6F;e09'556=92c8>7>5;h10>5<<a:<1<75f3`83>>i5i;0;66sm32694?3=83:p(?k;:d38L07d3A>n=6*>0182?l552900e>=50;9j73<722c8m7>5;n0b6?6=3th8??4?:483>5}#:l>1i<5G50a8L1c63-;;<7?4i2094?=n;:0;66g<6;29?l5f2900c?o=:188yg5493:197>50z&1a1<b;2B>=n5G4d38 4672>1b??4?::k07?6=3`9j6=44i3c2>5<<g;k96=44}c107?6==3:1<v*=e58f5>N29j1C8h?4$023>4=n;;0;66g<3;29?l512900e>o50;9l6d4=831vn>=i:186>5<7s-8n87k>;I72g>N3m81/==>51:k06?6=3`986=44i2494?=n;h0;66a=a383>>{e;:o1<7;50;2x 7c32l;0D8?l;I6f5>"6890:7d==:188m65=831b?;4?::k0e?6=3f8j>7>5;|`07a<72<0;6=u+2d69a4=O=8i0D9k>;%334?7<a:81<75f3283>>o4>3:17d=n:188k7g52900qo=<c;291?6=8r.9i94j1:J65f=O<l;0(<>?:09j77<722c8?7>5;h15>5<<a:k1<75`2`094?=zj:9i6=4::183!4b<3o:7E;>c:J7a4=#99:1=6g<2;29?l542900e>850;9j7d<722e9m?4?::a7`3=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3d694?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?h=50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;l81<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7`7=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3d294?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?ih50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;mo1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7ab=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3ea94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?io50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;m31<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7a>=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3e594?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?i850;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;m?1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7a2=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3e194?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?i<50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;m;1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7f`=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3bg94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?nj50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;ji1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7fd=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3bc94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?n750;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;j21<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7f1=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3b494?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi89:50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<=91<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a014=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm45394?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi89>50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<:l1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a06c=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm42f94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8>m50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<:h1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a06?=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm42:94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8>950;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<:<1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a063=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm42694?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8>=50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<:81<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a067=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm42294?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8?k50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<;n1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a07e=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm43`94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8?o50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<;31<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a07>=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm43594?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8?850;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<;?1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a075=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm43094?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8??50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<;:1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a04`=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm40g94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8<j50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<8i1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a04d=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm40c94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8<650;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<8=1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a040=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm40794?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8<:50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<891<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a044=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm40394?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8<>50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<9l1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a05b=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm41a94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8=l50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<9k1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a05?=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm41:94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8=950;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<9<1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a053=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm41694?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8=<50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<9;1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a056=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3gd94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?kk50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;on1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7ce=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3g`94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?ko50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;o31<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7c1=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3g494?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?k;50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;o>1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7c5=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3g094?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?k?50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;o:1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7``=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3dg94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?hm50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;lh1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7`g=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3d;94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?h650;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;l=1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7`0=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3e`94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?i>50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;j?1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a06g=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm43d94?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8?:50;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e<831<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a05c=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm41194?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi?k650;794?6|,;o?6h:4H43`?M2b92.:<=4>;h11>5<<a:91<75f3`83>>o5i:0;66a=a383>>{e;ln1<7;50;2x 7c32l>0D8?l;I6f5>"6890:7d==:188m65=831b?l4?::k1e6<722e9m?4?::a7f2=83?1<7>t$3g7>`2<@<;h7E:j1:&245<63`996=44i2194?=n;h0;66g=a283>>i5i;0;66sm3b194?3=83:p(?k;:d68L07d3A>n=6*>0182?l552900e>=50;9j7d<722c9m>4?::m1e7<722wi8ij50;194?6|,;o?6<6:;I72g>N3m81/==>5f:kfe?6=3`oi6=44o3;a>5<<uk>o=7>53;294~"5m=0:485G50a8L1c63-;;<7h4idc94?=nmk0;66a=9c83>>{e;;21<7=50;2x 7c3282>7E;>c:J7a4=#99:1=l5fe`83>>obj3:17b<6b;29?xd48;0;6>4?:1y'6`2=91?0D8?l;I6f5>"6890:m6gja;29?lce2900c?7m:188yg4bm3:187>50z&1a1<60?1C9<m4H5g2?!7783no7dkn:188m`d=831bin4?::m1=g<722wi??750;694?6|,;o?6<69;I72g>N3m81/==>5219jad<722cnn7>5;hg`>5<<g;3i6=44}c137?6=<3:1<v*=e582<3=O=8i0D9k>;%334?473`oj6=44id`94?=nmj0;66a=9c83>>{e:li1<7;50;2x 7c3282<7E;>c:J7a4=#99:1:6gja;29?lce2900ehm50;9jaa<722e95o4?::a6c4=83?1<7>t$3g7>4>03A?:o6F;e09'556=:01bil4?::kff?6=3`oh6=44idf94?=h:0h1<75rb20b>5<2290;w)<j4;3;3>N29j1C8h?4$023>77<alk1<75fec83>>obk3:17dkk:188k7?e2900qo=?4;291?6=8r.9i94>869K14e<@=o:7)??0;02?lcf2900ehl50;9jaf<722cnh7>5;n0:f?6=3th8>o4?:783>5}#:l>1=564H43`?M2b92.:<=4=2:kfe?6=3`oi6=44ida94?=nmm0;66gje;29?j4>j3:17pl<0483>3<729q/>h:519:8L07d3A>n=6*>01816>obi3:17dkm:188m`e=831bii4?::kfa?6=3f82n7>5;|`1a3<72=0;6=u+2d695=0<@<;h7E:j1:&245<5k2cnm7>5;hga>5<<ali1<75`28`94?=zj:8:6=4<:183!4b<3;396F:1b9K0`7<,8:;6k5fe`83>>obj3:17b<6b;29?xd5m<0;684?:1y'6`2=91=0D8?l;I6f5>"6890:<6gja;29?lce2900ehm50;9jaa<722e95o4?::a6c2=83=1<7>t$3g7>4>>3A?:o6F;e09'556=::1bil4?::kff?6=3`oh6=44idf94?=nml0;66gjf;29?j4>j3:17pl=f283>3<729q/>h:519:8L07d3A>n=6*>0187?lcf2900ehl50;9jaf<722cnh7>5;hgf>5<<g;3i6=44}c0ef?6=?3:1<v*=e582<<=O=8i0D9k>;%334?4e3`oj6=44id`94?=nmj0;66gjd;29?lcb2900ehh50;9l6<d=831vn><?:184>5<7s-8n87?79:J65f=O<l;0(<>?:3`8m`g=831bio4?::kfg?6=3`oo6=44idg94?=nmo0;66a=9c83>>{e;8o1<7950;2x 7c328227E;>c:J7a4=#99:196gja;29?lce2900ehm50;9jaa<722cni7>5;hge>5<<g;3i6=44}c0ee?6=>3:1<v*=e582<==O=8i0D9k>;%334?4f3`oj6=44id`94?=nmj0;66gjd;29?lcb2900c?7m:188yg4a13:1;7>50z&1a1<6001C9<m4H5g2?!77839?7dkn:188m`d=831bin4?::kf`?6=3`on6=44idd94?=h:0h1<75rb3d6>5<4290;w)<j4;3;1>N29j1C8h?4$023>c=nmh0;66gjb;29?j4>j3:17pl=f783>2<729q/>h:519;8L07d3A>n=6*>018f2>obi3:17dkm:188m`e=831bii4?::kfa?6=3`om6=44o3;a>5<<uk9:j7>57;294~"5m=0:445G50a8L1c63-;;<7<i;hgb>5<<alh1<75feb83>>obl3:17dkj:188m``=831d>4l50;9~f1ef290=6=4?{%0f0?7?02B>=n5G4d38 4672l?0eho50;9jag<722cno7>5;hgg>5<<alo1<75`28`94?=zj:8<6=4=:183!4b<3;3>6F:1b9K0`7<al31<75`28`94?=zj:::6=4=:183!4b<3;3>6F:1b9K0`7<al31<75`28`94?=zj=i<6=4>0183>5}#:l>1>l:4H43`?M2b92P8=7jt1c810?b=j3o1o7?=:03963<5=3;h6?95298~ja6=82.om7jj;%fa>ac<,mi1hh5+2bd9``=#9>l1?6*>8180?!`72:1/j<4<;%d1>6=#n:087)h;:29'b0<43-l=6>5+f680?!`?2:1/j44<;%db>6=#nk087)hl:29'ba<43-;;<7<4$3f6>7=#99;1?6*>0380?!77;390(<>;:29'553=;2.:<;4<;%333?5<,8:36>5+11;97>"68h087)??b;18 46d2:1/==j53:&24`<43-;;j7=4$033>6=#98;1?6*>1380?!76;390(<?;:29'543=;2.:=;4<;%323?5<,8;36>5+10;97>"69h087)?>b;18 47d2:1/=<j53:&25`<43-;:j7=4$003>6=#9;;1?6*>2380?!75;390(<<;:29'573=;2.:>;4<;%313?5<,8836>5+13;97>"6:h087)?=b;18 44d2:1/=?j53:&26`<43-;9j7=4$013>6=#9:;1?6*>3380?!74;390(<=;:29'563=;2.:?;4<;%303?5<,8936>5+12;97>"6;h087)?<b;18 45d2:1/=>j53:&27`<43-;8j7=4$063>6=#9=;1?6*>4380?!73;390(<:;:29'513=;2.:8;4<;%373?5<,8>36>5+15;97>"6<h087)?;b;18 42d2:1/=9j53:&20`<43-;?j7=4$073>6=#9<;1?6*>5380?!72;390(<;;:29'503=;2.:9;4<;%363?5<,8?36>5+14;97>"6=h087)?:b;18 43d2:1/=8j53:&21`<43-;>j7=4$043>6=#9?;1?6*>6380?!71;390(<8;:29'533=;2.::;4<;%353?5<,8<36>5+17;97>"6>h087)?9b;18 40d2:1/=;j53:&22`<43-;=j7=4$053>6=#9>;1?6*>7380?!70;390(<9;:29'523=;2.:;;4<;%343?5<,8=36>5+16;97>"6?h087)?8b;18 41d2:1/=:j53:&23`<43-;3=7<6a:&1`4<5l2.9h?4=cd9'b`<43-lm6>5f2b;94?=n:j21<75f50c94?=n=831<75f2e594?=n:m<1<75f2e;94?N5l:10e?j7:18K6a5<3`8h;7>5;h0`2?6=3`?:47>5;h723?6=3`8hn7>5;h0`e?6=3`8hh7>5;h0`g?6=3f8o<7>5;n1a>5<<a>21<7*=a1843>h51o0;76g86;29 7g72>=0b?7i:098m23=83.9m=487:l1=c<532c<87>5$3c3>21<f;3m6>54i6094?"5i90<;6`=9g87?>o093:1(?o?:658j7?a2<10e:>50;&1e5<0?2d95k49;:k5b?6=,;k;6:94n3;e>2=<a?o1<7*=a1843>h51o0376g9d;29 7g72>=0b?7i:898m3e=83.9m=487:l1=c<f32c=n7>5$3c3>21<f;3m6o54i7c94?"5i90<;6`=9g8`?>o113:1(?o?:658j7?a2m10e;950;&1e5<0?2d95k4j;:k52?6=,;k;6:94n3;e>c=<a??1<7*=a1843>h51o0:<65f6583>!4f83=<7c<6f;32?>o1;3:1(?o?:658j7?a28807d8=:18'6d6=?>1e>4h51298m37=83.9m=487:l1=c<6<21b:=4?:%0b4?103g82j7?:;:k6b?6=,;k;6:94n3;e>40<3`?n6=4+2`2932=i:0l1=:54i4a94?"5i90<;6`=9g82<>=n=k0;6)<n0;54?k4>n3;276g:a;29 7g72>=0b?7i:0c8?l3>290/>l>5769m6<`=9k10e8650;&1e5<0?2d95k4>c:9j12<72-8j<798;o0:b?7c32c>:7>5$3c3>21<f;3m6<k4;h76>5<#:h:1;:5a28d95c=<a<>1<7*=a1843>h51o09<65f5283>!4f83=<7c<6f;02?>o293:1(?o?:658j7?a2;807d;?:18'6d6=?>1e>4h52298m1`=83.9m=487:l1=c<5<21b8h4?:%0b4?103g82j7<:;:k7`?6=,;k;6:94n3;e>70<3`>h6=4+2`2932=i:0l1>:54i5`94?"5i90<;6`=9g81<>=n<h0;6)<n0;54?k4>n38276g;9;29 7g72>=0b?7i:3c8?l2?290/>l>5769m6<`=:k10e9850;&1e5<0?2d95k4=c:9j00<72-8j<798;o0:b?4c32c?87>5$3c3>21<f;3m6?k4;h60>5<#:h:1;:5a28d96c=<a=81<7*=a1843>h51o08<65f4083>!4f83=<7c<6f;12?>o383:1(?o?:658j7?a2:807d=i:18'6d6=?>1e>4h53298m6c=83.9m=487:l1=c<4<21b?i4?:%0b4?103g82j7=:;:k4g?6=,;k;6:94n3;e>60<3`=i6=4+2`2932=i:0l1?:54i6c94?"5i90<;6`=9g80<>=n?00;6)<n0;54?k4>n39276g83;29 7g72>=0b?7i:2c8?l0?290/>l>5769m6<`=;k10e8j50;&1e5<0?2d95k4<c:9j17<72-8j<798;o0:b?5c32c?;7>5$3c3>21<f;3m6>k4;h1`>5<#:h:1;:5a28d97c=<a1?1<7*=a18;0>h51o0;76g73;29 7g721>0b?7i:098m=4=83.9m=474:l1=c<532c3=7>5$3c3>=2<f;3m6>54i9294?"5i90386`=9g87?>o0n3:1(?o?:968j7?a2<10e:k50;&1e5<?<2d95k49;:k4`?6=,;k;65:4n3;e>2=<a;kh6=4+2`296dd<f;3m6=54i3cb>5<#:h:1>ll4n3;e>4=<a;k26=4+2`296dd<f;3m6?54i3c;>5<#:h:1>ll4n3;e>6=<a;k<6=4+2`296dd<f;3m6954i3c5>5<#:h:1>ll4n3;e>0=<a;h>6=4+2`296dd<f;3m6;54i3`7>5<#:h:1>ll4n3;e>2=<a;h86=4+2`296dd<f;3m6554i3`1>5<#:h:1>ll4n3;e><=<a;h:6=4+2`296dd<f;3m6l54i3`3>5<#:h:1>ll4n3;e>g=<a;km6=4+2`296dd<f;3m6n54i3cf>5<#:h:1>ll4n3;e>a=<a;ko6=4+2`296dd<f;3m6h54i3c6>5<#:h:1>ll4n3;e>c=<a;hh6=4+2`296gd<f;3m6=54i3`b>5<#:h:1>ol4n3;e>4=<a;h26=4+2`296gd<f;3m6?54i3`;>5<#:h:1>ol4n3;e>6=<a;h<6=4+2`296gd<f;3m6954i3a6>5<#:h:1>ol4n3;e>0=<a;i?6=4+2`296gd<f;3m6;54i3a0>5<#:h:1>ol4n3;e>2=<a;i96=4+2`296gd<f;3m6554i3a2>5<#:h:1>ol4n3;e><=<a;i;6=4+2`296gd<f;3m6l54i3`e>5<#:h:1>ol4n3;e>g=<a;hn6=4+2`296gd<f;3m6n54i3`g>5<#:h:1>ol4n3;e>a=<a;h=6=4+2`296gd<f;3m6h54i5dg>5<#:h:18km4n3;e>5=<a=li6=4+2`290ce<f;3m6<54i5db>5<#:h:18km4n3;e>7=<a=l26=4+2`290ce<f;3m6>54i5d;>5<#:h:18km4n3;e>1=<a=l<6=4+2`290ce<f;3m6854i425>5<#:h:18km4n3;e>3=<a<:>6=4+2`290ce<f;3m6:54i427>5<#:h:18km4n3;e>==<a<:86=4+2`290ce<f;3m6454i421>5<#:h:18km4n3;e>d=<a<::6=4+2`290ce<f;3m6o54i423>5<#:h:18km4n3;e>f=<a=lm6=4+2`290ce<f;3m6i54i5df>5<#:h:18km4n3;e>`=<a=l=6=4+2`290ce<f;3m6k54i42g>5<#:h:19=m4n3;e>5=<a<:i6=4+2`2915e<f;3m6<54i42b>5<#:h:19=m4n3;e>7=<a<:26=4+2`2915e<f;3m6>54i42;>5<#:h:19=m4n3;e>1=<a<;=6=4+2`2915e<f;3m6854i436>5<#:h:19=m4n3;e>3=<a<;?6=4+2`2915e<f;3m6:54i430>5<#:h:19=m4n3;e>==<a<;96=4+2`2915e<f;3m6454i432>5<#:h:19=m4n3;e>d=<a<;;6=4+2`2915e<f;3m6o54i42e>5<#:h:19=m4n3;e>f=<a<:n6=4+2`2915e<f;3m6i54i424>5<#:h:19=m4n3;e>`=<a;o86=4+2`296`4<f;3m6=5G2e18?l4b93:1(?o?:3g1?k4>n3;0D?j<;:k1a5<72-8j<7<j2:l1=c<53A8o?65f2ed94?"5i909i?5a28d97>N5l:10e?jj:18'6d6=:mn0b?7i:19K6a5<3`8oo7>5$3c3>7bc3g82j7?4H3f0?>o5lk0;6)<n0;0g`>h51o097E<k3:9j6ag=83.9m=4=de9m6<`=;2B9h>54i5d6>5<#:h:18k:4n3;e>5=<a=l86=4+2`290c2<f;3m6<54i5d1>5<#:h:18k:4n3;e>7=<a=l:6=4+2`290c2<f;3m6>54i5d3>5<#:h:18k:4n3;e>1=<a=om6=4+2`290c2<f;3m6854i5gf>5<#:h:18k:4n3;e>3=<a=oo6=4+2`290c2<f;3m6:54i5g`>5<#:h:18hl4n3;e>5=<a=oj6=4+2`290`d<f;3m6<54i5g:>5<#:h:18hl4n3;e>7=<a=o36=4+2`290`d<f;3m6>54i5g4>5<#:h:18hl4n3;e>1=<a=o=6=4+2`290`d<f;3m6854i5g6>5<#:h:18hl4n3;e>3=<a=o?6=4+2`290`d<f;3m6:54ob094?"5i90h=6`=9g83?>id83:1(?o?:b38j7?a2810coh50;&1e5<d92d95k4=;:maa?6=,;k;6n?4n3;e>6=<gki1<7*=a18`5>h51o0?76amb;29 7g72j;0b?7i:498kgg=83.9m=4l1:l1=c<132ei57>5$3c3>f7<f;3m6:54oc:94?"5i90h=6`=9g8;?>ie?3:1(?o?:b38j7?a2010co850;&1e5<d92d95k4n;:ma1?6=,;k;6n?4n3;e>g=<gk>1<7*=a18`5>h51o0h76am3;29 7g72j;0b?7i:e98kg7=83.9m=4l1:l1=c<b32ei<7>5$3c3>f7<f;3m6k54o`d94?"5i90h=6`=9g824>=hil0;6)<n0;a2?k4>n3;:76and;29 7g72j;0b?7i:008?jgd290/>l>5c09m6<`=9:10cll50;&1e5<d92d95k4>4:9led<72-8j<7m>;o0:b?7232ej57>5$3c3>f7<f;3m6<84;nc;>5<#:h:1o<5a28d952=<gh<1<7*=a18`5>h51o0:465`a483>!4f83i:7c<6f;3:?>if<3:1(?o?:b38j7?a28k07bo<:18'6d6=k81e>4h51c98kd4=83.9m=4l1:l1=c<6k21dm<4?:%0b4?e63g82j7?k;:mb4?6=,;k;6n?4n3;e>4c<3f3m6=4+2`29g4=i:0l1=k54o8g94?"5i90h=6`=9g814>=h1m0;6)<n0;a2?k4>n38:76a6b;29 7g72j;0b?7i:308?j?f290/>l>5c09m6<`=::10c4750;&1e5<d92d95k4=4:9l==<72-8j<7m>;o0:b?4232e2;7>5$3c3>f7<f;3m6?84;n;5>5<#:h:1o<5a28d962=<g0?1<7*=a18`5>h51o09465`9583>!4f83i:7c<6f;0:?>i>;3:1(?o?:b38j7?a2;k07b7=:18'6d6=k81e>4h52c98k<6=83.9m=4l1:l1=c<5k21d4k4?:%0b4?e63g82j7<k;:m;a?6=,;k;6n?4n3;e>7c<3f2o6=4+2`29g4=i:0l1>k54o9a94?"5i90h=6`=9g804>=h0k0;6)<n0;a2?k4>n39:76a7a;29 7g72j;0b?7i:208?j>>290/>l>5c09m6<`=;:10c5650;&1e5<d92d95k4<4:9l<2<72-8j<7m>;o0:b?5232eh:7>5$3c3>f7<f;3m6>84;na6>5<#:h:1o<5a28d972=<gj>1<7*=a18`5>h51o08465`c283>!4f83i:7c<6f;1:?>iel3:1(?o?:b38j7?a2:k07bl=:18'6d6=k81e>4h53c98kd1=83.9m=4l1:l1=c<4k21d5n4?:%0b4?e63g82j7=k;:m:5?6=,;k;6n?4n3;e>6c<3f2=6=4+2`29g4=i:0l1?k54obd94?"5i90hi6`=9g83?>idl3:1(?o?:bg8j7?a2810cnm50;&1e5<dm2d95k4=;:m`f?6=,;k;6nk4n3;e>6=<gjk1<7*=a18`a>h51o0?76al9;29 7g72jo0b?7i:498kf>=83.9m=4le:l1=c<132eh;7>5$3c3>fc<f;3m6:54oe;94?"5i90o46`=9g83?>ic?3:1(?o?:e:8j7?a2810ci850;&1e5<c02d95k4=;:mg1?6=,;k;6i64n3;e>6=<gm>1<7*=a18g<>h51o0?76ak3;29 7g72m20b?7i:498ka4=83.9m=4k8:l1=c<132eo=7>5$3c3>a><f;3m6:54}c6`<?6=99:1<7>t$3g7>7g33A?:o6F;e09Y74<cs8h1>94k:c8f>f<6:3;:6?852482g?402;21qcj?:19'`d<cm2.on7jj;%f`>ac<,;im6ik4$05e>6=#91:1?6*i0;18 c7=;2.m>7=4$g197>"a<390(k;53:&e2?5<,o=1?6*i8;18 c?=;2.mm7=4$g`97>"ak390(kj53:&245<53-8o97<4$022>6=#9981?6*>0280?!77<390(<>::29'550=;2.:<:4<;%33<?5<,8:26>5+11c97>"68k087)??c;18 46c2:1/==k53:&24c<43-;:<7=4$032>6=#9881?6*>1280?!76<390(<?::29'540=;2.:=:4<;%32<?5<,8;26>5+10c97>"69k087)?>c;18 47c2:1/=<k53:&25c<43-;9<7=4$002>6=#9;81?6*>2280?!75<390(<<::29'570=;2.:>:4<;%31<?5<,8826>5+13c97>"6:k087)?=c;18 44c2:1/=?k53:&26c<43-;8<7=4$012>6=#9:81?6*>3280?!74<390(<=::29'560=;2.:?:4<;%30<?5<,8926>5+12c97>"6;k087)?<c;18 45c2:1/=>k53:&27c<43-;?<7=4$062>6=#9=81?6*>4280?!73<390(<:::29'510=;2.:8:4<;%37<?5<,8>26>5+15c97>"6<k087)?;c;18 42c2:1/=9k53:&20c<43-;><7=4$072>6=#9<81?6*>5280?!72<390(<;::29'500=;2.:9:4<;%36<?5<,8?26>5+14c97>"6=k087)?:c;18 43c2:1/=8k53:&21c<43-;=<7=4$042>6=#9?81?6*>6280?!71<390(<8::29'530=;2.:::4<;%35<?5<,8<26>5+17c97>"6>k087)?9c;18 40c2:1/=;k53:&22c<43-;<<7=4$052>6=#9>81?6*>7280?!70<390(<9::29'520=;2.:;:4<;%34<?5<,8=26>5+16c97>"6?k087)?8c;18 41c2:1/=:k53:&2<4<51h1/>i?52e9'6a4=:jo0(kk53:&eb?5<a;i26=44i3a;>5<<a<;j6=44i43:>5<<a;n<6=44i3f5>5<<a;n26=4G2e18?l4c03:1D?j<;:k1g2<722c9o;4?::k65=<722c>=:4?::k1gg<722c9ol4?::k1ga<722c9on4?::m1`5<722e8n7>5;h5;>5<#:h:1;:5a28d94>=n??0;6)<n0;54?k4>n3;07d9::18'6d6=?>1e>4h52:9j31<72-8j<798;o0:b?5<3`=96=4+2`2932=i:0l1865f7083>!4f83=<7c<6f;78?l17290/>l>5769m6<`=>21b:k4?:%0b4?103g82j794;h4f>5<#:h:1;:5a28d9<>=n>m0;6)<n0;54?k4>n3307d8l:18'6d6=?>1e>4h5a:9j2g<72-8j<798;o0:b?d<3`<j6=4+2`2932=i:0l1o65f6883>!4f83=<7c<6f;f8?l00290/>l>5769m6<`=m21b:;4?:%0b4?103g82j7h4;h46>5<#:h:1;:5a28d955=<a?>1<7*=a1843>h51o0:=65f6283>!4f83=<7c<6f;31?>o1:3:1(?o?:658j7?a28907d8>:18'6d6=?>1e>4h51598m36=83.9m=487:l1=c<6=21b9k4?:%0b4?103g82j7?9;:k6a?6=,;k;6:94n3;e>41<3`?h6=4+2`2932=i:0l1=554i4`94?"5i90<;6`=9g82=>=n=h0;6)<n0;54?k4>n3;j76g:9;29 7g72>=0b?7i:0`8?l3?290/>l>5769m6<`=9j10e8950;&1e5<0?2d95k4>d:9j13<72-8j<798;o0:b?7b32c>97>5$3c3>21<f;3m6<h4;h77>5<#:h:1;:5a28d965=<a<91<7*=a1843>h51o09=65f5083>!4f83=<7c<6f;01?>o283:1(?o?:658j7?a2;907d:i:18'6d6=?>1e>4h52598m1c=83.9m=487:l1=c<5=21b8i4?:%0b4?103g82j7<9;:k7g?6=,;k;6:94n3;e>71<3`>i6=4+2`2932=i:0l1>554i5c94?"5i90<;6`=9g81=>=n<00;6)<n0;54?k4>n38j76g;8;29 7g72>=0b?7i:3`8?l21290/>l>5769m6<`=:j10e9;50;&1e5<0?2d95k4=d:9j01<72-8j<798;o0:b?4b32c??7>5$3c3>21<f;3m6?h4;h61>5<#:h:1;:5a28d975=<a=;1<7*=a1843>h51o08=65f4183>!4f83=<7c<6f;11?>o4n3:1(?o?:658j7?a2:907d=j:18'6d6=?>1e>4h53598m6b=83.9m=487:l1=c<4=21b;n4?:%0b4?103g82j7=9;:k4f?6=,;k;6:94n3;e>61<3`=j6=4+2`2932=i:0l1?554i6;94?"5i90<;6`=9g80=>=n?:0;6)<n0;54?k4>n39j76g98;29 7g72>=0b?7i:2`8?l3c290/>l>5769m6<`=;j10e8<50;&1e5<0?2d95k4<d:9j02<72-8j<798;o0:b?5b32c8o7>5$3c3>21<f;3m6>h4;h:6>5<#:h:1495a28d94>=n0:0;6)<n0;:7?k4>n3;07d6=:18'6d6=0=1e>4h52:9j<4<72-8j<76;;o0:b?5<3`2;6=4+2`29<1=i:0l1865f7g83>!4f832?7c<6f;78?l1b290/>l>5859m6<`=>21b;i4?:%0b4?>33g82j794;h0bg?6=,;k;6?om;o0:b?6<3`8jm7>5$3c3>7ge3g82j7?4;h0b=?6=,;k;6?om;o0:b?4<3`8j47>5$3c3>7ge3g82j7=4;h0b3?6=,;k;6?om;o0:b?2<3`8j:7>5$3c3>7ge3g82j7;4;h0a1?6=,;k;6?om;o0:b?0<3`8i87>5$3c3>7ge3g82j794;h0a7?6=,;k;6?om;o0:b?><3`8i>7>5$3c3>7ge3g82j774;h0a5?6=,;k;6?om;o0:b?g<3`8i<7>5$3c3>7ge3g82j7l4;h0bb?6=,;k;6?om;o0:b?e<3`8ji7>5$3c3>7ge3g82j7j4;h0b`?6=,;k;6?om;o0:b?c<3`8j97>5$3c3>7ge3g82j7h4;h0ag?6=,;k;6?lm;o0:b?6<3`8im7>5$3c3>7de3g82j7?4;h0a=?6=,;k;6?lm;o0:b?4<3`8i47>5$3c3>7de3g82j7=4;h0a3?6=,;k;6?lm;o0:b?2<3`8h97>5$3c3>7de3g82j7;4;h0`0?6=,;k;6?lm;o0:b?0<3`8h?7>5$3c3>7de3g82j794;h0`6?6=,;k;6?lm;o0:b?><3`8h=7>5$3c3>7de3g82j774;h0`4?6=,;k;6?lm;o0:b?g<3`8ij7>5$3c3>7de3g82j7l4;h0aa?6=,;k;6?lm;o0:b?e<3`8ih7>5$3c3>7de3g82j7j4;h0a2?6=,;k;6?lm;o0:b?c<3`>mh7>5$3c3>1`d3g82j7>4;h6ef?6=,;k;69hl;o0:b?7<3`>mm7>5$3c3>1`d3g82j7<4;h6e=?6=,;k;69hl;o0:b?5<3`>m47>5$3c3>1`d3g82j7:4;h6e3?6=,;k;69hl;o0:b?3<3`?;:7>5$3c3>1`d3g82j784;h731?6=,;k;69hl;o0:b?1<3`?;87>5$3c3>1`d3g82j764;h737?6=,;k;69hl;o0:b??<3`?;>7>5$3c3>1`d3g82j7o4;h735?6=,;k;69hl;o0:b?d<3`?;<7>5$3c3>1`d3g82j7m4;h6eb?6=,;k;69hl;o0:b?b<3`>mi7>5$3c3>1`d3g82j7k4;h6e2?6=,;k;69hl;o0:b?`<3`?;h7>5$3c3>06d3g82j7>4;h73f?6=,;k;68>l;o0:b?7<3`?;m7>5$3c3>06d3g82j7<4;h73=?6=,;k;68>l;o0:b?5<3`?;47>5$3c3>06d3g82j7:4;h722?6=,;k;68>l;o0:b?3<3`?:97>5$3c3>06d3g82j784;h720?6=,;k;68>l;o0:b?1<3`?:?7>5$3c3>06d3g82j764;h726?6=,;k;68>l;o0:b??<3`?:=7>5$3c3>06d3g82j7o4;h724?6=,;k;68>l;o0:b?d<3`?;j7>5$3c3>06d3g82j7m4;h73a?6=,;k;68>l;o0:b?b<3`?;;7>5$3c3>06d3g82j7k4;h0f7?6=,;k;6?k=;o0:b?6<@;n876g=e083>!4f838n>6`=9g82?M4c;21b>h>50;&1e5<5m;1e>4h52:J1`6=<a;nm6=4+2`296`4<f;3m6>5G2e18?l4cm3:1(?o?:3fg?k4>n3:0D?j<;:k1`f<72-8j<7<kd:l1=c<63A8o?65f2e`94?"5i909hi5a28d96>N5l:10e?jn:18'6d6=:mn0b?7i:29K6a5<3`>m97>5$3c3>1`33g82j7>4;h6e7?6=,;k;69h;;o0:b?7<3`>m>7>5$3c3>1`33g82j7<4;h6e5?6=,;k;69h;;o0:b?5<3`>m<7>5$3c3>1`33g82j7:4;h6fb?6=,;k;69h;;o0:b?3<3`>ni7>5$3c3>1`33g82j784;h6f`?6=,;k;69h;;o0:b?1<3`>no7>5$3c3>1ce3g82j7>4;h6fe?6=,;k;69km;o0:b?7<3`>n57>5$3c3>1ce3g82j7<4;h6f<?6=,;k;69km;o0:b?5<3`>n;7>5$3c3>1ce3g82j7:4;h6f2?6=,;k;69km;o0:b?3<3`>n97>5$3c3>1ce3g82j784;h6f0?6=,;k;69km;o0:b?1<3fi96=4+2`29g4=i:0l1<65`c183>!4f83i:7c<6f;38?jda290/>l>5c09m6<`=:21dnh4?:%0b4?e63g82j7=4;n``>5<#:h:1o<5a28d90>=hjk0;6)<n0;a2?k4>n3?07bln:18'6d6=k81e>4h56:9lf<<72-8j<7m>;o0:b?1<3fh36=4+2`29g4=i:0l1465`b683>!4f83i:7c<6f;;8?jd1290/>l>5c09m6<`=i21dn84?:%0b4?e63g82j7l4;n`7>5<#:h:1o<5a28d9g>=hj:0;6)<n0;a2?k4>n3n07bl>:18'6d6=k81e>4h5e:9lf5<72-8j<7m>;o0:b?`<3fkm6=4+2`29g4=i:0l1==54o`g94?"5i90h=6`=9g825>=him0;6)<n0;a2?k4>n3;976anc;29 7g72j;0b?7i:018?jge290/>l>5c09m6<`=9=10clo50;&1e5<d92d95k4>5:9le<<72-8j<7m>;o0:b?7132ej47>5$3c3>f7<f;3m6<94;nc5>5<#:h:1o<5a28d95==<gh?1<7*=a18`5>h51o0:565`a583>!4f83i:7c<6f;3b?>if;3:1(?o?:b38j7?a28h07bo=:18'6d6=k81e>4h51b98kd7=83.9m=4l1:l1=c<6l21dm=4?:%0b4?e63g82j7?j;:m:b?6=,;k;6n?4n3;e>4`<3f3n6=4+2`29g4=i:0l1>=54o8f94?"5i90h=6`=9g815>=h1k0;6)<n0;a2?k4>n38976a6a;29 7g72j;0b?7i:318?j?>290/>l>5c09m6<`=:=10c4650;&1e5<d92d95k4=5:9l=2<72-8j<7m>;o0:b?4132e2:7>5$3c3>f7<f;3m6?94;n;6>5<#:h:1o<5a28d96==<g0>1<7*=a18`5>h51o09565`9283>!4f83i:7c<6f;0b?>i>:3:1(?o?:b38j7?a2;h07b7?:18'6d6=k81e>4h52b98k=`=83.9m=4l1:l1=c<5l21d4h4?:%0b4?e63g82j7<j;:m;`?6=,;k;6n?4n3;e>7`<3f2h6=4+2`29g4=i:0l1?=54o9`94?"5i90h=6`=9g805>=h0h0;6)<n0;a2?k4>n39976a79;29 7g72j;0b?7i:218?j>?290/>l>5c09m6<`=;=10c5950;&1e5<d92d95k4<5:9lg3<72-8j<7m>;o0:b?5132eh97>5$3c3>f7<f;3m6>94;na7>5<#:h:1o<5a28d97==<gj91<7*=a18`5>h51o08565`be83>!4f83i:7c<6f;1b?>ie:3:1(?o?:b38j7?a2:h07bo8:18'6d6=k81e>4h53b98k<e=83.9m=4l1:l1=c<4l21d5<4?:%0b4?e63g82j7=j;:m;2?6=,;k;6n?4n3;e>6`<3fim6=4+2`29g`=i:0l1<65`ce83>!4f83in7c<6f;38?jed290/>l>5cd9m6<`=:21doo4?:%0b4?eb3g82j7=4;nab>5<#:h:1oh5a28d90>=hk00;6)<n0;af?k4>n3?07bm7:18'6d6=kl1e>4h56:9lg2<72-8j<7mj;o0:b?1<3fn26=4+2`29`==i:0l1<65`d683>!4f83n37c<6f;38?jb1290/>l>5d99m6<`=:21dh84?:%0b4?b?3g82j7=4;nf7>5<#:h:1h55a28d90>=hl:0;6)<n0;f;?k4>n3?07bj=:18'6d6=l11e>4h56:9l`4<72-8j<7j7;o0:b?1<3ty>>54?:c5xZ04?348m;7==;<12f?55349:o7==;<6`g?5534>o47==;<6`b?5534>on7==;<6g3?5534>hi7==;<6g=?5534>om7==;<6``?5534>o:7==;<6g1?5534>o87==;<6gb?55349;j7==;<13a?55349;o7==;<13f?55349;h7==;<12=?55349:47==;<123?55349::7==;<121?55348nj7==;<0e4?55348nm7==;<0f=?55349897==;<100?553498>7==;<105?553498?7==;<10b?553498i7==;<10`?553498o7==;<10f?55349n97==;<1f0?55349n?7==;<1f6?55349n=7==;<1f4?55349oj7==;<1ga?55349oh7==;<1gg?55349om7==;<1g=?55349o47==;<1g3?55349o:7==;<1g1?55349o87==;<1g7?55349o>7==;<1g5?55349hj7==;<1`a?55349hh7==;<1`g?55349hn7==;<1`e?55349h57==;<1`<?55349h;7==;<1`2?5534>?87==;<677?5534>?>7==;<675?5534>?<7==;<60b?5534>8i7==;<60`?5534>8o7==;<60f?5534>857==;<60<?5534>8;7==;<602?5534>897==;<600?5534>8?7==;<606?5534>8=7==;<604?5534>9i7==;<61`?5534>9o7==;<61f?5534>9m7==;<61=?5534>947==;<613?5534>9:7==;<611?5534>9?7==;<616?5534>9=7==;<614?5534>:j7==;<62a?5534>:h7==;<62g?5534>:n7==;<62e?5534>:47==;<623?5534>::7==;<621?5534>:87==;<627?5534>:>7==;<625?5534>:<7==;<63b?5534>;h7==;<63g?5534>;n7==;<63e?5534>;57==;<63<?5534>;;7==;<632?5534>;97==;<630?5534>;>7==;<635?5534>;<7==;<1eb?55349mi7==;<1e`?55349mo7==;<1ef?55349mm7==;<1e=?55349m;7==;<1e2?55349m97==;<1e0?55349m?7==;<1e6?55349m=7==;<1e4?55349nj7==;<1fa?55349no7==;<1ff?55349nm7==;<1f=?55349n47==;<1f3?55349n:7==;<1gf?55349o<7==;<1`1?5534>8m7==;<61b?5534>987==;<62=?5534>;i7==;<637?55349m47==;<1f`?55349h87==;<1`7?5534>h;7<l7:?7g2<5k?168n9550:891e02<;<70:l7;0`f>;3k>09ol524b:96f1<5=i36?m9;<6`<?36027?o54:169>0f>=:jh019m7:3ab?xu0?>0;6:uQ765897cb2lh01?kl:da897`52ln01?k9:da897c22lk019mn:da8yv10=3:1:4uQ5228Z0423W=3<6P87d9]172<V>=j7S9;3:\43c=Y?=20R:;m;_71a>X2:m1U9?m4^40a?[35i2T>>45Q7958Z2>13W=396P8859]3=5<V>297S984:\436=Y?>80R:9>;_544>X0>o169<j5e69>0a?=;h168nj53`9>0a0=;h168i;53`9>0a2=;h168ih53`9>0f1=:m3019m8:3f;?82d?38hh63;c681gf=:<j=1>lo4=5a4>7g>34>h;7<n8:?7g2<5i>168n952ca891e02;hj70:l7;0a=>;3k>09n5524b590cd<5=i<69hn;<6`3?2a127?o:4;f99>0f1==9n019m8:42a?82d?3?;m63;c6864<=:<j=1>h=4=5a4>7c634>h;7<j0:?7g2<5lo168n952eg891e02;nh70:l7;0gf>;3k>09hl524b:96a?<5=i36?j7;<6`<?4dl27?o54=cb9>0f>=?1168n656d9>0f>=><168n65559>0f>=<k168n65439>0f>=0<168n65829>0f>=0;168n65809>0f>=09168n657g9>0f>=?l168n657e9>0f>=:hk019m7:3c:?82d038j463;c981e2=:<j21>om4=5a;>7df34>h47<m9:?7g=<5j1168n654g`891e?2=lj70:l8;6e=>;3k10?j5524b:915b<5=i368>m;<6`<?37i27?o54:089>0f>=:l9019m7:3g2?82d038n<63;c981`c=:<j21>ik4=5a;>7bd34>h47<kb:?7g=<5lh1v:96:184[10127?on4<6:?7`=<5i8168i952`3891b>2;k:70:ld;0b5>;3l?09m<5rs3d3>5<5sW=8o63=f181e7=z{>226=4;{_5;=>;4:80nm63<1d8fe>;5n00no6s|30a94?4|V>9n70=>c;0b6>{t;?;1<7<t^77;?85b=38j>6s|37294?4|V??<70=j4;0b6>{t;<l1<7<t^775?85b;38j>6s|34g94?4|V??>70=j2;0b6>{t;<n1<7<t^777?85b938j>6s|34a94?4|V??870=j0;0b6>{t;<h1<7<t^771?85cn38j>6s|34c94?4|V??:70=ke;0b6>{t;<31<7<t^773?85cl38j>6s|34:94?4|V?>m70=kc;0b6>{t;<<1<7<t^76g?85ci38j>6s|34794?4|V?>h70=k9;0b6>{t;<>1<7<t^76a?85c038j>6s|34194?4|V?>j70=k7;0b6>{t;<81<7<t^76:?85c>38j>6s|34394?4|V?>370=k5;0b6>{t;<:1<7<t^764?85c<38j>6s|35d94?4|V?>=70=k3;0b6>{t;=o1<7<t^766?85c:38j>6s|35f94?4|V?>?70=k1;0b6>{t;=h1<7<t^761?85dn38j>6s|35c94?4|V?>:70=le;0b6>{t;=31<7<t^763?85dl38j>6s|35:94?4|V?9m70=lc;0b6>{t;==1<7<t^71f?85dj38j>6s|35494?4|V?9o70=la;0b6>{t;=?1<7<t^71`?85d138j>6s|35694?4|V?9i70=l8;0b6>{t;=91<7<t^71b?85d?38j>6s|35094?4|V?9270=l6;0b6>{t;j;1<7<t^7`4?823<38j>6s|3b294?4|V?h=70:;3;0b6>{t;kl1<7<t^7`6?823:38j>6s|3cg94?4|V?h?70:;1;0b6>{t;kn1<7<t^7`0?823838j>6s|3ca94?4|V?h970:<f;0b6>{t;kh1<7<t^7`2?824m38j>6s|3cc94?4|V?h;70:<d;0b6>{t;k31<7<t^7ce?824k38j>6s|3c:94?4|V?kn70:<b;0b6>{t;k<1<7<t^7c`?824138j>6s|3c794?4|V?ki70:<8;0b6>{t;k>1<7<t^7cb?824?38j>6s|3c194?4|V?k270:<6;0b6>{t;k81<7<t^7c;?824=38j>6s|3c394?4|V?k<70:<4;0b6>{t;k:1<7<t^7c5?824;38j>6s|3`d94?4|V?k>70:<2;0b6>{t;ho1<7<t^7c7?824938j>6s|3`f94?4|V?k870:<0;0b6>{t;hh1<7<t^7c2?825m38j>6s|3`c94?4|V?k;70:=d;0b6>{t;h31<7<t^7;e?825k38j>6s|3`:94?4|V?3n70:=b;0b6>{t;h=1<7<t^7;g?825i38j>6s|3`494?4|V?3h70:=9;0b6>{t;h?1<7<t^7;a?825038j>6s|3`694?4|V?3j70:=7;0b6>{t;h91<7<t^7;:?825>38j>6s|3`094?4|V?3370:=5;0b6>{t;h:1<7<t^7;5?825;38j>6s|38d94?4|V?3>70:=2;0b6>{t;0o1<7<t^7;7?825938j>6s|38f94?4|V?3870:=0;0b6>{t;0i1<7<t^7;1?826n38j>6s|38`94?4|V?3:70:>e;0b6>{t;0k1<7<t^7;3?826l38j>6s|38;94?4|V?2m70:>c;0b6>{t;021<7<t^7:f?826j38j>6s|38594?4|V?2o70:>a;0b6>{t;0?1<7<t^7:a?826038j>6s|38694?4|V?2j70:>7;0b6>{t;091<7<t^7::?826>38j>6s|38094?4|V?2370:>5;0b6>{t;0;1<7<t^7:4?826<38j>6s|38294?4|V?2=70:>3;0b6>{t;1l1<7<t^7:6?826:38j>6s|39g94?4|V?2?70:>1;0b6>{t;1n1<7<t^7:0?826838j>6s|39a94?4|V?2970:?f;0b6>{t;1k1<7<t^7:3?827l38j>6s|39;94?4|V?=m70:?c;0b6>{t;121<7<t^75f?827j38j>6s|39594?4|V?=o70:?a;0b6>{t;1<1<7<t^75`?827138j>6s|39794?4|V?=i70:?8;0b6>{t;1>1<7<t^75b?827?38j>6s|39194?4|V?=270:?6;0b6>{t;181<7<t^75;?827=38j>6s|39394?4|V?=<70:?4;0b6>{t;>l1<7<t^756?827:38j>6s|36g94?4|V?=?70:?1;0b6>{t;>n1<7<t^750?827838j>6s|36a94?4|V?=970=if;0b6>{t;>h1<7<t^752?85am38j>6s|36c94?4|V?=;70=id;0b6>{t;>31<7<t^74e?85ak38j>6s|36:94?4|V?<n70=ib;0b6>{t;>=1<7<t^74g?85ai38j>6s|36494?4|V?<h70=i9;0b6>{t;>>1<7<t^74b?85a?38j>6s|36194?4|V?<270=i6;0b6>{t;>81<7<t^74;?85a=38j>6s|36394?4|V?<<70=i4;0b6>{t;>:1<7<t^745?85a;38j>6s|37d94?4|V?<>70=i2;0b6>{t;?o1<7<t^747?85a938j>6s|37f94?4|V?<870=i0;0b6>{t;?i1<7<t^741?85bn38j>6s|37`94?4|V?<:70=je;0b6>{t;?31<7<t^77e?85bk38j>6s|37:94?4|V??n70=jb;0b6>{t;?=1<7<t^77g?85bi38j>6s|37494?4|V??h70=j9;0b6>{t;??1<7<t^77a?85b038j>6s|37694?4|V??j70=j7;0b6>{t;?91<7<t^77:?85b>38j>6s|37094?4|V?>n70=kb;0b6>{t;<=1<7<t^760?85c838j>6s|35a94?4|V?9370=l5;0b6>{t;j81<7<t^7cg?824i38j>6s|3c594?4|V?k970:=f;0b6>{t;hi1<7<t^7;4?825<38j>6s|3`394?4|V?2h70:>9;0b6>{t;0<1<7<t^7:2?827m38j>6s|39`94?4|V?==70:?3;0b6>{t;1:1<7<t^74a?85a038j>6s|36794?4|V?<;70=jd;0b6>{t;?k1<7<t^714?85d<38j>6s|35394?4|V?9=70=l3;0b6>{t=m>1<7<t^470?82d03==7p}:d383>7}Y=<8019m7:678yv3c93:1>vP:509>0f>=?=1v8j?:181[32827?o5482:p1f`=838pR8:i;<6`<?163ty>oh4?:3y]11c<5=i36:>4}r7``?6=:rT>8i524b:92c=z{<ih6=4={_77g>;3k10=h6s|5b`94?4|V<>i70:l8;4`?xu2kh0;6?uQ55c891e?2?h0q~;l8;296~X2<1168n656`9~w0e02909wS;;7:?7g=<112wx9n850;0xZ02134>h4788;|q6g0<72;qU99;4=5a;>30<uz?h87>52z\601=:<j21:95rs4a0>5<5sW???63;c9857>{t=j81<7<t^461?82d03<97p}:c083>7}Y==;019m7:738yv3d83:1>vP:419>0f>=>91v8li:181[34n27?o54:f:p1gb=838pR8=k;<6`<?3b3ty>nn4?:3y]16e<5=i368m4}r7af?6=:rT>?o524b:91g=z{<hj6=4={_70e>;3k10>m6s|5c;94?4|V<9270:l8;7:?xu2j10;6?uQ52:891e?2<20q~;m7;296~X2;>168n65569~w0d12909wS;<6:?7g=<2>2wx9o;50;0xZ05234>h47;:;|q6f1<72;qU9>:4=5a;>05<uz<887>52z\6f7=:<j219<5rs710>5<5sW?i=63;c9864>{t>:81<7<t^4`3?82d03>m7p}93083>7}Y=hl019m7:5g8yv0483:1>vP:ad9>0f>=<m1v;<i:181[3fl27?o54;c:p27c=838pR8ol;<6`<?2f3ty=>i4?:3y]1dd<5=i36974}r41g?6=:rT>ml524b:90==z{?8i6=4={_7b=>;3k10?:6s|63;94?4|V<k<70:l8;66?xu1:10;6?uQ5`4891e?2=>0q~8=7;296~X2i<168n65429~w3412909wS;n4:?7g=<392wx:?;50;0xZ0g434>h47:?;|q561<72;qU9l<4=5a;>6`<uz<9?7>52z\6e4=:<j21?h5rs701>5<5sW?j<63;c980`>{t>;;1<7<t^4;e?82d03=h7p}92183>7}Y=0o019m7:6`8yv06m3:1>vP:9b9>0f>=?h1v;?k:181[3>j27?o5489:p24e=838pR87n;<6`<?143ty==o4?:3y]1<?<5=i36;64}r42e?6=:rT>55524b:91a=z{?;26=4={_7:3>;3k10>>6s|60:94?4|V<3=70:l8;64?xu19>0;6?uQ587891e?2:i0q~8>6;296~X21=168n95849~w3722909wS;63:?7g2<002wx:<=50;0xZ0?634>h;799;|q557<72;qU94>4=5a4>23<uz<:=7>52z\6<c=:<j=1;95rs733>5<5sW?3i63;c6846>{t>9l1<7<t^4:g?82d?3=:7p}90d83>7}Y=1i019m8:628yv07l3:1>vP:8c9>0f1=>o1v;>l:181[3?i27?o:473:p25d=838pR866;<6`3?0b3ty=<l4?:3y]1=><5=i<6;j4}r43<?6=:rT>4;524b592f=z{?:<6=4={_7;1>;3k>0=n6s|61494?4|V<2?70:l7;4b?xu18<0;6?uQ591891e02?30q~8?4;296~X20;168n95669~w3642909wS;71:?7g2<1>2wx:=<50;0xZ0>734>h;76=;|q544<72;qU9:h4=5a4>33<uz<;<7>52z\63`=:<j=1:95rs4de>5<5sW?<h63;c6857>{t=on1<7<t^45a?82d?3<97p}:fb83>7}Y=>k019m8:738yv3aj3:1>vP:789>0f1=>91v8hn:181[30027?o:4:f:p1c?=838pR898;<6`3?3b3ty>j54?:3y]120<5=i<65?4}r7e3?6=:rT>;8524b591f=z{<l=6=4={_740>;3k>0>n6s|5g794?4|V<=870:l7;7b?xu2n=0;6?uQ560891e02<30q~;i2;296~X2?9168n95599~w0`62909wS;9f:?7g2<2?2wx9k>50;0xZ00b34>h;7;9;|q6ac<72;qU9;j4=5a4>03<uz?ni7>52z\62f=:<j=14=5rs4gg>5<5sW?=n63;c6860>{t=li1<7<t^44b?82d?3?87p}:ec83>7}Y=?3019m8:438yv3bi3:1>vP:699>0f1==91v8k6:181[31?27?o:4;f:p1`1=838pR88:;<6`3?2b3ty>i;4?:3y]132<5=i<69j4}r7f1?6=:rT>:>524b590f=z{<o?6=4={_756>;3k>0<j6s|5d194?4|V<<:70:l7;6a?xu2m;0;6?uQ572891e02=k0q~;j1;296~X2=o168n95489~w0c72909wS;:e:?7g2<302wx9ih50;0xZ03c34>h;7:9;|q6``<72;qU98m4=5a4>13<uz?oo7>52z\61d=:<j=1895rs4fa>5<5sW?>563;c6877>{t=mk1<7<t^47;?82d?3=n7p}:d883>7}Y=<=019m8:508yv3c03:1>vP:579>0f1=<81v8j8:181[32=27?o:4;0:p1a0=838pR8;;;<6`3?5a3ty>h84?:3y]11?<5=i<6>k4}r7`=?6=:rT>?h524b597a=z{<hn6=4={_707>;3k>0<o6s|62794?4|V<k370:l7;5a?xu1:h0;6?uQ58f891e02>n0q~8>f;296~X21;168n957`9~w3732909wS;77:?7g2<012wx:=750;0xZ01d34>h;79<;|q6b`<72;qU9:?4=5a4>3><uz?m?7>52z\623=:<j=19i5rs4g;>5<5sW?>n63;c6866>{t=mn1<7<t^411?82d?3><7p}:b283>7}Y=:;019m8:2a8yv7?l3:19v3:1d81=a=:<j=1>lm4=5a4>1`c34>h47<nc:?7g=<3nm1v?h7:18184a?39j70<i9;0:f>{t<m91<7??{<0e3?4f927?h84=a39>75`=;?16?=k5379>75e=;?16?=l52`38966c2:<01>?6:248967?2:<01>?8:24896712:<01>?::24897ca2;k:70<i0;0b5>;5mh08:63=e8802>{t:o=1<7;t=3d4>7g5348no7kk;<0f1?ce348m57kn;<6`e?cf3ty8=i4?:2y>74d=;h16?<m53`9>74`=:0h0q~:k7;290~;49k09m<5230a96d7<5=n36>o4=5f4>7g53ty8=o4?:7y>74d=:h801><>:d`8967b2li01?h6:d`897`22lk01?h9:dd8yv2c03:1>v3;cb80e>;3l109m?5rs5a`>5<4s4>ho7<n2:?1b0<bj279j;4je:p0fc=839p19mi:2c891eb2;k970:ld;10?xu3ko0;6?u24bd96d4<5=n:6hl4}r6ge?6=;r7?ho4<a:?7`<<4;27?hl4=a39~w1be2909w0:kb;0b6>;3lm0nn6s|4e494?4|5=n<6>o4=5f5>7g53ty?oi4?:2y>0fc=;h168nj52`0891b62lk0q~:k9;297~;3l009m?524ec97d=:<mn1il5rs5f3>5<4s4>o97<n1:?7`1<5i8168i?528`8yv2c:3:145u24e696d4<5:o>6?o<;<1f0?4f;278i>4=a29>7`4=:h901>k>:3c0?85b838j?63<dg81e6=:;mo1>l=4=2fg>7g4349oo7<n3:?0`d<5i:16?i752`1896b?2;k870=k7;0b7>;4l?09m>523e796d5<5:n?6?o<;<1g7?4f;278h?4=a29>7a7=:h901>mi:3c0?85dm38j?63<ce81e6=:;ji1>l=4=2aa>7g4349hm7<n3:?0g<<5i:16?n652`1896e02;k870=l6;0b7>;3<=09m>5245196d5<5=>96?o<;<675?4f;27?8=4=a29>06`=:h9019=j:3c0?824l38j?63;3b81e6=:<:h1>l=4=51:>7g434>847<n3:?772<5i:168>852`1891522;k870:<4;0b7>;3;:09m>5242096d5<5=9:6?o<;<604?4f;27?>h4=a29>07b=:h9019<l:3c0?825j38j?63;2`81e6=:<;31>l=4=50;>7g434>9;7<n3:?763<5i:168?;52`1891442;k870:=2;0b7>;3:809m>5243296d5<5=;m6?o<;<62a?4f;27?=i4=a29>04e=:h9019?m:3c0?826i38j?63;1981e6=:<8=1>l=4=535>7g434>:97<n3:?751<5i:168<=52`1891752;k870:>1;0b7>;39909m>5241d96d5<5=:o6?o<;<63g?4f;27?<o4=a29>05g=:h9019>6:3c0?827038j?63;0681e6=:<9<1>l=4=526>7g434>;87<n3:?747<5i:168=?52`1891672;k870=if;0b7>;4nl09m>523gf96d5<5:lh6?o<;<1ef?4f;278jl4=a29>7c?=:h901>h8:3c0?85a>38j?63<f481e6=:;o>1>l=4=2d0>7g4349m>7<n3:?0b4<5i:16?k>52`1896ca2;k870=je;0b7>;4mj09m>523d`96d5<5:oj6?o<;<1f=?4f;278i54=a29>7`1=:h901>k9:3c0?85cj38j?63<d181e6=:;j?1>l=4=51b>7g434>9j7<n3:?761<5i:168<752`18916b2;k870:?3;0b7>;4n109m>523df96d5<5:i?6?o<;<1`7?4f;27?ol4jd:?7g2<5l>168n952e4891e?2;n<70:l8;0g2>{t<mi1<7<t=5fe>7g634>oh7<6b:p0ac=83hp19ji:3c1?854=39=70=<4;15?854:39=70=<1;0b5>;4;:08:63<3g802>;4;l08:63<3e802>;4;j08:63<3c802>{t;8k1<7jt=22e>65<5::n6>=4=22`>65<5::i6>=4=22g>65<5:;26>=4=23;>65<5:;<6>=4=235>65<5:;>6>=4=3g6>7?e348mm7kj;<12b?ce3ty8<=4?:3y>75`=;h16?=;528`8yv57i3:18v3<0g81e7=:;831?l523179ad=::ok1il5rs3de>5<5s49;i7=n;<130?4>j2wx?=750;7x966b2;k970=>8;1b?857<3oj70=?5;gf?84aj3oj7p}=fe83>7}:;9i1?l5231096<d<uz9;;7>57z?04f<5i;16?<853`9>754=mk16?==5eb9>752=mj16?=;5eb9>6cd=ml1v?hl:181857j39j70=?1;0:f>{t;9<1<76t=22a>7g5349:97=n;<136?cf349;?7km;<130?ce349;97km;<0ee?cc349;=7k6;|q1b`<72;q6?=j53`9>755=:0h0q~=?8;292~;48m09m?5230597d=:;991il523169aa=:;9?1ii522g`9af=z{:;?6=48{<12=?4f:279j94jf:?05`<bl27?o:4=a79>0f1=:k=019m7:3c5?82d038i;6s|30194?1|5:;36?o=;<0e0?cd3499<7km;<6`3?4e=27?o:4=c49>0f>=:k?019m7:3a6?xu49;0;65u230596d4<5;l86hm4=203>`b<5;l=6hl4=5a4>7d334>h;7<l4:?7g=<5j=168n652b68yv5693:14v3<1781e7=::o91ii523329ac=::o<1in524b596g5<5=i<6?m<;<6`<?4e;27?o54=c29~w677290<w0=>5;0b6>;5n=0nm63<1d8fa>;3k>09n?524b596f4<5=i36?l=;<6`<?4d:2wx>k?50;1x97ca2:k01?h?:2c897`52;3i7p}=eg83>7}::ll1>l<4=3d1>`g<uz8nn7>52z?1ad<4i279in4=9c9~w7c?290<w0<ja;0b6>;5ml0no63=eb8fe>;5n;0no63=e78fe>;5m<0no63;c`8fa>{t:ln1<7<t=3g:>6g<5;on6?7m;|q1a2<72>q6>h752`0897cb2lk01?kl:d`897`52lh01?k9:d`897c22ln019mn:d`8yv5383:1>ku2327976=:;:>1?>52320976=:;:;1?>52321976=:;:l1?>5232g976=:;:n1?>5232a976=:;:h1?>5233396<d<5=i<68?n;<6`3?36127?o:4;f49>0f1=<o9019m8:5d1?82d?3>m=63;c687b5=:<j=18hh4=5a4>1cb34>h;7:jd:?7g2<3mj168n954dc891e02=o270:l7;6f<>;3k>0?i:524b590`0<5=i<69k:;<6`3?2b<27?o54:1`9>0f>==83019m7:5d6?82d03>m?63;c987b7=:<j218k?4=5a;>1`734>h47:jf:?7g=<3ml168n654df891e?2=oh70:l8;6fe>;3k10?i4524b:90`><5=i369k8;<6`<?2b>27?o54;e49>0f>=<l>0q~==6;296~;4;<08m63<2c81=g=z{:9;6=4;{<101?4f:278?k4<a:?06g<bi278=h4jb:p773=838p1>=;:2c8964f2;3i7p}<2g83>0}:;:>1>l<4=21f>6g<5:8j6ho4=20a>`c<5:8;6ho4}r117?6=:r78??4<a:?06=<51k1v><k:184854:38j>63<3b80e>;4:10nn63<288fg>;4:h0no63<2c8fg>;4:90ni6s|33094?4|5:9:6>o4=204>7?e3ty8>n4?:9y>767=:h801>=m:2c8964?2lk01><6:d`8964f2lh01><m:d`8967b2ll01><8:d;8yv55<3:1>v3<3280e>;4:0095o5rs20f>5<1s498?7<n2:?07a<4i278>44ja:?06d<bl278>o4jd:?065<bk2wx?>o50;5x965a2;k970<i4;gf?84ai3oi70:l7;6e3>;3k>0><5524b:90c1<5=i368>7;|q07<<72>q6?>k52`0897`32ln01?hm:d`891e02<:=70:l7;722>;3k10><;524b:9140<uz9847>58z?07a<5i;16>k=5e`9>6cd=mm16>k85ee9>0f1==9?019m8:436?82d03?;963;c98650=z{:9<6=47{<10g?4f:279j>4jb:?1bg<bn279j;4ja:?7g2<28=168n95506891e?2<:?70:l8;720>{t;:<1<79t=21a>7g5348m87km;<0ee?cd34>h;7;?3:?7g2<29:168n65511891e?2<;87p};cc83>=5|5:o>6>=4=2g7>65<5:o86>=4=2g1>65<5:o:6>=4=2g3>65<5:nm6>=4=2ff>65<5:no6>=4=2f`>65<5:nj6>=4=2f:>65<5:n36>=4=2f4>65<5:n=6>=4=2f6>65<5:n?6>=4=2f0>65<5:n96>=4=2f2>65<5:im6>=4=2af>65<5:io6>=4=2a`>65<5:ii6>=4=2ab>65<5:i26>=4=2a;>65<5:i<6>=4=2a5>65<5=>?6>=4=560>65<5=>96>=4=562>65<5=>;6>=4=51e>65<5=9n6>=4=51g>65<5=9h6>=4=51a>65<5=926>=4=51;>65<5=9<6>=4=515>65<5=9>6>=4=517>65<5=986>=4=511>65<5=9:6>=4=513>65<5=8n6>=4=50g>65<5=8h6>=4=50a>65<5=8j6>=4=50:>65<5=836>=4=504>65<5=8=6>=4=506>65<5=886>=4=501>65<5=8:6>=4=503>65<5=;m6>=4=53f>65<5=;o6>=4=53`>65<5=;i6>=4=53b>65<5=;36>=4=534>65<5=;=6>=4=536>65<5=;?6>=4=530>65<5=;96>=4=532>65<5=;;6>=4=52e>65<5=:o6>=4=52`>65<5=:i6>=4=52b>65<5=:26>=4=52;>65<5=:<6>=4=525>65<5=:>6>=4=527>65<5=:96>=4=522>65<5=:;6>=4=2de>65<5:ln6>=4=2dg>65<5:lh6>=4=2da>65<5:lj6>=4=2d:>65<5:l<6>=4=2d5>65<5:l>6>=4=2d7>65<5:l86>=4=2d1>65<5:l:6>=4=2d3>65<5:om6>=4=2gf>65<5:oh6>=4=2ga>65<5:oj6>=4=2g:>65<5:o36>=4=2g4>65<5:o=6>=4=2fa>65<5:n;6>=4=2a6>65<5=9j6>=4=50e>65<5=8?6>=4=53:>65<5=:n6>=4=520>65<5:l36>=4=2gg>65<5:i?6>=4=2a0>65<5;o=6?7m;|q720<72;q6?h;53`9>0f>=k91v98;:18185b<39j70:l8;`e?xu3>:0;6?u23d197d=:<j21nh5rs541>5<5s49n>7=n;<6`<?dd3ty?:<4?:3y>7`7=;h168n65bc9~w1072909w0=j0;1b?82d03hj7p};5g83>7}:;ml1?l524b:9f<=z{=?n6=4={<1ga?5f34>h47l8;|q71a<72;q6?ij53`9>0f>=j?1v9;l:18185ck39j70:l8;`6?xu3=h0;6?u23ec97d=:<j21n95rs57:>5<5s49o57=n;<6`<?d43ty?954?:3y>7a>=;h168n65b09~w1302909w0=k7;1b?82d03h;7p};5783>7}:;m<1?l524b:9e`=z{=?>6=4={<1g1?5f34>h47ok;|q711<72;q6?i:53`9>0f>=ij1v9;<:18185c;39j70:l8;ca?xu3=;0;6?u23e097d=:<j21ml5rs572>5<5s49o=7=n;<6`<?g>3ty?8k4?:3y>7f`=;h168n65a99~w12b2909w0=le;1b?82d03k=7p};4e83>7}:;jn1?l524b:9e0=z{=>h6=4={<1`g?5f34>h47o;;|q70g<72;q6?nl53`9>0f>=i:1v9:n:18185di39j70:l8;c1?xu3<00;6?u23b;97d=:<j21m<5rs56;>5<5s49h47=n;<6`<?g73ty?8:4?:3y>7f1=;h168n659g9~w1212909w0=l6;1b?82d033o7p};c483>7}:<=>1?l524b:9=g=z{=i?6=4={<677?5f34>h477n;|q7g6<72;q689<53`9>0f>=101v9m=:181823939j70:l8;;;?xu3k80;6?u245297d=:<j215:5rs5a3>5<5s4>8j7=n;<6`<??13ty?nk4?:3y>06c=;h168n65959~w1db2909w0:<d;1b?82d03387p};be83>7}:<:i1?l524b:9=7=z{=hh6=4={<60f?5f34>h477?;|q7fd<72;q68>753`9>0f>=0o1v9l6:181824039j70:l8;:f?xu3j10;6?u242597d=:<j214i5rs5`4>5<5s4>8:7=n;<6`<?>e3ty?n;4?:3y>063=;h168n658`9~w1d22909w0:<4;1b?82d03227p};b583>7}:<:91?l524b:9<==z{=h86=4={<606?5f34>h4768;|q7f7<72;q68>?53`9>0f>=k?1v9l>:181824839j70:l8;a6?xu3io0;6?u243g97d=:<j21o95rs5cf>5<5s4>9h7=n;<6`<?e43ty?mi4?:3y>07e=;h168n65be9~w1gd2909w0:=b;1b?82d03h97p};ac83>7}:<;k1?l524b:9e2=z{=kj6=4={<61=?5f34>h477l;|q7e<<72;q68?653`9>0f>=181v9o7:181825?39j70:l8;:5?xu3i>0;6?u243497d=:<j=1ok5rs5c5>5<5s4>997=n;<6`3?e53ty?m94?:3y>075=;h168n95c19~w1g42909w0:=2;1b?82d?3hm7p};a383>7}:<;;1?l524b59f`=z{=k:6=4={<614?5f34>h;7ll;|q7e5<72;q68<h53`9>0f1=jk1v97i:181826m39j70:l7;`b?xu31l0;6?u240f97d=:<j=1n45rs5;g>5<5s4>:o7=n;<6`3?ec3ty?5n4?:3y>04d=;h168n95b99~w1?e2909w0:>a;1b?82d?3h<7p};9883>7}:<821?l524b59f3=z{=336=4={<623?5f34>h;7l:;|q7=2<72;q68<853`9>0f1=j=1v979:181826=39j70:l7;`0?xu31<0;6?u240697d=:<j=1n<5rs5;7>5<5s4>:?7=n;<6`3?d73ty?5>4?:3y>044=;h168n95cb9~w1?52909w0:>1;1b?82d?3km7p};9083>7}:<8:1?l524b59e`=z{=3;6=4={<63b?5f34>h;7ok;|q7<`<72;q68=j53`9>0f1=ij1v96k:181827k39j70:l7;ca?xu30j0;6?u241`97d=:<j=1ml5rs5:a>5<5s4>;m7=n;<6`3?g>3ty?4l4?:3y>05?=;h168n95a99~w1>>2909w0:?8;1b?82d?3ii7p};8983>7}:<9=1?l524b59e3=z{=2<6=4={<632?5f34>h;7o:;|q7<3<72;q68=;53`9>0f1=i=1v96::181827<39j70:l7;c0?xu30:0;6?u241097d=:<j=1m?5rs5:1>5<5s4>;=7=n;<6`3?g63ty?4<4?:3y>056=;h168n95a19~w1>72909w0=if;1b?82d?33m7p};7g83>7}:;oo1?l524b59gd=z{==n6=4={<1e`?5f34>h;77j;|q73a<72;q6?km53`9>0f1=1m1v99l:18185aj39j70:l7;;a?xu3?k0;6?u23gc97d=:<j=15l5rs55b>5<5s49m57=n;<6`3??>3ty?;54?:3y>7c1=;h168n95999~w1102909w0=i6;1b?82d?33<7p};7783>7}:;o?1?l524b59=3=z{==>6=4={<1e0?5f34>h;7m6;|q731<72;q6?k=53`9>0f1=1<1v99<:18185a:39j70:l7;;7?xu3?;0;6?u23g397d=:<j=15>5rs552>5<5s49m<7=n;<6`3??53ty?;=4?:3y>7``=;h168n95919~w10a2909w0=je;1b?82d?32m7p};6e83>7}:;li1?l524b59<`=z{=<h6=4={<1ff?5f34>h;76k;|q72g<72;q6?ho53`9>0f1=k11v98n:18185b139j70:l7;:`?xu3>00;6?u23d:97d=:<j=14o5rs54;>5<5s49n;7=n;<6`3?>f3ty?::4?:3y>7`0=;h168n95889~w1012909w0=kb;1b?82d?3237p};5c83>7}:;m:1?l524b59<2=z{=?;6=4={<1`1?5f34>h;7m9;|q7g3<72;q68>o53`9>0f1=k<1v9lm:181825n39j70:l7;a4?xu3j90;6?u243697d=:<j=1o95rs5c6>5<5s4>:57=n;<6`3?e43ty?5l4?:3y>05c=;h168n95be9~w1>a2909w0:?3;1b?82d?3h97p};8583>7}:;o21?l524b59e2=z{==26=4={<1f`?5f34>h;77l;|q72`<72;q6?n:53`9>0f1=181v9:::18185d;39j70:l7;:5?xu6nk0;6>u22g696<d<5;l86hk4=23e>`c<uz8m?7>52z?1b6<51k16>k75eg9~w7`e2909w0<ib;0:f>;5n00nh6s|33294?4|5:8;6?7m;<12b?cc3ty8=h4?:3y>74c=:0h01>?i:da8yv4ai3:1>v3=f`81=g=::o31ih5rs332>5<5s48m97<6b:?05c<bi2wx><m50;0x97`12;3i70=>f;ge?xu3k00;68u24bc96<d<5=i<6?m6;<6`3?4d027?o54=c89>0f>=:j20qp}:2983>7}Y=;201>>553:8 1c72;?j7p}87883>7}Y?>301>>576;8 1c72;<>7p}:d583>7}Y=<901>>55418 1c728337p}:d383>7}Y=<801>>55408 1c728k87p}:d083>7}Y=<;01>>55438 1c728kn7p}:d183>7}Y=<:01>>55428 1c728h27p}:cg83>7}Y==l01>>555d8 1c728ho7p}:cd83>7}Y==o01>>555g8 1c728hn7p}:ce83>7}Y==n01>>555f8 1c728hm7p}:cb83>7}Y==i01>>555a8 1c728i?7p}:cc83>7}Y==h01>>555`8 1c728im7p}:c`83>7}Y==k01>>555c8 1c728nj7p}:c983>7}Y==201>>555:8 1c728o>7p}:c683>7}Y===01>>55558 1c728l;7p}:c783>7}Y==<01>>55548 1c728li7p}:c483>7}Y==?01>>55578 1c72;:=7p}:c583>7}Y==>01>>55568 1c72;;:7p}:c283>7}Y==901>>55518 1c72;;h7p}:c383>7}Y==801>>55508 1c72;8<7p}:c083>7}Y==;01>>55538 1c72;997p}:c183>7}Y==:01>>55528 1c72;9o7p}:bg83>7}Y=:l01>>552d8 1c72;>37p}:be83>7}Y=:n01>>552f8 1c72;?;7p}:bb83>7}Y=:i01>>552a8 1c72;?97p}:bc83>7}Y=:h01>>552`8 1c72;?87p}:b`83>7}Y=:k01>>552c8 1c72;??7p}:b883>7}Y=:301>>552;8 1c72;?>7p}:b983>7}Y=:201>>552:8 1c72;?=7p}:b683>7}Y=:=01>>55258 1c72;?<7p}:b783>7}Y=:<01>>55248 1c72;?37p}:b483>7}Y=:?01>>55278 1c72;?27p}:b583>7}Y=:>01>>55268 1c72;?i7p}93583>7}Y=k801>>55c08 1c72;?h7p}93283>7}Y=k;01>>55c38 1c72;?o7p}93383>7}Y=k:01>>55c28 1c72;?n7p}93083>7}Y=hl01>>55`d8 1c72;?m7p}93183>7}Y=ho01>>55`g8 1c72;<;7p}92g83>7}Y=hn01>>55`f8 1c72;<:7p}92d83>7}Y=hi01>>55`a8 1c72;<97p}92e83>7}Y=hh01>>55``8 1c72;<87p}92b83>7}Y=hk01>>55`c8 1c72;<?7p}92c83>7}Y=h301>>55`;8 1c72;<=7p}92883>7}Y=h=01>>55`58 1c72;<<7p}92983>7}Y=h<01>>55`48 1c72;<37p}92683>7}Y=h?01>>55`78 1c72;<27p}92783>7}Y=h>01>>55`68 1c72;<j7p}92483>7}Y=h901>>55`18 1c72;<i7p}92583>7}Y=h801>>55`08 1c72;<h7p}92283>7}Y=h;01>>55`38 1c72;<o7p}92383>7}Y=h:01>>55`28 1c72;<n7p}92083>7}Y=0l01>>558d8 1c72;<m7p}92183>7}Y=0o01>>558g8 1c72;=;7p}91d83>7}Y=0i01>>558a8 1c72;=:7p}91e83>7}Y=0h01>>558`8 1c72;=97p}91b83>7}Y=0k01>>558c8 1c72;=87p}91c83>7}Y=0301>>558;8 1c72;=?7p}91`83>7}Y=0201>>558:8 1c72;=>7p}91883>7}Y=0=01>>55858 1c72;==7p}91983>7}Y=0<01>>55848 1c72;=<7p}91683>7}Y=0?01>>55878 1c72;=37p}91783>7}Y=0>01>>55868 1c72;=27p}91483>7}Y=0901>>55818 1c72;=j7p}91283>7}Y=0;01>>55838 1c72;=i7p}91383>7}Y=0:01>>55828 1c72;=h7p}91083>7}Y=1l01>>559d8 1c72;=o7p}91183>7}Y=1o01>>559g8 1c72;=n7p}90g83>7}Y=1n01>>559f8 1c72;=m7p}90d83>7}Y=1i01>>559a8 1c72;2;7p}90e83>7}Y=1h01>>559`8 1c72;2:7p}90b83>7}Y=1k01>>559c8 1c72;297p}90c83>7}Y=1301>>559;8 1c72;287p}90`83>7}Y=1201>>559:8 1c72;2?7p}90983>7}Y=1<01>>55948 1c72;2>7p}90683>7}Y=1?01>>55978 1c72;2=7p}90783>7}Y=1>01>>55968 1c72;2<7p}90483>7}Y=1901>>55918 1c72;237p}90583>7}Y=1801>>55908 1c72;227p}90283>7}Y=1;01>>55938 1c72;2j7p}90383>7}Y=1:01>>55928 1c72;2i7p}90083>7}Y=>l01>>556d8 1c72;2h7p}90183>7}Y=>o01>>556g8 1c72;2o7p}:fg83>7}Y=>n01>>556f8 1c72;2n7p}:fe83>7}Y=>h01>>556`8 1c72;2m7p}:fb83>7}Y=>k01>>556c8 1c72;3;7p}:fc83>7}Y=>301>>556;8 1c72;3:7p}:f`83>7}Y=>201>>556:8 1c72;397p}:f883>7}Y=>=01>>55658 1c72;387p}:f983>7}Y=><01>>55648 1c72;3?7p}:f683>7}Y=>?01>>55678 1c72;3>7p}:f783>7}Y=>>01>>55668 1c72;3=7p}:f483>7}Y=>901>>55618 1c72;3<7p}:f583>7}Y=>801>>55608 1c7282n7p}:f383>7}Y=>:01>>55628 1c7282m7p}:f083>7}Y=?l01>>557d8 1c7283;7p}:f183>7}Y=?o01>>557g8 1c7283:7p}:eg83>7}Y=?n01>>557f8 1c728397p}:ed83>7}Y=?i01>>557a8 1c728387p}:ee83>7}Y=?h01>>557`8 1c7283?7p}:eb83>7}Y=?k01>>557c8 1c7283>7p}:ec83>7}Y=?301>>557;8 1c7283=7p}:e`83>7}Y=?201>>557:8 1c7283<7p}:e883>7}Y=?=01>>55758 1c728327p}:e683>7}Y=??01>>55778 1c7283j7p}:e783>7}Y=?>01>>55768 1c7283i7p}:e483>7}Y=?901>>55718 1c7283h7p}:e583>7}Y=?801>>55708 1c7283o7p}:e283>7}Y=?;01>>55738 1c7283n7p}:e383>7}Y=?:01>>55728 1c7283m7p}:e083>7}Y=<l01>>554d8 1c728k;7p}:e183>7}Y=<o01>>554g8 1c728k:7p}:dg83>7}Y=<n01>>554f8 1c728k97p}:dd83>7}Y=<i01>>554a8 1c728k?7p}:db83>7}Y=<k01>>554c8 1c728k>7p}:dc83>7}Y=<301>>554;8 1c728k=7p}:d`83>7}Y=<201>>554:8 1c728k<7p}:d883>7}Y=<=01>>55458 1c728k37p}:d983>7}Y=<<01>>55448 1c728k27p}:d683>7}Y=<?01>>55478 1c728kj7p}:d783>7}Y=<>01>>55468 1c728ki7p}:d483>7}Y==301>>555;8 1c728kh7p}:c883>7}Y=:o01>>552g8 1c728ko7p}:bd83>7}Y=:901>>55218 1c728km7p}93483>7}Y=h201>>55`:8 1c728h;7p}92`83>7}Y=0n01>>558f8 1c728h:7p}91g83>7}Y=0801>>55808 1c728h97p}91583>7}Y=1=01>>55958 1c728h87p}90883>7}Y=>i01>>556a8 1c728h?7p}:fd83>7}Y=>;01>>55638 1c728h>7p}:f283>7}Y=?<01>>55748 1c728h=7p}:e983>7}Y=<h01>>554`8 1c728h<7p}:de83>7}Y=:801>>55208 1c728h37p}:b283>7}Y=:;01>>55238 1c728hj7p}88883>7}Y?1301>>579;8 1c728hi7p}87683>7}Y?>=01>>57658 1c728hh7p}9d883>7}Y><201>>564:8 1c728i;7p}9d683>7}Y><=01>>56458 1c728i:7p}9d783>7}Y><<01>>56448 1c728i97p}9d483>7}Y><?01>>56478 1c728i87p}9d583>7}Y><>01>>56468 1c728i>7p}9d283>7}Y><901>>56418 1c728i=7p}9d383>7}Y><801>>56408 1c728i<7p}9d083>7}Y><;01>>56438 1c728i37p}9d183>7}Y><:01>>56428 1c728i27p}9cg83>7}Y>=l01>>565d8 1c728ij7p}9ce83>7}Y>=n01>>565f8 1c728ii7p}9cb83>7}Y>=i01>>565a8 1c728ih7p}9cc83>7}Y>=h01>>565`8 1c728io7p}9c`83>7}Y>=k01>>565c8 1c728in7p}9c883>7}Y>=301>>565;8 1c728n;7p}9c983>7}Y>=201>>565:8 1c728n:7p}9c683>7}Y>==01>>56558 1c728n97p}9c783>7}Y>=<01>>56548 1c728n87p}9c483>7}Y>=?01>>56578 1c728n?7p}9c583>7}Y>=>01>>56568 1c728n>7p}9c383>7}Y>=801>>56508 1c728n=7p}9c083>7}Y>=;01>>56538 1c728n<7p}9c183>7}Y>=:01>>56528 1c728n37p}9bg83>7}Y>:l01>>562d8 1c728n27p}9bd83>7}Y>:o01>>562g8 1c728ni7p}9be83>7}Y>:n01>>562f8 1c728nh7p}9bb83>7}Y>:i01>>562a8 1c728no7p}9bc83>7}Y>:h01>>562`8 1c728nn7p}9b`83>7}Y>:k01>>562c8 1c728nm7p}9b883>7}Y>:301>>562;8 1c728o;7p}83883>7}Y>k=01>>56c58 1c728o:7p}83983>7}Y>k<01>>56c48 1c728o97p}83683>7}Y>k?01>>56c78 1c728o87p}83783>7}Y>k>01>>56c68 1c728o?7p}83483>7}Y>k901>>56c18 1c728o=7p}83583>7}Y>k801>>56c08 1c728o<7p}83283>7}Y>k;01>>56c38 1c728o37p}83383>7}Y>k:01>>56c28 1c728o27p}83083>7}Y>hl01>>56`d8 1c728oj7p}83183>7}Y>ho01>>56`g8 1c728oi7p}82d83>7}Y>hi01>>56`a8 1c728oh7p}82e83>7}Y>hh01>>56``8 1c728oo7p}82b83>7}Y>hk01>>56`c8 1c728on7p}82c83>7}Y>h301>>56`;8 1c728om7p}82`83>7}Y>h201>>56`:8 1c728l:7p}82883>7}Y>h=01>>56`58 1c728l97p}82983>7}Y>h<01>>56`48 1c728l87p}82683>7}Y>h?01>>56`78 1c728l?7p}82783>7}Y>h>01>>56`68 1c728l>7p}82483>7}Y>h901>>56`18 1c728l=7p}82283>7}Y>h;01>>56`38 1c728l<7p}82383>7}Y>h:01>>56`28 1c728l37p}82083>7}Y>0l01>>568d8 1c728l27p}82183>7}Y>0o01>>568g8 1c728lj7p}81g83>7}Y>0n01>>568f8 1c728lh7p}81d83>7}Y>0i01>>568a8 1c728lo7p}81e83>7}Y>0h01>>568`8 1c728ln7p}81b83>7}Y>0k01>>568c8 1c728lm7p}81c83>7}Y>0301>>568;8 1c72;:;7p}81`83>7}Y>0201>>568:8 1c72;::7p}81983>7}Y>0<01>>56848 1c72;:97p}81683>7}Y>0?01>>56878 1c72;:87p}81783>7}Y>0>01>>56868 1c72;:?7p}81483>7}Y>0901>>56818 1c72;:>7p}81583>7}Y>0801>>56808 1c72;:<7p}81283>7}Y>0;01>>56838 1c72;:37p}81383>7}Y>0:01>>56828 1c72;:27p}81083>7}Y>1l01>>569d8 1c72;:j7p}81183>7}Y>1o01>>569g8 1c72;:i7p}80g83>7}Y>1n01>>569f8 1c72;:h7p}80e83>7}Y>1h01>>569`8 1c72;:o7p}80b83>7}Y>1k01>>569c8 1c72;:n7p}80c83>7}Y>1301>>569;8 1c72;:m7p}80`83>7}Y>1201>>569:8 1c72;;;7p}80883>7}Y>1=01>>56958 1c72;;97p}80983>7}Y>1<01>>56948 1c72;;87p}80683>7}Y>1?01>>56978 1c72;;?7p}80783>7}Y>1>01>>56968 1c72;;>7p}80483>7}Y>1901>>56918 1c72;;=7p}80583>7}Y>1801>>56908 1c72;;<7p}80383>7}Y>1:01>>56928 1c72;;37p}80083>7}Y>>l01>>566d8 1c72;;27p}80183>7}Y>>o01>>566g8 1c72;;j7p}9fg83>7}Y>>n01>>566f8 1c72;;i7p}9fd83>7}Y>>i01>>566a8 1c72;;o7p}9fe83>7}Y>>h01>>566`8 1c72;;n7p}9fb83>7}Y>>k01>>566c8 1c72;;m7p}9fc83>7}Y>>301>>566;8 1c72;8;7p}9f`83>7}Y>>201>>566:8 1c72;8:7p}9f883>7}Y>>=01>>56658 1c72;897p}9f683>7}Y>>?01>>56678 1c72;887p}9f783>7}Y>>>01>>56668 1c72;8?7p}9f483>7}Y>>901>>56618 1c72;8>7p}9f583>7}Y>>801>>56608 1c72;8=7p}9f283>7}Y>>;01>>56638 1c72;837p}9f383>7}Y>>:01>>56628 1c72;827p}9f083>7}Y>?l01>>567d8 1c72;8j7p}9f183>7}Y>?o01>>567g8 1c72;8i7p}9eg83>7}Y>?n01>>567f8 1c72;8h7p}9ed83>7}Y>?i01>>567a8 1c72;8o7p}9eb83>7}Y>?k01>>567c8 1c72;8n7p}9ec83>7}Y>?301>>567;8 1c72;8m7p}9e`83>7}Y>?201>>567:8 1c72;9;7p}9e883>7}Y>?=01>>56758 1c72;9:7p}9e983>7}Y>?<01>>56748 1c72;987p}9e683>7}Y>??01>>56778 1c72;9?7p}9e783>7}Y>?>01>>56768 1c72;9>7p}9e483>7}Y>?901>>56718 1c72;9=7p}9e583>7}Y>?801>>56708 1c72;9<7p}9e283>7}Y>?;01>>56738 1c72;937p}9e083>7}Y><l01>>564d8 1c72;927p}9e183>7}Y><o01>>564g8 1c72;9j7p}9dg83>7}Y><n01>>564f8 1c72;9i7p}9dd83>7}Y><i01>>564a8 1c72;9h7p}9de83>7}Y><h01>>564`8 1c72;9n7p}9db83>7}Y><k01>>564c8 1c72;9m7p}9dc83>7}Y><301>>564;8 1c72;>;7p}9d`83>7}Y>=o01>>565g8 1c72;>:7p}9cd83>7}Y>=901>>56518 1c72;>97p}9c283>7}Y>:201>>562:8 1c72;>87p}83`83>7}Y>hn01>>56`f8 1c72;>?7p}82g83>7}Y>h801>>56`08 1c72;>>7p}82583>7}Y>0=01>>56858 1c72;>=7p}81883>7}Y>1i01>>569a8 1c72;><7p}80d83>7}Y>1;01>>56938 1c72;>27p}80283>7}Y>><01>>56648 1c72;>j7p}9f983>7}Y>?h01>>567`8 1c72;>i7p}9ee83>7}Y>?:01>>56728 1c72;>h7p}9e383>7}Y>:=01>>56258 1c72;>o7p}9b983>7}Y>:<01>>56248 1c72;>n7p}83d83>7}Y?:o01>>572g8 1c72;>m7p}83b83>7}Y?:i01>>572a8 1c72;?:7psaae294?4|@=o:7p`nd083>7}O<l;0qcok2;296~N3m81vblj<:181M2b92wemi:50;0xL1c63tdjh84?:3yK0`7<ugko:7>52zJ7a4=zfhn<6=4={I6f5>{iim21<7<tH5g2?xhfl00;6?uG4d38ykgci3:1>vF;e09~jdbe2909wE:j1:meae=838pD9k>;|lb`a<72;qC8h?4}ocga?6=:rB?i<5rn`fe>5<5sA>n=6saad294?4|@=o:7p`ne083>7}O<l;0qcoj2;296~N3m81vblk<:181M2b92wemh:50;0xL1c63tdji84?:3yK0`7<ugkn:7>52zJ7a4=zfho<6=4={I6f5>{iil21<7<tH5g2?xhfm00;6?uG4d38ykgbi3:1>vF;e09~jdce2909wE:j1:me`e=838pD9k>;|lbaa<72;qC8h?4}ocfa?6=:rB?i<5rn`ge>5<5sA>n=6saag294?4|@=o:7p`nf083>7}O<l;0qcoi2;296~N3m81vblh<:181M2b92wemk:50;0xL1c63tdjj84?:3yK0`7<ugkm:7>52zJ7a4=zfhl<6=4={I6f5>{iio21<7<tH5g2?xhfn00;6?uG4d38ykgai3:1>vF;e09~jd`e2909wE:j1:mece=838pD9k>;|lbba<72;qC8h?4}ocea?6=:rB?i<5rn`de>5<5sA>n=6sab1294?4|@=o:7p`m0083>7}O<l;0qcl?2;296~N3m81vbo><:181M2b92wen=:50;0xL1c63tdi<84?:3yK0`7<ugh;:7>52zJ7a4=zfk:<6=4={I6f5>{ij921<7<tH5g2?xhe800;6?uG4d38ykd7i3:1>vF;e09~jg6e2909wE:j1:mf5e=838pD9k>;|la4a<72;qC8h?4}o`3a?6=:rB?i<5rnc2e>5<5sA>n=6sab0294?4|@=o:7p`m1083>7}O<l;0qcl>2;296~N3m81vbo?<:181M2b92wen<:50;0xL1c63tdi=84?:3yK0`7<ugh::7>52zJ7a4=zfk;<6=4={I6f5>{ij821<7<tH5g2?xhe900;6?uG4d38ykd6i3:1>vF;e09~jg7e2909wE:j1:mf4e=838pD9k>;|la5a<72;qC8h?4}o`2a?6=:rB?i<5rnc3e>5<5sA>n=6sab3294?4|@=o:7p`m2083>7}O<l;0qcl=2;296~N3m81vbo<<:181M2b92wen?:50;0xL1c63tdi>84?:3yK0`7<ugh9:7>52zJ7a4=zfk8<6=4={I6f5>{ij;21<7<tH5g2?xhe:00;6?uG4d38ykd5i3:1>vF;e09~jg4e2909wE:j1:mf7e=838pD9k>;|la6a<72;qC8h?4}o`1a?6=:rB?i<5rnc0e>5<5sA>n=6sab2294?4|@=o:7p`m3083>7}O<l;0qcl<2;296~N3m81vbo=<:181M2b92wen>:50;0xL1c63tdi?84?:3yK0`7<ugh8:7>52zJ7a4=zfk9<6=4={I6f5>{ij:21<7<tH5g2?xhe;00;6?uG4d38ykd4i3:1>vF;e09~jg5e2909wE:j1:mf6e=838pD9k>;|la7a<72;qC8h?4}o`0a?6=:rB?i<5rnc1e>5<5sA>n=6sab5294?4|@=o:7p`m4083>7}O<l;0qcl;2;296~N3m81vbo:<:181M2b92wen9:50;0xL1c63tdi884?:3yK0`7<ugh?:7>52zJ7a4=zfk><6=4={I6f5>{ij=21<7<tH5g2?xhe<00;6?uG4d38ykd3i3:1>vF;e09~jg2e2909wE:j1:mf1e=838pD9k>;|la0a<72;qC8h?4}o`7a?6=:rB?i<5rnc6e>5<5sA>n=6sab4294?4|@=o:7p`m5083>7}O<l;0qcl:2;296~N3m81vbo;<:181M2b92wen8:50;0xL1c63tdi984?:3yK0`7<ugh>:7>52zJ7a4=zfk?<6=4={I6f5>{ij<21<7<tH5g2?xhe=00;6?uG4d38ykd2i3:1>vF;e09~jg3e2909wE:j1:mf0e=838pD9k>;|la1a<72;qC8h?4}o`6a?6=:rB?i<5rnc7e>5<5sA>n=6sab7294?4|@=o:7p`m6083>7}O<l;0qcl92;296~N3m81vbo8<:181M2b92wen;:50;0xL1c63tdi:84?:3yK0`7<ugh=:7>52zJ7a4=zfk<<6=4={I6f5>{ij?21<7<tH5g2?xhe>00;6?uG4d38ykd1i3:1>vF;e09~jg0e2909wE:j1:mf3e=838pD9k>;|la2a<72;qC8h?4}o`5a?6=:rB?i<5rnc4e>5<5sA>n=6sab6294?4|@=o:7p`m7083>7}O<l;0qcl82;296~N3m81vbo9<:181M2b92wen::50;0xL1c63tdi;84?:3yK0`7<ugh<:7>52zJ7a4=zfk=<6=4={I6f5>{ij>21<7<tH5g2?xhe?00;6?uG4d38ykd0i3:1>vF;e09~jg1e2909wE:j1:mf2e=838pD9k>;|la3a<72;qC8h?4}o`4a?6=:rB?i<5rnc5e>5<5sA>n=6sab9294?4|@=o:7p`m8083>7}O<l;0qcl72;296~N3m81vbo6<:181M2b92wen5:50;0xL1c63tdi484?:3yK0`7<ugh3:7>52zJ7a4=zfk2<6=4={I6f5>{ij121<7<tH5g2?xhe000;6?uG4d38ykd?i3:1>vF;e09~jg>e2909wE:j1:mf=e=838pD9k>;|la<a<72;qC8h?4}o`;a?6=:rB?i<5rnc:e>5<5sA>n=6sab8294?4|@=o:7p`m9083>7}O<l;0qcl62;296~N3m81vbo7<:181M2b92wen4:50;0xL1c63tdi584?:3yK0`7<ugh2:7>52zJ7a4=zfk3<6=4={I6f5>{ij021<7<tH5g2?xhe100;6?uG4d38ykd>i3:1>vF;e09~jg?e2909wE:j1:mf<e=838pD9k>;|la=a<72;qC8h?4}o`:a?6=:rB?i<5rnc;e>5<5sA>n=6sab`294?4|@=o:7p`ma083>7}O<l;0qcln2;296~N3m81vboo<:181M2b92wenl:50;0xL1c63tdim84?:3yK0`7<ughj:7>52zJ7a4=zfkk<6=4={I6f5>{ijh21<7<tH5g2?xhei00;6?uG4d38ykdfi3:1>vF;e09~jgge2909wE:j1:mfde=838pD9k>;|laea<72;qC8h?4}o`ba?6=:rB?i<5rncce>5<5sA>n=6sabc294?4|@=o:7p`mb083>7}O<l;0qclm2;296~N3m81vbol<:181M2b92weno:50;0xL1c63tdin84?:3yK0`7<ughi:7>52zJ7a4=zfkh<6=4={I6f5>{ijk21<7<tH5g2?xhej00;6?uG4d38ykdei3:1>vF;e09~jgde2909wE:j1:mfge=838pD9k>;|lafa<72;qC8h?4}o`aa?6=:rB?i<5rnc`e>5<5sA>n=6sabb294?4|@=o:7p`mc083>7}O<l;0qcll2;296~N3m81vbom<:181M2b92wenn:50;0xL1c63tdio84?:3yK0`7<ughh:7>52zJ7a4=zfki<6=4={I6f5>{ijj21<7<tH5g2?xhek00;6?uG4d38ykddi3:1>vF;e09~jgee2909wE:j1:mffe=838pD9k>;|laga<72;qC8h?4}o``a?6=:rB?i<5rncae>5<5sA>n=6sabe294?4|@=o:7p`md083>7}O<l;0qclk2;296~N3m81vboj<:181M2b92weni:50;0xL1c63tdih84?:3yK0`7<ugho:7>52zJ7a4=zfkn<6=4={I6f5>{ijm21<7<tH5g2?xhel00;6?uG4d38yk?793:1=vF;e09~jd6f290:wE:j1:me5d=83;pD9k>;|lb4f<728qC8h?4}oc3`?6=9rB?i<5rn`2f>5<6sA>n=6saa1d94?7|@=o:7p`n1183>4}O<l;0qco>1;295~N3m81vbl?=:182M2b92wem<=50;3xL1c63tdj=94?:0yK0`7<ugk:97>51zJ7a4=zfh;=6=4>{I6f5>{ii8=1<7?tH5g2?xhf910;6<uG4d38ykg613:1=vF;e09~jd7f290:wE:j1:me4d=83;pD9k>;|lb5f<728qC8h?4}oc2`?6=9rB?i<5rn`3f>5<6sA>n=6saa0d94?7|@=o:7p`n2183>4}O<l;0qco=1;295~N3m81vbl<=:182M2b92wem?=50;3xL1c63tdj>94?:0yK0`7<ugk997>51zJ7a4=zfh8=6=4>{I6f5>{ii;=1<7?tH5g2?xhf:10;6<uG4d38ykg513:1=vF;e09~jd4f290:wE:j1:me7d=83;pD9k>;|lb6f<728qC8h?4}oc1`?6=9rB?i<5rn`0f>5<6sA>n=6saa3d94?7|@=o:7p`n3183>4}O<l;0qco<1;295~N3m81vbl==:182M2b92wem>=50;3xL1c63tdj?94?:0yK0`7<ugk897>51zJ7a4=zfh9=6=4>{I6f5>{ii:=1<7?tH5g2?xhf;10;6<uG4d38ykg413:1=vF;e09~jd5f290:wE:j1:me6d=83;pD9k>;|lb7f<728qC8h?4}oc0`?6=9rB?i<5rn`1f>5<6sA>n=6saa2d94?7|@=o:7p`n4183>4}O<l;0qco;1;295~N3m81vbl:=:182M2b92wem9=50;3xL1c63tdj894?:0yK0`7<ugk?97>51zJ7a4=zfh>=6=4>{I6f5>{ii==1<7?tH5g2?xhf<10;6<uG4d38ykg313:1=vF;e09~jd2f290:wE:j1:me1d=83;pD9k>;|lb0f<728qC8h?4}oc7`?6=9rB?i<5rn`6f>5<6sA>n=6saa5d94?7|@=o:7p`n5183>4}O<l;0qco:1;295~N3m81vbl;=:182M2b92wem8=50;3xL1c63tdj994?:0yK0`7<ugk>97>51zJ7a4=zfh?=6=4>{I6f5>{ii<=1<7?tH5g2?xhf=10;6<uG4d38ykg213:1=vF;e09~jd3f290:wE:j1:me0d=83;pD9k>;|lb1f<728qC8h?4}oc6`?6=9rB?i<5rn`7f>5<6sA>n=6saa4d94?7|@=o:7p`n6183>4}O<l;0qco91;295~N3m81vbl8=:182M2b92wem;=50;3xL1c63tdj:94?:0yK0`7<ugk=97>51zJ7a4=zfh<=6=4>{I6f5>{ii?=1<7?tH5g2?xhf>10;6<uG4d38ykg113:1=vF;e09~jd0f290:wE:j1:me3d=83;pD9k>;|lb2f<728qC8h?4}oc5`?6=9rB?i<5rn`4f>5<6sA>n=6saa7d94?7|@=o:7p`n7183>4}O<l;0qco81;295~N3m81vbl9=:182M2b92wem:=50;3xL1c63tdj;94?:0yK0`7<ugk<97>51zJ7a4=zfh==6=4>{I6f5>{ii>=1<7?tH5g2?xhf?10;6<uG4d38ykg013:1=vF;e09~jd1f290:wE:j1:me2d=83;pD9k>;|lb3f<728qC8h?4}oc4`?6=9rB?i<5rn`5f>5<6sA>n=6saa6d94?7|@=o:7p`n8183>4}O<l;0qco71;295~N3m81vbl6=:182M2b92wem5=50;3xL1c63tdj494?:0yK0`7<ugk397>51zJ7a4=zfh2=6=4>{I6f5>{ii1=1<7?tH5g2?xhf010;6<uG4d38ykg?13:1=vF;e09~jd>f290:wE:j1:me=d=83;pD9k>;|lb<f<728qC8h?4}oc;`?6=9rB?i<5rn`:f>5<6sA>n=6saa9d94?7|@=o:7p`n9183>4}O<l;0qco61;295~N3m81vbl7=:182M2b92wem4=50;3xL1c63tdj594?:0yK0`7<ugk297>51zJ7a4=zfh3=6=4>{I6f5>{ii0=1<7?tH5g2?xhf110;6<uG4d38ykg>13:1=vF;e09~jd?f290:wE:j1:me<d=83;pD9k>;|lb=f<728qC8h?4}oc:`?6=9rB?i<5rn`;f>5<6sA>n=6saa8d94?7|@=o:7p`na183>4}O<l;0qcon1;295~N3m81vblo=:182M2b92weml=50;3xL1c63tdjm94?:0yK0`7<ugkj97>51zJ7a4=zfhk=6=4>{I6f5>{iih=1<7?tH5g2?xhfi10;6<uG4d38ykgf13:1=vF;e09~jdgf290:wE:j1:medd=83;pD9k>;|lbef<728qC8h?4}ocb`?6=9rB?i<5rn`cf>5<6sA>n=6saa`d94?7|@=o:7p`nb183>4}O<l;0qcom1;295~N3m81vbll=:182M2b92wemo=50;3xL1c63tdjn94?:0yK0`7<ugki97>51zJ7a4=zfhh=6=4>{I6f5>{iik=1<7?tH5g2?xhfj10;6<uG4d38ykge13:1=vF;e09~jddf290:wE:j1:megd=83;pD9k>;|lbff<728qC8h?4}oca`?6=9rB?i<5rn``f>5<6sA>n=6saacd94?7|@=o:7p`nc183>4}O<l;0qcol1;295~N3m81vblm=:182M2b92wemn=50;3xL1c63tdjo94?:0yK0`7<ugkh97>51zJ7a4=zfhi=6=4>{I6f5>{iij=1<7?tH5g2?xhfk10;6<uG4d38ykgd13:1=vF;e09~jdef290:wE:j1:mefd=83;pD9k>;|lbgf<728qC8h?4}oc``?6=9rB?i<5rn`af>5<6sA>n=6saabd94?7|@=o:7psr}AB@age20n:<<jj2|BCF~6zHIZpqMN
Index: trunk/synplicity/rev_1/synplicity.ucf
===================================================================
--- trunk/synplicity/rev_1/synplicity.ucf	(revision 10)
+++ trunk/synplicity/rev_1/synplicity.ucf	(revision 10)
@@ -0,0 +1,21 @@
+#
+# Constraints generated by Synplify Pro maprc, Build 312R
+#
+
+# Period Constraints
+
+#Begin clock constraints
+NET "clk_in" TNM_NET = "clk_in"; 
+TIMESPEC "TS_clk_in" = PERIOD "clk_in" 10.705 ns HIGH 50.00%; 
+#End clock constraints
+
+
+
+# I/O Registers Packing Constraints
+INST "flash/wb_dat[*]" IOB=FALSE; # flash/wb_dat[63:0]
+INST "flash/wb1_dat[*]" IOB=FALSE; # flash/wb1_dat[63:0]
+
+# I/O Registers Packing Constraints
+INST "uart16550/regs/i_uart_sync_flops/flop_0[0]" IOB=FALSE;
+
+# End of generated constraints
Index: trunk/synplicity/rev_1/run_ise.tcl
===================================================================
--- trunk/synplicity/rev_1/run_ise.tcl	(revision 10)
+++ trunk/synplicity/rev_1/run_ise.tcl	(revision 10)
@@ -0,0 +1,40 @@
+#########################
+###  DEFINE VARIABLES ###
+#########################
+set DesignName	"W1"
+set FamilyName	"VIRTEX5"
+set DeviceName	"XC5VLX110T"
+set PackageName	"FF1136"
+set SpeedGrade	"-1"
+set TopModule	"W1"
+set EdifFile	"W1.edf"
+if {![file exists $DesignName.xise]} {
+
+project new $DesignName.xise
+
+project set family $FamilyName
+project set device $DeviceName
+project set package $PackageName
+project set speed $SpeedGrade
+
+xfile add $EdifFile
+if {[file exists synplicity.ucf]} {
+    xfile add synplicity.ucf
+}
+
+project set "Netlist Translation Type" "Timestamp"
+project set "Other NGDBuild Command Line Options" "-verbose"
+project set "Generate Detailed MAP Report" TRUE
+
+project close
+}
+
+
+file delete -force $DesignName\_xdb
+
+project open $DesignName.xise
+
+process run "Implement Design" -force rerun_all
+
+project close
+
Index: trunk/synplicity/rev_1/dram_fifo.ngc
===================================================================
--- trunk/synplicity/rev_1/dram_fifo.ngc	(revision 10)
+++ trunk/synplicity/rev_1/dram_fifo.ngc	(revision 10)
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.6e
+$6:040<,[o}e~g`n;"2*726&;$?,)?40893456789:;8=5?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>>;0185+66<2;;87GAPTV9`lh;9991<3?9;027>JSSX\^1hb{{<020>586n2;;6D@_UU8svjaXmdzuRzgrdqk8<<76;<0==4FNQWW>uthoVof|ywPtipfwmYf{zoyx1750?05?46=AGZ^X7~}of]fiur~W}byi~fPndebp`:>294:i6??:HLSQQ<wzfmTjxbc_ujqavn;13:5>85>0;KMTPR=x{elSk{cl^vkv`uoWhyxiz39;2=60=683CE\XZ5psmd[cskdV~c~h}g_ogdeqc;13:5=45>0;MVPUSS2mkmRm`uov?=?699j1:<7AZTQWW>wbXlh~jSnaznu>:>586=2;>6D@_UU8B@ATF]5;?6=0>5:36>LHW]]0JHI\MU=37>586=2;=6D@_UU8B@ATFD5;>6=0>5:35>LHW]]0JHI\ML=36>5863;;97><5IORVP?BNI59:6=0>2:11>LHW]]0OEO2<1;2=56=4:3E^X][[:EMB867=87;87><5OTVSQQ<CGK68=7>18:10766589;:794FNQWW>AOWI591<3?>;58JJUSS2MC[N1=50?32?1<NFY__6ZKNL=194;763=0BB][[:VGBQ95=87;9794@UURVP?BHXH686=0>2:69KPRW]]0OC]L33;2=55=2~er:==zif0302(563?>0:4791195=<0>>?32:;799847?=2598;047GAPTV9S@DK4>0;2<?48;KMTPR=_LH^0:4?>0`8<?IR\Y__6z|Pd`vb[firf}6<6=0>;868=56>:23=4679684:=3?<IMNYMA2?>`9B@ATFD5;;2l5NDEPBH9766h1JHI\NL=31:d=FLMXJ@1?<>`9B@ATFD5;?2n5NDEPBH972294j7LJKR@N?508>3HNO^LB31?;8EABUIE69245NDEPBH95912KOH_OC<5<:?DBCZHF79374AEFQEI:1601JHI\NL=5==>GCL[KG0506;@FGVDJ;1730MIJ]AT>3:d=FLMXJY1??>`9B@ATF]5;:2l5NDEPBQ9756h1JHI\NU=30:f=FLMXJY1?;:1<b?DBCZH_7=906;@FGVDS;9730MIJ]AT>1:<=FLMXJY1=19:CG@WGR4=427LJKR@W?1;?<IMNYMX29>89B@ATF]5=556OKDSCV8=8>3HNO^L[39?;8EABUJE6;2l5NDEPAH9776h1JHI\ML=32:d=FLMXI@1?=>`9B@ATED5;82l5NDEPAH9736j1JHI\ML=36>58f3HNO^OB314<:?DBCZKF7=374AEFQFI:5601JHI\ML=1==>GCL[HG0906;@FGVGJ;=730MIJ]BM>5:<=FLMXI@1919:CG@WDK41427LJKRCN?=;?<IMNYNX2?>`9B@ATE]5;;2l5NDEPAQ9766h1JHI\MU=31:d=FLMXIY1?<>b9B@ATE]5;?6=0n;@FGVGS;9=427LJKRCW?5;?<IMNYNX2=>89B@ATE]59556OKDS@V818>3HNO^O[35?;8EABUJ\6=245NDEPAQ91912KOH_LZ<9<:?DBCZK_753=4AMN:?DU^FJUYIJ=4BT0;?GSTW@DMC<5Ld:ABWFGCM@DGMYOk;BCPGDBBAGFJXOj4C@Q@EACNF[OLMi5LARAB@@OIZLMIi6MNSBCGAJSSDH^Ji6MNSBCGAJSSDH^Ii6MNSBCGAJSSZLMJi6MNSBCGAJSSZLMI>6MJ139@L@ELWECHIC]J_U[SA7=DA<1H@FOC5:AOODS23JF@NA;4CMIAQ6=DD[30OBCBIUVF@42<KFXNSJKAESCWMJHXAGLD;6M]E@VF@4=C:2NB:6JFA=2=3>BNI5;;2:5KI@>25;1<L@K7=?08;EKB8459?2NBM1?;>69GMD:6=7=0HDO317<4?AOF48=5;6JFA=3;:2=CAH6:5384DHC?5;1<L@K7>=08;EKB8779?2NBM1<=>69GMD:5;7=0HDO325<4?AOF4;?5;6JFA=05:2=CAH69;394DHC?6=803MCJ0?716:FJE949?2NBM1=?>89GMD:493:5;6JFA=12:3=CAH682;5KI@>7:3=CAH6>2;5KI@>5:3=CAH6<2;5KI@>;:3=CAH622;5KIC>3:2=CAK6:<394DH@?54803MCI0<<17:FJF9746>1OEO2>4?58@LD;9<4<7IGM<04=3>BNJ5;<2:5KIC>2<;1<L@H7=409;EKA84803MCI0?>17:FJF9466>1OEO2=2?58@LD;::4<7IGM<36=3>BNJ58>2:5KIC>12;1<L@H7>:08;EKA87>9?2NBN1<6>79GMG:56>1OEO2<0?;8@LD;;80;2:5KIC>05;0<L@H7?384DH@?0;0<L@H79384DH@?2;0<L@H7;384DH@?<;0<L@H75394DHRB85803MC[M1?17:FJTD:5601OE]O33;2=3>BNXH682:5KIQ@?4;1<L@ZI0<08;EKSF94912NB\O2<:1<4?AOWJ595:6J@A=2=3>BHI5;;2:5KO@>25;1<LFK7=?08;EMB8459?2NDM1?;>69GKD:6=7=0HBO317<4?AIF48=5;6J@A=3;:2=CGH6:5384DNC?5;1<LFK7>=08;EMB8779?2NDM1<=>69GKD:5;7=0HBO325<4?AIF4;?5;6J@A=05:2=CGH69;394DNC?6=803MEJ0?716:FLE949?2NDM1=?>89GKD:493:5;6J@A=12:3=CGH682;5KO@>7:3=CGH6>2;5KO@>5:3=CGH6<2;5KO@>;:3=CGH622:5KO@]QAB0<LFH7<394DN@?55803MEI0<?17:FLF9756>1OCO2>3?58@JD;9=4<7IAM<07=3>BHJ5;=2:5KOC>23;1<LFH7=508;EMA84?9>2NDN1?17:FLF9476>1OCO2=1?58@JD;:;4<7IAM<31=3>BHJ58?2:5KOC>11;1<LFH7>;08;EMA8719?2NDN1<7>69GKG:517<0HBL32?58@JD;;9427IAM<2394;1<LFH7?<09;EMA86813MEI0909;EMA80813MEI0;09;EMA82813MEI0509;EMA8<803MEIS_KH7:FLTD:76>1OC]O31?58@JVF4;427IA_A=194;1<LFZJ0>08;EMSF969?2ND\O2>>69GKUD;:730HB^M<283:2=CGYH7?3:4EOCO0>CII\>0ICLC4:GMFP4<N=?0JLB\E39E@6=ALJ>0JIMJ3:DGT1=ALYO?7KH=009D7>AIL;1B<?5F139J67=N;;1B8?5F599JJLRWW9:37D@FTQ]35==NF@^[S=<7;HLJPUY7;11BBDZ__16;?LHN\YU;955FNHVS[50?3@DBX]Q?799JJLRWW9237D@FTQ]3===NF@^[S=O7;HLJPUY7J11BBDZ__1A;?LHN\YU;H55FNHVS[5C?3@DBX]Q?F89JJLRT\H^N;6GAIU]342=NF@^T<<94IOKW[5403@DBXR><7:KMMQY7<>1BBDZP0458MKOSW9<<7D@FT^243>OIA]U;4:5FNHV\4<1<AGC_S=O8;HLJPZ6E?2CEEYQ?C69JJLRX8M=0ECG[_1G4?LHN\V:M;6GAIU]242=NF@^T=<94IOKW[4403@DBXR?<7:KMMQY6<>1BBDZP1458MKOSW8<<7D@FT^343>OIA]U:4:5FNHV\5<1<AGC_S<O8;HLJPZ7E?2CEEYQ>C69JJLRX9M=0ECG[_0G4?LHN\V;M;6GAIU]142=NF@^T><94IOKW[7403@DBXR<<7:KMMQY5<>1BBDZP2458MKOSW;<<7D@FT^043>OIA]U94:5FNHV\6<1<AGC_S?O8;HLJPZ4E?2CEEYQ=C69JJLRX:M=0ECG[_3G4?LHN\V8M;6GAIU]042=NF@^T?<94IOKW[6403@DBXR=<7:KMMQY4<>1BBDZP3458MKOSW:<<7D@FT^143>OIA]U84:5FNHV\7<1<AGC_S>O8;HLJPZ5E?2CEEYQ<C69JJLRX;M=0ECG[_2G4?LHN\V9M;6GAIU]742=NF@^T8<94IOKW[1403@DBXR:<7:KMMQY3<>1BBDZP4458MKOSW=<<7D@FT^643>OIA]U?4:5FNHV\0<1<AGC_S9O8;HLJPZ2E?2CEEYQ;C69JJLRX<M=0ECG[_5G4?LHN\V>M;6GAIU]642=NF@^T9<94IOKW[0403@DBXR;<7:KMMQY2<>1BBDZP5458MKOSW<<<7D@FT^743>OIA]U>4:5FNHV\1<1<AGC_S8O8;HLJPZ3E?2CEEYQ:C69JJLRX=M=0ECG[_4G4?LHN\V?M;6GAIU]542=NF@^T:<94IOKW[3403@DBXR8<7:KMMQY1<>1BBDZP6458MKOSW?<<7D@FT^443>OIA]U=4:5FNHV\2<1<AGC_S;O8;HLJPZ0E?2CEEYQ9C69JJLRX>M=0ECG[_7G4?LHN\V<M;6GAIU]442=NF@^T;<94IOKW[2403@DBXR9<7:KMMQY0<>1BBDZP7458MKOSW><<7D@FT^543>OIA]U<4:5FNHV\3<1<AGC_S:O8;HLJPZ1E?2CEEYQ8C69JJLRX?M=0ECG[_6G4?LHN\V=M:6GAIU]B2>OIA]UI56GAIU]EMIC53EC=7AANDDF4?II@AJKG86BZT068HPR5<2F^X>:4LTV70>JR\<>0@XZ95:OPCJH23D_SOTm4M`hlvScu{`eeo6CfnnpUawungg80B<:4N0230>H688>0B<>=4:L2462<F8:?86@>0468J461<2D:<::4N02;0>H68090B<?;;O3241=I98;?7C?>259M54533G;:895A1077?K76>:1E=?=4N010?K73;2D:9>5A1718J4143G;386@>8168J4>6<2D:4?:4N0:00>H60=>0B<6:4:L2<32<F82<86@>8968J4>>;2D:595A1827?K7>9=1E=4<;;O3:71=I90>?7C?6559M5<033G;2;95A18:7?K7>1:1E>=:4N3230>H588>0B?>=4:L1462<F;:?86@=0468J761<2D9<::4N32;0>H58090B??;;O0241=I:8;?7C<>259M64533G8:895A2077?K46>=1E><9;;O02<1=I:8387C<=4:L1652<F;8:86@=2368J744<2D9>9:4N3060>H5:?>0B?<84:L16=2<F;82?6@=359M66633G88=95A2207?K44;=1E>>:;;O0011=I::<?7C<<759M66>33G885>5A2568J727<2D98<:4N3610>H5<:>0B?:;4:L1002<F;>=86@=4668J72?<2D984=4N377?K428=1E>8?;;O0661=I:<9?7C<:459M60333G8>:95A2457?K420=1E>87<;O050>H5>9>0B?8>4:L1272<F;<886@=6568J702<2D9:;:4N3440>H5>1>0B?863:L131=I:>:?7C<8159M62433G8<?95A2667?K40==1E>:8;;O0431=I:>2?7C<8929M6=2<F;2;86@=8068J7>5<2D94>:4N3:70>H50190B?7=;O10?K57;2D8=95A3007?K56;=1E?<:;;O1211=I;8<?7C=>759M74>33G9:5>5A3318J6543G9??6@<529M735<F:=87C=73:L0=6=I<990B9?<;O617>H3;:1E89=4N570?K21;2D?;>5A4918J1?53G?87C;?3:L656=I=;90B8=<;O777>H2=:1E9;=4N450?K3?;2D>5>5A6118J3743G<9?6@9329M215<F??87C893:L536=I>190B;7=;O50?K17;2D<=>5A7318J2543G=??6@8529M335<F>=87C973:L4=6=I0990B5?<;O:17>H?;:1E49=4N970?K>1;2D3;>5A8918J=?53G387C7?3:L:56=I1;90B4=<;O;77>H>=:1E5;=4N850?K??;2D25k5AB^@VWUOIWYXD\^94NDVTKWM33GEEI<5@2:MH5>V33YKYXl5_IO]AQVOCPk1[ECQMURLBI@5<X[O:7\o4R@OA73YBPYl0^LCPEYVFJVOHFVKm7_OB_DZWAKUNGGUIm6\JAE]EMWUSk2XNMIQXIEVK[De<ZLKOSZGKTI]A3>TBOJOJ@:5]EFAFEP1<ZLMHIOB8;SGDG@DR02XNKNBDAM:8V@ADDBK^46\JGBNHFI><ZLMH@FLZ1:Q7?VGAM11XM[KKAUC27>UNEVID@AG\INL\GMCDC11XE@QBOEG5?VIRZJO<7^\YAM]B3>UU^HFTN85\SSCO1>UTZH_>7^]]BM78WVTE]=1_U]K<3:W3+bta&{l$knv!cmi{+H~hzVxoS}`{r^`jjZ~hz9:;<R\jstnw565<]9%l~k }f.e`|+ekcq%Ftb|Pre]sjqtXj`dTtb|?013\V`urd};8?6[?/fpe*w`(ojr%oaew/LzlvZtcWyd~Rlfn^zlv567:VXnxb{1218Q5)`zo$yj"ilx/aoo})JpfxT~iQnup\flhXpfx;<==PRdqvhq74;2_;#j|i.sd,cf~)keas#@v`r^pg[uhszVhbbRv`r1230ZTb{|f=>94U1-dvc(un&mht#mcky-N|jtXzmU{by|Pbhl\|jt789>T^h}zlu3\WR64;2_;#j|i.sd,cf~)keas#@v`r^pg[uhszVhbbRv`r1231ZTb{|f=>=4U1-dvc(un&mht#mcky-N|jtXzmU{by|Pbhl\|jt789<T^h}zlu307>S7'nxm"h gbz-gim'Drd~R|k_qlwvZdnfVrd~=>?7^Pfwpjs9:90Y=!hrg,qb*adp'iggu!Bxnp\vaYwf}xTnd`Pxnp345>XZly~`y?<2:W3+bta&{l$knv!cmi{+H~hzVxoS}`{r^e`[}iu89:;S_k|umv277=R8&myj#|i/fa{*fjlp&GscQ}d^rmpwY`kVrd~=>?1^Pfwpjs9:80Y=!hrg,qb*adp'iggu!Bxnp\vaYwf}xTknQwos2347YUmzgx<==;T2,cw`)zo%lou lljz,I}iuW{nT|cz}_fa\|jt7899T^h}zlu306>S7'nxm"h gbz-gim'Drd~R|k_qlwvZadWqey<=>;_Sgpqir6;;1^<"i}f/pe+be&jf`t"Cwos]q`Zvi|{UloRv`r1231ZTb{|f=><4U1-dvc(un&mht#mcky-N|jtXzmU{by|Pgb]{kw678?UYi~{ct011?P6(o{l%~k!hcy,`hn~(EqeySjPpovq[beXpfx;<=9PRdqvhq74:2_;#j|i.sd,cf~)keas#@v`r^pg[uhszVmhSua}012;[Wct}e~:?>5Z0.eqb+ta'nis"nbdx.O{kwYpzVzexQmio]{kw6789UYi~{ct010?P6(o{l%~k!hcy,`hn~(EqeySz|Ppovq[goiWqey<=>>_Sgpqir6;:1^<"i}f/pe+be&jf`t"Cwos]tvZvi|{UiecQwos2347YUmzgx<=<;T2,cw`)zo%lou lljz,I}iuW~xT|cz}_ckm[}iu89:8S_k|umv276=R8&myj#|i/fa{*fjlp&GscQxr^rmpwYeagUsc>?05]Qavsk|89<7X> gsd-vc)`kq$h`fv Mymq[rtXxg~ySoga_ymq4563W[oxyaz>_RU376=R8&myj#|i/fa{*fjlp&GscQxr^rmpwYeagUsc>?04]Qavsk|8987X> gsd-vc)`kq$h`fv Mymq[rtXxg~ySoga_ymq4561W[oxyaz>329V4*aun'xm#jmw.bnh|*Kg{U|~R~ats]amkYg{:;<:Q]erwop4543\:$kh!rg-dg}(ddbr$Aua}_vp\tkruWkceSua}012;[Wct}e~:??5Z0.eqb+ta'nis"nbdx.O{kwYpzVzexQhc^zlv5678VXnxb{1208Q5)`zo$yj"ilx/aoo})JpfxT{Qnup\cfYg{:;<<Q]erwop4553\:$kh!rg-dg}(ddbr$Aua}_vp\tkruWniTtb|?010\V`urd};8>6[?/fpe*w`(ojr%oaew/LzlvZquWyd~Ril_ymq4564W[oxyaz>339V4*aun'xm#jmw.bnh|*Kg{U|~R~ats]dgZ~hz9:;8R\jstnw564<]9%l~k }f.e`|+ekcq%Ftb|Pws]sjqtXojUsc>?04]Qavsk|8997X> gsd-vc)`kq$h`fv Mymq[rtXxg~ySjmPxnp3450XZly~`y?<2:W3+bta&{l$knv!cmi{+H~hzV}yS}`{r^e`[}iu89:<S_k|umv277=R8&myj#|i/fa{*fjlp&GscQxr^rmpwY`kVrd~=>?8^Pfwpjs9;;0Y=!hrg,qb*adp'iggu!}d^rmpwYeag6;2??4U1-dvc(un&mht#mcky-q`Zvi|{Uiec2>>338Q5)`zo$yj"ilx/aoo})ulVzexQmio>1:77<]9%l~k }f.e`|+ekcq%yhR~ats]amk:46;;0Y=!hrg,qb*adp'iggu!}d^rmpwYeag6?2??4U1-dvc(un&mht#mcky-q`Zvi|{Uiec2:>338Q5)`zo$yj"ilx/aoo})ulVzexQmio>5:77<]9%l~k }f.e`|+ekcq%yhR~ats]amk:06;;0Y=!hrg,qb*adp'iggu!}d^rmpwYeag632??4U1-dvc(un&mht#mcky-q`Zvi|{Uiec26>328Q5)`zo$yj"ilx/aoo})ulVzexQmio]365=R8&myj#|i/fa{*fjlp&xoS}`{r^`jjZ7582_;#j|i.sd,cf~)keas#jPpovq[goiW;8;7X> gsd-vc)`kq$h`fv re]sjqtXj`dT??>4U1-dvc(un&mht#mcky-q`Zvi|{UiecQ;219V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^714>S7'nxm"h gbz-gim'{nT|cz}_ckm[3473\:$kh!rg-dg}(ddbr$~iQnup\flhX?;:0Y=!hrg,qb*adp'iggu!}d^rmpwYeagU3>=5Z0.eqb+ta'nis"nbdx.pg[uhszVhbbR7=6:W3+bta&{l$knv!cmi{+wbXxg~ySoga_ymq4567:?1^<"i}f/pe+be&jf`t"|k_qlwvZdnfVrd~=>?1348Q5)`zo$yj"ilx/aoo})ulVzexQmio]{kw678;8=7X> gsd-vc)`kq$h`fv re]sjqtXj`dTtb|?01112>S7'nxm"h gbz-gim'{nT|cz}_ckm[}iu89:?>;5Z0.eqb+ta'nis"nbdx.pg[uhszVhbbRv`r123170<]9%l~k }f.e`|+ekcq%yhR~ats]amkYg{:;<;<9;T2,cw`)zo%lou lljz,vaYwf}xTnd`Pxnp34515>2_;#j|i.sd,cf~)keas#jPpovq[goiWqey<=>7219V4*aun'xm#jmw.bnh|*tcWyd~Ril<1<14>S7'nxm"h gbz-gim'{nT|cz}_fa?5;473\:$kh!rg-dg}(ddbr$~iQnup\cf:56;:0Y=!hrg,qb*adp'iggu!}d^rmpwY`k595>=5Z0.eqb+ta'nis"nbdx.pg[uhszVmh090=0:W3+bta&{l$knv!cmi{+wbXxg~ySjm35?03?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb>5:76<]9%l~k }f.e`|+ekcq%yhR~ats]dg919:91^<"i}f/pe+be&jf`t"|k_qlwvZad4149<6[?/fpe*w`(ojr%oaew/sf\tkruWni753?i;T2,cw`)zo%lou lljz,vaYwf}xTknQ?1g9V4*aun'xm#jmw.bnh|*tcWyd~Ril_03e?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]15c=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[67a3\:$kh!rg-dg}(ddbr$~iQnup\cfY39o1^<"i}f/pe+be&jf`t"|k_qlwvZadW<;m7X> gsd-vc)`kq$h`fv re]sjqtXojU==k5Z0.eqb+ta'nis"nbdx.pg[uhszVmhS:?i;T2,cw`)zo%lou lljz,vaYwf}xTknQ71g9V4*aun'xm#jmw.bnh|*tcWyd~Ril_805?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]bwwc`4949:6[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg=3=63=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumn692?84U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde?7;413\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{ol090=6:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfc939:?1^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyij29>348Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`a;?78=7X> gsd-vc)`kq$h`fv re]sjqtXojUjkh<9<12>S7'nxm"h gbz-gim'{nT|cz}_fa\evtbo535>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]360=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU:>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]160=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU8>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]760=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU>>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]560=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU<>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef];60=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnU2>45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5969:01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1=3=6<=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=1<1289V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9595>45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5929:01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1=7=6<=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=181289V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc95=5>45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g59>9:01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1=;=6==R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=R>=8:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb6W8837X> gsd-vc)`kq$h`fv re]sjqtXojUjkh_e3\67><]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<Q<299V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9V>946[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2[04?3\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{olSi?P63:8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl8U<>55Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5Z>502_;#j|i.sd,cf~)keas#jPpovq[beXizxnkRj>_806?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]{kw67898>7X> gsd-vc)`kq$h`fv re]sjqtXojUsc>?0006?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]{kw678;8>7X> gsd-vc)`kq$h`fv re]sjqtXojUsc>?0206?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]{kw678=8>7X> gsd-vc)`kq$h`fv re]sjqtXojUsc>?0406?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]{kw678?8>7X> gsd-vc)`kq$h`fv re]sjqtXojUsc>?0606?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]{kw67818:7X> gsd-vc)`kq$h`fv ws]sjqtXj`d7<3<>;T2,cw`)zo%lou lljz,swYwf}xTnd`31?02?P6(o{l%~k!hcy,`hn~({U{by|Pbhl?6;463\:$kh!rg-dg}(ddbr${Qnup\flh;;78:7X> gsd-vc)`kq$h`fv ws]sjqtXj`d783<>;T2,cw`)zo%lou lljz,swYwf}xTnd`35?02?P6(o{l%~k!hcy,`hn~({U{by|Pbhl?2;463\:$kh!rg-dg}(ddbr${Qnup\flh;?78:7X> gsd-vc)`kq$h`fv ws]sjqtXj`d743<>;T2,cw`)zo%lou lljz,swYwf}xTnd`39?03?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\476<]9%l~k }f.e`|+ekcq%|~R~ats]amkY6:91^<"i}f/pe+be&jf`t"y}_qlwvZdnfV89<6[?/fpe*w`(ojr%oaew/vp\tkruWkceS><?;T2,cw`)zo%lou lljz,swYwf}xTnd`P4328Q5)`zo$yj"ilx/aoo})pzVzexQmio]665=R8&myj#|i/fa{*fjlp&}yS}`{r^`jjZ0582_;#j|i.sd,cf~)keas#z|Ppovq[goiW>8;7X> gsd-vc)`kq$h`fv ws]sjqtXj`dT4?>4U1-dvc(un&mht#mcky-tvZvi|{UiecQ6279V4*aun'xm#jmw.bnh|*quWyd~Rlfn^zlv5678;<0Y=!hrg,qb*adp'iggu!xr^rmpwYeagUsc>?0005?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\|jt78989:6[?/fpe*w`(ojr%oaew/vp\tkruWkceSua}012063=R8&myj#|i/fa{*fjlp&}yS}`{r^`jjZ~hz9:;8?84U1-dvc(un&mht#mcky-tvZvi|{UiecQwos2340413\:$kh!rg-dg}(ddbr${Qnup\flhXpfx;<=8=6:W3+bta&{l$knv!cmi{+rtXxg~ySoga_ymq4560:?1^<"i}f/pe+be&jf`t"y}_qlwvZdnfVrd~=>?8328Q5)`zo$yj"ilx/aoo})pzVzexQhc=2=65=R8&myj#|i/fa{*fjlp&}yS}`{r^e`848582_;#j|i.sd,cf~)keas#z|Ppovq[be;:78;7X> gsd-vc)`kq$h`fv ws]sjqtXoj682?>4U1-dvc(un&mht#mcky-tvZvi|{Ulo1:1219V4*aun'xm#jmw.bnh|*quWyd~Ril<4<14>S7'nxm"h gbz-gim'~xT|cz}_fa?2;473\:$kh!rg-dg}(ddbr${Qnup\cf:06;:0Y=!hrg,qb*adp'iggu!xr^rmpwY`k525>=5Z0.eqb+ta'nis"nbdx.uq[uhszVmh040>f:W3+bta&{l$knv!cmi{+rtXxg~ySjmP00d8Q5)`zo$yj"ilx/aoo})pzVzexQhc^32b>S7'nxm"h gbz-gim'~xT|cz}_fa\64`<]9%l~k }f.e`|+ekcq%|~R~ats]dgZ56n2_;#j|i.sd,cf~)keas#z|Ppovq[beX<8l0Y=!hrg,qb*adp'iggu!xr^rmpwY`kV?:j6[?/fpe*w`(ojr%oaew/vp\tkruWniT:<h4U1-dvc(un&mht#mcky-tvZvi|{UloR9>f:W3+bta&{l$knv!cmi{+rtXxg~ySjmP80d8Q5)`zo$yj"ilx/aoo})pzVzexQhc^;12>S7'nxm"h gbz-gim'~xT|cz}_fa\evtbo5:5>;5Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef>2:70<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlm7>3<9;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd8685>2_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnk1:1279V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqab:26;<0Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hi36?05?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`4>49:6[?/fpe*w`(ojr%oaew/vp\tkruWniTm~|jg=:=63=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumn622?;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\473<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT=?;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\673<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT??;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\073<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT9?;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\273<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT;?;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\<73<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT5?74U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4:76;30Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hiPd0>2:7?<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<2=>3;8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl8682?74U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4:36;30Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hiPd0>6:7?<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<29>3;8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl86<2?74U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4:?6;30Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hiPd0>::7><]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<Q?299V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc9V;946[?/fpe*w`(ojr%oaew/vp\tkruWniTm~|jg^f2[74?3\:$kh!rg-dg}(ddbr${Qnup\cfYf{{olSi?P33:8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl8U?>55Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5Z3502_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnkRj>_70;?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`Wm;T;?64U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4Y?:11^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1^;11>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt789:996[?/fpe*w`(ojr%oaew/vp\tkruWniTtb|?01311>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt7898996[?/fpe*w`(ojr%oaew/vp\tkruWniTtb|?01111>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt789>996[?/fpe*w`(ojr%oaew/vp\tkruWniTtb|?01711>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt789<996[?/fpe*w`(ojr%oaew/vp\tkruWniTtb|?01511>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt7892956[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$ol|}yogw858512_;#j|i.sd,ci6)zm%l~l}!rrvp+f6(khxyuck{<0<1=>S7'nxm"h gm2-va)`zhy%~~z|/b2,gdtuqgo0?0=9:W3+bta&{l$ka>!re-dvdu)zz~x#n> c`pq}kcs4:49j6[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$k`{w.foX4X(`e8$f=?h4U1-dvc(un&mg<#|k/fpbw+tt|z%h<"ibuy,di^7Z&ngx"`}=f:W3+bta&{l$ka>!re-dvdu)zz~x#n> glw{*bk\:T$la~ bs3d8Q5)`zo$yj"ic0/pg+btf{'xxx~!l0.enq}(`eR9V"jc|.lq1b>S7'nxm"h gm2-va)`zhy%~~z|/b2,chs&ngP8P hmr,nw75<]9%l~k }f.eo4+tc'nxj#||tr-`4*p64949?6[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$z<2>>318Q5)`zo$yj"ic0/pg+btf{'xxx~!l0.t28785;2_;#j|i.sd,ci6)zm%l~l}!rrvp+f6(~8682?=4U1-dvc(un&mg<#|k/fpbw+tt|z%h<"x><5<1f>S7'nxm"h gm2-va)`zhy%~~z|/b2,r4Y7Whdo<=>?13`8Q5)`zo$yj"ic0/pg+btf{'xxx~!l0.t2[4Yffm:;<=?=b:W3+bta&{l$ka>!re-dvdu)zz~x#n> v0]1[dhc89:;=?l4U1-dvc(un&mg<#|k/fpbw+tt|z%h<"x>_2]bja6789;9n6[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$z<Q;_`lg45679;30Y=!hrg,qb*ak8'xo#j|ns/pppv)d9&ij~waeu>3:7?<]9%l~k }f.eo4+tc'nxj#||tr-`5*efz{seiy2>>3;8Q5)`zo$yj"ic0/pg+btf{'xxx~!l1.abvwim}692?74U1-dvc(un&mg<#|k/fpbw+tt|z%h="mnrs{maq:46;l0Y=!hrg,qb*ak8'xo#j|ns/pppv)d9&mfyu hmZ2^*bk6&d;9j6[?/fpe*w`(oe:%~i!hr`q-vvrt'j;$k`{w.foX5X(`ez$f?h4U1-dvc(un&mg<#|k/fpbw+tt|z%h="ibuy,di^4Z&ngx"`}=f:W3+bta&{l$ka>!re-dvdu)zz~x#n? glw{*bk\;T$la~ bs3d8Q5)`zo$yj"ic0/pg+btf{'xxx~!l1.enq}(`eR>V"jc|.lq17>S7'nxm"h gm2-va)`zhy%~~z|/b3,r4:76;90Y=!hrg,qb*ak8'xo#j|ns/pppv)d9&|:0<0=3:W3+bta&{l$ka>!re-dvdu)zz~x#n? v0>1:75<]9%l~k }f.eo4+tc'nxj#||tr-`5*p64:49?6[?/fpe*w`(oe:%~i!hr`q-vvrt'j;$z<2;>3`8Q5)`zo$yj"ic0/pg+btf{'xxx~!l1.t2[5Yffm:;<=?=b:W3+bta&{l$ka>!re-dvdu)zz~x#n? v0]2[dhc89:;=?l4U1-dvc(un&mg<#|k/fpbw+tt|z%h="x>_3]bja6789;9n6[?/fpe*w`(oe:%~i!hr`q-vvrt'j;$z<Q<_`lg45679;h0Y=!hrg,qb*ak8'xo#j|ns/pppv)d9&|:S9Qnne23457582_;#j|i.sd,ci6)zm%l~l}!rrvp+fijx98;7X> gsd-vc)`d9$yh"i}ar,qwqu(kfg{=?74U1-dvc(un&mg<#|k/fpbw+tt|z%ym`Qjmqvz[cdXa::0Y=!hrg,qb*ak8'xo#j|ns/pppv)uidUna}zv_g`\mZiu89:;?<5Z0.eqb+ta'nf;"j gscp*wus{&xjaRkbpu{\bgYnWfx;<=>>279V4*aun'xm#jb?.sf,cwgt&{y"|nm^gntqXa8n0Y=!hrg,qb*ak8'xo#ob_sf\akYn9;90Y=!hrg,qb*ak8'xo#~ats-Ngjsi|Vidycz=4:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmp4433\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|d>?:4U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov061=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}>986[?/fpe*w`(oe:%~i!}povq+Heh}g~Tob{at407?P6(o{l%~k!hl1,q`*twf}x$Anaznu]`kphs>;>0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|Vidycz8259V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjq>5<2_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfex4<6;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw[f;878h7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_b{?4;Yu|;30Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPcx>2:7e<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Tot2>>^pw6<=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Uhu1<12b9V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjqYdq585Sz=9:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmpZe~4:49o6[?/fpe*w`(oe:%~i!}povq+Heh}g~Tob{at^az868Xz}827X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_b{?0;4d3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSnw34?]qp7?<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Tot2:>3a8Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkrXkp6>2R|{289V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjqYdq5<5>n5Z0.eqb+ta'nf;"j rqlwv*Kdg|dSnaznu]`}909W{~956[?/fpe*w`(oe:%~i!}povq+Heh}g~Tob{at^az8285k2_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfexRmv<6<\vq4>3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSnw38?0`?P6(o{l%~k!hl1,q`*twf}x$Anaznu]`kphsWjs743Q}t3c8Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkrXpfx7<3<n;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw[}iu4849m6[?/fpe*w`(oe:%~i!}povq+Heh}g~Tob{at^zlv949:h1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQwos>0:7g<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Ttb|34?0b?P6(o{l%~k!hl1,q`*twf}x$Anaznu]`kphsWqey080=a:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmpZ~hz5<5>l5Z0.eqb+ta'nf;"j rqlwv*Kdg|dSnaznu]{kw:06;k0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPxnp?<;4f3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSua}<8<1`>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|Vrd~171_sv2b>S7'nxm"h gm2-va)uxg~y#naznu>3:4`<]9%l~k }f.eo4+tc'{zex!lotlw8486n2_;#j|i.sd,ci6)zm%y|cz}/bmvjq:568l0Y=!hrg,qb*ak8'xo#~ats-`kphs4:4:j6[?/fpe*w`(oe:%~i!}povq+firf}6?2<h4U1-dvc(un&mg<#|k/srmpw)dg|d080>f:W3+bta&{l$ka>!re-qtkru'je~by29>0d8Q5)`zo$yj"ic0/pg+wvi|{%hcx`{<6<2b>S7'nxm"h gm2-va)uxg~y#naznu>;:4`<]9%l~k }f.eo4+tc'{zex!lotlw8<86m2_;#j|i.sd,ci6)zm%y|cz}/bmvjqY79l1^<"i}f/pe+bj7&{n$~}`{r.alqkrX98o0Y=!hrg,qb*ak8'xo#~ats-`kphsW;;n7X> gsd-vc)`d9$yh"|nup,gjsi|V9:i6[?/fpe*w`(oe:%~i!}povq+firf}U?=h5Z0.eqb+ta'nf;"j rqlwv*eh}g~T9<k4U1-dvc(un&mg<#|k/srmpw)dg|dS;?j;T2,cw`)zo%l`= }d.psjqt(kfexR9>e:W3+bta&{l$ka>!re-qtkru'je~byQ71d9V4*aun'xm#jb?.sf,vuhsz&idyczP9308Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_e3?4;453\:$kh!rg-dh5(ul&x{by| cnwmpZb64849>6[?/fpe*w`(oe:%~i!}povq+firf}Uo=1<1239V4*aun'xm#jb?.sf,vuhsz&idyczPd0>0:74<]9%l~k }f.eo4+tc'{zex!lotlw[a7;<7897X> gsd-vc)`d9$yh"|nup,gjsi|Vn:080=2:W3+bta&{l$ka>!re-qtkru'je~byQk1=4=67=R8&myj#|i/fn3*wb(zyd~"m`uov\`4:06;80Y=!hrg,qb*ak8'xo#~ats-`kphsWm;743<=;T2,cw`)zo%l`= }d.psjqt(kfexRj><8<15>S7'nxm"h gm2-va)uxg~y#naznu]g5Z6592_;#j|i.sd,ci6)zm%y|cz}/bmvjqYc9V;9=6[?/fpe*w`(oe:%~i!}povq+firf}Uo=R<=1:W3+bta&{l$ka>!re-qtkru'je~byQk1^115>S7'nxm"h gm2-va)uxg~y#naznu]g5Z2592_;#j|i.sd,ci6)zm%y|cz}/bmvjqYc9V?9=6[?/fpe*w`(oe:%~i!}povq+firf}Uo=R8=1:W3+bta&{l$ka>!re-qtkru'je~byQk1^515>S7'nxm"h gm2-va)uxg~y#naznu]g5Z>592_;#j|i.sd,ci6)zm%y|cz}/bmvjqYc9V3986[?/fpe*w`(oe:%~i!}povq+firf}Uecy>?0061?P6(o{l%~k!hl1,tv*apiz$l{im?.vf`+HurjV}ySio{a^alqkrXaVy~n=>?0^az8583:2_;#j|i.sd,ci6){%l{l}!gvf`4+qck&GxyoQxr^fbpdYdg|dSdQ|uc2345Ydq5;58?5Z0.eqb+ta'nf;"z| gvcp*bqck9$|hn!Bst`\swYci}kTob{at^k\wpd789:Tot2=>508Q5)`zo$yj"ic0/uq+bqf{'m|hn>!wea,IvseW~xThlzn_bmvjqYnWzi<=>?_b{?7;253\:$kh!rg-dh5(pz&m|m~ hwea3*rbd'Dy~nRy}_ecweZeh}g~TeR}zb1234Ze~4=4?>6[?/fpe*w`(oe:%{!hw`q-crbd8'}oo"C|uc]tvZbf|hUhcx`{_h]pqg6789Uhu1;1439V4*aun'xm#jb?.vp,crgt&n}oo= xdb-NwpdX{UomyoPcnwmpZoX{|h;<=>Pcx>5:14<]9%l~k }f.eo4+qu'n}j#ixdb2-sae(EziSz|Pd`vb[firf}UbS~{m0123[f;?7>97X> gsd-vc)`d9$|~"ixar,dsae7&~nh#@}zb^uq[agsiVidyczPi^qvf5678Vir050;3:W3+bta&{l$ka>!ws-dsdu)o~nh<#ykc.OpqgYpzVnjxlQlotlw[lYt}k:;<=Qcuu>3:15<]9%l~k }f.eo4+qu'n}j#ixdb2-sae(EziSz|Pd`vb[firf}UbS~{m0123[iss484??6[?/fpe*w`(oe:%{!hw`q-crbd8'}oo"C|uc]tvZbf|hUhcx`{_h]pqg6789Ugyy2=>518Q5)`zo$yj"ic0/uq+bqf{'m|hn>!wea,IvseW~xThlzn_bmvjqYnWzi<=>?_mww8683;2_;#j|i.sd,ci6){%l{l}!gvf`4+qck&GxyoQxr^fbpdYdg|dSdQ|uc2345Yk}}6?29=4U1-dvc(un&mg<#y}/fubw+aplj:%{im Mrwa[rtXlh~jSnaznu]j[vse89:;Sa{{<4<77>S7'nxm"h gm2-sw)`hy%kzjl0/ugg*Kt}kU|~Rjnt`]`kphsW`Uxyo>?01]oqq:16=90Y=!hrg,qb*ak8'}y#jyns/et`f6)mi$A~{m_vp\`drfWje~byQf_rwa4567We0:0;3:W3+bta&{l$ka>!ws-dsdu)o~nh<#ykc.OpqgYpzVnjxlQlotlw[lYt}k:;<=Qcuu>;:15<]9%l~k }f.eo4+qu'n}j#ixdb2-sae(EziSz|Pd`vb[firf}UbS~{m0123[iss404??6[?/fpe*w`(oe:%{!hw`q-crbd8'}oo"C|uc]tvZbf|hUhcx`{_h]pqg6789Usc2=>518Q5)`zo$yj"ic0/uq+bqf{'m|hn>!wea,IvseW~xThlzn_bmvjqYnWzi<=>?_ymq8683;2_;#j|i.sd,ci6){%l{l}!gvf`4+qck&GxyoQxr^fbpdYdg|dSdQ|uc2345Yg{6?29=4U1-dvc(un&mg<#y}/fubw+aplj:%{im Mrwa[rtXlh~jSnaznu]j[vse89:;Sua}<4<77>S7'nxm"h gm2-sw)`hy%kzjl0/ugg*Kt}kU|~Rjnt`]`kphsW`Uxyo>?01]{kw:16=90Y=!hrg,qb*ak8'}y#jyns/et`f6)mi$A~{m_vp\`drfWje~byQf_rwa4567Wqey0:0;3:W3+bta&{l$ka>!ws-dsdu)o~nh<#ykc.OpqgYpzVnjxlQlotlw[lYt}k:;<=Qwos>;:15<]9%l~k }f.eo4+qu'n}j#ixdb2-sae(EziSz|Pd`vb[firf}UbS~{m0123[}iu4048>6[?/fpe*w`(oe:%{!hw`q-crbd8'}oo"y}_ecweZeh}g~Te1<1339V4*aun'xm#jb?.vp,crgt&n}oo= xdb-tvZbf|hUhcx`{_h>0:64<]9%l~k }f.eo4+qu'n}j#ixdb2-sae({UomyoPcnwmpZo;<7997X> gsd-vc)`d9$|~"ixar,dsae7&~nh#z|Pd`vb[firf}Ub080<2:W3+bta&{l$ka>!ws-dsdu)o~nh<#ykc.uq[agsiVidyczPi=4=77=R8&myj#|i/fn3*rt(o~kx"jykc1,t`f)pzVnjxlQlotlw[l:06:80Y=!hrg,qb*ak8'}y#jyns/et`f6)mi${Qkauc\gjsi|Vc743==;T2,cw`)zo%l`= xr.etev(`mi;"zjl/vp\`drfWje~byQf<8<05>S7'nxm"h gm2-sw)`hy%kzjl0/ugg*quWmkmRm`uov\mZ4492_;#j|i.sd,ci6){%l{l}!gvf`4+qck&}ySio{a^alqkrXaV98=6[?/fpe*w`(oe:%{!hw`q-crbd8'}oo"y}_ecweZeh}g~TeR:<1:W3+bta&{l$ka>!ws-dsdu)o~nh<#ykc.uq[agsiVidyczPi^705>S7'nxm"h gm2-sw)`hy%kzjl0/ugg*quWmkmRm`uov\mZ0492_;#j|i.sd,ci6){%l{l}!gvf`4+qck&}ySio{a^alqkrXaV=8=6[?/fpe*w`(oe:%{!hw`q-crbd8'}oo"y}_ecweZeh}g~TeR6<1:W3+bta&{l$ka>!ws-dsdu)o~nh<#ykc.uq[agsiVidyczPi^;0e>S7'nxm"h gm2-sw)`hy%kzjl0/ugg*quWmkmRm`uov\mZurj9:;<1<13`9V4*aun'xm#jb?.vp,crgt&n}oo= xdb-tvZbf|hUhcx`{_h]pqg6789682>o4U1-dvc(un&mg<#y}/fubw+aplj:%{im ws]geqgXkfexRgPst`3456;<79j7X> gsd-vc)`d9$|~"ixar,dsae7&~nh#z|Pd`vb[firf}UbS~{m01238084i2_;#j|i.sd,ci6){%l{l}!gvf`4+qck&}ySio{a^alqkrXaVy~n=>?0=4=7d=R8&myj#|i/fn3*rt(o~kx"jykc1,t`f)pzVnjxlQlotlw[lYt}k:;<=28>2c8Q5)`zo$yj"ic0/uq+bqf{'m|hn>!wea,swYci}kTob{at^k\wpd789:743=n;T2,cw`)zo%l`= xr.etev(`mi;"zjl/vp\`drfWje~byQf_rwa4567404956[?/fpe*w`(oe:%{!hw`q-svrt'j;$ol|}yogw858512_;#j|i.sd,ci6){%l{l}!wrvp+f7(khxyuck{<0<1=>S7'nxm"h gm2-sw)`hy%{~z|/b3,gdtuqgo0?0=9:W3+bta&{l$ka>!ws-dsdu)z~x#n? c`pq}kcs4:49j6[?/fpe*w`(oe:%{!hw`q-svrt'j;$k`{w.foX4X(`e8$f=?h4U1-dvc(un&mg<#y}/fubw+qt|z%h="ibuy,di^7Z&ngx"`}=f:W3+bta&{l$ka>!ws-dsdu)z~x#n? glw{*bk\:T$la~ bs3d8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.enq}(`eR9V"jc|.lq1b>S7'nxm"h gm2-sw)`hy%{~z|/b3,chs&ngP8P hmr,nw75<]9%l~k }f.eo4+qu'n}j#y|tr-`5*p64949?6[?/fpe*w`(oe:%{!hw`q-svrt'j;$z<2>>318Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.t28785;2_;#j|i.sd,ci6){%l{l}!wrvp+f7(~8682?=4U1-dvc(un&mg<#y}/fubw+qt|z%h="x><5<1f>S7'nxm"h gm2-sw)`hy%{~z|/b3,r4Y7Whdo<=>?13`8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.t2[4Yffm:;<=?=b:W3+bta&{l$ka>!ws-dsdu)z~x#n? v0]1[dhc89:;=?l4U1-dvc(un&mg<#y}/fubw+qt|z%h="x>_2]bja6789;9n6[?/fpe*w`(oe:%{!hw`q-svrt'j;$z<Q;_`lg45679;30Y=!hrg,qb*ak8'}y#jyns/uppv)d:&ij~waeu>3:7?<]9%l~k }f.eo4+qu'n}j#y|tr-`6*efz{seiy2>>3;8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.abvwim}692?74U1-dvc(un&mg<#y}/fubw+qt|z%h>"mnrs{maq:46;l0Y=!hrg,qb*ak8'}y#jyns/uppv)d:&mfyu hmZ2^*bk6&d;9j6[?/fpe*w`(oe:%{!hw`q-svrt'j8$k`{w.foX5X(`ez$f?h4U1-dvc(un&mg<#y}/fubw+qt|z%h>"ibuy,di^4Z&ngx"`}=f:W3+bta&{l$ka>!ws-dsdu)z~x#n< glw{*bk\;T$la~ bs3d8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.enq}(`eR>V"jc|.lq17>S7'nxm"h gm2-sw)`hy%{~z|/b0,r4:76;90Y=!hrg,qb*ak8'}y#jyns/uppv)d:&|:0<0=3:W3+bta&{l$ka>!ws-dsdu)z~x#n< v0>1:75<]9%l~k }f.eo4+qu'n}j#y|tr-`6*p64:49?6[?/fpe*w`(oe:%{!hw`q-svrt'j8$z<2;>3`8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.t2[5Yffm:;<=?=b:W3+bta&{l$ka>!ws-dsdu)z~x#n< v0]2[dhc89:;=?l4U1-dvc(un&mg<#y}/fubw+qt|z%h>"x>_3]bja6789;9n6[?/fpe*w`(oe:%{!hw`q-svrt'j8$z<Q<_`lg45679;h0Y=!hrg,qb*ak8'}y#jyns/uppv)d:&|:S9Qnne23457582_;#j|i.sd,ci6){%l{l}!wrvp+fijx88;7X> gsd-vc)`d9$|~"ixar,twqu(kfg{>?64U1-dvc(un&mg<#y}/fubw+qt|z%ym`Qiumn\bgYn:<1^<"i}f/pe+bj7&~x$kzo|.vqww*tfeVl~`aQf2e9V4*aun'xm#jb?.vp,crgt&~y"|nm^dvhiYnWds<=>?2d9V4*aun'xm#jb?.vp,crgt&~y"|nm^dvhiYnWds<=>?10f8Q5)`zo$yj"ic0/uq+wgjW~xTicQf1318Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkr5<2_;#j|i.sd,ci6){%||cz}/LalqkrXkfex<<;;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw672<]9%l~k }f.eo4+qu'~zex!BcnwmpZeh}g~8>95Z0.eqb+ta'nf;"z| wqlwv*Kdg|dSnaznu610>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|<8?7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{6368Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkr0:=1^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~by6=4:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmp<4>3\:$kh!rg-dh5(pz&}{by| MbmvjqYdg|dSnw30?0`?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWjs7<3Q}t3;8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXkp6:2?m4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov\g|:66Vx>45Z0.eqb+ta'nf;"z| wqlwv*Kdg|dSnaznu]`}949:j1^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~byQly=0=[wr512_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRmv<2<1g>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|Vir0>0Pru0:?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWjs783<l;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[f;<7Uyx?74U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov\g|:26;i0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|VidyczPcx>6:Zts:01^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~byQly=4=6f=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}Uhu181_sv1=>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|Vir0:0=c:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmpZe~4>4T~y<6;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[f;078h7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_b{?<;Yu|;k0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|VidyczPxnp?4;4f3\:$kh!rg-dh5(pz&}{by| MbmvjqYdg|dSua}<0<1e>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|Vrd~1<12`9V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjqYg{682?o4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov\|jt;<78j7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_ymq8085i2_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRv`r=4=6d=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}Usc28>3c8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXpfx743<n;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[}iu4049h6[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at^zlv9?9W{~:j6[?/fpe*w`(oe:%{!xpovq+firf}6;2<h4U1-dvc(un&mg<#y}/vrmpw)dg|d0<0>f:W3+bta&{l$ka>!ws-ttkru'je~by2=>0d8Q5)`zo$yj"ic0/uq+rvi|{%hcx`{<2<2b>S7'nxm"h gm2-sw)pxg~y#naznu>7:4`<]9%l~k }f.eo4+qu'~zex!lotlw8086n2_;#j|i.sd,ci6){%||cz}/bmvjq:168l0Y=!hrg,qb*ak8'}y#z~ats-`kphs4>4:j6[?/fpe*w`(oe:%{!xpovq+firf}632<h4U1-dvc(un&mg<#y}/vrmpw)dg|d040>e:W3+bta&{l$ka>!ws-ttkru'je~byQ?1d9V4*aun'xm#jb?.vp,suhsz&idyczP10g8Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_33f?P6(o{l%~k!hl1,tv*qwf}x$ob{at^12a>S7'nxm"h gm2-sw)pxg~y#naznu]75`=R8&myj#|i/fn3*rt(yd~"m`uov\14c<]9%l~k }f.eo4+qu'~zex!lotlw[37b3\:$kh!rg-dh5(pz&}{by| cnwmpZ16m2_;#j|i.sd,ci6){%||cz}/bmvjqY?9l1^<"i}f/pe+bj7&~x${}`{r.alqkrX1;80Y=!hrg,qb*ak8'}y#z~ats-`kphsWm;7<3<=;T2,cw`)zo%l`= xr.usjqt(kfexRj><0<16>S7'nxm"h gm2-sw)pxg~y#naznu]g5949:;1^<"i}f/pe+bj7&~x${}`{r.alqkrXl8682?<4U1-dvc(un&mg<#y}/vrmpw)dg|dSi?34?01?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f28085:2_;#j|i.sd,ci6){%||cz}/bmvjqYc95<5>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th<28>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e3?<;453\:$kh!rg-dh5(pz&}{by| cnwmpZb64049=6[?/fpe*w`(oe:%{!xpovq+firf}Uo=R>=1:W3+bta&{l$ka>!ws-ttkru'je~byQk1^315>S7'nxm"h gm2-sw)pxg~y#naznu]g5Z4592_;#j|i.sd,ci6){%||cz}/bmvjqYc9V99=6[?/fpe*w`(oe:%{!xpovq+firf}Uo=R:=1:W3+bta&{l$ka>!ws-ttkru'je~byQk1^715>S7'nxm"h gm2-sw)pxg~y#naznu]g5Z0592_;#j|i.sd,ci6){%||cz}/bmvjqYc9V=9=6[?/fpe*w`(oe:%{!xpovq+firf}Uo=R6=1:W3+bta&{l$ka>!ws-ttkru'je~byQk1^;16>S7'nxm"h gm2-sw)pxg~y#naznu]g6969:;1^<"i}f/pe+bj7&~x${}`{r.alqkrXl;6:2?<4U1-dvc(un&mg<#y}/vrmpw)dg|dSi<32?01?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f18685:2_;#j|i.sd,ci6){%||cz}/bmvjqYc:5>5>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?2:>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e0?2;453\:$kh!rg-dh5(pz&}{by| cnwmpZb54>49>6[?/fpe*w`(oe:%{!xpovq+firf}Uo>161239V4*aun'xm#jb?.vp,suhsz&idyczPd3>::77<]9%l~k }f.eo4+qu'~zex!lotlw[a4X8;;0Y=!hrg,qb*ak8'}y#z~ats-`kphsWm8T=??4U1-dvc(un&mg<#y}/vrmpw)dg|dSi<P2338Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e0\777<]9%l~k }f.eo4+qu'~zex!lotlw[a4X<;;0Y=!hrg,qb*ak8'}y#z~ats-`kphsWm8T9??4U1-dvc(un&mg<#y}/vrmpw)dg|dSi<P6338Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e0\377<]9%l~k }f.eo4+qu'~zex!lotlw[a4X0;;0Y=!hrg,qb*ak8'}y#z~ats-`kphsWm8T5?:4U1-dvc(un&mg<#y}/vrmpw)dg|dSca{01223==R8&myj#|i/lgn+bdj&nhfk#immfc-jbcdk'hfk"lck^ofiZabflxjxb| v`nj`+et|{%ym`b`oqY3Y+tfe'x$z8Qaohljp+tfe&YO\#]FNFNF[UTNE:<%XI^88:W3+bta&{l$ahc gco-cgk`&nhfkl agda`*gk`'kf`S`kb_fgmawgsg{%}magk.bqwv*tfeeed|V?R.scn*w)q=Vddecg{.scn+VBW&ZCEKAKPPSKN73(SLY=37X> gsd-vc)jmd%ln` hble-cgk`i'dlinm!ble,fimXelgTkh`jr`vlv*pfd`n%o~z}/scnhjiwS;W%~lc!r.t6[kinf`~%~lc SER-WLH@DLU[^DC<6/VGT4d<]9%l~k }f.ofi*rjxVxjaR|k_dl2g>S7'nxm"h mdo,phvXzhgT~iQjn03g?P6(o{l%~k!}su`oo*TT\VL^@AQHEO3g?P6(o{l%~k!}su`oo*tcW{ySl}}ef03?P6(o{l%~k!}su`oo*tcW{ySl}}ef]g576<]9%l~k }f.pppgjl'{nT~~zParpfcZb59j1^<"i}f/pe+wusjea$~iQ}su]`khd6l2_;#j|i.sd,vvredb%yhR||t^alig76m2_;#j|i.sd,vvredb%yhR||t^pfc9699l1^<"i}f/pe+wusjea$~iQ}su]qab:668o0Y=!hrg,qb*tt|kf`#jPrrv\v`a;:7;o7X> gsd-vc)u{}hgg"|k_sqw[wc`W9;o7X> gsd-vc)u{}hgg"|k_sqw[wc`W8;o7X> gsd-vc)u{}hgg"|k_sqw[wc`W;;<7X> gsd-vc)u{}hgg"||t^f252=R8&myj#|i/sqwfim(zz~Th??8;T2,cw`)zo%yylck.pppZb49m1^<"i}f/pe+wusjea${Q}su]bwwc`:91^<"i}f/pe+wusjea${Q}su]bwwc`Wm;9<6[?/fpe*w`(zz~i`f!xr^pppZgtzlmTh??l;T2,cw`)zo%yylck.uq[wusWjefn<j4U1-dvc(un&xxxobd/vp\vvrXkfgi=<k4U1-dvc(un&xxxobd/vp\vvrXzlm7<3?j;T2,cw`)zo%yylck.uq[wusW{ol0<0>d:W3+bta&{l$~~zmlj-tvZtt|VxnkR>>d:W3+bta&{l$~~zmlj-tvZtt|VxnkR?n;TQFVZGKAHYh7X]JR^TJWLDKM:1]ON74VHGT[Q_WM>1\ILB30?58S@GK484<7ZKNL=0==>QBIE686=08;VGBH959?2]NMX2?>69TADS;97=0[HOZ<3<:?RCF]591<394WDCV86803^OI@1>17:UFFI:66>1\IOB32?58S@DK4:4<7ZKML=6=3>QBJE6>2:5XECN?2;?<_LHG0:4?>69TAGJ;?7=0[HLZ<1<4?RCE]5;5;6YJBT>1:2=PMK_7?394WD@V81803^OIY1;17:UFFP:1601\IO[37;2=3>QBJ\6<2n5XRHVF[HICMVKh7Z\FTD]NKACXJm1\^DZJ_VKGPMYFl2]YEYKPWHFWLZD6l2RB@D@W-YFA$5(6(Z^^N->!1!CPGLO23QEYOT84XRVOMG1<PZ^TKCJ8;YQW[SEDj2RTOB\J_HLEK3=_lkUBhk5Wdi]SvlkQm{ybcc??;Yfn[Hgmg{\n~~g`n028\akXE`dd~[k}shmmg>gkefyShctx`8eikh{}Umyab9;cc`opvc3kkhgx~Pm`phaw5<keao7io{a^alqkr/8 n0hlzn_bmvjq.6!m1omyoPcnwmp-4.l2njxlQlotlw,6/c3mkmRm`uov+0,b<lh~jSnaznu*6-a=ci}kTob{at)4*`>bf|hUhcx`{(6+g?agsiVidycz'8(f8`drfWje~by&6)g9geqgXkfex1750?58`gosm{x=7iga(1+5?aoi 8#<7iga(02*<>bnf!;;<$64dhl+557.02nbb%??2(:8`lh/999";6jfn)32-2=cag":>$94dhl+56/03mce$<:&7:fjj-72!>1oec&>6(58`lh/9>#<7iga(0:*3>bnf!;2%;5kio*1-2=cag"9<$94dhl+64/03mce$?<&7:fjj-44!>1oec&=4(58`lh/:<#<7iga(34*3>bnf!8<%:5kio*1<,1<l`d#>4'9;ekm,6/03mce$>>&7:fjj-56!>1oec&<2(58`lh/;:#<7iga(26*3>bnf!9>%:5kio*02,1<l`d#?:'8;ekm,6>.?2nbb%=6)79gmk.3!>1oec&;0(58`lh/<8#<7iga(50*3>bnf!>8%:5kio*70,1<l`d#88'8;ekm,10.?2nbb%:8)69gmk.30 =0hd`'48+5?aoi <#<7iga(42*3>bnf!?:%:5kio*66,1<l`d#9>'8;ekm,02.?2nbb%;:)69gmk.2> =0hd`'56+4?aoi <2";6jfn)7:-3=cag"=%:5kio*54,1<l`d#:<'8;ekm,34.?2nbb%8<)69gmk.1< =0hd`'64+4?aoi ?<";6jfn)44-2=cag"=4$94dhl+2</13mce$:'8;ekm,26.?2nbb%9>)69gmk.0: =0hd`'72+4?aoi >>";6jfn)56-2=cag"<:$94dhl+32/03mce$:6&7:fjj-1>!?1oec&7)69gmk.?8 =0hd`'80+4?aoi 18";6jfn):0-2=cag"38$94dhl+<0/03mce$58&7:fjj->0!>1oec&78(58`lh/00#=7iga(8+4?aoi 0:";6jfn);2-2=cag"2>$94dhl+=6/03mce$4:&7:fjj-?2!>1oec&66(58`lh/1>#<7iga(8:*3>bnf!32%;5kio>3:==cag6:<=07;ekm8466611oec2>03<b?aoi48:86=07;ekm84646>1oec2>0?58`lh;984<7iga<00=3>bnf5;82:5kio>20;1<l`d7=808;ekm8409?2nbb1?8>69gmk:607=0hd`318<5?aoi484<7iga<32=3>bnf58:2:5kio>16;1<l`d7>>08;ekm8729?2nbb1<:>69gmk:5>7=0hd`326<4?aoi4;25;6jfn=0::3=cag692:5kio>04;1<l`d7?<08;ekm8649?2nbb1=<>69gmk:4<7=0hd`334<4?aoi4:<5;6jfn=14:2=cag684394dhl?7<813mce0>08;ekm8169?2nbb1:>>69gmk:3:7=0hd`342<4?aoi4=>5;6jfn=66:2=cag6?:394dhl?02803mce09617:fjj92>6?1oec2;>69gmk:287=0hd`350<4?aoi4<85;6jfn=70:2=cag6>8394dhl?10803mce08817:fjj9306>1oec2:8?58`lh;=04=7iga<4<4?aoi4?:5;6jfn=42:2=cag6=>394dhl?26803mce0;:17:fjj9026>1oec296?58`lh;>>4<7iga<7:=3>bnf5<22;5kio>5:2=cag6<<394dhl?34803mce0:<17:fjj9146>1oec284?58`lh;?<4<7iga<64=3>bnf5=<2:5kio>4<;1<l`d7;409;ekm82803mce05>17:fjj9>66>1oec272?58`lh;0:4<7iga<96=3>bnf52>2:5kio>;2;1<l`d74:08;ekm8=>9?2nbb166>79gmk:?6>1oec260?58`lh;184<7iga<80=3>bnf5382:5kio>:0;1<l`d75808;ekm8<09?2nbb178>69gmk:>07=0hd`398<5?aoi404<7iazt)2*3>bh}}":%55kotv+55/>3me~x%??0(;8`jss 8::%45kotv+554.12ndyy&>02+;?air|!;:%55kotv+57/?3me~x%?<)99gkpr/9=#37iazt)36-==cg|~#=;'7;emvp-70!11ocxz'19+;?air|!;2%:5kotv+6,><lf$?>&8:flqq.59 20hb{{(30*<>bh}}"9?$64dnww,72.02ndyy&=5(:8`jss ;<"46j`uu*13,><lf$?6&8:flqq.51 =0hb{{(2+;?air|!9;%55kotv+74/?3me~x%==)99gkpr/;:#37iazt)17-==cg|~#?8'7;emvp-51!11ocxz'36+;?air|!93%55kotv+7</03me~x%:&8:flqq.38 20hb{{(53*<>bh}}"?>$64dnww,15.02ndyy&;4(:8`jss =?"46j`uu*72,><lf$99&8:flqq.30 20hb{{(5;*3>bh}}">%55kotv+15/?3me~x%;>)99gkpr/=;#37iazt)70-==cg|~#99'7;emvp-32!11ocxz'57+;?air|!?<%55kotv+1=/?3me~x%;6)69gkpr/> 20hb{{(72*<>bh}}"==$64dnww,34.02ndyy&93(:8`jss ?>"46j`uu*51,><lf$;8&8:flqq.1? 20hb{{(7:*<>bh}}"=5$94dnww,2/?3me~x%9?)99gkpr/?8#37iazt)51-==cg|~#;>'7;emvp-13!11ocxz'74+;?air|!==%55kotv+32/?3me~x%97)99gkpr/?0#<7iazt):*<>bh}}"3<$64dnww,=7.02ndyy&72(:8`jss 19"46j`uu*;0,><lf$5;&8:flqq.?> 20hb{{(95*<>bh}}"34$64dnww,=?.?2ndyy&6)99gkpr/19#37iazt);2-==cg|~#5?'7;emvp-?4!11ocxz'95+;?air|!3>%55kotv+=3/?3me~x%78)99gkpr/11#37iazt);:-2=cg|~7<374dnww8467601ocxz3113==>bh}}6:<?0m;emvp977;3:556j`uu>2468?3me~x1??>99gkpr;98437iazt=31:==cg|~7=>07;emvp973611ocxz314<;?air|5;=255kotv?528?3me~x1?7>99gkpr;904<7iazt=3=<>bh}}69<364dnww877902ndyy2=2?:8`jss4;9546j`uu>10;><lf0?;18:flqq:5>720hb{{<35=<>bh}}694364dnww87?9?2ndyy2=>99gkpr;;9437iazt=12:==cg|~7??07;emvp954611ocxz335<;?air|59>255kotv?738?3me~x1=8>99gkpr;;1437iazt=1::2=cg|~7?364dnww816902ndyy2;1?:8`jss4=8546j`uu>77;><lf09:18:flqq:3=720hb{{<54=<>bh}}6?;364dnww81>902ndyy2;9?58`jss4=437iazt=73:==cg|~79<07;emvp935611ocxz352<;?air|5??255kotv?108?3me~x1;9>99gkpr;=>437iazt=7;:==cg|~79408;emvp93902ndyy290?:8`jss4?;546j`uu>56;><lf0;=18:flqq:1<720hb{{<77=<>bh}}6=:364dnww831902ndyy298?:8`jss4?35;6j`uu>5:==cg|~7;=07;emvp916611ocxz373<;?air|5=8255kotv?318?3me~x19:>99gkpr;??437iazt=54:==cg|~7;507;emvp91>6>1ocxz37?:8`jss41:546j`uu>;5;><lf05<18:flqq:?;720hb{{<96=<>bh}}639364dnww8=0902ndyy277?:8`jss412546j`uu>;=;1<lf0507;emvp9?7611ocxz390<;?air|539255kotv?=68?3me~x17;>99gkpr;1<437iazt=;5:==cg|~75:07;emvp9??611ocxz398<4?air|53556j}al]emci5?2nym`Qiigm/bl`hWnoeio{os]u2Z4+FFDN CAAE2g2?atfeVlbjb"iigm\c`hbzh~d~Rx9_3.xgZnf{VcexRmck<2/gZnf{Vyyy3?,b]q`Z`umx7: nQjn``oaZtt|Vyrbn3>,b]kevYulVnjxlQlotlw95*dWmceSzgkti?241*dWakxSz|Pd`vb[firf}7: nQiumn\big`{VxxxRxnl<3/gZojxeoficznthmm[qwm48'oR{|e^gnf`bcmmUyij3?,b]tvZ`umx7: nQzsd]gkprXzz~6=!mPuoffvcjhVfd{0>#c^jbwZiqm{lgcz3?,b]sv`jhimUgmykacx?2(fYcg|~T{dj{h<330)eXezmdbRxnl<3/gZtcWmo{xe3>036/gZcuzfxTecdjcukljZr~xl7; nQgar]vjacunee|1="l_icp[djjgz~Tjxbc=1.`[mgtW{y1<"l_ecweZeh}g~T{dj{h<33(fYoizU|~Rolk<2/gZstmVoho0>#c^alihiiWjfdof3?,b]tvZgdcVfd{0>#c^pg[uhszV}bhyf211.`[pubWo}mxRjnt`]`kphs59&hSeo|_`nnkvrXmdzu0>#c^pg[agsiVidyczPwhfwl877$jUdzh|ilnu\hjq:8%iT{Qnup\slbs`4;; nQrne\ahvsqV~r|h3?,b]tvZbf|hUhcx`{_vkgpm;?$jU{~hb`ae]qabu:8%iThb{{_sqw[sgk59&hSeo|_ecweZeh}g~6<!mPpsmd[cskdV~c~h}g_ogdeqcX~hf6==<?,b]tvZbbx}b6==<;,b]svjaXmdzuRzgrdqk[kc`i}oTzlb23-a\twi`Wlg{xtQ{hsgplZgt{lxS{oc=3.`[mgtWkgei3?,b]svjaXn|fgSyf}erj\evubz}U}ma3>033/gjkwggoexR`nmd?gvdkXn`ld nQyamkg[iip59&hS}|fm^djbjYsqyo6=fv<6-a\twi`Wog`Rzvpd?3(fYjmdeyuRzvpd?2(x443mxjaRhffn]emciXoldn~lz`r^t5[7Y{}U:46kkig0mca3<mdzu?h4fhdl[bcim{kcQy6^0/$]okagr+OB\J Fgmawgsg{*:>#=;;gwoha=nfcohxilftdpq`>oibliog{esp4?lhsWjf`46`hccwjha><goyjaaxa:rqkbYbey~r=95rne\ahvsqV~c~h}g(1+20>vugnUna}zv_ujqavn/9 ;?7}|`g^gntqX|axne&=)068twi`Wlg{xtQ{hsgpl-5.9=1{~biPelrw}Zrozlyc$9'>4:rqkbYbey~rSyf}erj+1,733yxdkRkbpu{\pmtb{a"=%<:4psmd[`kw|pUdk|h)5*51=wzfmTi`~{y^vkv`uo 1#:86~}of]fiur~W}byi~f'9(35?uthoVof|ywPtipfwm:>294:n6~}of]fiur~W}byi~fParqfvq.7!8h0|ah_dosp|Ys`{oxdRo|sdpw,4/6j2zycjQjmqvz[qnumzbTm~}jru*1-4d<x{elShctx]wlwct`Vkxh|{(2+2f>vugnUna}zv_ujqavnXizyn~y&;)0`8twi`Wlg{xtQ{hsgplZgt{lx$8'>b:rqkbYbey~rSyf}erj\evubz}"=%<l4psmd[`kw|pUdk|h^cpw`ts >#:n6~}of]fiur~W}byi~fParqfvq.?!8h0|ah_dosp|Ys`{oxdRo|sdpw,</6l2zycjQjmqvz[qnumzbTm~}jru>:>586j2zycjQjmqvz[qnumzbTbhintd*3-4d<x{elShctx]wlwct`Vdnklzj(0+2f>vugnUna}zv_ujqavnXflmjxh&=)0`8twi`Wlg{xtQ{hsgplZhboh~n$>'>b:rqkbYbey~rSyf}erj\j`af|l"?%<l4psmd[`kw|pUdk|h^lfcdrb <#:n6~}of]fiur~W}byi~fPndebp`.1!8h0|ah_dosp|Ys`{oxdR`jg`vf,2/6j2zycjQjmqvz[qnumzbTbhintd*;-4d<x{elShctx]wlwct`Vdnklzj(8+2`>vugnUna}zv_ujqavnXflmjxh26:1<:?uthoVl~`a?<;qplcZ`rdeUdk|h)2*56=wzfmTjxbc_ujqavn/9 ;87}|`g^dvhiYs`{oxd%<&129svjaXn|fgSyf}erj+7,743yxdkRhzlm]wlwct`!>"=>5rne\bpjkW}byi~f'5(30?uthoVl~`aQ{hsgpl-0.9:1{~biPftno[qnumzb#;$?<;qplcZ`rdeUdk|h):*56=wzfmTjxbc_ujqavn/1 ;>7}|`g^dvhiYs`{oxd1750?3b?uthoVl~`aQ{hsgplZgt{lx$='>a:rqkbYa}efTxe|jsi]bwvcu|!;"=l5rne\bpjkW}byi~fParqfvq.5!8k0|ah_gwohZrozlycSl}|esv+7,7f3yxdkRhzlm]wlwct`Vkxh|{(5+2e>vugnUmyabPtipfwmYf{zoyx%;&1`9svjaXn|fgSyf}erj\evubz}"=%<o4psmd[cskdV~c~h}g_`qpawr/? ;j7}|`g^dvhiYs`{oxdRo|sdpw,=/6i2zycjQiumn\pmtb{aUj~k}t);*5f=wzfmTjxbc_ujqavnXizyn~y26:1<2e>vugnUmyabPtipfwmYimnki%>&1`9svjaXn|fgSyf}erj\j`af|l":%<o4psmd[cskdV~c~h}g_ogdeqc/: ;j7}|`g^dvhiYs`{oxdR`jg`vf,6/6i2zycjQiumn\pmtb{aUeijo{e)6*5d=wzfmTjxbc_ujqavnXflmjxh&:)0c8twi`Wog`Rzgrdqk[kc`i}o#:$?n;qplcZ`rdeUdk|h^lfcdrb >#:m6~}of]eqijX|axneQaefcwa->.9h1{~biPftno[qnumzbTbhintd*:-4e<x{elSk{cl^vkv`uoWgolmyk39;2=2>tcWjf`==5}d^fbpdYdg|d$='>0:pg[agsiVidycz'1(33?wbXlh~jSnaznu*1-46<zmUomyoPcnwmp-5.991yhRjnt`]`kphs =#:<6|k_ecweZeh}g~#9$??;sf\`drfWje~by&9)028vaYci}kTob{at)5*55=ulVnjxlQlotlw,=/682xoSio{a^alqkr/1 ;;7jPd`vb[firf}6;2<<4re]geqgXkfex1750?78vaYbf?1yhR||t29qwq1<{kci|;;rppp43<|dz$Sni dscn[coag'dlc95{rtg:?phcm{lgcz;4v`nj`3=pzVkhg;5xr^aoo46<{UomyoPcnwmp-6.991|~Rjnt`]`kphs 8#:<6y}_ecweZeh}g~#>$??;vp\`drfWje~by&<)028swYci}kTob{at)6*55=pzVnjxlQlotlw,0/682}ySio{a^alqkr/> ;;7z|Pd`vb[firf}"<%<>4ws]geqgXkfex1>1119tvZbf|hUhcx`{<0<24>quWmkmRm`uov?6;773~xThlzn_bmvjq:468:0{Qkauc\gjsi|5>5==5xr^fbpdYdg|d080>0:uq[agsiVidycz36?31?rtXlh~jSnaznu>4>58682}ySio{a^alqkr;?7?0{Qjn79tvZtt|tJK|<>m9:BC|20f2O0?6<u\84844g<22899hokn:315b7}i=<81=6`:5285?!3283??m6s\82844g<22899hokn:315b7=T9jh1;<<50;306adbi388:k=4S919344=83;8>ilja;002c2<l>:<6=4>:0yP<0<08k0>6<==dcgb>751n;1}X?j9:182>4<59lqX48480c86>455lkoj6?=9f39'17?=9ji0Z8;>:3yv5a3=92:h;4?;|&1f`<582h<<:4?:ed97?basA?9;6T81;1x3?0=:>0v(?jk:624?!33n3=;h6g86483>>o0080;66a80d83>>i08j0;66g86g83>>o0>>0;66a93b83>!4d83<j>6`=bg83?>i1;k0;6)<l0;4b6>h5jo0:76a93`83>!4d83<j>6`=bg81?>i1;00;6)<l0;4b6>h5jo0876a99e83>!4d83<j>6`=bg87?>i11j0;6)<l0;4b6>h5jo0>76a99c83>!4d83<j>6`=bg85?>i11h0;6)<l0;4b6>h5jo0<76a99883>!4d83<j>6`=bg8;?>i1110;6)<l0;4b6>h5jo0276a99683>!4d83<j>6`=bg8b?>i11?0;6)<l0;4b6>h5jo0i76a99483>!4d83<j>6`=bg8`?>i11=0;6)<l0;4b6>h5jo0o76a99383>!4d83<j>6`=bg8f?>i1180;6)<l0;4b6>h5jo0m76a99183>!4d83<j>6`=bg824>=h>1l1<7*=c185e7=i:kl1=<54o7:f>5<#:j:1:l<4n3`e>44<3f<3h7>5$3a3>3g53g8ij7?<;:m5<f<72-8h<78n2:l1fc<6<21d:5l50;&1g5<1i;1e>oh51498k3>f290/>n>56`08j7da28<07b879;29 7e72?k97c<mf;34?>i10>0;6)<l0;4b6>h5jo0:465`69494?"5k90=m?5a2cd95<=<g?2>6=4+2b292d4<f;hm6<o4;n4;0?6=,;i;6;o=;o0ab?7e32e=4>4?:%0`4?0f:2d9nk4>c:9l2=4=83.9o=49a39m6g`=9m10c;6>:18'6f6=>h80b?li:0g8?j0?83:1(?m?:7c1?k4en3;m76a97g83>!4d83<j>6`=bg814>=h>>o1<7*=c185e7=i:kl1><54o75`>5<#:j:1:l<4n3`e>74<3f<<n7>5$3a3>3g53g8ij7<<;:m53d<72-8h<78n2:l1fc<5<21d::750;&1g5<1i;1e>oh52498k31?290/>n>56`08j7da2;<07b887;29 7e72?k97c<mf;04?>i1??0;6)<l0;4b6>h5jo09465`66794?"5k90=m?5a2cd96<=<g?=?6=4+2b292d4<f;hm6?o4;n447?6=,;i;6;o=;o0ab?4e32e=;<4?:%0`4?0f:2d9nk4=c:9l226=83.9o=49a39m6g`=:m10c;8i:18'6f6=>h80b?li:3g8?j01m3:1(?m?:7c1?k4en38m76a96e83>!4d83<j>6`=bg804>=h>?i1<7*=c185e7=i:kl1?<54o74a>5<#:j:1:l<4n3`e>64<3f<=m7>5$3a3>3g53g8ij7=<;:m52<<72-8h<78n2:l1fc<4<21d:;650;&1g5<1i;1e>oh53498k301290/>n>56`08j7da2:<07b895;29 7e72?k97c<mf;14?>i1>=0;6)<l0;4b6>h5jo08465`67194?"5k90=m?5a2cd97<=<g?<96=4+2b292d4<f;hm6>o4;n455?6=,;i;6;o=;o0ab?5e32e=:=4?:%0`4?0f:2d9nk4<c:9l20`=83.9o=49a39m6g`=;m10c;;j:18'6f6=>h80b?li:2g8?j02l3:1(?m?:7c1?k4en39m76a95c83>!4d83<j>6`=bg874>=h><k1<7*=c185e7=i:kl18<54o77:>5<#:j:1:l<4n3`e>14<3f<>47>5$3a3>3g53g8ij7:<;:m512<72-8h<78n2:l1fc<3<21d:8850;&1g5<1i;1e>oh54498k332290/>n>56`08j7da2=<07b8:4;29 7e72?k97c<mf;64?>i1=:0;6)<l0;4b6>h5jo0?465`64094?"5k90=m?5a2cd90<=<g??;6=4+2b292d4<f;hm69o4;n47b?6=,;i;6;o=;o0ab?2e32e=8h4?:%0`4?0f:2d9nk4;c:9l21b=83.9o=49a39m6g`=<m10c;:l:18'6f6=>h80b?li:5g8?j03j3:1(?m?:7c1?k4en3>m76a94`83>!4d83<j>6`=bg864>=h>=31<7*=c185e7=i:kl19<54o76;>5<#:j:1:l<4n3`e>04<3f<?;7>5$3a3>3g53g8ij7;<;:m500<72-8h<78n2:l1fc<2<21d:9:50;&1g5<1i;1e>oh55498k324290/>n>56`08j7da2<<07b8;2;29 7e72?k97c<mf;74?>i1<80;6)<l0;4b6>h5jo0>465`65294?"5k90=m?5a2cd91<=<g?9m6=4+2b292d4<f;hm68o4;n40a?6=,;i;6;o=;o0ab?3e32e=?i4?:%0`4?0f:2d9nk4:c:9l26>=83.9o=49a39m6g`==m10c;7<:18'6f6=>h80b?li:4g8?j0?03:1(?m?:7c1?k4en3?m76a97e83>!4d83<j>6`=bg854>=h>>81<7*=c185e7=i:kl1:<54o744>5<#:j:1:l<4n3`e>34<3f<>o7>5$3a3>3g53g8ij78<;:m514<72-8h<78n2:l1fc<1<21d:9850;&1g5<1i;1e>oh56498k350290/>n>56`08j7da2?<07b8<6;29 7e72?k97c<mf;44?>o2>k0;6)<l0;7g5>h5jo0;76g:6`83>!4d83?o=6`=bg82?>o2>00;6)<l0;7g5>h5jo0976g:6983>!4d83?o=6`=bg80?>o2kj0;6)<l0;7g5>h5jo0?76g:cc83>!4d83?o=6`=bg86?>o2kh0;6)<l0;7g5>h5jo0=76g:c883>!4d83?o=6`=bg84?>o2k10;6)<l0;7g5>h5jo0376g:c683>!4d83?o=6`=bg8:?>o2k?0;6)<l0;7g5>h5jo0j76g:c483>!4d83?o=6`=bg8a?>o2k=0;6)<l0;7g5>h5jo0h76g:c283>!4d83?o=6`=bg8g?>o2k80;6)<l0;7g5>h5jo0n76g:c183>!4d83?o=6`=bg8e?>o2jo0;6)<l0;7g5>h5jo0:<65f5cg94?"5k90>h<5a2cd954=<a<ho6=4+2b291a7<f;hm6<<4;h7ag?6=,;i;68j>;o0ab?7432c>no4?:%0`4?3c92d9nk4>4:9j1gg=83.9o=4:d09m6g`=9<10e8l6:18'6f6==m;0b?li:048?l3e03:1(?m?:4f2?k4en3;<76g:b783>!4d83?o=6`=bg82<>=n=k?1<7*=c186`4=i:kl1=454i4`7>5<#:j:19i?4n3`e>4g<3`?i?7>5$3a3>0b63g8ij7?m;:k6f7<72-8h<7;k1:l1fc<6k21b9o?50;&1g5<2l81e>oh51e98m0d7290/>n>55e38j7da28o07d;nf;29 7e72<n:7c<mf;3e?>o2il0;6)<l0;7g5>h5jo09<65f5`f94?"5k90>h<5a2cd964=<a<ki6=4+2b291a7<f;hm6?<4;h7be?6=,;i;68j>;o0ab?4432c>m44?:%0`4?3c92d9nk4=4:9j1d>=83.9o=4:d09m6g`=:<10e8o8:18'6f6==m;0b?li:348?l3f>3:1(?m?:4f2?k4en38<76g:a483>!4d83?o=6`=bg81<>=n=h>1<7*=c186`4=i:kl1>454i4c0>5<#:j:19i?4n3`e>7g<3`?j>7>5$3a3>0b63g8ij7<m;:k6e5<72-8h<7;k1:l1fc<5k21b94h50;&1g5<2l81e>oh52e98m0?b290/>n>55e38j7da2;o07d;6d;29 7e72<n:7c<mf;0e?>o21j0;6)<l0;7g5>h5jo08<65f58`94?"5k90>h<5a2cd974=<a<3j6=4+2b291a7<f;hm6><4;h7:=?6=,;i;68j>;o0ab?5432c>554?:%0`4?3c92d9nk4<4:9j1<1=83.9o=4:d09m6g`=;<10e87::18'6f6==m;0b?li:248?l3><3:1(?m?:4f2?k4en39<76g:9283>!4d83?o=6`=bg80<>=n=081<7*=c186`4=i:kl1?454i4;2>5<#:j:19i?4n3`e>6g<3`?2<7>5$3a3>0b63g8ij7=m;:k6<c<72-8h<7;k1:l1fc<4k21b95k50;&1g5<2l81e>oh53e98m0>c290/>n>55e38j7da2:o07d;7c;29 7e72<n:7c<mf;1e?>o20h0;6)<l0;7g5>h5jo0?<65f59;94?"5k90>h<5a2cd904=<a<236=4+2b291a7<f;hm69<4;h7;3?6=,;i;68j>;o0ab?2432c>4;4?:%0`4?3c92d9nk4;4:9j1=3=83.9o=4:d09m6g`=<<10e86;:18'6f6==m;0b?li:548?l3?;3:1(?m?:4f2?k4en3><76g:8383>!4d83?o=6`=bg87<>=n=1;1<7*=c186`4=i:kl18454i45e>5<#:j:19i?4n3`e>1g<3`?<i7>5$3a3>0b63g8ij7:m;:k63a<72-8h<7;k1:l1fc<3k21b9:m50;&1g5<2l81e>oh54e98m01e290/>n>55e38j7da2=o07d;8a;29 7e72<n:7c<mf;6e?>o2?00;6)<l0;7g5>h5jo0><65f56:94?"5k90>h<5a2cd914=<a<=<6=4+2b291a7<f;hm68<4;h742?6=,;i;68j>;o0ab?3432c>;94?:%0`4?3c92d9nk4:4:9j125=83.9o=4:d09m6g`==<10e89=:18'6f6==m;0b?li:448?l3093:1(?m?:4f2?k4en3?<76g:7183>!4d83?o=6`=bg86<>=n=?l1<7*=c186`4=i:kl19454i44f>5<#:j:19i?4n3`e>0g<3`?=h7>5$3a3>0b63g8ij7;m;:k62f<72-8h<7;k1:l1fc<2k21b9;950;&1g5<2l81e>oh55e98m0e5290/>n>55e38j7da2<o07d;m7;29 7e72<n:7c<mf;7e?>o2ij0;6)<l0;7g5>h5jo0=<65f5`394?"5k90>h<5a2cd924=<a<3=6=4+2b291a7<f;hm6;<4;h7;f?6=,;i;68j>;o0ab?0432c>4=4?:%0`4?3c92d9nk494:9j123=83.9o=4:d09m6g`=><10e889:18'6f6==m;0b?li:748?l31=3:1(?m?:4f2?k4en3<<76a87683>!4d83=<j6`=bg83?>i0??0;6)<l0;54b>h5jo0:76a87483>!4d83=<j6`=bg81?>i0?=0;6)<l0;54b>h5jo0876a87283>!4d83=<j6`=bg87?>i0?;0;6)<l0;54b>h5jo0>76a87083>!4d83=<j6`=bg85?>i0?90;6)<l0;54b>h5jo0<76g85983>>d2:10;6<4?:1yK171<,;no68<7;n0a`?6=3th:>k4?:083>5}O=;=0(?jk:00e?j75m3:17pl80;29514=9=i1><ktH404?_1628<p5765a;g9f?e=l3=1:7h5268f>71=?3l15785d;a9f?g=03w/>ij571c8 2e=?920(5:571;8 7d?2;hh7d9=9;29 7e72>8j7c<mf;28?l1503:1(?m?:60b?k4en3;07d9=7;29 7e72>8j7c<mf;08?l15>3:1(?m?:60b?k4en3907d9=5;29 7e72>8j7c<mf;68?l15<3:1(?m?:60b?k4en3?07d9=3;29 7e72>8j7c<mf;48?l15:3:1(?m?:60b?k4en3=07d9=1;29 7e72>8j7c<mf;:8?l1583:1(?m?:60b?k4en3307d9>0;29?l11>3:17d999;29?j11l3:17d9>e;29 7e72>;m7c<mf;28?l16l3:1(?m?:63e?k4en3;07d9>c;29 7e72>;m7c<mf;08?l16j3:1(?m?:63e?k4en3907d9>a;29 7e72>;m7c<mf;68?l1613:1(?m?:63e?k4en3?07d9>8;29 7e72>;m7c<mf;48?l16?3:1(?m?:63e?k4en3=07d9>6;29 7e72>;m7c<mf;:8?l16=3:1(?m?:63e?k4en3307d995;29?j16;3:17d9<4;29 7e72>9>7c<mf;28?l14;3:1(?m?:616?k4en3;07d9<2;29 7e72>9>7c<mf;08?l1493:1(?m?:616?k4en3907d9<0;29 7e72>9>7c<mf;68?l15n3:1(?m?:616?k4en3?07d9=e;29 7e72>9>7c<mf;48?l15l3:1(?m?:616?k4en3=07d9=c;29 7e72>9>7c<mf;:8?l15j3:1(?m?:616?k4en3307b;:5;29?j31:3:1(?m?:440?k4en3:07b;91;29 7e72<<87c<mf;38?j3183:1(?m?:440?k4en3807b;:f;29 7e72<<87c<mf;18?j32m3:1(?m?:440?k4en3>07b;:d;29 7e72<<87c<mf;78?j32k3:1(?m?:440?k4en3<07b;:b;29 7e72<<87c<mf;58?j32i3:1(?m?:440?k4en3207b;:9;29 7e72<<87c<mf;;8?j14>3:17d971;29?l1383:1(?m?:662?k4en3:07d9<f;29 7e72>>:7c<mf;38?l14m3:1(?m?:662?k4en3807d9<d;29 7e72>>:7c<mf;18?l14k3:1(?m?:662?k4en3>07d9<b;29 7e72>>:7c<mf;78?l14i3:1(?m?:662?k4en3<07d9<9;29 7e72>>:7c<mf;58?l1403:1(?m?:662?k4en3207d9<7;29 7e72>>:7c<mf;;8?j17m3:17b9?c;29?l11n3:17d;:7;29?l13j3:1(?m?:66`?k4en3:07d9;a;29 7e72>>h7c<mf;38?l1313:1(?m?:66`?k4en3807d9;8;29 7e72>>h7c<mf;18?l13?3:1(?m?:66`?k4en3>07d9;6;29 7e72>>h7c<mf;78?l13=3:1(?m?:66`?k4en3<07d9;4;29 7e72>>h7c<mf;58?l13;3:1(?m?:66`?k4en3207d9;2;29 7e72>>h7c<mf;;8?l12>3:1(?m?:674?k4en3:07d9:5;29 7e72>?<7c<mf;38?l12<3:1(?m?:674?k4en3807d9:3;29 7e72>?<7c<mf;18?l12:3:1(?m?:674?k4en3>07d9:1;29 7e72>?<7c<mf;78?l1283:1(?m?:674?k4en3<07d9;f;29 7e72>?<7c<mf;58?l13m3:1(?m?:674?k4en3207d9;d;29 7e72>?<7c<mf;;8?j32<3:17d9>1;29?l3203:17d972;29?j1103:17b99e;29?l11?3:17b8<c;29 7e72?k97c<mf;28?j04j3:1(?m?:7c1?k4en3;07b8<a;29 7e72?k97c<mf;08?j0413:1(?m?:7c1?k4en3907b86d;29 7e72?k97c<mf;68?j0>k3:1(?m?:7c1?k4en3?07b86b;29 7e72?k97c<mf;48?j0>i3:1(?m?:7c1?k4en3=07b869;29 7e72?k97c<mf;:8?j0>03:1(?m?:7c1?k4en3307b867;29 7e72?k97c<mf;c8?j0>>3:1(?m?:7c1?k4en3h07b865;29 7e72?k97c<mf;a8?j0><3:1(?m?:7c1?k4en3n07b862;29 7e72?k97c<mf;g8?j0>93:1(?m?:7c1?k4en3l07b860;29 7e72?k97c<mf;33?>i10o0;6)<l0;4b6>h5jo0:=65`69g94?"5k90=m?5a2cd957=<g?2o6=4+2b292d4<f;hm6<=4;n4;g?6=,;i;6;o=;o0ab?7332e=4o4?:%0`4?0f:2d9nk4>5:9l2=g=83.9o=49a39m6g`=9?10c;66:18'6f6=>h80b?li:058?j0??3:1(?m?:7c1?k4en3;376a98783>!4d83<j>6`=bg82=>=h>1?1<7*=c185e7=i:kl1=l54o7:7>5<#:j:1:l<4n3`e>4d<3f<3?7>5$3a3>3g53g8ij7?l;:m5<7<72-8h<78n2:l1fc<6l21d:5?50;&1g5<1i;1e>oh51d98k3>7290/>n>56`08j7da28l07b88f;29 7e72?k97c<mf;03?>i1?l0;6)<l0;4b6>h5jo09=65`66a94?"5k90=m?5a2cd967=<g?=i6=4+2b292d4<f;hm6?=4;n44e?6=,;i;6;o=;o0ab?4332e=;44?:%0`4?0f:2d9nk4=5:9l22>=83.9o=49a39m6g`=:?10c;98:18'6f6=>h80b?li:358?j00>3:1(?m?:7c1?k4en38376a97483>!4d83<j>6`=bg81=>=h>>>1<7*=c185e7=i:kl1>l54o750>5<#:j:1:l<4n3`e>7d<3f<<=7>5$3a3>3g53g8ij7<l;:m535<72-8h<78n2:l1fc<5l21d:;h50;&1g5<1i;1e>oh52d98k30b290/>n>56`08j7da2;l07b89d;29 7e72?k97c<mf;13?>i1>j0;6)<l0;4b6>h5jo08=65`67`94?"5k90=m?5a2cd977=<g?<j6=4+2b292d4<f;hm6>=4;n45=?6=,;i;6;o=;o0ab?5332e=:54?:%0`4?0f:2d9nk4<5:9l230=83.9o=49a39m6g`=;?10c;8::18'6f6=>h80b?li:258?j01<3:1(?m?:7c1?k4en39376a96283>!4d83<j>6`=bg80=>=h>?81<7*=c185e7=i:kl1?l54o742>5<#:j:1:l<4n3`e>6d<3f<=<7>5$3a3>3g53g8ij7=l;:m51c<72-8h<78n2:l1fc<4l21d:8k50;&1g5<1i;1e>oh53d98k33c290/>n>56`08j7da2:l07b8:b;29 7e72?k97c<mf;63?>i1=h0;6)<l0;4b6>h5jo0?=65`64;94?"5k90=m?5a2cd907=<g??36=4+2b292d4<f;hm69=4;n463?6=,;i;6;o=;o0ab?2332e=9;4?:%0`4?0f:2d9nk4;5:9l203=83.9o=49a39m6g`=<?10c;;;:18'6f6=>h80b?li:558?j02;3:1(?m?:7c1?k4en3>376a95383>!4d83<j>6`=bg87=>=h><:1<7*=c185e7=i:kl18l54o76e>5<#:j:1:l<4n3`e>1d<3f<?i7>5$3a3>3g53g8ij7:l;:m50a<72-8h<78n2:l1fc<3l21d:9m50;&1g5<1i;1e>oh54d98k32e290/>n>56`08j7da2=l07b8;a;29 7e72?k97c<mf;73?>i1<00;6)<l0;4b6>h5jo0>=65`65:94?"5k90=m?5a2cd917=<g?><6=4+2b292d4<f;hm68=4;n471?6=,;i;6;o=;o0ab?3332e=894?:%0`4?0f:2d9nk4:5:9l215=83.9o=49a39m6g`==?10c;:=:18'6f6=>h80b?li:458?j0393:1(?m?:7c1?k4en3?376a94183>!4d83<j>6`=bg86=>=h>:l1<7*=c185e7=i:kl19l54o71f>5<#:j:1:l<4n3`e>0d<3f<8h7>5$3a3>3g53g8ij7;l;:m57=<72-8h<78n2:l1fc<2l21d:4=50;&1g5<1i;1e>oh55d98k3>?290/>n>56`08j7da2<l07b88d;29 7e72?k97c<mf;43?>i1?;0;6)<l0;4b6>h5jo0==65`67594?"5k90=m?5a2cd927=<g??h6=4+2b292d4<f;hm6;=4;n465?6=,;i;6;o=;o0ab?0332e=8;4?:%0`4?0f:2d9nk495:9l261=83.9o=49a39m6g`=>?10c;=9:18'6f6=>h80b?li:758?l31j3:1(?m?:4f2?k4en3:07d;9a;29 7e72<n:7c<mf;38?l3113:1(?m?:4f2?k4en3807d;98;29 7e72<n:7c<mf;18?l3dk3:1(?m?:4f2?k4en3>07d;lb;29 7e72<n:7c<mf;78?l3di3:1(?m?:4f2?k4en3<07d;l9;29 7e72<n:7c<mf;58?l3d03:1(?m?:4f2?k4en3207d;l7;29 7e72<n:7c<mf;;8?l3d>3:1(?m?:4f2?k4en3k07d;l5;29 7e72<n:7c<mf;`8?l3d<3:1(?m?:4f2?k4en3i07d;l3;29 7e72<n:7c<mf;f8?l3d93:1(?m?:4f2?k4en3o07d;l0;29 7e72<n:7c<mf;d8?l3en3:1(?m?:4f2?k4en3;;76g:bd83>!4d83?o=6`=bg825>=n=kn1<7*=c186`4=i:kl1=?54i4``>5<#:j:19i?4n3`e>45<3`?in7>5$3a3>0b63g8ij7?;;:k6fd<72-8h<7;k1:l1fc<6=21b9o750;&1g5<2l81e>oh51798m0d?290/>n>55e38j7da28=07d;m6;29 7e72<n:7c<mf;3;?>o2j<0;6)<l0;7g5>h5jo0:565f5c694?"5k90>h<5a2cd95d=<a<h86=4+2b291a7<f;hm6<l4;h7a6?6=,;i;68j>;o0ab?7d32c>n<4?:%0`4?3c92d9nk4>d:9j1g6=83.9o=4:d09m6g`=9l10e8oi:18'6f6==m;0b?li:0d8?l3fm3:1(?m?:4f2?k4en38;76g:ae83>!4d83?o=6`=bg815>=n=hh1<7*=c186`4=i:kl1>?54i4cb>5<#:j:19i?4n3`e>75<3`?j57>5$3a3>0b63g8ij7<;;:k6e=<72-8h<7;k1:l1fc<5=21b9l950;&1g5<2l81e>oh52798m0g1290/>n>55e38j7da2;=07d;n5;29 7e72<n:7c<mf;0;?>o2i=0;6)<l0;7g5>h5jo09565f5`194?"5k90>h<5a2cd96d=<a<k96=4+2b291a7<f;hm6?l4;h7b4?6=,;i;68j>;o0ab?4d32c>5k4?:%0`4?3c92d9nk4=d:9j1<c=83.9o=4:d09m6g`=:l10e87k:18'6f6==m;0b?li:3d8?l3>k3:1(?m?:4f2?k4en39;76g:9c83>!4d83?o=6`=bg805>=n=0k1<7*=c186`4=i:kl1??54i4;:>5<#:j:19i?4n3`e>65<3`?247>5$3a3>0b63g8ij7=;;:k6=2<72-8h<7;k1:l1fc<4=21b94;50;&1g5<2l81e>oh53798m0?3290/>n>55e38j7da2:=07d;63;29 7e72<n:7c<mf;1;?>o21;0;6)<l0;7g5>h5jo08565f58394?"5k90>h<5a2cd97d=<a<3;6=4+2b291a7<f;hm6>l4;h7;b?6=,;i;68j>;o0ab?5d32c>4h4?:%0`4?3c92d9nk4<d:9j1=b=83.9o=4:d09m6g`=;l10e86l:18'6f6==m;0b?li:2d8?l3?i3:1(?m?:4f2?k4en3>;76g:8883>!4d83?o=6`=bg875>=n=121<7*=c186`4=i:kl18?54i4:4>5<#:j:19i?4n3`e>15<3`?3:7>5$3a3>0b63g8ij7:;;:k6<0<72-8h<7;k1:l1fc<3=21b95:50;&1g5<2l81e>oh54798m0>4290/>n>55e38j7da2==07d;72;29 7e72<n:7c<mf;6;?>o2080;6)<l0;7g5>h5jo0?565f56d94?"5k90>h<5a2cd90d=<a<=n6=4+2b291a7<f;hm69l4;h74`?6=,;i;68j>;o0ab?2d32c>;n4?:%0`4?3c92d9nk4;d:9j12d=83.9o=4:d09m6g`=<l10e89n:18'6f6==m;0b?li:5d8?l3013:1(?m?:4f2?k4en3?;76g:7983>!4d83?o=6`=bg865>=n=>=1<7*=c186`4=i:kl19?54i455>5<#:j:19i?4n3`e>05<3`?<87>5$3a3>0b63g8ij7;;;:k636<72-8h<7;k1:l1fc<2=21b9:<50;&1g5<2l81e>oh55798m016290/>n>55e38j7da2<=07d;80;29 7e72<n:7c<mf;7;?>o2>o0;6)<l0;7g5>h5jo0>565f57g94?"5k90>h<5a2cd91d=<a<<o6=4+2b291a7<f;hm68l4;h75g?6=,;i;68j>;o0ab?3d32c>::4?:%0`4?3c92d9nk4:d:9j1f4=83.9o=4:d09m6g`==l10e8l8:18'6f6==m;0b?li:4d8?l3fk3:1(?m?:4f2?k4en3<;76g:a083>!4d83?o=6`=bg855>=n=0<1<7*=c186`4=i:kl1:?54i4:a>5<#:j:19i?4n3`e>35<3`?3<7>5$3a3>0b63g8ij78;;:k630<72-8h<7;k1:l1fc<1=21b9;850;&1g5<2l81e>oh56798m002290/>n>55e38j7da2?=07d;:6;29?j11:3:1(?m?:647?k4en3:07b991;29 7e72><?7c<mf;38?j1183:1(?m?:647?k4en3807b9:f;29 7e72><?7c<mf;18?j12m3:1(?m?:647?k4en3>07b9:d;29 7e72><?7c<mf;78?j12k3:1(?m?:647?k4en3<07b9:b;29 7e72><?7c<mf;58?j12i3:1(?m?:647?k4en3207b9:9;29 7e72><?7c<mf;;8?j10?3:1(?m?:65e?k4en3:07b986;29 7e72>=m7c<mf;38?j10=3:1(?m?:65e?k4en3807b984;29 7e72>=m7c<mf;18?j10;3:1(?m?:65e?k4en3>07b982;29 7e72>=m7c<mf;78?j1093:1(?m?:65e?k4en3<07b980;29 7e72>=m7c<mf;58?j16<3:17d9?f;29?j31<3:17d9:8;29?j11k3:17o;;d;295?6=8r.9hi4>2g9K11e<@<8<7b?=e;29?xd2<l0;6<4?:1y'6ab==;20D8:l;I713>i5jm0;66sm3g294?2=83:p(?jk:00a?M33k2B>>:5+15490>o0:3:17d69:188m7e62900c?m=:188yg5a;3:187>50z&1`a<6:k1C99m4H404?!73>3>0e:<50;9j<3<722c9o<4?::m1g7<722wi8l?50;694?6|,;no6<<m;I77g>N2:>1/=9854:k46?6=3`2=6=44i3a2>5<<g;i96=44}c6b4?6=<3:1<v*=de826g=O==i0D8<8;%372?2<a>81<75f8783>>o5k80;66a=c383>>{e=9o1<7:50;2x 7bc28827E;;c:J662=#9=<1=6g82;29?l>52900e5850;9l6f4=831vn8?l:187>5<7s-8oh7?=b:J60f=O=;=0D;h4$0f0>20e3-;?:7:4i6094?=n0?0;66g=c083>>i5k;0;66sm50394?5=83:p(?jk:00;?M33k2B>>:5G6g9'5a5=??h0(<:9:09j37<722c3:7>5;n0`6?6=3th>=k4?:283>5}#:mn1=?64H46`?M35?2B=j6*>d2842g=#9=<1=6g82;29?l>12900c?m=:188yg36j3:187>50z&1`a<6:k1C99m4H404?M0a3-;o?799b:&203<33`=96=44i9494?=n:j;1<75`2b094?=zj<;;6=4<:183!4cl3;946F:4b9K171<@?l0(<j<:64a?!73>3;0e:<50;9j<3<722e9o?4?::a14b=83?1<7>t$3fg>44d3A??o6F:269K2c=#9m91;;l4i6094?=n?k0;66g76;29?l4d93:17b<l2;29?xd29l0;6>4?:1y'6ab=9;20D8:l;I713>N1n2.:h>486c9'510=92c<>7>5;h:5>5<<g;i96=44}c73b?6==3:1<v*=de826f=O==i0D8<8;I4e?!7c;3==n6g82;29?l1e2900e5850;9j6f7=831d>n<50;9~f07f290?6=4?{%0g`?75j2B>8n5G5358L3`<,8n86:8m;%372?2<a>81<75f8783>>o5k80;66a=c383>>{e=831<7:50;2x 7bc288i7E;;c:J662=#9=<186g82;29?l>12900e?m>:188k7e52900qo;>8;290?6=8r.9hi4>2c9K11e<@<8<7)?;6;68m24=831b4;4?::k1g4<722e9o?4?::a141=83>1<7>t$3fg>44e3A??o6F:269'510=<2c<>7>5;h:5>5<<a;i:6=44o3a1>5<<uk?997>54;294~"5lm0:>o5G55a8L0403-;?:7:4i6094?=n0?0;66g=c083>>i5k;0;66sm53694?2=83:p(?jk:00a?M33k2B>>:5+15490>o0:3:17d69:188m7e62900c?m=:188yg56?3:187>50z&1`a<6:01C99m4H404?!73>3;0e:<50;9j<7<722c3:7>5;n0`6?6=3th8=;4?:583>5}#:mn1=?74H46`?M35?2.:8;4>;h51>5<<a181<75f8783>>i5k;0;66sm30794?2=83:p(?jk:00:?M33k2B>>:5+15495>o0:3:17d6=:188m=0=831d>n<50;9~f673290?6=4?{%0g`?7512B>8n5G5358 421281b;?4?::k;6?6=3`2=6=44o3a1>5<<uk9:?7>54;294~"5lm0:>45G55a8L0403-;?:7?4i6094?=n0;0;66g76;29?j4d:3:17pl<1383>1<729q/>ij513;8L02d3A?9;6*>4782?l152900e5<50;9j<3<722e9o?4?::a747=83>1<7>t$3fg>44>3A??o6F:269'510=92c<>7>5;h:1>5<<a1<1<75`2b094?=zj:;;6=4;:183!4cl3;956F:4b9K171<,8>=6<5f7383>>o?:3:17d69:188k7e52900qo=?f;290?6=8r.9hi4>289K11e<@<8<7)?;6;38m24=831b4?4?::k;2?6=3f8h>7>5;|`04`<72=0;6=u+2ef957?<@<>h7E;=7:&203<63`=96=44i9094?=n0?0;66a=c383>>{e;>31<7:50;2x 7bc28827E;;c:J662=#9=<1=6g82;29?l>52900e5850;9l6f4=831vn>97:187>5<7s-8oh7?=9:J60f=O=;=0(<:9:09j37<722c3>7>5;h:5>5<<g;i96=44}c143?6=<3:1<v*=de826<=O==i0D8<8;%372?7<a>81<75f8383>>o?>3:17b<l2;29?xd4??0;694?:1y'6ab=9;30D8:l;I713>"6<?0:7d9=:188m=4=831b4;4?::m1g7<722wi?:;50;694?6|,;no6<<6;I77g>N2:>1/=9851:k46?6=3`296=44i9494?=h:j81<75rb257>5<3290;w)<kd;31=>N2<j1C9?94$065>4=n?;0;66g72;29?l>12900c?m=:188yg50;3:187>50z&1`a<6:01C99m4H404?!73>3;0e:<50;9j<7<722c3:7>5;n0`6?6=3th8;?4?:583>5}#:mn1=?74H46`?M35?2.:8;4>;h51>5<<a181<75f8783>>i5k;0;66sm36394?2=83:p(?jk:00:?M33k2B>>:5+15495>o0:3:17d6=:188m=0=831d>n<50;9~f617290?6=4?{%0g`?7512B>8n5G5358 421281b;?4?::k;6?6=3`2=6=44o3a1>5<<uk9ii7>54;294~"5lm0:>45G55a8L0403-;?:7?4i6094?=n0;0;66g76;29?j4d:3:17pl<be83>1<729q/>ij513;8L02d3A?9;6*>4782?l152900e5<50;9j<3<722e9o?4?::a7ge=83>1<7>t$3fg>44>3A??o6F:269'510=92c<>7>5;h:1>5<<a1<1<75`2b094?=zj:hi6=4;:183!4cl3;956F:4b9K171<,8>=6<5f7383>>o?:3:17d69:188k7e52900qo=ma;290?6=8r.9hi4>289K11e<@<8<7)?;6;38m24=831b4?4?::k;2?6=3f8h>7>5;|`0f<<72=0;6=u+2ef957?<@<>h7E;=7:&203<63`=96=44i9094?=n0?0;66a=c383>>{e;k21<7:50;2x 7bc28827E;;c:J662=#9=<1=6g82;29?l>52900e5850;9l6f4=831vn>l8:187>5<7s-8oh7?=9:J60f=O=;=0(<:9:09j37<722c3>7>5;h:5>5<<g;i96=44}c1a2?6=<3:1<v*=de826<=O==i0D8<8;%372?7<a>81<75f8383>>o?>3:17b<l2;29?xd4j<0;694?:1y'6ab=9;30D8:l;I713>"6<?0:7d9=:188m=4=831b4;4?::m1g7<722wi?8m50;694?6|,;no6<<6;I77g>N2:>1/=9851:k46?6=3`296=44i9494?=h:j81<75rb27a>5<3290;w)<kd;31=>N2<j1C9?94$065>4=n?;0;66g72;29?l>12900c?m=:188yg52i3:187>50z&1`a<6:01C99m4H404?!73>3;0e:<50;9j<7<722c3:7>5;n0`6?6=3th8944?:583>5}#:mn1=?74H46`?M35?2.:8;4>;h51>5<<a181<75f8783>>i5k;0;66sm34:94?2=83:p(?jk:00:?M33k2B>>:5+15495>o0:3:17d6=:188m=0=831d>n<50;9~f630290?6=4?{%0g`?7512B>8n5G5358 421281b;?4?::k;6?6=3`2=6=44o3a1>5<<uk9>:7>54;294~"5lm0:>45G55a8L0403-;?:7?4i6094?=n0;0;66g76;29?j4d:3:17pl<5483>1<729q/>ij513;8L02d3A?9;6*>4782?l152900e5<50;9j<3<722e9o?4?::a702=83>1<7>t$3fg>44>3A??o6F:269'510=92c<>7>5;h:1>5<<a1<1<75`2b094?=zj:?86=4;:183!4cl3;956F:4b9K171<,8>=6<5f7383>>o?:3:17d69:188k7e52900qo=na;290?6=8r.9hi4>289K11e<@<8<7E8i;%3g7?11j2.:8;4>;h51>5<<a181<75f8783>>i5k;0;66sm3`;94?2=83:p(?jk:00:?M33k2B>>:5G6g9'5a5=??h0(<:9:09j37<722c3>7>5;h:5>5<<g;i96=44}c1b<?6=<3:1<v*=de826<=O==i0D8<8;I4e?!7c;3==n6*>4782?l152900e5<50;9j<3<722e9o?4?::a7d1=83>1<7>t$3fg>44>3A??o6F:269K2c=#9m91;;l4$065>4=n?;0;66g72;29?l>12900c?m=:188yg5f>3:187>50z&1`a<6:01C99m4H404?M0a3-;o?799b:&203<63`=96=44i9094?=n0?0;66a=c383>>{e;h?1<7:50;2x 7bc28827E;;c:J662=O>o1/=i=577`8 421281b;?4?::k;6?6=3`2=6=44o3a1>5<<uk9j87>54;294~"5lm0:>45G55a8L0403A<m7)?k3;55f>"6<?0:7d9=:188m=4=831b4;4?::m1g7<722wi?l=50;694?6|,;no6<<6;I77g>N2:>1C:k5+1e1933d<,8>=6<5f7383>>o?:3:17d69:188k7e52900qo=n2;290?6=8r.9hi4>289K11e<@<8<7E8i;%3g7?11j2.:8;4>;h51>5<<a181<75f8783>>i5k;0;66sm3`394?2=83:p(?jk:00:?M33k2B>>:5G6g9'5a5=??h0(<:9:09j37<722c3>7>5;h:5>5<<g;i96=44}c17<?6=<3:1<v*=de826<=O==i0D8<8;I4e?!7c;3==n6*>4782?l152900e5<50;9j<3<722e9o?4?::a711=83>1<7>t$3fg>44>3A??o6F:269K2c=#9m91;;l4$065>4=n?;0;66g72;29?l>12900c?m=:188yg53>3:187>50z&1`a<6:01C99m4H404?M0a3-;o?799b:&203<63`=96=44i9094?=n0?0;66a=c383>>{e;=?1<7:50;2x 7bc28827E;;c:J662=O>o1/=i=577`8 421281b;?4?::k;6?6=3`2=6=44o3a1>5<<uk9?87>54;294~"5lm0:>45G55a8L0403A<m7)?k3;55f>"6<?0:7d9=:188m=4=831b4;4?::m1g7<722wi?9=50;694?6|,;no6<<6;I77g>N2:>1C:k5+1e1933d<,8>=6<5f7383>>o?:3:17d69:188k7e52900qo=;2;290?6=8r.9hi4>289K11e<@<8<7E8i;%3g7?11j2.:8;4>;h51>5<<a181<75f8783>>i5k;0;66sm35394?2=83:p(?jk:00:?M33k2B>>:5G6g9'5a5=??h0(<:9:09j37<722c3>7>5;h:5>5<<g;i96=44}c174?6=<3:1<v*=de826<=O==i0D8<8;I4e?!7c;3==n6*>4782?l152900e5<50;9j<3<722e9o?4?::a76`=83>1<7>t$3fg>44>3A??o6F:269K2c=#9m91;;l4$065>4=n?;0;66g72;29?l>12900c?m=:188yg54<3:187>50z&1`a<6:01C99m4H404?!73>3;0e:<50;9j<7<722c3:7>5;n0`6?6=3th8?>4?:583>5}#:mn1=?74H46`?M35?2.:8;4>;h51>5<<a181<75f8783>>i5k;0;66sm32094?2=83:p(?jk:00:?M33k2B>>:5+15495>o0:3:17d6=:188m=0=831d>n<50;9~f656290?6=4?{%0g`?7512B>8n5G5358 421281b;?4?::k;6?6=3`2=6=44o3a1>5<<uk98<7>54;294~"5lm0:>45G55a8L0403-;?:7?4i6094?=n0;0;66g76;29?j4d:3:17pl<2g83>1<729q/>ij513;8L02d3A?9;6*>4782?l152900e5<50;9j<3<722e9o?4?::a77c=83>1<7>t$3fg>44>3A??o6F:269'510=92c<>7>5;h:1>5<<a1<1<75`2b094?=zj:8o6=4;:183!4cl3;956F:4b9K171<,8>=6<5f7383>>o?:3:17d69:188k7e52900qo==c;290?6=8r.9hi4>289K11e<@<8<7)?;6;38m24=831b4?4?::k;2?6=3f8h>7>5;|`06g<72=0;6=u+2ef957?<@<>h7E;=7:&203<63`=96=44i9094?=n0?0;66a=c383>>{e;0<1<7:50;2x 7bc28827E;;c:J662=#9=<1=6g82;29?l>52900e5850;9l6f4=831vn>7::187>5<7s-8oh7?=9:J60f=O=;=0(<:9:09j37<722c3>7>5;h:5>5<<g;i96=44}c1:0?6=<3:1<v*=de826<=O==i0D8<8;%372?7<a>81<75f8383>>o?>3:17b<l2;29?xd41:0;694?:1y'6ab=9;30D8:l;I713>"6<?0:7d9=:188m=4=831b4;4?::m1g7<722wi?4<50;694?6|,;no6<<6;I77g>N2:>1/=9851:k46?6=3`296=44i9494?=h:j81<75rb2;2>5<3290;w)<kd;31=>N2<j1C9?94$065>4=n?;0;66g72;29?l>12900c?m=:188yg5>83:187>50z&1`a<6:01C99m4H404?!73>3;0e:<50;9j<7<722c3:7>5;n0`6?6=3th84k4?:583>5}#:mn1=?74H46`?M35?2.:8;4>;h51>5<<a181<75f8783>>i5k;0;66sm39g94?2=83:p(?jk:00:?M33k2B>>:5+15495>o0:3:17d6=:188m=0=831d>n<50;9~f6>c290?6=4?{%0g`?7512B>8n5G5358 421281b;?4?::k;6?6=3`2=6=44o3a1>5<<uk>9j7>55;294~"5lm0:>l5G55a8L0403-;?:7?4i6094?=n?k0;66g72;29?l>12900c?m=:188yg25m3:197>50z&1`a<6:h1C99m4H404?!73>3;0e:<50;9j3g<722c3>7>5;h:5>5<<g;i96=44}c61g?6==3:1<v*=de826d=O==i0D8<8;%372?7<a>81<75f7c83>>o?:3:17d69:188k7e52900qo:=b;291?6=8r.9hi4>2`9K11e<@<8<7)?;6;38m24=831b;o4?::k;6?6=3`2=6=44o3a1>5<<uk>9h7>55;294~"5lm0:>l5G55a8L0403-;?:7?4i6094?=n?k0;66g72;29?l>12900c?m=:188yg25i3:197>50z&1`a<6:h1C99m4H404?!73>3;0e:<50;9j3g<722c3>7>5;h:5>5<<g;i96=44}c61=?6==3:1<v*=de826d=O==i0D8<8;%372?7<a>81<75f7c83>>o?:3:17d69:188k7e52900qo:=7;291?6=8r.9hi4>2`9K11e<@<8<7)?;6;38m24=831b;o4?::k;6?6=3`2=6=44o3a1>5<<uk>9:7>55;294~"5lm0:>n5G55a8L0403-;?:7:4i6094?=n?k0;66g76;29?l4d93:17b<l2;29?xd3:10;684?:1y'6ab=9;k0D8:l;I713>"6<?0:7d9=:188m2d=831b4?4?::k;2?6=3f8h>7>5;|`75d<72:0;6=u+2ef911d<@<>h7E;=7:k4`?6=3`;hm7>5;n0af?6=3th?=44?:283>5}#:mn199l4H46`?M35?2c<h7>5;h3`e?6=3f8in7>5;|`74c<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c62<?6=;3:1<v*=de860g=O==i0D8<8;h5g>5<<a8ij6=44o3`a>5<<uk>;h7>54;294~"5lm0:h95G55a8L0403`=o6=44i9594?=n:m;1<75`2c`94?=zj=;<6=4<:183!4cl3??n6F:4b9K171<a>n1<75f1bc94?=h:kh1<75rb52a>5<3290;w)<kd;3g0>N2<j1C9?94i6f94?=n0>0;66g=d083>>i5jk0;66sm40494?5=83:p(?jk:46a?M33k2B>>:5f7e83>>o6kh0;66a=bc83>>{e<931<7:50;2x 7bc28n?7E;;c:J662=n?m0;66g77;29?l4c93:17b<mb;29?xd39<0;6>4?:1y'6ab===h0D8:l;I713>o0l3:17d?la;29?j4ej3:17pl;0683>1<729q/>ij51e68L02d3A?9;6g8d;29?l>02900e?j>:188k7de2900qo:>4;297?6=8r.9hi4:4c9K11e<@<8<7d9k:188m4ef2900c?lm:188yg27=3:187>50z&1`a<6l=1C99m4H404?l1c2900e5950;9j6a7=831d>ol50;9~f17429086=4?{%0g`?33j2B>8n5G5358m2b=831b=no50;9l6gd=831vn9><:187>5<7s-8oh7?k4:J60f=O=;=0e:j50;9j<2<722c9h<4?::m1fg<722wi8<<50;194?6|,;no68:m;I77g>N2:>1b;i4?::k2gd<722e9no4?::a057=83>1<7>t$3fg>4b33A??o6F:269j3a<722c3;7>5;h0g5?6=3f8in7>5;|`754<72:0;6=u+2ef911d<@<>h7E;=7:k4`?6=3`;hm7>5;n0af?6=3th8jk4?:583>5}#:mn1=i:4H46`?M35?2c<h7>5;h:4>5<<a;n:6=44o3`a>5<<uk>??7>55;294~"5lm0:>l5G55a8L0403-;?:7?4i6094?=n?k0;66g72;29?l>12900c?m=:188yg23:3:197>50z&1`a<6:h1C99m4H404?!73>3;0e:<50;9j3g<722c3>7>5;h:5>5<<g;i96=44}c675?6==3:1<v*=de826d=O==i0D8<8;%372?7<a>81<75f7c83>>o?:3:17d69:188k7e52900qo:;0;291?6=8r.9hi4>2`9K11e<@<8<7)?;6;38m24=831b;o4?::k;6?6=3`2=6=44o3a1>5<<uk>8j7>55;294~"5lm0:>l5G55a8L0403-;?:7?4i6094?=n?k0;66g72;29?l>12900c?m=:188yg24m3:197>50z&1`a<6:h1C99m4H404?!73>3;0e:<50;9j3g<722c3>7>5;h:5>5<<g;i96=44}c60`?6==3:1<v*=de826d=O==i0D8<8;%372?7<a>81<75f7c83>>o?:3:17d69:188k7e52900qo:<c;291?6=8r.9hi4>2`9K11e<@<8<7)?;6;38m24=831b;o4?::k;6?6=3`2=6=44o3a1>5<<uk>8n7>55;294~"5lm0:>l5G55a8L0403-;?:7?4i6094?=n?k0;66g72;29?l>12900c?m=:188yg24i3:197>50z&1`a<6:h1C99m4H404?!73>3;0e:<50;9j3g<722c3>7>5;h:5>5<<g;i96=44}c66b?6=;3:1<v*=de860g=O==i0D8<8;h5g>5<<a8ij6=44o3`a>5<<uk>>;7>53;294~"5lm0:oh5G55a8L0403-;?:7<7;h304?6=3`;8=7>5;n0af?6=3th?9h4?:283>5}#:mn199l4H46`?M35?2c<h7>5;h3`e?6=3f8in7>5;|`70a<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c662?6=;3:1<v*=de82g`=O==i0D8<8;%372?4?3`;8<7>5;h305?6=3f8in7>5;|`71a<72:0;6=u+2ef911d<@<>h7E;=7:k4`?6=3`;hm7>5;n0af?6=3th?8n4?:583>5}#:mn1=i:4H46`?M35?2c<h7>5;h:4>5<<a;n:6=44o3`a>5<<uk>>97>53;294~"5lm0:oh5G55a8L0403-;?:7<7;h304?6=3`;8=7>5;n0af?6=3th?9n4?:283>5}#:mn199l4H46`?M35?2c<h7>5;h3`e?6=3f8in7>5;|`70g<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c660?6=;3:1<v*=de82g`=O==i0D8<8;%372?4?3`;8<7>5;h305?6=3f8in7>5;|`71g<72:0;6=u+2ef911d<@<>h7E;=7:k4`?6=3`;hm7>5;n0af?6=3th?8l4?:583>5}#:mn1=i:4H46`?M35?2c<h7>5;h:4>5<<a;n:6=44o3`a>5<<uk>>?7>53;294~"5lm0:oh5G55a8L0403-;?:7<7;h304?6=3`;8=7>5;n0af?6=3th?9l4?:283>5}#:mn199l4H46`?M35?2c<h7>5;h3`e?6=3f8in7>5;|`70<<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c666?6=;3:1<v*=de82g`=O==i0D8<8;%372?4?3`;8<7>5;h305?6=3f8in7>5;|`71<<72:0;6=u+2ef911d<@<>h7E;=7:k4`?6=3`;hm7>5;n0af?6=3th?854?:583>5}#:mn1=i:4H46`?M35?2c<h7>5;h:4>5<<a;n:6=44o3`a>5<<uk>>=7>53;294~"5lm0:oh5G55a8L0403-;?:7<7;h304?6=3`;8=7>5;n0af?6=3th?954?:283>5}#:mn199l4H46`?M35?2c<h7>5;h3`e?6=3f8in7>5;|`702<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c664?6=;3:1<v*=de82g`=O==i0D8<8;%372?4?3`;8<7>5;h305?6=3f8in7>5;|`703<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c67b?6=;3:1<v*=de82g`=O==i0D8<8;%372?4?3`;8<7>5;h305?6=3f8in7>5;|`700<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c67a?6=;3:1<v*=de82g`=O==i0D8<8;%372?4?3`;8<7>5;h305?6=3f8in7>5;|`72c<72=0;6=u+2ef957?<@<>h7E;=7:&203<63`=96=44i9094?=n0?0;66a=c383>>{e<?o1<7:50;2x 7bc28827E;;c:J662=#9=<1=6g82;29?l>52900e5850;9l6f4=831vn98k:187>5<7s-8oh7?=9:J60f=O=;=0(<:9:09j37<722c3>7>5;h:5>5<<g;i96=44}c65g?6=<3:1<v*=de826<=O==i0D8<8;%372?7<a>81<75f8383>>o?>3:17b<l2;29?xd3>k0;694?:1y'6ab=9;30D8:l;I713>"6<?0:7d9=:188m=4=831b4;4?::m1g7<722wi8;o50;694?6|,;no6<<6;I77g>N2:>1/=9851:k46?6=3`296=44i9494?=h:j81<75rb54:>5<3290;w)<kd;31=>N2<j1C9?94$065>4=n?;0;66g72;29?l>12900c?m=:188yg2103:187>50z&1`a<6:01C99m4H404?!73>3;0e:<50;9j<7<722c3:7>5;n0`6?6=3th?5>4?:583>5}#:mn1=i:4H46`?M35?2c<h7>5;h:4>5<<a;n:6=44o3`a>5<<uk>2>7>54;294~"5lm0:h95G55a8L0403`=o6=44i9594?=n:m;1<75`2c`94?=zj=3:6=4;:183!4cl3;o86F:4b9K171<a>n1<75f8683>>o5l80;66a=bc83>>{e<0:1<7:50;2x 7bc28n?7E;;c:J662=n?m0;66g77;29?l4c93:17b<mb;29?xd30o0;694?:1y'6ab=9m>0D8:l;I713>o0l3:17d68:188m7b62900c?lm:188yg2?83:187>50z&1`a<6l=1C99m4H404?l1c2900e5950;9j6a7=831d>ol50;9~f11a290?6=4?{%0g`?7c<2B>8n5G5358m2b=831b4:4?::k1`4<722e9no4?::a02c=83>1<7>t$3fg>4b33A??o6F:269j3a<722c3;7>5;h0g5?6=3f8in7>5;|`73a<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c64g?6=<3:1<v*=de82`1=O==i0D8<8;h5g>5<<a1=1<75f2e394?=h:kh1<75rb2g0>5<3290;w)<kd;3g0>N2<j1C9?94i6f94?=n0>0;66g=d083>>i5jk0;66sm3d094?2=83:p(?jk:0f7?M33k2B>>:5f7e83>>o??3:17d<k1;29?j4ej3:17pl<e083>1<729q/>ij51e68L02d3A?9;6g8d;29?l>02900e?j>:188k7de2900qo=j0;290?6=8r.9hi4>d59K11e<@<8<7d9k:188m=1=831b>i?50;9l6gd=831vn>ji:187>5<7s-8oh7?k4:J60f=O=;=0e:j50;9j<2<722c9h<4?::m1fg<722wi?i>50;694?6|,;no6<j;;I77g>N2:>1b;i4?::k;3?6=3`8o=7>5;n0af?6=3th8ok4?:583>5}#:mn1=i:4H46`?M35?2c<h7>5;h:4>5<<a;n:6=44o3`a>5<<uk9hi7>54;294~"5lm0:h95G55a8L0403`=o6=44i9594?=n:m;1<75`2c`94?=zj:io6=4;:183!4cl3;o86F:4b9K171<a>n1<75f8683>>o5l80;66a=bc83>>{e;ji1<7:50;2x 7bc28n?7E;;c:J662=n?m0;66g77;29?l4c93:17b<mb;29?xd3mj0;684?:1y'6ab=9;k0D8:l;I713>"6<?0:7d9=:188m2d=831b4?4?::k;2?6=3f8h>7>5;|`7ad<72<0;6=u+2ef957e<@<>h7E;=7:&203<33`=96=44i6`94?=n0?0;66g=c083>>i5k;0;66sm4d`94?3=83:p(?jk:00b?M33k2B>>:5+15495>o0:3:17d9m:188m=4=831b4;4?::m1g7<722wi8hj50;794?6|,;no6<<n;I77g>N2:>1/=9851:k46?6=3`=i6=44i9094?=n0?0;66a=c383>>{e<lo1<7;50;2x 7bc288j7E;;c:J662=#9=<1=6g82;29?l1e2900e5<50;9j<3<722e9o?4?::a0c7=83?1<7>t$3fg>44f3A??o6F:269'510=92c<>7>5;h5a>5<<a181<75f8783>>i5k;0;66sm4dd94?3=83:p(?jk:00b?M33k2B>>:5+15495>o0:3:17d9m:188m=4=831b4;4?::m1g7<722wi8k>50;794?6|,;no6<<n;I77g>N2:>1/=9851:k46?6=3`=i6=44i9094?=n0?0;66a=c383>>{e<o81<7;50;2x 7bc288j7E;;c:J662=#9=<1=6g82;29?l1e2900e5<50;9j<3<722e9o?4?::a0c5=83?1<7>t$3fg>44f3A??o6F:269'510=92c<>7>5;h5a>5<<a181<75f8783>>i5k;0;66sm4ed94?3=83:p(?jk:00b?M33k2B>>:5+15495>o0:3:17d9m:188m=4=831b4;4?::m1g7<722wi8ik50;794?6|,;no6<<n;I77g>N2:>1/=9851:k46?6=3`=i6=44i9094?=n0?0;66a=c383>>{e<mi1<7;50;2x 7bc288j7E;;c:J662=#9=<1=6g82;29?l1e2900e5<50;9j<3<722e9o?4?::a0ad=83?1<7>t$3fg>44f3A??o6F:269'510=92c<>7>5;h5a>5<<a181<75f8783>>i5k;0;66sm4ef94?3=83:p(?jk:00b?M33k2B>>:5+15495>o0:3:17d9m:188m=4=831b4;4?::m1g7<722wi8i750;794?6|,;no6<<n;I77g>N2:>1/=9851:k46?6=3`=i6=44i9094?=n0?0;66a=c383>>{e<m21<7;50;2x 7bc288j7E;;c:J662=#9=<1=6g82;29?l1e2900e5<50;9j<3<722e9o?4?::a0ag=83?1<7>t$3fg>44f3A??o6F:269'510=92c<>7>5;h5a>5<<a181<75f8783>>i5k;0;66sm4e494?3=83:p(?jk:00b?M33k2B>>:5+15495>o0:3:17d9m:188m=4=831b4;4?::m1g7<722wi8i950;794?6|,;no6<<l;I77g>N2:>1/=9854:k46?6=3`=i6=44i9494?=n:j;1<75`2b094?=zj=ij6=4<:183!4cl3??n6F:4b9K171<a>n1<75f1bc94?=h:kh1<75rb5a:>5<4290;w)<kd;77f>N2<j1C9?94i6f94?=n9jk1<75`2c`94?=zj=hm6=4;:183!4cl3;o86F:4b9K171<a>n1<75f8683>>o5l80;66a=bc83>>{e<j21<7=50;2x 7bc2<>i7E;;c:J662=n?m0;66g>c`83>>i5jk0;66sm4cf94?2=83:p(?jk:0f7?M33k2B>>:5f7e83>>o??3:17d<k1;29?j4ej3:17pl;c683>6<729q/>ij555`8L02d3A?9;6g8d;29?l7di3:17b<mb;29?xd3jk0;694?:1y'6ab=9m>0D8:l;I713>o0l3:17d68:188m7b62900c?lm:188yg2d>3:1?7>50z&1`a<2<k1C99m4H404?l1c2900e<mn:188k7de2900qo:m9;290?6=8r.9hi4>d59K11e<@<8<7d9k:188m=1=831b>i?50;9l6gd=831vn9m::180>5<7s-8oh7;;b:J60f=O=;=0e:j50;9j5fg=831d>ol50;9~f1d0290?6=4?{%0g`?7c<2B>8n5G5358m2b=831b4:4?::k1`4<722e9no4?::a0f2=8391<7>t$3fg>02e3A??o6F:269j3a<722c:ol4?::m1fg<722wi8o;50;694?6|,;no6<j;;I77g>N2:>1b;i4?::k;3?6=3`8o=7>5;n0af?6=3th?o>4?:283>5}#:mn199l4H46`?M35?2c<h7>5;h3`e?6=3f8in7>5;|`7f6<72=0;6=u+2ef95a2<@<>h7E;=7:k4`?6=3`2<6=44i3f2>5<<g;hi6=44}c6`6?6=;3:1<v*=de860g=O==i0D8<8;h5g>5<<a8ij6=44o3`a>5<<uk>i=7>54;294~"5lm0:h95G55a8L0403`=o6=44i9594?=n:m;1<75`2c`94?=zj=i:6=4<:183!4cl3??n6F:4b9K171<a>n1<75f1bc94?=h:kh1<75rb5ce>5<3290;w)<kd;3g0>N2<j1C9?94i6f94?=n0>0;66g=d083>>i5jk0;66sm51594?3=83:p(?jk:00b?M33k2B>>:5+15495>o0:3:17d9m:188m=4=831b4;4?::m1g7<722wi9=850;794?6|,;no6<<n;I77g>N2:>1/=9851:k46?6=3`=i6=44i9094?=n0?0;66a=c383>>{e=9?1<7;50;2x 7bc288j7E;;c:J662=#9=<1=6g82;29?l1e2900e5<50;9j<3<722e9o?4?::a152=83?1<7>t$3fg>44f3A??o6F:269'510=92c<>7>5;h5a>5<<a181<75f8783>>i5k;0;66sm51194?3=83:p(?jk:00b?M33k2B>>:5+15495>o0:3:17d9m:188m=4=831b4;4?::m1g7<722wi9=<50;794?6|,;no6<<n;I77g>N2:>1/=9851:k46?6=3`=i6=44i9094?=n0?0;66a=c383>>{e=9;1<7;50;2x 7bc288j7E;;c:J662=#9=<1=6g82;29?l1e2900e5<50;9j<3<722e9o?4?::a156=83?1<7>t$3fg>44f3A??o6F:269'510=92c<>7>5;h5a>5<<a181<75f8783>>i5k;0;66sm4gd94?3=83:p(?jk:00b?M33k2B>>:5+15495>o0:3:17d9m:188m=4=831b4;4?::m1g7<722wi8kk50;794?6|,;no6<<n;I77g>N2:>1/=9851:k46?6=3`=i6=44i9094?=n0?0;66a=c383>>{e=;;1<7=50;2x 7bc28in7E;;c:J662=#9=<1=95f12294?=n9:;1<75`2c`94?=zj<;86=4<:183!4cl3;hi6F:4b9K171<,8>=6<:4i013>5<<a89:6=44o3`a>5<<uk9;?7>53;294~"5lm0:oh5G55a8L0403-;?:7<>;h304?6=3`;8=7>5;n0af?6=3th8<?4?:283>5}#:mn1=nk4H46`?M35?2.:8;4=1:k275<722c:?<4?::m1fg<722wi?=?50;194?6|,;no6<mj;I77g>N2:>1/=985209j566=831b=>?50;9l6gd=831vn>>?:180>5<7s-8oh7?le:J60f=O=;=0(<:9:338m4572900e<=>:188k7de2900qo<if;297?6=8r.9hi4>cd9K11e<@<8<7)?;6;02?l7483:17d?<1;29?j4ej3:17pl=fd83>6<729q/>ij51bg8L02d3A?9;6*>47815>o6;90;66g>3083>>i5jk0;66sm2gf94?5=83:p(?jk:0af?M33k2B>>:5+154964=n9::1<75f12394?=h:kh1<75rb3d`>5<4290;w)<kd;3`a>N2<j1C9?94$065>77<a89;6=44i012>5<<g;hi6=44}c0ef?6=;3:1<v*=de82g`=O==i0D8<8;%372?463`;8<7>5;h305?6=3f8in7>5;|`1b5<72:0;6=u+2ef95fc<@<>h7E;=7:&203<592c:?=4?::k274<722e9no4?::a6``=8391<7>t$3fg>4eb3A??o6F:269'510=:81b=>>50;9j567=831d>ol50;9~f7cb29086=4?{%0g`?7dm2B>8n5G5358 4212;;0e<=?:188m4562900c?lm:188yg4bl3:1?7>50z&1`a<6kl1C99m4H404?!73>38:7d?<0;29?l7493:17b<mb;29?xd5mj0;6>4?:1y'6ab=9jo0D8:l;I713>"6<?09=6g>3183>>o6;80;66a=bc83>>{e:lh1<7=50;2x 7bc28in7E;;c:J662=#9=<1><5f12294?=n9:;1<75`2c`94?=zj;oj6=4<:183!4cl3;hi6F:4b9K171<,8>=6??4i013>5<<a89:6=44o3`a>5<<uk8n57>53;294~"5lm0:oh5G55a8L0403-;?:7<>;h304?6=3`;8=7>5;n0af?6=3th9i54?:283>5}#:mn1=nk4H46`?M35?2.:8;4=1:k275<722c:?<4?::m1fg<722wi9=j50;694?6|,;no6<mi;I77g>N2:>1/=9851348m4572900e<=>:188m4552900c?lm:188yg2f<3:1?7>50z&1`a<6kl1C99m4H404?!73>3;?7d?<0;29?l7493:17b<mb;29?xd4n=0;6>4?:1y'6ab=9jo0D8:l;I713>"6<?0:86g>3183>>o6;80;66a=bc83>>{e<0n1<7;50;2x 7bc28n;7E;;c:J662=#9=<1>45f12294?=n9:;1<75f12094?=n9:91<75`2c`94?=zj=2j6=4::183!4cl3;o<6F:4b9K171<,8>=6?74i013>5<<a89:6=44i011>5<<a8986=44o3`a>5<<uk9nh7>55;294~"5lm0:h=5G55a8L0403-;?:7<6;h304?6=3`;8=7>5;h306?6=3`;8?7>5;n0af?6=3th8hl4?:483>5}#:mn1=i>4H46`?M35?2.:8;4=4:k275<722c:?<4?::k277<722c:?>4?::m1fg<722wi84m50;794?6|,;no6<j?;I77g>N2:>1/=985289j566=831b=>?50;9j564=831b=>=50;9l6gd=831vn966:186>5<7s-8oh7?k0:J60f=O=;=0(<:9:3;8m4572900e<=>:188m4552900e<=<:188k7de2900qo=jc;291?6=8r.9hi4>d19K11e<@<8<7)?;6;0:?l7483:17d?<1;29?l74:3:17d?<3;29?j4ej3:17pl<d883>0<729q/>ij51e28L02d3A?9;6*>47810>o6;90;66g>3083>>o6;;0;66g>3283>>i5jk0;66sm48`94?3=83:p(?jk:0f3?M33k2B>>:5+15496<=n9::1<75f12394?=n9:81<75f12194?=h:kh1<75rb5:;>5<2290;w)<kd;3g4>N2<j1C9?94$065>7?<a89;6=44i012>5<<a8996=44i010>5<<g;hi6=44}c1ff?6==3:1<v*=de82`5=O==i0D8<8;%372?4>3`;8<7>5;h305?6=3`;8>7>5;h307?6=3f8in7>5;|`0`=<72<0;6=u+2ef95a6<@<>h7E;=7:&203<5<2c:?=4?::k274<722c:??4?::k276<722e9no4?::a0<g=83?1<7>t$3fg>4b73A??o6F:269'510=:01b=>>50;9j567=831b=><50;9j565=831d>ol50;9~f1>0290>6=4?{%0g`?7c82B>8n5G5358 4212;30e<=?:188m4562900e<==:188m4542900c?lm:188yg5bi3:197>50z&1`a<6l91C99m4H404?!73>3827d?<0;29?l7493:17d?<2;29?l74;3:17b<mb;29?xd4l>0;684?:1y'6ab=9m:0D8:l;I713>"6<?0986g>3183>>o6;80;66g>3383>>o6;:0;66a=bc83>>{e<031<7;50;2x 7bc28n;7E;;c:J662=#9=<1>45f12294?=n9:;1<75f12094?=n9:91<75`2c`94?=zj=2=6=4::183!4cl3;o<6F:4b9K171<,8>=6?74i013>5<<a89:6=44i011>5<<a8986=44o3`a>5<<uk9n57>55;294~"5lm0:h=5G55a8L0403-;?:7<6;h304?6=3`;8=7>5;h306?6=3`;8?7>5;n0af?6=3th8h;4?:483>5}#:mn1=i>4H46`?M35?2.:8;4=4:k275<722c:?<4?::k277<722c:?>4?::m1fg<722wi>k?50;194?6|,;no6<mj;I77g>N2:>1/=985209j566=831b=>?50;9l6gd=831vn?jj:180>5<7s-8oh7?le:J60f=O=;=0(<:9:338m4572900e<=>:188k7de2900qo:>0;296?6=8r.9hi4>ce9K11e<@<8<7)?;6;37?l7483:17b<mb;29?xd38l0;6?4?:1y'6ab=9jn0D8:l;I713>"6<?0:86g>3183>>i5jk0;66sm41a94?4=83:p(?jk:0ag?M33k2B>>:5+154951=n9::1<75`2c`94?=zj=:j6=4=:183!4cl3;hh6F:4b9K171<,8>=6<:4i013>5<<g;hi6=44}c63<?6=:3:1<v*=de82ga=O==i0D8<8;%372?733`;8<7>5;n0af?6=3th?<;4?:383>5}#:mn1=nj4H46`?M35?2.:8;4>4:k275<722e9no4?::a052=8381<7>t$3fg>4ec3A??o6F:269'510=9=1b=>>50;9l6gd=831vn9>=:181>5<7s-8oh7?ld:J60f=O=;=0(<:9:068m4572900c?lm:188yg2783:1>7>50z&1`a<6km1C99m4H404?!73>3;?7d?<0;29?j4ej3:17pl;c183>7<729q/>ij51bf8L02d3A?9;6*>47820>o6;90;66a=bc83>>{e<ko1<7<50;2x 7bc28io7E;;c:J662=#9=<1=95f12294?=h:kh1<75rb5``>5<5290;w)<kd;3``>N2<j1C9?94$065>42<a89;6=44o3`a>5<<uk>im7>52;294~"5lm0:oi5G55a8L0403-;?:7?;;h304?6=3f8in7>5;|`7f=<72;0;6=u+2ef95fb<@<>h7E;=7:&203<6<2c:?=4?::m1fg<722wi8o850;094?6|,;no6<mk;I77g>N2:>1/=985159j566=831d>ol50;9~f1d329096=4?{%0g`?7dl2B>8n5G5358 42128>0e<=?:188k7de2900qo:m2;296?6=8r.9hi4>ce9K11e<@<8<7)?;6;37?l7483:17b<mb;29?xd3j90;6?4?:1y'6ab=9jn0D8:l;I713>"6<?0:86g>3183>>i5jk0;66sm40`94?4=83:p(?jk:0ag?M33k2B>>:5+154951=n9::1<75`2c`94?=zj=ii6=4=:183!4cl3;hh6F:4b9K171<,8>=6<:4i013>5<<g;hi6=44}c0e7?6==3:1<v*=de82`5=O==i0D8<8;%372?453`;8<7>5;h305?6=3`;8>7>5;h307?6=3f8in7>5;|`1a5<72<0;6=u+2ef95a6<@<>h7E;=7:&203<5:2c:?=4?::k274<722c:??4?::k276<722e9no4?::a6c1=83?1<7>t$3fg>4b73A??o6F:269'510=:;1b=>>50;9j567=831b=><50;9j565=831d>ol50;9~f7c3290>6=4?{%0g`?7c82B>8n5G5358 4212;80e<=?:188m4562900e<==:188m4542900c?lm:188yg4a03:1:7>50z&1`a<6l81C99m4H404?!73>38i7d?<0;29?l7493:17d?<2;29?l74;3:17d?<4;29?j4ej3:17pl=e483>3<729q/>ij51e38L02d3A?9;6*>4781f>o6;90;66g>3083>>o6;;0;66g>3283>>o6;=0;66a=bc83>>{e:o31<7950;2x 7bc28n97E;;c:J662=#9=<1>>5f12294?=n9:;1<75f12094?=n9:91<75f12694?=n9:?1<75`2c`94?=zj;o=6=48:183!4cl3;o>6F:4b9K171<,8>=6?=4i013>5<<a89:6=44i011>5<<a8986=44i017>5<<a89>6=44o3`a>5<<uk8m:7>53;294~"5lm0:oh5G55a8L0403-;?:7<>;h304?6=3`;8=7>5;n0af?6=3th9jl4?:683>5}#:mn1=i<4H46`?M35?2.:8;4=3:k275<722c:?<4?::k277<722c:?>4?::k271<722c:?84?::m1fg<722wi>h=50;194?6|,;no6<mj;I77g>N2:>1/=985209j566=831b=>?50;9l6gd=831vn?k8:184>5<7s-8oh7?k2:J60f=O=;=0(<:9:318m4572900e<=>:188m4552900e<=<:188m4532900e<=::188k7de2900qo=i2;291?6=8r.9hi4>d19K11e<@<8<7)?;6;31`>o6;90;66g>3083>>o6;;0;66g>3283>>i5jk0;66sm4`194?0=83:p(?jk:0f2?M33k2B>>:5+15495<=n9::1<75f12394?=n9:81<75f12194?=n9:>1<75`2c`94?=zj;l96=4;:183!4cl3;hj6F:4b9K171<,8>=6?o4i013>5<<a89:6=44i011>5<<g;hi6=44}c0gb?6=<3:1<v*=de82gc=O==i0D8<8;%372?4f3`;8<7>5;h305?6=3`;8>7>5;n0af?6=3th9j94?:783>5}#:mn1=i?4H46`?M35?2.:8;4=b:k275<722c:?<4?::k277<722c:?>4?::k271<722e9no4?::a6`7=83<1<7>t$3fg>4b63A??o6F:269'510=:k1b=>>50;9j567=831b=><50;9j565=831b=>:50;9l6gd=831vn?h::184>5<7s-8oh7?k2:J60f=O=;=0(<:9:318m4572900e<=>:188m4552900e<=<:188m4532900e<=::188k7de2900qo<j2;293?6=8r.9hi4>d39K11e<@<8<7)?;6;00?l7483:17d?<1;29?l74:3:17d?<3;29?l74<3:17d?<5;29?j4ej3:17pl:0883>465290;w)<kd;0`7>N2<j1C9?94Z63955}6=3;j6<851c826?772891=<4>d;3`>70=:<0:;7?j:0:95c<zfo?1<6`>1683?!7d=390(<m9:29'560=;2.:?:4<;%30<?5<,8926>5+12c97>"6;k087)?<c;18 45c2:1/=>k53:&27c<43-;?<7=4$062>6=#9=81?6*>4280?!4c?380(?j7:39'511=;2.:854<;%37=?5<,8>j6>5+15`97>"6<j087)?;d;18 42b2:1/=9h53:&215<43-;>=7=4$071>6=#9<91?6*>5580?!72=390(<;9:29'501=;2.:954<;%36=?5<,8?j6>5+14`97>"6=j087)?:d;18 43b2:1/=8h53:&225<43-;==7=4$041>6=#9?91?6*>6580?!71=390(<89:29'531=;2.::54<;%35=?5<,8<j6>5+17`97>"6>j087)?9d;18 40b2:1/=;h53:&235<43-;<=7=4$051>6=#9>91?6*>7580?!70=390(<99:29'521=;2.:;54<;%34=?5<,8=j6>5+16`97>"6?j087)?8d;18 41b2:1/=:h53:&2<5<43-;3=7=4$0:1>6=#9191?6*>8580?!7?=390(<69:29'5=1=;2.:454<;%3;=?5<,82j6>5+19`97>"60j087)?7d;18 4>b2:1/=5h53:&2=5<43-;2=7=4$0;1>6=#9091?6*>9580?!7>=390(<79:29'5<1=;2.:554<;%3:=?5<,83j6>5+18`97>"61j087)?6d;18 4?b2:1/=4h53:&2e5<43-;j=7=4$0c1>6=#9h91?6*>a580?!7f=390(<o9:29'5d1=;2.:m54<;%3b=?5<,8kj6>5+1``97>"6ij087)?nd;18 4gb2:1/=lh53:&2f5<43-;i=7=4$0`1>6=#9k91?6*>b580?!7e=390(<l9:29'5g1=;2.:n54<;%3a=?5<,8hj6>5+1c`97>"6jj087)?md;18 4db2:1/=oh53:&2g5<43-;h=7=4$0a1>6=#9j91?6*>c580?!4c;3;9;6*>4580?!7d138im6*=c581fd=#:j?1>oo4n3a4>72<f;i36?:4$3f7>3c<,;n>6?j=;%3`3?4<,8i36?5+55496f0<,<><6?m9;o77<?433g??57<;;%371?5<a8886=44i001>5<<a88>6=44i007>5<<a;nj6=44i3f:>5<<a;nh6=44i3fa>5<<a>l1<75f7d83>>o?93:17d6?:188m7eb2900e?mk:188m7b72900e?mi:188m7ef2900e?m6:188m7ed2900e?mm:188m25=831b;94?::k41?6=3`==6=44o6594?=h?10;66a89;29?j1f2900el?50;&1g5<f82d9nk4?;:k:b?6=,;i;6l>4n3`e>4=<a0n1<7*=c18b4>h5jo0976g6c;29 7e72h:0b?li:298m<d=83.9o=4n0:l1fc<332c2m7>5$3a3>d6<f;hm6854i8;94?"5k90j<6`=bg85?>o>03:1(?m?:`28j7da2>10e4950;&1g5<f82d9nk47;:k:2?6=,;i;6l>4n3`e><=<a0?1<7*=c18b4>h5jo0j76g64;29 7e72h:0b?li:c98m<4=83.9o=4n0:l1fc<d32c2=7>5$3a3>d6<f;hm6i54i8294?"5k90j<6`=bg8f?>o?n3:1(?m?:`28j7da2o10e5k50;&1g5<f82d9nk4>0:9j<a<72-8h<7o?;o0ab?7632c3o7>5$3a3>d6<f;hm6<<4;h:a>5<#:j:1m=5a2cd956=<a1k1<7*=c18b4>h5jo0:865f8883>!4d83k;7c<mf;36?>of03:1(?m?:`28j7da28<07do8:18'6f6=i91e>oh51698md0=83.9o=4n0:l1fc<6021bm84?:%0`4?g73g8ij7?6;:kb0?6=,;i;6l>4n3`e>4g<3`k86=4+2b29e5=i:kl1=o54i`094?"5k90j<6`=bg82g>=n1l0;6)<l0;c3?k4en3;o76g63;29 7e72h:0b?li:0g8?l>?290/>n>5a19m6g`=9o10enk50;&1g5<dl2d9nk4?;:k`g?6=,;i;6nj4n3`e>4=<ajh1<7*=c18``>h5jo0976gla;29 7e72jn0b?li:298mf4=83.9o=4l1:l1fc<732ch<7>5$3a3>f7<f;hm6<54icg94?"5k90h=6`=bg81?>oel3:1(?m?:b38j7da2:10eom50;&1g5<d92d9nk4;;:kaf?6=,;i;6n?4n3`e>0=<akk1<7*=c18`5>h5jo0=76gm9;29 7e72j;0b?li:698mg>=83.9o=4l1:l1fc<?32ci;7>5$3a3>f7<f;hm6454ic494?"5k90h=6`=bg8b?>oe=3:1(?m?:b38j7da2k10eo=50;&1g5<d92d9nk4l;:ka6?6=,;i;6n?4n3`e>a=<ak;1<7*=c18`5>h5jo0n76gm0;29 7e72j;0b?li:g98md`=83.9o=4l1:l1fc<6821bmh4?:%0`4?e63g8ij7?>;:kb`?6=,;i;6n?4n3`e>44<3`kh6=4+2b29g4=i:kl1=>54i``94?"5k90h=6`=bg820>=nih0;6)<l0;a2?k4en3;>76gl9;29 7e72j;0b?li:048?le?290/>n>5c09m6g`=9>10en950;&1g5<d92d9nk4>8:9jg3<72-8h<7m>;o0ab?7>32ch97>5$3a3>f7<f;hm6<o4;ha7>5<#:j:1o<5a2cd95g=<aj91<7*=c18`5>h5jo0:o65fbg83>!4d83i:7c<mf;3g?>oe<3:1(?m?:b38j7da28o07do6:18'6f6=k81e>oh51g98ma5=83.9o=4k2:l1fc<732co=7>5$3a3>a4<f;hm6<54ie294?"5k90o>6`=bg81?>odn3:1(?m?:e08j7da2:10e>=50;&1g5<4:2d9nk4?;:k05?6=,;i;6><4n3`e>4=<a::1<7*=c1806>h5jo0976g=f;29 7e72:80b?li:298m7c=83.9o=4<2:l1fc<332c9h7>5$3a3>64<f;hm6854i2a94?"5k908>6`=bg85?>o4j3:1(?m?:208j7da2>10e>o50;&1g5<4:2d9nk47;:k0=?6=,;i;6><4n3`e><=<a:21<7*=c1806>h5jo0j76g<7;29 7e72:80b?li:c98m60=83.9o=4<2:l1fc<d32c897>5$3a3>64<f;hm6i54i2694?"5k908>6`=bg8f?>o5k3:1(?m?:208j7da2o10e9=50;&1g5<3:2d9nk4?;:k75?6=,;i;69<4n3`e>4=<a=:1<7*=c1876>h5jo0976g<f;29 7e72=80b?li:298m6c=83.9o=4;2:l1fc<332c?o7>5$3a3>14<f;hm6854i5`94?"5k90?>6`=bg85?>o3i3:1(?m?:508j7da2>10e9750;&1g5<3:2d9nk47;:k7<?6=,;i;69<4n3`e><=<a==1<7*=c1876>h5jo0j76g;6;29 7e72=80b?li:c98m13=83.9o=4;2:l1fc<d32c?87>5$3a3>14<f;hm6i54i2f94?"5k90?>6`=bg8f?>o2<3:1(?m?:418j7da2910e8<50;&1g5<2;2d9nk4>;:k65?6=,;i;68=4n3`e>7=<a<:1<7*=c1867>h5jo0876g;f;29 7e72<90b?li:598m1c=83.9o=4:3:l1fc<232c>h7>5$3a3>05<f;hm6;54i4a94?"5k90>?6`=bg84?>o2j3:1(?m?:418j7da2110e8o50;&1g5<2;2d9nk46;:k6=?6=,;i;68=4n3`e>d=<a<21<7*=c1867>h5jo0i76g:7;29 7e72<90b?li:b98m00=83.9o=4:3:l1fc<c32c>97>5$3a3>05<f;hm6h54i5f94?"5k90>?6`=bg8e?>o1<3:1(?m?:718j7da2910e;<50;&1g5<1;2d9nk4>;:k55?6=,;i;6;=4n3`e>7=<a?:1<7*=c1857>h5jo0876g:f;29 7e72?90b?li:598m3b=83.9o=493:l1fc<232c=o7>5$3a3>35<f;hm6;54i7`94?"5k90=?6`=bg84?>o1i3:1(?m?:718j7da2110e;750;&1g5<1;2d9nk46;:k5<?6=,;i;6;=4n3`e>d=<a?=1<7*=c1857>h5jo0i76g96;29 7e72?90b?li:b98m33=83.9o=493:l1fc<c32c>i7>5$3a3>35<f;hm6h54i410>5<#:j:19><4n3`e>5=<a<9:6=4+2b29164<f;hm6<54i413>5<#:j:19><4n3`e>7=<a<8m6=4+2b29164<f;hm6>54i40f>5<#:j:19?j4n3`e>5=<a<8h6=4+2b2917b<f;hm6<54i40a>5<#:j:19?j4n3`e>7=<a<8j6=4+2b2917b<f;hm6>54i466>5<#:j:199:4n3`e>5=<a<>86=4+2b29112<f;hm6<54i461>5<#:j:199:4n3`e>7=<a<>:6=4+2b29112<f;hm6>54i463>5<#:j:199:4n3`e>1=<a<9m6=4+2b29112<f;hm6854i41f>5<#:j:199:4n3`e>3=<a<9o6=4+2b29112<f;hm6:54i41`>5<#:j:19>l4n3`e>5=<a<9j6=4+2b2916d<f;hm6<54i41:>5<#:j:19>l4n3`e>7=<a<936=4+2b2916d<f;hm6>54i414>5<#:j:19>l4n3`e>1=<a<9=6=4+2b2916d<f;hm6854i416>5<#:j:19>l4n3`e>3=<a<9?6=4+2b2916d<f;hm6:54odf94?"5k90no6`=bg83?>ibj3:1(?m?:da8j7da2810ch750;&1g5<bk2d9nk4=;:mf<?6=,;i;6hm4n3`e>6=<gl=1<7*=c18fg>h5jo0?76aj6;29 7e72li0b?li:498k`3=83.9o=4jc:l1fc<132en87>5$3a3>`e<f;hm6:54od194?"5k90no6`=bg8;?>ib:3:1(?m?:da8j7da2010ch?50;&1g5<bk2d9nk4n;:mf4?6=,;i;6hm4n3`e>g=<gmo1<7*=c18fg>h5jo0h76akd;29 7e72li0b?li:e98kae=83.9o=4jc:l1fc<b32eon7>5$3a3>`e<f;hm6k54oec94?"5k90no6`=bg824>=hl00;6)<l0;g`?k4en3;:76ak8;29 7e72li0b?li:008?jb0290/>n>5eb9m6g`=9:10ci850;&1g5<bk2d9nk4>4:9l`0<72-8h<7kl;o0ab?7232em87>5$3a3>`e<f;hm6<84;nd0>5<#:j:1in5a2cd952=<go81<7*=c18fg>h5jo0:465`f083>!4d83oh7c<mf;3:?>ia83:1(?m?:da8j7da28k07bki:18'6f6=mj1e>oh51c98k`c=83.9o=4jc:l1fc<6k21dil4?:%0`4?cd3g8ij7?k;:mgb?6=,;i;6hm4n3`e>4c<3fn?6=4+2b29af=i:kl1=k54o03`>5<#:j:1=<l4n3`e>5=<g8;j6=4+2b2954d<f;hm6<54o03:>5<#:j:1=<l4n3`e>7=<g8;36=4+2b2954d<f;hm6>54o02e>5<#:j:1==k4n3`e>5=<g8:o6=4+2b2955c<f;hm6<54o02a>5<#:j:1==k4n3`e>7=<g8:j6=4+2b2955c<f;hm6>54o02:>5<#:j:1==k4n3`e>1=<g8:36=4+2b2955c<f;hm6854o024>5<#:j:1==k4n3`e>3=<g8:=6=4+2b2955c<f;hm6:54o026>5<#:j:1==k4n3`e>==<g8:?6=4+2b2955c<f;hm6454o020>5<#:j:1==k4n3`e>d=<g8:96=4+2b2955c<f;hm6o54o023>5<#:j:1==k4n3`e>f=<gol1<7*=c1824`=i:kl1h65`fd83>!4d83;;i6`=bg8f?>ial3:1(?m?:02f?k4en3l07bhl:18'6f6=99o0b?li:028?j`e290/>n>511g8j7da28;07bhn:18'6f6=99o0b?li:008?j`>290/>n>511g8j7da28907bh7:18'6f6=99o0b?li:068?j`0290/>n>511g8j7da28?07b?>6;29 7e728:n7c<mf;35?>i69<0;6)<l0;33a>h5jo0:;65`10694?"5k90:<h5a2cd95==<g8;86=4+2b2955c<f;hm6<74;n326?6=,;i;6<>j;o0ab?7f32e:=<4?:%0`4?77m2d9nk4>b:9l546=83.9o=4>0d9m6g`=9j10c<>l:18'6f6=99o0b?li:0f8?j7793:1(?m?:02f?k4en3;n76ai6;29 7e728:n7c<mf;3e?>i6:80;6)<l0;314>h5jo0;76a>1g83>!4d83;9<6`=bg82?>i69l0;6)<l0;314>h5jo0976a>1e83>!4d83;9<6`=bg80?>{e=9k1<7??2;294~"5lm09o>5G55a8L0403S=:6<>t1482e?7128h1=?4>0;30>47=9m0:o7<9:37952<6m3;36<h5}od6>5=i98=1<6*>c480?!7d>390(<=9:29'561=;2.:?54<;%30=?5<,89j6>5+12`97>"6;j087)?<d;18 45b2:1/=>h53:&205<43-;?=7=4$061>6=#9=91?6*=d681?!4c0380(<:8:29'51>=;2.:844<;%37e?5<,8>i6>5+15a97>"6<m087)?;e;18 42a2:1/=8>53:&214<43-;>>7=4$070>6=#9<>1?6*>5480?!72>390(<;8:29'50>=;2.:944<;%36e?5<,8?i6>5+14a97>"6=m087)?:e;18 43a2:1/=;>53:&224<43-;=>7=4$040>6=#9?>1?6*>6480?!71>390(<88:29'53>=;2.::44<;%35e?5<,8<i6>5+17a97>"6>m087)?9e;18 40a2:1/=:>53:&234<43-;<>7=4$050>6=#9>>1?6*>7480?!70>390(<98:29'52>=;2.:;44<;%34e?5<,8=i6>5+16a97>"6?m087)?8e;18 41a2:1/=5>53:&2<4<43-;3>7=4$0:0>6=#91>1?6*>8480?!7?>390(<68:29'5=>=;2.:444<;%3;e?5<,82i6>5+19a97>"60m087)?7e;18 4>a2:1/=4>53:&2=4<43-;2>7=4$0;0>6=#90>1?6*>9480?!7>>390(<78:29'5<>=;2.:544<;%3:e?5<,83i6>5+18a97>"61m087)?6e;18 4?a2:1/=l>53:&2e4<43-;j>7=4$0c0>6=#9h>1?6*>a480?!7f>390(<o8:29'5d>=;2.:m44<;%3be?5<,8ki6>5+1`a97>"6im087)?ne;18 4ga2:1/=o>53:&2f4<43-;i>7=4$0`0>6=#9k>1?6*>b480?!7e>390(<l8:29'5g>=;2.:n44<;%3ae?5<,8hi6>5+1ca97>"6jm087)?me;18 4da2:1/=n>53:&2g4<43-;h>7=4$0a0>6=#9j>1?6*=d28262=#9=>1?6*>c881fd=#:j>1>oo4$3a6>7df3g8h;7<;;o0`<?433-8o878j;%0g1?4c:2.:o:4=;%3`<?4<,<>=6?m9;%773?4d>2d>854=4:l60<<5<2.:884<;h317?6=3`;9>7>5;h311?6=3`;987>5;h0ge?6=3`8o57>5;h0gg?6=3`8on7>5;h5e>5<<a>o1<75f8083>>o?83:17d<le;29?l4dl3:17d<k0;29?l4dn3:17d<la;29?l4d13:17d<lc;29?l4dj3:17d9<:188m22=831b;84?::k42?6=3f=<6=44o6:94?=h?00;66a8a;29?lg6290/>n>5a19m6g`=821b5k4?:%0`4?g73g8ij7?4;h;g>5<#:j:1m=5a2cd96>=n1j0;6)<l0;c3?k4en3907d7m:18'6f6=i91e>oh54:9j=d<72-8h<7o?;o0ab?3<3`326=4+2b29e5=i:kl1:65f9983>!4d83k;7c<mf;58?l?0290/>n>5a19m6g`=021b5;4?:%0`4?g73g8ij774;h;6>5<#:j:1m=5a2cd9e>=n1=0;6)<l0;c3?k4en3h07d7=:18'6f6=i91e>oh5c:9j=4<72-8h<7o?;o0ab?b<3`3;6=4+2b29e5=i:kl1i65f8g83>!4d83k;7c<mf;d8?l>b290/>n>5a19m6g`=9910e5j50;&1g5<f82d9nk4>1:9j<f<72-8h<7o?;o0ab?7532c3n7>5$3a3>d6<f;hm6<=4;h:b>5<#:j:1m=5a2cd951=<a131<7*=c18b4>h5jo0:965fa983>!4d83k;7c<mf;35?>of?3:1(?m?:`28j7da28=07do9:18'6f6=i91e>oh51998md3=83.9o=4n0:l1fc<6121bm94?:%0`4?g73g8ij7?n;:kb7?6=,;i;6l>4n3`e>4d<3`k96=4+2b29e5=i:kl1=n54i8g94?"5k90j<6`=bg82`>=n1:0;6)<l0;c3?k4en3;n76g78;29 7e72h:0b?li:0d8?leb290/>n>5ce9m6g`=821bon4?:%0`4?ec3g8ij7?4;haa>5<#:j:1oi5a2cd96>=nkh0;6)<l0;ag?k4en3907dm=:18'6f6=k81e>oh50:9jg5<72-8h<7m>;o0ab?7<3`hn6=4+2b29g4=i:kl1>65fbe83>!4d83i:7c<mf;18?ldd290/>n>5c09m6g`=<21bno4?:%0`4?e63g8ij7;4;h`b>5<#:j:1o<5a2cd92>=nj00;6)<l0;a2?k4en3=07dl7:18'6f6=k81e>oh58:9jf2<72-8h<7m>;o0ab??<3`h=6=4+2b29g4=i:kl1m65fb483>!4d83i:7c<mf;`8?ld4290/>n>5c09m6g`=k21bn?4?:%0`4?e63g8ij7j4;h`2>5<#:j:1o<5a2cd9a>=nj90;6)<l0;a2?k4en3l07doi:18'6f6=k81e>oh51198mdc=83.9o=4l1:l1fc<6921bmi4?:%0`4?e63g8ij7?=;:kbg?6=,;i;6n?4n3`e>45<3`ki6=4+2b29g4=i:kl1=954i`c94?"5k90h=6`=bg821>=nk00;6)<l0;a2?k4en3;=76gl8;29 7e72j;0b?li:058?le0290/>n>5c09m6g`=9110en850;&1g5<d92d9nk4>9:9jg0<72-8h<7m>;o0ab?7f32ch87>5$3a3>f7<f;hm6<l4;ha0>5<#:j:1o<5a2cd95f=<akl1<7*=c18`5>h5jo0:h65fb583>!4d83i:7c<mf;3f?>of13:1(?m?:b38j7da28l07dj<:18'6f6=l;1e>oh50:9j`4<72-8h<7j=;o0ab?7<3`n;6=4+2b29`7=i:kl1>65fcg83>!4d83n97c<mf;18?l54290/>n>5339m6g`=821b?<4?:%0`4?553g8ij7?4;h13>5<#:j:1??5a2cd96>=n:o0;6)<l0;11?k4en3907d<j:18'6f6=;;1e>oh54:9j6a<72-8h<7==;o0ab?3<3`9h6=4+2b2977=i:kl1:65f3c83>!4d83997c<mf;58?l5f290/>n>5339m6g`=021b?44?:%0`4?553g8ij774;h1;>5<#:j:1??5a2cd9e>=n;>0;6)<l0;11?k4en3h07d=9:18'6f6=;;1e>oh5c:9j70<72-8h<7==;o0ab?b<3`9?6=4+2b2977=i:kl1i65f2b83>!4d83997c<mf;d8?l24290/>n>5439m6g`=821b8<4?:%0`4?253g8ij7?4;h63>5<#:j:18?5a2cd96>=n;o0;6)<l0;61?k4en3907d=j:18'6f6=<;1e>oh54:9j0f<72-8h<7:=;o0ab?3<3`>i6=4+2b2907=i:kl1:65f4`83>!4d83>97c<mf;58?l2>290/>n>5439m6g`=021b854?:%0`4?253g8ij774;h64>5<#:j:18?5a2cd9e>=n<?0;6)<l0;61?k4en3h07d:::18'6f6=<;1e>oh5c:9j01<72-8h<7:=;o0ab?b<3`9o6=4+2b2907=i:kl1i65f5583>!4d83?87c<mf;28?l35290/>n>5529m6g`=921b9<4?:%0`4?343g8ij7<4;h73>5<#:j:19>5a2cd97>=n<o0;6)<l0;70?k4en3>07d:j:18'6f6==:1e>oh55:9j1a<72-8h<7;<;o0ab?0<3`?h6=4+2b2916=i:kl1;65f5c83>!4d83?87c<mf;:8?l3f290/>n>5529m6g`=121b944?:%0`4?343g8ij7o4;h7;>5<#:j:19>5a2cd9f>=n=>0;6)<l0;70?k4en3i07d;9:18'6f6==:1e>oh5d:9j10<72-8h<7;<;o0ab?c<3`>o6=4+2b2916=i:kl1j65f6583>!4d83<87c<mf;28?l05290/>n>5629m6g`=921b:<4?:%0`4?043g8ij7<4;h43>5<#:j:1:>5a2cd97>=n=o0;6)<l0;40?k4en3>07d8k:18'6f6=>:1e>oh55:9j2f<72-8h<78<;o0ab?0<3`<i6=4+2b2926=i:kl1;65f6`83>!4d83<87c<mf;:8?l0>290/>n>5629m6g`=121b:54?:%0`4?043g8ij7o4;h44>5<#:j:1:>5a2cd9f>=n>?0;6)<l0;40?k4en3i07d8::18'6f6=>:1e>oh5d:9j1`<72-8h<78<;o0ab?c<3`?8?7>5$3a3>0553g8ij7>4;h705?6=,;i;68==;o0ab?7<3`?8<7>5$3a3>0553g8ij7<4;h71b?6=,;i;68==;o0ab?5<3`?9i7>5$3a3>04c3g8ij7>4;h71g?6=,;i;68<k;o0ab?7<3`?9n7>5$3a3>04c3g8ij7<4;h71e?6=,;i;68<k;o0ab?5<3`??97>5$3a3>0233g8ij7>4;h777?6=,;i;68:;;o0ab?7<3`??>7>5$3a3>0233g8ij7<4;h775?6=,;i;68:;;o0ab?5<3`??<7>5$3a3>0233g8ij7:4;h70b?6=,;i;68:;;o0ab?3<3`?8i7>5$3a3>0233g8ij784;h70`?6=,;i;68:;;o0ab?1<3`?8o7>5$3a3>05e3g8ij7>4;h70e?6=,;i;68=m;o0ab?7<3`?857>5$3a3>05e3g8ij7<4;h70<?6=,;i;68=m;o0ab?5<3`?8;7>5$3a3>05e3g8ij7:4;h702?6=,;i;68=m;o0ab?3<3`?897>5$3a3>05e3g8ij784;h700?6=,;i;68=m;o0ab?1<3foo6=4+2b29af=i:kl1<65`ec83>!4d83oh7c<mf;38?jc>290/>n>5eb9m6g`=:21di54?:%0`4?cd3g8ij7=4;ng4>5<#:j:1in5a2cd90>=hm?0;6)<l0;g`?k4en3?07bk::18'6f6=mj1e>oh56:9la1<72-8h<7kl;o0ab?1<3fo86=4+2b29af=i:kl1465`e383>!4d83oh7c<mf;;8?jc6290/>n>5eb9m6g`=i21di=4?:%0`4?cd3g8ij7l4;nff>5<#:j:1in5a2cd9g>=hlm0;6)<l0;g`?k4en3n07bjl:18'6f6=mj1e>oh5e:9l`g<72-8h<7kl;o0ab?`<3fnj6=4+2b29af=i:kl1==54oe;94?"5k90no6`=bg825>=hl10;6)<l0;g`?k4en3;976ak7;29 7e72li0b?li:018?jb1290/>n>5eb9m6g`=9=10ci;50;&1g5<bk2d9nk4>5:9lb1<72-8h<7kl;o0ab?7132em?7>5$3a3>`e<f;hm6<94;nd1>5<#:j:1in5a2cd95==<go;1<7*=c18fg>h5jo0:565`f183>!4d83oh7c<mf;3b?>ibn3:1(?m?:da8j7da28h07bkj:18'6f6=mj1e>oh51b98k`g=83.9o=4jc:l1fc<6l21dhk4?:%0`4?cd3g8ij7?j;:mg0?6=,;i;6hm4n3`e>4`<3f;:o7>5$3a3>47e3g8ij7>4;n32e?6=,;i;6<?m;o0ab?7<3f;:57>5$3a3>47e3g8ij7<4;n32<?6=,;i;6<?m;o0ab?5<3f;;j7>5$3a3>46b3g8ij7>4;n33`?6=,;i;6<>j;o0ab?7<3f;;n7>5$3a3>46b3g8ij7<4;n33e?6=,;i;6<>j;o0ab?5<3f;;57>5$3a3>46b3g8ij7:4;n33<?6=,;i;6<>j;o0ab?3<3f;;;7>5$3a3>46b3g8ij784;n332?6=,;i;6<>j;o0ab?1<3f;;97>5$3a3>46b3g8ij764;n330?6=,;i;6<>j;o0ab??<3f;;?7>5$3a3>46b3g8ij7o4;n336?6=,;i;6<>j;o0ab?d<3f;;<7>5$3a3>46b3g8ij7m4;nde>5<#:j:1==k4n3`e>a=<goo1<7*=c1824`=i:kl1i65`fe83>!4d83;;i6`=bg8e?>iak3:1(?m?:02f?k4en3;;76aib;29 7e728:n7c<mf;32?>iai3:1(?m?:02f?k4en3;976ai9;29 7e728:n7c<mf;30?>ia03:1(?m?:02f?k4en3;?76ai7;29 7e728:n7c<mf;36?>i69?0;6)<l0;33a>h5jo0::65`10794?"5k90:<h5a2cd952=<g8;?6=4+2b2955c<f;hm6<64;n327?6=,;i;6<>j;o0ab?7>32e:=?4?:%0`4?77m2d9nk4>a:9l547=83.9o=4>0d9m6g`=9k10c<??:18'6f6=99o0b?li:0a8?j77k3:1(?m?:02f?k4en3;o76a>0083>!4d83;;i6`=bg82a>=hn?0;6)<l0;33a>h5jo0:j65`13394?"5k90:>=5a2cd94>=h98l1<7*=c18265=i:kl1=65`10g94?"5k90:>=5a2cd96>=h98n1<7*=c18265=i:kl1?65rb42a>5<68;0;6=u+2ef96f5<@<>h7E;=7:X45?77s8?1=l4>6;3a>44=990:?7?>:0f95f<5>38>6<951d82<?7a2tdm97>4n034>5=#9j?1?6*>c780?!74>390(<=8:29'56>=;2.:?44<;%30e?5<,89i6>5+12a97>"6;m087)?<e;18 45a2:1/=9>53:&204<43-;?>7=4$060>6=#:m=1>6*=d981?!73?390(<:7:29'51?=;2.:8l4<;%37f?5<,8>h6>5+15f97>"6<l087)?;f;18 4372:1/=8?53:&217<43-;>?7=4$077>6=#9<?1?6*>5780?!72?390(<;7:29'50?=;2.:9l4<;%36f?5<,8?h6>5+14f97>"6=l087)?:f;18 4072:1/=;?53:&227<43-;=?7=4$047>6=#9??1?6*>6780?!71?390(<87:29'53?=;2.::l4<;%35f?5<,8<h6>5+17f97>"6>l087)?9f;18 4172:1/=:?53:&237<43-;<?7=4$057>6=#9>?1?6*>7780?!70?390(<97:29'52?=;2.:;l4<;%34f?5<,8=h6>5+16f97>"6?l087)?8f;18 4>72:1/=5?53:&2<7<43-;3?7=4$0:7>6=#91?1?6*>8780?!7??390(<67:29'5=?=;2.:4l4<;%3;f?5<,82h6>5+19f97>"60l087)?7f;18 4?72:1/=4?53:&2=7<43-;2?7=4$0;7>6=#90?1?6*>9780?!7>?390(<77:29'5<?=;2.:5l4<;%3:f?5<,83h6>5+18f97>"61l087)?6f;18 4g72:1/=l?53:&2e7<43-;j?7=4$0c7>6=#9h?1?6*>a780?!7f?390(<o7:29'5d?=;2.:ml4<;%3bf?5<,8kh6>5+1`f97>"6il087)?nf;18 4d72:1/=o?53:&2f7<43-;i?7=4$0`7>6=#9k?1?6*>b780?!7e?390(<l7:29'5g?=;2.:nl4<;%3af?5<,8hh6>5+1cf97>"6jl087)?mf;18 4e72:1/=n?53:&2g7<43-;h?7=4$0a7>6=#:m91=?94$067>6=#9j31>oo4$3a7>7df3-8h97<ma:l1g2<5<2d9o54=4:&1`1<1m2.9h84=d39'5f1=:2.:o54=;%772?4d>2.>8:4=c79m11>=:=1e9975259'513=;2c:>>4?::k267<722c:>84?::k261<722c9hl4?::k1`<<722c9hn4?::k1`g<722c<j7>5;h5f>5<<a1;1<75f8183>>o5kl0;66g=ce83>>o5l90;66g=cg83>>o5kh0;66g=c883>>o5kj0;66g=cc83>>o0;3:17d9;:188m23=831b;;4?::m43?6=3f=36=44o6;94?=h?h0;66gn1;29 7e72h:0b?li:198m<`=83.9o=4n0:l1fc<632c2h7>5$3a3>d6<f;hm6?54i8a94?"5k90j<6`=bg80?>o>j3:1(?m?:`28j7da2=10e4o50;&1g5<f82d9nk4:;:k:=?6=,;i;6l>4n3`e>3=<a021<7*=c18b4>h5jo0<76g67;29 7e72h:0b?li:998m<0=83.9o=4n0:l1fc<>32c297>5$3a3>d6<f;hm6l54i8694?"5k90j<6`=bg8a?>o>:3:1(?m?:`28j7da2j10e4?50;&1g5<f82d9nk4k;:k:4?6=,;i;6l>4n3`e>`=<a1l1<7*=c18b4>h5jo0m76g7e;29 7e72h:0b?li:028?l>c290/>n>5a19m6g`=9810e5m50;&1g5<f82d9nk4>2:9j<g<72-8h<7o?;o0ab?7432c3m7>5$3a3>d6<f;hm6<:4;h::>5<#:j:1m=5a2cd950=<ah21<7*=c18b4>h5jo0::65fa683>!4d83k;7c<mf;34?>of>3:1(?m?:`28j7da28207do::18'6f6=i91e>oh51898md2=83.9o=4n0:l1fc<6i21bm>4?:%0`4?g73g8ij7?m;:kb6?6=,;i;6l>4n3`e>4e<3`3n6=4+2b29e5=i:kl1=i54i8194?"5k90j<6`=bg82a>=n010;6)<l0;c3?k4en3;m76gle;29 7e72jn0b?li:198mfe=83.9o=4ld:l1fc<632chn7>5$3a3>fb<f;hm6?54ibc94?"5k90hh6`=bg80?>od:3:1(?m?:b38j7da2910en>50;&1g5<d92d9nk4>;:kaa?6=,;i;6n?4n3`e>7=<akn1<7*=c18`5>h5jo0876gmc;29 7e72j;0b?li:598mgd=83.9o=4l1:l1fc<232cim7>5$3a3>f7<f;hm6;54ic;94?"5k90h=6`=bg84?>oe03:1(?m?:b38j7da2110eo950;&1g5<d92d9nk46;:ka2?6=,;i;6n?4n3`e>d=<ak?1<7*=c18`5>h5jo0i76gm3;29 7e72j;0b?li:b98mg4=83.9o=4l1:l1fc<c32ci=7>5$3a3>f7<f;hm6h54ic294?"5k90h=6`=bg8e?>ofn3:1(?m?:b38j7da28:07doj:18'6f6=k81e>oh51098mdb=83.9o=4l1:l1fc<6:21bmn4?:%0`4?e63g8ij7?<;:kbf?6=,;i;6n?4n3`e>42<3`kj6=4+2b29g4=i:kl1=854ib;94?"5k90h=6`=bg822>=nk10;6)<l0;a2?k4en3;<76gl7;29 7e72j;0b?li:0:8?le1290/>n>5c09m6g`=9010en;50;&1g5<d92d9nk4>a:9jg1<72-8h<7m>;o0ab?7e32ch?7>5$3a3>f7<f;hm6<m4;h`e>5<#:j:1o<5a2cd95a=<ak>1<7*=c18`5>h5jo0:i65fa883>!4d83i:7c<mf;3e?>oc;3:1(?m?:e08j7da2910ei?50;&1g5<c:2d9nk4>;:kg4?6=,;i;6i<4n3`e>7=<ajl1<7*=c18g6>h5jo0876g<3;29 7e72:80b?li:198m67=83.9o=4<2:l1fc<632c8<7>5$3a3>64<f;hm6?54i3d94?"5k908>6`=bg80?>o5m3:1(?m?:208j7da2=10e?j50;&1g5<4:2d9nk4:;:k0g?6=,;i;6><4n3`e>3=<a:h1<7*=c1806>h5jo0<76g<a;29 7e72:80b?li:998m6?=83.9o=4<2:l1fc<>32c847>5$3a3>64<f;hm6l54i2594?"5k908>6`=bg8a?>o4>3:1(?m?:208j7da2j10e>;50;&1g5<4:2d9nk4k;:k00?6=,;i;6><4n3`e>`=<a;i1<7*=c1806>h5jo0m76g;3;29 7e72=80b?li:198m17=83.9o=4;2:l1fc<632c?<7>5$3a3>14<f;hm6?54i2d94?"5k90?>6`=bg80?>o4m3:1(?m?:508j7da2=10e9m50;&1g5<3:2d9nk4:;:k7f?6=,;i;69<4n3`e>3=<a=k1<7*=c1876>h5jo0<76g;9;29 7e72=80b?li:998m1>=83.9o=4;2:l1fc<>32c?;7>5$3a3>14<f;hm6l54i5494?"5k90?>6`=bg8a?>o3=3:1(?m?:508j7da2j10e9:50;&1g5<3:2d9nk4k;:k0`?6=,;i;69<4n3`e>`=<a<>1<7*=c1867>h5jo0;76g:2;29 7e72<90b?li:098m07=83.9o=4:3:l1fc<532c><7>5$3a3>05<f;hm6>54i5d94?"5k90>?6`=bg87?>o3m3:1(?m?:418j7da2<10e8j50;&1g5<2;2d9nk49;:k6g?6=,;i;68=4n3`e>2=<a<h1<7*=c1867>h5jo0376g:a;29 7e72<90b?li:898m0?=83.9o=4:3:l1fc<f32c>47>5$3a3>05<f;hm6o54i4594?"5k90>?6`=bg8`?>o2>3:1(?m?:418j7da2m10e8;50;&1g5<2;2d9nk4j;:k7`?6=,;i;68=4n3`e>c=<a?>1<7*=c1857>h5jo0;76g92;29 7e72?90b?li:098m37=83.9o=493:l1fc<532c=<7>5$3a3>35<f;hm6>54i4d94?"5k90=?6`=bg87?>o1l3:1(?m?:718j7da2<10e;m50;&1g5<1;2d9nk49;:k5f?6=,;i;6;=4n3`e>2=<a?k1<7*=c1857>h5jo0376g99;29 7e72?90b?li:898m3>=83.9o=493:l1fc<f32c=;7>5$3a3>35<f;hm6o54i7494?"5k90=?6`=bg8`?>o1=3:1(?m?:718j7da2m10e8k50;&1g5<1;2d9nk4j;:k676<72-8h<7;<2:l1fc<732c>?<4?:%0`4?34:2d9nk4>;:k675<72-8h<7;<2:l1fc<532c>>k4?:%0`4?34:2d9nk4<;:k66`<72-8h<7;=d:l1fc<732c>>n4?:%0`4?35l2d9nk4>;:k66g<72-8h<7;=d:l1fc<532c>>l4?:%0`4?35l2d9nk4<;:k600<72-8h<7;;4:l1fc<732c>8>4?:%0`4?33<2d9nk4>;:k607<72-8h<7;;4:l1fc<532c>8<4?:%0`4?33<2d9nk4<;:k605<72-8h<7;;4:l1fc<332c>?k4?:%0`4?33<2d9nk4:;:k67`<72-8h<7;;4:l1fc<132c>?i4?:%0`4?33<2d9nk48;:k67f<72-8h<7;<b:l1fc<732c>?l4?:%0`4?34j2d9nk4>;:k67<<72-8h<7;<b:l1fc<532c>?54?:%0`4?34j2d9nk4<;:k672<72-8h<7;<b:l1fc<332c>?;4?:%0`4?34j2d9nk4:;:k670<72-8h<7;<b:l1fc<132c>?94?:%0`4?34j2d9nk48;:mf`?6=,;i;6hm4n3`e>5=<glh1<7*=c18fg>h5jo0:76aj9;29 7e72li0b?li:398k`>=83.9o=4jc:l1fc<432en;7>5$3a3>`e<f;hm6954od494?"5k90no6`=bg86?>ib=3:1(?m?:da8j7da2?10ch:50;&1g5<bk2d9nk48;:mf7?6=,;i;6hm4n3`e>==<gl81<7*=c18fg>h5jo0276aj1;29 7e72li0b?li:`98k`6=83.9o=4jc:l1fc<e32eoi7>5$3a3>`e<f;hm6n54oef94?"5k90no6`=bg8g?>ick3:1(?m?:da8j7da2l10cil50;&1g5<bk2d9nk4i;:mge?6=,;i;6hm4n3`e>46<3fn26=4+2b29af=i:kl1=<54oe:94?"5k90no6`=bg826>=hl>0;6)<l0;g`?k4en3;876ak6;29 7e72li0b?li:068?jb2290/>n>5eb9m6g`=9<10ck:50;&1g5<bk2d9nk4>6:9lb6<72-8h<7kl;o0ab?7032em>7>5$3a3>`e<f;hm6<64;nd2>5<#:j:1in5a2cd95<=<go:1<7*=c18fg>h5jo0:m65`eg83>!4d83oh7c<mf;3a?>ibm3:1(?m?:da8j7da28i07bkn:18'6f6=mj1e>oh51e98ka`=83.9o=4jc:l1fc<6m21dh94?:%0`4?cd3g8ij7?i;:m25f<72-8h<7?>b:l1fc<732e:=l4?:%0`4?76j2d9nk4>;:m25<<72-8h<7?>b:l1fc<532e:=54?:%0`4?76j2d9nk4<;:m24c<72-8h<7??e:l1fc<732e:<i4?:%0`4?77m2d9nk4>;:m24g<72-8h<7??e:l1fc<532e:<l4?:%0`4?77m2d9nk4<;:m24<<72-8h<7??e:l1fc<332e:<54?:%0`4?77m2d9nk4:;:m242<72-8h<7??e:l1fc<132e:<;4?:%0`4?77m2d9nk48;:m240<72-8h<7??e:l1fc<?32e:<94?:%0`4?77m2d9nk46;:m246<72-8h<7??e:l1fc<f32e:<?4?:%0`4?77m2d9nk4m;:m245<72-8h<7??e:l1fc<d32emj7>5$3a3>46b3g8ij7j4;ndf>5<#:j:1==k4n3`e>`=<gon1<7*=c1824`=i:kl1j65`fb83>!4d83;;i6`=bg824>=hnk0;6)<l0;33a>h5jo0:=65`f`83>!4d83;;i6`=bg826>=hn00;6)<l0;33a>h5jo0:?65`f983>!4d83;;i6`=bg820>=hn>0;6)<l0;33a>h5jo0:965`10494?"5k90:<h5a2cd953=<g8;>6=4+2b2955c<f;hm6<94;n320?6=,;i;6<>j;o0ab?7?32e:=>4?:%0`4?77m2d9nk4>9:9l544=83.9o=4>0d9m6g`=9h10c<?>:18'6f6=99o0b?li:0`8?j7683:1(?m?:02f?k4en3;h76a>0b83>!4d83;;i6`=bg82`>=h99;1<7*=c1824`=i:kl1=h54og494?"5k90:<h5a2cd95c=<g88:6=4+2b29576<f;hm6=54o03e>5<#:j:1=?>4n3`e>4=<g8;n6=4+2b29576<f;hm6?54o03g>5<#:j:1=?>4n3`e>6=<uz==97>54z\420=:=9n1=>?4=2d7>457349m>7?<0:p335=83;?hvP:659]103<V><n7S99c:\611=Y??20R:?<;_55`>X09=1U;>84^441?[3192T>:=5Q54d8Z03b3W?>h6P:5b9]10d<V<?j7S;:9:\427=Y??;0R:8?;_56b>X0=l1U;8j4^67`?[12j2T<9l5Q74;8902c288n70;>d;:5?837n32=70;>a;:5?836132=70;>8;:5?836?32=70;=5;:5?835<32=70:?f;:4?827l32<70:?b;:4?827132<70:?7;:4?827=32<70:?3;:4?827932<70=if;:4?82>;32<70:62;:4?82>932<70:60;:4?82?n32<70:70;:4?820n32<70:8e;:4?820l32<70:8c;:4?85b;32<70=j2;:4?85b932<70=j0;:4?85cn32<70=k0;:4?85dn32<70=le;:4?85dl32<70=lc;:4?82en32<70:md;:4?82ej32<70:m9;:4?82e?32<70:m5;:4?82e;32<70:m1;:4?82fn32<70;?9;0ge>;28009h45251;96fg<5<:26?m6;<73=?4dk27><44=cc9>15?=?:169=75759>15?=?<169=75779>15?=k;169=75c19>15?=jl169=75be9>15?=jj169=75bc9>15?=jh169=75b89>15?=j1169=75b69>15?=j?169=75b49>15?=j:169=75b39>15?=j8169=75b19>15?=io169=75ad9>15?=im169=75ab9>15?=ik169=75a`9>15?=k0169=75c99>15?=k>169=75c79>15?=k<169=75c59>15?=k:169=75bg9>15?=j=169=75a89>15?=l:169=75d09>15?=l9169=75cg9>15?=;:169=75369>15?=;?169=75349>15?=;=169=752b9>15?=<>169=75479>15?=<<169=75459>15?=;m169=75559>15?==1169=75569>15?==?169=75549>15?=<m169=75699>15?=>>169=75679>15?=><169=755d9>15?===?018>6:460?83713??>63:088604=:=93199>4=42:>05a34?;57;<e:?64<<2;m169=7552a8906>2<9j70;?9;70=>;2800>?55251;9161<5<:268=9;<73=?34=27><44:359>15g=:mk018>n:3f:?837i38hm63:0`81g<=:=9k1>nm4=42b>7ee34?;m79<;<73e?1334?;m79:;<73e?1134?;m7m=;<73e?e734?;m7lj;<73e?dc34?;m7ll;<73e?de34?;m7ln;<73e?d>34?;m7l7;<73e?d034?;m7l9;<73e?d234?;m7l<;<73e?d534?;m7l>;<73e?d734?;m7oi;<73e?gb34?;m7ok;<73e?gd34?;m7om;<73e?gf34?;m7m6;<73e?e?34?;m7m8;<73e?e134?;m7m:;<73e?e334?;m7m<;<73e?da34?;m7l;;<73e?g>34?;m7j<;<73e?b634?;m7j?;<73e?ea34?;m7=<;<73e?5034?;m7=9;<73e?5234?;m7=;;<73e?4d34?;m7:8;<73e?2134?;m7::;<73e?2334?;m7=k;<73e?3334?;m7;7;<73e?3034?;m7;9;<73e?3234?;m7:k;<73e?0?34?;m788;<73e?0134?;m78:;<73e?3b34?;m7;;5:?64d<2<:169=o55508906f2<>:70;?a;774>;28h0>?k5251c916c<5<:j68=k;<73e?34k27><l4:3`9>15g==:3018>n:41;?837i3?8;63:0`8673=:=9k19>;4=42b>05334?;n7<ka:?64g<5l0169=l52bc8906e2;i270;?b;0`g>;28k09oo5251`936=:=9h1;95251`930=:=9h1;;5251`9g`=:=9h1on5251`9gg=:=9h1ol5251`9g7=:=9h1o=5251`9f`=:=9h1ni5251`9ff=:=9h1no5251`9fd=:=9h1n45251`9f==:=9h1n:5251`9f3=:=9h1n85251`9f6=:=9h1n?5251`9f4=:=9h1n=5251`9ec=:=9h1mh5251`9ea=:=9h1mn5251`9eg=:=9h1ml5251`9g<=:=9h1o55251`9g2=:=9h1o;5251`9g0=:=9h1o95251`9g6=:=9h1nk5251`9f1=:=9h1m45251`9`6=:=9h1h<5251`9`5=:=9h1ok5251`976=:=9h1?:5251`973=:=9h1?85251`971=:=9h1>n5251`902=:=9h18;5251`900=:=9h1895251`97a=:=9h1995251`91==:=9h19:5251`913=:=9h1985251`90a=:=9h1:55251`922=:=9h1:;5251`920=:=9h19h5251`9113<5<:i68:<;<73f?33:27><o4:409>15d===:018>m:41e?837j3?8i63:0c867a=:=9h19>m4=42a>05f34?;n7;<9:?64g<2;1169=l55258906e2<9=70;?b;701>;28k0>?95rs644>5<0sW==;63:0d8;6>;29j09o<5250`96f7<5<;o6?m>;<73b?4d927>=l4=c09~w6`42909wS9?c:?0b6<5k;1v:6>:180[1?927?m94>319>0d5=9::0q~9:8;2914}Y?<201>h?:60896`42>8018?>:60890772>8018>i:608907>2>8018?7:60890702>801>96:608961?2>801>98:60896112>801>9::60896132>801>9<:60896152>801>9>:60896172>801>lj:60896dc2>801>ll:60896de2>801>ln:60896d>2>801>l7:60896d02>801>l9:60896d22>801>on:60896g>2>801>o7:60896g02>801>o9:60896g22>801>o;:60896g42>801>o=:60896g62>801>=;:60896542>801>==:60896562>801>=?:608964a2>801><j:608964c2>801><l:608964e2>8019<i:608914b2>8019<l:608914e2>8019<k:608914f2>8019<6:60891402>8019<9:608914?2>8019:<:60891252>8019:>:60891272>8019=i:608915b2>8019=k:608915d2>8019=m:608915f2>8018>6:938906>21:018>6:3f3?837138hj63:0`8;5>;28h03<63:0`81`5=:=9k1>nh4=42a>=7<5<:i65>4=42a>7b734?;n7<lf:p0d7=838pR:>j;<6b5?4d:2wx;;h50;45[11n27?m<482:?7e5<0:27><h482:?65f<0:27>=k482:?65g<0:27>=i482:?65`<0:27>=l482:?660<0:27>>9482:?052<0:278=;482:?050<0:278=9482:?056<0:278=?482:?054<0:278==482:?04c<0:278<h482:?01f<0:2789o482:?01d<0:27894482:?01=<0:2789:482:?013<0:27898482:?011<0:2789>482:?00=<0:2788:482:?003<0:27888482:?001<0:2788>482:?007<0:2788<482:?005<0:278?k482:?0=3<0:27858482:?0=1<0:2785>482:?0=7<0:2785<482:?0=5<0:2784k482:?0<`<0:2784i482:?72c<0:27?:h482:?72a<0:27?:n482:?72g<0:27?:l482:?72<<0:27?:5482:?7af<0:27?il482:?7ag<0:27?ii482:?7a`<0:27?j<482:?7ac<0:27?j=482:?7b7<0:27?j>482:?7`c<0:27?hh482:?7`f<0:27?ho482:?7`a<0:27?h4482:?7`=<0:27?hl482:?7`3<0:27?h:482:?642<0:27><;482:?640<0:27><9482:?646<0:27><?482:?644<0:27><=482:?7bc<0:27?jh482:?64<<0n27><448e:?64<<5kl169=752bf8906f2>l018>n:6g8906f2;in70;?a;0``>;28k0<j63:0c84a>;28k09oh5251`96fb<uz>=;7>52z\432=:<?l1>n<4}r652?6=:rT<;;5247g96f4<uz>=97>52z\430=:<?n1>n<4}r650?6=:rT<;95247a96f4<uz>=?7>52z\436=:<?h1>n<4}r656?6=:rT<;?5247c96f4<uz>==7>52z\434=:<?31>n<4}r654?6=:rT<;=5247:96f4<uz<j?7>52z\57f=:=9h1==h4}r4b5?6=:rT=?o5251`955b<uz<j<7>52z\57d=:=9h1==l4}r4:b?6=:rT=?45251`955g<uz=;97>52z\5=a=:=9h1==74}r530?6=:rT=5n5251`955><uz=;?7>52z\5=g=:=9h1==94}r536?6=:rT=5l5251`9550<uz=;=7>52z\5=<=:=9h1==;4}r534?6=:rT=555251`9552<uz<mj7>52z\5=2=:=9h1===4}r4ea?6=:rT=5;5251`9554<uz<mh7>52z\5=0=:=9h1==>4}r4eg?6=:rT=595251`9bc=z{?lj6=4={_4:6>;28k0mi6s|6g;94?4|V?3:70;?b;dg?xu1n10;6?uQ6828906e2oi0q~8i7;296~X10o169=l5fc9~w3`12909wS87e:?64g<ai2wx:k;50;0xZ3>c34?;n7h6;|q5b1<72;qU:5m4=42a>c><uz<m?7>52z\5<g=:=9h1j:5rs7d1>5<5sW<3m63:0c8253=z{?l:6=4={_4;=>;28k0:=85rs7ge>5<5sW<3;63:0c8251=z{?on6=4={_4;2>;28k0:=>5rs7gg>5<5sW<3963:0c8257=z{?oh6=4={_4;0>;28k0:=<5rs7ga>5<5sW<3?63:0c8255=z{?oj6=4={_4;6>;28k0:<n5rs7g:>5<5sW<3=63:0c8244=z{?o36=4={_4;4>;28k0m:6s|6d594?4|V?=m70;?a;315>{t>l<1<7<t^75f?837i3;;j6s|6d694?4|V?=h70;?a;33`>{t>l91<7<t^75a?837i3;;n6s|6d094?4|V?=j70;?a;33e>{t>l;1<7<t^75:?837i3;;56s|6d294?4|V?=370;?a;33<>{t>ml1<7<t^754?837i3;;;6s|6eg94?4|V?==70;?a;332>{t>mn1<7<t^756?837i3;:j6s|6ea94?4|V?=?70;?a;331>{t>mh1<7<t^750?837i3;;86s|6e;94?4|V?=:70;?a;337>{t>m21<7<t^753?837i3;;>6s|6e594?4|V?<m70;?a;334>{t>m<1<7<t^74f?837i3lm7p}9d483>7}Y>?n018>n:gg8yv0c<3:1>vP96b9>15g=nm1v;j<:181[01j27><l4>1d9~w3b52909wS89a:?64d<ak2wx:i?50;0xZ30>34?;m7hm;|q5`5<72;qU:;64=42b>cg<uz<hi7>52z\523=:=9k1j45rs7ag>5<5sW<=963:0`8e<>{t>ji1<7<t^747?837i3l<7p}9cc83>7}Y>?9018>n:035?xu1kh0;6?uQ6708906f28;>7p}9c883>7}Y>?;018>n:03g?xu1k10;6?uQ6728906f28;?7p}9c683>7}Y><l018>n:030?xu1k?0;6?uQ64g8906f28;97p}9c483>7}Y><n018>n:032?xu1k:0;6?uQ64`8906f28;;7p}9c383>7}Y><k018>n:02`?xu1k80;6?uQ64;8906f28::7p}9c183>7}Y><2018>n:g48yv0en3:1>vP9569>15?=9;;0q~8me;296~X1=?169=7511d8yv0el3:1>vP9549>15?=99n0q~8mc;296~X1==169=7511`8yv0ej3:1>vP9529>15?=99k0q~8ma;296~X1=;169=7511;8yv0e03:1>vP9519>15?=9920q~8m7;296~X1<o169=751158yv0e>3:1>vP94d9>15?=99<0q~8m5;296~X1<m169=7510d8yv0e<3:1>vP94b9>15?=99?0q~8m3;296~X1<k169=751168yv0e:3:1>vP94`9>15?=9990q~8m1;296~X1<0169=751108yv0e83:1>vP9499>15?=99:0q~8nf;296~X1<>169=75fg9~w3gc2909wS8;5:?64<<am2wx:lm50;0xZ32334?;57hk;|q5eg<72;qU:9=4=42:>47b3ty=ml4?:3y]214<5<:26km4}r4b=?6=:rT=8<5251;9bg=z{?k36=4={_474>;2800mm6s|6`594?4|V?9m70;?9;d:?xu1i?0;6?uQ62g8906>2o20q~8n5;296~X1;m169=75f69~w3g32909wS8<8:?64<<69?1v:>9:181[0>;27><44>149~w3`e2909wS878:?64<<69m1v;h?:181[00l27><44>159~w3c22909wS882:?64<<69:1v;jn:181[01?27><44>139~w3ea2909wS8:c:?64<<6981v;m;:181[02927><44>119~w3d>2909wS8;6:?64<<68j1v;oj:181[04?27><44>009~w3?b2909wS8<6:?64<<a>2wx9i<50;0xZ00e34?;n7o>;|q6`5<72;qU9;o4=42a><`<uz?hj7>52z\62<=:=9h15i5rs4af>5<5sW?=463:0c8:g>{t>:>1<7<t^4a`?837j33i7p}93283>7}Y=jh018>m:8c8yv04:3:1>vP:c`9>15d=101v;=>:181[3d127><o468:p266=838pR8m7;<73f??03ty=>k4?:3y]1f1<5<:i6484}r41a?6=:rT>o;5251`9=0=z{?8o6=4={_7`1>;28k0286s|63a94?4|V<i?70;?b;;1?xu1:k0;6?uQ5b18906e20;0q~8=9;296~X2k8169=l5919~w34?2909wS;l0:?64g<?n2wx:?950;0xZ0da34?;n76j;|q563<72;qU9ok4=42a>=b<uz<997>52z\6fa=:=9h14n5rs707>5<5sW?io63:0c8;f>{t>;91<7<t^4`a?837j32j7p}92383>7}Y=kk018>m:9;8yv0593:1>vP:b89>15d=i11v;<?:181[3e027><o4n7:p24c=838pR8l9;<73f?g13ty==i4?:3y]1g3<5<:i6l;4}r42g?6=:rT>n95251`9e1=z{?;i6=4={_7a7>;28k0j?6s|60c94?4|V<h970;?b;c1?xu1900;6?uQ5c38906e20o0q~8>8;296~X2j9169=l5929~w3702909wS;nf:?64g<?02wx:<850;0xZ0gb34?;m7mj;|q550<72;qU9lj4=42b>d7<uz<:?7>52z\6eg=:=9k15k5rs731>5<5sW?jm63:0`8:`>{t>8;1<7<t^4c:?837i33h7p}91183>7}Y=h2018>n:8`8yv07n3:1>vP:a69>15g=1h1v;>j:181[3f>27><l469:p25b=838pR8o:;<73e???3ty=<n4?:3y]1d2<5<:j6nm4}r43f?6=:rT>m>5251c9=2=z{?:j6=4={_7b6>;28h02:6s|61:94?4|V<k;70;?a;;6?xu18>0;6?uQ58d8906f20>0q~8?6;296~X21l169=o5939~w3622909wS;6d:?64d<>92wx:=:50;0xZ0?d34?;m77?;|q546<72;qU94l4=42b>=`<uz<;>7>52z\6=d=:=9k1oo5rs722>5<5sW?2563:0`8;a>{t>9:1<7<t^4;;?837i32o7p}:fg83>7}Y=0=018>n:9a8yv3al3:1>vP:949>15g=0k1v8hl:181[3><27><l47a:p1cd=838pR87<;<73e?>>3ty>jl4?:3y]1<4<5<:j6l64}r7e=?6=:rT>5<5251c9e2=z{<l36=4={_7:4>;28h0hm6s|5g594?4|V<2m70;?a;c5?xu2n?0;6?uQ59g8906f2h?0q~;i5;296~X20m169=o5a59~w0`32909wS;7c:?64d<f;2wx9k<50;0xZ0>f34?;m7o=;|q6b4<72;qU9574=42b><c<uz?m<7>52z\6<==:=9k15>5rs4ge>5<5sW?3;63:0`8;<>{t=lo1<7<t^4:5?83713in7p}:ee83>7}Y=1?018>6:`38yv3bk3:1>vP:859>15?=1o1v8km:181[3?;27><446d:p1`g=838pR86=;<73=??d3ty>i44?:3y]1=7<5<:264l4}r7f3?6=:rT>;k5251;9=d=z{<o=6=4={_74a>;2800256s|5d794?4|V<=o70;?9;;;?xu2m=0;6?uQ56a8906>2ji0q~;j3;296~X2?k169=75969~w0c52909wS;8a:?64<<>>2wx9h?50;0xZ01>34?;577:;|q6a5<72;qU9:64=42:><2<uz?oj7>52z\632=:=9315?5rs4ff>5<5sW?<:63:088:5>{t=mi1<7<t^457?837133;7p}:dc83>7}Y=>9018>6:9d8yv3ci3:1>vP:739>15?=kk1v8j6:181[30927><447e:p1a>=838pR89?;<73=?>c3ty>h:4?:3y]13`<5<:265m4}r7g2?6=:rT>:h5251;9<g=z{<n>6=4={_75`>;28003m6s|5e694?4|V<<h70;?9;::?xu2l:0;6?uQ5758906>2h20q~8<5;296~X2k;169=75a69~w34f2909wS;m7:?64<<di2wx:<h50;0xZ0gd34?;57o9;|q551<72;qU9l?4=42:>d3<uz<;57>52z\6=3=:=931m95rs4df>5<5sW?3n63:088b7>{t=o91<7<t^4:3?83713k97p}:e983>7}Y=>?018>6:8g8yv3cl3:1>vP:679>15?=1:1v8mk:181[31=27><4478:p5a1=83kp18:j:3`g?82693=o70=if;5g?823=3=o70:7f;5g?820k3=o70=kf;5g?85dk3=o70:l1;5g?82fn3=o7p}<f083>6}:;o:14;523g19<3=:;o81>ol4}r722?6=9>q6?k>52b3896`42;i:70;>9;0`6>;3:o03>63;2d8;6>;3:j03>63;2c8;6>;3:m03>63;2`8;6>;3:003>63;268;6>;3:?09o<5243:9<7=:<=914?524509<7=:<=;14?524529<7=:<:l14?5242g9<7=:<:n14?5242a9<7=:<:h14?5242c9<7=z{:l;6=4;{<1e4?4d:27><i4>319>7c2=9:;01>h=:012?xu3i;0;6>u24`39<3=:<h:14;524`196gd<uz?:n7>54z?7e4<5k8168l>52b38907d21<018?m:3a1?xu3i90;6>u24`296f4<5=k?6<=>;<6b7?74:2wx9<m50;0x906b21<018?l:3a1?xu28l0;6?u251g96f4<5=k86<=>;|q655<72:q69<?5879>146=:j8018>i:6`8yv3693:1>v3:1081g7=:=891=>?4}r72a?6=;r7>=k476:?65a<0j27>=h4=c39~w07a2909w0;>f;0`6>;2:80:?<5rs43b>5<5s4?:n769;<72e?4d:2wx9=h50;1x907721<018>i:3a1?836;3;8<6s|50f94?5|5<;o6?m=;<72a?>134?9=7?<0:p144=83>p18?6:3a2?836038h=63:1681g4=:=891>ol4}r721?6=:0q69<652b08961>21801>97:908961021801>99:908961221801>9;:908961421801>9=:908961621801>9?:90896db21801>lk:90896dd21801>lm:90896df21801>l6:90896d?21801>l8:90896d121801>l::90896gf21801>o6:90896g?21801>o8:90896g121801>o::90896g321801>o<:90896g521801>o>:908965321801>=<:908965521801>=>:908965721801><i:908964b21801><k:908964d21801><m:908yv36<3:14v3:1681g7=:=9n1=><4=42:>7bd34?;57<kb:?64d<5lj169=o52e`8906e2;nh70;?b;0gf>{t=;:1<7=t=406>7e634?987<l1:?664<5jk1v8<<:1813~;2:<09o?5247d9<7=:<?o14?5247f9<7=:<?i14?5247`9<7=:<?k14?5247;9<7=:<?214?524da9<7=:<lk1>n?4=5ga>=4<5=oo65<4=5gf>=4<5=l:65<4=5ge>=4<5=l;65<4=5d1>=4<5=l865<4=5fe>=4<5=nn65<4=5f`>=4<5=ni65<4=5fg>=4<5=n265<4=5f;>=4<5=nj65<4=5f5>=4<5=n<6?m>;<733?>534?;:76=;<731?>534?;876=;<737?>534?;>76=;<735?>534?;<76=;<6eb?>534>mi76=;|q667<72;3p18<;:3a1?856?32970=>6;:1?856=32970=>4;:1?856;32970=>2;:1?856932970=>0;:1?857n32970=?e;:1?852k32970=:b;:1?852i32970=:9;:1?852032970=:7;:1?852>32970=:5;:1?852<32970=:3;:1?853032970=;7;:1?853>32970=;5;:1?853<32970=;3;:1?853:32970=;1;:1?853832970=<f;:1?85>>32970=65;:1?85><32970=63;:1?85>:32970=61;:1?85>832970=7f;:1?85?m32970=7d;:1?xu4=;0;6:u23059<3=:;<i1>n<4=3ff>456348n<7?<1:?1`c<6;816>h?5123897c5289:7p}<0e83>1}:;8=1>n<4=574>45634>2h7?<0:?7<d<6;91v>?7:181856>32=70<ke;0af>{t;9i1<7:t=235>7e534>>:7?<1:?7=a<6;;1685o51208yv5613:1>v3<148;2>;5lo09no5rs22a>5<3s49:97<l2:?710<6;81684m5122891>>289;7p}<1`83>3}:;8>14;522d296gd<5;o?6<=<;<0f1?74<279i;4>349>6`1=9:?0q~=?a;290~;49=09o?524469567<5=3h6<==;<6;=?74:2wx?<l50;0x967421<01?k>:3`a?xu4800;69u230196f4<5=?86<=>;<6:f?74827?454>319~w67d2909w0=>2;:5?84b:38in6s|31:94?2|5:;96?m=;<666?74827?5o4>339>0=>=9:80q~=>d;296~;49803:63=e581fg=z{::<6=4;{<125?4d:27?9<4>319>0<g=9::01968:013?xu49l0;6?u23029<3=::l?1>ol4}r132?6=<r78==4=c39>006=9::0197n:011?82??3;8>6s|30d94?4|5::m6584=3g5>7de3ty8<84?:5y>75`=:j8019:i:013?82>13;8<63;878275=z{:8;6=4={<13a?>1348n;7<mb:p752=83>p1>>j:3a1?823m3;8=63;988277=:<1<1=><4}r1a0?6=?r78;4476:?0f`<5k;16>k?5123897`4289:70<i2;305>;5n=0:?<522g79567<uz9=j7>53z?03<<5k;16?hj5123896bf289:7p}<7`83>7}:;>214;522g396gd<uz9=i7>53z?03=<5k;16?hj5121896bf289;7p}<7c83>7}:;>=14;522g096gd<uz9=h7>53z?032<5k;16?hm5123896b>289:7p}<7b83>3}:;><14;522g196gd<5;l<6<=<;<0e<?74<279j44>349>6cg=9:?0q~=9c;297~;4??09o?523da9565<5:n26<=?;|q03a<72;q6?:;5879>6c2=:kh0q~=9b;297~;4?<09o?523d`9567<5:n36<=>;|q03`<72;q6?::5879>6c3=:kh0q~=9a;297~;4?=09o?523d`9565<5:n36<=?;|q03c<72;q6?:=5879>6c1=:kh0q~=99;297~;4?:09o?523dc9567<5:n<6<=>;|q0<5<72;q6?:<5879>6c>=:kh0q~=98;297~;4?;09o?523dc9565<5:n<6<=?;|q0<4<72;q6?:?5879>6c?=:kh0q~=97;297~;4?809o?523d;9567<5:n=6<=>;|q0<7<72;q6?:>5879>6cg=:kh0q~=96;297~;4?909o?523d;9565<5:n=6<=?;|q0e5<72;q6?ok5879>7dg=:j80q~=6f;296~;4jm03:63<a881g7=z{:h86=49{<1a`?4d:279j<4>319>6c5=9::01?h=:013?84a<3;8<63=f48275=z{:3n6=4={<1ag?>1349j47<l2:p7g4=83?p1>ll:3a1?84a;3;8>63=f38277=::o>1=><4=3d6>4553ty85i4?:3y>7gd=0?16?l952b08yv5e93:18v3<bc81g7=::o91=>=4=3d7>454348m97?<3:p7<e=838p1>ln:94896g12;i97p}<b183>2}:;kk1>n<4=3d4>455348m47?<3:?1b<<6;=16>ko5121897`3289?70<i5;300>{t;0h1<7<t=2`:>=0<5:k>6?m=;|q0ec<72?q6?o752b0897`0289:70<i8;306>;5n00:?>522gc9564<5;l>6<=:;|q0=d<72;q6?o65879>7d2=:j80q~=ne;291~;4j109o?522g59566<5;l36<=>;<0e=?74:279jl4>309~w6?>2909w0=m7;:5?85f;38h>6s|3`f94?2|5:h<6?m=;<0e<?748279j44>309>6cg=9::0q~=68;296~;4j?03:63<a381g7=z{:kh6=4<{<1a2?4d:279j44>319>6c0=9::0q~=67;296~;4j<03:63<a081g7=z{:ki6=4={<1a1?4d:279j;4>309~w65b2909w0=:c;:5?853038h>6s|32f94?4|5:?i6584=264>7e53ty89<4?:7y>70d=:j801?jj:013?84b83;8<63=dg8275=::l;1=>>4=3g1>4573ty8?n4?:3y>70g=0?16?9852b08yv5283:19v3<5`81g7=::l:1=><4=3fe>455348n=7?<2:?1a7<6;;1v>=m:181852132=70=;5;0`6>{t;=l1<7:t=27:>7e5348n<7?<3:?1a4<6;:16>h<51218yv54i3:1>v3<598;2>;4<=09o?5rs26f>5<0s49>47<l2:?1a1<6;;16>h;5121897c1289?70<j7;307>;5m80:?9522d09562<uz9857>52z?012<?>2788>4=c39~w62c290=w0=:7;0`6>;5m=0:?<522d79564<5;o=6<=<;<0f3?74:279i?4>349~w65?2909w0=:6;:5?853:38h>6s|35a94?3|5:?=6?m=;<0f0?748279i84>309>6`0=9:801?k8:012?xu4;>0;6?u23479<3=:;=;1>n<4}r17f?6=<r78984=c39>6`3=9::01?k9:012?84b?3;8<6s|32494?4|5:??6584=263>7e53ty88l4?:2y>702=:j801?k9:013?84b;3;8<6s|32794?4|5:?86584=21e>7e53ty8844?:3y>705=:j801?k<:012?xu40j0;6?u23`c9<3=:;0<1>n<4}r1;f?6=:r78m4476:?0=0<5k;1v>6n:18185f032=70=64;0`6>{t;131<7<t=2c4>=0<5:386?m=;|q0<=<72;q6?l85879>7<4=:j80q~=77;296~;4i<03:63<9081g7=z{:2=6=4={<1b0?>13492<7<l2:p7=3=838p1>o<:94896>a2;i97p}<8583>7}:;h814;5239g96f4<uz93?7>52z?0e4<?>2784i4=c39~w64f2909w0=;8;:5?854<38h>6s|33;94?4|5:><6584=210>7e53ty8>54?:3y>710=0?16?><52b08yv55?3:1>v3<448;2>;4;809o?5rs205>5<5s49?8769;<104?4d:2wx??;50;0x962421<01><i:3a1?xu4:=0;6?u23509<3=:;;o1>n<4}r117?6=:r788<476:?06a<5k;1v><=:181853832=70==c;0`6>{t;;;1<7<t=21e>=0<5:8i6?m=;|q77<<72hq6?>:5879>015=:j801?k7:013?85ci3;8?63:08866>;2800=863:0`866>;28h0=863:0c866>;28k0=86s|34f94?4|5:986584=3g;>7de3ty89h4?:3y>764=0?16>h752c`8yv52n3:1>v3<308;2>;5mh09no5rs243>5<5s498<769;<0ff?4ej2wx?;?50;0x964a21<01?kl:3`a?xu4>;0;6?u233g9<3=::ln1>ol4}r157?6=:r78>i476:?1a`<5jk1v>8;:181855k32=70<jf;0af>{t;??1<7<t=20a>=0<5;l;6?lm;|q7ba<72hq6?485879>001=9::018>8:3a1?84aj3;8<63:08805>;2800??63:0`805>;28h0??63:0c805>;28k0??6s|3cd94?4|5:3>6584=3da>7de3ty8o=4?:3y>7<2=0?16>km52c`8yv5d93:1>v3<928;2>;5nm09no5rs2a1>5<5s492>769;<0ea?4ej2wx?n=50;0x96?621<01?hi:3`a?xu4k=0;6?u23829<3=:;9:1>ol4}r1`1?6=:r784k476:?044<5jk1v>m9:18185?m32=70=?2;0af>{t;j=1<7<t=2:g>=0<5::86?lm;|q701<728?p19<i:6`8914b2>h019<l:6`8914e2>h019<k:6`8914f2>h019<6:6`891402>h019<9:6`8914?2>h019:<:6`891252>h019:>:6`891272>h019=i:6`8915b2>h019=k:6`8915d2>h019=m:6`8915f2>h01>h;:3`a?xu4nl0;6?u243d9<3=:<8k1>ol4}r611?6=<r7?>k4=c39>015=0?16?hj51228917e289;7p}<fe83>7}:<;o14;5240;96gd<uz>987>54z?76`<5k;1689<5879>7`b=9:8019??:013?xu4nk0;6?u243a9<3=:<8=1>ol4}r616?6=<r7?>n4=c39>016=0?16?hm51208916d289;7p}<f`83>7}:<;h14;5240496gd<uz>9=7>54z?76g<5k;168>h5879>7`d=9::019>n:013?xu4nj0;6?u243f9<3=:<821>ol4}r617?6=<r7?>i4=c39>017=0?16?hm51228916b289;7p}<f883>7}:<;k14;5240796gd<uz>9<7>54z?76d<5k;168>k5879>7`d=9:8019>7:013?xu4n10;6?u243;9<3=:<8>1>ol4}r62b?6=<r7?>44=c39>06b=0?16?ho512289161289;7p}<f783>7}:<;=14;5240096gd<uz>:h7>54z?762<5k;168>l5879>7`?=9::019>=:013?xu4n<0;6?u24349<3=:<8;1>ol4}r62g?6=<r7?>;4=c39>06g=0?16?h7512089167289;7p}<f683>7}:<;214;5240196gd<uz>:i7>54z?76=<5k;168>m5879>7`g=9:8019>;:013?xu38o0;6?u240c93a=:<9l1>ol4}r62f?6=:r7?=l4>c`9>04d=:kh0q~:?d;297~;3900<h63;0g84`>;38m09no5rs533>5<4s4>:57?la:?74c<5l8168<>52c`8yv27j3:1?v3;1984`>;38m0<h63;0c81fg=z{=:n6=4<{<62<?7di27?<i4=d09>05c=:kh0q~:?9;297~;39>0<h63;0c84`>;38009no5rs52`>5<4s4>:;7?la:?74g<5l8168=m52c`8yv27?3:1?v3;1784`>;3800<h63;0681fg=z{=:j6=4<{<622?7di27?<44=d09>05g=:kh0q~:?5;297~;39<0<h63;0684`>;38<09no5rs52;>5<4s4>:97?la:?742<5l8168=652c`8yv27;3:1?v3;1584`>;38<0<h63;0281fg=z{=:=6=4<{<620?7di27?<84=d09>050=:kh0q~:?1;297~;39:0<h63;0284`>;38809no5rs527>5<4s4>:?7?la:?746<5l8168=:52c`8yv5an3:1?v3;1384`>;3880<h63<fg81fg=z{=:96=4<{<626?7di27?<<4=d09>054=:kh0q~:?0;297~;3980:ol523gd96a7<5=:;6?lm;|q77=<72hq689<52b0897c>289;70<j8;305>;4lh0:??5251;914=:=931:?5251c914=:=9k1:?5251`914=:=9h1:?5rs514>5<fs4>?=7<l2:?1ad<6;916>h75123896b>289870;?9;73?83713<:70;?a;73?837i3<:70;?b;73?837j3<:7p};3783>d}:<=:1>n<4=3ga>457348nm7?<1:?0`<<6;;169=754g9>15?=>9169=o54g9>15g=>9169=l54g9>15d=>91v9=::18b824n38h>63=eb8275=::lh1=>?4=2f;>45434?;57:j;<73=?3a34?;m7:j;<73e?3a34?;n7:j;<73f?3a3ty??94?:`y>06c=:j801?kk:013?84bk3;8=63<d98277=:=9319i5251;92a=:=9k19i5251c92a=:=9h19i5251`92a=z{=986=4n{<60`?4d:279ih4>319>6`b=9:;01>j8:010?83713?h70;?9;4`?837i3?h70;?a;4`?837j3?h70;?b;4`?xu3;;0;6lu242a96f4<5;om6<=?;<0fa?749278h:4>339>15?==k169=756c9>15g==k169=o56c9>15d==k169=l56c9~w156290jw0:<b;0`6>;5n90:?=522dd9567<5:n=6<=<;<73=?3f34?;578n;<73e?3f34?;m78n;<73f?3f34?;n78n;|q775<720q68>o52b0897`7289:70=k6;306>;2800>563:0885=>;28h0>563:0`85=>;28k0>563:0c85=>{t<=n1<7<t=57e>2b<5=>o6?lm;|q712<72;q688h51bc891302;hi7p};7683>7}:<<l1>ol4=54e>=0<uz>?o7>53z?71`<0l27?8i48d:?70f<5jk1v9;9:180822m3;hm63;4e81`4=:<<<1>ol4}r642?6=:r7?9h4=bc9>03c=0?1v9hl:18a823l32<70::6;304>;28?09o?522ga9566<5;li6<=>;<73=?5734?;57:>;<73e?5734?;m7:>;<73f?5734?;n7:>;|q70g<72:q688j57e9>01e=?m1689l52c`8yv22=3:1?v3;5e82gd=:<=i1>i?4=576>7de3ty?;84?:3y>00b=:kh0198k:948yv2aj3:1nv3;4b8;3>;3=<0:?=5251796f4<5;lo6<=?;<0eg?74927><44=f:?64<<3827><l4=f:?64d<3827><o4=f:?64g<382wx89o50;1x913d2>n019:m:6f8912f2;hi7p};5583>6}:<<i1=no4=56a>7b634>>87<mb:p022=838p19;l:3`a?821k32=7p};f`83>g}:<=h14:524469566<5<:?6?m=;<0ea?748279ji4>309>15?=:l169=753g9>15g=:l169=o53g9>15d=:l169=l53g9~w12>2908w0::b;5g?823i3=o70:;9;0af>{t<<91<7=t=57a>4ef34>?m7<k1:?716<5jk1v99<:181822j38in63;6c8;2>{t<o31<7lt=56b>=1<5=?86<=?;<737?4d:279jk4>319>6cc=9:;018>6:3f8906>2:o018>n:3f8906f2:o018>m:3f8906e2:o0q~:;8;297~;3=h0<h63;4884`>;3<109no5rs571>5<4s4>>m7?la:?70<<5l81688<52c`8yv20:3:1>v3;5`81fg=:<?k14;5rs5d;>5<es4>?5768;<666?74927><?4=c39>756=9::01?hi:012?837139h70;?9;6`?837i39h70;?a;6`?837j39h70;?b;6`?xu3<>0;6>u244;93a=:<=21;i5245596gd<uz>>=7>53z?71<<6kh1689652e3891362;hi7p};7083>7}:<<31>ol4=54:>=0<uz>m;7>5bz?70=<??27?9<4>309>157=:j801>>>:013?85783;8=63:0880f>;2800?n63:0`80f>;28h0?n63:0c80f>;28k0?n6s|45494?5|5=?36:j4=564>2b<5=>=6?lm;|q715<72:q688651bc891202;n:70::0;0af>{t<>:1<7<t=57;>7de34>=4769;|q7b3<72kq68995869>006=9:;018>?:3a1?857:3;8<63<008274=:=931?l5251;90d=:=9k1?l5251c90d=:=9h1?l5251`90d=z{=>>6=4={<672?1c34>?97<mb:p0c3=83hp19:9:958912a289:70:if;0`6>;48:0:?=523109567<5<:26>74=42:>1?<5<:j6>74=42b>1?<5<:i6>74=42a>1?<uz>?j7>52z?703<5l81689h52c`8yv2a<3:1mv3;448;3>;3<l0:?=524gg96f4<5::86<=>;<73=?5?34?;57:7;<73e?5?34?;m7:7;<73f?5?34?;n7:7;|q70`<72;q689;52e38912b2;hi7p};8d83>7}:<091;i5248096gd<uz>247>52z?7=6<5l81684j52c`8yv2>n3:1>v3;9281fg=:<h91=>=4}r6;`?6=:r7?5?48d:?7=4<5jk1v978:18182>:38o=63;9b81fg=z{=2h6=4={<6:5?1c34>2<7<mb:p0<0=838p197>:3f2?82>j38in6s|49`94?4|5=3;6:j4=5:e>7de3ty?584?:3y>0<6=:m;0197n:3`a?xu31=0;6?u249d96a7<5=326?lm;|q73g<72;q685>57e9>02`=:kh0q~:75;296~;30909h<5249c96gd<uz>2i7>52z?7<5<5jk168l=51268yv20i3:1>v3;7g84`>;3?l09no5rs5:7>5<5s4><j7<k1:?7<<<5jk1v996:181820m3=o70:8d;0af>{t<191<7<t=55f>7b634>347<mb:p02>=838p199k:6f8911d2;hi7p};8383>7}:<>n1>i?4=5:4>7de3ty?4<4?:3y>02e=:m;01969:3`a?xu4ll0;6?u23d193a=:;l81>ol4}r1f<?6=:r78i>4=d09>7`b=:kh0q~=jf;296~;4m:09no523g09564<uz9oh7>52z?0a7<0l278i<4=bc9~w6c02909w0=j2;0g5>;4mj09no5rs2f`>5<5s49n=79k;<1f4?4ej2wx?h850;0x96c62;n:70=jb;0af>{t;mh1<7<t=2g3>2b<5:nm6?lm;|q0a0<72;q6?h>52e3896cf2;hi7p}<e583>7}:;ml1>i?4=2g:>7de3ty8oo4?:3y>7a6=?m16?nh52c`8yv5c=3:1>v3<d181`4=:;mk1>ol4}r1fa?6=:r78h=4=bc9>7c4=9:90q~=la;296~;4ko0<h63<cd81fg=z{:n?6=4={<1`b?4c9278h44=bc9~w6e>2909w0=le;5g?85dl38in6s|3e194?4|5:in6?j>;<1g<?4ej2wx?n650;0x96ec2>n01>ml:3`a?xu4l;0;6?u23bf96a7<5:n<6?lm;|q0`4<72;q6?nm52e3896b12;hi7p}:0983>6b|5=oh6:l4=5gb>2d<5=oi6:l4=5gg>2d<5=on6:l4=5d2>2d<5=om6:l4=5d3>2d<5=l96:l4=5d0>2d<5=nm6:l4=5ff>2d<5=nh6:l4=5fa>2d<5=no6:l4=5f:>2d<5=n36:l4=5fb>2d<5=n=6:l4=5f4>2d<5<:<6:l4=425>2d<5<:>6:l4=427>2d<5<:86:l4=421>2d<5<::6:l4=423>2d<5=lm6:l4=5df>2d<5=k?6?lm;<73=?75;27><44>239>15?==:9018>6:412?83713?8<63:08866c=:=9319?k4=42:>04d34?;57;=b:?64<<2:h169=o51318906f288970;?a;707>;28h0>?<5251c9166<5<:j68<i;<73e?35m27><l4:2b9>15g==;h018>n:40b?837j3;9?63:0c8267=:=9h19>=4=42a>05634?;n7;<0:?64g<2:o169=l553g8906e2<8h70;?b;71f>;28k0>>l5rs5af>5<3s4>no769;<6g<?4d:27?5l4>329>0g2=9::0q~:j2;297~;3mj09o?525129<3=:<1=1=>=4}r6`g?6=<r7?il476:?7`3<5k;168475121891d7289;7p};e183>6}:<lk1>n<4=5df>=0<5=2=6<=<;|q7ga<72=q68hl5879>0a1=:j801976:012?82e:3;8<6s|4d394?5|5=oi6?m=;<6eb?>134>3:7?<1:p0f`=83>p19kk:94891b>2;i970:6a;305>;3j?0:?=5rs5g0>5<4s4>nh7<l2:?644<?>27?4:4>309~w1b7290?w0:je;:5?82ci38h>63;9c8276=:<k21=>>4}r6f0?6=;r7?ih4=c39>154=0?1685651218yv2c;3:18v3;f08;2>;3lm09o?5248a9567<5=hn6<=?;|q7a2<72:q68k?52b08906221<01966:012?xu3l80;69u24dd9<3=:<mh1>n<4=5;a>45634>im7?<0:p0`3=839p19ki:3a1?837;32=70:78;305>{t<m81<7:t=5d3>=0<5=nh6?m=;<6:g?74;27?nn4>319~w1c12908w0:i0;0`6>;28=03:63;888276=z{=n?6=4;{<6e6?>134>oi7<l2:?7=a<6;:168n>51228yv2b03:1?v3;f381g7=:=9<14;5249c9565<uz>o97>54z?7b6<?>27?hk4=c39>0<b=9:;019mm:013?xu3m00;6>u24g196f4<5<:<6584=5:b>4563ty?mh4?:3y>0a`=0?168no52c`8yv2fl3:1>v3;dd8;2>;3k009no5rs5ca>5<5s4>oo769;<6`3?4ej2wx8lo50;0x91be21<019m9:3`a?xu3ij0;6?u24ef9<3=:<j21>ol4}r6b<?6=:r7?h4476:?7g1<5jk1v9o8:18182c032=70:l3;0af>{t<h31<7<t=5fb>=0<5=i>6?lm;|q7e0<72;q68i85879>0f7=:kh0q~:n6;296~;3l>03:63;c381fg=z{=hm6=4={<6`e?1c34>ij7<mb:p0fd=838p19mn:0ab?82dj38in6s|4cf94?5|5=i26:j4=5`e>2b<5=ho6?lm;|q7g5<72:q68n751bc891da2;n:70:l0;0af>{t<kh1<7=t=5a;>2b<5=ho6:j4=5`a>7de3ty?nh4?:2y>0f>=9jk019lk:3f2?82em38in6s|4c;94?5|5=i<6:j4=5`a>2b<5=h26?lm;|q7ff<72:q68n951bc891de2;n:70:mc;0af>{t<k=1<7=t=5a5>2b<5=h26:j4=5`4>7de3ty?nl4?:2y>0f0=9jk019l6:3f2?82ei38in6s|4c794?5|5=i>6:j4=5`4>2b<5=h>6?lm;|q7f=<72:q68n;51bc891d02;n:70:m8;0af>{t<k91<7=t=5a7>2b<5=h>6:j4=5`0>7de3ty?n;4?:2y>0f2=9jk019l::3f2?82e>38in6s|4c394?5|5=i86:j4=5`0>2b<5=h:6?lm;|q7f1<72:q68n=51bc891d42;n:70:m4;0af>{t<hl1<7=t=5a1>2b<5=h:6:j4=5ce>7de3ty?n?4?:2y>0f4=9jk019l>:3f2?82e:38in6s|4c294?5|5=i:6<mn;<6bb?4c927?n=4=bc9~w06d290<w0;?d;0af>;2800:>85251;9572<5<:j6<<:;<73e?75<27><o4>249>15d=9;>0q~?j2;296~;5n?09no522gc9562<uz8=:7>52z?1a6<5jk16>h951268yxu0>>0;6?uQ7758926=??=0(8<9:3:0?xu0>o0;6?uQ77d8926=??l0(8<9:3;;?xu0=10;6?uQ74:8926=?<20(8<9:3cg?xu2l;0;6?uQ57`8926==?h0(8<9:0g1?xu2l90;6?uQ57c8926==?k0(8<9:0gb?xu2ko0;6?uQ57;8926==?30(8<9:0ga?xu2kl0;6?uQ57:8926==?20(8<9:0g`?xu1;=0;6?uQ5ba8926==ji0(8<9:0gg?xu1;:0;6?uQ5b`8926==jh0(8<9:0gf?xu1;;0;6?uQ5bc8926==jk0(8<9:0ge?xu1;80;6?uQ5b;8926==j30(8<9:0d3?xu1;90;6?uQ5b:8926==j20(8<9:0da?xu1:o0;6?uQ5b58926==j=0(8<9:325?xu1:l0;6?uQ5b48926==j<0(8<9:332?xu1:m0;6?uQ5b78926==j?0(8<9:33`?xu1:j0;6?uQ5b68926==j>0(8<9:304?xu1:k0;6?uQ5b18926==j90(8<9:311?xu1:00;6?uQ5b38926==j;0(8<9:31g?xu1:10;6?uQ5b28926==j:0(8<9:36;?xu1:>0;6?uQ5cd8926==kl0(8<9:370?xu1:?0;6?uQ5cg8926==ko0(8<9:37f?xu1:<0;6?uQ5cf8926==kn0(8<9:346?xu1:=0;6?uQ5ca8926==ki0(8<9:344?xu1::0;6?uQ5c`8926==kh0(8<9:34;?xu1:;0;6?uQ5cc8926==kk0(8<9:352?xu1:80;6?uQ5c;8926==k30(8<9:351?xu1:90;6?uQ5c:8926==k20(8<9:350?xu19l0;6?uQ5c48926==k<0(8<9:357?xu19m0;6?uQ5c78926==k?0(8<9:356?xu19j0;6?uQ5c68926==k>0(8<9:355?xu19k0;6?uQ5c18926==k90(8<9:354?xu19h0;6?uQ5c08926==k80(8<9:35;?xu1900;6?uQ5c38926==k;0(8<9:35:?xu1910;6?uQ5c28926==k:0(8<9:35b?xu19>0;6?uQ5`d8926==hl0(8<9:35a?xu19?0;6?uQ5`g8926==ho0(8<9:35`?xu19<0;6?uQ5`f8926==hn0(8<9:35g?xu19:0;6?uQ5``8926==hh0(8<9:35f?xu19;0;6?uQ5`c8926==hk0(8<9:35e?xu1980;6?uQ5`;8926==h30(8<9:3:3?xu1990;6?uQ5`:8926==h20(8<9:3:2?xu18o0;6?uQ5`58926==h=0(8<9:3:1?xu18l0;6?uQ5`48926==h<0(8<9:3:7?xu18m0;6?uQ5`78926==h?0(8<9:3:6?xu18j0;6?uQ5`68926==h>0(8<9:3:5?xu18k0;6?uQ5`18926==h90(8<9:3:4?xu18h0;6?uQ5`08926==h80(8<9:3:;?xu1810;6?uQ5`28926==h:0(8<9:3::?xu18>0;6?uQ58d8926==0l0(8<9:3:b?xu18?0;6?uQ58g8926==0o0(8<9:3:a?xu18<0;6?uQ58f8926==0n0(8<9:3:`?xu18=0;6?uQ58a8926==0i0(8<9:3:g?xu18:0;6?uQ58`8926==0h0(8<9:3:f?xu18;0;6?uQ58c8926==0k0(8<9:3:e?xu1880;6?uQ58;8926==030(8<9:3;3?xu1890;6?uQ58:8926==020(8<9:3;2?xu2no0;6?uQ5858926==0=0(8<9:3;1?xu2nm0;6?uQ5878926==0?0(8<9:3;0?xu2nj0;6?uQ5868926==0>0(8<9:3;7?xu2nk0;6?uQ5818926==090(8<9:3;6?xu2nh0;6?uQ5808926==080(8<9:3;5?xu2n00;6?uQ5838926==0;0(8<9:3;4?xu2n10;6?uQ5828926==0:0(8<9:3;:?xu2n>0;6?uQ59d8926==1l0(8<9:3;b?xu2n?0;6?uQ59g8926==1o0(8<9:3;a?xu2n<0;6?uQ59f8926==1n0(8<9:3;`?xu2n=0;6?uQ59a8926==1i0(8<9:3;g?xu2n;0;6?uQ59c8926==1k0(8<9:3;f?xu2n80;6?uQ59;8926==130(8<9:3;e?xu2n90;6?uQ59:8926==120(8<9:3c3?xu2mo0;6?uQ5958926==1=0(8<9:3c2?xu2ml0;6?uQ5948926==1<0(8<9:3c1?xu2mm0;6?uQ5978926==1?0(8<9:3c0?xu2mj0;6?uQ5968926==1>0(8<9:3c7?xu2mk0;6?uQ5918926==190(8<9:3c6?xu2mh0;6?uQ5908926==180(8<9:3c5?xu2m00;6?uQ5938926==1;0(8<9:3c4?xu2m>0;6?uQ56d8926==>l0(8<9:3c;?xu2m?0;6?uQ56g8926==>o0(8<9:3c:?xu2m<0;6?uQ56f8926==>n0(8<9:3cb?xu2m=0;6?uQ56a8926==>i0(8<9:3ca?xu2m:0;6?uQ56`8926==>h0(8<9:3c`?xu2m;0;6?uQ56c8926==>k0(8<9:3cf?xu2m80;6?uQ56;8926==>30(8<9:3ce?xu2m90;6?uQ56:8926==>20(8<9:3`3?xu2lo0;6?uQ5658926==>=0(8<9:3`2?xu2ll0;6?uQ5648926==><0(8<9:3`1?xu2lj0;6?uQ5668926==>>0(8<9:3`0?xu2lk0;6?uQ5618926==>90(8<9:3`7?xu2lh0;6?uQ5608926==>80(8<9:3`6?xu2l00;6?uQ5638926==>;0(8<9:3`5?xu2l10;6?uQ5628926==>:0(8<9:3`4?xu2l>0;6?uQ57d8926==?l0(8<9:0f;?xu2l?0;6?uQ57g8926==?o0(8<9:0f:?xu2l<0;6?uQ57f8926==?n0(8<9:0fb?xu2l=0;6?uQ57a8926==?i0(8<9:0fa?xu2l:0;6?uQ5758926==?=0(8<9:0f`?xu1;<0;6?uQ5b08926==j80(8<9:0fg?xu1:h0;6?uQ5c58926==k=0(8<9:0ff?xu19o0;6?uQ5`a8926==hi0(8<9:0fe?xu19=0;6?uQ5`38926==h;0(8<9:0g3?xu1800;6?uQ5848926==0<0(8<9:0g2?xu2nl0;6?uQ59`8926==1h0(8<9:0g0?xu2n:0;6?uQ5928926==1:0(8<9:0g7?xu2m10;6?uQ5678926==>?0(8<9:0g6?xu2lm0;6?uQ5748926==?<0(8<9:0g5?xu2km0;6?uQ5778926==??0(8<9:0g4?xu0080;6?uQ7938926=?1;0(8<9:0g;?xu0><0;6?uQ7778926=???0(8<9:0g:?xu1i:0;6?uQ62a8926=>:i0(8<9:0d2?xu1i80;6?uQ62`8926=>:h0(8<9:0d1?xu1i90;6?uQ62c8926=>:k0(8<9:0d0?xu11o0;6?uQ62;8926=>:30(8<9:0d7?xu08<0;6?uQ68f8926=>0n0(8<9:0d6?xu08=0;6?uQ68a8926=>0i0(8<9:0d5?xu08:0;6?uQ68`8926=>0h0(8<9:0d4?xu08;0;6?uQ68c8926=>0k0(8<9:0d;?xu0880;6?uQ68;8926=>030(8<9:0d:?xu0890;6?uQ68:8926=>020(8<9:0db?xu1no0;6?uQ6858926=>0=0(8<9:0d`?xu1nl0;6?uQ6848926=>0<0(8<9:0dg?xu1nm0;6?uQ6878926=>0?0(8<9:0df?xu1nj0;6?uQ6868926=>0>0(8<9:0de?xu1nh0;6?uQ6808926=>080(8<9:323?xu1n00;6?uQ6838926=>0;0(8<9:322?xu1n10;6?uQ6828926=>0:0(8<9:321?xu1n>0;6?uQ69d8926=>1l0(8<9:320?xu1n?0;6?uQ69g8926=>1o0(8<9:327?xu1n<0;6?uQ69f8926=>1n0(8<9:326?xu1n=0;6?uQ69a8926=>1i0(8<9:324?xu1n:0;6?uQ69`8926=>1h0(8<9:32;?xu1n;0;6?uQ69c8926=>1k0(8<9:32:?xu1n80;6?uQ69;8926=>130(8<9:32b?xu1mo0;6?uQ6958926=>1=0(8<9:32a?xu1ml0;6?uQ6948926=>1<0(8<9:32`?xu1mm0;6?uQ6978926=>1?0(8<9:32g?xu1mj0;6?uQ6968926=>1>0(8<9:32f?xu1mk0;6?uQ6918926=>190(8<9:32e?xu1mh0;6?uQ6908926=>180(8<9:333?xu1m00;6?uQ6938926=>1;0(8<9:331?xu1m10;6?uQ6928926=>1:0(8<9:330?xu1m>0;6?uQ66d8926=>>l0(8<9:337?xu1m?0;6?uQ66g8926=>>o0(8<9:336?xu1m=0;6?uQ66a8926=>>i0(8<9:335?xu1m:0;6?uQ66`8926=>>h0(8<9:334?xu1m;0;6?uQ66c8926=>>k0(8<9:33;?xu1m80;6?uQ66;8926=>>30(8<9:33:?xu1m90;6?uQ66:8926=>>20(8<9:33b?xu1lo0;6?uQ6658926=>>=0(8<9:33a?xu1ll0;6?uQ6648926=>><0(8<9:33g?xu1lm0;6?uQ6678926=>>?0(8<9:33f?xu1lj0;6?uQ6668926=>>>0(8<9:33e?xu1lk0;6?uQ6618926=>>90(8<9:303?xu1l00;6?uQ6638926=>>;0(8<9:302?xu1l10;6?uQ6628926=>>:0(8<9:301?xu1l>0;6?uQ67d8926=>?l0(8<9:300?xu1l?0;6?uQ67g8926=>?o0(8<9:307?xu1l<0;6?uQ67f8926=>?n0(8<9:306?xu1l=0;6?uQ67a8926=>?i0(8<9:305?xu1l:0;6?uQ67`8926=>?h0(8<9:30;?xu1l;0;6?uQ67c8926=>?k0(8<9:30:?xu1l80;6?uQ67;8926=>?30(8<9:30b?xu1l90;6?uQ67:8926=>?20(8<9:30a?xu1kl0;6?uQ6748926=>?<0(8<9:30`?xu1km0;6?uQ6778926=>??0(8<9:30g?xu1kj0;6?uQ6768926=>?>0(8<9:30f?xu1kk0;6?uQ6718926=>?90(8<9:30e?xu1kh0;6?uQ6708926=>?80(8<9:313?xu1k00;6?uQ6738926=>?;0(8<9:312?xu1k10;6?uQ6728926=>?:0(8<9:310?xu1k>0;6?uQ64d8926=><l0(8<9:317?xu1k?0;6?uQ64g8926=><o0(8<9:316?xu1k<0;6?uQ64f8926=><n0(8<9:315?xu1k:0;6?uQ64`8926=><h0(8<9:314?xu1k;0;6?uQ64c8926=><k0(8<9:31;?xu1k80;6?uQ64;8926=><30(8<9:31:?xu1k90;6?uQ64:8926=><20(8<9:31b?xu1jo0;6?uQ6458926=><=0(8<9:31a?xu1jl0;6?uQ6448926=><<0(8<9:31`?xu1jm0;6?uQ6478926=><?0(8<9:31f?xu1jj0;6?uQ6468926=><>0(8<9:31e?xu1jk0;6?uQ6418926=><90(8<9:363?xu1jh0;6?uQ6408926=><80(8<9:362?xu1j10;6?uQ6428926=><:0(8<9:361?xu1j>0;6?uQ65d8926=>=l0(8<9:360?xu1j?0;6?uQ65g8926=>=o0(8<9:367?xu1j<0;6?uQ65f8926=>=n0(8<9:366?xu1j=0;6?uQ65a8926=>=i0(8<9:365?xu1j:0;6?uQ65`8926=>=h0(8<9:364?xu1j;0;6?uQ65c8926=>=k0(8<9:36:?xu1j80;6?uQ65;8926=>=30(8<9:36b?xu1j90;6?uQ65:8926=>=20(8<9:36a?xu1io0;6?uQ6558926=>==0(8<9:36`?xu1im0;6?uQ6578926=>=?0(8<9:36g?xu1ij0;6?uQ6568926=>=>0(8<9:36f?xu1ik0;6?uQ6518926=>=90(8<9:36e?xu1ih0;6?uQ6508926=>=80(8<9:373?xu1i00;6?uQ6538926=>=;0(8<9:372?xu1i10;6?uQ6528926=>=:0(8<9:371?xu1i>0;6?uQ62d8926=>:l0(8<9:377?xu1i?0;6?uQ62g8926=>:o0(8<9:376?xu1i<0;6?uQ62f8926=>:n0(8<9:375?xu1i=0;6?uQ62:8926=>:20(8<9:374?xu08?0;6?uQ6818926=>090(8<9:37;?xu1nk0;6?uQ69:8926=>120(8<9:37:?xu1n90;6?uQ66f8926=>>n0(8<9:37b?xu1m<0;6?uQ6608926=>>80(8<9:37a?xu1lh0;6?uQ6758926=>?=0(8<9:37`?xu1ko0;6?uQ64a8926=><i0(8<9:37g?xu1k=0;6?uQ6438926=><;0(8<9:37e?xu1j00;6?uQ6548926=>=<0(8<9:343?xu1il0;6?uQ6258926=>:=0(8<9:342?xu11l0;6?uQ6248926=>:<0(8<9:341?xu08l0;6?uQ71g8926=?9o0(8<9:340?xu08j0;6?uQ71a8926=?9i0(8<9:347?xu0090;6?uQ7658926=?>=0(8<9:34:?xu0?l0;6?uQ7648926=?><0(8<9:34b?xu0?m0;6?uQ7678926=?>?0(8<9:34a?xu0?j0;6?uQ7668926=?>>0(8<9:34`?xu0?k0;6?uQ7618926=?>90(8<9:34g?xu0?h0;6?uQ7608926=?>80(8<9:34f?xu0?00;6?uQ7638926=?>;0(8<9:34e?xu0?10;6?uQ7628926=?>:0(8<9:353?x{ilki1<7<tH404?xhcjm0;6?uG5358ykbem3:1>vF:269~jada2909wE;=7:m`f6=838pD8<8;|lgg4<72;qC9?94}of`6?6=:rB>>:5rnea0>5<5sA?9;6sadb694?4|@<8<7p`kc483>7}O=;=0qcjl6;296~N2:>1vbim8:181M35?2wehn650;0xL0403tdoo44?:3yK171<ugnhm7>52zJ662=zfmii6=4={I713>{ilji1<7<tH404?xhckm0;6?uG5358ykbdm3:1>vF:269~jaea2909wE;=7:m`a6=838pD8<8;|lg`4<72;qC9?94}ofg6?6=:rB>>:5rnef0>5<5sA?9;6sade694?4|@<8<7p`kd483>7}O=;=0qcjk6;296~N2:>1vbij8:181M35?2wehi650;0xL0403tdoh44?:3yK171<ugnom7>52zJ662=zfmni6=4={I713>{ilmi1<7<tH404?xhclm0;6?uG5358ykbcm3:1>vF:269~jaba2909wE;=7:m``6=838pD8<8;|lga4<72;qC9?94}off6?6=:rB>>:5rneg0>5<5sA?9;6sadd694?4|@<8<7p`ke483>7}O=;=0qcjj6;296~N2:>1vbik8:181M35?2wehh650;0xL0403tdoi44?:3yK171<ugnnm7>52zJ662=zfmoi6=4={I713>{illi1<7<tH404?xhcmm0;6?uG5358ykbbm3:1>vF:269~jaca2909wE;=7:m`c6=838pD8<8;|lgb4<72;qC9?94}ofe6?6=:rB>>:5rned0>5<5sA?9;6sadg694?4|@<8<7p`kf483>7}O=;=0qcji6;296~N2:>1vbih8:181M35?2wehk650;0xL0403tdoj44?:3yK171<ugnmm7>52zJ662=zfmli6=4={I713>{iloi1<7<tH404?xhcnm0;6?uG5358ykbam3:1>vF:269~ja`a2909wE;=7:ma56=838pD8<8;|lf44<72;qC9?94}og36?6=:rB>>:5rnd20>5<5sA?9;6sae1694?4|@<8<7p`j0483>7}O=;=0qck?6;296~N2:>1vbh>8:181M35?2wei=650;0xL0403tdn<44?:3yK171<ugo;m7>52zJ662=zfl:i6=4={I713>{im9i1<7<tH404?xhb8m0;6?uG5358ykc7m3:1>vF:269~j`6a2909wE;=7:ma46=838pD8<8;|lf54<72;qC9?94}og26?6=:rB>>:5rnd30>5<5sA?9;6sae0694?4|@<8<7p`j1483>7}O=;=0qck>6;296~N2:>1vbh?8:181M35?2wei<650;0xL0403tdn=44?:3yK171<ugo:m7>52zJ662=zfl;i6=4={I713>{im8i1<7<tH404?xhb9m0;6?uG5358ykc6m3:1>vF:269~j`7a2909wE;=7:ma76=838pD8<8;|lf64<72;qC9?94}og16?6=:rB>>:5rnd00>5<5sA?9;6sae3694?4|@<8<7p`j2483>7}O=;=0qck=6;296~N2:>1vbh<8:181M35?2wei?650;0xL0403tdn>44?:3yK171<ugo9m7>52zJ662=zfl8i6=4={I713>{im;i1<7<tH404?xhb:m0;6?uG5358ykc5m3:1>vF:269~j`4a2909wE;=7:ma66=838pD8<8;|lf74<72;qC9?94}og06?6=:rB>>:5rnd10>5<5sA?9;6sae2694?4|@<8<7p`j3483>7}O=;=0qck<6;296~N2:>1vbh=8:181M35?2wei>650;0xL0403tdn?44?:3yK171<ugo8m7>52zJ662=zfl9i6=4={I713>{im:i1<7<tH404?xhb;m0;6?uG5358ykc4m3:1>vF:269~j`5a2909wE;=7:ma16=838pD8<8;|lf04<72;qC9?94}og76?6=:rB>>:5rnd60>5<5sA?9;6sae5694?4|@<8<7p`j4483>7}O=;=0qck;6;296~N2:>1vbh:8:181M35?2wei9650;0xL0403tdn844?:3yK171<ugo?m7>52zJ662=zfl>i6=4={I713>{im=i1<7<tH404?xhb<m0;6?uG5358ykc3m3:1>vF:269~j`2a2909wE;=7:ma06=838pD8<8;|lf14<72;qC9?94}og66?6=:rB>>:5rnd70>5<5sA?9;6sae4694?4|@<8<7p`j5483>7}O=;=0qck:6;296~N2:>1vbh;8:181M35?2wei8650;0xL0403tdn944?:3yK171<ugo>m7>52zJ662=zfl?i6=4={I713>{im<i1<7<tH404?xhb=m0;6?uG5358ykc2m3:1>vF:269~j`3a2909wE;=7:ma36=838pD8<8;|lf24<72;qC9?94}og56?6=:rB>>:5rnd40>5<5sA?9;6sae7694?4|@<8<7p`j6483>7}O=;=0qck96;296~N2:>1vbh88:181M35?2wei;650;0xL0403tdn:44?:3yK171<ugo=m7>52zJ662=zfl<i6=4={I713>{im?i1<7<tH404?xhb>m0;6?uG5358ykc1m3:1>vF:269~j`0a2909wE;=7:ma26=838pD8<8;|lf34<72;qC9?94}og46?6=:rB>>:5rnd50>5<5sA?9;6sae6694?4|@<8<7p`j7483>7}O=;=0qck86;296~N2:>1vbh98:181M35?2wei:650;0xL0403tdn;44?:3yK171<ugo<m7>52zJ662=zfl=i6=4={I713>{im>i1<7<tH404?xhb?m0;6?uG5358ykc0m3:1>vF:269~j`1a2909wE;=7:ma=6=838pD8<8;|lf<4<72;qC9?94}og;6?6=:rB>>:5rnd:0>5<5sA?9;6sae9694?4|@<8<7p`j8483>7}O=;=0qck76;296~N2:>1vbh68:181M35?2wei5650;0xL0403tdn444?:3yK171<ugo3m7>52zJ662=zfl2i6=4={I713>{im1i1<7<tH404?xhb0m0;6?uG5358ykc?m3:1>vF:269~j`>a2909wE;=7:ma<6=838pD8<8;|lf=4<72;qC9?94}og:6?6=:rB>>:5rnd;0>5<5sA?9;6sae8694?4|@<8<7p`j9483>7}O=;=0qck66;296~N2:>1vbh78:181M35?2wei4650;0xL0403tdn544?:3yK171<ugo2m7>52zJ662=zfk3m6=4>{I713>{ik>o1<7?tH404?xhd?o0;6<uG5358yke?83:1=vF:269~jf>6290:wE;=7:mg=4=83;pD8<8;|l`<6<728qC9?94}oa;0?6=9rB>>:5rnb:6>5<6sA?9;6sac9494?7|@<8<7p`l8683>4}O=;=0qcm78;295~N2:>1vbn66:182M35?2weo5o50;3xL0403tdh4o4?:0yK171<ugi3o7>51zJ662=zfj2o6=4>{I713>{ik1o1<7?tH404?xhd0o0;6<uG5358yke>83:1=vF:269~jf?6290:wE;=7:mg<4=83;pD8<8;|l`=6<728qC9?94}oa:0?6=9rB>>:5rnb;6>5<6sA?9;6sac8494?7|@<8<7p`l9683>4}O=;=0qcm68;295~N2:>1vbn76:182M35?2weo4o50;3xL0403tdh5o4?:0yK171<ugi2o7>51zJ662=zfj3o6=4>{I713>{ik0o1<7?tH404?xhd1o0;6<uG5358ykef83:1=vF:269~jfg6290:wE;=7:mgd4=83;pD8<8;|l`e6<728qC9?94}oab0?6=9rB>>:5rnbc6>5<6sA?9;6sac`494?7|@<8<7p`la683>4}O=;=0qcmn8;295~N2:>1vbno6:182M35?2weolo50;3xL0403tdhmo4?:0yK171<ugijo7>51zJ662=zfjko6=4>{I713>{ikho1<7?tH404?xhdio0;6<uG5358ykee83:1=vF:269~jfd6290:wE;=7:mgg4=83;pD8<8;|l`f6<728qC9?94}oaa0?6=9rB>>:5rnb`6>5<6sA?9;6sacc494?7|@<8<7p`lb683>4}O=;=0qcmm8;295~N2:>1vbnl6:182M35?2weooo50;3xL0403tdhno4?:0yK171<ugiio7>51zJ662=zfjho6=4>{I713>{ikko1<7?tH404?xhdjo0;6<uG5358yked83:1=vF:269~jfe6290:wE;=7:mgf4=83;pD8<8;|l`g6<728qC9?94}oa`0?6=9rB>>:5rnba6>5<6sA?9;6sacb494?7|@<8<7p`lc683>4}O=;=0qcml8;295~N2:>1vbnm6:182M35?2weono50;3xL0403tdhoo4?:0yK171<ugiho7>51zJ662=zfjio6=4>{I713>{ikjo1<7?tH404?xhdko0;6<uG5358ykec83:1=vF:269~jfb6290:wE;=7:mga4=83;pD8<8;|l``6<728qC9?94}oag0?6=9rB>>:5rnbf6>5<6sA?9;6sace494?7|@<8<7p`ld683>4}O=;=0qcmk8;295~N2:>1vbnj6:182M35?2weoio50;3xL0403tdhho4?:0yK171<ugioo7>51zJ662=zfjno6=4>{I713>{ikmo1<7?tH404?xhdlo0;6<uG5358ykeb83:1=vF:269~jfc6290:wE;=7:mg`4=83;pD8<8;|l`a6<728qC9?94}oaf0?6=9rB>>:5rnbg6>5<6sA?9;6sacd494?7|@<8<7p`le683>4}O=;=0qcmj8;295~N2:>1vbnk6:182M35?2weoho50;3xL0403tdhio4?:0yK171<ugino7>51zJ662=zfjoo6=4>{I713>{iklo1<7?tH404?xhdmo0;6<uG5358ykea83:1=vF:269~jf`6290:wE;=7:mgc4=83;pD8<8;|l`b6<728qC9?94}oae0?6=9rB>>:5rnbd6>5<6sA?9;6sacg494?7|@<8<7p`lf683>4}O=;=0qcmi8;295~N2:>1vbnh6:182M35?2weoko50;3xL0403tdhjo4?:0yK171<ugimo7>51zJ662=zfjlo6=4>{I713>{ikoo1<7?tH404?xhdno0;6<uG5358ykb783:1=vF:269~ja66290:wE;=7:m`54=83;pD8<8;|lg46<728qC9?94}of30?6=9rB>>:5rne26>5<6sA?9;6sad1494?7|@<8<7p`k0683>4}O=;=0qcj?8;295~N2:>1vbi>6:182M35?2weh=o50;3xL0403tdo<o4?:0yK171<ugn;o7>51zJ662=zfm:o6=4>{I713>{il9o1<7?tH404?xhc8o0;6<uG5358ykb683:1=vF:269~ja76290:wE;=7:m`44=83;pD8<8;|lg56<728qC9?94}of20?6=9rB>>:5rne36>5<6sA?9;6sad0494?7|@<8<7p`k1683>4}O=;=0qcj>8;295~N2:>1vbi?6:182M35?2weh<o50;3xL0403tdo=o4?:0yK171<ugn:o7>51zJ662=zfm;o6=4>{I713>{il8o1<7?tH404?xhc9o0;6<uG5358ykb583:1=vF:269~ja46290:wE;=7:m`74=83;pD8<8;|lg66<728qC9?94}of10?6=9rB>>:5rne06>5<6sA?9;6sad3494?7|@<8<7p`k2683>4}O=;=0qcj=8;295~N2:>1vbi<6:182M35?2weh?o50;3xL0403tdo>o4?:0yK171<ugn9o7>51zJ662=zfm8o6=4>{I713>{il;o1<7?tH404?xhc:o0;6<uG5358ykb483:1=vF:269~ja56290:wE;=7:m`64=83;pD8<8;|lg76<728qC9?94}of00?6=9rB>>:5rne16>5<6sA?9;6sad2494?7|@<8<7p`k3683>4}O=;=0qcj<8;295~N2:>1vbi=6:182M35?2weh>o50;3xL0403tdo?o4?:0yK171<ugn8o7>51zJ662=zfm9o6=4>{I713>{il:o1<7?tH404?xhc;o0;6<uG5358ykb383:1=vF:269~ja26290:wE;=7:m`14=83;pD8<8;|lg06<728qC9?94}of70?6=9rB>>:5rne66>5<6sA?9;6sad5494?7|@<8<7p`k4683>4}O=;=0qcj;8;295~N2:>1vbi:6:182M35?2weh9o50;3xL0403tdo8o4?:0yK171<ugn?o7>51zJ662=zfm>o6=4>{I713>{il=o1<7?tH404?xhc<o0;6<uG5358ykb283:1=vF:269~ja36290:wE;=7:m`04=83;pD8<8;|lg16<728qC9?94}of60?6=9rB>>:5rne76>5<6sA?9;6sad4494?7|@<8<7p`k5683>4}O=;=0qcj:8;295~N2:>1vbi;6:182M35?2weh8o50;3xL0403tdo9o4?:0yK171<ugn>o7>51zJ662=zfm?o6=4>{I713>{il<o1<7?tH404?xhc=o0;6<uG5358ykb183:1=vF:269~ja06290:wE;=7:m`34=83;pD8<8;|lg26<728qC9?94}of50?6=9rB>>:5rne46>5<6sA?9;6sad7494?7|@<8<7p`k6683>4}O=;=0qcj98;295~N2:>1vbi86:182M35?2weh;o50;3xL0403tdo:o4?:0yK171<ugn=o7>51zJ662=zfm<o6=4>{I713>{il?o1<7?tH404?xhc>o0;6<uG5358ykb083:1=vF:269~ja16290:wE;=7:m`24=83;pD8<8;|lg36<728qC9?94}of40?6=9rB>>:5rne56>5<6sA?9;6sad6494?7|@<8<7p`k7683>4}O=;=0qcj88;295~N2:>1vbi96:182M35?2weh:o50;3xL0403tdo;o4?:0yK171<ugn<o7>51zJ662=zfm=o6=4>{I713>{il>o1<7?tH404?xhc?o0;6<uG5358ykb?83:1=vF:269~ja>6290:wE;=7:m`=4=83;pD8<8;|lg<6<728qC9?94}of;0?6=9rB>>:5rne:6>5<6sA?9;6sad9494?7|@<8<7p`k8683>4}O=;=0qcj78;295~N2:>1vbi66:182M35?2weh5o50;3xL0403tdo4o4?:0yK171<ugn3o7>51zJ662=zfm2o6=4>{I713>{il1o1<7?tH404?xhc0o0;6<uG5358ykb>83:1=vF:269~ja?6290:wE;=7:m`<4=83;pD8<8;|lg=6<728qC9?94}of:0?6=9rB>>:5rne;6>5<6sA?9;6sad8494?7|@<8<7p`k9683>4}O=;=0qcj68;295~N2:>1vbi76:182M35?2weh4o50;3xL0403tdo5o4?:0yK171<ugn2o7>51zJ662=zfm3o6=4>{I713>{il0o1<7?tH404?xhc1o0;6<uG5358ykbf83:1=vF:269~jag6290:wE;=7:m`d4=83;pD8<8;|lge6<728qC9?94}ofb0?6=9rB>>:5rnec6>5<6sA?9;6sad`494?7|@<8<7p`ka683>4}O=;=0qcjn8;295~N2:>1vbio6:182M35?2wehlo50;3xL0403tdomo4?:0yK171<ugnjo7>51zJ662=zfmko6=4>{I713>{ilho1<7?tH404?xhcio0;6<uG5358ykbe83:1=vF:269~jad6290:wE;=7:m`g4=83;pD8<8;|lgf6<728qC9?94}ofa0?6=9rB>>:5rne`6>5<6sA?9;6sadc494?7|@<8<7p`kb683>4}O=;=0qcjm8;295~N2:>1vbil6:182M35?2wehoo50;3xL0403tdono4?:0yK171<utwvLMMt11`:>217i>3j4pNOBz2~DEV|uIJ
Index: trunk/synplicity/rev_1/run_xise.tcl
===================================================================
--- trunk/synplicity/rev_1/run_xise.tcl	(revision 9)
+++ trunk/synplicity/rev_1/run_xise.tcl	(revision 10)
@@ -18,9 +18,6 @@
 project set speed $SpeedGrade
 
+xfile add $EdifFile
 xfile add W1.ucf
-#xfile add $EdifFile
-#if {[file exists synplicity.ucf]} {
-#    xfile add synplicity.ucf
-#}
 
 project set "Netlist Translation Type" "Timestamp"
@@ -34,8 +31,10 @@
 file delete -force $DesignName\_xdb
 
-project open $DesignName.ise
+project open $DesignName.xise
 
 process run "Implement Design" -force rerun_all
 
+process run "Generate Programming File"
+
 project close
 
Index: trunk/WB2ALTDDR3/dram_wb.v
===================================================================
--- trunk/WB2ALTDDR3/dram_wb.v	(revision 6)
+++ trunk/WB2ALTDDR3/dram_wb.v	(revision 10)
@@ -45,5 +45,5 @@
    inout             ddr3_ck,
    inout             ddr3_ck_n,
-   output            ddr3_reset,
+   //output            ddr3_reset,
    output     [12:0] ddr3_a,
    output     [ 2:0] ddr3_ba,
@@ -96,6 +96,6 @@
 	 .clk0_tb(),
 	 .idly_clk_200(clk200),
-	 
-    .rst0_tb(ddr3_reset),
+	 //.rst0_tb(ddr3_reset),
+    
     .ddr2_dqs(ddr3_dqs),
     .ddr2_dqs_n(ddr3_dqs_n),
Index: trunk/sim/ddr2_model.v
===================================================================
--- trunk/sim/ddr2_model.v	(revision 10)
+++ trunk/sim/ddr2_model.v	(revision 10)
@@ -0,0 +1,2031 @@
+/****************************************************************************************
+*
+*    File Name:  ddr2_model.v
+*      Version:  5.82
+*        Model:  BUS Functional
+*
+* Dependencies:  ddr2_model_parameters.vh
+*
+*  Description:  Micron SDRAM DDR2 (Double Data Rate 2)
+*
+*   Limitation:  - doesn't check for average refresh timings
+*                - positive ck and ck_n edges are used to form internal clock
+*                - positive dqs and dqs_n edges are used to latch data
+*                - test mode is not modeled
+*
+*         Note:  - Set simulator resolution to "ps" accuracy
+*                - Set Debug = 0 to disable $display messages
+*
+*   Disclaimer   This software code and all associated documentation, comments or other 
+*  of Warranty:  information (collectively "Software") is provided "AS IS" without 
+*                warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY 
+*                DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
+*                TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES 
+*                OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT 
+*                WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE 
+*                OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. 
+*                FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR 
+*                THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, 
+*                ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE 
+*                OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, 
+*                ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, 
+*                INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, 
+*                WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, 
+*                OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE 
+*                THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 
+*                DAMAGES. Because some jurisdictions prohibit the exclusion or 
+*                limitation of liability for consequential or incidental damages, the 
+*                above limitation may not apply to you.
+*
+*                Copyright 2003 Micron Technology, Inc. All rights reserved.
+*
+* Rev   Author   Date        Changes
+* ---------------------------------------------------------------------------------------
+* 1.00  JMK      07/29/03    Initial Release
+* 1.10  JMK      08/09/03    Timing Parameter updates to tIS, tIH, tDS, tDH
+* 2.20  JMK      08/07/03    General cleanup
+* 2.30  JMK      11/26/03    Added CL_MIN, CL_MAX, wl_min and wl_max parameters.
+*                            Added AL_MIN and AL_MAX parameters.
+*                            Removed support for OCD.
+* 2.40  JMK      01/15/04    Removed verilog 2001 constructs.
+* 2.50  JMK      01/29/04    Removed tRP checks during Precharge command.
+* 2.60  JMK      04/20/04    Fixed tWTR check.
+* 2.70  JMK      04/30/04    Added tRFC maximum check.
+*                            Combined Self Refresh and Power Down always blocks.
+*                            Added Reset Function (CKE LOW Anytime).
+* 2.80  JMK      08/19/04    Precharge is treated as NOP when bank is not active.  
+*                            Added checks for tRAS, tWR, tRTP to any bank during Pre-All.
+*                            tRFC maximum violation will only display one time.
+* 2.90  JMK      11/05/04    Fixed DQS checking during write.
+*                            Fixed false tRFC max assertion during power up and self ref.
+*                            Added warning for 200us CKE low time during initialization.
+*                            Added -3, -3E, and -37V speed grades to ddr2_parameters.v
+* 3.00  JMK      04/22/05    Removed ODT off requirement during power down.
+*                            Added tAOND, tAOFD, tANPD, tAXPD, tAONPD, and tAOFPD parameters.
+*                            Added ODT status messages.
+*                            Updated the initialization sequence.
+*                            Disable ODT and CLK pins during self refresh.
+*                            Disable cmd and addr pins during power down and self refresh.
+* 3.10  JMK      06/07/05    Disable trpa checking if the part does not have 8 banks.
+*                            Changed tAXPD message from error to a warning.
+*                            Added tDSS checking.
+*                            Removed tDQSL checking during tWPRE and tWPST.
+*                            Fixed a burst order error during writes.
+*                            Renamed parameters file with .vh extension.
+* 3.20  JMK      07/18/05    Removed 14 tCK requirement from LMR to READ.
+* 3.30  JMK      08/03/05    Added check for interrupting a burst with auto precharge.
+* 4.00  JMK      11/21/05    Parameter names all UPPERCASE, signal names all lowercase.
+*                            Clock jitter can be tolerated within specification range.
+*                            Clock frequency is sampled from the CK pin.
+*                            Scaleable up to 64 DQ and 16 DQS bits.
+*                            Read data can be randomly skewed using RANDOM_OUT_DELAY.
+*                            Parameterized read and write DQS, and read DQ.
+*                            Initialization can be bypassed using initialize task.
+* 4.10  JMK      11/30/05    Fixed compile errors when `MAX_MEM was defined.
+* 4.20  JMK      12/09/05    Fixed memory addressing error when `MAX_MEM was defined.
+* 4.30  JMK      02/15/06    Added dummy write to initialization sequence.
+*                            Removed tWPST maximum checking.
+*                            Rising dqs_n edge latches data when enabled in EMR.
+*                            Fixed a sign error in the tJIT(cc) calculation.
+* 4.40  JMK      02/16/06    Fixed dummy write when`MAX_MEM was defined.
+* 4.50  JMK      02/27/06    Fixed extra tDQSS assertions.
+*                            Fixed tRCD and tWTR checking.
+*                            Errors entering Power Down or Self Refresh will cause reset.
+*                            Ignore dqs_n when disabled in EMR.
+* 5.00  JMK      04/24/06    Test stimulus now included from external file (subtest.vh)
+*                            Fixed tRFC max assertion during self refresh.
+*                            Fixed tANPD checking during Power Down.
+*                            Removed dummy write from initialization sequence.
+* 5.01  JMK      04/28/06    Fixed Auto Precharge to Load Mode, Refresh and Self Refresh.
+*                            Removed Auto Precharge error message during Power Down Enter.
+* 5.10  JMK      07/26/06    Created internal clock using ck and ck_n.
+*                            RDQS can only be enabled in EMR for x8 configurations.
+*                            CAS latency is checked vs frequency when DLL locks.
+*                            tMOD changed from tCK units to ns units.
+*                            Added 50 Ohm setting for Rtt in EMR.
+*                            Improved checking of DQS during writes.
+* 5.20  JMK      10/02/06    Fixed DQS checking for interrupting write to write and x16.
+* 5.30  JMK      05/25/07    Fixed checking for 0-Z transition on write postamble.
+* 5.50  JMK      05/30/08    Renamed ddr2_dimm.v to ddr2_module.v and added SODIMM support.
+*                            Added a register delay to ddr2_module.v when RDIMM is defined.
+*                            Added multi-chip package model support in ddr2_mcp.v
+*                            Added High Temp Self Refresh rate setting in EMRS2[7]
+* 5.70  JMK      04/23/09    Updated tRPA definition
+*                            Increased internal width to 72 bit DQ bus
+* 5.80  SPH      08/12/09    Fixed tRAS maximum violation (only check if bank still open)
+* 5.81  SPH      12/08/09    Only check tIH for cmd_addr if CS# LOW
+* 5.82  SPH      04/08/10    Correct debug message for SRT in EMR2         
+* 5.81  SPH      12/08/09    Only check tIH for cmd_addr if CS# LOW
+* 5.81  SPH      12/08/09    Only check tIH for cmd_addr if CS# LOW
+****************************************************************************************/
+
+// DO NOT CHANGE THE TIMESCALE
+// MAKE SURE YOUR SIMULATOR USES "PS" RESOLUTION
+`timescale 1ps / 1ps
+
+module ddr2_model (
+    ck,
+    ck_n,
+    cke,
+    cs_n,
+    ras_n,
+    cas_n,
+    we_n,
+    dm_rdqs,
+    ba,
+    addr,
+    dq,
+    dqs,
+    dqs_n,
+    rdqs_n,
+    odt
+);
+
+    `include "ddr2_model_parameters.vh"
+
+    // text macros
+    `define DQ_PER_DQS DQ_BITS/DQS_BITS
+    `define BANKS      (1<<BA_BITS)
+    `define MAX_BITS   (BA_BITS+ROW_BITS+COL_BITS-BL_BITS)
+    `define MAX_SIZE   (1<<(BA_BITS+ROW_BITS+COL_BITS-BL_BITS))
+    `define MEM_SIZE   (1<<MEM_BITS)
+    `define MAX_PIPE   2*(AL_MAX + CL_MAX)
+
+    // Declare Ports
+    input   ck;
+    input   ck_n;
+    input   cke;
+    input   cs_n;
+    input   ras_n;
+    input   cas_n;
+    input   we_n;
+    inout   [DM_BITS-1:0]   dm_rdqs;
+    input   [BA_BITS-1:0]   ba;
+    input   [ADDR_BITS-1:0] addr;
+    inout   [DQ_BITS-1:0]   dq;
+    inout   [DQS_BITS-1:0]  dqs;
+    inout   [DQS_BITS-1:0]  dqs_n;
+    output  [DQS_BITS-1:0]  rdqs_n;
+    input   odt;
+                            
+    // clock jitter
+    real    tck_avg;
+    time    tck_sample [TDLLK-1:0];
+    time    tch_sample [TDLLK-1:0];
+    time    tcl_sample [TDLLK-1:0];
+    time    tck_i;
+    time    tch_i;
+    time    tcl_i;
+    real    tch_avg;
+    real    tcl_avg;
+    time    tm_ck_pos;
+    time    tm_ck_neg;
+    real    tjit_per_rtime;
+    integer tjit_cc_time;
+    real    terr_nper_rtime;
+
+    // clock skew
+    real    out_delay;
+    integer dqsck [DQS_BITS-1:0];
+    integer dqsck_min;
+    integer dqsck_max;
+    integer dqsq_min;
+    integer dqsq_max;
+    integer seed;
+
+    // Mode Registers
+    reg     burst_order;
+    reg     [BL_BITS:0] burst_length;
+    integer cas_latency;
+    integer additive_latency;
+    reg     dll_reset;
+    reg     dll_locked;
+    reg     dll_en;
+    integer write_recovery;
+    reg     low_power;
+    reg     [1:0] odt_rtt;
+    reg     odt_en;
+    reg     [2:0] ocd;
+    reg     dqs_n_en;
+    reg     rdqs_en;
+    reg     out_en;
+    integer read_latency;
+    integer write_latency;
+
+    // cmd encoding
+    parameter
+        LOAD_MODE = 4'b0000,
+        REFRESH   = 4'b0001,
+        PRECHARGE = 4'b0010,
+        ACTIVATE  = 4'b0011,
+        WRITE     = 4'b0100,
+        READ      = 4'b0101,
+        NOP       = 4'b0111,
+        PWR_DOWN  = 4'b1000,
+        SELF_REF  = 4'b1001
+    ;
+
+    reg [8*9-1:0] cmd_string [9:0];
+    initial begin
+        cmd_string[LOAD_MODE] = "Load Mode";
+        cmd_string[REFRESH  ] = "Refresh  ";
+        cmd_string[PRECHARGE] = "Precharge";
+        cmd_string[ACTIVATE ] = "Activate ";
+        cmd_string[WRITE    ] = "Write    ";
+        cmd_string[READ     ] = "Read     ";
+        cmd_string[NOP      ] = "No Op    ";
+        cmd_string[PWR_DOWN ] = "Pwr Down ";
+        cmd_string[SELF_REF ] = "Self Ref ";
+    end
+
+    // command state
+    reg     [`BANKS-1:0] active_bank;
+    reg     [`BANKS-1:0] auto_precharge_bank;
+    reg     [`BANKS-1:0] write_precharge_bank;
+    reg     [`BANKS-1:0] read_precharge_bank;
+    reg     [ROW_BITS-1:0] active_row [`BANKS-1:0];
+    reg     in_power_down;
+    reg     in_self_refresh;
+    reg     [3:0] init_mode_reg;
+    reg     init_done;
+    integer init_step;
+    reg     er_trfc_max;
+    reg     odt_state;
+    reg     prev_odt;
+
+    // cmd timers/counters
+    integer ref_cntr;
+    integer ck_cntr;
+    integer ck_load_mode;
+    integer ck_write;
+    integer ck_read;
+    integer ck_write_ap;
+    integer ck_power_down;
+    integer ck_slow_exit_pd;
+    integer ck_self_refresh;
+    integer ck_cke;
+    integer ck_odt;
+    integer ck_dll_reset;
+    integer ck_bank_write     [`BANKS-1:0];
+    integer ck_bank_read      [`BANKS-1:0];
+    time    tm_refresh;
+    time    tm_precharge;
+    time    tm_precharge_all;
+    time    tm_activate;
+    time    tm_write_end;
+    time    tm_self_refresh;
+    time    tm_odt_en;
+    time    tm_bank_precharge [`BANKS-1:0];
+    time    tm_bank_activate  [`BANKS-1:0];
+    time    tm_bank_write_end [`BANKS-1:0];
+    time    tm_bank_read_end  [`BANKS-1:0];
+
+    // pipelines
+    reg     [`MAX_PIPE:0]   al_pipeline;
+    reg     [`MAX_PIPE:0]   wr_pipeline;
+    reg     [`MAX_PIPE:0]   rd_pipeline;
+    reg     [`MAX_PIPE:0]   odt_pipeline;
+    reg     [BA_BITS-1:0]   ba_pipeline  [`MAX_PIPE:0];
+    reg     [ROW_BITS-1:0]  row_pipeline [`MAX_PIPE:0];
+    reg     [COL_BITS-1:0]  col_pipeline [`MAX_PIPE:0];
+    reg     prev_cke;
+    
+    // data state
+    reg     [BL_MAX*DQ_BITS-1:0] memory_data;
+    reg     [BL_MAX*DQ_BITS-1:0] bit_mask;
+    reg     [BL_BITS-1:0]        burst_position;
+    reg     [BL_BITS:0]          burst_cntr;
+    reg     [DQ_BITS-1:0]        dq_temp;
+    reg     [35:0] check_write_postamble;
+    reg     [35:0] check_write_preamble;
+    reg     [35:0] check_write_dqs_high;
+    reg     [35:0] check_write_dqs_low;
+    reg     [17:0] check_dm_tdipw;
+    reg     [71:0] check_dq_tdipw;
+
+    // data timers/counters
+    time    tm_cke;
+    time    tm_odt;
+    time    tm_tdqss;
+    time    tm_dm        [17:0];
+    time    tm_dqs       [17:0];
+    time    tm_dqs_pos   [35:0];
+    time    tm_dqss_pos  [35:0];
+    time    tm_dqs_neg   [35:0];
+    time    tm_dq        [71:0];
+    time    tm_cmd_addr  [22:0];
+    reg [8*7-1:0] cmd_addr_string [22:0];
+    initial begin
+        cmd_addr_string[ 0] = "CS_N   ";
+        cmd_addr_string[ 1] = "RAS_N  ";
+        cmd_addr_string[ 2] = "CAS_N  ";
+        cmd_addr_string[ 3] = "WE_N   ";
+        cmd_addr_string[ 4] = "BA 0   ";
+        cmd_addr_string[ 5] = "BA 1   ";
+        cmd_addr_string[ 6] = "BA 2   ";
+        cmd_addr_string[ 7] = "ADDR  0";
+        cmd_addr_string[ 8] = "ADDR  1";
+        cmd_addr_string[ 9] = "ADDR  2";
+        cmd_addr_string[10] = "ADDR  3";
+        cmd_addr_string[11] = "ADDR  4";
+        cmd_addr_string[12] = "ADDR  5";
+        cmd_addr_string[13] = "ADDR  6";
+        cmd_addr_string[14] = "ADDR  7";
+        cmd_addr_string[15] = "ADDR  8";
+        cmd_addr_string[16] = "ADDR  9";
+        cmd_addr_string[17] = "ADDR 10";
+        cmd_addr_string[18] = "ADDR 11";
+        cmd_addr_string[19] = "ADDR 12";
+        cmd_addr_string[20] = "ADDR 13";
+        cmd_addr_string[21] = "ADDR 14";
+        cmd_addr_string[22] = "ADDR 15";
+    end
+
+    reg [8*5-1:0] dqs_string [1:0];
+    initial begin
+        dqs_string[0] = "DQS  ";
+        dqs_string[1] = "DQS_N";
+    end
+
+    // Memory Storage
+`ifdef MAX_MEM
+    reg     [BL_MAX*DQ_BITS-1:0] memory  [0:`MAX_SIZE-1];
+`else
+    reg     [BL_MAX*DQ_BITS-1:0] memory  [0:`MEM_SIZE-1];
+    reg     [`MAX_BITS-1:0]      address [0:`MEM_SIZE-1];
+    reg     [MEM_BITS:0]         memory_index;
+    reg     [MEM_BITS:0]         memory_used;
+`endif
+
+    // receive
+    reg            ck_in;
+    reg            ck_n_in;
+    reg            cke_in;
+    reg            cs_n_in;
+    reg            ras_n_in;
+    reg            cas_n_in;
+    reg            we_n_in;
+    reg     [17:0] dm_in;
+    reg     [2:0]  ba_in;
+    reg     [15:0] addr_in;
+    reg     [71:0] dq_in;
+    reg     [35:0] dqs_in;
+    reg            odt_in;
+
+    reg     [17:0] dm_in_pos;
+    reg     [17:0] dm_in_neg;
+    reg     [71:0] dq_in_pos;
+    reg     [71:0] dq_in_neg;
+    reg            dq_in_valid;
+    reg            dqs_in_valid;
+    integer        wdqs_cntr;
+    integer        wdq_cntr;
+    integer        wdqs_pos_cntr [35:0];
+    reg            b2b_write;
+    reg     [35:0] prev_dqs_in;
+    reg            diff_ck;
+
+    always @(ck     ) ck_in     <= #BUS_DELAY ck;
+    always @(ck_n   ) ck_n_in   <= #BUS_DELAY ck_n;
+    always @(cke    ) cke_in    <= #BUS_DELAY cke;
+    always @(cs_n   ) cs_n_in   <= #BUS_DELAY cs_n;
+    always @(ras_n  ) ras_n_in  <= #BUS_DELAY ras_n;
+    always @(cas_n  ) cas_n_in  <= #BUS_DELAY cas_n;
+    always @(we_n   ) we_n_in   <= #BUS_DELAY we_n;
+    always @(dm_rdqs) dm_in     <= #BUS_DELAY dm_rdqs;
+    always @(ba     ) ba_in     <= #BUS_DELAY ba;
+    always @(addr   ) addr_in   <= #BUS_DELAY addr;
+    always @(dq     ) dq_in     <= #BUS_DELAY dq;
+    always @(dqs or dqs_n) dqs_in <= #BUS_DELAY (dqs_n<<18) | dqs;
+    always @(odt    ) odt_in    <= #BUS_DELAY odt;
+    // create internal clock
+    always @(posedge ck_in)   diff_ck <= ck_in;
+    always @(posedge ck_n_in) diff_ck <= ~ck_n_in;
+
+    wire    [17:0] dqs_even = dqs_in[17:0];
+    wire    [17:0] dqs_odd  = dqs_n_en ? dqs_in[35:18] : ~dqs_in[17:0];
+    wire    [3:0]  cmd_n_in = !cs_n_in ? {ras_n_in, cas_n_in, we_n_in} : NOP;  //deselect = nop 
+
+    // transmit
+    reg                    dqs_out_en;
+    reg     [DQS_BITS-1:0] dqs_out_en_dly;
+    reg                    dqs_out;
+    reg     [DQS_BITS-1:0] dqs_out_dly;
+    reg                    dq_out_en;
+    reg     [DQ_BITS-1:0]  dq_out_en_dly;
+    reg     [DQ_BITS-1:0]  dq_out;
+    reg     [DQ_BITS-1:0]  dq_out_dly;
+    integer                rdqsen_cntr;
+    integer                rdqs_cntr;
+    integer                rdqen_cntr;
+    integer                rdq_cntr;
+
+    bufif1 buf_dqs    [DQS_BITS-1:0] (dqs,     dqs_out_dly,  dqs_out_en_dly & {DQS_BITS{out_en}});
+    bufif1 buf_dm     [DM_BITS-1:0]  (dm_rdqs, dqs_out_dly,  dqs_out_en_dly & {DM_BITS {out_en}} & {DM_BITS{rdqs_en}});
+    bufif1 buf_dqs_n  [DQS_BITS-1:0] (dqs_n,   ~dqs_out_dly, dqs_out_en_dly & {DQS_BITS{out_en}} & {DQS_BITS{dqs_n_en}});
+    bufif1 buf_rdqs_n [DQS_BITS-1:0] (rdqs_n,  ~dqs_out_dly, dqs_out_en_dly & {DQS_BITS{out_en}} & {DQS_BITS{dqs_n_en}} & {DQS_BITS{rdqs_en}});
+    bufif1 buf_dq     [DQ_BITS-1:0]  (dq,      dq_out_dly,   dq_out_en_dly  & {DQ_BITS {out_en}});
+
+    initial begin
+        if (BL_MAX < 2) 
+            $display("%m ERROR: BL_MAX parameter must be >= 2.  \nBL_MAX = %d", BL_MAX);
+        if ((1<<BO_BITS) > BL_MAX) 
+            $display("%m ERROR: 2^BO_BITS cannot be greater than BL_MAX parameter.");
+        $timeformat (-12, 1, " ps", 1);
+        reset_task;
+        seed = RANDOM_SEED;
+        ck_cntr = 0;
+    end
+
+    // calculate the absolute value of a real number
+    function real abs_value;
+    input arg;
+    real arg;
+    begin
+        if (arg < 0.0)
+            abs_value = -1.0 * arg;
+        else
+            abs_value = arg;
+    end
+    endfunction
+
+`ifdef MAX_MEM
+`else
+    function get_index;
+        input [`MAX_BITS-1:0] addr;
+        begin : index
+            get_index = 0;
+            for (memory_index=0; memory_index<memory_used; memory_index=memory_index+1) begin
+                if (address[memory_index] == addr) begin
+                    get_index = 1;
+                    disable index;
+                end
+            end
+        end
+    endfunction
+`endif
+
+    task memory_write;
+        input  [BA_BITS-1:0]  bank;
+        input  [ROW_BITS-1:0] row;
+        input  [COL_BITS-1:0] col;
+        input  [BL_MAX*DQ_BITS-1:0] data;
+        reg    [`MAX_BITS-1:0] addr;
+        begin
+            // chop off the lowest address bits
+            addr = {bank, row, col}/BL_MAX;
+`ifdef MAX_MEM
+            memory[addr] = data;
+`else
+            if (get_index(addr)) begin
+                address[memory_index] = addr;
+                memory[memory_index] = data;
+            end else if (memory_used == `MEM_SIZE) begin
+                $display ("%m: at time %t ERROR: Memory overflow.  Write to Address %h with Data %h will be lost.\nYou must increase the MEM_BITS parameter or define MAX_MEM.", $time, addr, data);
+                if (STOP_ON_ERROR) $stop(0);
+            end else begin
+                address[memory_used] = addr;
+                memory[memory_used] = data;
+                memory_used = memory_used + 1;
+            end
+`endif
+        end
+    endtask
+
+    task memory_read;
+        input  [BA_BITS-1:0]  bank;
+        input  [ROW_BITS-1:0] row;
+        input  [COL_BITS-1:0] col;
+        output [BL_MAX*DQ_BITS-1:0] data;
+        reg    [`MAX_BITS-1:0] addr;
+        begin
+            // chop off the lowest address bits
+            addr = {bank, row, col}/BL_MAX;
+`ifdef MAX_MEM
+            data = memory[addr];
+`else
+            if (get_index(addr)) begin
+                data = memory[memory_index];
+            end else begin
+                data = {BL_MAX*DQ_BITS{1'bx}};
+            end
+`endif
+        end
+    endtask
+
+    // Before this task runs, the model must be in a valid state for precharge power down.
+    // After this task runs, NOP commands must be issued until tRFC has been met
+    task initialize;
+        input [ADDR_BITS-1:0] mode_reg0;
+        input [ADDR_BITS-1:0] mode_reg1;
+        input [ADDR_BITS-1:0] mode_reg2;
+        input [ADDR_BITS-1:0] mode_reg3;
+        begin
+            if (DEBUG) $display ("%m: at time %t INFO: Performing Initialization Sequence", $time);
+            cmd_task(1,       NOP, 'bx, 'bx);
+            cmd_task(1, PRECHARGE, 'bx, 1<<AP);           // Precharege ALL
+            cmd_task(1, LOAD_MODE, 3, mode_reg3);
+            cmd_task(1, LOAD_MODE, 2, mode_reg2);
+            cmd_task(1, LOAD_MODE, 1, mode_reg1);
+            cmd_task(1, LOAD_MODE, 0, mode_reg0 | 'h100); // DLL Reset
+            cmd_task(1, PRECHARGE, 'bx, 1<<AP);           // Precharege ALL
+            cmd_task(1,   REFRESH, 'bx, 'bx);
+            cmd_task(1,   REFRESH, 'bx, 'bx);
+            cmd_task(1, LOAD_MODE, 0, mode_reg0);
+            cmd_task(1, LOAD_MODE, 1, mode_reg1 | 'h380); // OCD Default
+            cmd_task(1, LOAD_MODE, 1, mode_reg1);
+            cmd_task(0,       NOP, 'bx, 'bx);
+        end
+    endtask
+    
+    task reset_task;
+        integer i;
+        begin
+            // disable inputs
+            dq_in_valid          = 0;
+            dqs_in_valid        <= 0;
+            wdqs_cntr            = 0;
+            wdq_cntr             = 0;
+            for (i=0; i<36; i=i+1) begin
+                wdqs_pos_cntr[i]    <= 0;
+            end
+            b2b_write           <= 0;
+            // disable outputs
+            out_en               = 0;
+            dqs_n_en             = 0;
+            rdqs_en              = 0;
+            dq_out_en            = 0;
+            rdq_cntr             = 0;
+            dqs_out_en           = 0;
+            rdqs_cntr            = 0;
+            // disable ODT
+            odt_en               = 0;
+            odt_state            = 0;
+            // reset bank state
+            active_bank          = {`BANKS{1'b1}};
+            auto_precharge_bank  = 0;
+	        read_precharge_bank  = 0;
+	        write_precharge_bank = 0;
+            // require initialization sequence
+            init_done            = 0;
+            init_step            = 0;
+            init_mode_reg        = 0;
+            // reset DLL
+            dll_en               = 0;
+            dll_reset            = 0;
+            dll_locked           = 0;
+            ocd                  = 0;
+            // exit power down and self refresh
+            in_power_down        = 0;
+            in_self_refresh      = 0;
+            // clear pipelines
+            al_pipeline          = 0;
+            wr_pipeline          = 0;
+            rd_pipeline          = 0;
+            odt_pipeline         = 0;
+            // clear memory
+`ifdef MAX_MEM
+            for (i=0; i<=`MAX_SIZE; i=i+1) begin //erase memory ... one address at a time
+                memory[i] <= 'bx;
+            end
+`else
+            memory_used <= 0; //erase memory
+`endif
+            // clear maximum timing checks
+            tm_refresh <= 'bx;
+            for (i=0; i<`BANKS; i=i+1) begin
+                tm_bank_activate[i] <= 'bx;
+            end
+        end
+    endtask
+
+    task chk_err;
+        input samebank;
+        input [BA_BITS-1:0] bank;
+        input [3:0] fromcmd;
+        input [3:0] cmd;
+        reg err;
+    begin
+        // all matching case expressions will be evaluated
+        casex ({samebank, fromcmd, cmd})
+            {1'b0, LOAD_MODE, 4'b0xxx  } : begin if (ck_cntr - ck_load_mode < TMRD)                                                                                       $display ("%m: at time %t ERROR:  tMRD violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b0, LOAD_MODE, 4'b100x  } : begin if (ck_cntr - ck_load_mode < TMRD)                                                                                 begin $display ("%m: at time %t INFO: Load Mode to Reset condition.", $time);                    init_done = 0; end end
+            {1'b0, REFRESH  , 4'b0xxx  } : begin if ($time - tm_refresh < TRFC_MIN)                                                                                       $display ("%m: at time %t ERROR:  tRFC violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b0, REFRESH  , PWR_DOWN } : ; // 1 tCK
+            {1'b0, REFRESH  , SELF_REF } : begin if ($time - tm_refresh < TRFC_MIN)                                                                                 begin $display ("%m: at time %t INFO: Refresh to Reset condition", $time);                       init_done = 0; end end
+            {1'b0, PRECHARGE, 4'b000x  } : begin if ($time - tm_precharge_all < TRPA)                                                                                     $display ("%m: at time %t ERROR:  tRPA violation during %s", $time, cmd_string[cmd]);
+                                                 if ($time - tm_precharge < TRP)                                                                                          $display ("%m: at time %t ERROR:   tRP violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b1, PRECHARGE, PRECHARGE} : begin if (DEBUG && ($time - tm_precharge_all < TRPA))                                                                          $display ("%m: at time %t INFO: Precharge All interruption during %s", $time, cmd_string[cmd]);
+                                                 if (DEBUG && ($time - tm_bank_precharge[bank] < TRP))                                                                    $display ("%m: at time %t INFO: Precharge bank %d interruption during %s", $time, cmd_string[cmd], bank);  end
+            {1'b1, PRECHARGE, ACTIVATE } : begin if ($time - tm_precharge_all < TRPA)                                                                                     $display ("%m: at time %t ERROR:  tRPA violation during %s", $time, cmd_string[cmd]);
+                                                 if ($time - tm_bank_precharge[bank] < TRP)                                                                               $display ("%m: at time %t ERROR:   tRP violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b0, PRECHARGE, PWR_DOWN } : ; //1 tCK, can be concurrent with auto precharge
+            {1'b0, PRECHARGE, SELF_REF } : begin if (($time - tm_precharge_all < TRPA) || ($time - tm_precharge < TRP))                                             begin $display ("%m: at time %t INFO: Precharge to Reset condition", $time);                     init_done = 0; end end
+            {1'b0, ACTIVATE , REFRESH  } : begin if ($time - tm_activate < TRC)                                                                                           $display ("%m: at time %t ERROR:   tRC violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b1, ACTIVATE , PRECHARGE} : begin if (($time - tm_bank_activate[bank] > TRAS_MAX) && (active_bank[bank] === 1'b1))                                         $display ("%m: at time %t ERROR:  tRAS maximum violation during %s to bank %d", $time, cmd_string[cmd], bank);
+                                                 if ($time - tm_bank_activate[bank] < TRAS_MIN)                                                                           $display ("%m: at time %t ERROR:  tRAS minimum violation during %s to bank %d", $time, cmd_string[cmd], bank);end
+            {1'b0, ACTIVATE , ACTIVATE } : begin if ($time - tm_activate < TRRD)                                                                                          $display ("%m: at time %t ERROR:  tRRD violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b1, ACTIVATE , ACTIVATE } : begin if ($time - tm_bank_activate[bank] < TRC)                                                                                $display ("%m: at time %t ERROR:   tRC violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b1, ACTIVATE , 4'b010x  } : ; // tRCD is checked outside this task
+            {1'b1, ACTIVATE , PWR_DOWN } : ; // 1 tCK
+            {1'b1, WRITE    , PRECHARGE} : begin if ((ck_cntr - ck_bank_write[bank] <= write_latency + burst_length/2) || ($time - tm_bank_write_end[bank] < TWR))        $display ("%m: at time %t ERROR:   tWR violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b0, WRITE    , WRITE    } : begin if (ck_cntr - ck_write < TCCD)                                                                                           $display ("%m: at time %t ERROR:  tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b0, WRITE    , READ     } : begin if ((ck_load_mode < ck_write) && (ck_cntr - ck_write < write_latency + burst_length/2 + 2 - additive_latency))           $display ("%m: at time %t ERROR:  tWTR violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b0, WRITE    , PWR_DOWN } : begin if ((ck_load_mode < ck_write) && (
+                                                    |write_precharge_bank
+                                                 || (ck_cntr - ck_write_ap < 1)
+                                                 || (ck_cntr - ck_write < write_latency + burst_length/2 + 2) 
+                                                 || ($time - tm_write_end < TWTR)))                                                                                 begin $display ("%m: at time %t INFO: Write to Reset condition", $time);                         init_done = 0; end end
+            {1'b1, READ     , PRECHARGE} : begin if ((ck_cntr - ck_bank_read[bank] < additive_latency + burst_length/2) || ($time - tm_bank_read_end[bank] < TRTP))       $display ("%m: at time %t ERROR:  tRTP violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b0, READ     , WRITE    } : begin if ((ck_load_mode < ck_read) && (ck_cntr - ck_read < read_latency + burst_length/2 + 1 - write_latency))                 $display ("%m: at time %t ERROR:  tRTW violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b0, READ     , READ     } : begin if (ck_cntr - ck_read < TCCD)                                                                                            $display ("%m: at time %t ERROR:  tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank);        end
+            {1'b0, READ     , PWR_DOWN } : begin if ((ck_load_mode < ck_read) && (ck_cntr - ck_read < read_latency + burst_length/2 + 1))                           begin $display ("%m: at time %t INFO: Read to Reset condition", $time);                          init_done = 0; end end
+            {1'b0, PWR_DOWN , 4'b00xx  } : begin if (ck_cntr - ck_power_down < TXP)                                                                                       $display ("%m: at time %t ERROR:   tXP violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b0, PWR_DOWN , WRITE    } : begin if (ck_cntr - ck_power_down < TXP)                                                                                       $display ("%m: at time %t ERROR:   tXP violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b0, PWR_DOWN , READ     } : begin if (ck_cntr - ck_slow_exit_pd < TXARDS - additive_latency)                                                               $display ("%m: at time %t ERROR: tXARDS violation during %s", $time, cmd_string[cmd]);
+                                            else if (ck_cntr - ck_power_down < TXARD)                                                                                     $display ("%m: at time %t ERROR: tXARD violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b0, SELF_REF , 4'b00xx  } : begin if ($time - tm_self_refresh < TXSNR)                                                                                     $display ("%m: at time %t ERROR: tXSNR violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b0, SELF_REF , WRITE    } : begin if ($time - tm_self_refresh < TXSNR)                                                                                     $display ("%m: at time %t ERROR: tXSNR violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b0, SELF_REF , READ     } : begin if (ck_cntr - ck_self_refresh < TXSRD)                                                                                   $display ("%m: at time %t ERROR: tXSRD violation during %s", $time, cmd_string[cmd]);                         end
+            {1'b0, 4'b100x  , 4'b100x  } : begin if (ck_cntr - ck_cke < TCKE)                                                                                       begin $display ("%m: at time %t ERROR:  tCKE violation on CKE", $time);                          init_done = 0; end end
+        endcase
+    end
+    endtask
+
+    task cmd_task;
+        input cke;
+        input [2:0] cmd;
+        input [BA_BITS-1:0] bank;
+        input [ADDR_BITS-1:0] addr;
+        reg [`BANKS:0] i;
+        integer j;
+        reg [`BANKS:0] tfaw_cntr;
+        reg [COL_BITS-1:0] col;
+        begin
+
+            // tRFC max check
+            if (!er_trfc_max && !in_self_refresh) begin
+                if ($time - tm_refresh > TRFC_MAX) begin
+                    $display ("%m: at time %t ERROR:  tRFC maximum violation during %s", $time, cmd_string[cmd]);
+                    er_trfc_max = 1;
+                end
+            end
+            if (cke) begin
+                if ((cmd < NOP) && ((cmd != PRECHARGE) || !addr[AP])) begin
+                    for (j=0; j<NOP; j=j+1) begin
+                        chk_err(1'b0, bank, j, cmd);
+                        chk_err(1'b1, bank, j, cmd);
+                    end
+                    chk_err(1'b0, bank, PWR_DOWN, cmd);
+                    chk_err(1'b0, bank, SELF_REF, cmd);
+                end
+
+                case (cmd)
+                    LOAD_MODE : begin
+                        if (|active_bank) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  All banks must be Precharged.", $time, cmd_string[cmd]);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else begin
+                            if (DEBUG) $display ("%m: at time %t INFO: %s %d", $time, cmd_string[cmd], bank);
+                            case (bank)
+                                0 : begin
+                                    // Burst Length
+                                    burst_length = 1<<addr[2:0];
+                                    if ((burst_length >= BL_MIN) && (burst_length <= BL_MAX)) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = %d", $time, cmd_string[cmd], bank, burst_length);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal Burst Length = %d", $time, cmd_string[cmd], bank, burst_length);
+                                    end
+                                    // Burst Order
+                                    burst_order = addr[3];
+                                    if (!burst_order) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Sequential", $time, cmd_string[cmd], bank);
+                                    end else if (burst_order) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Interleaved", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal Burst Order = %d", $time, cmd_string[cmd], bank, burst_order);
+                                    end
+                                    // CAS Latency
+                                    cas_latency = addr[6:4];
+                                    read_latency = cas_latency + additive_latency;
+                                    write_latency = read_latency - 1;
+                                    if ((cas_latency >= CL_MIN) && (cas_latency <= CL_MAX)) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency);
+                                    end
+                                    // Test Mode
+                                    if (!addr[7]) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Test Mode = Normal", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal Test Mode = %d", $time, cmd_string[cmd], bank, addr[7]);
+                                    end
+                                    // DLL Reset
+                                    dll_reset = addr[8];
+                                    if (!dll_reset) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Normal", $time, cmd_string[cmd], bank);
+                                    end else if (dll_reset) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Reset DLL", $time, cmd_string[cmd], bank);
+                                        dll_locked = 0;
+                                        ck_dll_reset <= ck_cntr;
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal DLL Reset = %d", $time, cmd_string[cmd], bank, dll_reset);
+                                    end
+                                    // Write Recovery
+                                    write_recovery  = addr[11:9] + 1;
+                                    if ((write_recovery >= WR_MIN) && (write_recovery <= WR_MAX)) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery);
+                                    end
+                                    // Power Down Mode
+                                    low_power = addr[12];
+                                    if (!low_power) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = Fast Exit", $time, cmd_string[cmd], bank);
+                                    end else if (low_power) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = Slow Exit", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal Power Down Mode = %d", $time, cmd_string[cmd], bank, low_power);
+                                    end
+                                end
+                                1 : begin
+                                    // DLL Enable
+                                    dll_en = !addr[0];
+                                    if (!dll_en) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Disabled", $time, cmd_string[cmd], bank);
+                                    end else if (dll_en) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Enabled", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal DLL Enable = %d", $time, cmd_string[cmd], bank, dll_en);
+                                    end
+                                    // Output Drive Strength
+                                    if (!addr[1]) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = Full", $time, cmd_string[cmd], bank);
+                                    end else if (addr[1]) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = Reduced", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal Output Drive Strength = %d", $time, cmd_string[cmd], bank, addr[1]);
+                                    end
+                                    // ODT Rtt
+                                    odt_rtt = {addr[6], addr[2]};
+                                    if (odt_rtt == 2'b00) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = Disabled", $time, cmd_string[cmd], bank);
+                                        odt_en = 0;
+                                    end else if (odt_rtt == 2'b01) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 75 Ohm", $time, cmd_string[cmd], bank);
+                                        odt_en = 1;
+                                        tm_odt_en <= $time;
+                                    end else if (odt_rtt == 2'b10) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 150 Ohm", $time, cmd_string[cmd], bank);
+                                        odt_en = 1;
+                                        tm_odt_en <= $time;
+                                    end else if (odt_rtt == 2'b11) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = 50 Ohm", $time, cmd_string[cmd], bank);
+                                        odt_en = 1;
+                                        tm_odt_en <= $time;
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal ODT Rtt = %d", $time, cmd_string[cmd], bank, odt_rtt);
+                                        odt_en = 0;
+                                    end
+                                    // Additive Latency
+                                    additive_latency = addr[5:3];
+                                    read_latency = cas_latency + additive_latency;
+                                    write_latency = read_latency - 1;
+                                    if ((additive_latency >= AL_MIN) && (additive_latency <= AL_MAX)) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Additive Latency = %d", $time, cmd_string[cmd], bank, additive_latency);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal Additive Latency = %d", $time, cmd_string[cmd], bank, additive_latency);
+                                    end
+                                    // OCD Program
+                                    ocd = addr[9:7];
+                                    if (ocd == 3'b000) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d OCD Program = OCD Exit", $time, cmd_string[cmd], bank);
+                                    end else if (ocd == 3'b111) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d OCD Program = OCD Default", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal OCD Program = %b", $time, cmd_string[cmd], bank, ocd);
+                                    end
+
+                                    // DQS_N Enable
+                                    dqs_n_en = !addr[10];
+                                    if (!dqs_n_en) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DQS_N Enable = Disabled", $time, cmd_string[cmd], bank);
+                                    end else if (dqs_n_en) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d DQS_N Enable = Enabled", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal DQS_N Enable = %d", $time, cmd_string[cmd], bank, dqs_n_en);
+                                    end 
+                                    // RDQS Enable
+                                    rdqs_en = addr[11];
+                                    if (!rdqs_en) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d RDQS Enable = Disabled", $time, cmd_string[cmd], bank);
+                                    end else if (rdqs_en) begin
+`ifdef x8
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d RDQS Enable = Enabled", $time, cmd_string[cmd], bank);
+`else
+                                        $display ("%m: at time %t WARNING: %s %d Illegal RDQS Enable.  RDQS only exists on a x8 part", $time, cmd_string[cmd], bank);
+                                        rdqs_en = 0;
+`endif
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal RDQS Enable = %d", $time, cmd_string[cmd], bank, rdqs_en);
+                                    end 
+                                    // Output Enable
+                                    out_en = !addr[12];
+                                    if (!out_en) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Enable = Disabled", $time, cmd_string[cmd], bank);
+                                    end else if (out_en) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Enable = Enabled", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal Output Enable = %d", $time, cmd_string[cmd], bank, out_en);
+                                    end 
+                                end
+                                2 : begin
+                                    // High Temperature Self Refresh rate
+                                    if (!addr[7]) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d High Temperature Self Refresh rate = 1X (0C-85C)", $time, cmd_string[cmd], bank);
+                                    end else if (addr[7]) begin
+                                        if (DEBUG) $display ("%m: at time %t INFO: %s %d High Temperature Self Refresh rate = 2X (>85C)", $time, cmd_string[cmd], bank);
+                                    end else begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal High Temperature Self Refresh rate = %d", $time, cmd_string[cmd], bank, addr[7]);
+                                    end
+                                    if ((addr & ~(1<<7)) !== 0) begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal value.  Reserved bits must be programmed to zero", $time, cmd_string[cmd], bank);
+                                    end
+                                end
+                                3 : begin
+                                    if (addr !== 0) begin
+                                        $display ("%m: at time %t ERROR: %s %d Illegal value.  Reserved bits must be programmed to zero", $time, cmd_string[cmd], bank);
+                                    end
+                                end
+                            endcase
+                            init_mode_reg[bank] = 1;
+                            ck_load_mode <= ck_cntr;
+                        end
+                    end
+                    REFRESH : begin
+                        if (|active_bank) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  All banks must be Precharged.", $time, cmd_string[cmd]);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else begin
+                            if (DEBUG) $display ("%m: at time %t INFO: %s", $time, cmd_string[cmd]);
+                            er_trfc_max = 0;
+                            ref_cntr = ref_cntr + 1;
+                            tm_refresh <= $time;
+                        end
+                    end
+                    PRECHARGE : begin
+                        if (addr[AP]) begin
+                            // tRPA timing applies when the PRECHARGE (ALL) command is issued, regardless of
+                            // the number of banks already open or closed.
+                            for (i=0; i<`BANKS; i=i+1) begin
+                                for (j=0; j<NOP; j=j+1) begin
+                                    chk_err(1'b0, i, j, cmd);
+                                    chk_err(1'b1, i, j, cmd);
+                                end
+                                chk_err(1'b0, i, PWR_DOWN, cmd);
+                                chk_err(1'b0, i, SELF_REF, cmd);
+                            end
+                            if (|auto_precharge_bank) begin
+                                $display ("%m: at time %t ERROR: %s All Failure.  Auto Precharge is scheduled.", $time, cmd_string[cmd]);
+                                if (STOP_ON_ERROR) $stop(0);
+                            end else begin
+                                if (DEBUG) $display ("%m: at time %t INFO: %s All", $time, cmd_string[cmd]);
+                                active_bank = 0;
+                                tm_precharge_all <= $time;
+                            end
+                        end else begin
+                            // A PRECHARGE command is allowed if there is no open row in that bank (idle state) 
+                            // or if the previously open row is already in the process of precharging. 
+                            // However, the precharge period will be determined by the last PRECHARGE command issued to the bank.
+                            if (auto_precharge_bank[bank]) begin
+                                $display ("%m: at time %t ERROR: %s Failure.  Auto Precharge is scheduled to bank %d.", $time, cmd_string[cmd], bank);
+                                if (STOP_ON_ERROR) $stop(0);
+                            end else begin
+                                if (DEBUG) $display ("%m: at time %t INFO: %s bank %d", $time, cmd_string[cmd], bank);
+                                active_bank[bank] = 1'b0;
+                                tm_bank_precharge[bank] <= $time;
+                                tm_precharge <= $time;
+                            end
+                        end
+                    end
+                    ACTIVATE : begin
+                        if (`BANKS == 8) begin
+                            tfaw_cntr = 0;
+                            for (i=0; i<`BANKS; i=i+1) begin
+                                if ($time - tm_bank_activate[i] < TFAW) begin
+                                    tfaw_cntr = tfaw_cntr + 1;
+                                end
+                            end
+                            if (tfaw_cntr > 3) begin
+                                $display ("%m: at time %t ERROR:  tFAW violation during %s to bank %d", $time, cmd_string[cmd], bank);
+                            end
+                        end
+
+                        if (!init_done) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Initialization sequence is not complete.", $time, cmd_string[cmd]);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else if (active_bank[bank]) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Bank %d must be Precharged.", $time, cmd_string[cmd], bank);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else begin
+                            if (addr >= 1<<ROW_BITS) begin
+                                $display ("%m: at time %t WARNING: row = %h does not exist.  Maximum row = %h", $time, addr, (1<<ROW_BITS)-1);
+                            end
+                            if (DEBUG) $display ("%m: at time %t INFO: %s bank %d row %h", $time, cmd_string[cmd], bank, addr);
+                            active_bank[bank] = 1'b1;
+                            active_row[bank] = addr;
+                            tm_bank_activate[bank] <= $time;
+                            tm_activate <= $time;
+                        end
+                        
+                    end
+                    WRITE : begin
+                        if (!init_done) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Initialization sequence is not complete.", $time, cmd_string[cmd]);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else if (!active_bank[bank]) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Bank %d must be Activated.", $time, cmd_string[cmd], bank);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else if (auto_precharge_bank[bank]) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Auto Precharge is scheduled to bank %d.", $time, cmd_string[cmd], bank);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else if ((ck_cntr - ck_write < burst_length/2) && (ck_cntr - ck_write)%2) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Illegal burst interruption.", $time, cmd_string[cmd]);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else begin
+                            if (addr[AP]) begin
+                                auto_precharge_bank[bank] = 1'b1;
+                                write_precharge_bank[bank] = 1'b1;
+                            end
+                            col = ((addr>>1) & -1*(1<<AP)) | (addr & {AP{1'b1}});
+                            if (col >= 1<<COL_BITS) begin
+                                $display ("%m: at time %t WARNING: col = %h does not exist.  Maximum col = %h", $time, col, (1<<COL_BITS)-1);
+                            end
+                            if (DEBUG) $display ("%m: at time %t INFO: %s bank %d col %h, auto precharge %d", $time, cmd_string[cmd], bank, col, addr[AP]);
+                            wr_pipeline[2*write_latency + 1]  = 1;
+                            ba_pipeline[2*write_latency + 1]  = bank;
+                            row_pipeline[2*write_latency + 1] = active_row[bank];
+                            col_pipeline[2*write_latency + 1] = col;
+                            ck_bank_write[bank] <= ck_cntr;
+                            ck_write <= ck_cntr;
+                        end
+                    end
+                    READ : begin
+                        if (!dll_locked)
+                            $display ("%m: at time %t WARNING: %s prior to DLL locked.  Failing to wait for synchronization to occur may result in a violation of the tAC or tDQSCK parameters.", $time, cmd_string[cmd]);
+                        if (!init_done) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Initialization sequence is not complete.", $time, cmd_string[cmd]);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else if (!active_bank[bank]) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Bank %d must be Activated.", $time, cmd_string[cmd], bank);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else if (auto_precharge_bank[bank]) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Auto Precharge is scheduled to bank %d.", $time, cmd_string[cmd], bank);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else if ((ck_cntr - ck_read < burst_length/2) && (ck_cntr - ck_read)%2) begin
+                            $display ("%m: at time %t ERROR: %s Failure.  Illegal burst interruption.", $time, cmd_string[cmd]);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else begin
+                            if (addr[AP]) begin
+                                auto_precharge_bank[bank] = 1'b1;
+                                read_precharge_bank[bank] = 1'b1;
+                            end
+                            col = ((addr>>1) & -1*(1<<AP)) | (addr & {AP{1'b1}});
+                            if (col >= 1<<COL_BITS) begin
+                                $display ("%m: at time %t WARNING: col = %h does not exist.  Maximum col = %h", $time, col, (1<<COL_BITS)-1);
+                            end
+                            if (DEBUG) $display ("%m: at time %t INFO: %s bank %d col %h, auto precharge %d", $time, cmd_string[cmd], bank, col, addr[AP]);
+                            rd_pipeline[2*read_latency - 1]  = 1;
+                            ba_pipeline[2*read_latency - 1]  = bank;
+                            row_pipeline[2*read_latency - 1] = active_row[bank];
+                            col_pipeline[2*read_latency - 1] = col;
+                            ck_bank_read[bank] <= ck_cntr;
+                            ck_read <= ck_cntr;
+                        end
+                    end
+                    NOP: begin
+                        if (in_power_down) begin
+                            if (DEBUG) $display ("%m: at time %t INFO: Power Down Exit", $time);
+                            in_power_down = 0;
+                            if (|active_bank & low_power) begin // slow exit active power down
+                                ck_slow_exit_pd <= ck_cntr;
+                            end
+                            ck_power_down <= ck_cntr;
+                        end
+                        if (in_self_refresh) begin
+                            if ($time - tm_cke < TISXR)
+                                $display ("%m: at time %t ERROR: tISXR violation during Self Refresh Exit", $time);
+                            if (DEBUG) $display ("%m: at time %t INFO: Self Refresh Exit", $time);
+                            in_self_refresh = 0;
+                            ck_dll_reset <= ck_cntr;
+                            ck_self_refresh <= ck_cntr;
+                            tm_self_refresh <= $time;
+                            tm_refresh <= $time;
+                        end
+                    end
+                endcase
+                if ((prev_cke !== 1) && (cmd !== NOP)) begin
+                    $display ("%m: at time %t ERROR: NOP or Deselect is required when CKE goes active.", $time);
+                end
+                if (!init_done) begin
+                    case (init_step)
+                        0 : begin
+                            if ($time < 200000000) 
+                                $display ("%m: at time %t WARNING: 200 us is required before CKE goes active.", $time);
+//                          if (cmd_chk + 200000000 > $time)
+//                              $display("%m: at time %t WARNING: NOP or DESELECT is required for 200 us before CKE is brought high", $time);
+                            init_step = init_step + 1;
+                        end
+                        1 : if (dll_en)        init_step = init_step + 1;
+                        2 : begin
+                            if (&init_mode_reg && dll_reset) begin
+                                active_bank = {`BANKS{1'b1}};   // require Precharge All or bank Precharges
+                                ref_cntr = 0;                   // require refresh
+                                init_step = init_step + 1;
+                            end
+                        end
+                        3 : if (ref_cntr == 2) begin
+                            init_step = init_step + 1;
+                        end
+                        4 : if (!dll_reset)    init_step = init_step + 1;
+                        5 : if (ocd == 3'b111) init_step = init_step + 1;
+                        6 : begin
+                            if (ocd == 3'b000) begin
+                                if (DEBUG) $display ("%m: at time %t INFO: Initialization Sequence is complete", $time);
+                                init_done = 1;
+                            end
+                        end
+                    endcase
+                end
+            end else if (prev_cke) begin
+                if ((!init_done) && (init_step > 1)) begin
+                    $display ("%m: at time %t ERROR: CKE must remain active until the initialization sequence is complete.", $time);
+                    if (STOP_ON_ERROR) $stop(0);
+                end
+                case (cmd)
+                    REFRESH : begin
+                        for (j=0; j<NOP; j=j+1) begin
+                            chk_err(1'b0, bank, j, SELF_REF);
+                        end
+                        chk_err(1'b0, bank, PWR_DOWN, SELF_REF);
+                        chk_err(1'b0, bank, SELF_REF, SELF_REF);
+                        if (|active_bank) begin
+                            $display ("%m: at time %t ERROR: Self Refresh Failure.  All banks must be Precharged.", $time);
+                            if (STOP_ON_ERROR) $stop(0);
+                            init_done = 0;
+                        end else if (odt_en && odt_state) begin
+                            $display ("%m: at time %t ERROR: ODT must be off prior to entering Self Refresh", $time);
+                            if (STOP_ON_ERROR) $stop(0);
+                            init_done = 0;
+                        end else if (!init_done) begin
+                            $display ("%m: at time %t ERROR: Self Refresh Failure.  Initialization sequence is not complete.", $time);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else begin
+                            if (DEBUG) $display ("%m: at time %t INFO: Self Refresh Enter", $time);
+                            in_self_refresh = 1;
+                            dll_locked = 0;
+                        end
+                    end
+                    NOP : begin
+                        // entering slow_exit or precharge power down and tANPD has not been satisfied
+                        if ((low_power || (active_bank == 0)) && (ck_cntr - ck_odt < TANPD))
+                            $display ("%m: at time %t WARNING: tANPD violation during %s.  Synchronous or asynchronous change in termination resistance is possible.", $time, cmd_string[PWR_DOWN]);
+                        for (j=0; j<NOP; j=j+1) begin
+                            chk_err(1'b0, bank, j, PWR_DOWN);
+                        end
+                        chk_err(1'b0, bank, PWR_DOWN, PWR_DOWN);
+                        chk_err(1'b0, bank, SELF_REF, PWR_DOWN);
+
+                        if (!init_done) begin
+                            $display ("%m: at time %t ERROR: Power Down Failure.  Initialization sequence is not complete.", $time);
+                            if (STOP_ON_ERROR) $stop(0);
+                        end else begin
+                            if (DEBUG) begin
+                                if (|active_bank) begin
+                                    $display ("%m: at time %t INFO: Active Power Down Enter", $time);
+                                end else begin
+                                    $display ("%m: at time %t INFO: Precharge Power Down Enter", $time);
+                                end
+                            end
+                            in_power_down = 1;
+                        end
+                    end
+                    default : begin
+                        $display ("%m: at time %t ERROR: NOP, Deselect, or Refresh is required when CKE goes inactive.", $time);
+                        init_done = 0;
+                    end
+                endcase
+                if (!init_done) begin
+                    if (DEBUG) $display ("%m: at time %t WARNING: Reset has occurred.  Device must be re-initialized.", $time);
+                    reset_task;
+                end
+            end
+            prev_cke  = cke;
+        end
+    endtask
+
+    task data_task;
+        reg [BA_BITS-1:0] bank;
+        reg [ROW_BITS-1:0] row;
+        reg [COL_BITS-1:0] col;
+        integer i;
+        integer j;
+        begin
+
+            if (diff_ck) begin
+                for (i=0; i<36; i=i+1) begin
+                    if (dq_in_valid && dll_locked && ($time - tm_dqs_neg[i] < $rtoi(TDSS*tck_avg)))
+                        $display ("%m: at time %t ERROR: tDSS violation on %s bit %d", $time, dqs_string[i/18], i%18);
+                    if (check_write_dqs_high[i])
+                        $display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period.", $time, dqs_string[i/18], i%18);
+                end
+                check_write_dqs_high <= 0;
+            end else begin
+                for (i=0; i<36; i=i+1) begin
+                    if (dll_locked && dq_in_valid) begin
+                        tm_tdqss = abs_value(1.0*tm_ck_pos - tm_dqss_pos[i]);
+                        if ((tm_tdqss < tck_avg/2.0) && (tm_tdqss > TDQSS*tck_avg))
+                            $display ("%m: at time %t ERROR: tDQSS violation on %s bit %d", $time, dqs_string[i/18], i%18); 
+                    end
+                    if (check_write_dqs_low[i])
+                        $display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period", $time, dqs_string[i/18], i%18);
+                end
+                check_write_preamble <= 0;
+                check_write_postamble <= 0;
+                check_write_dqs_low <= 0;
+            end
+
+            if (wr_pipeline[0] || rd_pipeline[0]) begin
+                bank = ba_pipeline[0];
+                row = row_pipeline[0];
+                col = col_pipeline[0];
+                burst_cntr = 0;
+                memory_read(bank, row, col, memory_data);
+            end
+
+            // burst counter
+            if (burst_cntr < burst_length) begin
+                burst_position = col ^ burst_cntr;
+                if (!burst_order) begin
+                    burst_position[BO_BITS-1:0] = col + burst_cntr;
+                end
+                burst_cntr = burst_cntr + 1;
+            end
+
+            // write dqs counter
+            if (wr_pipeline[WDQS_PRE + 1]) begin
+                wdqs_cntr = WDQS_PRE + burst_length + WDQS_PST - 1;
+            end
+            // write dqs
+            if ((wdqs_cntr == burst_length + WDQS_PST) && (wdq_cntr == 0)) begin //write preamble
+                check_write_preamble <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}};
+            end
+            if (wdqs_cntr > 1) begin  // write data
+                if ((wdqs_cntr - WDQS_PST)%2) begin
+                    check_write_dqs_high <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}};
+                end else begin
+                    check_write_dqs_low <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}};
+                end
+            end
+            if (wdqs_cntr == WDQS_PST) begin // write postamble
+                check_write_postamble <= ({DQS_BITS{dqs_n_en}}<<18) | {DQS_BITS{1'b1}};
+            end 
+            if (wdqs_cntr > 0) begin
+                wdqs_cntr = wdqs_cntr - 1;
+            end
+
+            // write dq
+            if (dq_in_valid) begin // write data
+                bit_mask = 0;
+                if (diff_ck) begin
+                    for (i=0; i<DM_BITS; i=i+1) begin
+                        bit_mask = bit_mask | ({`DQ_PER_DQS{~dm_in_neg[i]}}<<(burst_position*DQ_BITS + i*`DQ_PER_DQS));
+                    end
+                    memory_data = (dq_in_neg<<(burst_position*DQ_BITS) & bit_mask) | (memory_data & ~bit_mask);
+                end else begin
+                    for (i=0; i<DM_BITS; i=i+1) begin
+                        bit_mask = bit_mask | ({`DQ_PER_DQS{~dm_in_pos[i]}}<<(burst_position*DQ_BITS + i*`DQ_PER_DQS));
+                    end
+                    memory_data = (dq_in_pos<<(burst_position*DQ_BITS) & bit_mask) | (memory_data & ~bit_mask);
+                end
+                dq_temp = memory_data>>(burst_position*DQ_BITS);
+                if (DEBUG) $display ("%m: at time %t INFO: WRITE @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp);
+                if (burst_cntr%BL_MIN == 0) begin
+                    memory_write(bank, row, col, memory_data);
+                end
+            end
+            if (wr_pipeline[1]) begin
+                wdq_cntr = burst_length;
+            end
+            if (wdq_cntr > 0) begin
+                wdq_cntr = wdq_cntr - 1;
+                dq_in_valid = 1'b1;
+            end else begin
+                dq_in_valid = 1'b0;
+                dqs_in_valid <= 1'b0;
+                for (i=0; i<36; i=i+1) begin
+                    wdqs_pos_cntr[i] <= 0;
+                end
+            end
+            if (wr_pipeline[0]) begin
+                b2b_write <= 1'b0;
+            end
+            if (wr_pipeline[2]) begin
+                if (dqs_in_valid) begin
+                    b2b_write <= 1'b1;
+                end
+                dqs_in_valid <= 1'b1;
+            end
+            // read dqs enable counter
+            if (rd_pipeline[RDQSEN_PRE]) begin
+                rdqsen_cntr = RDQSEN_PRE + burst_length + RDQSEN_PST - 1;
+            end
+            if (rdqsen_cntr > 0) begin
+                rdqsen_cntr = rdqsen_cntr - 1;
+                dqs_out_en = 1'b1;
+            end else begin
+                dqs_out_en = 1'b0;
+            end
+            
+            // read dqs counter
+            if (rd_pipeline[RDQS_PRE]) begin
+                rdqs_cntr = RDQS_PRE + burst_length + RDQS_PST - 1;
+            end
+            // read dqs
+            if ((rdqs_cntr >= burst_length + RDQS_PST) && (rdq_cntr == 0)) begin //read preamble
+                dqs_out = 1'b0;
+            end else if (rdqs_cntr > RDQS_PST) begin // read data
+                dqs_out = rdqs_cntr - RDQS_PST;
+            end else if (rdqs_cntr > 0) begin // read postamble
+                dqs_out = 1'b0;
+            end else begin
+                dqs_out = 1'b1;
+            end
+            if (rdqs_cntr > 0) begin
+                rdqs_cntr = rdqs_cntr - 1;
+            end
+
+            // read dq enable counter
+            if (rd_pipeline[RDQEN_PRE]) begin
+                rdqen_cntr = RDQEN_PRE + burst_length + RDQEN_PST;
+            end
+            if (rdqen_cntr > 0) begin
+                rdqen_cntr = rdqen_cntr - 1;
+                dq_out_en = 1'b1;
+            end else begin
+                dq_out_en = 1'b0;
+            end
+            // read dq
+            if (rd_pipeline[0]) begin
+                rdq_cntr = burst_length;
+            end
+            if (rdq_cntr > 0) begin // read data
+                dq_temp = memory_data>>(burst_position*DQ_BITS);
+                dq_out = dq_temp;
+                if (DEBUG) $display ("%m: at time %t INFO: READ @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp);
+                rdq_cntr = rdq_cntr - 1;
+            end else begin
+                dq_out = {DQ_BITS{1'b1}};
+            end
+
+            // delay signals prior to output
+            if (RANDOM_OUT_DELAY && (dqs_out_en || |dqs_out_en_dly || dq_out_en || |dq_out_en_dly)) begin
+                for (i=0; i<DQS_BITS; i=i+1) begin
+                    // DQSCK requirements
+                    // 1.) less than tDQSCK
+                    // 2.) greater than -tDQSCK
+                    // 3.) cannot change more than tQHS + tDQSQ from previous DQS edge
+                    dqsck_max = TDQSCK;
+                    if (dqsck_max > dqsck[i] + TQHS + TDQSQ) begin
+                        dqsck_max = dqsck[i] + TQHS + TDQSQ;
+                    end
+                    dqsck_min = -1*TDQSCK;
+                    if (dqsck_min < dqsck[i] - TQHS - TDQSQ) begin
+                        dqsck_min = dqsck[i] - TQHS - TDQSQ;
+                    end
+
+                    // DQSQ requirements
+                    // 1.) less than tAC - DQSCK
+                    // 2.) less than tDQSQ
+                    // 3.) greater than -tAC
+                    // 4.) greater than tQH from previous DQS edge
+                    dqsq_min = -1*TAC;
+                    if (dqsq_min < dqsck[i] - TQHS) begin
+                        dqsq_min = dqsck[i] - TQHS;
+                    end
+                    if (dqsck_min == dqsck_max) begin
+                        dqsck[i] = dqsck_min;
+                    end else begin
+                        dqsck[i] = $dist_uniform(seed, dqsck_min, dqsck_max);
+                    end
+                    dqsq_max = TAC;
+                    if (dqsq_max > TDQSQ + dqsck[i]) begin
+                        dqsq_max = TDQSQ + dqsck[i];
+                    end
+
+                    dqs_out_en_dly[i] <= #(tck_avg/2.0 + ($random % TAC)) dqs_out_en;
+                    dqs_out_dly[i]    <= #(tck_avg/2.0 + dqsck[i]) dqs_out;
+                    for (j=0; j<`DQ_PER_DQS; j=j+1) begin
+                        if (dq_out_en) begin // tLZ2
+                            dq_out_en_dly[i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + $dist_uniform(seed, -2*TAC, dqsq_max)) dq_out_en;
+                        end else begin // tHZ
+                            dq_out_en_dly[i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + ($random % TAC)) dq_out_en;
+                        end
+                        if (dqsq_min == dqsq_max) begin
+                            dq_out_dly   [i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + dqsq_min) dq_out[i*`DQ_PER_DQS + j];
+                        end else begin
+                            dq_out_dly   [i*`DQ_PER_DQS + j] <= #(tck_avg/2.0 + $dist_uniform(seed, dqsq_min, dqsq_max)) dq_out[i*`DQ_PER_DQS + j];
+                        end
+                    end
+                end
+            end else begin
+                out_delay = tck_avg/2.0;
+                dqs_out_en_dly <= #(out_delay) {DQS_BITS{dqs_out_en}};
+                dqs_out_dly    <= #(out_delay) {DQS_BITS{dqs_out   }};
+                dq_out_en_dly  <= #(out_delay) {DQ_BITS {dq_out_en }};
+                dq_out_dly     <= #(out_delay) {DQ_BITS {dq_out    }};
+            end
+        end
+    endtask
+
+    always @(diff_ck) begin : main
+        integer i;
+
+        if (!in_self_refresh && (diff_ck !== 1'b0) && (diff_ck !== 1'b1))
+            $display ("%m: at time %t ERROR: CK and CK_N are not allowed to go to an unknown state.", $time);
+        data_task;
+        if (diff_ck) begin
+            // check setup of command signals
+            if ($time > TIS) begin
+                if ($time - tm_cke < TIS) 
+                    $display ("%m: at time %t ERROR:   tIS violation on CKE by %t", $time, tm_cke + TIS - $time);
+                if (cke_in) begin
+                    for (i=0; i<22; i=i+1) begin
+                        if ($time - tm_cmd_addr[i] < TIS) 
+                            $display ("%m: at time %t ERROR:   tIS violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIS - $time);
+                    end
+                end
+            end
+
+            // update current state
+            if (!dll_locked && !in_self_refresh && (ck_cntr - ck_dll_reset == TDLLK)) begin
+                // check CL value against the clock frequency
+                if (cas_latency*tck_avg < CL_TIME)
+                    $display ("%m: at time %t ERROR: CAS Latency = %d is illegal @tCK(avg) = %f", $time, cas_latency, tck_avg);
+                // check WR value against the clock frequency
+                if (write_recovery*tck_avg < TWR)
+                    $display ("%m: at time %t ERROR: Write Recovery = %d is illegal @tCK(avg) = %f", $time, write_recovery, tck_avg);
+                dll_locked = 1;
+            end
+            if (|auto_precharge_bank) begin
+                for (i=0; i<`BANKS; i=i+1) begin
+                    // Write with Auto Precharge Calculation
+                    // 1.  Meet minimum tRAS requirement
+                    // 2.  Write Latency PLUS BL/2 cycles PLUS WR after Write command
+                    if (write_precharge_bank[i]
+                        && ($time - tm_bank_activate[i] >= TRAS_MIN)
+                        && (ck_cntr - ck_bank_write[i] >= write_latency + burst_length/2 + write_recovery)) begin
+
+                        if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i);
+                        write_precharge_bank[i] = 0;
+                        active_bank[i] = 0;
+                        auto_precharge_bank[i] = 0;
+                        ck_write_ap = ck_cntr;
+                        tm_bank_precharge[i] = $time;
+                        tm_precharge = $time;
+                    end
+                    // Read with Auto Precharge Calculation
+                    // 1.  Meet minimum tRAS requirement
+                    // 2.  Additive Latency plus BL/2 cycles after Read command
+                    // 3.  tRTP after the last 4-bit prefetch
+                    if (read_precharge_bank[i]
+                        && ($time - tm_bank_activate[i] >= TRAS_MIN) 
+                        && (ck_cntr - ck_bank_read[i] >= additive_latency + burst_length/2)) begin
+
+                        read_precharge_bank[i] = 0;
+                        // In case the internal precharge is pushed out by tRTP, tRP starts at the point where
+                        // the internal precharge happens (not at the next rising clock edge after this event).
+                        if ($time - tm_bank_read_end[i] < TRTP) begin
+                            if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", tm_bank_read_end[i] + TRTP, i);
+                            active_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0;
+                            auto_precharge_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0;
+                            tm_bank_precharge[i] <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP;
+                            tm_precharge <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP;
+                        end else begin
+                            if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i);
+                            active_bank[i] = 0;
+                            auto_precharge_bank[i] = 0;
+                            tm_bank_precharge[i] = $time;
+                            tm_precharge = $time;
+                        end
+                    end
+                end
+            end
+
+            // respond to incoming command
+            if (cke_in ^ prev_cke) begin
+                ck_cke <= ck_cntr;
+            end
+
+            cmd_task(cke_in, cmd_n_in, ba_in, addr_in);
+            if ((cmd_n_in == WRITE) || (cmd_n_in == READ)) begin
+                al_pipeline[2*additive_latency] = 1'b1;
+            end
+            if (al_pipeline[0]) begin
+                // check tRCD after additive latency
+                if ($time - tm_bank_activate[ba_pipeline[2*cas_latency - 1]] < TRCD) begin
+                    if (rd_pipeline[2*cas_latency - 1]) begin
+                        $display ("%m: at time %t ERROR:  tRCD violation during %s", $time, cmd_string[READ]);
+                    end else begin
+                        $display ("%m: at time %t ERROR:  tRCD violation during %s", $time, cmd_string[WRITE]);
+                    end
+                end
+                // check tWTR after additive latency
+                if (rd_pipeline[2*cas_latency - 1]) begin
+                    if ($time - tm_write_end < TWTR)
+                        $display ("%m: at time %t ERROR:  tWTR violation during %s", $time, cmd_string[READ]);
+                end
+            end
+            if (rd_pipeline[2*(cas_latency - burst_length/2 + 2) - 1]) begin
+                tm_bank_read_end[ba_pipeline[2*(cas_latency - burst_length/2 + 2) - 1]] <= $time;
+            end
+            for (i=0; i<`BANKS; i=i+1) begin
+                if ((ck_cntr - ck_bank_write[i] > write_latency) && (ck_cntr - ck_bank_write[i] <= write_latency + burst_length/2)) begin
+                    tm_bank_write_end[i] <= $time;
+                    tm_write_end <= $time;
+                end
+            end
+
+            // clk pin is disabled during self refresh
+            if (!in_self_refresh) begin
+                tjit_cc_time = $time - tm_ck_pos - tck_i;
+                tck_i   = $time - tm_ck_pos;
+                tck_avg = tck_avg - tck_sample[ck_cntr%TDLLK]/$itor(TDLLK);
+                tck_avg = tck_avg + tck_i/$itor(TDLLK);
+                tck_sample[ck_cntr%TDLLK] = tck_i;
+                tjit_per_rtime = tck_i - tck_avg;
+
+                if (dll_locked) begin
+                    // check accumulated error
+                    terr_nper_rtime = 0;
+                    for (i=0; i<50; i=i+1) begin
+                        terr_nper_rtime = terr_nper_rtime + tck_sample[i] - tck_avg;
+                        terr_nper_rtime = abs_value(terr_nper_rtime);
+                        case (i)
+                                  0 :;
+                                  1 : if (terr_nper_rtime - TERR_2PER >= 1.0) $display ("%m: at time %t ERROR: tERR(2per) violation by %f ps.", $time, terr_nper_rtime - TERR_2PER);
+                                  2 : if (terr_nper_rtime - TERR_3PER >= 1.0) $display ("%m: at time %t ERROR: tERR(3per) violation by %f ps.", $time, terr_nper_rtime - TERR_3PER);
+                                  3 : if (terr_nper_rtime - TERR_4PER >= 1.0) $display ("%m: at time %t ERROR: tERR(4per) violation by %f ps.", $time, terr_nper_rtime - TERR_4PER);
+                                  4 : if (terr_nper_rtime - TERR_5PER >= 1.0) $display ("%m: at time %t ERROR: tERR(5per) violation by %f ps.", $time, terr_nper_rtime - TERR_5PER);
+                          5,6,7,8,9 : if (terr_nper_rtime - TERR_N1PER >= 1.0) $display ("%m: at time %t ERROR: tERR(n1per) violation by %f ps.", $time, terr_nper_rtime - TERR_N1PER);
+                            default : if (terr_nper_rtime - TERR_N2PER >= 1.0) $display ("%m: at time %t ERROR: tERR(n2per) violation by %f ps.", $time, terr_nper_rtime - TERR_N2PER);
+                        endcase
+                    end
+
+                    // check tCK min/max/jitter
+                    if (abs_value(tjit_per_rtime) - TJIT_PER >= 1.0) 
+                        $display ("%m: at time %t ERROR: tJIT(per) violation by %f ps.", $time, abs_value(tjit_per_rtime) - TJIT_PER);
+                    if (abs_value(tjit_cc_time) - TJIT_CC >= 1.0) 
+                        $display ("%m: at time %t ERROR: tJIT(cc) violation by %f ps.", $time, abs_value(tjit_cc_time) - TJIT_CC);
+                    if (TCK_MIN - tck_avg >= 1.0)
+                        $display ("%m: at time %t ERROR: tCK(avg) minimum violation by %f ps.", $time, TCK_MIN - tck_avg);
+                    if (tck_avg - TCK_MAX >= 1.0) 
+                        $display ("%m: at time %t ERROR: tCK(avg) maximum violation by %f ps.", $time, tck_avg - TCK_MAX);
+                    if (tm_ck_pos + TCK_MIN - TJIT_PER > $time) 
+                        $display ("%m: at time %t ERROR: tCK(abs) minimum violation by %t", $time, tm_ck_pos + TCK_MIN - TJIT_PER - $time);
+                    if (tm_ck_pos + TCK_MAX + TJIT_PER < $time) 
+                        $display ("%m: at time %t ERROR: tCK(abs) maximum violation by %t", $time, $time - tm_ck_pos - TCK_MAX - TJIT_PER);
+
+                    // check tCL
+                    if (tm_ck_neg + TCL_MIN*tck_avg - TJIT_DUTY > $time) 
+                        $display ("%m: at time %t ERROR: tCL(abs) minimum violation on CLK by %t", $time, tm_ck_neg + TCL_MIN*tck_avg - TJIT_DUTY - $time);
+                    if (tm_ck_neg + TCL_MAX*tck_avg + TJIT_DUTY < $time) 
+                        $display ("%m: at time %t ERROR: tCL(abs) maximum violation on CLK by %t", $time, $time - tm_ck_neg - TCL_MAX*tck_avg - TJIT_DUTY);
+                    if (tcl_avg < TCL_MIN*tck_avg) 
+                        $display ("%m: at time %t ERROR: tCL(avg) minimum violation on CLK by %t", $time, TCL_MIN*tck_avg - tcl_avg);
+                    if (tcl_avg > TCL_MAX*tck_avg) 
+                        $display ("%m: at time %t ERROR: tCL(avg) maximum violation on CLK by %t", $time, tcl_avg - TCL_MAX*tck_avg);
+                end
+
+                // calculate the tch avg jitter
+                tch_avg = tch_avg - tch_sample[ck_cntr%TDLLK]/$itor(TDLLK);
+                tch_avg = tch_avg + tch_i/$itor(TDLLK);
+                tch_sample[ck_cntr%TDLLK] = tch_i;
+
+                // update timers/counters
+                tcl_i <= $time - tm_ck_neg;
+            end
+
+            prev_odt <= odt_in;
+            // update timers/counters
+            ck_cntr <= ck_cntr + 1;
+            tm_ck_pos <= $time;
+        end else begin
+            // clk pin is disabled during self refresh
+            if (!in_self_refresh) begin
+                if (dll_locked) begin
+                    if (tm_ck_pos + TCH_MIN*tck_avg - TJIT_DUTY > $time) 
+                        $display ("%m: at time %t ERROR: tCH(abs) minimum violation on CLK by %t", $time, tm_ck_pos + TCH_MIN*tck_avg - TJIT_DUTY + $time);
+                    if (tm_ck_pos + TCH_MAX*tck_avg + TJIT_DUTY < $time) 
+                        $display ("%m: at time %t ERROR: tCH(abs) maximum violation on CLK by %t", $time, $time - tm_ck_pos - TCH_MAX*tck_avg - TJIT_DUTY);
+                    if (tch_avg < TCH_MIN*tck_avg) 
+                        $display ("%m: at time %t ERROR: tCH(avg) minimum violation on CLK by %t", $time, TCH_MIN*tck_avg - tch_avg);
+                    if (tch_avg > TCH_MAX*tck_avg) 
+                        $display ("%m: at time %t ERROR: tCH(avg) maximum violation on CLK by %t", $time, tch_avg - TCH_MAX*tck_avg);
+                end
+
+                // calculate the tcl avg jitter
+                tcl_avg = tcl_avg - tcl_sample[ck_cntr%TDLLK]/$itor(TDLLK);
+                tcl_avg = tcl_avg + tcl_i/$itor(TDLLK);
+                tcl_sample[ck_cntr%TDLLK] = tcl_i;
+
+                // update timers/counters
+                tch_i <= $time - tm_ck_pos;
+            end
+            tm_ck_neg <= $time;
+        end
+
+        // on die termination
+        if (odt_en) begin
+            // clk pin is disabled during self refresh
+            if (!in_self_refresh && diff_ck) begin
+                if ($time - tm_odt < TIS) begin
+                    $display ("%m: at time %t ERROR: tIS violation on ODT by %t", $time, tm_odt + TIS - $time);
+                end
+                if (prev_odt ^ odt_in) begin
+                    if (!dll_locked)
+                        $display ("%m: at time %t WARNING: tDLLK violation during ODT transition.", $time);
+                    if (odt_in && ($time - tm_odt_en  < TMOD))
+                        $display ("%m: at time %t ERROR:  tMOD violation during ODT transition", $time);
+                    if ($time - tm_self_refresh < TXSNR)
+                        $display ("%m: at time %t ERROR: tXSNR violation during ODT transition", $time);
+                    if (in_self_refresh)
+                        $display ("%m: at time %t ERROR:  Illegal ODT transition during Self Refresh.", $time);
+
+                    // async ODT mode applies:
+                    // 1.) during active power down with slow exit
+                    // 2.) during precharge power down
+                    // 3.) if tANPD has not been satisfied
+                    // 4.) until tAXPD has been satisfied
+                    if ((in_power_down && (low_power || (active_bank == 0))) || (ck_cntr - ck_slow_exit_pd < TAXPD)) begin
+                        if (ck_cntr - ck_slow_exit_pd < TAXPD)
+                            $display ("%m: at time %t WARNING: tAXPD violation during ODT transition.  Synchronous or asynchronous change in termination resistance is possible.", $time);
+                        if (odt_in) begin
+                            if (DEBUG) $display ("%m: at time %t INFO: Async On Die Termination = %d", $time + TAONPD, 1'b1);
+                            odt_state <= #(TAONPD) 1'b1;
+                        end else begin
+                            if (DEBUG) $display ("%m: at time %t INFO: Async On Die Termination = %d", $time + TAOFPD, 1'b0);
+                            odt_state <= #(TAOFPD) 1'b0;
+                        end
+                    // sync ODT mode applies:
+                    // 1.) during normal operation
+                    // 2.) during active power down with fast exit
+                    end else begin
+                        if (odt_in) begin
+                            i = TAOND*2;
+                            odt_pipeline[i] = 1'b1;
+                        end else begin
+                            i = TAOFD*2;
+                            odt_pipeline[i] = 1'b1;
+                        end
+                    end
+                    ck_odt <= ck_cntr;
+                end
+            end
+            if (odt_pipeline[0]) begin
+                odt_state = ~odt_state;
+                if (DEBUG) $display ("%m: at time %t INFO: Sync On Die Termination = %d", $time, odt_state);
+            end
+        end
+
+        // shift pipelines
+        if (|wr_pipeline || |rd_pipeline || |al_pipeline) begin
+            al_pipeline = al_pipeline>>1;
+            wr_pipeline = wr_pipeline>>1;
+            rd_pipeline = rd_pipeline>>1;
+            for (i=0; i<`MAX_PIPE; i=i+1) begin
+                ba_pipeline[i] = ba_pipeline[i+1];
+                row_pipeline[i] = row_pipeline[i+1];
+                col_pipeline[i] = col_pipeline[i+1];
+            end
+        end
+        if (|odt_pipeline) begin
+            odt_pipeline = odt_pipeline>>1;
+        end
+    end
+
+    // receiver(s)
+    task dqs_even_receiver;
+        input [4:0] i;
+        reg [71:0] bit_mask;
+        begin
+            bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS);
+            if (dqs_even[i]) begin
+                if (rdqs_en) begin // rdqs disables dm
+                    dm_in_pos[i] = 1'b0;
+                end else begin
+                    dm_in_pos[i] = dm_in[i];
+                end
+                dq_in_pos = (dq_in & bit_mask) | (dq_in_pos & ~bit_mask);
+            end
+        end
+    endtask
+
+    always @(posedge dqs_even[ 0]) dqs_even_receiver( 0);
+    always @(posedge dqs_even[ 1]) dqs_even_receiver( 1);
+    always @(posedge dqs_even[ 2]) dqs_even_receiver( 2);
+    always @(posedge dqs_even[ 3]) dqs_even_receiver( 3);
+    always @(posedge dqs_even[ 4]) dqs_even_receiver( 4);
+    always @(posedge dqs_even[ 5]) dqs_even_receiver( 5);
+    always @(posedge dqs_even[ 6]) dqs_even_receiver( 6);
+    always @(posedge dqs_even[ 7]) dqs_even_receiver( 7);
+    always @(posedge dqs_even[ 8]) dqs_even_receiver( 8);
+    always @(posedge dqs_even[ 9]) dqs_even_receiver( 9);
+    always @(posedge dqs_even[10]) dqs_even_receiver(10);
+    always @(posedge dqs_even[11]) dqs_even_receiver(11);
+    always @(posedge dqs_even[12]) dqs_even_receiver(12);
+    always @(posedge dqs_even[13]) dqs_even_receiver(13);
+    always @(posedge dqs_even[14]) dqs_even_receiver(14);
+    always @(posedge dqs_even[15]) dqs_even_receiver(15);
+    always @(posedge dqs_even[16]) dqs_even_receiver(16);
+    always @(posedge dqs_even[17]) dqs_even_receiver(17);
+
+    task dqs_odd_receiver;
+        input [4:0] i;
+        reg [71:0] bit_mask;
+        begin
+            bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS);
+            if (dqs_odd[i]) begin
+                if (rdqs_en) begin // rdqs disables dm
+                    dm_in_neg[i] = 1'b0;
+                end else begin
+                    dm_in_neg[i] = dm_in[i];
+                end
+                dq_in_neg = (dq_in & bit_mask) | (dq_in_neg & ~bit_mask);
+            end
+        end
+    endtask
+
+    always @(posedge dqs_odd[ 0]) dqs_odd_receiver( 0);
+    always @(posedge dqs_odd[ 1]) dqs_odd_receiver( 1);
+    always @(posedge dqs_odd[ 2]) dqs_odd_receiver( 2);
+    always @(posedge dqs_odd[ 3]) dqs_odd_receiver( 3);
+    always @(posedge dqs_odd[ 4]) dqs_odd_receiver( 4);
+    always @(posedge dqs_odd[ 5]) dqs_odd_receiver( 5);
+    always @(posedge dqs_odd[ 6]) dqs_odd_receiver( 6);
+    always @(posedge dqs_odd[ 7]) dqs_odd_receiver( 7);
+    always @(posedge dqs_odd[ 8]) dqs_odd_receiver( 8);
+    always @(posedge dqs_odd[ 9]) dqs_odd_receiver( 9);
+    always @(posedge dqs_odd[10]) dqs_odd_receiver(10);
+    always @(posedge dqs_odd[11]) dqs_odd_receiver(11);
+    always @(posedge dqs_odd[12]) dqs_odd_receiver(12);
+    always @(posedge dqs_odd[13]) dqs_odd_receiver(13);
+    always @(posedge dqs_odd[14]) dqs_odd_receiver(14);
+    always @(posedge dqs_odd[15]) dqs_odd_receiver(15);
+    always @(posedge dqs_odd[16]) dqs_odd_receiver(16);
+    always @(posedge dqs_odd[17]) dqs_odd_receiver(17);
+ 
+    // Processes to check hold and pulse width of control signals
+    always @(cke_in) begin
+        if ($time > TIH) begin
+            if ($time - tm_ck_pos < TIH) 
+                $display ("%m: at time %t ERROR:  tIH violation on CKE by %t", $time, tm_ck_pos + TIH - $time);
+        end
+        if (dll_locked && ($time - tm_cke < $rtoi(TIPW*tck_avg)))
+            $display ("%m: at time %t ERROR: tIPW violation on CKE by %t", $time, tm_cke + TIPW*tck_avg - $time);
+        tm_cke = $time;
+    end
+    always @(odt_in) begin
+        if (odt_en && !in_self_refresh) begin
+            if ($time - tm_ck_pos < TIH) 
+                $display ("%m: at time %t ERROR:  tIH violation on ODT by %t", $time, tm_ck_pos + TIH - $time);
+            if (dll_locked && ($time - tm_odt < $rtoi(TIPW*tck_avg)))
+                $display ("%m: at time %t ERROR: tIPW violation on ODT by %t", $time, tm_odt + TIPW*tck_avg - $time);
+        end
+        tm_odt = $time;
+    end
+
+    task cmd_addr_timing_check;
+    input i;
+    reg [4:0] i;
+    begin
+        if (prev_cke) begin
+            if ((i == 0) && ($time - tm_ck_pos < TIH))                      // Always check tIH for CS#
+                $display ("%m: at time %t ERROR:  tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time);
+            if ((i > 0) && (cs_n_in == 1'b0) && ($time - tm_ck_pos < TIH))  // Only check tIH for cmd_addr if CS# low
+                $display ("%m: at time %t ERROR:  tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time);
+            if (dll_locked && ($time - tm_cmd_addr[i] < $rtoi(TIPW*tck_avg)))
+                $display ("%m: at time %t ERROR: tIPW violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIPW*tck_avg - $time);
+        end
+        tm_cmd_addr[i] = $time;
+    end
+    endtask
+
+    always @(cs_n_in    ) cmd_addr_timing_check( 0);
+    always @(ras_n_in   ) cmd_addr_timing_check( 1);
+    always @(cas_n_in   ) cmd_addr_timing_check( 2);
+    always @(we_n_in    ) cmd_addr_timing_check( 3);
+    always @(ba_in  [ 0]) cmd_addr_timing_check( 4);
+    always @(ba_in  [ 1]) cmd_addr_timing_check( 5);
+    always @(ba_in  [ 2]) cmd_addr_timing_check( 6);
+    always @(addr_in[ 0]) cmd_addr_timing_check( 7);
+    always @(addr_in[ 1]) cmd_addr_timing_check( 8);
+    always @(addr_in[ 2]) cmd_addr_timing_check( 9);
+    always @(addr_in[ 3]) cmd_addr_timing_check(10);
+    always @(addr_in[ 4]) cmd_addr_timing_check(11);
+    always @(addr_in[ 5]) cmd_addr_timing_check(12);
+    always @(addr_in[ 6]) cmd_addr_timing_check(13);
+    always @(addr_in[ 7]) cmd_addr_timing_check(14);
+    always @(addr_in[ 8]) cmd_addr_timing_check(15);
+    always @(addr_in[ 9]) cmd_addr_timing_check(16);
+    always @(addr_in[10]) cmd_addr_timing_check(17);
+    always @(addr_in[11]) cmd_addr_timing_check(18);
+    always @(addr_in[12]) cmd_addr_timing_check(19);
+    always @(addr_in[13]) cmd_addr_timing_check(20);
+    always @(addr_in[14]) cmd_addr_timing_check(21);
+    always @(addr_in[15]) cmd_addr_timing_check(22);
+
+    // Processes to check setup and hold of data signals
+    task dm_timing_check;
+    input i;
+    reg [4:0] i;
+    begin
+        if (dqs_in_valid) begin
+            if ($time - tm_dqs[i] < TDH) 
+                $display ("%m: at time %t ERROR:   tDH violation on DM bit %d by %t", $time, i, tm_dqs[i] + TDH - $time);
+            if (check_dm_tdipw[i]) begin
+                if (dll_locked && ($time - tm_dm[i] < $rtoi(TDIPW*tck_avg)))
+                    $display ("%m: at time %t ERROR: tDIPW violation on DM bit %d by %t", $time, i, tm_dm[i] + TDIPW*tck_avg - $time);
+            end
+        end
+        check_dm_tdipw[i] <= 1'b0;
+        tm_dm[i] = $time;
+    end
+    endtask
+
+    always @(dm_in[ 0]) dm_timing_check( 0);
+    always @(dm_in[ 1]) dm_timing_check( 1);
+    always @(dm_in[ 2]) dm_timing_check( 2);
+    always @(dm_in[ 3]) dm_timing_check( 3);
+    always @(dm_in[ 4]) dm_timing_check( 4);
+    always @(dm_in[ 5]) dm_timing_check( 5);
+    always @(dm_in[ 6]) dm_timing_check( 6);
+    always @(dm_in[ 7]) dm_timing_check( 7);
+    always @(dm_in[ 8]) dm_timing_check( 8);
+    always @(dm_in[ 9]) dm_timing_check( 9);
+    always @(dm_in[10]) dm_timing_check(10);
+    always @(dm_in[11]) dm_timing_check(11);
+    always @(dm_in[12]) dm_timing_check(12);
+    always @(dm_in[13]) dm_timing_check(13);
+    always @(dm_in[14]) dm_timing_check(14);
+    always @(dm_in[15]) dm_timing_check(15);
+    always @(dm_in[16]) dm_timing_check(16);
+    always @(dm_in[17]) dm_timing_check(17);
+
+    task dq_timing_check;
+    input i;
+    reg [6:0] i;
+    begin
+        if (dqs_in_valid) begin
+            if ($time - tm_dqs[i/`DQ_PER_DQS] < TDH) 
+                $display ("%m: at time %t ERROR:   tDH violation on DQ bit %d by %t", $time, i, tm_dqs[i/`DQ_PER_DQS] + TDH - $time);
+            if (check_dq_tdipw[i]) begin
+                if (dll_locked && ($time - tm_dq[i] < $rtoi(TDIPW*tck_avg)))
+                    $display ("%m: at time %t ERROR: tDIPW violation on DQ bit %d by %t", $time, i, tm_dq[i] + TDIPW*tck_avg - $time);
+            end
+        end
+        check_dq_tdipw[i] <= 1'b0;
+        tm_dq[i] = $time;
+    end 
+    endtask
+
+    always @(dq_in[ 0]) dq_timing_check( 0);
+    always @(dq_in[ 1]) dq_timing_check( 1);
+    always @(dq_in[ 2]) dq_timing_check( 2);
+    always @(dq_in[ 3]) dq_timing_check( 3);
+    always @(dq_in[ 4]) dq_timing_check( 4);
+    always @(dq_in[ 5]) dq_timing_check( 5);
+    always @(dq_in[ 6]) dq_timing_check( 6);
+    always @(dq_in[ 7]) dq_timing_check( 7);
+    always @(dq_in[ 8]) dq_timing_check( 8);
+    always @(dq_in[ 9]) dq_timing_check( 9);
+    always @(dq_in[10]) dq_timing_check(10);
+    always @(dq_in[11]) dq_timing_check(11);
+    always @(dq_in[12]) dq_timing_check(12);
+    always @(dq_in[13]) dq_timing_check(13);
+    always @(dq_in[14]) dq_timing_check(14);
+    always @(dq_in[15]) dq_timing_check(15);
+    always @(dq_in[16]) dq_timing_check(16);
+    always @(dq_in[17]) dq_timing_check(17);
+    always @(dq_in[18]) dq_timing_check(18);
+    always @(dq_in[19]) dq_timing_check(19);
+    always @(dq_in[20]) dq_timing_check(20);
+    always @(dq_in[21]) dq_timing_check(21);
+    always @(dq_in[22]) dq_timing_check(22);
+    always @(dq_in[23]) dq_timing_check(23);
+    always @(dq_in[24]) dq_timing_check(24);
+    always @(dq_in[25]) dq_timing_check(25);
+    always @(dq_in[26]) dq_timing_check(26);
+    always @(dq_in[27]) dq_timing_check(27);
+    always @(dq_in[28]) dq_timing_check(28);
+    always @(dq_in[29]) dq_timing_check(29);
+    always @(dq_in[30]) dq_timing_check(30);
+    always @(dq_in[31]) dq_timing_check(31);
+    always @(dq_in[32]) dq_timing_check(32);
+    always @(dq_in[33]) dq_timing_check(33);
+    always @(dq_in[34]) dq_timing_check(34);
+    always @(dq_in[35]) dq_timing_check(35);
+    always @(dq_in[36]) dq_timing_check(36);
+    always @(dq_in[37]) dq_timing_check(37);
+    always @(dq_in[38]) dq_timing_check(38);
+    always @(dq_in[39]) dq_timing_check(39);
+    always @(dq_in[40]) dq_timing_check(40);
+    always @(dq_in[41]) dq_timing_check(41);
+    always @(dq_in[42]) dq_timing_check(42);
+    always @(dq_in[43]) dq_timing_check(43);
+    always @(dq_in[44]) dq_timing_check(44);
+    always @(dq_in[45]) dq_timing_check(45);
+    always @(dq_in[46]) dq_timing_check(46);
+    always @(dq_in[47]) dq_timing_check(47);
+    always @(dq_in[48]) dq_timing_check(48);
+    always @(dq_in[49]) dq_timing_check(49);
+    always @(dq_in[50]) dq_timing_check(50);
+    always @(dq_in[51]) dq_timing_check(51);
+    always @(dq_in[52]) dq_timing_check(52);
+    always @(dq_in[53]) dq_timing_check(53);
+    always @(dq_in[54]) dq_timing_check(54);
+    always @(dq_in[55]) dq_timing_check(55);
+    always @(dq_in[56]) dq_timing_check(56);
+    always @(dq_in[57]) dq_timing_check(57);
+    always @(dq_in[58]) dq_timing_check(58);
+    always @(dq_in[59]) dq_timing_check(59);
+    always @(dq_in[60]) dq_timing_check(60);
+    always @(dq_in[61]) dq_timing_check(61);
+    always @(dq_in[62]) dq_timing_check(62);
+    always @(dq_in[63]) dq_timing_check(63);
+    always @(dq_in[64]) dq_timing_check(64);
+    always @(dq_in[65]) dq_timing_check(65);
+    always @(dq_in[66]) dq_timing_check(66);
+    always @(dq_in[67]) dq_timing_check(67);
+    always @(dq_in[68]) dq_timing_check(68);
+    always @(dq_in[69]) dq_timing_check(69);
+    always @(dq_in[70]) dq_timing_check(70);
+    always @(dq_in[71]) dq_timing_check(71);
+
+    task dqs_pos_timing_check;
+    input i;
+    reg [5:0] i;
+    reg [3:0] j;
+    begin
+        if (dqs_in_valid && ((wdqs_pos_cntr[i] < burst_length/2) || b2b_write) && (dqs_n_en || i<18)) begin
+            if (dqs_in[i] ^ prev_dqs_in[i]) begin
+                if (dll_locked) begin
+                    if (check_write_preamble[i]) begin
+                        if ($time - tm_dqs_neg[i] < $rtoi(TWPRE*tck_avg))
+                            $display ("%m: at time %t ERROR: tWPRE violation on &s bit %d", $time, dqs_string[i/18], i%18);
+                    end else if (check_write_postamble[i]) begin
+                        if ($time - tm_dqs_neg[i] < $rtoi(TWPST*tck_avg))
+                            $display ("%m: at time %t ERROR: tWPST violation on %s bit %d", $time, dqs_string[i/18], i%18);
+                    end else begin
+                        if ($time - tm_dqs_neg[i] < $rtoi(TDQSL*tck_avg))
+                            $display ("%m: at time %t ERROR: tDQSL violation on %s bit %d", $time, dqs_string[i/18], i%18);
+                    end
+                end
+                if ($time - tm_dm[i%18] < TDS) 
+                    $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i,  tm_dm[i%18] + TDS - $time);
+                if (!dq_out_en) begin
+                    for (j=0; j<`DQ_PER_DQS; j=j+1) begin
+                        if ($time - tm_dq[i*`DQ_PER_DQS+j] < TDS) 
+                            $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[i*`DQ_PER_DQS+j] + TDS - $time);
+                        check_dq_tdipw[i*`DQ_PER_DQS+j] <= 1'b1;
+                    end
+                end
+                if ((wdqs_pos_cntr[i] < burst_length/2) && !b2b_write) begin
+                    wdqs_pos_cntr[i] <= wdqs_pos_cntr[i] + 1;
+                end else begin
+                    wdqs_pos_cntr[i] <= 1;
+                end
+                check_dm_tdipw[i%18] <= 1'b1;
+                check_write_preamble[i] <= 1'b0;
+                check_write_postamble[i] <= 1'b0;
+                check_write_dqs_low[i] <= 1'b0;
+                tm_dqs[i%18] <= $time;
+            end else begin
+                $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/18], i%18);
+            end
+        end
+        tm_dqss_pos[i] <= $time;
+        tm_dqs_pos[i] = $time;
+        prev_dqs_in[i] <= dqs_in[i];
+    end
+    endtask
+
+    always @(posedge dqs_in[ 0]) dqs_pos_timing_check( 0);
+    always @(posedge dqs_in[ 1]) dqs_pos_timing_check( 1);
+    always @(posedge dqs_in[ 2]) dqs_pos_timing_check( 2);
+    always @(posedge dqs_in[ 3]) dqs_pos_timing_check( 3);
+    always @(posedge dqs_in[ 4]) dqs_pos_timing_check( 4);
+    always @(posedge dqs_in[ 5]) dqs_pos_timing_check( 5);
+    always @(posedge dqs_in[ 6]) dqs_pos_timing_check( 6);
+    always @(posedge dqs_in[ 7]) dqs_pos_timing_check( 7);
+    always @(posedge dqs_in[ 8]) dqs_pos_timing_check( 8);
+    always @(posedge dqs_in[ 9]) dqs_pos_timing_check( 9);
+    always @(posedge dqs_in[10]) dqs_pos_timing_check(10);
+    always @(posedge dqs_in[11]) dqs_pos_timing_check(11);
+    always @(posedge dqs_in[12]) dqs_pos_timing_check(12);
+    always @(posedge dqs_in[13]) dqs_pos_timing_check(13);
+    always @(posedge dqs_in[14]) dqs_pos_timing_check(14);
+    always @(posedge dqs_in[15]) dqs_pos_timing_check(15);
+    always @(posedge dqs_in[16]) dqs_pos_timing_check(16);
+    always @(posedge dqs_in[17]) dqs_pos_timing_check(17);
+    always @(negedge dqs_in[18]) dqs_pos_timing_check(18);
+    always @(negedge dqs_in[19]) dqs_pos_timing_check(19);
+    always @(negedge dqs_in[20]) dqs_pos_timing_check(20);
+    always @(negedge dqs_in[21]) dqs_pos_timing_check(21);
+    always @(negedge dqs_in[22]) dqs_pos_timing_check(22);
+    always @(negedge dqs_in[23]) dqs_pos_timing_check(23);
+    always @(negedge dqs_in[24]) dqs_pos_timing_check(24);
+    always @(negedge dqs_in[25]) dqs_pos_timing_check(25);
+    always @(negedge dqs_in[26]) dqs_pos_timing_check(26);
+    always @(negedge dqs_in[27]) dqs_pos_timing_check(27);
+    always @(negedge dqs_in[28]) dqs_pos_timing_check(28);
+    always @(negedge dqs_in[29]) dqs_pos_timing_check(29);
+    always @(negedge dqs_in[30]) dqs_pos_timing_check(30);
+    always @(negedge dqs_in[31]) dqs_pos_timing_check(31);
+    always @(negedge dqs_in[32]) dqs_neg_timing_check(32);
+    always @(negedge dqs_in[33]) dqs_neg_timing_check(33);
+    always @(negedge dqs_in[34]) dqs_neg_timing_check(34);
+    always @(negedge dqs_in[35]) dqs_neg_timing_check(35);
+
+    task dqs_neg_timing_check;
+    input i;
+    reg [5:0] i;
+    reg [3:0] j;
+    begin
+        if (dqs_in_valid && (wdqs_pos_cntr[i] > 0) && check_write_dqs_high[i] && (dqs_n_en || i < 18)) begin
+            if (dqs_in[i] ^ prev_dqs_in[i]) begin
+                if (dll_locked) begin
+                    if ($time - tm_dqs_pos[i] < $rtoi(TDQSH*tck_avg))
+                        $display ("%m: at time %t ERROR: tDQSH violation on %s bit %d", $time, dqs_string[i/18], i%18);
+                    if ($time - tm_ck_pos < $rtoi(TDSH*tck_avg))
+                        $display ("%m: at time %t ERROR: tDSH violation on %s bit %d", $time, dqs_string[i/18], i%18); 
+                end
+                if ($time - tm_dm[i%18] < TDS) 
+                    $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i,  tm_dm[i%18] + TDS - $time);
+                if (!dq_out_en) begin
+                    for (j=0; j<`DQ_PER_DQS; j=j+1) begin
+                        if ($time - tm_dq[i*`DQ_PER_DQS+j] < TDS) 
+                            $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[i*`DQ_PER_DQS+j] + TDS - $time);
+                        check_dq_tdipw[i*`DQ_PER_DQS+j] <= 1'b1;
+                    end
+                end
+                check_dm_tdipw[i%18] <= 1'b1;
+                check_write_dqs_high[i] <= 1'b0;
+                tm_dqs[i%18] <= $time;
+            end else begin
+                $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/18], i%18);
+            end
+        end
+        tm_dqs_neg[i] = $time;
+        prev_dqs_in[i] <= dqs_in[i];
+    end
+    endtask
+
+    always @(negedge dqs_in[ 0]) dqs_neg_timing_check( 0);
+    always @(negedge dqs_in[ 1]) dqs_neg_timing_check( 1);
+    always @(negedge dqs_in[ 2]) dqs_neg_timing_check( 2);
+    always @(negedge dqs_in[ 3]) dqs_neg_timing_check( 3);
+    always @(negedge dqs_in[ 4]) dqs_neg_timing_check( 4);
+    always @(negedge dqs_in[ 5]) dqs_neg_timing_check( 5);
+    always @(negedge dqs_in[ 6]) dqs_neg_timing_check( 6);
+    always @(negedge dqs_in[ 7]) dqs_neg_timing_check( 7);
+    always @(negedge dqs_in[ 8]) dqs_neg_timing_check( 8);
+    always @(negedge dqs_in[ 9]) dqs_neg_timing_check( 9);
+    always @(negedge dqs_in[10]) dqs_neg_timing_check(10);
+    always @(negedge dqs_in[11]) dqs_neg_timing_check(11);
+    always @(negedge dqs_in[12]) dqs_neg_timing_check(12);
+    always @(negedge dqs_in[13]) dqs_neg_timing_check(13);
+    always @(negedge dqs_in[14]) dqs_neg_timing_check(14);
+    always @(negedge dqs_in[15]) dqs_neg_timing_check(15);
+    always @(negedge dqs_in[16]) dqs_neg_timing_check(16);
+    always @(negedge dqs_in[17]) dqs_neg_timing_check(17);
+    always @(posedge dqs_in[18]) dqs_neg_timing_check(18);
+    always @(posedge dqs_in[19]) dqs_neg_timing_check(19);
+    always @(posedge dqs_in[20]) dqs_neg_timing_check(20);
+    always @(posedge dqs_in[21]) dqs_neg_timing_check(21);
+    always @(posedge dqs_in[22]) dqs_neg_timing_check(22);
+    always @(posedge dqs_in[23]) dqs_neg_timing_check(23);
+    always @(posedge dqs_in[24]) dqs_neg_timing_check(24);
+    always @(posedge dqs_in[25]) dqs_neg_timing_check(25);
+    always @(posedge dqs_in[26]) dqs_neg_timing_check(26);
+    always @(posedge dqs_in[27]) dqs_neg_timing_check(27);
+    always @(posedge dqs_in[28]) dqs_neg_timing_check(28);
+    always @(posedge dqs_in[29]) dqs_neg_timing_check(29);
+    always @(posedge dqs_in[30]) dqs_neg_timing_check(30);
+    always @(posedge dqs_in[31]) dqs_neg_timing_check(31);
+    always @(posedge dqs_in[32]) dqs_neg_timing_check(32);
+    always @(posedge dqs_in[33]) dqs_neg_timing_check(33);
+    always @(posedge dqs_in[34]) dqs_neg_timing_check(34);
+    always @(posedge dqs_in[35]) dqs_neg_timing_check(35);
+
+endmodule
Index: trunk/sim/sim_tb_top.vhd
===================================================================
--- trunk/sim/sim_tb_top.vhd	(revision 10)
+++ trunk/sim/sim_tb_top.vhd	(revision 10)
@@ -0,0 +1,739 @@
+--*****************************************************************************
+-- DISCLAIMER OF LIABILITY
+--
+-- This file contains proprietary and confidential information of
+-- Xilinx, Inc. ("Xilinx"), that is distributed under a license
+-- from Xilinx, and may be used, copied and/or disclosed only
+-- pursuant to the terms of a valid license agreement with Xilinx.
+--
+-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+-- ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+-- EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+-- LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+-- MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+-- does not warrant that functions included in the Materials will
+-- meet the requirements of Licensee, or that the operation of the
+-- Materials will be uninterrupted or error-free, or that defects
+-- in the Materials will be corrected. Furthermore, Xilinx does
+-- not warrant or make any representations regarding use, or the
+-- results of the use, of the Materials in terms of correctness,
+-- accuracy, reliability or otherwise.
+--
+-- Xilinx products are not designed or intended to be fail-safe,
+-- or for use in any application requiring fail-safe performance,
+-- such as life-support or safety devices or systems, Class III
+-- medical devices, nuclear facilities, applications related to
+-- the deployment of airbags, or any other applications that could
+-- lead to death, personal injury or severe property or
+-- environmental damage (individually and collectively, "critical
+-- applications"). Customer assumes the sole risk and liability
+-- of any use of Xilinx products in critical applications,
+-- subject only to applicable laws and regulations governing
+-- limitations on product liability.
+--
+-- Copyright 2006, 2007, 2008 Xilinx, Inc.
+-- All rights reserved.
+--
+-- This disclaimer and copyright notice must be retained as part
+-- of this file at all times.
+--*****************************************************************************
+--   ____  ____
+--  /   /\/   /
+-- /___/  \  /   Vendor             : Xilinx
+-- \   \   \/    Version            : 3.6
+--  \   \        Application        : MIG
+--  /   /        Filename           : sim_tb_top.vhd
+-- /___/   /\    Date Last Modified : $Date: 2010/06/29 12:03:42 $
+-- \   \  /  \   Date Created       : Mon May 14 2007
+--  \___\/\___\
+--
+-- Device      : Virtex-5
+-- Design Name : DDR2
+-- Purpose     : This is the simulation testbench which is used to verify the
+--               design. The basic clocks and resets to the interface are
+--               generated here. This also connects the memory interface to the
+--               memory model.
+-- Reference:
+-- Revision History:
+--*****************************************************************************
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+library unisim;
+use unisim.vcomponents.all;
+
+entity sim_tb_top is
+
+end entity sim_tb_top;
+
+architecture arch of sim_tb_top is
+
+  -- memory controller parameters
+  constant BANK_WIDTH            : integer := 2;      -- # of memory bank addr bits
+  constant CKE_WIDTH             : integer := 1;      -- # of memory clock enable outputs
+  constant CLK_WIDTH             : integer := 1;      -- # of clock outputs
+  constant CLK_TYPE              : string  := "SINGLE_ENDED";       -- # of clock type
+  constant COL_WIDTH             : integer := 10;     -- # of memory column bits
+  constant CS_NUM                : integer := 1;      -- # of separate memory chip selects
+  constant CS_WIDTH              : integer := 1;      -- # of total memory chip selects
+  constant CS_BITS               : integer := 0;      -- set to log2(CS_NUM) (rounded up)
+  constant DM_WIDTH              : integer := 9;      -- # of data mask bits
+  constant DQ_WIDTH              : integer := 72;     -- # of data width
+  constant DQ_PER_DQS            : integer := 8;      -- # of DQ data bits per strobe
+  constant DQ_BITS               : integer := 7;      -- set to log2(DQS_WIDTH*DQ_PER_DQS)
+  constant DQS_WIDTH             : integer := 9;      -- # of DQS strobes
+  constant DQS_BITS              : integer := 4;      -- set to log2(DQS_WIDTH)
+  constant HIGH_PERFORMANCE_MODE : boolean := TRUE; -- Sets the performance mode for IODELAY elements
+  constant ODT_WIDTH             : integer := 1;      -- # of memory on-die term enables
+  constant ROW_WIDTH             : integer := 14;     -- # of memory row & # of addr bits
+  constant APPDATA_WIDTH         : integer := 144;     -- # of usr read/write data bus bits
+  constant ADDITIVE_LAT          : integer := 0;      -- additive write latency
+  constant BURST_LEN             : integer := 4;      -- burst length (in double words)
+  constant BURST_TYPE            : integer := 0;      -- burst type (=0 seq; =1 interlved)
+  constant CAS_LAT               : integer := 3;      -- CAS latency
+  constant ECC_ENABLE            : integer := 0;      -- enable ECC (=1 enable)
+  constant MULTI_BANK_EN         : integer := 1;      -- enable bank management
+  constant TWO_T_TIME_EN         : integer := 1;      -- 2t timing for unbuffered dimms
+  constant ODT_TYPE              : integer := 1;      -- ODT (=0(none),=1(75),=2(150),=3(50))
+  constant REDUCE_DRV            : integer := 0;      -- reduced strength mem I/O (=1 yes)
+  constant REG_ENABLE            : integer := 0;      -- registered addr/ctrl (=1 yes)
+  constant TREFI_NS              : integer := 7800;   -- auto refresh interval (ns)
+  constant TRAS                  : integer := 40000;  -- active->precharge delay
+  constant TRCD                  : integer := 15000;  -- active->read/write delay
+  constant TRFC                  : integer := 105000;  -- ref->ref, ref->active delay
+  constant TRP                   : integer := 15000;  -- precharge->command delay
+  constant TRTP                  : integer := 7500;   -- read->precharge delay
+  constant TWR                   : integer := 15000;  -- used to determine wr->prech
+  constant TWTR                  : integer := 7500;  -- write->read delay
+  constant SIM_ONLY              : integer := 1;      -- = 0 to allow power up delay
+  constant DEBUG_EN              : integer := 0;      -- Enable debug signals/controls
+  constant RST_ACT_LOW           : integer := 1;      -- =1 for active low reset, =0 for active high
+  constant DLL_FREQ_MODE         : string  := "HIGH"; -- DCM Frequency range
+  constant CLK_PERIOD            : integer := 5000;   -- Core/Mem clk period (in ps)
+
+  constant DEVICE_WIDTH    : integer := 8;      -- Memory device data width
+  constant CLK_PERIOD_NS   : real := 5000.0 / 1000.0;
+  constant TCYC_SYS        : real := CLK_PERIOD_NS/2.0;
+  constant TCYC_SYS_0      : time := CLK_PERIOD_NS * 1 ns;
+  constant TCYC_SYS_DIV2   : time := TCYC_SYS * 1 ns;
+  constant TEMP2           : real := 5.0/2.0;
+  constant TCYC_200        : time := TEMP2 * 1 ns;
+  constant TPROP_DQS          : time := 0.01 ns;  -- Delay for DQS signal during Write Operation
+  constant TPROP_DQS_RD       : time := 0.01 ns;  -- Delay for DQS signal during Read Operation
+  constant TPROP_PCB_CTRL     : time := 0.01 ns;  -- Delay for Address and Ctrl signals
+  constant TPROP_PCB_DATA     : time := 0.01 ns;  -- Delay for data signal during Write operation
+  constant TPROP_PCB_DATA_RD  : time := 0.01 ns;  -- Delay for data signal during Read operation
+
+  
+  component dram is
+    generic (
+      BANK_WIDTH            : integer;
+      CKE_WIDTH             : integer;
+      CLK_WIDTH             : integer;
+      COL_WIDTH             : integer;
+      CS_NUM                : integer;
+      CS_WIDTH              : integer;
+      CS_BITS               : integer;
+      DM_WIDTH              : integer;
+      DQ_WIDTH              : integer;
+      DQ_PER_DQS            : integer;
+      DQ_BITS               : integer;
+      DQS_WIDTH             : integer;
+      DQS_BITS              : integer;
+      HIGH_PERFORMANCE_MODE : boolean;
+      ODT_WIDTH             : integer;
+      ROW_WIDTH             : integer;
+      APPDATA_WIDTH         : integer;
+      ADDITIVE_LAT          : integer;
+      BURST_LEN             : integer;
+      BURST_TYPE            : integer;
+      CAS_LAT               : integer;
+      ECC_ENABLE            : integer;
+      MULTI_BANK_EN         : integer;
+      ODT_TYPE              : integer;
+      REDUCE_DRV            : integer;
+      REG_ENABLE            : integer;
+      TREFI_NS              : integer;
+      TRAS                  : integer;
+      TRCD                  : integer;
+      TRFC                  : integer;
+      TRP                   : integer;
+      TRTP                  : integer;
+      TWR                   : integer;
+      TWTR                  : integer;
+      SIM_ONLY              : integer;
+      RST_ACT_LOW           : integer;
+      CLK_TYPE                     : string;
+      DLL_FREQ_MODE                : string;
+      CLK_PERIOD            : integer
+      );
+    port (
+      sys_rst_n             : in    std_logic;
+      sys_clk               : in    std_logic;
+      idly_clk_200         : in    std_logic;
+      ddr2_a                : out   std_logic_vector((ROW_WIDTH-1) downto 0);
+      ddr2_ba               : out   std_logic_vector((BANK_WIDTH-1) downto 0);
+      ddr2_ras_n            : out   std_logic;
+      ddr2_cas_n            : out   std_logic;
+      ddr2_we_n             : out   std_logic;
+      ddr2_cs_n             : out   std_logic_vector((CS_WIDTH-1) downto 0);
+      ddr2_odt              : out   std_logic_vector((ODT_WIDTH-1) downto 0);
+      ddr2_cke              : out   std_logic_vector((CKE_WIDTH-1) downto 0);
+      ddr2_ck               : out   std_logic_vector((CLK_WIDTH-1) downto 0);
+      ddr2_ck_n             : out   std_logic_vector((CLK_WIDTH-1) downto 0);
+      ddr2_dq               : inout std_logic_vector((DQ_WIDTH-1) downto 0);
+      ddr2_dqs              : inout std_logic_vector((DQS_WIDTH-1) downto 0);
+      ddr2_dqs_n            : inout std_logic_vector((DQS_WIDTH-1) downto 0);
+      ddr2_dm               : out   std_logic_vector((DM_WIDTH-1) downto 0);
+      
+      error                 : out   std_logic;
+      
+      phy_init_done         : out   std_logic
+      );
+  end component;
+
+  component ddr2_model is
+    port (
+      ck      : in    std_logic;
+      ck_n    : in    std_logic;
+      cke     : in    std_logic;
+      cs_n    : in    std_logic;
+      ras_n   : in    std_logic;
+      cas_n   : in    std_logic;
+      we_n    : in    std_logic;
+      dm_rdqs : inout std_logic_vector((DEVICE_WIDTH/16) downto 0);
+      ba      : in    std_logic_vector((BANK_WIDTH - 1) downto 0);
+      addr    : in    std_logic_vector((ROW_WIDTH - 1) downto 0);
+      dq      : inout std_logic_vector((DEVICE_WIDTH - 1) downto 0);
+      dqs     : inout std_logic_vector((DEVICE_WIDTH/16) downto 0);
+      dqs_n   : inout std_logic_vector((DEVICE_WIDTH/16) downto 0);
+      rdqs_n  : out   std_logic_vector((DEVICE_WIDTH/16) downto 0);
+      odt     : in    std_logic
+      );
+  end component;
+
+  component WireDelay
+    generic (
+      Delay_g : time;
+      Delay_rd : time);
+    port (
+      A : inout Std_Logic;
+      B : inout Std_Logic;
+     reset : in Std_Logic);
+  end component;
+
+  signal sys_clk                  : std_logic := '0';
+  signal sys_clk_n                : std_logic;
+  signal sys_clk_p                : std_logic;
+  signal sys_clk200               : std_logic:= '0';
+  signal clk200_n                 : std_logic;
+  signal clk200_p                 : std_logic;
+  signal sys_rst_n                : std_logic := '0';
+  signal sys_rst_out              : std_logic;
+  signal sys_rst_i                : std_logic;
+  signal gnd                      : std_logic_vector(1 downto 0);
+
+  signal ddr2_dq_sdram            : std_logic_vector((DQ_WIDTH - 1) downto 0);
+  signal ddr2_dqs_sdram           : std_logic_vector((DQS_WIDTH - 1) downto 0);
+  signal ddr2_dqs_n_sdram         : std_logic_vector((DQS_WIDTH - 1) downto 0);
+  signal ddr2_dm_sdram            : std_logic_vector((DM_WIDTH - 1) downto 0);
+  signal ddr2_clk_sdram           : std_logic_vector((CLK_WIDTH - 1) downto 0);
+  signal ddr2_clk_n_sdram         : std_logic_vector((CLK_WIDTH - 1) downto 0);
+  signal ddr2_address_sdram       : std_logic_vector((ROW_WIDTH - 1) downto 0);
+  signal ddr2_ba_sdram            : std_logic_vector((BANK_WIDTH - 1) downto 0);
+  signal ddr2_ras_n_sdram         : std_logic;
+  signal ddr2_cas_n_sdram         : std_logic;
+  signal ddr2_we_n_sdram          : std_logic;
+  signal ddr2_cs_n_sdram          : std_logic_vector((CS_WIDTH - 1) downto 0);
+  signal ddr2_cke_sdram           : std_logic_vector((CKE_WIDTH - 1) downto 0);
+  signal ddr2_odt_sdram           : std_logic_vector((ODT_WIDTH - 1) downto 0);
+  signal error                    : std_logic;
+  signal phy_init_done            : std_logic;
+  
+
+  -- Only RDIMM memory parts support the reset signal,
+  -- hence the ddr2_reset_n_sdram and ddr2_reset_n_fpga signals can be
+  -- ignored for other memory parts
+  signal ddr2_reset_n_sdram       : std_logic;
+  signal ddr2_reset_n_fpga        : std_logic;
+  signal ddr2_address_reg         : std_logic_vector((ROW_WIDTH - 1) downto 0);
+  signal ddr2_ba_reg              : std_logic_vector((BANK_WIDTH - 1) downto 0);
+  signal ddr2_cke_reg             : std_logic_vector((CKE_WIDTH - 1) downto 0);
+  signal ddr2_ras_n_reg           : std_logic;
+  signal ddr2_cas_n_reg           : std_logic;
+  signal ddr2_we_n_reg            : std_logic;
+  signal ddr2_cs_n_reg            : std_logic_vector((CS_WIDTH - 1) downto 0);
+  signal ddr2_odt_reg             : std_logic_vector((ODT_WIDTH - 1) downto 0);
+
+  signal dq_vector                : std_logic_vector(15 downto 0);
+  signal dqs_vector               : std_logic_vector(1 downto 0);
+  signal dqs_n_vector             : std_logic_vector(1 downto 0);
+  signal dm_vector                : std_logic_vector(1 downto 0);
+  signal command                  : std_logic_vector(2 downto 0);
+  signal enable                   : std_logic;
+  signal enable_o                 : std_logic;
+  signal ddr2_dq_fpga             : std_logic_vector((DQ_WIDTH - 1) downto 0);
+  signal ddr2_dqs_fpga            : std_logic_vector((DQS_WIDTH - 1) downto 0);
+  signal ddr2_dqs_n_fpga          : std_logic_vector((DQS_WIDTH - 1) downto 0);
+  signal ddr2_dm_fpga             : std_logic_vector((DM_WIDTH - 1) downto 0);
+  signal ddr2_clk_fpga            : std_logic_vector((CLK_WIDTH - 1) downto 0);
+  signal ddr2_clk_n_fpga          : std_logic_vector((CLK_WIDTH - 1) downto 0);
+  signal ddr2_address_fpga        : std_logic_vector((ROW_WIDTH - 1) downto 0);
+  signal ddr2_ba_fpga             : std_logic_vector((BANK_WIDTH - 1) downto 0);
+  signal ddr2_ras_n_fpga          : std_logic;
+  signal ddr2_cas_n_fpga          : std_logic;
+  signal ddr2_we_n_fpga           : std_logic;
+  signal ddr2_cs_n_fpga           : std_logic_vector((CS_WIDTH - 1) downto 0);
+  signal ddr2_cke_fpga            : std_logic_vector((CKE_WIDTH - 1) downto 0);
+  signal ddr2_odt_fpga            : std_logic_vector((ODT_WIDTH - 1) downto 0);
+  
+begin
+  gnd <= "00";
+   --***************************************************************************
+   -- Clock generation and reset
+   --***************************************************************************
+  process
+  begin
+    sys_clk <= not sys_clk;
+    wait for (TCYC_SYS_DIV2);
+  end process;
+
+   sys_clk_p <= sys_clk;
+   sys_clk_n <= not sys_clk;
+
+   process
+   begin
+     sys_clk200 <= not sys_clk200;
+     wait for (TCYC_200);
+   end process;
+
+   clk200_p <= sys_clk200;
+   clk200_n <= not sys_clk200;
+
+   process
+   begin
+      sys_rst_n <= '0';
+      wait for 200 ns;
+      sys_rst_n <= '1';
+      wait;
+   end process;
+
+  sys_rst_i   <=  not sys_rst_n;
+  sys_rst_out <= (sys_rst_n) when (RST_ACT_LOW = 1) else (not sys_rst_n);
+
+   
+   --***************************************************************************
+   -- FPGA memory controller
+   --***************************************************************************
+
+  u_mem_controller : dram
+    generic map (
+      BANK_WIDTH            => BANK_WIDTH,
+      CKE_WIDTH             => CKE_WIDTH,
+      CLK_WIDTH             => CLK_WIDTH,
+      COL_WIDTH             => COL_WIDTH,
+      CS_NUM                => CS_NUM,
+      CS_WIDTH              => CS_WIDTH,
+      CS_BITS               => CS_BITS,
+      DM_WIDTH                     => DM_WIDTH,
+      DQ_WIDTH              => DQ_WIDTH,
+      DQ_PER_DQS            => DQ_PER_DQS,
+      DQ_BITS               => DQ_BITS,
+      DQS_WIDTH             => DQS_WIDTH,
+      DQS_BITS              => DQS_BITS,
+      HIGH_PERFORMANCE_MODE => HIGH_PERFORMANCE_MODE,
+      ODT_WIDTH             => ODT_WIDTH,
+      ROW_WIDTH             => ROW_WIDTH,
+      APPDATA_WIDTH         => APPDATA_WIDTH,
+      ADDITIVE_LAT          => ADDITIVE_LAT,
+      BURST_LEN             => BURST_LEN,
+      BURST_TYPE            => BURST_TYPE,
+      CAS_LAT               => CAS_LAT,
+      ECC_ENABLE            => ECC_ENABLE,
+      MULTI_BANK_EN         => MULTI_BANK_EN,
+      ODT_TYPE              => ODT_TYPE,
+      REDUCE_DRV            => REDUCE_DRV,
+      REG_ENABLE            => REG_ENABLE,
+      TREFI_NS              => TREFI_NS,
+      TRAS                  => TRAS,
+      TRCD                  => TRCD,
+      TRFC                  => TRFC,
+      TRP                   => TRP,
+      TRTP                  => TRTP,
+      TWR                   => TWR,
+      TWTR                  => TWTR,
+      SIM_ONLY              => SIM_ONLY,
+      RST_ACT_LOW           => RST_ACT_LOW,
+      CLK_TYPE                     => CLK_TYPE,
+      DLL_FREQ_MODE                => DLL_FREQ_MODE,
+      CLK_PERIOD            => CLK_PERIOD
+      )
+    port map (
+      sys_clk           => sys_clk_p,
+      idly_clk_200      => clk200_p,
+      sys_rst_n         => sys_rst_out,
+      ddr2_ras_n        => ddr2_ras_n_fpga,
+      ddr2_cas_n        => ddr2_cas_n_fpga,
+      ddr2_we_n         => ddr2_we_n_fpga,
+      ddr2_cs_n         => ddr2_cs_n_fpga,
+      ddr2_cke          => ddr2_cke_fpga,
+      ddr2_odt          => ddr2_odt_fpga,
+      ddr2_dm           => ddr2_dm_fpga,
+      ddr2_dq           => ddr2_dq_fpga,
+      ddr2_dqs          => ddr2_dqs_fpga,
+      ddr2_dqs_n        => ddr2_dqs_n_fpga,
+      ddr2_ck           => ddr2_clk_fpga,
+      ddr2_ck_n         => ddr2_clk_n_fpga,
+      ddr2_ba           => ddr2_ba_fpga,
+      ddr2_a            => ddr2_address_fpga,
+      
+      error             => error,
+      
+      phy_init_done     => phy_init_done
+      );
+
+  --***************************************************************************
+  -- Delay insertion modules for each signal
+  --***************************************************************************
+  -- Use standard non-inertial (transport) delay mechanism for unidirectional
+  -- signals from FPGA to SDRAM
+  ddr2_address_sdram  <= TRANSPORT ddr2_address_fpga after TPROP_PCB_CTRL;
+  ddr2_ba_sdram       <= TRANSPORT ddr2_ba_fpga      after TPROP_PCB_CTRL;
+  ddr2_ras_n_sdram    <= TRANSPORT ddr2_ras_n_fpga   after TPROP_PCB_CTRL;
+  ddr2_cas_n_sdram    <= TRANSPORT ddr2_cas_n_fpga   after TPROP_PCB_CTRL;
+  ddr2_we_n_sdram     <= TRANSPORT ddr2_we_n_fpga    after TPROP_PCB_CTRL;
+  ddr2_cs_n_sdram     <= TRANSPORT ddr2_cs_n_fpga    after TPROP_PCB_CTRL;
+  ddr2_cke_sdram      <= TRANSPORT ddr2_cke_fpga     after TPROP_PCB_CTRL;
+  ddr2_odt_sdram      <= TRANSPORT ddr2_odt_fpga     after TPROP_PCB_CTRL;
+  ddr2_clk_sdram      <= TRANSPORT ddr2_clk_fpga     after TPROP_PCB_CTRL;
+  ddr2_clk_n_sdram    <= TRANSPORT ddr2_clk_n_fpga   after TPROP_PCB_CTRL;
+  ddr2_reset_n_sdram  <= TRANSPORT ddr2_reset_n_fpga after TPROP_PCB_CTRL;
+  ddr2_dm_sdram       <= TRANSPORT ddr2_dm_fpga      after TPROP_PCB_DATA;
+
+  dq_delay: for i in 0 to DQ_WIDTH - 1 generate
+    u_delay_dq: WireDelay
+      generic map (
+        Delay_g => TPROP_PCB_DATA,
+        Delay_rd => TPROP_PCB_DATA_RD)
+      port map(
+        A => ddr2_dq_fpga(i),
+        B => ddr2_dq_sdram(i),
+        reset => sys_rst_n);
+  end generate;
+
+  dqs_delay: for i in 0 to DQS_WIDTH - 1 generate
+    u_delay_dqs: WireDelay
+      generic map (
+        Delay_g => TPROP_DQS,
+        Delay_rd => TPROP_DQS_RD)
+      port map(
+        A => ddr2_dqs_fpga(i),
+        B => ddr2_dqs_sdram(i),
+        reset => sys_rst_n);
+  end generate;
+
+  dqs_n_delay: for i in 0 to DQS_WIDTH - 1 generate
+    u_delay_dqs: WireDelay
+      generic map (
+        Delay_g => TPROP_DQS,
+        Delay_rd => TPROP_DQS_RD)
+      port map(
+        A => ddr2_dqs_n_fpga(i),
+        B => ddr2_dqs_n_sdram(i),
+        reset => sys_rst_n);
+  end generate;
+
+  -- Extra one clock pipelining for RDIMM address and
+  -- control signals is implemented here (Implemented external to memory model)
+  process (ddr2_clk_sdram)
+  begin
+    if (rising_edge(ddr2_clk_sdram(0))) then
+      if ( ddr2_reset_n_sdram = '0' ) then
+        ddr2_ras_n_reg    <= '1';
+        ddr2_cas_n_reg    <= '1';
+        ddr2_we_n_reg     <= '1';
+        ddr2_cs_n_reg     <= (others => '1');
+        ddr2_odt_reg      <= (others => '0');
+      else
+        ddr2_address_reg  <= TRANSPORT ddr2_address_sdram after TCYC_SYS_DIV2;
+        ddr2_ba_reg       <= TRANSPORT ddr2_ba_sdram      after TCYC_SYS_DIV2;
+        ddr2_ras_n_reg    <= TRANSPORT ddr2_ras_n_sdram   after TCYC_SYS_DIV2;
+        ddr2_cas_n_reg    <= TRANSPORT ddr2_cas_n_sdram   after TCYC_SYS_DIV2;
+        ddr2_we_n_reg     <= TRANSPORT ddr2_we_n_sdram    after TCYC_SYS_DIV2;
+        ddr2_cs_n_reg     <= TRANSPORT ddr2_cs_n_sdram    after TCYC_SYS_DIV2;
+        ddr2_odt_reg      <= TRANSPORT ddr2_odt_sdram     after TCYC_SYS_DIV2;
+      end if;
+    end if;
+  end process;
+
+  -- to avoid tIS violations on CKE when reset is deasserted
+  process (ddr2_clk_n_sdram)
+  begin
+    if (rising_edge(ddr2_clk_n_sdram(0))) then
+      if ( ddr2_reset_n_sdram = '0' ) then
+        ddr2_cke_reg      <= (others => '0');
+      else
+        ddr2_cke_reg      <= TRANSPORT ddr2_cke_sdram after TCYC_SYS_0;
+      end if;
+    end if;
+  end process;
+
+  --***************************************************************************
+  -- Memory model instances
+  --***************************************************************************
+  
+  comp_16: if (DEVICE_WIDTH = 16) generate
+    -- if memory part is x16
+    registered_dimm: if (REG_ENABLE = 1) generate
+      -- if the memory part is Registered DIMM
+      gen_cs: for j in 0 to (CS_NUM - 1) generate
+        gen: for i in 0 to (DQS_WIDTH/2 - 1) generate
+          u_mem0: ddr2_model
+            port map (
+              ck        => ddr2_clk_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              ck_n      => ddr2_clk_n_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              cke       => ddr2_cke_reg(j),
+              cs_n      => ddr2_cs_n_reg((CS_WIDTH*i/DQS_WIDTH)),
+              ras_n     => ddr2_ras_n_reg,
+              cas_n     => ddr2_cas_n_reg,
+              we_n      => ddr2_we_n_reg,
+              dm_rdqs   => ddr2_dm_sdram((2*(i+1))-1 downto i*2),
+              ba        => ddr2_ba_reg,
+              addr      => ddr2_address_reg,
+              dq        => ddr2_dq_sdram((16*(i+1))-1 downto i*16),
+              dqs       => ddr2_dqs_sdram((2*(i+1))-1 downto i*2),
+              dqs_n     => ddr2_dqs_n_sdram((2*(i+1))-1 downto i*2),
+              rdqs_n    => open,
+              odt       => ddr2_odt_reg(ODT_WIDTH*i/DQS_WIDTH)
+              );
+        end generate gen;
+      end generate gen_cs;
+    end generate registered_dimm;
+    -- if the memory part is component or unbuffered DIMM
+    comp16_mul8: if (((DQ_WIDTH mod 16) /= 0) and (REG_ENABLE = 0)) generate
+      -- for the memory part x16, if the data width is not multiple
+      -- of 16, memory models are instantiated for all data with x16
+      -- memory model and except for MSB data. For the MSB data
+      -- of 8 bits, all memory data, strobe and mask data signals are
+      -- replicated to make it as x16 part. For example if the design
+      -- is generated for data width of 72, memory model x16 parts
+      -- instantiated for 4 times with data ranging from 0 to 63.
+      -- For MSB data ranging from 64 to 71, one x16 memory model
+      -- by replicating the 8-bit data twice and similarly
+      -- the case with data mask and strobe.
+      gen_cs: for j in 0 to (CS_NUM - 1) generate
+        gen: for i in 0 to (DQ_WIDTH/16 - 1) generate
+          u_mem0: ddr2_model
+            port map (
+              ck        => ddr2_clk_sdram(CLK_WIDTH*i/DQS_WIDTH),
+            ck_n      => ddr2_clk_n_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              cke       => ddr2_cke_sdram(j),
+              cs_n      => ddr2_cs_n_sdram(CS_WIDTH*i/DQS_WIDTH),
+              ras_n     => ddr2_ras_n_sdram,
+              cas_n     => ddr2_cas_n_sdram,
+              we_n      => ddr2_we_n_sdram,
+              dm_rdqs   => ddr2_dm_sdram((2*(i+1))-1 downto i*2),
+              ba        => ddr2_ba_sdram,
+              addr      => ddr2_address_sdram,
+              dq        => ddr2_dq_sdram((16*(i+1))-1 downto i*16),
+              dqs       => ddr2_dqs_sdram((2*(i+1))-1 downto i*2),
+              dqs_n     => ddr2_dqs_n_sdram((2*(i+1))-1 downto i*2),
+              rdqs_n    => open,
+              odt       => ddr2_odt_sdram(ODT_WIDTH*i/DQS_WIDTH)
+              );
+        end generate gen;
+
+        --Logic to assign the remaining bits of DQ and DQS
+        u1: for i in 0 to 7 generate
+           u_delay_dq: WireDelay
+              generic map (
+                 Delay_g  => 0 ps,
+                 Delay_rd => 0 ps)
+              port map(
+                A => ddr2_dq_sdram(DQ_WIDTH - 8 + i),
+                B => dq_vector(i),
+                reset => sys_rst_n);
+        end generate;
+
+        u2: WireDelay
+          generic map (
+            Delay_g  => 0 ps,
+            Delay_rd => 0 ps)
+          port map(
+            A => ddr2_dqs_sdram(DQS_WIDTH - 1),
+            B => dqs_vector(0),
+            reset => sys_rst_n);
+
+        u3: WireDelay
+          generic map (
+            Delay_g  => 0 ps,
+            Delay_rd => 0 ps)
+          port map(
+            A => ddr2_dqs_n_sdram(DQS_WIDTH - 1),
+            B => dqs_n_vector(0),
+            reset => sys_rst_n);
+
+        dq_vector(15 downto 8) <= dq_vector(7 downto 0);
+        dqs_vector(1)          <= dqs_vector(0);
+        dqs_n_vector(1)        <= dqs_n_vector(0);
+        dm_vector              <= (ddr2_dm_sdram(DM_WIDTH - 1) &
+                                   ddr2_dm_sdram(DM_WIDTH - 1));
+
+        u_mem1: ddr2_model
+          port map (
+            ck        => ddr2_clk_sdram(CLK_WIDTH-1),
+            ck_n      => ddr2_clk_n_sdram(CLK_WIDTH-1),
+            cke       => ddr2_cke_sdram(j),
+            cs_n      => ddr2_cs_n_sdram(CS_WIDTH-1),
+            ras_n     => ddr2_ras_n_sdram,
+            cas_n     => ddr2_cas_n_sdram,
+            we_n      => ddr2_we_n_sdram,
+            dm_rdqs   => dm_vector,
+            ba        => ddr2_ba_sdram,
+            addr      => ddr2_address_sdram,
+            dq        => dq_vector,
+            dqs       => dqs_vector,
+            dqs_n     => dqs_n_vector,
+            rdqs_n    => open,
+            odt       => ddr2_odt_sdram(ODT_WIDTH-1)
+            );
+      end generate gen_cs;
+    end generate comp16_mul8;
+    comp16_mul16: if (((DQ_WIDTH mod 16) = 0) and (REG_ENABLE = 0)) generate
+      -- if the data width is multiple of 16
+      gen_cs: for j in 0 to (CS_NUM - 1) generate
+        gen: for i in 0 to ((DQS_WIDTH/2) - 1) generate
+          u_mem0: ddr2_model
+            port map (
+              ck        => ddr2_clk_sdram(CLK_WIDTH*i/DQS_WIDTH),
+            ck_n      => ddr2_clk_n_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              cke       => ddr2_cke_sdram(j),
+              cs_n      => ddr2_cs_n_sdram(CS_WIDTH*i/DQS_WIDTH),
+              ras_n     => ddr2_ras_n_sdram,
+              cas_n     => ddr2_cas_n_sdram,
+              we_n      => ddr2_we_n_sdram,
+              dm_rdqs   => ddr2_dm_sdram((2*(i+1))-1 downto i*2),
+              ba        => ddr2_ba_sdram,
+              addr      => ddr2_address_sdram,
+              dq        => ddr2_dq_sdram((16*(i+1))-1 downto i*16),
+              dqs       => ddr2_dqs_sdram((2*(i+1))-1 downto i*2),
+              dqs_n     => ddr2_dqs_n_sdram((2*(i+1))-1 downto i*2),
+              rdqs_n    => open,
+              odt       => ddr2_odt_sdram(ODT_WIDTH*i/DQS_WIDTH)
+              );
+        end generate gen;
+      end generate gen_cs;
+    end generate comp16_mul16;
+  end generate comp_16;
+
+  comp_8: if (DEVICE_WIDTH = 8) generate
+    -- if the memory part is x8
+    registered_dimm: if (REG_ENABLE = 1) generate
+      -- if the memory part is Registered DIMM
+      gen_cs: for j in 0 to (CS_NUM - 1) generate
+        gen: for i in 0 to (DQS_WIDTH - 1) generate
+          u_mem0: ddr2_model
+            port map (
+              ck        => ddr2_clk_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              ck_n      => ddr2_clk_n_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              cke       => ddr2_cke_reg(j),
+              cs_n      => ddr2_cs_n_reg((CS_WIDTH*i/DQS_WIDTH)),
+              ras_n     => ddr2_ras_n_reg,
+              cas_n     => ddr2_cas_n_reg,
+              we_n      => ddr2_we_n_reg,
+              dm_rdqs   => ddr2_dm_sdram(i downto i),
+              ba        => ddr2_ba_reg,
+              addr      => ddr2_address_reg,
+              dq        => ddr2_dq_sdram((8*(i+1))-1 downto i*8),
+              dqs       => ddr2_dqs_sdram(i downto i),
+              dqs_n     => ddr2_dqs_n_sdram(i downto i),
+              rdqs_n    => open,
+              odt       => ddr2_odt_reg(ODT_WIDTH*i/DQS_WIDTH)
+              );
+        end generate gen;
+      end generate gen_cs;
+    end generate registered_dimm;
+    comp8_mul8: if (REG_ENABLE = 0) generate
+      -- if the memory part is component or unbuffered DIMM
+      gen_cs: for j in 0 to (CS_NUM - 1) generate
+        gen: for i in 0 to DQS_WIDTH - 1 generate
+          u_mem0: ddr2_model
+            port map (
+              ck        => ddr2_clk_sdram(CLK_WIDTH*i/DQS_WIDTH),
+            ck_n      => ddr2_clk_n_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              cke       => ddr2_cke_sdram(j),
+              cs_n      => ddr2_cs_n_sdram(CS_WIDTH*i/DQS_WIDTH),
+              ras_n     => ddr2_ras_n_sdram,
+              cas_n     => ddr2_cas_n_sdram,
+              we_n      => ddr2_we_n_sdram,
+              dm_rdqs   => ddr2_dm_sdram(i downto i),
+              ba        => ddr2_ba_sdram,
+              addr      => ddr2_address_sdram,
+              dq        => ddr2_dq_sdram((8*(i+1))-1 downto i*8),
+              dqs       => ddr2_dqs_sdram(i downto i),
+              dqs_n     => ddr2_dqs_n_sdram(i downto i),
+              rdqs_n    => open,
+              odt       => ddr2_odt_sdram(ODT_WIDTH*i/DQS_WIDTH)
+              );
+        end generate gen;
+      end generate gen_cs;
+    end generate comp8_mul8;
+  end generate comp_8;
+
+  comp_4: if (DEVICE_WIDTH = 4) generate
+    -- if the memory part is x4
+    registered_dimm: if (REG_ENABLE = 1) generate
+      -- if the memory part is Registered DIMM
+      gen_cs: for j in 0 to (CS_NUM - 1) generate
+        gen: for i in 0 to (DQS_WIDTH - 1) generate
+          u_mem0: ddr2_model
+            port map (
+              ck        => ddr2_clk_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              ck_n      => ddr2_clk_n_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              cke       => ddr2_cke_reg(j),
+              cs_n      => ddr2_cs_n_reg((CS_WIDTH*i/DQS_WIDTH)),
+              ras_n     => ddr2_ras_n_reg,
+              cas_n     => ddr2_cas_n_reg,
+              we_n      => ddr2_we_n_reg,
+              dm_rdqs   => ddr2_dm_sdram(i downto i),
+              ba        => ddr2_ba_reg,
+              addr      => ddr2_address_reg,
+              dq        => ddr2_dq_sdram((4*(i+1))-1 downto i*4),
+              dqs       => ddr2_dqs_sdram(i downto i),
+              dqs_n     => ddr2_dqs_n_sdram(i downto i),
+              rdqs_n    => open,
+              odt       => ddr2_odt_reg(ODT_WIDTH*i/DQS_WIDTH)
+              );
+        end generate gen;
+      end generate gen_cs;
+    end generate registered_dimm;
+    comp4_mul4: if (REG_ENABLE = 0) generate
+      -- if the memory part is component or unbuffered DIMM
+      gen_cs: for j in 0 to (CS_NUM - 1) generate
+        gen: for i in 0 to DQS_WIDTH - 1 generate
+          u_mem0: ddr2_model
+            port map (
+              ck        => ddr2_clk_sdram(CLK_WIDTH*i/DQS_WIDTH),
+            ck_n      => ddr2_clk_n_sdram(CLK_WIDTH*i/DQS_WIDTH),
+              cke       => ddr2_cke_sdram(j),
+              cs_n      => ddr2_cs_n_sdram(CS_WIDTH*i/DQS_WIDTH),
+              ras_n     => ddr2_ras_n_sdram,
+              cas_n     => ddr2_cas_n_sdram,
+              we_n      => ddr2_we_n_sdram,
+              dm_rdqs   => ddr2_dm_sdram(i downto i),
+              ba        => ddr2_ba_sdram,
+              addr      => ddr2_address_sdram,
+              dq        => ddr2_dq_sdram((4*(i+1))-1 downto i*4),
+              dqs       => ddr2_dqs_sdram(i downto i),
+              dqs_n     => ddr2_dqs_n_sdram(i downto i),
+              rdqs_n    => open,
+              odt       => ddr2_odt_sdram(ODT_WIDTH*i/DQS_WIDTH)
+              );
+        end generate gen;
+      end generate gen_cs;
+    end generate comp4_mul4;
+  end generate comp_4;
+  
+
+end architecture;
Index: trunk/sim/wiredly.vhd
===================================================================
--- trunk/sim/wiredly.vhd	(revision 10)
+++ trunk/sim/wiredly.vhd	(revision 10)
@@ -0,0 +1,133 @@
+--*****************************************************************************
+-- DISCLAIMER OF LIABILITY
+--
+-- This file contains proprietary and confidential information of
+-- Xilinx, Inc. ("Xilinx"), that is distributed under a license
+-- from Xilinx, and may be used, copied and/or disclosed only
+-- pursuant to the terms of a valid license agreement with Xilinx.
+--
+-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+-- ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+-- EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+-- LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+-- MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+-- does not warrant that functions included in the Materials will
+-- meet the requirements of Licensee, or that the operation of the
+-- Materials will be uninterrupted or error-free, or that defects
+-- in the Materials will be corrected. Furthermore, Xilinx does
+-- not warrant or make any representations regarding use, or the
+-- results of the use, of the Materials in terms of correctness,
+-- accuracy, reliability or otherwise.
+--
+-- Xilinx products are not designed or intended to be fail-safe,
+-- or for use in any application requiring fail-safe performance,
+-- such as life-support or safety devices or systems, Class III
+-- medical devices, nuclear facilities, applications related to
+-- the deployment of airbags, or any other applications that could
+-- lead to death, personal injury or severe property or
+-- environmental damage (individually and collectively, "critical
+-- applications"). Customer assumes the sole risk and liability
+-- of any use of Xilinx products in critical applications,
+-- subject only to applicable laws and regulations governing
+-- limitations on product liability.
+--
+-- Copyright 2007, 2008 Xilinx, Inc.
+-- All rights reserved.
+--
+-- This disclaimer and copyright notice must be retained as part
+-- of this file at all times.
+--*****************************************************************************
+--   ____  ____
+--  /   /\/   /
+-- /___/  \  /   Vendor             : Xilinx
+-- \   \   \/    Version            : 3.6
+--  \   \        Application        : MIG
+--  /   /        Filename           : wiredly.vhd
+-- /___/   /\    Date Last Modified : $Date: 2010/06/29 12:03:42 $
+-- \   \  /  \   Date Created       : Mon Jun 18 2007
+--  \___\/\___\
+--
+-- Device      : Virtex-5
+-- Design Name : DDR2
+-- Description: This module provide
+--   the definition of a zero ohm component (A, B).
+--
+--   The applications of this component include:
+--     . Normal operation of a jumper wire (data flowing in both directions)
+--
+--   The component consists of 2 ports:
+--      . Port A: One side of the pass-through switch
+--      . Port B: The other side of the pass-through switch
+
+--   The model is sensitive to transactions on all ports.  Once a
+--   transaction is detected, all other transactions are ignored
+--   for that simulation time (i.e. further transactions in that
+--   delta time are ignored).
+--
+-- Model Limitations and Restrictions:
+--   Signals asserted on the ports of the error injector should not have
+--   transactions occuring in multiple delta times because the model
+--   is sensitive to transactions on port A, B ONLY ONCE during
+--   a simulation time.  Thus, once fired, a process will
+--   not refire if there are multiple transactions occuring in delta times.
+--   This condition may occur in gate level simulations with
+--   ZERO delays because transactions may occur in multiple delta times.
+--*****************************************************************************
+
+library IEEE;
+  use IEEE.Std_Logic_1164.all;
+
+entity WireDelay is
+  generic (
+     Delay_g : time;
+     Delay_rd : time);
+  port
+    (A     : inout Std_Logic;
+     B     : inout Std_Logic;
+     reset : in Std_Logic
+     );
+end WireDelay;
+
+
+architecture WireDelay_a of WireDelay is
+
+  signal A_r     : Std_Logic;
+  signal B_r     : Std_Logic;
+  signal line_en : Std_Logic;
+
+begin
+
+  A <= A_r;
+  B <= B_r;
+
+  ABC0_Lbl: process (reset, A, B)
+  begin
+    if (reset = '0') then
+      line_en <= '0';
+    else 
+      if (A /= A_r) then
+        line_en <= '0';
+      elsif (B_r /= B) then
+        line_en <= '1';
+      else 
+        line_en <= line_en;
+      end if;
+    end if;
+
+  end process ABC0_Lbl;
+
+ lnenab: process (reset, line_en, A, B)
+   begin
+    if (reset = '0') then
+      A_r <= 'Z';
+      B_r <= 'Z';
+    elsif (line_en = '1') then
+      A_r <= TRANSPORT B AFTER Delay_rd;
+      B_r <= 'Z';
+    else 
+      B_r <= TRANSPORT A AFTER Delay_g;
+      A_r <= 'Z';
+    end if;
+   end process;
+
+end WireDelay_a;
Index: trunk/sim/sim_tb_top.v
===================================================================
--- trunk/sim/sim_tb_top.v	(revision 10)
+++ trunk/sim/sim_tb_top.v	(revision 10)
@@ -0,0 +1,606 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /   Vendor             : Xilinx
+// \   \   \/    Version            : 3.6
+//  \   \        Application        : MIG
+//  /   /        Filename           : sim_tb_top.v
+// /___/   /\    Date Last Modified : $Date: 2010/06/29 12:03:42 $
+// \   \  /  \   Date Created       : Mon May 14 2007
+//  \___\/\___\
+//
+// Device      : Virtex-5
+// Design Name : DDR2
+// Purpose     : This is the simulation testbench which is used to verify the
+//               design. The basic clocks and resets to the interface are
+//               generated here. This also connects the memory interface to the
+//               memory model.
+// Reference:
+// Revision History:
+//*****************************************************************************
+
+`timescale 1ns / 1ps
+
+module sim_tb_top;
+
+  // memory controller parameters
+   parameter BANK_WIDTH            = 2;      // # of memory bank addr bits
+   parameter CKE_WIDTH             = 1;      // # of memory clock enable outputs
+   parameter CLK_WIDTH             = 2;      // # of clock outputs
+   parameter CLK_TYPE              = "SINGLE_ENDED";       // # of clock type
+   parameter COL_WIDTH             = 10;     // # of memory column bits
+   parameter CS_NUM                = 1;      // # of separate memory chip selects
+   parameter CS_WIDTH              = 1;      // # of total memory chip selects
+   parameter CS_BITS               = 0;      // set to log2(CS_NUM) (rounded up)
+   parameter DM_WIDTH              = 8;      // # of data mask bits
+   parameter DQ_WIDTH              = 64;      // # of data width
+   parameter DQ_PER_DQS            = 8;      // # of DQ data bits per strobe
+   parameter DQS_WIDTH             = 8;      // # of DQS strobes
+   parameter DQ_BITS               = 6;      // set to log2(DQS_WIDTH*DQ_PER_DQS)
+   parameter DQS_BITS              = 3;      // set to log2(DQS_WIDTH)
+   parameter HIGH_PERFORMANCE_MODE = "TRUE"; // Sets the performance mode for IODELAY elements
+   parameter ODT_WIDTH             = 1;      // # of memory on-die term enables
+   parameter ROW_WIDTH             = 13;     // # of memory row & # of addr bits
+   parameter APPDATA_WIDTH         = 128;     // # of usr read/write data bus bits
+   parameter ADDITIVE_LAT          = 0;      // additive write latency
+   parameter BURST_LEN             = 4;      // burst length (in double words)
+   parameter BURST_TYPE            = 0;      // burst type (=0 seq; =1 interlved)
+   parameter CAS_LAT               = 3;      // CAS latency
+   parameter ECC_ENABLE            = 0;      // enable ECC (=1 enable)
+   parameter MULTI_BANK_EN         = 1;      // enable bank management
+   parameter TWO_T_TIME_EN         = 1;      // 2t timing for unbuffered dimms
+   parameter ODT_TYPE              = 1;      // ODT (=0(none),=1(75),=2(150),=3(50))
+   parameter REDUCE_DRV            = 0;      // reduced strength mem I/O (=1 yes)
+   parameter REG_ENABLE            = 0;      // registered addr/ctrl (=1 yes)
+   parameter TREFI_NS              = 7800;   // auto refresh interval (ns)
+   parameter TRAS                  = 40000;  // active->precharge delay
+   parameter TRCD                  = 15000;  // active->read/write delay
+   parameter TRFC                  = 105000;  // ref->ref, ref->active delay
+   parameter TRP                   = 15000;  // precharge->command delay
+   parameter TRTP                  = 7500;   // read->precharge delay
+   parameter TWR                   = 15000;  // used to determine wr->prech
+   parameter TWTR                  = 7500;   // write->read delay
+   parameter SIM_ONLY              = 1;      // = 0 to allow power up delay
+   parameter DEBUG_EN              = 0;      // Enable debug signals/controls
+   parameter RST_ACT_LOW           = 1;      // =1 for active low reset, =0 for active high
+   parameter DLL_FREQ_MODE         = "HIGH"; // DCM Frequency range
+   parameter CLK_PERIOD            = 5000;   // Core/Mem clk period (in ps)
+
+   localparam DEVICE_WIDTH    = 16;      // Memory device data width
+   localparam real CLK_PERIOD_NS   = CLK_PERIOD / 1000.0;
+   localparam real TCYC_200           = 5.0;
+   localparam real TPROP_DQS          = 0.01;  // Delay for DQS signal during Write Operation
+   localparam real TPROP_DQS_RD       = 0.01;  // Delay for DQS signal during Read Operation
+   localparam real TPROP_PCB_CTRL     = 0.01;  // Delay for Address and Ctrl signals
+   localparam real TPROP_PCB_DATA     = 0.01;  // Delay for data signal during Write operation
+   localparam real TPROP_PCB_DATA_RD  = 0.01;  // Delay for data signal during Read operation
+
+   
+   reg                           sys_clk;
+   wire                          sys_clk_n;
+   wire                          sys_clk_p;
+   reg                           sys_clk200;
+   wire                          clk200_n;
+   wire                          clk200_p;
+   reg                           sys_rst_n;
+   wire                          sys_rst_out;
+
+
+   wire [DQ_WIDTH-1:0]          ddr2_dq_sdram;
+   wire [DQS_WIDTH-1:0]         ddr2_dqs_sdram;
+   wire [DQS_WIDTH-1:0]         ddr2_dqs_n_sdram;
+   wire [DM_WIDTH-1:0]          ddr2_dm_sdram;
+   reg [DM_WIDTH-1:0]           ddr2_dm_sdram_tmp;
+   reg [CLK_WIDTH-1:0]          ddr2_clk_sdram;
+   reg [CLK_WIDTH-1:0]          ddr2_clk_n_sdram;
+   reg [ROW_WIDTH-1:0]          ddr2_address_sdram;
+   reg [BANK_WIDTH-1:0]         ddr2_ba_sdram;
+   reg                          ddr2_ras_n_sdram;
+   reg                          ddr2_cas_n_sdram;
+   reg                          ddr2_we_n_sdram;
+   reg [CS_WIDTH-1:0]           ddr2_cs_n_sdram;
+   reg [CKE_WIDTH-1:0]          ddr2_cke_sdram;
+   reg [ODT_WIDTH-1:0]          ddr2_odt_sdram;
+
+
+   wire [DQ_WIDTH-1:0]          ddr2_dq_fpga;
+   wire [DQS_WIDTH-1:0]         ddr2_dqs_fpga;
+   wire [DQS_WIDTH-1:0]         ddr2_dqs_n_fpga;
+   wire [DM_WIDTH-1:0]          ddr2_dm_fpga;
+   wire [CLK_WIDTH-1:0]         ddr2_clk_fpga;
+   wire [CLK_WIDTH-1:0]         ddr2_clk_n_fpga;
+   wire [ROW_WIDTH-1:0]         ddr2_address_fpga;
+   wire [BANK_WIDTH-1:0]        ddr2_ba_fpga;
+   wire                         ddr2_ras_n_fpga;
+   wire                         ddr2_cas_n_fpga;
+   wire                         ddr2_we_n_fpga;
+   wire [CS_WIDTH-1:0]          ddr2_cs_n_fpga;
+   wire [CKE_WIDTH-1:0]         ddr2_cke_fpga;
+   wire [ODT_WIDTH-1:0]         ddr2_odt_fpga;
+
+   wire                          error;
+   wire                          phy_init_done;
+   
+
+   // Only RDIMM memory parts support the reset signal,
+   // hence the ddr2_reset_n signal can be ignored for other memory parts
+   wire                          ddr2_reset_n;
+   reg [ROW_WIDTH-1:0]           ddr2_address_reg;
+   reg [BANK_WIDTH-1:0]          ddr2_ba_reg;
+   reg [CKE_WIDTH-1:0]           ddr2_cke_reg;
+   reg                           ddr2_ras_n_reg;
+   reg                           ddr2_cas_n_reg;
+   reg                           ddr2_we_n_reg;
+   reg [CS_WIDTH-1:0]            ddr2_cs_n_reg;
+   reg [ODT_WIDTH-1:0]           ddr2_odt_reg;
+   
+   //***************************************************************************
+   // Clock generation and reset
+   //***************************************************************************
+
+   initial
+     sys_clk = 1'b0;
+   always
+     sys_clk = #(CLK_PERIOD_NS/2) ~sys_clk;
+
+   assign                sys_clk_p = sys_clk;
+   assign                sys_clk_n = ~sys_clk;
+
+   initial
+     sys_clk200 = 1'b0;
+   always
+     sys_clk200 = #(TCYC_200/2) ~sys_clk200;
+
+   assign                clk200_p = sys_clk200;
+   assign                clk200_n = ~sys_clk200;
+
+   initial begin
+      sys_rst_n = 1'b0;
+      #200;
+      sys_rst_n = 1'b1;
+   end
+   assign sys_rst_out = RST_ACT_LOW ? sys_rst_n : ~sys_rst_n;
+
+   
+
+
+// =============================================================================
+//                             BOARD Parameters
+// =============================================================================
+// These parameter values can be changed to model varying board delays
+// between the Virtex-5 device and the memory model
+
+
+  always @( * ) begin
+    ddr2_clk_sdram        <=  #(TPROP_PCB_CTRL) ddr2_clk_fpga;
+    ddr2_clk_n_sdram      <=  #(TPROP_PCB_CTRL) ddr2_clk_n_fpga;
+    ddr2_address_sdram    <=  #(TPROP_PCB_CTRL) ddr2_address_fpga;
+    ddr2_ba_sdram         <=  #(TPROP_PCB_CTRL) ddr2_ba_fpga;
+    ddr2_ras_n_sdram      <=  #(TPROP_PCB_CTRL) ddr2_ras_n_fpga;
+    ddr2_cas_n_sdram      <=  #(TPROP_PCB_CTRL) ddr2_cas_n_fpga;
+    ddr2_we_n_sdram       <=  #(TPROP_PCB_CTRL) ddr2_we_n_fpga;
+    ddr2_cs_n_sdram       <=  #(TPROP_PCB_CTRL) ddr2_cs_n_fpga;
+    ddr2_cke_sdram        <=  #(TPROP_PCB_CTRL) ddr2_cke_fpga;
+    ddr2_odt_sdram        <=  #(TPROP_PCB_CTRL) ddr2_odt_fpga;
+    ddr2_dm_sdram_tmp     <=  #(TPROP_PCB_DATA) ddr2_dm_fpga;//DM signal generation
+  end
+
+  assign ddr2_dm_sdram = ddr2_dm_sdram_tmp;
+
+
+// Controlling the bi-directional BUS
+  genvar dqwd;
+  generate
+    for (dqwd = 0;dqwd < DQ_WIDTH;dqwd = dqwd+1) begin : dq_delay
+      WireDelay #
+       (
+        .Delay_g     (TPROP_PCB_DATA),
+        .Delay_rd    (TPROP_PCB_DATA_RD)
+       )
+      u_delay_dq
+       (
+        .A           (ddr2_dq_fpga[dqwd]),
+        .B           (ddr2_dq_sdram[dqwd]),
+        .reset       (sys_rst_n)
+       );
+    end
+  endgenerate
+
+  genvar dqswd;
+  generate
+    for (dqswd = 0;dqswd < DQS_WIDTH;dqswd = dqswd+1) begin : dqs_delay
+      WireDelay #
+       (
+        .Delay_g     (TPROP_DQS),
+        .Delay_rd    (TPROP_DQS_RD)
+       )
+      u_delay_dqs
+       (
+        .A           (ddr2_dqs_fpga[dqswd]),
+        .B           (ddr2_dqs_sdram[dqswd]),
+        .reset       (sys_rst_n)
+       );
+
+      WireDelay #
+       (
+        .Delay_g     (TPROP_DQS),
+        .Delay_rd    (TPROP_DQS_RD)
+       )
+      u_delay_dqs_n
+       (
+        .A           (ddr2_dqs_n_fpga[dqswd]),
+        .B           (ddr2_dqs_n_sdram[dqswd]),
+        .reset       (sys_rst_n)
+       );
+    end
+  endgenerate
+
+
+
+   //***************************************************************************
+   // FPGA memory controller
+   //***************************************************************************
+
+   dram #
+     (
+      .BANK_WIDTH            (BANK_WIDTH),
+      .CKE_WIDTH             (CKE_WIDTH),
+      .CLK_WIDTH             (CLK_WIDTH),
+      .COL_WIDTH             (COL_WIDTH),
+      .CS_NUM                (CS_NUM),
+      .CS_WIDTH              (CS_WIDTH),
+      .CS_BITS               (CS_BITS),
+      .DM_WIDTH                     (DM_WIDTH),
+      .DQ_WIDTH              (DQ_WIDTH),
+      .DQ_PER_DQS            (DQ_PER_DQS),
+      .DQ_BITS               (DQ_BITS),
+      .DQS_WIDTH             (DQS_WIDTH),
+      .DQS_BITS              (DQS_BITS),
+      .HIGH_PERFORMANCE_MODE (HIGH_PERFORMANCE_MODE),
+      .ODT_WIDTH             (ODT_WIDTH),
+      .ROW_WIDTH             (ROW_WIDTH),
+      .APPDATA_WIDTH         (APPDATA_WIDTH),
+      .ADDITIVE_LAT          (ADDITIVE_LAT),
+      .BURST_LEN             (BURST_LEN),
+      .BURST_TYPE            (BURST_TYPE),
+      .CAS_LAT               (CAS_LAT),
+      .ECC_ENABLE            (ECC_ENABLE),
+      .MULTI_BANK_EN         (MULTI_BANK_EN),
+      .ODT_TYPE              (ODT_TYPE),
+      .REDUCE_DRV            (REDUCE_DRV),
+      .REG_ENABLE            (REG_ENABLE),
+      .TREFI_NS              (TREFI_NS),
+      .TRAS                  (TRAS),
+      .TRCD                  (TRCD),
+      .TRFC                  (TRFC),
+      .TRP                   (TRP),
+      .TRTP                  (TRTP),
+      .TWR                   (TWR),
+      .TWTR                  (TWTR),
+      .SIM_ONLY              (SIM_ONLY),
+      .RST_ACT_LOW           (RST_ACT_LOW),
+      .CLK_TYPE                     (CLK_TYPE),
+      .DLL_FREQ_MODE                (DLL_FREQ_MODE),
+      .CLK_PERIOD            (CLK_PERIOD)
+      )
+   u_mem_controller
+     (
+      .sys_clk           (sys_clk_p),
+      .idly_clk_200      (clk200_p),
+      .sys_rst_n         (sys_rst_out),
+      .ddr2_ras_n        (ddr2_ras_n_fpga),
+      .ddr2_cas_n        (ddr2_cas_n_fpga),
+      .ddr2_we_n         (ddr2_we_n_fpga),
+      .ddr2_cs_n         (ddr2_cs_n_fpga),
+      .ddr2_cke          (ddr2_cke_fpga),
+      .ddr2_odt          (ddr2_odt_fpga),
+      .ddr2_dm           (ddr2_dm_fpga),
+      .ddr2_dq           (ddr2_dq_fpga),
+      .ddr2_dqs          (ddr2_dqs_fpga),
+      .ddr2_dqs_n        (ddr2_dqs_n_fpga),
+      .ddr2_ck           (ddr2_clk_fpga),
+      .ddr2_ck_n         (ddr2_clk_n_fpga),
+      .ddr2_ba           (ddr2_ba_fpga),
+      .ddr2_a            (ddr2_address_fpga),
+      .error                (error),
+      
+      
+      .phy_init_done     (phy_init_done)
+      );
+
+   // Extra one clock pipelining for RDIMM address and
+   // control signals is implemented here (Implemented external to memory model)
+   always @( posedge ddr2_clk_sdram[0] ) begin
+      if ( ddr2_reset_n == 1'b0 ) begin
+         ddr2_ras_n_reg    <= 1'b1;
+         ddr2_cas_n_reg    <= 1'b1;
+         ddr2_we_n_reg     <= 1'b1;
+         ddr2_cs_n_reg     <= {CS_WIDTH{1'b1}};
+         ddr2_odt_reg      <= 1'b0;
+      end
+      else begin
+         ddr2_address_reg  <= #(CLK_PERIOD_NS/2) ddr2_address_sdram;
+         ddr2_ba_reg       <= #(CLK_PERIOD_NS/2) ddr2_ba_sdram;
+         ddr2_ras_n_reg    <= #(CLK_PERIOD_NS/2) ddr2_ras_n_sdram;
+         ddr2_cas_n_reg    <= #(CLK_PERIOD_NS/2) ddr2_cas_n_sdram;
+         ddr2_we_n_reg     <= #(CLK_PERIOD_NS/2) ddr2_we_n_sdram;
+         ddr2_cs_n_reg     <= #(CLK_PERIOD_NS/2) ddr2_cs_n_sdram;
+         ddr2_odt_reg      <= #(CLK_PERIOD_NS/2) ddr2_odt_sdram;
+      end
+   end
+
+   // to avoid tIS violations on CKE when reset is deasserted
+   always @( posedge ddr2_clk_n_sdram[0] )
+      if ( ddr2_reset_n == 1'b0 )
+         ddr2_cke_reg      <= 1'b0;
+      else
+         ddr2_cke_reg      <= #(CLK_PERIOD_NS) ddr2_cke_sdram;
+
+   //***************************************************************************
+   // Memory model instances
+   //***************************************************************************
+   
+   genvar i, j;
+   generate
+      if (DEVICE_WIDTH == 16) begin
+         // if memory part is x16
+         if ( REG_ENABLE ) begin
+           // if the memory part is Registered DIMM
+           for(j = 0; j < CS_NUM; j = j+1) begin : gen_cs
+             for(i = 0; i < DQS_WIDTH/2; i = i+1) begin : gen
+                ddr2_model u_mem0
+                  (
+                   .ck        (ddr2_clk_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                   .ck_n      (ddr2_clk_n_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                   .cke       (ddr2_cke_reg[j]),
+                   .cs_n      (ddr2_cs_n_reg[CS_WIDTH*i/DQS_WIDTH]),
+                   .ras_n     (ddr2_ras_n_reg),
+                   .cas_n     (ddr2_cas_n_reg),
+                   .we_n      (ddr2_we_n_reg),
+                   .dm_rdqs   (ddr2_dm_sdram[(2*(i+1))-1 : i*2]),
+                   .ba        (ddr2_ba_reg),
+                   .addr      (ddr2_address_reg),
+                   .dq        (ddr2_dq_sdram[(16*(i+1))-1 : i*16]),
+                   .dqs       (ddr2_dqs_sdram[(2*(i+1))-1 : i*2]),
+                   .dqs_n     (ddr2_dqs_n_sdram[(2*(i+1))-1 : i*2]),
+                   .rdqs_n    (),
+                   .odt       (ddr2_odt_reg[ODT_WIDTH*i/DQS_WIDTH])
+                   );
+             end
+           end
+         end
+         else begin
+             // if the memory part is component or unbuffered DIMM
+            if ( DQ_WIDTH%16 ) begin
+              // for the memory part x16, if the data width is not multiple
+              // of 16, memory models are instantiated for all data with x16
+              // memory model and except for MSB data. For the MSB data
+              // of 8 bits, all memory data, strobe and mask data signals are
+              // replicated to make it as x16 part. For example if the design
+              // is generated for data width of 72, memory model x16 parts
+              // instantiated for 4 times with data ranging from 0 to 63.
+              // For MSB data ranging from 64 to 71, one x16 memory model
+              // by replicating the 8-bit data twice and similarly
+              // the case with data mask and strobe.
+              for(j = 0; j < CS_NUM; j = j+1) begin : gen_cs
+                for(i = 0; i < DQ_WIDTH/16 ; i = i+1) begin : gen
+                   ddr2_model u_mem0
+                     (
+                      .ck        (ddr2_clk_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                     .ck_n      (ddr2_clk_n_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                      .cke       (ddr2_cke_sdram[j]),
+                      .cs_n      (ddr2_cs_n_sdram[CS_WIDTH*i/DQS_WIDTH]),
+                      .ras_n     (ddr2_ras_n_sdram),
+                      .cas_n     (ddr2_cas_n_sdram),
+                      .we_n      (ddr2_we_n_sdram),
+                      .dm_rdqs   (ddr2_dm_sdram[(2*(i+1))-1 : i*2]),
+                      .ba        (ddr2_ba_sdram),
+                      .addr      (ddr2_address_sdram),
+                      .dq        (ddr2_dq_sdram[(16*(i+1))-1 : i*16]),
+                      .dqs       (ddr2_dqs_sdram[(2*(i+1))-1 : i*2]),
+                      .dqs_n     (ddr2_dqs_n_sdram[(2*(i+1))-1 : i*2]),
+                      .rdqs_n    (),
+                      .odt       (ddr2_odt_sdram[ODT_WIDTH*i/DQS_WIDTH])
+                      );
+                end
+                   ddr2_model u_mem1
+                     (
+                      .ck        (ddr2_clk_sdram[CLK_WIDTH-1]),
+                      .ck_n      (ddr2_clk_n_sdram[CLK_WIDTH-1]),
+                      .cke       (ddr2_cke_sdram[j]),
+                      .cs_n      (ddr2_cs_n_sdram[CS_WIDTH-1]),
+                      .ras_n     (ddr2_ras_n_sdram),
+                      .cas_n     (ddr2_cas_n_sdram),
+                      .we_n      (ddr2_we_n_sdram),
+                      .dm_rdqs   ({ddr2_dm_sdram[DM_WIDTH - 1],
+                                   ddr2_dm_sdram[DM_WIDTH - 1]}),
+                      .ba        (ddr2_ba_sdram),
+                      .addr      (ddr2_address_sdram),
+                      .dq        ({ddr2_dq_sdram[DQ_WIDTH - 1 : DQ_WIDTH - 8],
+                                   ddr2_dq_sdram[DQ_WIDTH - 1 : DQ_WIDTH - 8]}),
+                      .dqs       ({ddr2_dqs_sdram[DQS_WIDTH - 1],
+                                   ddr2_dqs_sdram[DQS_WIDTH - 1]}),
+                      .dqs_n     ({ddr2_dqs_n_sdram[DQS_WIDTH - 1],
+                                   ddr2_dqs_n_sdram[DQS_WIDTH - 1]}),
+                      .rdqs_n    (),
+                      .odt       (ddr2_odt_sdram[ODT_WIDTH-1])
+                      );
+              end
+            end
+            else begin
+              // if the data width is multiple of 16
+              for(j = 0; j < CS_NUM; j = j+1) begin : gen_cs
+                for(i = 0; i < DQS_WIDTH/2; i = i+1) begin : gen
+                   ddr2_model u_mem0
+                     (
+                      .ck        (ddr2_clk_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                     .ck_n      (ddr2_clk_n_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                      .cke       (ddr2_cke_sdram[j]),
+                      .cs_n      (ddr2_cs_n_sdram[CS_WIDTH*i/DQS_WIDTH]),
+                      .ras_n     (ddr2_ras_n_sdram),
+                      .cas_n     (ddr2_cas_n_sdram),
+                      .we_n      (ddr2_we_n_sdram),
+                      .dm_rdqs   (ddr2_dm_sdram[(2*(i+1))-1 : i*2]),
+                      .ba        (ddr2_ba_sdram),
+                      .addr      (ddr2_address_sdram),
+                      .dq        (ddr2_dq_sdram[(16*(i+1))-1 : i*16]),
+                      .dqs       (ddr2_dqs_sdram[(2*(i+1))-1 : i*2]),
+                      .dqs_n     (ddr2_dqs_n_sdram[(2*(i+1))-1 : i*2]),
+                      .rdqs_n    (),
+                      .odt       (ddr2_odt_sdram[ODT_WIDTH*i/DQS_WIDTH])
+                      );
+                end
+              end
+            end
+         end
+
+      end else
+        if (DEVICE_WIDTH == 8) begin
+           // if the memory part is x8
+           if ( REG_ENABLE ) begin
+             // if the memory part is Registered DIMM
+             for(j = 0; j < CS_NUM; j = j+1) begin : gen_cs
+               for(i = 0; i < DQ_WIDTH/DQ_PER_DQS; i = i+1) begin : gen
+                  ddr2_model u_mem0
+                    (
+                     .ck        (ddr2_clk_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                     .ck_n      (ddr2_clk_n_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                     .cke       (ddr2_cke_reg[j]),
+                     .cs_n      (ddr2_cs_n_reg[CS_WIDTH*i/DQS_WIDTH]),
+                     .ras_n     (ddr2_ras_n_reg),
+                     .cas_n     (ddr2_cas_n_reg),
+                     .we_n      (ddr2_we_n_reg),
+                     .dm_rdqs   (ddr2_dm_sdram[i]),
+                     .ba        (ddr2_ba_reg),
+                     .addr      (ddr2_address_reg),
+                     .dq        (ddr2_dq_sdram[(8*(i+1))-1 : i*8]),
+                     .dqs       (ddr2_dqs_sdram[i]),
+                     .dqs_n     (ddr2_dqs_n_sdram[i]),
+                     .rdqs_n    (),
+                     .odt       (ddr2_odt_reg[ODT_WIDTH*i/DQS_WIDTH])
+                     );
+               end
+             end
+           end
+           else begin
+             // if the memory part is component or unbuffered DIMM
+             for(j = 0; j < CS_NUM; j = j+1) begin : gen_cs
+               for(i = 0; i < DQS_WIDTH; i = i+1) begin : gen
+                  ddr2_model u_mem0
+                    (
+                     .ck        (ddr2_clk_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                    .ck_n      (ddr2_clk_n_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                     .cke       (ddr2_cke_sdram[j]),
+                     .cs_n      (ddr2_cs_n_sdram[CS_WIDTH*i/DQS_WIDTH]),
+                     .ras_n     (ddr2_ras_n_sdram),
+                     .cas_n     (ddr2_cas_n_sdram),
+                     .we_n      (ddr2_we_n_sdram),
+                     .dm_rdqs   (ddr2_dm_sdram[i]),
+                     .ba        (ddr2_ba_sdram),
+                     .addr      (ddr2_address_sdram),
+                     .dq        (ddr2_dq_sdram[(8*(i+1))-1 : i*8]),
+                     .dqs       (ddr2_dqs_sdram[i]),
+                     .dqs_n     (ddr2_dqs_n_sdram[i]),
+                     .rdqs_n    (),
+                     .odt       (ddr2_odt_sdram[ODT_WIDTH*i/DQS_WIDTH])
+                     );
+               end
+             end
+           end
+
+        end else
+          if (DEVICE_WIDTH == 4) begin
+             // if the memory part is x4
+             if ( REG_ENABLE ) begin
+               // if the memory part is Registered DIMM
+               for(j = 0; j < CS_NUM; j = j+1) begin : gen_cs
+                  for(i = 0; i < DQS_WIDTH; i = i+1) begin : gen
+                     ddr2_model u_mem0
+                       (
+                        .ck        (ddr2_clk_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                        .ck_n      (ddr2_clk_n_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                        .cke       (ddr2_cke_reg[j]),
+                        .cs_n      (ddr2_cs_n_reg[CS_WIDTH*i/DQS_WIDTH]),
+                        .ras_n     (ddr2_ras_n_reg),
+                        .cas_n     (ddr2_cas_n_reg),
+                        .we_n      (ddr2_we_n_reg),
+                        .dm_rdqs   (ddr2_dm_sdram[i]),
+                        .ba        (ddr2_ba_reg),
+                        .addr      (ddr2_address_reg),
+                        .dq        (ddr2_dq_sdram[(4*(i+1))-1 : i*4]),
+                        .dqs       (ddr2_dqs_sdram[i]),
+                        .dqs_n     (ddr2_dqs_n_sdram[i]),
+                        .rdqs_n    (),
+                        .odt       (ddr2_odt_reg[ODT_WIDTH*i/DQS_WIDTH])
+                        );
+                  end
+               end
+             end
+             else begin
+               // if the memory part is component or unbuffered DIMM
+               for(j = 0; j < CS_NUM; j = j+1) begin : gen_cs
+                 for(i = 0; i < DQS_WIDTH; i = i+1) begin : gen
+                    ddr2_model u_mem0
+                      (
+                       .ck        (ddr2_clk_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                      .ck_n      (ddr2_clk_n_sdram[CLK_WIDTH*i/DQS_WIDTH]),
+                       .cke       (ddr2_cke_sdram[j]),
+                       .cs_n      (ddr2_cs_n_sdram[CS_WIDTH*i/DQS_WIDTH]),
+                       .ras_n     (ddr2_ras_n_sdram),
+                       .cas_n     (ddr2_cas_n_sdram),
+                       .we_n      (ddr2_we_n_sdram),
+                       .dm_rdqs   (ddr2_dm_sdram[i]),
+                       .ba        (ddr2_ba_sdram),
+                       .addr      (ddr2_address_sdram),
+                       .dq        (ddr2_dq_sdram[(4*(i+1))-1 : i*4]),
+                       .dqs       (ddr2_dqs_sdram[i]),
+                       .dqs_n     (ddr2_dqs_n_sdram[i]),
+                       .rdqs_n    (),
+                       .odt       (ddr2_odt_sdram[ODT_WIDTH*i/DQS_WIDTH])
+                       );
+                 end
+               end
+             end
+          end
+   endgenerate
+   
+
+endmodule
Index: trunk/sim/wiredly.v
===================================================================
--- trunk/sim/wiredly.v	(revision 10)
+++ trunk/sim/wiredly.v	(revision 10)
@@ -0,0 +1,123 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /   Vendor             : Xilinx
+// \   \   \/    Version            : 3.6
+//  \   \        Application        : MIG
+//  /   /        Filename           : wiredly.v
+// /___/   /\    Date Last Modified : $Date: 2010/06/29 12:03:42 $
+// \   \  /  \   Date Created       : Thu Feb 21 2008
+//  \___\/\___\
+//
+// Device      : Virtex-5
+// Design Name : DDR2
+// Description: This module provide
+//   the definition of a zero ohm component (A, B).
+//
+//   The applications of this component include:
+//     . Normal operation of a jumper wire (data flowing in both directions)
+//
+//   The component consists of 2 ports:
+//      . Port A: One side of the pass-through switch
+//      . Port B: The other side of the pass-through switch
+
+//   The model is sensitive to transactions on all ports.  Once a
+//   transaction is detected, all other transactions are ignored
+//   for that simulation time (i.e. further transactions in that
+//   delta time are ignored).
+//
+// Model Limitations and Restrictions:
+//   Signals asserted on the ports of the error injector should not have
+//   transactions occuring in multiple delta times because the model
+//   is sensitive to transactions on port A, B ONLY ONCE during
+//   a simulation time.  Thus, once fired, a process will
+//   not refire if there are multiple transactions occuring in delta times.
+//   This condition may occur in gate level simulations with
+//   ZERO delays because transactions may occur in multiple delta times.
+//*****************************************************************************
+
+`timescale 1ns / 1ps
+
+module WireDelay # (
+  parameter Delay_g = 0,
+  parameter Delay_rd = 0
+)
+(
+  inout A,
+  inout B,
+  input reset
+);  
+
+  reg A_r;
+  reg B_r;
+  reg line_en;
+
+  assign A = A_r;
+  assign B = B_r;
+
+  always @(*) begin
+    if (!reset) begin
+      A_r <= 1'bz;
+      B_r <= 1'bz;
+      line_en <= 1'b0;
+    end else begin 
+      if (line_en) begin
+        A_r <= #Delay_rd B;
+	B_r <= 1'bz;
+      end else begin
+        B_r <= #Delay_g A;
+	A_r <= 1'bz;
+      end
+    end
+  end
+
+  always @(A or B) begin
+    if (!reset) begin
+      line_en <= 1'b0;
+    end else if (A !== A_r) begin
+      line_en <= 1'b0;
+    end else if (B_r !== B) begin
+      line_en <= 1'b1;
+    end else begin
+      line_en <= line_en;
+    end
+  end
+endmodule
Index: trunk/sim/sim.do
===================================================================
--- trunk/sim/sim.do	(revision 10)
+++ trunk/sim/sim.do	(revision 10)
@@ -0,0 +1,125 @@
+###############################################################################
+## DISCLAIMER OF LIABILITY
+##
+## This file contains proprietary and confidential information of
+## Xilinx, Inc. ("Xilinx"), that is distributed under a license
+## from Xilinx, and may be used, copied and/or disclosed only
+## pursuant to the terms of a valid license agreement with Xilinx.
+##
+## XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+## ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+## EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+## LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+## MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+## does not warrant that functions included in the Materials will
+## meet the requirements of Licensee, or that the operation of the
+## Materials will be uninterrupted or error-free, or that defects
+## in the Materials will be corrected. Furthermore, Xilinx does
+## not warrant or make any representations regarding use, or the
+## results of the use, of the Materials in terms of correctness,
+## accuracy, reliability or otherwise.
+##
+## Xilinx products are not designed or intended to be fail-safe,
+## or for use in any application requiring fail-safe performance,
+## such as life-support or safety devices or systems, Class III
+## medical devices, nuclear facilities, applications related to
+## the deployment of airbags, or any other applications that could
+## lead to death, personal injury or severe property or
+## environmental damage (individually and collectively, "critical
+## applications"). Customer assumes the sole risk and liability
+## of any use of Xilinx products in critical applications,
+## subject only to applicable laws and regulations governing
+## limitations on product liability.
+##
+## Copyright 2007, 2008 Xilinx, Inc.
+## All rights reserved.
+##
+## This disclaimer and copyright notice must be retained as part
+## of this file at all times.
+###############################################################################
+##   ____  ____
+##  /   /\/   /
+## /___/  \  /    Vendor             : Xilinx
+## \   \   \/     Version            : 3.6
+##  \   \         Application        : MIG
+##  /   /         Filename           : sim.do
+## /___/   /\     Date Last Modified : $Date: 2010/06/29 12:03:41 $
+## \   \  /  \    Date Created       : Mon May 14 2007
+##  \___\/\___\
+##
+##Device: Virtex-5
+##Purpose:
+##    Sample sim .do file to compile and simulate memory interface
+##    design and run the simulation for specified period of time. Display the
+##    waveforms that are listed with "add wave" command.
+##    Assumptions:
+##      - Simulation takes place in \sim folder of MIG output directory
+##Reference:
+##Revision History:
+###############################################################################
+vlib work
+
+#Map the required libraries here.#
+
+#Compile all modules#
+vlog  ../rtl/ddr2_chipscope*
+vlog  ../rtl/*
+#Compile files in sim folder (excluding model parameter file)#
+#$XILINX variable must be set
+vlog  $env(XILINX)/verilog/src/glbl.v
+vlog  ../sim/*.v
+
+#Pass the parameters for memory model parameter file#
+vlog  +incdir+. +define+x512Mb +define+sg37E +define+x16 ddr2_model.v
+
+#Load the design. Use required libraries.#
+vsim -t ps -novopt +notimingchecks -L unisims_ver work.sim_tb_top glbl
+
+onerror {resume}
+#Log all the objects in design. These will appear in .wlf file#
+log -r /*
+#View sim_tb_top signals in waveform#
+add wave sim:/sim_tb_top/*
+
+#Change radix to Hexadecimal#
+radix hex
+#Supress Numeric Std package and Arith package warnings.#
+#For VHDL designs we get some warnings due to unknown values on some signals at startup#
+# ** Warning: NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0#
+#We may also get some Arithmetic packeage warnings because of unknown values on#
+#some of the signals that are used in an Arithmetic operation.#
+#In order to suppress these warnings, we use following two commands#
+set NumericStdNoWarnings 1
+set StdArithNoWarnings 1
+
+#Choose simulation run time by inserting a breakpoint and then run for specified #
+#period. For more details, refer to Simulation Guide section of MIG user guide (UG086).#
+when {/sim_tb_top/phy_init_done = 1} {
+if {[when -label a_100] == ""} {
+when -label a_100 { $now = 50 us } {
+nowhen a_100
+report simulator control
+report simulator state
+if {[examine /sim_tb_top/error] == 0} {
+echo "TEST PASSED"
+stop
+}
+if {[examine /sim_tb_top/error] != 0} {
+echo "TEST FAILED: DATA ERROR"
+stop
+}
+}
+}
+}
+
+#In case calibration fails to complete, choose the run time and then stop#
+when {$now = @500 us and /sim_tb_top/phy_init_done != 1} {
+echo "TEST FAILED: CALIBRATION DID NOT COMPLETE"
+stop
+}
+
+echo "NOTE: Initial 200us power on period is skipped for simulation.
+      Change SIM_ONLY parameter in sim_tb_top file to activate this."
+
+run -all
+stop
Index: trunk/sim/ddr2_model_parameters.vh
===================================================================
--- trunk/sim/ddr2_model_parameters.vh	(revision 10)
+++ trunk/sim/ddr2_model_parameters.vh	(revision 10)
@@ -0,0 +1,1394 @@
+/****************************************************************************************
+*
+*   Disclaimer   This software code and all associated documentation, comments or other
+*  of Warranty:  information (collectively "Software") is provided "AS IS" without
+*                warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY
+*                DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+*                TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
+*                OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT
+*                WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE
+*                OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE.
+*                FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR
+*                THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
+*                ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
+*                OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI,
+*                ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT,
+*                INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING,
+*                WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION,
+*                OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE
+*                THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+*                DAMAGES. Because some jurisdictions prohibit the exclusion or
+*                limitation of liability for consequential or incidental damages, the
+*                above limitation may not apply to you.
+*
+*                Copyright 2003 Micron Technology, Inc. All rights reserved.
+*
+****************************************************************************************/
+
+    // Timing parameters based on Speed Grade
+
+                                          // SYMBOL UNITS DESCRIPTION
+                                          // ------ ----- -----------
+`ifdef x256Mb
+
+    `ifdef sg187E
+        parameter TCK_MIN          =    1875; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =      90; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =      75; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     180; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     132; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     157; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     175; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     188; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     250; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     425; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     250; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     350; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =       0; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =      75; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     300; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     175; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     125; // tIS    ps    Input Setup Time
+        parameter TIH              =     200; // tIH    ps    Input Hold Time
+        parameter TRC              =   54000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   13125; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   13125; // tRP    ps    Precharge command period
+        parameter TRPA             =   13125; // tRPA   ps    Precharge All period
+        parameter TXARDS           =      10; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       3; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       3; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       4; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      11; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   13125; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg25E
+        parameter TCK_MIN          =    2500; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     100; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     100; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     200; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     150; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     175; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     200; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     200; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     300; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     300; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     400; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =      50; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     125; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     350; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     200; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     175; // tIS    ps    Input Setup Time
+        parameter TIH              =     250; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   12500; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   12500; // tRP    ps    Precharge command period
+        parameter TRPA             =   12500; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       8; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      10; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   12500; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg25
+        parameter TCK_MIN          =    2500; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     100; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     100; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     200; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     150; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     175; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     200; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     200; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     300; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     300; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     400; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =      50; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     125; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     350; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     200; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     175; // tIS    ps    Input Setup Time
+        parameter TIH              =     250; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       8; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      10; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg3E
+        parameter TCK_MIN          =    3000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     340; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     450; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     175; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     400; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     240; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     200; // tIS    ps    Input Setup Time
+        parameter TIH              =     275; // tIH    ps    Input Hold Time
+        parameter TRC              =   54000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   12000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   12000; // tRP    ps    Precharge command period
+        parameter TRPA             =   12000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       7; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   12000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg3
+        parameter TCK_MIN          =    3000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     340; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     450; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     175; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     400; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     240; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     200; // tIS    ps    Input Setup Time
+        parameter TIH              =     275; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       7; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg37E
+        parameter TCK_MIN          =    3750; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     400; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     500; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     225; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     450; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     300; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     250; // tIS    ps    Input Setup Time
+        parameter TIH              =     375; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `define sg5E
+        parameter TCK_MIN          =    5000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     150; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     450; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     600; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     150; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     275; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     500; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     350; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     350; // tIS    ps    Input Setup Time
+        parameter TIH              =     475; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =   10000; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `endif `endif `endif `endif `endif `endif
+
+    `ifdef x16
+      `ifdef sg187E
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25E
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else // sg3E, sg3, sg37E, sg5E
+        parameter TFAW             =   50000; // tFAW  ps     Four Bank Activate window
+      `endif `endif `endif
+    `else // x4, x8
+      `ifdef sg187E
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25E
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else // sg3E, sg3, sg37E, sg5E
+        parameter TFAW             =   37500; // tFAW  ps     Four Bank Activate window
+      `endif `endif `endif
+    `endif
+
+        // Timing Parameters
+
+        // Mode Register
+        parameter AL_MIN           =       0; // AL     tCK   Minimum Additive Latency
+        parameter AL_MAX           =       6; // AL     tCK   Maximum Additive Latency
+        parameter CL_MIN           =       3; // CL     tCK   Minimum CAS Latency
+        parameter CL_MAX           =       7; // CL     tCK   Maximum CAS Latency
+        parameter WR_MIN           =       2; // WR     tCK   Minimum Write Recovery
+        parameter WR_MAX           =       8; // WR     tCK   Maximum Write Recovery
+        parameter BL_MIN           =       4; // BL     tCK   Minimum Burst Length
+        parameter BL_MAX           =       8; // BL     tCK   Minimum Burst Length
+        // Clock
+        parameter TCK_MAX          =    8000; // tCK    ps    Maximum Clock Cycle Time
+        parameter TCH_MIN          =    0.48; // tCH    tCK   Minimum Clock High-Level Pulse Width
+        parameter TCH_MAX          =    0.52; // tCH    tCK   Maximum Clock High-Level Pulse Width
+        parameter TCL_MIN          =    0.48; // tCL    tCK   Minimum Clock Low-Level Pulse Width
+        parameter TCL_MAX          =    0.52; // tCL    tCK   Maximum Clock Low-Level Pulse Width
+        // Data
+        parameter TLZ              =     TAC; // tLZ    ps    Data-out low-impedance window from CK/CK#
+        parameter THZ              =     TAC; // tHZ    ps    Data-out high impedance window from CK/CK#
+        parameter TDIPW            =    0.35; // tDIPW  tCK   DQ and DM input Pulse Width
+        // Data Strobe
+        parameter TDQSH            =    0.35; // tDQSH  tCK   DQS input High Pulse Width
+        parameter TDQSL            =    0.35; // tDQSL  tCK   DQS input Low Pulse Width
+        parameter TDSS             =    0.20; // tDSS   tCK   DQS falling edge to CLK rising (setup time)
+        parameter TDSH             =    0.20; // tDSH   tCK   DQS falling edge from CLK rising (hold time)
+        parameter TWPRE            =    0.35; // tWPRE  tCK   DQS Write Preamble
+        parameter TWPST            =    0.40; // tWPST  tCK   DQS Write Postamble
+        parameter TDQSS            =    0.25; // tDQSS  tCK   Rising clock edge to DQS/DQS# latching transition
+        // Command and Address
+        parameter TIPW             =     0.6; // tIPW   tCK   Control and Address input Pulse Width
+        parameter TCCD             =       2; // tCCD   tCK   Cas to Cas command delay
+        parameter TRAS_MIN         =   40000; // tRAS   ps    Minimum Active to Precharge command time
+        parameter TRAS_MAX         =70000000; // tRAS   ps    Maximum Active to Precharge command time
+        parameter TRTP             =    7500; // tRTP   ps    Read to Precharge command delay
+        parameter TWR              =   15000; // tWR    ps    Write recovery time
+        parameter TMRD             =       2; // tMRD   tCK   Load Mode Register command cycle time
+        parameter TDLLK            =     200; // tDLLK  tCK   DLL locking time
+        // Refresh
+        parameter TRFC_MIN         =   75000; // tRFC   ps    Refresh to Refresh Command interval minimum value
+        parameter TRFC_MAX         =70000000; // tRFC   ps    Refresh to Refresh Command Interval maximum value
+        // Self Refresh
+        parameter TXSNR   = TRFC_MIN + 10000; // tXSNR  ps    Exit self refesh to a non-read command
+        parameter TXSRD            =     200; // tXSRD  tCK   Exit self refresh to a read command
+        parameter TISXR            =     TIS; // tISXR  ps    CKE setup time during self refresh exit.
+        // ODT
+        parameter TAOND            =       2; // tAOND  tCK   ODT turn-on delay
+        parameter TAOFD            =     2.5; // tAOFD  tCK   ODT turn-off delay
+        parameter TAONPD           =    2000; // tAONPD ps    ODT turn-on (precharge power-down mode)
+        parameter TAOFPD           =    2000; // tAOFPD ps    ODT turn-off (precharge power-down mode)
+        parameter TMOD             =   12000; // tMOD   ps    ODT enable in EMR to ODT pin transition
+        // Power Down
+        parameter TCKE             =       3; // tCKE   tCK   CKE minimum high or low pulse width
+
+        // Size Parameters based on Part Width
+
+    `ifdef x4
+        parameter DM_BITS          =       1; // Number of Data Mask bits
+        parameter ROW_BITS         =      13; // Number of Address bits
+        parameter COL_BITS         =      11; // Number of Column bits
+        parameter DQ_BITS          =       4; // Number of Data bits
+        parameter DQS_BITS         =       1; // Number of Dqs bits
+        parameter TRRD             =    7500; // tRRD   Active bank a to Active bank b command time
+    `else `ifdef x8
+        parameter DM_BITS          =       1; // Number of Data Mask bits
+        parameter ROW_BITS         =      13; // Number of Address bits
+        parameter COL_BITS         =      10; // Number of Column bits
+        parameter DQ_BITS          =       8; // Number of Data bits
+        parameter DQS_BITS         =       1; // Number of Dqs bits
+        parameter TRRD             =    7500; // tRRD   Active bank a to Active bank b command time
+    `else `define x16
+        parameter DM_BITS          =       2; // Number of Data Mask bits
+        parameter ROW_BITS         =      13; // Number of Address bits
+        parameter COL_BITS         =       9; // Number of Column bits
+        parameter DQ_BITS          =      16; // Number of Data bits
+        parameter DQS_BITS         =       2; // Number of Dqs bits
+        parameter TRRD             =   10000; // tRRD   Active bank a to Active bank b command time
+    `endif `endif
+
+    `ifdef QUAD_RANK
+        `define DUAL_RANK // also define DUAL_RANK
+        parameter CS_BITS          =       4; // Number of Chip Select Bits
+        parameter RANKS            =       4; // Number of Chip Select Bits
+    `else `ifdef DUAL_RANK
+        parameter CS_BITS          =       2; // Number of Chip Select Bits
+        parameter RANKS            =       2; // Number of Chip Select Bits
+    `else
+        parameter CS_BITS          =       2; // Number of Chip Select Bits
+        parameter RANKS            =       1; // Number of Chip Select Bits
+    `endif `endif
+
+        // Size Parameters
+        parameter BA_BITS          =       2; // Set this parmaeter to control how many Bank Address bits
+        parameter ADDR_BITS        =      13; // Address Bits
+        parameter MEM_BITS         =      10; // Number of write data bursts can be stored in memory.  The default is 2^10=1024.
+        parameter AP               =      10; // the address bit that controls auto-precharge and precharge-all
+        parameter BL_BITS          =       3; // the number of bits required to count to MAX_BL
+        parameter BO_BITS          =       2; // the number of Burst Order Bits
+
+`else `ifdef x512Mb
+
+    `ifdef sg187E
+        parameter TCK_MIN          =    1875; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =      90; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =      75; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     180; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     132; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     157; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     175; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     188; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     250; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     425; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     250; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     350; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =       0; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =      75; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     300; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     175; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     125; // tIS    ps    Input Setup Time
+        parameter TIH              =     200; // tIH    ps    Input Hold Time
+        parameter TRC              =   54000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   13125; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   13125; // tRP    ps    Precharge command period
+        parameter TRPA             =   13125; // tRPA   ps    Precharge All period
+        parameter TXARDS           =      10; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       3; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       3; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       4; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      11; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   13125; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg25E
+        parameter TCK_MIN          =    2500; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     100; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     100; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     200; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     150; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     175; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     200; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     200; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     300; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     300; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     400; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =      50; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     125; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     350; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     200; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     175; // tIS    ps    Input Setup Time
+        parameter TIH              =     250; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   12500; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   12500; // tRP    ps    Precharge command period
+        parameter TRPA             =   12500; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       8; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      10; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   12500; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg25
+        parameter TCK_MIN          =    2500; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     100; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     100; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     200; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     150; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     175; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     200; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     200; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     300; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     300; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     400; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =      50; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     125; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     350; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     200; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     175; // tIS    ps    Input Setup Time
+        parameter TIH              =     250; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       8; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      10; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg3E
+        parameter TCK_MIN          =    3000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     340; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     450; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     175; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     400; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     240; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     200; // tIS    ps    Input Setup Time
+        parameter TIH              =     275; // tIH    ps    Input Hold Time
+        parameter TRC              =   54000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   12000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   12000; // tRP    ps    Precharge command period
+        parameter TRPA             =   12000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       7; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   12000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg3
+        parameter TCK_MIN          =    3000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     340; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     450; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     175; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     400; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     240; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     200; // tIS    ps    Input Setup Time
+        parameter TIH              =     275; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       7; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg37E
+        parameter TCK_MIN          =    3750; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     400; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     500; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     225; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     450; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     300; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     250; // tIS    ps    Input Setup Time
+        parameter TIH              =     375; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `define sg5E
+        parameter TCK_MIN          =    5000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     150; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     450; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     600; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     150; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     275; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     500; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     350; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     350; // tIS    ps    Input Setup Time
+        parameter TIH              =     475; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =   10000; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `endif `endif `endif `endif `endif `endif
+
+    `ifdef x16
+      `ifdef sg187E
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25E
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else // sg3E, sg3, sg37E, sg5E
+        parameter TFAW             =   50000; // tFAW  ps     Four Bank Activate window
+      `endif `endif `endif
+    `else // x4, x8
+      `ifdef sg187E
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25E
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else // sg3E, sg3, sg37E, sg5E
+        parameter TFAW             =   37500; // tFAW  ps     Four Bank Activate window
+      `endif `endif `endif
+    `endif
+
+        // Timing Parameters
+
+        // Mode Register
+        parameter AL_MIN           =       0; // AL     tCK   Minimum Additive Latency
+        parameter AL_MAX           =       6; // AL     tCK   Maximum Additive Latency
+        parameter CL_MIN           =       3; // CL     tCK   Minimum CAS Latency
+        parameter CL_MAX           =       7; // CL     tCK   Maximum CAS Latency
+        parameter WR_MIN           =       2; // WR     tCK   Minimum Write Recovery
+        parameter WR_MAX           =       8; // WR     tCK   Maximum Write Recovery
+        parameter BL_MIN           =       4; // BL     tCK   Minimum Burst Length
+        parameter BL_MAX           =       8; // BL     tCK   Minimum Burst Length
+        // Clock
+        parameter TCK_MAX          =    8000; // tCK    ps    Maximum Clock Cycle Time
+        parameter TCH_MIN          =    0.48; // tCH    tCK   Minimum Clock High-Level Pulse Width
+        parameter TCH_MAX          =    0.52; // tCH    tCK   Maximum Clock High-Level Pulse Width
+        parameter TCL_MIN          =    0.48; // tCL    tCK   Minimum Clock Low-Level Pulse Width
+        parameter TCL_MAX          =    0.52; // tCL    tCK   Maximum Clock Low-Level Pulse Width
+        // Data
+        parameter TLZ              =     TAC; // tLZ    ps    Data-out low-impedance window from CK/CK#
+        parameter THZ              =     TAC; // tHZ    ps    Data-out high impedance window from CK/CK#
+        parameter TDIPW            =    0.35; // tDIPW  tCK   DQ and DM input Pulse Width
+        // Data Strobe
+        parameter TDQSH            =    0.35; // tDQSH  tCK   DQS input High Pulse Width
+        parameter TDQSL            =    0.35; // tDQSL  tCK   DQS input Low Pulse Width
+        parameter TDSS             =    0.20; // tDSS   tCK   DQS falling edge to CLK rising (setup time)
+        parameter TDSH             =    0.20; // tDSH   tCK   DQS falling edge from CLK rising (hold time)
+        parameter TWPRE            =    0.35; // tWPRE  tCK   DQS Write Preamble
+        parameter TWPST            =    0.40; // tWPST  tCK   DQS Write Postamble
+        parameter TDQSS            =    0.25; // tDQSS  tCK   Rising clock edge to DQS/DQS# latching transition
+        // Command and Address
+        parameter TIPW             =     0.6; // tIPW   tCK   Control and Address input Pulse Width
+        parameter TCCD             =       2; // tCCD   tCK   Cas to Cas command delay
+        parameter TRAS_MIN         =   40000; // tRAS   ps    Minimum Active to Precharge command time
+        parameter TRAS_MAX         =70000000; // tRAS   ps    Maximum Active to Precharge command time
+        parameter TRTP             =    7500; // tRTP   ps    Read to Precharge command delay
+        parameter TWR              =   15000; // tWR    ps    Write recovery time
+        parameter TMRD             =       2; // tMRD   tCK   Load Mode Register command cycle time
+        parameter TDLLK            =     200; // tDLLK  tCK   DLL locking time
+        // Refresh
+        parameter TRFC_MIN         =  105000; // tRFC   ps    Refresh to Refresh Command interval minimum value
+        parameter TRFC_MAX         =70000000; // tRFC   ps    Refresh to Refresh Command Interval maximum value
+        // Self Refresh
+        parameter TXSNR   = TRFC_MIN + 10000; // tXSNR  ps    Exit self refesh to a non-read command
+        parameter TXSRD            =     200; // tXSRD  tCK   Exit self refresh to a read command
+        parameter TISXR            =     TIS; // tISXR  ps    CKE setup time during self refresh exit.
+        // ODT
+        parameter TAOND            =       2; // tAOND  tCK   ODT turn-on delay
+        parameter TAOFD            =     2.5; // tAOFD  tCK   ODT turn-off delay
+        parameter TAONPD           =    2000; // tAONPD ps    ODT turn-on (precharge power-down mode)
+        parameter TAOFPD           =    2000; // tAOFPD ps    ODT turn-off (precharge power-down mode)
+        parameter TMOD             =   12000; // tMOD   ps    ODT enable in EMR to ODT pin transition
+        // Power Down
+        parameter TCKE             =       3; // tCKE   tCK   CKE minimum high or low pulse width
+
+        // Size Parameters based on Part Width
+
+    `ifdef x4
+        parameter ADDR_BITS        =      14; // Address Bits
+        parameter ROW_BITS         =      14; // Number of Address bits
+        parameter COL_BITS         =      11; // Number of Column bits
+        parameter DM_BITS          =       1; // Number of Data Mask bits
+        parameter DQ_BITS          =       4; // Number of Data bits
+        parameter DQS_BITS         =       1; // Number of Dqs bits
+        parameter TRRD             =    7500; // tRRD   Active bank a to Active bank b command time
+    `else `ifdef x8
+        parameter ADDR_BITS        =      14; // Address Bits
+        parameter ROW_BITS         =      14; // Number of Address bits
+        parameter COL_BITS         =      10; // Number of Column bits
+        parameter DM_BITS          =       1; // Number of Data Mask bits
+        parameter DQ_BITS          =       8; // Number of Data bits
+        parameter DQS_BITS         =       1; // Number of Dqs bits
+        parameter TRRD             =    7500; // tRRD   Active bank a to Active bank b command time
+    `else `define x16
+        parameter ADDR_BITS        =      13; // Address Bits
+        parameter ROW_BITS         =      13; // Number of Address bits
+        parameter COL_BITS         =      10; // Number of Column bits
+        parameter DM_BITS          =       2; // Number of Data Mask bits
+        parameter DQ_BITS          =      16; // Number of Data bits
+        parameter DQS_BITS         =       2; // Number of Dqs bits
+        parameter TRRD             =   10000; // tRRD   Active bank a to Active bank b command time
+    `endif `endif
+
+    `ifdef QUAD_RANK
+        `define DUAL_RANK // also define DUAL_RANK
+        parameter CS_BITS          =       4; // Number of Chip Select Bits
+        parameter RANKS            =       4; // Number of Chip Select Bits
+    `else `ifdef DUAL_RANK
+        parameter CS_BITS          =       2; // Number of Chip Select Bits
+        parameter RANKS            =       2; // Number of Chip Select Bits
+    `else
+        parameter CS_BITS          =       2; // Number of Chip Select Bits
+        parameter RANKS            =       1; // Number of Chip Select Bits
+    `endif `endif
+
+        // Size Parameters
+        parameter BA_BITS          =       2; // Set this parmaeter to control how many Bank Address bits
+        parameter MEM_BITS         =      10; // Number of write data bursts can be stored in memory.  The default is 2^10=1024.
+        parameter AP               =      10; // the address bit that controls auto-precharge and precharge-all
+        parameter BL_BITS          =       3; // the number of bits required to count to MAX_BL
+        parameter BO_BITS          =       2; // the number of Burst Order Bits
+
+`else `ifdef x1Gb
+
+    `ifdef sg187E
+        parameter TCK_MIN          =    1875; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =      90; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =      75; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     180; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     132; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     157; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     175; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     188; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     250; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     425; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     250; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     350; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =       0; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =      75; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     300; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     175; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     125; // tIS    ps    Input Setup Time
+        parameter TIH              =     200; // tIH    ps    Input Hold Time
+        parameter TRC              =   54000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   13125; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   13125; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =      10; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       3; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       3; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       4; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      11; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   13125; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg25E
+        parameter TCK_MIN          =    2500; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     100; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     100; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     200; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     150; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     175; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     200; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     200; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     300; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     300; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     400; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =      50; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     125; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     350; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     200; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     175; // tIS    ps    Input Setup Time
+        parameter TIH              =     250; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   12500; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   12500; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       8; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      10; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   12500; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg25
+        parameter TCK_MIN          =    2500; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     100; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     100; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     200; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     150; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     175; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     200; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     200; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     300; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     300; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     400; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =      50; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     125; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     350; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     200; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     175; // tIS    ps    Input Setup Time
+        parameter TIH              =     250; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   17500; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       8; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      10; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg3E
+        parameter TCK_MIN          =    3000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     340; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     450; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     175; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     400; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     240; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     200; // tIS    ps    Input Setup Time
+        parameter TIH              =     275; // tIH    ps    Input Hold Time
+        parameter TRC              =   54000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   12000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   12000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       7; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   12000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg3
+        parameter TCK_MIN          =    3000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     340; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     450; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     175; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     400; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     240; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     200; // tIS    ps    Input Setup Time
+        parameter TIH              =     275; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   18000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       7; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg37E
+        parameter TCK_MIN          =    3750; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     400; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     500; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     225; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     450; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     300; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     250; // tIS    ps    Input Setup Time
+        parameter TIH              =     375; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   18750; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `define sg5E
+        parameter TCK_MIN          =    5000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     150; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     450; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     600; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     150; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     275; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     500; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     350; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     350; // tIS    ps    Input Setup Time
+        parameter TIH              =     475; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =   10000; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   20000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `endif `endif `endif `endif `endif `endif
+
+    `ifdef x16
+      `ifdef sg187E
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25E
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else // sg3E, sg3, sg37E, sg5E
+        parameter TFAW             =   50000; // tFAW  ps     Four Bank Activate window
+      `endif `endif `endif
+    `else // x4, x8
+      `ifdef sg187E
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25E
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else // sg3E, sg3, sg37E, sg5E
+        parameter TFAW             =   37500; // tFAW  ps     Four Bank Activate window
+      `endif `endif `endif
+    `endif
+
+        // Timing Parameters
+
+        // Mode Register
+        parameter AL_MIN           =       0; // AL     tCK   Minimum Additive Latency
+        parameter AL_MAX           =       6; // AL     tCK   Maximum Additive Latency
+        parameter CL_MIN           =       3; // CL     tCK   Minimum CAS Latency
+        parameter CL_MAX           =       7; // CL     tCK   Maximum CAS Latency
+        parameter WR_MIN           =       2; // WR     tCK   Minimum Write Recovery
+        parameter WR_MAX           =       8; // WR     tCK   Maximum Write Recovery
+        parameter BL_MIN           =       4; // BL     tCK   Minimum Burst Length
+        parameter BL_MAX           =       8; // BL     tCK   Minimum Burst Length
+        // Clock
+        parameter TCK_MAX          =    8000; // tCK    ps    Maximum Clock Cycle Time
+        parameter TCH_MIN          =    0.48; // tCH    tCK   Minimum Clock High-Level Pulse Width
+        parameter TCH_MAX          =    0.52; // tCH    tCK   Maximum Clock High-Level Pulse Width
+        parameter TCL_MIN          =    0.48; // tCL    tCK   Minimum Clock Low-Level Pulse Width
+        parameter TCL_MAX          =    0.52; // tCL    tCK   Maximum Clock Low-Level Pulse Width
+        // Data
+        parameter TLZ              =     TAC; // tLZ    ps    Data-out low-impedance window from CK/CK#
+        parameter THZ              =     TAC; // tHZ    ps    Data-out high impedance window from CK/CK#
+        parameter TDIPW            =    0.35; // tDIPW  tCK   DQ and DM input Pulse Width
+        // Data Strobe
+        parameter TDQSH            =    0.35; // tDQSH  tCK   DQS input High Pulse Width
+        parameter TDQSL            =    0.35; // tDQSL  tCK   DQS input Low Pulse Width
+        parameter TDSS             =    0.20; // tDSS   tCK   DQS falling edge to CLK rising (setup time)
+        parameter TDSH             =    0.20; // tDSH   tCK   DQS falling edge from CLK rising (hold time)
+        parameter TWPRE            =    0.35; // tWPRE  tCK   DQS Write Preamble
+        parameter TWPST            =    0.40; // tWPST  tCK   DQS Write Postamble
+        parameter TDQSS            =    0.25; // tDQSS  tCK   Rising clock edge to DQS/DQS# latching transition
+        // Command and Address
+        parameter TIPW             =     0.6; // tIPW   tCK   Control and Address input Pulse Width
+        parameter TCCD             =       2; // tCCD   tCK   Cas to Cas command delay
+        parameter TRAS_MIN         =   40000; // tRAS   ps    Minimum Active to Precharge command time
+        parameter TRAS_MAX         =70000000; // tRAS   ps    Maximum Active to Precharge command time
+        parameter TRTP             =    7500; // tRTP   ps    Read to Precharge command delay
+        parameter TWR              =   15000; // tWR    ps    Write recovery time
+        parameter TMRD             =       2; // tMRD   tCK   Load Mode Register command cycle time
+        parameter TDLLK            =     200; // tDLLK  tCK   DLL locking time
+        // Refresh
+        parameter TRFC_MIN         =  127500; // tRFC   ps    Refresh to Refresh Command interval minimum value
+        parameter TRFC_MAX         =70000000; // tRFC   ps    Refresh to Refresh Command Interval maximum value
+        // Self Refresh
+        parameter TXSNR   = TRFC_MIN + 10000; // tXSNR  ps    Exit self refesh to a non-read command
+        parameter TXSRD            =     200; // tXSRD  tCK   Exit self refresh to a read command
+        parameter TISXR            =     TIS; // tISXR  ps    CKE setup time during self refresh exit.
+        // ODT
+        parameter TAOND            =       2; // tAOND  tCK   ODT turn-on delay
+        parameter TAOFD            =     2.5; // tAOFD  tCK   ODT turn-off delay
+        parameter TAONPD           =    2000; // tAONPD ps    ODT turn-on (precharge power-down mode)
+        parameter TAOFPD           =    2000; // tAOFPD ps    ODT turn-off (precharge power-down mode)
+        parameter TMOD             =   12000; // tMOD   ps    ODT enable in EMR to ODT pin transition
+        // Power Down
+        parameter TCKE             =       3; // tCKE   tCK   CKE minimum high or low pulse width
+
+        // Size Parameters based on Part Width
+
+    `ifdef x4
+        parameter ADDR_BITS        =      14; // Address Bits
+        parameter ROW_BITS         =      14; // Number of Address bits
+        parameter COL_BITS         =      11; // Number of Column bits
+        parameter DM_BITS          =       1; // Number of Data Mask bits
+        parameter DQ_BITS          =       4; // Number of Data bits
+        parameter DQS_BITS         =       1; // Number of Dqs bits
+        parameter TRRD             =    7500; // tRRD   Active bank a to Active bank b command time
+    `else `ifdef x8
+        parameter ADDR_BITS        =      14; // Address Bits
+        parameter ROW_BITS         =      14; // Number of Address bits
+        parameter COL_BITS         =      10; // Number of Column bits
+        parameter DM_BITS          =       1; // Number of Data Mask bits
+        parameter DQ_BITS          =       8; // Number of Data bits
+        parameter DQS_BITS         =       1; // Number of Dqs bits
+        parameter TRRD             =    7500; // tRRD   Active bank a to Active bank b command time
+    `else `define x16
+        parameter ADDR_BITS        =      13; // Address Bits
+        parameter ROW_BITS         =      13; // Number of Address bits
+        parameter COL_BITS         =      10; // Number of Column bits
+        parameter DM_BITS          =       2; // Number of Data Mask bits
+        parameter DQ_BITS          =      16; // Number of Data bits
+        parameter DQS_BITS         =       2; // Number of Dqs bits
+        parameter TRRD             =   10000; // tRRD   Active bank a to Active bank b command time
+    `endif `endif
+
+    `ifdef QUAD_RANK
+        `define DUAL_RANK // also define DUAL_RANK
+        parameter CS_BITS          =       4; // Number of Chip Select Bits
+        parameter RANKS            =       4; // Number of Chip Select Bits
+    `else `ifdef DUAL_RANK
+        parameter CS_BITS          =       2; // Number of Chip Select Bits
+        parameter RANKS            =       2; // Number of Chip Select Bits
+    `else
+        parameter CS_BITS          =       2; // Number of Chip Select Bits
+        parameter RANKS            =       1; // Number of Chip Select Bits
+    `endif `endif
+
+        // Size Parameters
+        parameter BA_BITS          =       3; // Set this parmaeter to control how many Bank Address bits
+        parameter MEM_BITS         =      10; // Number of write data bursts can be stored in memory.  The default is 2^10=1024.
+        parameter AP               =      10; // the address bit that controls auto-precharge and precharge-all
+        parameter BL_BITS          =       3; // the number of bits required to count to MAX_BL
+        parameter BO_BITS          =       2; // the number of Burst Order Bits
+
+`else `define x2Gb
+
+    `ifdef sg187E
+        parameter TCK_MIN          =    1875; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =      90; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =      75; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     180; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     132; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     157; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     175; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     188; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     250; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     425; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     250; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     350; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =       0; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =      75; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     300; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     175; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     125; // tIS    ps    Input Setup Time
+        parameter TIH              =     200; // tIH    ps    Input Hold Time
+        parameter TRC              =   54000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   13125; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   13125; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =      10; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       3; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       3; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       4; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      11; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   13125; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg25E
+        parameter TCK_MIN          =    2500; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     100; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     100; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     200; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     150; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     175; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     200; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     200; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     300; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     300; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     400; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =      50; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     125; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     350; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     200; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     175; // tIS    ps    Input Setup Time
+        parameter TIH              =     250; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   12500; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   12500; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       8; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      10; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   12500; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg25
+        parameter TCK_MIN          =    2500; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     100; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     100; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     200; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     150; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     175; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     200; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     200; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     300; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     300; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     400; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =      50; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     125; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     350; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     200; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     175; // tIS    ps    Input Setup Time
+        parameter TIH              =     250; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   17500; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       8; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =      10; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg3E
+        parameter TCK_MIN          =    3000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     340; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     450; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     175; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     400; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     240; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     200; // tIS    ps    Input Setup Time
+        parameter TIH              =     275; // tIH    ps    Input Hold Time
+        parameter TRC              =   54000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   12000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   12000; // tRP    ps    Precharge command period
+        parameter TRPA             =   15000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       7; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   12000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg3
+        parameter TCK_MIN          =    3000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     340; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     450; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     175; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     400; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     240; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     200; // tIS    ps    Input Setup Time
+        parameter TIH              =     275; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   18000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       7; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `ifdef sg37E
+        parameter TCK_MIN          =    3750; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     400; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     500; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     225; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     450; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     300; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     250; // tIS    ps    Input Setup Time
+        parameter TIH              =     375; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   18750; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `else `define sg5E
+        parameter TCK_MIN          =    5000; // tCK    ps    Minimum Clock Cycle Time
+        parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
+        parameter TJIT_DUTY        =     150; // tJIT(duty) ps Half Period Jitter
+        parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter
+        parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)
+        parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
+        parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)
+        parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
+        parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)
+        parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
+        parameter TQHS             =     450; // tQHS   ps    Data hold skew factor
+        parameter TAC              =     600; // tAC    ps    DQ output access time from CK/CK#
+        parameter TDS              =     150; // tDS    ps    DQ and DM input setup time relative to DQS
+        parameter TDH              =     275; // tDH    ps    DQ and DM input hold time relative to DQS
+        parameter TDQSCK           =     500; // tDQSCK ps    DQS output access time from CK/CK#
+        parameter TDQSQ            =     350; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
+        parameter TIS              =     350; // tIS    ps    Input Setup Time
+        parameter TIH              =     475; // tIH    ps    Input Hold Time
+        parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
+        parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
+        parameter TWTR             =   10000; // tWTR   ps    Write to Read command delay
+        parameter TRP              =   15000; // tRP    ps    Precharge command period
+        parameter TRPA             =   20000; // tRPA   ps    Precharge All period
+        parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
+        parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
+        parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command
+        parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
+        parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
+        parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
+    `endif `endif `endif `endif `endif `endif
+
+    `ifdef x16
+      `ifdef sg187E
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25E
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25
+        parameter TFAW             =   45000; // tFAW  ps     Four Bank Activate window
+      `else // sg3E, sg3, sg37E, sg5E
+        parameter TFAW             =   50000; // tFAW  ps     Four Bank Activate window
+      `endif `endif `endif
+    `else // x4, x8
+      `ifdef sg187E
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25E
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else `ifdef sg25
+        parameter TFAW             =   35000; // tFAW  ps     Four Bank Activate window
+      `else // sg3E, sg3, sg37E, sg5E
+        parameter TFAW             =   37500; // tFAW  ps     Four Bank Activate window
+      `endif `endif `endif
+    `endif
+
+        // Timing Parameters
+
+        // Mode Register
+        parameter AL_MIN           =       0; // AL     tCK   Minimum Additive Latency
+        parameter AL_MAX           =       6; // AL     tCK   Maximum Additive Latency
+        parameter CL_MIN           =       3; // CL     tCK   Minimum CAS Latency
+        parameter CL_MAX           =       7; // CL     tCK   Maximum CAS Latency
+        parameter WR_MIN           =       2; // WR     tCK   Minimum Write Recovery
+        parameter WR_MAX           =       8; // WR     tCK   Maximum Write Recovery
+        parameter BL_MIN           =       4; // BL     tCK   Minimum Burst Length
+        parameter BL_MAX           =       8; // BL     tCK   Minimum Burst Length
+        // Clock
+        parameter TCK_MAX          =    8000; // tCK    ps    Maximum Clock Cycle Time
+        parameter TCH_MIN          =    0.48; // tCH    tCK   Minimum Clock High-Level Pulse Width
+        parameter TCH_MAX          =    0.52; // tCH    tCK   Maximum Clock High-Level Pulse Width
+        parameter TCL_MIN          =    0.48; // tCL    tCK   Minimum Clock Low-Level Pulse Width
+        parameter TCL_MAX          =    0.52; // tCL    tCK   Maximum Clock Low-Level Pulse Width
+        // Data
+        parameter TLZ              =     TAC; // tLZ    ps    Data-out low-impedance window from CK/CK#
+        parameter THZ              =     TAC; // tHZ    ps    Data-out high impedance window from CK/CK#
+        parameter TDIPW            =    0.35; // tDIPW  tCK   DQ and DM input Pulse Width
+        // Data Strobe
+        parameter TDQSH            =    0.35; // tDQSH  tCK   DQS input High Pulse Width
+        parameter TDQSL            =    0.35; // tDQSL  tCK   DQS input Low Pulse Width
+        parameter TDSS             =    0.20; // tDSS   tCK   DQS falling edge to CLK rising (setup time)
+        parameter TDSH             =    0.20; // tDSH   tCK   DQS falling edge from CLK rising (hold time)
+        parameter TWPRE            =    0.35; // tWPRE  tCK   DQS Write Preamble
+        parameter TWPST            =    0.40; // tWPST  tCK   DQS Write Postamble
+        parameter TDQSS            =    0.25; // tDQSS  tCK   Rising clock edge to DQS/DQS# latching transition
+        // Command and Address
+        parameter TIPW             =     0.6; // tIPW   tCK   Control and Address input Pulse Width
+        parameter TCCD             =       2; // tCCD   tCK   Cas to Cas command delay
+        parameter TRAS_MIN         =   40000; // tRAS   ps    Minimum Active to Precharge command time
+        parameter TRAS_MAX         =70000000; // tRAS   ps    Maximum Active to Precharge command time
+        parameter TRTP             =    7500; // tRTP   ps    Read to Precharge command delay
+        parameter TWR              =   15000; // tWR    ps    Write recovery time
+        parameter TMRD             =       2; // tMRD   tCK   Load Mode Register command cycle time
+        parameter TDLLK            =     200; // tDLLK  tCK   DLL locking time
+        // Refresh
+        parameter TRFC_MIN         =  197500; // tRFC   ps    Refresh to Refresh Command interval minimum value
+        parameter TRFC_MAX         =70000000; // tRFC   ps    Refresh to Refresh Command Interval maximum value
+        // Self Refresh
+        parameter TXSNR   = TRFC_MIN + 10000; // tXSNR  ps    Exit self refesh to a non-read command
+        parameter TXSRD            =     200; // tXSRD  tCK   Exit self refresh to a read command
+        parameter TISXR            =     TIS; // tISXR  ps    CKE setup time during self refresh exit.
+        // ODT
+        parameter TAOND            =       2; // tAOND  tCK   ODT turn-on delay
+        parameter TAOFD            =     2.5; // tAOFD  tCK   ODT turn-off delay
+        parameter TAONPD           =    2000; // tAONPD ps    ODT turn-on (precharge power-down mode)
+        parameter TAOFPD           =    2000; // tAOFPD ps    ODT turn-off (precharge power-down mode)
+        parameter TMOD             =   12000; // tMOD   ps    ODT enable in EMR to ODT pin transition
+        // Power Down
+        parameter TCKE             =       3; // tCKE   tCK   CKE minimum high or low pulse width
+
+        // Size Parameters based on Part Width
+
+    `ifdef x4
+        parameter ADDR_BITS        =      15; // Address Bits
+        parameter ROW_BITS         =      15; // Number of Address bits
+        parameter COL_BITS         =      11; // Number of Column bits
+        parameter DM_BITS          =       1; // Number of Data Mask bits
+        parameter DQ_BITS          =       4; // Number of Data bits
+        parameter DQS_BITS         =       1; // Number of Dqs bits
+        parameter TRRD             =    7500; // tRRD   Active bank a to Active bank b command time
+    `else `ifdef x8
+        parameter ADDR_BITS        =      15; // Address Bits
+        parameter ROW_BITS         =      15; // Number of Address bits
+        parameter COL_BITS         =      10; // Number of Column bits
+        parameter DM_BITS          =       1; // Number of Data Mask bits
+        parameter DQ_BITS          =       8; // Number of Data bits
+        parameter DQS_BITS         =       1; // Number of Dqs bits
+        parameter TRRD             =    7500; // tRRD   Active bank a to Active bank b command time
+    `else `define x16
+        parameter ADDR_BITS        =      14; // Address Bits
+        parameter ROW_BITS         =      14; // Number of Address bits
+        parameter COL_BITS         =      10; // Number of Column bits
+        parameter DM_BITS          =       2; // Number of Data Mask bits
+        parameter DQ_BITS          =      16; // Number of Data bits
+        parameter DQS_BITS         =       2; // Number of Dqs bits
+        parameter TRRD             =   10000; // tRRD   Active bank a to Active bank b command time
+    `endif `endif
+
+    `ifdef QUAD_RANK
+        `define DUAL_RANK // also define DUAL_RANK
+        parameter CS_BITS          =       4; // Number of Chip Select Bits
+        parameter RANKS            =       4; // Number of Chip Select Bits
+    `else `ifdef DUAL_RANK
+        parameter CS_BITS          =       2; // Number of Chip Select Bits
+        parameter RANKS            =       2; // Number of Chip Select Bits
+    `else
+        parameter CS_BITS          =       2; // Number of Chip Select Bits
+        parameter RANKS            =       1; // Number of Chip Select Bits
+    `endif `endif
+
+        // Size Parameters
+        parameter BA_BITS          =       3; // Set this parmaeter to control how many Bank Address bits
+        parameter MEM_BITS         =      10; // Number of write data bursts can be stored in memory.  The default is 2^10=1024.
+        parameter AP               =      10; // the address bit that controls auto-precharge and precharge-all
+        parameter BL_BITS          =       3; // the number of bits required to count to MAX_BL
+        parameter BO_BITS          =       2; // the number of Burst Order Bits
+
+`endif `endif `endif
+
+    // Simulation parameters
+    parameter STOP_ON_ERROR    =       1; // If set to 1, the model will halt on command sequence/major errors
+    parameter DEBUG            =       1; // Turn on Debug messages
+    parameter BUS_DELAY        =       0; // delay in nanoseconds
+    parameter RANDOM_OUT_DELAY =       0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads
+    parameter RANDOM_SEED      = 711689044; //seed value for random generator.
+
+    parameter RDQSEN_PRE       =       2; // DQS driving time prior to first read strobe
+    parameter RDQSEN_PST       =       1; // DQS driving time after last read strobe
+    parameter RDQS_PRE         =       2; // DQS low time prior to first read strobe
+    parameter RDQS_PST         =       1; // DQS low time after last valid read strobe
+    parameter RDQEN_PRE        =       0; // DQ/DM driving time prior to first read data
+    parameter RDQEN_PST        =       0; // DQ/DM driving time after last read data
+    parameter WDQS_PRE         =       1; // DQS half clock periods prior to first write strobe
+    parameter WDQS_PST         =       1; // DQS half clock periods after last valid write strobe
Index: trunk/Xilinx/ddr2_phy_dqs_iob.v
===================================================================
--- trunk/Xilinx/ddr2_phy_dqs_iob.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_dqs_iob.v	(revision 10)
@@ -0,0 +1,266 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_dqs_iob.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module places the data strobes in the IOBs.
+//Reference:
+//Revision History:
+//   Rev 1.1 - Parameter HIGH_PERFORMANCE_MODE added. PK. 7/10/08
+//   Rev 1.2 - Parameter IODELAY_GRP added and constraint IODELAY_GROUP added
+//             on IODELAY primitives. PK. 11/27/08
+//   Rev 1.3 - IDDR primitve (u_iddr_dq_ce) is replaced with a negative-edge
+//             triggered flip-flop. PK. 03/20/09
+//   Rev 1.4 - To fix CR 540201, S and syn_preserve attributes are added
+//             for dqs_oe_n_r. PK. 01/08/10
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_phy_dqs_iob #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter DDR_TYPE              = 1,
+   parameter HIGH_PERFORMANCE_MODE = "TRUE",
+   parameter IODELAY_GRP           = "IODELAY_MIG"
+   )
+  (
+   input        clk0,
+   input        clkdiv0,
+   input        rst0,
+   input        dlyinc_dqs,
+   input        dlyce_dqs,
+   input        dlyrst_dqs,
+   input        dlyinc_gate,
+   input        dlyce_gate,
+   input        dlyrst_gate,
+   input        dqs_oe_n,
+   input        dqs_rst_n,
+   input        en_dqs,
+   inout        ddr_dqs,
+   inout        ddr_dqs_n,
+   output       dq_ce,
+   output       delayed_dqs
+   );
+
+  wire                     clk180;
+  wire                     dqs_bufio;
+
+  wire                     dqs_ibuf;
+  wire                     dqs_idelay;
+  wire                     dqs_oe_n_delay;
+  (* S = "TRUE" *) wire    dqs_oe_n_r /* synthesis syn_preserve = 1*/;
+  wire                     dqs_rst_n_delay;
+  reg                      dqs_rst_n_r /* synthesis syn_preserve = 1*/;
+  wire                     dqs_out;
+  wire                     en_dqs_sync /* synthesis syn_keep = 1 */;
+
+  // for simulation only. Synthesis should ignore this delay
+  localparam    DQS_NET_DELAY = 0.8;
+
+  assign        clk180 = ~clk0;
+
+  // add delta delay to inputs clocked by clk180 to avoid delta-delay
+  // simulation issues
+  assign dqs_rst_n_delay = dqs_rst_n;
+  assign dqs_oe_n_delay  = dqs_oe_n;
+
+  //***************************************************************************
+  // DQS input-side resources:
+  //  - IODELAY (pad -> IDELAY)
+  //  - BUFIO (IDELAY -> BUFIO)
+  //***************************************************************************
+
+  // Route DQS from PAD to IDELAY
+  (* IODELAY_GROUP = IODELAY_GRP *) IODELAY #
+    (
+     .DELAY_SRC("I"),
+     .IDELAY_TYPE("VARIABLE"),
+     .HIGH_PERFORMANCE_MODE(HIGH_PERFORMANCE_MODE),
+     .IDELAY_VALUE(0),
+     .ODELAY_VALUE(0)
+     )
+    u_idelay_dqs
+      (
+       .DATAOUT (dqs_idelay),
+       .C       (clkdiv0),
+       .CE      (dlyce_dqs),
+       .DATAIN  (),
+       .IDATAIN (dqs_ibuf),
+       .INC     (dlyinc_dqs),
+       .ODATAIN (),
+       .RST     (dlyrst_dqs),
+       .T       ()
+       );
+
+  // From IDELAY to BUFIO
+  BUFIO u_bufio_dqs
+    (
+     .I  (dqs_idelay),
+     .O  (dqs_bufio)
+     );
+
+  // To model additional delay of DQS BUFIO + gating network
+  // for behavioral simulation. Make sure to select a delay number smaller
+  // than half clock cycle (otherwise output will not track input changes
+  // because of inertial delay). Duplicate to avoid delta delay issues.
+  assign #(DQS_NET_DELAY) i_delayed_dqs = dqs_bufio;
+  assign #(DQS_NET_DELAY) delayed_dqs   = dqs_bufio;
+
+  //***************************************************************************
+  // DQS gate circuit (not supported for all controllers)
+  //***************************************************************************
+
+  // Gate routing:
+  //   en_dqs -> IDELAY -> en_dqs_sync -> IDDR.S -> dq_ce ->
+  //   capture IDDR.CE
+
+  // Delay CE control so that it's in phase with delayed DQS
+  (* IODELAY_GROUP = IODELAY_GRP *) IODELAY #
+    (
+     .DELAY_SRC             ("DATAIN"),
+     .IDELAY_TYPE           ("VARIABLE"),
+     .HIGH_PERFORMANCE_MODE (HIGH_PERFORMANCE_MODE),
+     .IDELAY_VALUE          (0),
+     .ODELAY_VALUE          (0)
+     )
+    u_iodelay_dq_ce
+      (
+       .DATAOUT (en_dqs_sync),
+       .C       (clkdiv0),
+       .CE      (dlyce_gate),
+       .DATAIN  (en_dqs),
+       .IDATAIN (),
+       .INC     (dlyinc_gate),
+       .ODATAIN (),
+       .RST     (dlyrst_gate),
+       .T       ()
+       );
+
+  // Generate sync'ed CE to DQ IDDR's using a negative-edge triggered flip-flop
+  // clocked by DQS. This flop should be locked to the IOB flip-flop at the same
+  // site as IODELAY u_idelay_dqs in order to use the dedicated route from
+  // the IODELAY to flip-flop (to keep this route as short as possible)
+  (* IOB = "FORCE" *) FDCPE_1 #
+    (
+     .INIT(1'b0)
+    )
+    u_iddr_dq_ce
+      (
+       .Q   (dq_ce),
+       .C   (i_delayed_dqs),
+       .CE  (1'b1),
+       .CLR (1'b0),
+       .D   (en_dqs_sync),
+       .PRE (en_dqs_sync)
+       ) /* synthesis syn_useioff = 1 */
+         /* synthesis syn_replicate = 0 */;
+
+  //***************************************************************************
+  // DQS output-side resources
+  //***************************************************************************
+
+  // synthesis attribute keep of dqs_rst_n_r is "true"
+  always @(posedge clk180)
+    dqs_rst_n_r <= dqs_rst_n_delay;
+
+  ODDR #
+    (
+     .SRTYPE("SYNC"),
+     .DDR_CLK_EDGE("OPPOSITE_EDGE")
+     )
+    u_oddr_dqs
+      (
+       .Q  (dqs_out),
+       .C  (clk180),
+       .CE (1'b1),
+       .D1 (dqs_rst_n_r),      // keep output deasserted for write preamble
+       .D2 (1'b0),
+       .R  (1'b0),
+       .S  (1'b0)
+       );
+
+  (* IOB = "FORCE" *) FDP u_tri_state_dqs
+    (
+     .D   (dqs_oe_n_delay),
+     .Q   (dqs_oe_n_r),
+     .C   (clk180),
+     .PRE (rst0)
+     ) /* synthesis syn_useioff = 1 */;
+
+  //***************************************************************************
+
+  // use either single-ended (for DDR1) or differential (for DDR2) DQS input
+
+  generate
+    if (DDR_TYPE > 0) begin: gen_dqs_iob_ddr2
+      IOBUFDS u_iobuf_dqs
+        (
+         .O   (dqs_ibuf),
+         .IO  (ddr_dqs),
+         .IOB (ddr_dqs_n),
+         .I   (dqs_out),
+         .T   (dqs_oe_n_r)
+         );
+    end else begin: gen_dqs_iob_ddr1
+      IOBUF u_iobuf_dqs
+        (
+         .O   (dqs_ibuf),
+         .IO  (ddr_dqs),
+         .I   (dqs_out),
+         .T   (dqs_oe_n_r)
+         );
+    end
+  endgenerate
+
+endmodule
Index: trunk/Xilinx/ddr2_top.v
===================================================================
--- trunk/Xilinx/ddr2_top.v	(revision 10)
+++ trunk/Xilinx/ddr2_top.v	(revision 10)
@@ -0,0 +1,276 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_top.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   System level module. This level contains just the memory controller.
+//   This level will be intiantated when the user wants to remove the
+//   synthesizable test bench, IDELAY control block and the clock
+//   generation modules.
+//Reference:
+//Revision History:
+//   Rev 1.1 - Parameter USE_DM_PORT added. PK. 6/25/08
+//   Rev 1.2 - Parameter HIGH_PERFORMANCE_MODE added. PK. 7/10/08
+//   Rev 1.3 - Parameter IODELAY_GRP added. PK. 11/27/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_top #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH            = 2,      // # of memory bank addr bits
+   parameter CKE_WIDTH             = 1,      // # of memory clock enable outputs
+   parameter CLK_WIDTH             = 1,      // # of clock outputs
+   parameter COL_WIDTH             = 10,     // # of memory column bits
+   parameter CS_NUM                = 1,      // # of separate memory chip selects
+   parameter CS_BITS               = 0,      // set to log2(CS_NUM) (rounded up)
+   parameter CS_WIDTH              = 1,      // # of total memory chip selects
+   parameter USE_DM_PORT           = 1,      // enable Data Mask (=1 enable)
+   parameter DM_WIDTH              = 9,      // # of data mask bits
+   parameter DQ_WIDTH              = 72,     // # of data width
+   parameter DQ_BITS               = 7,      // set to log2(DQS_WIDTH*DQ_PER_DQS)
+   parameter DQ_PER_DQS            = 8,      // # of DQ data bits per strobe
+   parameter DQS_WIDTH             = 9,      // # of DQS strobes
+   parameter DQS_BITS              = 4,      // set to log2(DQS_WIDTH)
+   parameter HIGH_PERFORMANCE_MODE = "TRUE", // IODELAY Performance Mode
+   parameter IODELAY_GRP           = "IODELAY_MIG", // IODELAY Group Name
+   parameter ODT_WIDTH             = 1,      // # of memory on-die term enables
+   parameter ROW_WIDTH             = 14,     // # of memory row & # of addr bits
+   parameter APPDATA_WIDTH         = 144,    // # of usr read/write data bus bits
+   parameter ADDITIVE_LAT          = 0,      // additive write latency
+   parameter BURST_LEN             = 4,      // burst length (in double words)
+   parameter BURST_TYPE            = 0,      // burst type (=0 seq; =1 interlved)
+   parameter CAS_LAT               = 5,      // CAS latency
+   parameter ECC_ENABLE            = 0,      // enable ECC (=1 enable)
+   parameter ODT_TYPE              = 1,      // ODT (=0(none),=1(75),=2(150),=3(50))
+   parameter MULTI_BANK_EN         = 1,      // enable bank management
+   parameter TWO_T_TIME_EN         = 0,      // 2t timing for unbuffered dimms
+   parameter REDUCE_DRV            = 0,      // reduced strength mem I/O (=1 yes)
+   parameter REG_ENABLE            = 1,      // registered addr/ctrl (=1 yes)
+   parameter TREFI_NS              = 7800,   // auto refresh interval (ns)
+   parameter TRAS                  = 40000,  // active->precharge delay
+   parameter TRCD                  = 15000,  // active->read/write delay
+   parameter TRFC                  = 105000, // ref->ref, ref->active delay
+   parameter TRP                   = 15000,  // precharge->command delay
+   parameter TRTP                  = 7500,   // read->precharge delay
+   parameter TWR                   = 15000,  // used to determine wr->prech
+   parameter TWTR                  = 10000,  // write->read delay
+   parameter CLK_PERIOD            = 3000,   // Core/Mem clk period (in ps)
+   parameter SIM_ONLY              = 0,      // = 1 to skip power up delay
+   parameter DEBUG_EN              = 0,      // Enable debug signals/controls
+   parameter FPGA_SPEED_GRADE      = 2       // FPGA Speed Grade
+   )
+  (
+   input                                    clk0,
+   input                                    clk90,
+   input                                    clkdiv0,
+   input                                    rst0,
+   input                                    rst90,
+   input                                    rstdiv0,
+   input [2:0]                              app_af_cmd,
+   input [30:0]                             app_af_addr,
+   input                                    app_af_wren,
+   input                                    app_wdf_wren,
+   input [APPDATA_WIDTH-1:0]                app_wdf_data,
+   input [(APPDATA_WIDTH/8)-1:0]            app_wdf_mask_data,
+   output                                   app_af_afull,
+   output                                   app_wdf_afull,
+   output                                   rd_data_valid,
+   output [APPDATA_WIDTH-1:0]               rd_data_fifo_out,
+   output [1:0]                             rd_ecc_error,
+   output                                   phy_init_done,
+   output [CLK_WIDTH-1:0]                   ddr2_ck,
+   output [CLK_WIDTH-1:0]                   ddr2_ck_n,
+   output [ROW_WIDTH-1:0]                   ddr2_a,
+   output [BANK_WIDTH-1:0]                  ddr2_ba,
+   output                                   ddr2_ras_n,
+   output                                   ddr2_cas_n,
+   output                                   ddr2_we_n,
+   output [CS_WIDTH-1:0]                    ddr2_cs_n,
+   output [CKE_WIDTH-1:0]                   ddr2_cke,
+   output [ODT_WIDTH-1:0]                   ddr2_odt,
+   output [DM_WIDTH-1:0]                    ddr2_dm,
+   inout [DQS_WIDTH-1:0]                    ddr2_dqs,
+   inout [DQS_WIDTH-1:0]                    ddr2_dqs_n,
+   inout [DQ_WIDTH-1:0]                     ddr2_dq,
+   // Debug signals (optional use)
+   input                                    dbg_idel_up_all,
+   input                                    dbg_idel_down_all,
+   input                                    dbg_idel_up_dq,
+   input                                    dbg_idel_down_dq,
+   input                                    dbg_idel_up_dqs,
+   input                                    dbg_idel_down_dqs,
+   input                                    dbg_idel_up_gate,
+   input                                    dbg_idel_down_gate,
+   input [DQ_BITS-1:0]                      dbg_sel_idel_dq,
+   input                                    dbg_sel_all_idel_dq,
+   input [DQS_BITS:0]                       dbg_sel_idel_dqs,
+   input                                    dbg_sel_all_idel_dqs,
+   input [DQS_BITS:0]                       dbg_sel_idel_gate,
+   input                                    dbg_sel_all_idel_gate,
+   output [3:0]                             dbg_calib_done,
+   output [3:0]                             dbg_calib_err,
+   output [(6*DQ_WIDTH)-1:0]                dbg_calib_dq_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]               dbg_calib_dqs_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]               dbg_calib_gate_tap_cnt,
+   output [DQS_WIDTH-1:0]                   dbg_calib_rd_data_sel,
+   output [(5*DQS_WIDTH)-1:0]               dbg_calib_rden_dly,
+   output [(5*DQS_WIDTH)-1:0]               dbg_calib_gate_dly
+   );
+
+  // memory initialization/control logic
+  ddr2_mem_if_top #
+    (
+     .BANK_WIDTH            (BANK_WIDTH),
+     .CKE_WIDTH             (CKE_WIDTH),
+     .CLK_WIDTH             (CLK_WIDTH),
+     .COL_WIDTH             (COL_WIDTH),
+     .CS_BITS               (CS_BITS),
+     .CS_NUM                (CS_NUM),
+     .CS_WIDTH              (CS_WIDTH),
+     .USE_DM_PORT           (USE_DM_PORT),
+     .DM_WIDTH              (DM_WIDTH),
+     .DQ_WIDTH              (DQ_WIDTH),
+     .DQ_BITS               (DQ_BITS),
+     .DQ_PER_DQS            (DQ_PER_DQS),
+     .DQS_BITS              (DQS_BITS),
+     .DQS_WIDTH             (DQS_WIDTH),
+     .HIGH_PERFORMANCE_MODE (HIGH_PERFORMANCE_MODE),
+     .IODELAY_GRP           (IODELAY_GRP),
+     .ODT_WIDTH             (ODT_WIDTH),
+     .ROW_WIDTH             (ROW_WIDTH),
+     .APPDATA_WIDTH         (APPDATA_WIDTH),
+     .ADDITIVE_LAT          (ADDITIVE_LAT),
+     .BURST_LEN             (BURST_LEN),
+     .BURST_TYPE            (BURST_TYPE),
+     .CAS_LAT               (CAS_LAT),
+     .ECC_ENABLE            (ECC_ENABLE),
+     .MULTI_BANK_EN         (MULTI_BANK_EN),
+     .TWO_T_TIME_EN         (TWO_T_TIME_EN),
+     .ODT_TYPE              (ODT_TYPE),
+     .DDR_TYPE              (1),
+     .REDUCE_DRV            (REDUCE_DRV),
+     .REG_ENABLE            (REG_ENABLE),
+     .TREFI_NS              (TREFI_NS),
+     .TRAS                  (TRAS),
+     .TRCD                  (TRCD),
+     .TRFC                  (TRFC),
+     .TRP                   (TRP),
+     .TRTP                  (TRTP),
+     .TWR                   (TWR),
+     .TWTR                  (TWTR),
+     .CLK_PERIOD            (CLK_PERIOD),
+     .SIM_ONLY              (SIM_ONLY),
+     .DEBUG_EN              (DEBUG_EN),
+     .FPGA_SPEED_GRADE      (FPGA_SPEED_GRADE)
+     )
+    u_mem_if_top
+      (
+       .clk0                   (clk0),
+       .clk90                  (clk90),
+       .clkdiv0                (clkdiv0),
+       .rst0                   (rst0),
+       .rst90                  (rst90),
+       .rstdiv0                (rstdiv0),
+       .app_af_cmd             (app_af_cmd),
+       .app_af_addr            (app_af_addr),
+       .app_af_wren            (app_af_wren),
+       .app_wdf_wren           (app_wdf_wren),
+       .app_wdf_data           (app_wdf_data),
+       .app_wdf_mask_data      (app_wdf_mask_data),
+       .app_af_afull           (app_af_afull),
+       .app_wdf_afull          (app_wdf_afull),
+       .rd_data_valid          (rd_data_valid),
+       .rd_data_fifo_out       (rd_data_fifo_out),
+       .rd_ecc_error           (rd_ecc_error),
+       .phy_init_done          (phy_init_done),
+       .ddr_ck                 (ddr2_ck),
+       .ddr_ck_n               (ddr2_ck_n),
+       .ddr_addr               (ddr2_a),
+       .ddr_ba                 (ddr2_ba),
+       .ddr_ras_n              (ddr2_ras_n),
+       .ddr_cas_n              (ddr2_cas_n),
+       .ddr_we_n               (ddr2_we_n),
+       .ddr_cs_n               (ddr2_cs_n),
+       .ddr_cke                (ddr2_cke),
+       .ddr_odt                (ddr2_odt),
+       .ddr_dm                 (ddr2_dm),
+       .ddr_dqs                (ddr2_dqs),
+       .ddr_dqs_n              (ddr2_dqs_n),
+       .ddr_dq                 (ddr2_dq),
+       .dbg_idel_up_all        (dbg_idel_up_all),
+       .dbg_idel_down_all      (dbg_idel_down_all),
+       .dbg_idel_up_dq         (dbg_idel_up_dq),
+       .dbg_idel_down_dq       (dbg_idel_down_dq),
+       .dbg_idel_up_dqs        (dbg_idel_up_dqs),
+       .dbg_idel_down_dqs      (dbg_idel_down_dqs),
+       .dbg_idel_up_gate       (dbg_idel_up_gate),
+       .dbg_idel_down_gate     (dbg_idel_down_gate),
+       .dbg_sel_idel_dq        (dbg_sel_idel_dq),
+       .dbg_sel_all_idel_dq    (dbg_sel_all_idel_dq),
+       .dbg_sel_idel_dqs       (dbg_sel_idel_dqs),
+       .dbg_sel_all_idel_dqs   (dbg_sel_all_idel_dqs),
+       .dbg_sel_idel_gate      (dbg_sel_idel_gate),
+       .dbg_sel_all_idel_gate  (dbg_sel_all_idel_gate),
+       .dbg_calib_done         (dbg_calib_done),
+       .dbg_calib_err          (dbg_calib_err),
+       .dbg_calib_dq_tap_cnt   (dbg_calib_dq_tap_cnt),
+       .dbg_calib_dqs_tap_cnt  (dbg_calib_dqs_tap_cnt),
+       .dbg_calib_gate_tap_cnt (dbg_calib_gate_tap_cnt),
+       .dbg_calib_rd_data_sel  (dbg_calib_rd_data_sel),
+       .dbg_calib_rden_dly     (dbg_calib_rden_dly),
+       .dbg_calib_gate_dly     (dbg_calib_gate_dly)
+       );
+
+endmodule
Index: trunk/Xilinx/ddr2_ctrl.v
===================================================================
--- trunk/Xilinx/ddr2_ctrl.v	(revision 10)
+++ trunk/Xilinx/ddr2_ctrl.v	(revision 10)
@@ -0,0 +1,1230 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_ctrl.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 30 2006
+//  \___\/\___\
+//
+//
+//Device: Virtex-5
+//Design Name: DDR/DDR2
+//Purpose:
+//   This module is the main control logic of the memory interface. All
+//   commands are issued from here according to the burst, CAS Latency and the
+//   user commands.
+//Reference:
+//Revision History:
+//   Rev 1.2 - Fixed auto refresh to activate bug. KP 11-19-2007
+//   Rev 1.3 - For Dual Rank parts support CS logic modified. KP. 05/08/08
+//   Rev 1.4 - AUTO_REFRESH_WAIT state modified for Auto Refresh flag asserted
+//             immediately after calibration is completed. KP. 07/28/08
+//   Rev 1.5 - Assignment of bank_valid_r is modified to fix a bug in 
+//             Bank Management logic. PK. 10/29/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_ctrl #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH    = 2,
+   parameter COL_WIDTH     = 10,
+   parameter CS_BITS       = 0,
+   parameter CS_NUM        = 1,
+   parameter ROW_WIDTH     = 14,
+   parameter ADDITIVE_LAT  = 0,
+   parameter BURST_LEN     = 4,
+   parameter CAS_LAT       = 5,
+   parameter ECC_ENABLE    = 0,
+   parameter REG_ENABLE    = 1,
+   parameter TREFI_NS      = 7800,
+   parameter TRAS          = 40000,
+   parameter TRCD          = 15000,
+   parameter TRRD          = 10000,
+   parameter TRFC          = 105000,
+   parameter TRP           = 15000,
+   parameter TRTP          = 7500,
+   parameter TWR           = 15000,
+   parameter TWTR          = 10000,
+   parameter CLK_PERIOD    = 3000,
+   parameter MULTI_BANK_EN = 1,
+   parameter TWO_T_TIME_EN = 0,
+   parameter DDR_TYPE      = 1
+   )
+  (
+   input                   clk,
+   input                   rst,
+   input [2:0]             af_cmd,
+   input [30:0]            af_addr,
+   input                   af_empty,
+   input                   phy_init_done,
+   output                  ctrl_ref_flag,
+   output                  ctrl_af_rden,
+   output reg              ctrl_wren,
+   output reg              ctrl_rden,
+   output [ROW_WIDTH-1:0]  ctrl_addr,
+   output [BANK_WIDTH-1:0] ctrl_ba,
+   output                  ctrl_ras_n,
+   output                  ctrl_cas_n,
+   output                  ctrl_we_n,
+   output [CS_NUM-1:0]     ctrl_cs_n
+   );
+
+  // input address split into various ranges
+  localparam ROW_RANGE_START     = COL_WIDTH;
+  localparam ROW_RANGE_END       = ROW_WIDTH + ROW_RANGE_START - 1;
+  localparam BANK_RANGE_START    = ROW_RANGE_END + 1;
+  localparam BANK_RANGE_END      = BANK_WIDTH + BANK_RANGE_START - 1;
+  localparam CS_RANGE_START      = BANK_RANGE_START + BANK_WIDTH;
+  localparam CS_RANGE_END        = CS_BITS + CS_RANGE_START - 1;
+  // compare address (for determining bank/row hits) split into various ranges
+  // (compare address doesn't include column bits)
+  localparam CMP_WIDTH            = CS_BITS + BANK_WIDTH + ROW_WIDTH;
+  localparam CMP_ROW_RANGE_START  = 0;
+  localparam CMP_ROW_RANGE_END    = ROW_WIDTH + CMP_ROW_RANGE_START - 1;
+  localparam CMP_BANK_RANGE_START = CMP_ROW_RANGE_END + 1;
+  localparam CMP_BANK_RANGE_END   = BANK_WIDTH + CMP_BANK_RANGE_START - 1;
+  localparam CMP_CS_RANGE_START   = CMP_BANK_RANGE_END + 1;
+  localparam CMP_CS_RANGE_END     = CS_BITS + CMP_CS_RANGE_START-1;
+
+  localparam BURST_LEN_DIV2      = BURST_LEN / 2;
+  localparam OPEN_BANK_NUM       = 4;
+  localparam CS_BITS_FIX         = (CS_BITS == 0) ? 1 : CS_BITS;
+
+  // calculation counters based on clock cycle and memory parameters
+  // TRAS: ACTIVE->PRECHARGE interval - 2
+  localparam integer TRAS_CYC = (TRAS + CLK_PERIOD)/CLK_PERIOD;
+  // TRCD: ACTIVE->READ/WRITE interval - 3 (for DDR2 factor in ADD_LAT)
+  localparam integer TRRD_CYC = (TRRD + CLK_PERIOD)/CLK_PERIOD;
+  localparam integer TRCD_CYC = (((TRCD + CLK_PERIOD)/CLK_PERIOD) >
+                                 ADDITIVE_LAT )?
+             ((TRCD+CLK_PERIOD)/ CLK_PERIOD) - ADDITIVE_LAT : 0;
+  // TRFC: REFRESH->REFRESH, REFRESH->ACTIVE interval - 2
+  localparam integer TRFC_CYC = (TRFC + CLK_PERIOD)/CLK_PERIOD;
+  // TRP: PRECHARGE->COMMAND interval - 2
+   // for precharge all add 1 extra clock cycle
+  localparam integer TRP_CYC =  ((TRP + CLK_PERIOD)/CLK_PERIOD) +1;
+  // TRTP: READ->PRECHARGE interval - 2 (Al + BL/2 + (max (TRTP, 2tck))-2
+  localparam integer TRTP_TMP_MIN = (((TRTP + CLK_PERIOD)/CLK_PERIOD) >= 2)?
+                                     ((TRTP + CLK_PERIOD)/CLK_PERIOD) : 2;
+  localparam integer TRTP_CYC = TRTP_TMP_MIN + ADDITIVE_LAT
+                                + BURST_LEN_DIV2 - 2;
+  // TWR: WRITE->PRECHARGE interval - 2
+  localparam integer WR_LAT = (DDR_TYPE > 0) ? CAS_LAT + ADDITIVE_LAT - 1 : 1;
+  localparam integer TWR_CYC = ((TWR + CLK_PERIOD)/CLK_PERIOD) +
+             WR_LAT + BURST_LEN_DIV2 ;
+  // TWTR: WRITE->READ interval - 3 (for DDR1, TWTR = 2 clks)
+  // DDR2 = CL-1 + BL/2 +TWTR
+  localparam integer TWTR_TMP_MIN = ((TWTR + CLK_PERIOD) % CLK_PERIOD)?((TWTR + CLK_PERIOD)/CLK_PERIOD) + 1:(TWTR + CLK_PERIOD)/CLK_PERIOD;
+  localparam integer TWTR_CYC = (DDR_TYPE > 0) ? (TWTR_TMP_MIN + (CAS_LAT -1)
+                                 + BURST_LEN_DIV2 ): 2;
+
+  //  TRTW: READ->WRITE interval - 3
+  //  DDR1: CL + (BL/2)
+  //  DDR2: (BL/2) + 2. Two more clocks are added to
+  //  the DDR2 counter to account for the delay in
+  //  arrival of the DQS during reads (pcb trace + buffer
+  //  delays + memory parameters).
+  localparam TRTW_CYC = (DDR_TYPE > 0) ? BURST_LEN_DIV2 + 4 :
+             (CAS_LAT == 25) ? 2 + BURST_LEN_DIV2 : CAS_LAT + BURST_LEN_DIV2;
+
+  localparam integer CAS_LAT_RD = (CAS_LAT == 25) ? 2 : CAS_LAT;
+
+  // Make sure all values >= 0 (some may be = 0)
+  localparam TRAS_COUNT = (TRAS_CYC > 0) ? TRAS_CYC : 0;
+  localparam TRCD_COUNT = (TRCD_CYC > 0) ? TRCD_CYC : 0;
+  localparam TRRD_COUNT = (TRRD_CYC > 0) ? TRRD_CYC : 0;
+  localparam TRFC_COUNT = (TRFC_CYC > 0) ? TRFC_CYC : 0;
+  localparam TRP_COUNT  = (TRP_CYC > 0)  ? TRP_CYC  : 0;
+  localparam TRTP_COUNT = (TRTP_CYC > 0) ? TRTP_CYC : 0;
+  localparam TWR_COUNT  = (TWR_CYC > 0)  ? TWR_CYC  : 0;
+  localparam TWTR_COUNT = (TWTR_CYC > 0) ? TWTR_CYC : 0;
+  localparam TRTW_COUNT = (TRTW_CYC > 0) ? TRTW_CYC : 0;
+
+  // Auto refresh interval
+  localparam TREFI_COUNT = ((TREFI_NS * 1000)/CLK_PERIOD) - 1;
+
+  // memory controller states
+  localparam   CTRL_IDLE                =     5'h00;
+  localparam   CTRL_PRECHARGE           =     5'h01;
+  localparam   CTRL_PRECHARGE_WAIT      =     5'h02;
+  localparam   CTRL_AUTO_REFRESH        =     5'h03;
+  localparam   CTRL_AUTO_REFRESH_WAIT   =     5'h04;
+  localparam   CTRL_ACTIVE              =     5'h05;
+  localparam   CTRL_ACTIVE_WAIT         =     5'h06;
+  localparam   CTRL_BURST_READ          =     5'h07;
+  localparam   CTRL_READ_WAIT           =     5'h08;
+  localparam   CTRL_BURST_WRITE         =     5'h09;
+  localparam   CTRL_WRITE_WAIT          =     5'h0A;
+  localparam   CTRL_PRECHARGE_WAIT1     =     5'h0B;
+
+
+  reg [CMP_WIDTH-1:0]                      act_addr_r;
+  wire [30:0]                              af_addr_r;
+  reg [30:0]                               af_addr_r1;
+  reg [30:0]                               af_addr_r2;
+  reg [30:0]                               af_addr_r3;
+  wire [2:0]                               af_cmd_r;
+  reg [2:0]                                af_cmd_r1;
+  reg [2:0]                                af_cmd_r2;
+  reg                                      af_valid_r;
+  reg                                      af_valid_r1;
+  reg                                      af_valid_r2;
+  reg [CS_BITS_FIX :0]                     auto_cnt_r;
+  reg                                      auto_ref_r;
+  reg [(OPEN_BANK_NUM*CMP_WIDTH)-1:0]      bank_cmp_addr_r;
+  reg [OPEN_BANK_NUM-1:0]                  bank_hit;
+  reg [OPEN_BANK_NUM-1:0]                  bank_hit_r;
+  reg [OPEN_BANK_NUM-1:0]                  bank_hit_r1;
+  reg [OPEN_BANK_NUM-1:0]                  bank_valid_r;
+  reg                                      bank_conflict_r;
+  reg                                      conflict_resolved_r;
+  reg                                      ctrl_af_rden_r;
+  reg                                      conflict_detect_r;
+  wire                                     conflict_detect;
+  reg                                      cs_change_r;
+  reg                                      cs_change_sticky_r;
+  reg [ROW_WIDTH-1:0]                      ddr_addr_r;
+  wire [ROW_WIDTH-1:0]                     ddr_addr_col;
+  wire [ROW_WIDTH-1:0]                     ddr_addr_row;
+  reg [BANK_WIDTH-1:0]                     ddr_ba_r;
+  reg                                      ddr_cas_n_r;
+  reg [CS_NUM-1:0]                         ddr_cs_n_r;
+  reg                                      ddr_ras_n_r;
+  reg                                      ddr_we_n_r;
+  reg [4:0]                                next_state;
+  reg                                      no_precharge_wait_r;
+  reg                                      no_precharge_r;
+  reg                                      no_precharge_r1;
+  reg                                      phy_init_done_r;
+  reg [4:0]                                precharge_ok_cnt_r;
+  reg                                      precharge_ok_r;
+  reg [4:0]                                ras_cnt_r;
+  reg [3:0]                                rcd_cnt_r;
+  reg                                      rcd_cnt_ok_r;
+  reg [2:0]                                rdburst_cnt_r;
+  reg                                      rdburst_ok_r;
+  reg                                      rdburst_rden_ok_r;
+  reg                                      rd_af_flag_r;
+  wire                                     rd_flag;
+  reg                                      rd_flag_r;
+  reg [4:0]                                rd_to_wr_cnt_r;
+  reg                                      rd_to_wr_ok_r;
+  reg                                      ref_flag_r;
+  reg [11:0]                               refi_cnt_r;
+  reg                                      refi_cnt_ok_r;
+  reg                                      rst_r
+                                           /* synthesis syn_preserve = 1 */;
+  reg                                      rst_r1
+                                           /* synthesis syn_maxfan = 10 */;
+  reg [7:0]                                rfc_cnt_r;
+  reg                                      rfc_ok_r;
+  reg [3:0]                                row_miss;
+  reg [3:0]                                row_conflict_r;
+  reg [3:0]                                rp_cnt_r;
+  reg                                      rp_cnt_ok_r;
+  reg [CMP_WIDTH-1:0]                      sb_open_add_r;
+  reg [4:0]                                state_r;
+  reg [4:0]                                state_r1;
+  wire                                     sm_rden;
+  reg                                      sm_rden_r;
+  reg [2:0]                                trrd_cnt_r;
+  reg                                      trrd_cnt_ok_r;
+  reg [2:0]                                two_t_enable_r;
+  reg [CS_NUM-1:0]                         two_t_enable_r1;
+  reg [2:0]                                wrburst_cnt_r;
+  reg                                      wrburst_ok_r;
+  reg                                      wrburst_wren_ok_r;
+  wire                                     wr_flag;
+  reg                                      wr_flag_r;
+  reg [4:0]                                wr_to_rd_cnt_r;
+  reg                                      wr_to_rd_ok_r;
+
+  // XST attributes for local reset "tree"
+  // synthesis attribute shreg_extract of rst_r is "no";
+  // synthesis attribute shreg_extract of rst_r1 is "no";
+  // synthesis attribute equivalent_register_removal of rst_r is "no"
+
+  //***************************************************************************
+
+  // sm_rden is used to assert read enable to the address FIFO
+  assign sm_rden = ((state_r == CTRL_BURST_WRITE) ||
+                    (state_r == CTRL_BURST_READ)) ;
+
+  // assert read flag to the adress FIFO
+  assign ctrl_af_rden = sm_rden || rd_af_flag_r;
+
+  // local reset "tree" for controller logic only. Create this to ease timing
+  // on reset path. Prohibit equivalent register removal on RST_R to prevent
+  // "sharing" with other local reset trees (caution: make sure global fanout
+  // limit is set to large enough value, otherwise SLICES may be used for
+  // fanout control on RST_R.
+  always @(posedge clk) begin
+    rst_r  <= rst;
+    rst_r1 <= rst_r;
+  end
+
+  //*****************************************************************
+  // interpret commands from Command/Address FIFO
+  //*****************************************************************
+
+  assign wr_flag = (af_valid_r2) ? ((af_cmd_r2 == 3'b000) ? 1'b1 : 1'b0): 1'b0;
+  assign rd_flag = (af_valid_r2) ? ((af_cmd_r2 == 3'b001) ? 1'b1 : 1'b0): 1'b0;
+
+  always @(posedge clk) begin
+    rd_flag_r <= rd_flag;
+    wr_flag_r <= wr_flag;
+  end
+
+  //////////////////////////////////////////////////
+  // The data from the address FIFO is fetched and
+  // stored in two register stages. The data will be
+  // pulled out of the second register stage whenever
+  // the state machine can handle new data from the
+  // address FIFO.
+
+  // This flag is asserted when there is no
+  // cmd & address in the pipe. When there is
+  // valid cmd & addr from the address FIFO the
+  // af_valid signals will be asserted. This flag will
+  // be set the cycle af_valid_r is de-asserted.
+  always @(posedge clk) begin
+    // for simulation purposes - to force CTRL_AF_RDEN low during reset
+    if (rst_r1)
+      rd_af_flag_r <= 1'd0;
+    else if((ctrl_af_rden_r) ||
+            (rd_af_flag_r && (af_valid_r || af_valid_r1)))
+         rd_af_flag_r <= 1'd0;
+    else if (~af_valid_r1 || ~af_valid_r)
+         rd_af_flag_r <= 1'd1;
+
+  end
+
+  // First register stage for the cmd & add from the FIFO.
+  // The af_valid_r signal gives the status of the data
+  // in this stage. The af_valid_r will be asserted when there
+  // is valid data. This register stage will be updated
+  // 1. read to the FIFO and the FIFO not empty
+  // 2. After write and read states
+  // 3. The valid signal is not asserted in the last stage.
+  always @(posedge clk) begin
+    if (rst_r1)begin
+      af_valid_r <= 1'd0;
+    end else begin
+      if (ctrl_af_rden_r || sm_rden_r || ~af_valid_r1
+          || ~af_valid_r2)begin
+        af_valid_r <= ctrl_af_rden_r;
+      end
+    end
+  end
+
+  // The output register in the FIFO is used. The addr
+  // and command are already registered in the FIFO.
+  assign af_addr_r = af_addr;
+  assign af_cmd_r = af_cmd;
+
+  // Second register stage for the cmd & add from the FIFO.
+  // The af_valid_r1 signal gives the status of the data
+  // in this stage. The af_valid_r will be asserted when there
+  // is valid data. This register stage will be updated
+  // 1. read to the FIFO and the FIFO not empty and there
+  // is no valid data on this stage
+  // 2. After write and read states
+  // 3. The valid signal is not asserted in the last stage.
+  always@(posedge clk) begin
+    if (rst_r1)begin
+      af_valid_r1 <= 1'd0;
+      af_addr_r1 <= {31{1'bx}};
+      af_cmd_r1 <= {3{1'bx}};
+    end else if (~af_valid_r1 || sm_rden_r ||
+                  ~af_valid_r2) begin
+      af_valid_r1 <= af_valid_r;
+      af_addr_r1 <= af_addr_r;
+      af_cmd_r1 <= af_cmd_r;
+    end
+  end
+
+  // The state machine uses the address and command in this
+  // register stage. The data is fetched from the second
+  // register stage whenever the state machine can accept new
+  // addr. The conflict flags are also generated based on the
+  // second register stage and updated when the new address
+  // is loaded for the state machine.
+  always@(posedge clk) begin
+    if (rst_r1)begin
+      af_valid_r2 <= 1'd0;
+      af_addr_r2 <= {31{1'bx}};
+      af_cmd_r2 <= {3{1'bx}};
+      bank_hit_r <= {OPEN_BANK_NUM{1'bx}};
+      bank_conflict_r <= 1'bx;
+      row_conflict_r <= 4'bx;
+    end else if(sm_rden || ~af_valid_r2)begin
+      af_valid_r2 <= af_valid_r1;
+      af_addr_r2 <= af_addr_r1;
+      af_cmd_r2 <= af_cmd_r1;
+      if(MULTI_BANK_EN)begin
+        bank_hit_r <= bank_hit;
+        row_conflict_r <= row_miss;
+        bank_conflict_r <= (~(|bank_hit));
+      end else begin
+        bank_hit_r <= {OPEN_BANK_NUM{1'b0}};
+        bank_conflict_r <= 1'd0;
+        row_conflict_r[0] <= (af_addr_r1[CS_RANGE_END:ROW_RANGE_START]
+                              != sb_open_add_r[CMP_WIDTH-1:0]);
+      end
+    end
+  end // always@ (posedge clk)
+
+  //detecting cs change for multi chip select case
+  generate
+    if(CS_NUM > 1) begin: gen_cs_change
+       always @(posedge clk) begin
+          if(sm_rden || ~af_valid_r2)begin
+            cs_change_r <= af_addr_r1[CS_RANGE_END:CS_RANGE_START] !=
+                       af_addr_r2[CS_RANGE_END:CS_RANGE_START] ;
+            cs_change_sticky_r <=
+             af_addr_r1[CS_RANGE_END:CS_RANGE_START] !=
+             af_addr_r2[CS_RANGE_END:CS_RANGE_START] ;
+          end else
+            cs_change_r <= 1'd0;
+       end
+    end // block: gen_cs_change
+    else begin: gen_cs_0
+       always @(posedge clk) begin
+          cs_change_r <= 1'd0;
+          cs_change_sticky_r <= 1'd0;
+       end
+    end
+ endgenerate
+
+  assign conflict_detect = (MULTI_BANK_EN) ?
+                           ((|(row_conflict_r[3:0] & bank_hit_r[3:0]))
+                            | bank_conflict_r) & af_valid_r2 :
+                           row_conflict_r[0] & af_valid_r2;
+
+  always @(posedge clk) begin
+    conflict_detect_r <= conflict_detect;
+    sm_rden_r <= sm_rden;
+    af_addr_r3 <= af_addr_r2;
+    ctrl_af_rden_r <= ctrl_af_rden & ~af_empty;
+  end
+
+  // conflict resolved signal. When this signal is asserted
+  // the conflict is resolved. The address to be compared
+  // for the conflict_resolved_r will be stored in act_add_r
+  // when the bank is opened.
+  always @(posedge clk) begin
+   conflict_resolved_r <= (act_addr_r ==
+                           af_addr_r2[CS_RANGE_END:ROW_RANGE_START]);
+    if((state_r == CTRL_ACTIVE))
+      act_addr_r <= af_addr_r2[CS_RANGE_END:ROW_RANGE_START];
+  end
+
+  //***************************************************************************
+  // Bank management logic
+  // Semi-hardcoded for now for 4 banks
+  // will keep multiple banks open if MULTI_BANK_EN is true.
+  //***************************************************************************
+
+  genvar bank_i;
+  generate // if multiple bank option chosen
+    if(MULTI_BANK_EN) begin: gen_multi_bank_open
+
+      for (bank_i = 0; bank_i < OPEN_BANK_NUM;
+           bank_i = bank_i + 1) begin: gen_bank_hit1
+        // asserted if bank address match + open bank entry is valid
+        always @(*) begin
+          bank_hit[bank_i]
+            = ((bank_cmp_addr_r[(CMP_WIDTH*(bank_i+1))-1:
+                                (CMP_WIDTH*bank_i)+ROW_WIDTH] ==
+                af_addr_r1[CS_RANGE_END:BANK_RANGE_START]) &&
+               bank_valid_r[bank_i]);
+          // asserted if row address match (no check for bank entry valid, rely
+          // on this term to be used in conjunction with BANK_HIT[])
+          row_miss[bank_i]
+            = (bank_cmp_addr_r[(CMP_WIDTH*bank_i)+ROW_WIDTH-1:
+                               (CMP_WIDTH*bank_i)] !=
+               af_addr_r1[ROW_RANGE_END:ROW_RANGE_START]);
+        end
+      end
+
+      always @(posedge clk) begin
+        no_precharge_wait_r  <= bank_valid_r[3] & bank_conflict_r;
+        bank_hit_r1 <= bank_hit_r;
+      end
+
+      always@(*)
+        no_precharge_r = ~bank_valid_r[3] & bank_conflict_r;
+
+      always@(posedge clk)
+        no_precharge_r1 <= no_precharge_r;
+
+
+      always @(posedge clk) begin
+        // Clear all bank valid bits during AR (i.e. since all banks get
+        // precharged during auto-refresh)
+        if ((state_r1 == CTRL_AUTO_REFRESH)) begin
+          bank_valid_r    <= {OPEN_BANK_NUM{1'b0}};
+          bank_cmp_addr_r <= {(OPEN_BANK_NUM*CMP_WIDTH-1){1'b0}};
+        end else begin
+          if (state_r1 == CTRL_ACTIVE) begin
+            // 00 is always going to have the latest bank and row.
+            bank_cmp_addr_r[CMP_WIDTH-1:0]
+              <= af_addr_r3[CS_RANGE_END:ROW_RANGE_START];
+            // This indicates the bank was activated
+            bank_valid_r[0] <= 1'b1;
+
+            case ({bank_hit_r1[2:0]})
+              3'b001: begin
+                bank_cmp_addr_r[CMP_WIDTH-1:0]
+                  <= af_addr_r3[CS_RANGE_END:ROW_RANGE_START];
+                // This indicates the bank was activated
+                bank_valid_r[0] <= 1'b1;
+              end
+              3'b010: begin //(b0->b1)
+                bank_cmp_addr_r[(2*CMP_WIDTH)-1:CMP_WIDTH]
+                  <= bank_cmp_addr_r[CMP_WIDTH-1:0];
+                bank_valid_r[1] <= bank_valid_r[0];
+              end
+              3'b100:begin //(b0->b1, b1->b2)
+                bank_cmp_addr_r[(2*CMP_WIDTH)-1:CMP_WIDTH]
+                  <= bank_cmp_addr_r[CMP_WIDTH-1:0];
+                bank_cmp_addr_r[(3*CMP_WIDTH)-1:2*CMP_WIDTH]
+                  <= bank_cmp_addr_r[(2*CMP_WIDTH)-1:CMP_WIDTH];
+                bank_valid_r[1] <= bank_valid_r[0];
+                bank_valid_r[2] <= bank_valid_r[1];
+              end
+              default: begin //(b0->b1, b1->b2, b2->b3)
+                bank_cmp_addr_r[(2*CMP_WIDTH)-1:CMP_WIDTH]
+                  <= bank_cmp_addr_r[CMP_WIDTH-1:0];
+                bank_cmp_addr_r[(3*CMP_WIDTH)-1:2*CMP_WIDTH]
+                  <= bank_cmp_addr_r[(2*CMP_WIDTH)-1:CMP_WIDTH];
+                bank_cmp_addr_r[(4*CMP_WIDTH)-1:3*CMP_WIDTH]
+                  <= bank_cmp_addr_r[(3*CMP_WIDTH)-1:2*CMP_WIDTH];
+                bank_valid_r[1] <= bank_valid_r[0];
+                bank_valid_r[2] <= bank_valid_r[1];
+                bank_valid_r[3] <= bank_valid_r[2];
+              end
+            endcase
+          end
+        end
+      end
+    end else begin: gen_single_bank_open // single bank option
+      always @(posedge clk) begin
+        no_precharge_r       <= 1'd0;
+        no_precharge_r1      <= 1'd0;
+        no_precharge_wait_r  <= 1'd0;
+        if (rst_r1)
+          sb_open_add_r <= {CMP_WIDTH{1'b0}};
+        else if (state_r == CTRL_ACTIVE)
+          sb_open_add_r <= af_addr_r2[CS_RANGE_END:ROW_RANGE_START];
+      end
+    end
+  endgenerate
+
+  //***************************************************************************
+  // Timing counters
+  //***************************************************************************
+
+  //*****************************************************************
+  // Write and read enable generation for PHY
+  //*****************************************************************
+
+  // write burst count. Counts from (BL/2 to 1).
+  // Also logic for controller write enable.
+  always @(posedge clk) begin
+    if (state_r == CTRL_BURST_WRITE) begin
+      wrburst_cnt_r <= BURST_LEN_DIV2;
+    end else if (wrburst_cnt_r >= 3'd1)
+      wrburst_cnt_r <= wrburst_cnt_r - 1;
+  end // always @ (posedge clk)
+
+
+  always @(posedge clk) begin
+    if (rst_r1) begin
+      ctrl_wren   <= 1'b0;
+    end else if (state_r == CTRL_BURST_WRITE) begin
+      ctrl_wren   <= 1'b1;
+    end else if (wrburst_wren_ok_r)
+      ctrl_wren   <= 1'b0;
+  end
+
+
+  always @(posedge clk) begin
+    if ((state_r == CTRL_BURST_WRITE)
+        && (BURST_LEN_DIV2 > 2))
+      wrburst_ok_r <= 1'd0;
+    else if ((wrburst_cnt_r <= 3'd3) ||
+             (BURST_LEN_DIV2 <= 2))
+      wrburst_ok_r <= 1'b1;
+  end
+
+  // flag to check when wrburst count has reached
+  // a value of 1. This flag is used in the ctrl_wren
+  // logic
+  always @(posedge clk) begin
+     if(wrburst_cnt_r == 3'd2)
+       wrburst_wren_ok_r <=1'b1;
+     else
+       wrburst_wren_ok_r <= 1'b0;
+  end
+
+
+  // read burst count. Counts from (BL/2 to 1)
+  always @(posedge clk) begin
+   if (state_r == CTRL_BURST_READ) begin
+      rdburst_cnt_r <= BURST_LEN_DIV2;
+    end else if (rdburst_cnt_r >= 3'd1)
+      rdburst_cnt_r <= rdburst_cnt_r - 1;
+  end // always @ (posedge clk)
+
+
+   always @(posedge clk) begin
+    if (rst_r1) begin
+      ctrl_rden   <= 1'b0;
+    end else if (state_r == CTRL_BURST_READ) begin
+      ctrl_rden   <= 1'b1;
+    end else if (rdburst_rden_ok_r)
+      ctrl_rden   <= 1'b0;
+   end
+
+  // the rd_burst_ok_r signal will be asserted one cycle later
+  // in multi chip select cases if the back to back read is to
+  // different chip selects. The cs_changed_sticky_r signal will
+  // be asserted only for multi chip select cases.
+  always @(posedge clk) begin
+    if ((state_r == CTRL_BURST_READ)
+        && (BURST_LEN_DIV2 > 2))
+      rdburst_ok_r <= 1'd0;
+    else if ((rdburst_cnt_r <=( 3'd3 - cs_change_sticky_r)) ||
+             (BURST_LEN_DIV2 <= 2))
+      rdburst_ok_r <= 1'b1;
+  end
+
+  // flag to check when rdburst count has reached
+  // a value of 1. This flag is used in the ctrl_rden
+  // logic
+  always @(posedge clk) begin
+     if (rdburst_cnt_r == 3'd2)
+       rdburst_rden_ok_r <= 1'b1;
+     else
+       rdburst_rden_ok_r <= 1'b0;
+  end
+
+
+  //*****************************************************************
+  // Various delay counters
+  // The counters are checked for value of <= 3 to determine the
+  // if the count values are reached during different commands.
+  // It is checked for 3 because
+  // 1. The counters are loaded during the state when the command
+  //    state is reached (+1)
+  // 2. After the <= 3 condition is reached the sm takes two cycles
+  //    to transition to the new command state (+2)
+  //*****************************************************************
+
+  // tRP count - precharge command period
+  always @(posedge clk) begin
+    if (state_r == CTRL_PRECHARGE)
+      rp_cnt_r <= TRP_COUNT;
+    else if (rp_cnt_r != 4'd0)
+      rp_cnt_r <= rp_cnt_r - 1;
+  end
+
+  always @(posedge clk) begin
+    if (state_r == CTRL_PRECHARGE)
+      rp_cnt_ok_r <= 1'd0;
+    else if (rp_cnt_r <= 4'd3)
+      rp_cnt_ok_r <= 1'd1;
+  end
+
+  // tRFC count - refresh-refresh, refresh-active
+  always @(posedge clk) begin
+    if (state_r == CTRL_AUTO_REFRESH)
+      rfc_cnt_r <= TRFC_COUNT;
+    else if (rfc_cnt_r != 8'd0)
+      rfc_cnt_r <= rfc_cnt_r - 1;
+  end
+
+  always @(posedge clk) begin
+    if (state_r == CTRL_AUTO_REFRESH)
+      rfc_ok_r <= 1'b0;
+    else if(rfc_cnt_r <= 8'd3)
+      rfc_ok_r <= 1'b1;
+  end
+
+  // tRCD count - active to read/write
+  always @(posedge clk) begin
+    if (state_r == CTRL_ACTIVE)
+      rcd_cnt_r <= TRCD_COUNT;
+    else if (rcd_cnt_r != 4'd0)
+      rcd_cnt_r <= rcd_cnt_r - 1;
+  end
+
+  always @(posedge clk) begin
+    if ((state_r == CTRL_ACTIVE)
+        && (TRCD_COUNT > 2))
+      rcd_cnt_ok_r <= 1'd0;
+    else if (rcd_cnt_r <= 4'd3)
+      rcd_cnt_ok_r <= 1;
+  end
+
+  // tRRD count - active to active
+  always @(posedge clk) begin
+    if (state_r == CTRL_ACTIVE)
+      trrd_cnt_r <= TRRD_COUNT;
+    else if (trrd_cnt_r != 3'd0)
+      trrd_cnt_r <= trrd_cnt_r - 1;
+  end
+
+  always @(posedge clk) begin
+    if (state_r == CTRL_ACTIVE)
+      trrd_cnt_ok_r <= 1'd0;
+    else if (trrd_cnt_r <= 3'd3)
+      trrd_cnt_ok_r <= 1;
+  end
+
+  // tRAS count - active to precharge
+  always @(posedge clk) begin
+    if (state_r == CTRL_ACTIVE)
+      ras_cnt_r <= TRAS_COUNT;
+    else if (ras_cnt_r != 5'd0)
+      ras_cnt_r <= ras_cnt_r - 1;
+  end
+
+  // counter for write to prcharge
+  // read to precharge and
+  // activate to precharge
+  // precharge_ok_cnt_r is added with trtp count,
+  // there can be cases where the sm can go from
+  // activate to read and the act->pre count time
+  // would not have been satisfied. The rd->pre
+   // time is very less. wr->pre time is almost the
+   // same as act-> pre
+  always @(posedge clk) begin
+    if (rst_r1)
+      precharge_ok_cnt_r <= 5'd0;	    
+    else if (state_r == CTRL_BURST_READ) begin
+      // assign only if the cnt is < TRTP_COUNT
+      if (precharge_ok_cnt_r < TRTP_COUNT)
+        precharge_ok_cnt_r <= TRTP_COUNT;
+    end else if (state_r == CTRL_BURST_WRITE)
+      precharge_ok_cnt_r <= TWR_COUNT;
+    else if (state_r == CTRL_ACTIVE)
+      if (precharge_ok_cnt_r <= TRAS_COUNT)
+        precharge_ok_cnt_r <= TRAS_COUNT;
+      else
+        precharge_ok_cnt_r <= precharge_ok_cnt_r - 1;
+    else if (precharge_ok_cnt_r != 5'd0)
+      precharge_ok_cnt_r <= precharge_ok_cnt_r - 1;
+  end
+
+  always @(posedge clk) begin
+    if ((state_r == CTRL_BURST_READ) ||
+        (state_r == CTRL_BURST_WRITE)||
+        (state_r == CTRL_ACTIVE))
+      precharge_ok_r <= 1'd0;
+    else if(precharge_ok_cnt_r <= 5'd3)
+      precharge_ok_r <=1'd1;
+  end
+
+  // write to read counter
+  // write to read includes : write latency + burst time + tWTR
+  always @(posedge clk) begin
+    if (rst_r1)
+      wr_to_rd_cnt_r <= 5'd0;
+    else if (state_r == CTRL_BURST_WRITE)
+      wr_to_rd_cnt_r <= (TWTR_COUNT);
+    else if (wr_to_rd_cnt_r != 5'd0)
+      wr_to_rd_cnt_r <= wr_to_rd_cnt_r - 1;
+  end
+
+  always @(posedge clk) begin
+    if (state_r == CTRL_BURST_WRITE)
+      wr_to_rd_ok_r <= 1'd0;
+    else if (wr_to_rd_cnt_r <= 5'd3)
+      wr_to_rd_ok_r <= 1'd1;
+  end
+
+  // read to write counter
+  always @(posedge clk) begin
+    if (rst_r1)
+      rd_to_wr_cnt_r <= 5'd0;
+    else if (state_r == CTRL_BURST_READ)
+      rd_to_wr_cnt_r <= (TRTW_COUNT);
+    else if (rd_to_wr_cnt_r != 5'd0)
+      rd_to_wr_cnt_r <= rd_to_wr_cnt_r - 1;
+  end
+
+  always @(posedge clk) begin
+    if (state_r == CTRL_BURST_READ)
+      rd_to_wr_ok_r <= 1'b0;
+    else if (rd_to_wr_cnt_r <= 5'd3)
+      rd_to_wr_ok_r <= 1'b1;
+  end
+
+  always @(posedge clk) begin
+     if(refi_cnt_r == (TREFI_COUNT -1))
+       refi_cnt_ok_r <= 1'b1;
+     else
+       refi_cnt_ok_r <= 1'b0;
+  end
+
+  // auto refresh interval counter in refresh_clk domain
+  always @(posedge clk) begin
+    if ((rst_r1) || (refi_cnt_ok_r))  begin
+      refi_cnt_r <= 12'd0;
+    end else begin
+      refi_cnt_r <= refi_cnt_r + 1;
+    end
+  end // always @ (posedge clk)
+
+  // auto refresh flag
+  always @(posedge clk) begin
+    if (refi_cnt_ok_r) begin
+      ref_flag_r <= 1'b1;
+    end else begin
+      ref_flag_r <= 1'b0;
+    end
+  end // always @ (posedge clk)
+
+  assign ctrl_ref_flag = ref_flag_r;
+
+  //refresh flag detect
+  //auto_ref high indicates auto_refresh requirement
+  //auto_ref is held high until auto refresh command is issued.
+  always @(posedge clk)begin
+    if (rst_r1)
+      auto_ref_r <= 1'b0;
+    else if (ref_flag_r)
+      auto_ref_r <= 1'b1;
+    else if (state_r == CTRL_AUTO_REFRESH)
+      auto_ref_r <= 1'b0;
+  end
+
+
+  // keep track of which chip selects got auto-refreshed (avoid auto-refreshing
+  // all CS's at once to avoid current spike)
+  always @(posedge clk)begin
+    if (rst_r1 || (state_r1 == CTRL_PRECHARGE))
+      auto_cnt_r <= 'd0;
+    else if (state_r1 == CTRL_AUTO_REFRESH)
+      auto_cnt_r <= auto_cnt_r + 1;
+  end
+
+  // register for timing purposes. Extra delay doesn't really matter
+  always @(posedge clk)
+    phy_init_done_r <= phy_init_done;
+
+  always @(posedge clk)begin
+    if (rst_r1) begin
+      state_r    <= CTRL_IDLE;
+      state_r1 <= CTRL_IDLE;
+    end else begin
+      state_r    <= next_state;
+      state_r1 <= state_r;
+    end
+  end
+
+  //***************************************************************************
+  // main control state machine
+  //***************************************************************************
+
+  always @(*) begin
+    next_state = state_r;
+    (* full_case, parallel_case *) case (state_r)
+      CTRL_IDLE: begin
+        // perform auto refresh as soon as we are done with calibration.
+        // The calibration logic does not do any refreshes.
+        if (phy_init_done_r)
+          next_state = CTRL_AUTO_REFRESH;
+      end
+
+      CTRL_PRECHARGE: begin
+        if (auto_ref_r)
+          next_state = CTRL_PRECHARGE_WAIT1;
+        // when precharging an LRU bank, do not have to go to wait state
+        // since we can't possibly be activating row in same bank next
+        // disabled for 2t timing. There needs to be a gap between cmds
+        // in 2t timing
+        else if (no_precharge_wait_r && !TWO_T_TIME_EN)
+          next_state = CTRL_ACTIVE;
+        else
+          next_state = CTRL_PRECHARGE_WAIT;
+      end
+
+      CTRL_PRECHARGE_WAIT:begin
+        if (rp_cnt_ok_r)begin
+          if (auto_ref_r)
+            // precharge again to make sure we close all the banks
+            next_state = CTRL_PRECHARGE;
+          else
+            next_state = CTRL_ACTIVE;
+        end
+      end
+
+      CTRL_PRECHARGE_WAIT1:
+        if (rp_cnt_ok_r)
+          next_state = CTRL_AUTO_REFRESH;
+
+      CTRL_AUTO_REFRESH:
+        next_state = CTRL_AUTO_REFRESH_WAIT;
+
+      CTRL_AUTO_REFRESH_WAIT:
+      //staggering Auto refresh for multi
+      // chip select designs. The SM waits
+      // for the rfc time before issuing the
+      // next auto refresh.
+        if (auto_cnt_r < (CS_NUM))begin
+           if (rfc_ok_r )
+              next_state = CTRL_AUTO_REFRESH;
+           end else if (rfc_ok_r)begin
+              if(auto_ref_r)
+                // MIG 2.3: For deep designs if Auto Refresh
+                // flag asserted immediately after calibration is completed
+                next_state = CTRL_PRECHARGE;
+              else if  ( wr_flag || rd_flag)
+                next_state = CTRL_ACTIVE;
+            end
+
+      CTRL_ACTIVE:
+        next_state = CTRL_ACTIVE_WAIT;
+
+      CTRL_ACTIVE_WAIT: begin
+        if (rcd_cnt_ok_r) begin
+          if ((conflict_detect_r && ~conflict_resolved_r) ||
+              auto_ref_r) begin
+            if (no_precharge_r1 && ~auto_ref_r && trrd_cnt_ok_r)
+              next_state = CTRL_ACTIVE;
+            else  if(precharge_ok_r)
+              next_state = CTRL_PRECHARGE;
+          end else if ((wr_flag_r) && (rd_to_wr_ok_r))
+            next_state = CTRL_BURST_WRITE;
+          else if ((rd_flag_r)&& (wr_to_rd_ok_r))
+            next_state = CTRL_BURST_READ;
+        end
+      end
+
+      // beginning of write burst
+      CTRL_BURST_WRITE: begin
+        if (BURST_LEN_DIV2 == 1) begin
+          // special case if BL = 2 (i.e. burst lasts only one clk cycle)
+          if (wr_flag)
+            // if we have another non-conflict write command right after the
+            // current write, then stay in this state
+            next_state = CTRL_BURST_WRITE;
+          else
+            // otherwise, if we're done with this burst, and have no write
+            // immediately scheduled after this one, wait until write-read
+            // delay has passed
+            next_state = CTRL_WRITE_WAIT;
+        end else
+          // otherwise BL > 2, and we  have at least one more write cycle for
+          // current burst
+          next_state = CTRL_WRITE_WAIT;
+        // continuation of write burst (also covers waiting after write burst
+        // has completed for write-read delay to pass)
+      end
+
+      CTRL_WRITE_WAIT: begin
+        if ((conflict_detect) || auto_ref_r) begin
+          if (no_precharge_r && ~auto_ref_r && wrburst_ok_r)
+            next_state = CTRL_ACTIVE;
+          else if (precharge_ok_r)
+            next_state = CTRL_PRECHARGE;
+        end else if (wrburst_ok_r && wr_flag)
+          next_state = CTRL_BURST_WRITE;
+        else if ((rd_flag) && (wr_to_rd_ok_r))
+          next_state = CTRL_BURST_READ;
+      end
+
+      CTRL_BURST_READ: begin
+        if (BURST_LEN_DIV2 == 1) begin
+          // special case if BL = 2 (i.e. burst lasts only one clk cycle)
+          if (rd_flag)
+            next_state = CTRL_BURST_READ;
+          else
+            next_state = CTRL_READ_WAIT;
+        end else
+          next_state = CTRL_READ_WAIT;
+      end
+
+      CTRL_READ_WAIT: begin
+        if ((conflict_detect) || auto_ref_r)begin
+          if (no_precharge_r && ~auto_ref_r && rdburst_ok_r)
+            next_state = CTRL_ACTIVE;
+          else if (precharge_ok_r)
+            next_state = CTRL_PRECHARGE;
+        // for burst of 4 in multi chip select
+        // if there is a change in cs wait one cycle before the
+        // next read command. cs_change_r will be asserted.
+        end else if (rdburst_ok_r  && rd_flag && ~cs_change_r)
+          next_state = CTRL_BURST_READ;
+        else if (wr_flag && (rd_to_wr_ok_r))
+          next_state = CTRL_BURST_WRITE;
+      end
+    endcase
+  end
+
+  //***************************************************************************
+  // control signals to memory
+  //***************************************************************************
+
+  always @(posedge clk) begin
+     if ((state_r == CTRL_AUTO_REFRESH) ||
+         (state_r == CTRL_ACTIVE) ||
+         (state_r == CTRL_PRECHARGE)) begin
+       ddr_ras_n_r <= 1'b0;
+       two_t_enable_r[0] <= 1'b0;
+     end else begin
+       if (TWO_T_TIME_EN)
+         ddr_ras_n_r <= two_t_enable_r[0] ;
+       else
+         ddr_ras_n_r <= 1'd1;
+       two_t_enable_r[0] <= 1'b1;
+     end
+  end
+
+  always @(posedge clk)begin
+    if ((state_r == CTRL_BURST_WRITE) ||
+        (state_r == CTRL_BURST_READ) ||
+        (state_r == CTRL_AUTO_REFRESH)) begin
+      ddr_cas_n_r <= 1'b0;
+      two_t_enable_r[1] <= 1'b0;
+    end else begin
+      if (TWO_T_TIME_EN)
+        ddr_cas_n_r <= two_t_enable_r[1];
+      else
+        ddr_cas_n_r <= 1'b1;
+      two_t_enable_r[1] <= 1'b1;
+    end
+  end
+
+  always @(posedge clk) begin
+    if ((state_r == CTRL_BURST_WRITE) ||
+        (state_r == CTRL_PRECHARGE)) begin
+      ddr_we_n_r <= 1'b0;
+      two_t_enable_r[2] <= 1'b0;
+    end else begin
+      if(TWO_T_TIME_EN)
+        ddr_we_n_r <= two_t_enable_r[2];
+      else
+        ddr_we_n_r <= 1'b1;
+      two_t_enable_r[2] <= 1'b1;
+    end
+  end
+
+  // turn off auto-precharge when issuing commands (A10 = 0)
+  // mapping the col add for linear addressing.
+  generate
+    if (TWO_T_TIME_EN) begin: gen_addr_col_two_t
+      if (COL_WIDTH == ROW_WIDTH-1) begin: gen_ddr_addr_col_0
+        assign ddr_addr_col = {af_addr_r3[COL_WIDTH-1:10], 1'b0,
+                               af_addr_r3[9:0]};
+      end else begin
+        if (COL_WIDTH > 10) begin: gen_ddr_addr_col_1
+          assign ddr_addr_col = {{(ROW_WIDTH-COL_WIDTH-1){1'b0}},
+                                 af_addr_r3[COL_WIDTH-1:10], 1'b0,
+                                 af_addr_r3[9:0]};
+        end else begin: gen_ddr_addr_col_2
+          assign ddr_addr_col = {{(ROW_WIDTH-COL_WIDTH-1){1'b0}}, 1'b0,
+                               af_addr_r3[COL_WIDTH-1:0]};
+        end
+      end
+    end else begin: gen_addr_col_one_t
+      if (COL_WIDTH == ROW_WIDTH-1) begin: gen_ddr_addr_col_0_1
+        assign ddr_addr_col = {af_addr_r2[COL_WIDTH-1:10], 1'b0,
+                               af_addr_r2[9:0]};
+      end else begin
+        if (COL_WIDTH > 10) begin: gen_ddr_addr_col_1_1
+          assign ddr_addr_col = {{(ROW_WIDTH-COL_WIDTH-1){1'b0}},
+                                 af_addr_r2[COL_WIDTH-1:10], 1'b0,
+                                 af_addr_r2[9:0]};
+        end else begin: gen_ddr_addr_col_2_1
+          assign ddr_addr_col = {{(ROW_WIDTH-COL_WIDTH-1){1'b0}}, 1'b0,
+                                 af_addr_r2[COL_WIDTH-1:0]};
+        end
+      end
+    end
+  endgenerate
+
+  // Assign address during row activate
+  generate
+    if (TWO_T_TIME_EN)
+      assign ddr_addr_row = af_addr_r3[ROW_RANGE_END:ROW_RANGE_START];
+    else
+      assign ddr_addr_row = af_addr_r2[ROW_RANGE_END:ROW_RANGE_START];
+  endgenerate
+
+
+  always @(posedge clk)begin
+    if ((state_r == CTRL_ACTIVE) ||
+        ((state_r1 == CTRL_ACTIVE) && TWO_T_TIME_EN))
+      ddr_addr_r <= ddr_addr_row;
+    else if ((state_r == CTRL_BURST_WRITE) ||
+             (state_r == CTRL_BURST_READ)  ||
+             (((state_r1 == CTRL_BURST_WRITE) ||
+               (state_r1 == CTRL_BURST_READ)) &&
+              TWO_T_TIME_EN))
+      ddr_addr_r <= ddr_addr_col;
+    else if (((state_r == CTRL_PRECHARGE)  ||
+              ((state_r1 == CTRL_PRECHARGE) && TWO_T_TIME_EN))
+             && auto_ref_r) begin
+      // if we're precharging as a result of AUTO-REFRESH, precharge all banks
+      ddr_addr_r <= {ROW_WIDTH{1'b0}};
+      ddr_addr_r[10] <= 1'b1;
+    end else if ((state_r == CTRL_PRECHARGE) ||
+                 ((state_r1 == CTRL_PRECHARGE) && TWO_T_TIME_EN))
+      // if we're precharging to close a specific bank/row, set A10=0
+      ddr_addr_r <= {ROW_WIDTH{1'b0}};
+    else
+      ddr_addr_r <= {ROW_WIDTH{1'bx}};
+  end
+
+  always @(posedge clk)begin
+    // whenever we're precharging, we're either: (1) precharging all banks (in
+    // which case banks bits are don't care, (2) precharging the LRU bank,
+    // b/c we've exceeded the limit of # of banks open (need to close the LRU
+    // bank to make room for a new one), (3) we haven't exceed the maximum #
+    // of banks open, but we trying to open a different row in a bank that's
+    // already open
+    if (((state_r == CTRL_PRECHARGE)  ||
+         ((state_r1 == CTRL_PRECHARGE) && TWO_T_TIME_EN)) &&
+        bank_conflict_r && MULTI_BANK_EN)
+      // When LRU bank needs to be closed
+      ddr_ba_r <= bank_cmp_addr_r[(3*CMP_WIDTH)+CMP_BANK_RANGE_END:
+                                  (3*CMP_WIDTH)+CMP_BANK_RANGE_START];
+    else begin
+      // Either precharge due to refresh or bank hit case
+      if (TWO_T_TIME_EN)
+        ddr_ba_r <= af_addr_r3[BANK_RANGE_END:BANK_RANGE_START];
+      else
+        ddr_ba_r <= af_addr_r2[BANK_RANGE_END:BANK_RANGE_START];
+    end
+  end
+
+  // chip enable generation logic
+  generate
+    // if only one chip select, always assert it after reset
+    if (CS_BITS == 0) begin: gen_ddr_cs_0
+      always @(posedge clk)
+        if (rst_r1)
+          ddr_cs_n_r[0] <= 1'b1;
+        else
+          ddr_cs_n_r[0] <= 1'b0;
+    // otherwise if we have multiple chip selects
+      end else begin: gen_ddr_cs_1
+      if(TWO_T_TIME_EN) begin: gen_2t_cs
+         always @(posedge clk)
+           if (rst_r1)
+             ddr_cs_n_r <= {CS_NUM{1'b1}};
+           else if ((state_r1 == CTRL_AUTO_REFRESH)) begin
+             // if auto-refreshing, only auto-refresh one CS at any time (avoid
+             // beating on the ground plane by refreshing all CS's at same time)
+             ddr_cs_n_r <= {CS_NUM{1'b1}};
+             ddr_cs_n_r[auto_cnt_r] <= 1'b0;
+           end else if (auto_ref_r && (state_r1 == CTRL_PRECHARGE)) begin
+             ddr_cs_n_r <= {CS_NUM{1'b0}};
+           end else if ((state_r1 == CTRL_PRECHARGE) && ( bank_conflict_r
+                    && MULTI_BANK_EN))begin
+                  // precharging the LRU bank
+                  ddr_cs_n_r <= {CS_NUM{1'b1}};
+                  ddr_cs_n_r[bank_cmp_addr_r[(3*CMP_WIDTH)+CMP_CS_RANGE_END:
+                  (3*CMP_WIDTH)+CMP_CS_RANGE_START]] <= 1'b0;
+           end else begin
+          // otherwise, check the upper address bits to see which CS to assert
+             ddr_cs_n_r <= {CS_NUM{1'b1}};
+             ddr_cs_n_r[af_addr_r3[CS_RANGE_END:CS_RANGE_START]] <= 1'b0;
+           end // else: !if(((state_r == CTRL_PRECHARGE)  ||...
+        end else begin: gen_1t_cs // block: gen_2t_cs
+         always @(posedge clk)
+           if (rst_r1)
+             ddr_cs_n_r <= {CS_NUM{1'b1}};
+           else if ((state_r == CTRL_AUTO_REFRESH) ) begin
+             // if auto-refreshing, only auto-refresh one CS at any time (avoid
+             // beating on the ground plane by refreshing all CS's at same time)
+             ddr_cs_n_r <= {CS_NUM{1'b1}};
+             ddr_cs_n_r[auto_cnt_r] <= 1'b0;
+           end else if (auto_ref_r && (state_r == CTRL_PRECHARGE) ) begin
+             ddr_cs_n_r <= {CS_NUM{1'b0}};
+           end else if ((state_r == CTRL_PRECHARGE)  &&
+                 (bank_conflict_r && MULTI_BANK_EN))begin
+                  // precharging the LRU bank
+                  ddr_cs_n_r <= {CS_NUM{1'b1}};
+                  ddr_cs_n_r[bank_cmp_addr_r[(3*CMP_WIDTH)+CMP_CS_RANGE_END:
+                  (3*CMP_WIDTH)+CMP_CS_RANGE_START]] <= 1'b0;
+           end else begin
+          // otherwise, check the upper address bits to see which CS to assert
+             ddr_cs_n_r <= {CS_NUM{1'b1}};
+             ddr_cs_n_r[af_addr_r2[CS_RANGE_END:CS_RANGE_START]] <= 1'b0;
+           end // else: !if(((state_r == CTRL_PRECHARGE)  ||...
+        end // block: gen_1t_cs
+    end
+  endgenerate
+
+  // registring the two_t timing enable signal.
+  // This signal will be asserted (low) when the
+  // chip select has to be asserted.
+  always @(posedge clk)begin
+     if(&two_t_enable_r)
+        two_t_enable_r1 <= {CS_NUM{1'b1}};
+     else
+        two_t_enable_r1 <= {CS_NUM{1'b0}};
+  end
+
+  assign ctrl_addr  = ddr_addr_r;
+  assign ctrl_ba    = ddr_ba_r;
+  assign ctrl_ras_n = ddr_ras_n_r;
+  assign ctrl_cas_n = ddr_cas_n_r;
+  assign ctrl_we_n  = ddr_we_n_r;
+  assign ctrl_cs_n  = (TWO_T_TIME_EN) ?
+                      (ddr_cs_n_r | two_t_enable_r1) :
+                      ddr_cs_n_r;
+
+endmodule
+
Index: trunk/Xilinx/ddr2_usr_addr_fifo.v
===================================================================
--- trunk/Xilinx/ddr2_usr_addr_fifo.v	(revision 10)
+++ trunk/Xilinx/ddr2_usr_addr_fifo.v	(revision 10)
@@ -0,0 +1,131 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_usr_addr_fifo.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Mon Aug 28 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module instantiates the block RAM based FIFO to store the user
+//   address and the command information. Also calculates potential bank/row
+//   conflicts by comparing the new address with last address issued.
+//Reference:
+//Revision History:
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_usr_addr_fifo #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference 
+   // board design). Actual values may be different. Actual parameters values 
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH    = 2,
+   parameter COL_WIDTH     = 10,
+   parameter CS_BITS       = 0,
+   parameter ROW_WIDTH     = 14
+   )
+  (
+   input          clk0,
+   input          rst0,
+   input [2:0]    app_af_cmd,
+   input [30:0]   app_af_addr,
+   input          app_af_wren,
+   input          ctrl_af_rden,
+   output [2:0]   af_cmd,
+   output [30:0]  af_addr,
+   output         af_empty,
+   output         app_af_afull
+   );
+
+  wire [35:0]     fifo_data_out;
+   reg            rst_r;
+
+
+  always @(posedge clk0)
+     rst_r <= rst0;
+
+
+  //***************************************************************************
+
+  assign af_cmd      = fifo_data_out[33:31];
+  assign af_addr     = fifo_data_out[30:0];
+
+  //***************************************************************************
+
+  FIFO36 #
+    (
+     .ALMOST_EMPTY_OFFSET     (13'h0007),
+     .ALMOST_FULL_OFFSET      (13'h000F),
+     .DATA_WIDTH              (36),
+     .DO_REG                  (1),
+     .EN_SYN                  ("TRUE"),
+     .FIRST_WORD_FALL_THROUGH ("FALSE")
+     )
+    u_af
+      (
+       .ALMOSTEMPTY (),
+       .ALMOSTFULL  (app_af_afull),
+       .DO          (fifo_data_out[31:0]),
+       .DOP         (fifo_data_out[35:32]),
+       .EMPTY       (af_empty),
+       .FULL        (),
+       .RDCOUNT     (),
+       .RDERR       (),
+       .WRCOUNT     (),
+       .WRERR       (),
+       .DI          ({app_af_cmd[0],app_af_addr}),
+       .DIP         ({2'b00,app_af_cmd[2:1]}),
+       .RDCLK       (clk0),
+       .RDEN        (ctrl_af_rden),
+       .RST         (rst_r),
+       .WRCLK       (clk0),
+       .WREN        (app_af_wren)
+       );
+
+endmodule
Index: trunk/Xilinx/dram.v
===================================================================
--- trunk/Xilinx/dram.v	(revision 10)
+++ trunk/Xilinx/dram.v	(revision 10)
@@ -0,0 +1,618 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: dram.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   Top-level  module. Simple model for what the user might use
+//   Typically, the user will only instantiate MEM_INTERFACE_TOP in their
+//   code, and generate all backend logic (test bench) and all the other infrastructure logic
+//    separately.
+//   In addition to the memory controller, the module instantiates:
+//     1. Reset logic based on user clocks
+//     2. IDELAY control block
+//Reference:
+//Revision History:
+//   Rev 1.1 - Parameter USE_DM_PORT added. PK. 6/25/08
+//   Rev 1.2 - Parameter HIGH_PERFORMANCE_MODE added. PK. 7/10/08
+//   Rev 1.3 - Parameter IODELAY_GRP added. PK. 11/27/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+(* X_CORE_INFO = "mig_v3_6_ddr2_v5, Coregen 12.3" , CORE_GENERATION_INFO = "ddr2_v5,mig_v3_6,{component_name=dram, BANK_WIDTH=2, CKE_WIDTH=1, CLK_WIDTH=2, COL_WIDTH=10, CS_NUM=1, CS_WIDTH=1, DM_WIDTH=8, DQ_WIDTH=64, DQ_PER_DQS=8, DQS_WIDTH=8, ODT_WIDTH=1, ROW_WIDTH=13, ADDITIVE_LAT=0, BURST_LEN=4, BURST_TYPE=0, CAS_LAT=3, ECC_ENABLE=0, MULTI_BANK_EN=1, TWO_T_TIME_EN=1, ODT_TYPE=1, REDUCE_DRV=0, REG_ENABLE=0, TREFI_NS=7800, TRAS=40000, TRCD=15000, TRFC=105000, TRP=15000, TRTP=7500, TWR=15000, TWTR=7500, CLK_PERIOD=5000, RST_ACT_LOW=1, INTERFACE_TYPE=DDR2_SDRAM, LANGUAGE=Verilog, SYNTHESIS_TOOL=ISE, NO_OF_CONTROLLERS=1}" *)
+module dram #
+  (
+   parameter BANK_WIDTH              = 2,       
+                                       // # of memory bank addr bits.
+   parameter CKE_WIDTH               = 1,       
+                                       // # of memory clock enable outputs.
+   parameter CLK_WIDTH               = 2,       
+                                       // # of clock outputs.
+   parameter COL_WIDTH               = 10,       
+                                       // # of memory column bits.
+   parameter CS_NUM                  = 1,       
+                                       // # of separate memory chip selects.
+   parameter CS_WIDTH                = 1,       
+                                       // # of total memory chip selects.
+   parameter CS_BITS                 = 0,       
+                                       // set to log2(CS_NUM) (rounded up).
+   parameter DM_WIDTH                = 8,       
+                                       // # of data mask bits.
+   parameter DQ_WIDTH                = 64,       
+                                       // # of data width.
+   parameter DQ_PER_DQS              = 8,       
+                                       // # of DQ data bits per strobe.
+   parameter DQS_WIDTH               = 8,       
+                                       // # of DQS strobes.
+   parameter DQ_BITS                 = 6,       
+                                       // set to log2(DQS_WIDTH*DQ_PER_DQS).
+   parameter DQS_BITS                = 3,       
+                                       // set to log2(DQS_WIDTH).
+   parameter ODT_WIDTH               = 1,       
+                                       // # of memory on-die term enables.
+   parameter ROW_WIDTH               = 13,       
+                                       // # of memory row and # of addr bits.
+   parameter ADDITIVE_LAT            = 0,       
+                                       // additive write latency.
+   parameter BURST_LEN               = 4,       
+                                       // burst length (in double words).
+   parameter BURST_TYPE              = 0,       
+                                       // burst type (=0 seq; =1 interleaved).
+   parameter CAS_LAT                 = 3,       
+                                       // CAS latency.
+   parameter ECC_ENABLE              = 0,       
+                                       // enable ECC (=1 enable).
+   parameter APPDATA_WIDTH           = 128,       
+                                       // # of usr read/write data bus bits.
+   parameter MULTI_BANK_EN           = 1,       
+                                       // Keeps multiple banks open. (= 1 enable).
+   parameter TWO_T_TIME_EN           = 1,       
+                                       // 2t timing for unbuffered dimms.
+   parameter ODT_TYPE                = 1,       
+                                       // ODT (=0(none),=1(75),=2(150),=3(50)).
+   parameter REDUCE_DRV              = 0,       
+                                       // reduced strength mem I/O (=1 yes).
+   parameter REG_ENABLE              = 0,       
+                                       // registered addr/ctrl (=1 yes).
+   parameter TREFI_NS                = 7800,       
+                                       // auto refresh interval (ns).
+   parameter TRAS                    = 40000,       
+                                       // active->precharge delay.
+   parameter TRCD                    = 15000,       
+                                       // active->read/write delay.
+   parameter TRFC                    = 105000,       
+                                       // refresh->refresh, refresh->active delay.
+   parameter TRP                     = 15000,       
+                                       // precharge->command delay.
+   parameter TRTP                    = 7500,       
+                                       // read->precharge delay.
+   parameter TWR                     = 15000,       
+                                       // used to determine write->precharge.
+   parameter TWTR                    = 7500,       
+                                       // write->read delay.
+   parameter HIGH_PERFORMANCE_MODE   = "TRUE",       
+                              // # = TRUE, the IODELAY performance mode is set
+                              // to high.
+                              // # = FALSE, the IODELAY performance mode is set
+                              // to low.
+   parameter SIM_ONLY                = 0,       
+                                       // = 1 to skip SDRAM power up delay.
+   parameter DEBUG_EN                = 0,       
+                                       // Enable debug signals/controls.
+                                       // When this parameter is changed from 0 to 1,
+                                       // make sure to uncomment the coregen commands
+                                       // in ise_flow.bat or create_ise.bat files in
+                                       // par folder.
+   parameter CLK_PERIOD              = 5000,       
+                                       // Core/Memory clock period (in ps).
+   parameter DLL_FREQ_MODE           = "HIGH",       
+                                       // DCM Frequency range.
+   parameter CLK_TYPE                = "SINGLE_ENDED",       
+                                       // # = "DIFFERENTIAL " ->; Differential input clocks ,
+                                       // # = "SINGLE_ENDED" -> Single ended input clocks.
+   parameter NOCLK200                = 0,       
+                                       // clk200 enable and disable.
+   parameter RST_ACT_LOW             = 1        
+                                       // =1 for active low reset, =0 for active high.
+   )
+  (
+   inout  [DQ_WIDTH-1:0]              ddr2_dq,
+   output [ROW_WIDTH-1:0]             ddr2_a,
+   output [BANK_WIDTH-1:0]            ddr2_ba,
+   output                             ddr2_ras_n,
+   output                             ddr2_cas_n,
+   output                             ddr2_we_n,
+   output [CS_WIDTH-1:0]              ddr2_cs_n,
+   output [ODT_WIDTH-1:0]             ddr2_odt,
+   output [CKE_WIDTH-1:0]             ddr2_cke,
+   output [DM_WIDTH-1:0]              ddr2_dm,
+   input                              sys_clk,
+   input                              idly_clk_200,
+   input                              sys_rst_n,
+   output                             phy_init_done,
+   output                             rst0_tb,
+   output                             clk0_tb,
+   output                             app_wdf_afull,
+   output                             app_af_afull,
+   output                             rd_data_valid,
+   input                              app_wdf_wren,
+   input                              app_af_wren,
+   input  [30:0]                      app_af_addr,
+   input  [2:0]                       app_af_cmd,
+   output [(APPDATA_WIDTH)-1:0]                rd_data_fifo_out,
+   input  [(APPDATA_WIDTH)-1:0]                app_wdf_data,
+   input  [(APPDATA_WIDTH/8)-1:0]              app_wdf_mask_data,
+   inout  [DQS_WIDTH-1:0]             ddr2_dqs,
+   inout  [DQS_WIDTH-1:0]             ddr2_dqs_n,
+   output [CLK_WIDTH-1:0]             ddr2_ck,
+   output [CLK_WIDTH-1:0]             ddr2_ck_n
+   );
+
+  //***************************************************************************
+  // IODELAY Group Name: Replication and placement of IDELAYCTRLs will be
+  // handled automatically by software tools if IDELAYCTRLs have same refclk,
+  // reset and rdy nets. Designs with a unique RESET will commonly create a
+  // unique RDY. Constraint IODELAY_GROUP is associated to a set of IODELAYs
+  // with an IDELAYCTRL. The parameter IODELAY_GRP value can be any string.
+  //***************************************************************************
+
+  localparam IODELAY_GRP = "IODELAY_MIG";
+
+
+
+
+
+  wire                              sys_clk_p;
+  wire                              sys_clk_n;
+  wire                              clk200_p;
+  wire                              clk200_n;
+  wire                              rst0;
+  wire                              rst90;
+  wire                              rstdiv0;
+  wire                              rst200;
+  wire                              clk0;
+  wire                              clk90;
+  wire                              clkdiv0;
+  wire                              clk200;
+  wire                              idelay_ctrl_rdy;
+
+
+  //Debug signals
+
+
+  wire [3:0]                        dbg_calib_done;
+  wire [3:0]                        dbg_calib_err;
+  wire [(6*DQ_WIDTH)-1:0]           dbg_calib_dq_tap_cnt;
+  wire [(6*DQS_WIDTH)-1:0]          dbg_calib_dqs_tap_cnt;
+  wire [(6*DQS_WIDTH)-1:0]          dbg_calib_gate_tap_cnt;
+  wire [DQS_WIDTH-1:0]              dbg_calib_rd_data_sel;
+  wire [(5*DQS_WIDTH)-1:0]          dbg_calib_rden_dly;
+  wire [(5*DQS_WIDTH)-1:0]          dbg_calib_gate_dly;
+  wire                              dbg_idel_up_all;
+  wire                              dbg_idel_down_all;
+  wire                              dbg_idel_up_dq;
+  wire                              dbg_idel_down_dq;
+  wire                              dbg_idel_up_dqs;
+  wire                              dbg_idel_down_dqs;
+  wire                              dbg_idel_up_gate;
+  wire                              dbg_idel_down_gate;
+  wire [DQ_BITS-1:0]                dbg_sel_idel_dq;
+  wire                              dbg_sel_all_idel_dq;
+  wire [DQS_BITS:0]                 dbg_sel_idel_dqs;
+  wire                              dbg_sel_all_idel_dqs;
+  wire [DQS_BITS:0]                 dbg_sel_idel_gate;
+  wire                              dbg_sel_all_idel_gate;
+
+
+    // Debug signals (optional use)
+
+  //***********************************
+  // PHY Debug Port demo
+  //***********************************
+  wire [35:0]                        cs_control0;
+  wire [35:0]                        cs_control1;
+  wire [35:0]                        cs_control2;
+  wire [35:0]                        cs_control3;
+  wire [191:0]                       vio0_in;
+  wire [95:0]                        vio1_in;
+  wire [99:0]                        vio2_in;
+  wire [31:0]                        vio3_out;
+
+
+
+
+  //***************************************************************************
+
+  assign  rst0_tb = rst0;
+  assign  clk0_tb = clk0;
+  assign sys_clk_p = 1'b1;
+  assign sys_clk_n = 1'b0;
+  assign clk200_p = 1'b1;
+  assign clk200_n = 1'b0;
+
+ddr2_idelay_ctrl #
+   (
+    .IODELAY_GRP         (IODELAY_GRP)
+   )
+   u_ddr2_idelay_ctrl
+   (
+   .rst200                 (rst200),
+   .clk200                 (clk200),
+   .idelay_ctrl_rdy        (idelay_ctrl_rdy)
+   );
+
+ ddr2_infrastructure #
+ (
+   .CLK_PERIOD             (CLK_PERIOD),
+   .DLL_FREQ_MODE          (DLL_FREQ_MODE),
+   .CLK_TYPE               (CLK_TYPE),
+   .NOCLK200               (NOCLK200),
+   .RST_ACT_LOW            (RST_ACT_LOW)
+   )
+u_ddr2_infrastructure
+ (
+   .sys_clk_p              (sys_clk_p),
+   .sys_clk_n              (sys_clk_n),
+   .sys_clk                (sys_clk),
+   .clk200_p               (clk200_p),
+   .clk200_n               (clk200_n),
+   .idly_clk_200           (idly_clk_200),
+   .sys_rst_n              (sys_rst_n),
+   .rst0                   (rst0),
+   .rst90                  (rst90),
+   .rstdiv0                (rstdiv0),
+   .rst200                 (rst200),
+   .clk0                   (clk0),
+   .clk90                  (clk90),
+   .clkdiv0                (clkdiv0),
+   .clk200                 (clk200),
+   .idelay_ctrl_rdy        (idelay_ctrl_rdy)
+   );
+
+ ddr2_top #
+ (
+   .BANK_WIDTH             (BANK_WIDTH),
+   .CKE_WIDTH              (CKE_WIDTH),
+   .CLK_WIDTH              (CLK_WIDTH),
+   .COL_WIDTH              (COL_WIDTH),
+   .CS_NUM                 (CS_NUM),
+   .CS_WIDTH               (CS_WIDTH),
+   .CS_BITS                (CS_BITS),
+   .DM_WIDTH               (DM_WIDTH),
+   .DQ_WIDTH               (DQ_WIDTH),
+   .DQ_PER_DQS             (DQ_PER_DQS),
+   .DQS_WIDTH              (DQS_WIDTH),
+   .DQ_BITS                (DQ_BITS),
+   .DQS_BITS               (DQS_BITS),
+   .ODT_WIDTH              (ODT_WIDTH),
+   .ROW_WIDTH              (ROW_WIDTH),
+   .ADDITIVE_LAT           (ADDITIVE_LAT),
+   .BURST_LEN              (BURST_LEN),
+   .BURST_TYPE             (BURST_TYPE),
+   .CAS_LAT                (CAS_LAT),
+   .ECC_ENABLE             (ECC_ENABLE),
+   .APPDATA_WIDTH          (APPDATA_WIDTH),
+   .MULTI_BANK_EN          (MULTI_BANK_EN),
+   .TWO_T_TIME_EN          (TWO_T_TIME_EN),
+   .ODT_TYPE               (ODT_TYPE),
+   .REDUCE_DRV             (REDUCE_DRV),
+   .REG_ENABLE             (REG_ENABLE),
+   .TREFI_NS               (TREFI_NS),
+   .TRAS                   (TRAS),
+   .TRCD                   (TRCD),
+   .TRFC                   (TRFC),
+   .TRP                    (TRP),
+   .TRTP                   (TRTP),
+   .TWR                    (TWR),
+   .TWTR                   (TWTR),
+   .HIGH_PERFORMANCE_MODE  (HIGH_PERFORMANCE_MODE),
+   .IODELAY_GRP            (IODELAY_GRP),
+   .SIM_ONLY               (SIM_ONLY),
+   .DEBUG_EN               (DEBUG_EN),
+   .FPGA_SPEED_GRADE       (3),
+   .USE_DM_PORT            (1),
+   .CLK_PERIOD             (CLK_PERIOD)
+   )
+u_ddr2_top_0
+(
+   .ddr2_dq                (ddr2_dq),
+   .ddr2_a                 (ddr2_a),
+   .ddr2_ba                (ddr2_ba),
+   .ddr2_ras_n             (ddr2_ras_n),
+   .ddr2_cas_n             (ddr2_cas_n),
+   .ddr2_we_n              (ddr2_we_n),
+   .ddr2_cs_n              (ddr2_cs_n),
+   .ddr2_odt               (ddr2_odt),
+   .ddr2_cke               (ddr2_cke),
+   .ddr2_dm                (ddr2_dm),
+   .phy_init_done          (phy_init_done),
+   .rst0                   (rst0),
+   .rst90                  (rst90),
+   .rstdiv0                (rstdiv0),
+   .clk0                   (clk0),
+   .clk90                  (clk90),
+   .clkdiv0                (clkdiv0),
+   .app_wdf_afull          (app_wdf_afull),
+   .app_af_afull           (app_af_afull),
+   .rd_data_valid          (rd_data_valid),
+   .app_wdf_wren           (app_wdf_wren),
+   .app_af_wren            (app_af_wren),
+   .app_af_addr            (app_af_addr),
+   .app_af_cmd             (app_af_cmd),
+   .rd_data_fifo_out       (rd_data_fifo_out),
+   .app_wdf_data           (app_wdf_data),
+   .app_wdf_mask_data      (app_wdf_mask_data),
+   .ddr2_dqs               (ddr2_dqs),
+   .ddr2_dqs_n             (ddr2_dqs_n),
+   .ddr2_ck                (ddr2_ck),
+   .rd_ecc_error           (),
+   .ddr2_ck_n              (ddr2_ck_n),
+
+   .dbg_calib_done         (dbg_calib_done),
+   .dbg_calib_err          (dbg_calib_err),
+   .dbg_calib_dq_tap_cnt   (dbg_calib_dq_tap_cnt),
+   .dbg_calib_dqs_tap_cnt  (dbg_calib_dqs_tap_cnt),
+   .dbg_calib_gate_tap_cnt  (dbg_calib_gate_tap_cnt),
+   .dbg_calib_rd_data_sel  (dbg_calib_rd_data_sel),
+   .dbg_calib_rden_dly     (dbg_calib_rden_dly),
+   .dbg_calib_gate_dly     (dbg_calib_gate_dly),
+   .dbg_idel_up_all        (dbg_idel_up_all),
+   .dbg_idel_down_all      (dbg_idel_down_all),
+   .dbg_idel_up_dq         (dbg_idel_up_dq),
+   .dbg_idel_down_dq       (dbg_idel_down_dq),
+   .dbg_idel_up_dqs        (dbg_idel_up_dqs),
+   .dbg_idel_down_dqs      (dbg_idel_down_dqs),
+   .dbg_idel_up_gate       (dbg_idel_up_gate),
+   .dbg_idel_down_gate     (dbg_idel_down_gate),
+   .dbg_sel_idel_dq        (dbg_sel_idel_dq),
+   .dbg_sel_all_idel_dq    (dbg_sel_all_idel_dq),
+   .dbg_sel_idel_dqs       (dbg_sel_idel_dqs),
+   .dbg_sel_all_idel_dqs   (dbg_sel_all_idel_dqs),
+   .dbg_sel_idel_gate      (dbg_sel_idel_gate),
+   .dbg_sel_all_idel_gate  (dbg_sel_all_idel_gate)
+   );
+
+ 
+   //*****************************************************************
+  // Hooks to prevent sim/syn compilation errors (mainly for VHDL - but
+  // keep it also in Verilog version of code) w/ floating inputs if
+  // DEBUG_EN = 0.
+  //*****************************************************************
+
+  generate
+    if (DEBUG_EN == 0) begin: gen_dbg_tie_off
+      assign dbg_idel_up_all       = 'b0;
+      assign dbg_idel_down_all     = 'b0;
+      assign dbg_idel_up_dq        = 'b0;
+      assign dbg_idel_down_dq      = 'b0;
+      assign dbg_idel_up_dqs       = 'b0;
+      assign dbg_idel_down_dqs     = 'b0;
+      assign dbg_idel_up_gate      = 'b0;
+      assign dbg_idel_down_gate    = 'b0;
+      assign dbg_sel_idel_dq       = 'b0;
+      assign dbg_sel_all_idel_dq   = 'b0;
+      assign dbg_sel_idel_dqs      = 'b0;
+      assign dbg_sel_all_idel_dqs  = 'b0;
+      assign dbg_sel_idel_gate     = 'b0;
+      assign dbg_sel_all_idel_gate = 'b0;
+    end else begin: gen_dbg_enable
+      
+      //*****************************************************************
+      // PHY Debug Port example - see MIG User's Guide, XAPP858 or 
+      // Answer Record 29443
+      // This logic supports up to 32 DQ and 8 DQS I/O
+      // NOTES:
+      //   1. PHY Debug Port demo connects to 4 VIO modules:
+      //     - 3 VIO modules with only asynchronous inputs
+      //      * Monitor IDELAY taps for DQ, DQS, DQS Gate
+      //      * Calibration status
+      //     - 1 VIO module with synchronous outputs
+      //      * Allow dynamic adjustment o f IDELAY taps
+      //   2. User may need to modify this code to incorporate other
+      //      chipscope-related modules in their larger design (e.g.
+      //      if they have other ILA/VIO modules, they will need to
+      //      for example instantiate a larger ICON module). In addition
+      //      user may want to instantiate more VIO modules to control
+      //      IDELAY for more DQ, DQS than is shown here
+      //*****************************************************************
+
+      icon4 u_icon
+        (
+         .control0 (cs_control0),
+         .control1 (cs_control1),
+         .control2 (cs_control2),
+         .control3 (cs_control3)
+         );
+
+      //*****************************************************************
+      // VIO ASYNC input: Display current IDELAY setting for up to 32
+      // DQ taps (32x6) = 192
+      //*****************************************************************
+
+      vio_async_in192 u_vio0
+        (
+         .control  (cs_control0),
+         .async_in (vio0_in)
+         );
+
+      //*****************************************************************
+      // VIO ASYNC input: Display current IDELAY setting for up to 8 DQS
+      // and DQS Gate taps (8x6x2) = 96
+      //*****************************************************************
+
+      vio_async_in96 u_vio1
+        (
+         .control  (cs_control1),
+         .async_in (vio1_in)
+         );
+
+      //*****************************************************************
+      // VIO ASYNC input: Display other calibration results
+      //*****************************************************************
+
+      vio_async_in100 u_vio2
+        (
+         .control  (cs_control2),
+         .async_in (vio2_in)
+         );
+      
+      //*****************************************************************
+      // VIO SYNC output: Dynamically change IDELAY taps
+      //*****************************************************************
+      
+      vio_sync_out32 u_vio3
+        (
+         .control  (cs_control3),
+         .clk      (clkdiv0),
+         .sync_out (vio3_out)
+         );
+
+      //*****************************************************************
+      // Bit assignments:
+      // NOTE: Not all VIO, ILA inputs/outputs may be used - these will
+      //       be dependent on the user's particular bit width
+      //*****************************************************************
+
+      if (DQ_WIDTH <= 32) begin: gen_dq_le_32
+        assign vio0_in[(6*DQ_WIDTH)-1:0] 
+                 = dbg_calib_dq_tap_cnt[(6*DQ_WIDTH)-1:0];
+      end else begin: gen_dq_gt_32
+        assign vio0_in = dbg_calib_dq_tap_cnt[191:0];
+      end
+
+      if (DQS_WIDTH <= 8) begin: gen_dqs_le_8
+        assign vio1_in[(6*DQS_WIDTH)-1:0]
+                 = dbg_calib_dqs_tap_cnt[(6*DQS_WIDTH)-1:0];
+        assign vio1_in[(12*DQS_WIDTH)-1:(6*DQS_WIDTH)] 
+                 =  dbg_calib_gate_tap_cnt[(6*DQS_WIDTH)-1:0];
+      end else begin: gen_dqs_gt_32
+        assign vio1_in[47:0]  = dbg_calib_dqs_tap_cnt[47:0];
+        assign vio1_in[95:48] = dbg_calib_gate_tap_cnt[47:0];
+      end
+ 
+//dbg_calib_rd_data_sel
+
+     if (DQS_WIDTH <= 8) begin: gen_rdsel_le_8
+        assign vio2_in[(DQS_WIDTH)+7:8]    
+	         = dbg_calib_rd_data_sel[(DQS_WIDTH)-1:0];
+     end else begin: gen_rdsel_gt_32
+      assign vio2_in[15:8]    
+                 = dbg_calib_rd_data_sel[7:0];
+     end
+ 
+//dbg_calib_rden_dly
+
+     if (DQS_WIDTH <= 8) begin: gen_calrd_le_8
+       assign vio2_in[(5*DQS_WIDTH)+19:20]   
+                 = dbg_calib_rden_dly[(5*DQS_WIDTH)-1:0];
+     end else begin: gen_calrd_gt_32
+       assign vio2_in[59:20]   
+                 = dbg_calib_rden_dly[39:0];
+     end
+
+//dbg_calib_gate_dly
+
+     if (DQS_WIDTH <= 8) begin: gen_calgt_le_8
+       assign vio2_in[(5*DQS_WIDTH)+59:60]   
+                 = dbg_calib_gate_dly[(5*DQS_WIDTH)-1:0];
+     end else begin: gen_calgt_gt_32
+       assign vio2_in[99:60]   
+                 = dbg_calib_gate_dly[39:0];
+     end
+
+//dbg_sel_idel_dq
+
+     if (DQ_BITS <= 5) begin: gen_selid_le_5
+       assign dbg_sel_idel_dq[DQ_BITS-1:0]      
+                 = vio3_out[DQ_BITS+7:8];
+     end else begin: gen_selid_gt_32
+       assign dbg_sel_idel_dq[4:0]      
+                 = vio3_out[12:8];
+     end
+
+//dbg_sel_idel_dqs
+
+     if (DQS_BITS <= 3) begin: gen_seldqs_le_3
+       assign dbg_sel_idel_dqs[DQS_BITS:0]     
+                 = vio3_out[(DQS_BITS+16):16];
+     end else begin: gen_seldqs_gt_32
+       assign dbg_sel_idel_dqs[3:0]     
+                 = vio3_out[19:16];
+     end
+
+//dbg_sel_idel_gate
+
+     if (DQS_BITS <= 3) begin: gen_gtdqs_le_3
+       assign dbg_sel_idel_gate[DQS_BITS:0]    
+                 = vio3_out[(DQS_BITS+21):21];
+     end else begin: gen_gtdqs_gt_32
+       assign dbg_sel_idel_gate[3:0]    
+                 = vio3_out[24:21];
+     end
+
+
+      assign vio2_in[3:0]              = dbg_calib_done;
+      assign vio2_in[7:4]              = dbg_calib_err;
+      
+      assign dbg_idel_up_all           = vio3_out[0];
+      assign dbg_idel_down_all         = vio3_out[1];
+      assign dbg_idel_up_dq            = vio3_out[2];
+      assign dbg_idel_down_dq          = vio3_out[3];
+      assign dbg_idel_up_dqs           = vio3_out[4];
+      assign dbg_idel_down_dqs         = vio3_out[5];
+      assign dbg_idel_up_gate          = vio3_out[6];
+      assign dbg_idel_down_gate        = vio3_out[7];
+      assign dbg_sel_all_idel_dq       = vio3_out[15];
+      assign dbg_sel_all_idel_dqs      = vio3_out[20];
+      assign dbg_sel_all_idel_gate     = vio3_out[25];
+    end
+  endgenerate
+
+endmodule
Index: trunk/Xilinx/ddr2_phy_dm_iob.v
===================================================================
--- trunk/Xilinx/ddr2_phy_dm_iob.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_dm_iob.v	(revision 10)
@@ -0,0 +1,106 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_dm_iob.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module places the data mask signals into the IOBs.
+//Reference:
+//Revision History:
+//   Rev 1.1 - To fix timing issues with Synplicity 9.6.1, syn_preserve 
+//             attribute added for the instance u_dm_ce. PK. 11/11/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_phy_dm_iob
+  (
+   input  clk90,
+   input  dm_ce,
+   input  mask_data_rise,
+   input  mask_data_fall,
+   output ddr_dm
+   );
+
+  wire    dm_out;
+  wire    dm_ce_r;
+
+  FDRSE_1 u_dm_ce
+    (
+     .Q    (dm_ce_r),
+     .C    (clk90),
+     .CE   (1'b1),
+     .D    (dm_ce),
+     .R   (1'b0),
+     .S   (1'b0)
+     ) /* synthesis syn_preserve=1 */;
+
+  ODDR #
+    (
+     .SRTYPE("SYNC"),
+     .DDR_CLK_EDGE("SAME_EDGE")
+     )
+    u_oddr_dm
+      (
+       .Q  (dm_out),
+       .C  (clk90),
+       .CE (dm_ce_r),
+       .D1 (mask_data_rise),
+       .D2 (mask_data_fall),
+       .R  (1'b0),
+       .S  (1'b0)
+       );
+
+  OBUF u_obuf_dm
+    (
+     .I (dm_out),
+     .O (ddr_dm)
+     );
+
+endmodule
Index: trunk/Xilinx/ddr2_phy_write.v
===================================================================
--- trunk/Xilinx/ddr2_phy_write.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_write.v	(revision 10)
@@ -0,0 +1,469 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_write.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Thu Aug 24 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//Reference:
+//   Handles delaying various write control signals appropriately depending
+//   on CAS latency, additive latency, etc. Also splits the data and mask in
+//   rise and fall buses.
+//Revision History:
+//   Rev 1.1 - For Dual Rank parts support ODT logic corrected. PK. 08/05/08
+//   Rev 1.2 - Retain current data pattern for stage 4 calibration, and create
+//             new pattern for stage 4. RC. 09/21/09.
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_phy_write #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter DQ_WIDTH      = 72,
+   parameter CS_NUM        = 1,
+   parameter ADDITIVE_LAT  = 0,
+   parameter CAS_LAT       = 5,
+   parameter ECC_ENABLE    = 0,
+   parameter ODT_TYPE      = 1,
+   parameter REG_ENABLE    = 1,
+   parameter DDR_TYPE      = 1
+   )
+  (
+   input                       clk0,
+   input                       clk90,
+   input                       rst90,
+   input [(2*DQ_WIDTH)-1:0]    wdf_data,
+   input [(2*DQ_WIDTH/8)-1:0]  wdf_mask_data,
+   input                       ctrl_wren,
+   input                       phy_init_wren,
+   input                       phy_init_data_sel,
+   output reg                  dm_ce,
+   output reg [1:0]            dq_oe_n,
+   output reg                  dqs_oe_n ,
+   output reg                  dqs_rst_n ,
+   output                      wdf_rden,
+   output reg [CS_NUM-1:0]     odt ,
+   output [DQ_WIDTH-1:0]       wr_data_rise,
+   output [DQ_WIDTH-1:0]       wr_data_fall,
+   output [(DQ_WIDTH/8)-1:0]   mask_data_rise,
+   output [(DQ_WIDTH/8)-1:0]   mask_data_fall
+   );
+
+  localparam   MASK_WIDTH               = DQ_WIDTH/8;
+  localparam   DDR1                     = 0;
+  localparam   DDR2                     = 1;
+  localparam   DDR3                     = 2;
+
+  // (MIN,MAX) value of WR_LATENCY for DDR1:
+  //   REG_ENABLE   = (0,1)
+  //   ECC_ENABLE   = (0,1)
+  //   Write latency = 1
+  //   Total: (1,3)
+  // (MIN,MAX) value of WR_LATENCY for DDR2:
+  //   REG_ENABLE   = (0,1)
+  //   ECC_ENABLE   = (0,1)
+  //   Write latency = ADDITIVE_CAS + CAS_LAT - 1 = (0,4) + (3,5) - 1 = (2,8)
+  //     ADDITIVE_LAT = (0,4) (JEDEC79-2B)
+  //     CAS_LAT      = (3,5) (JEDEC79-2B)
+  //   Total: (2,10)
+  localparam WR_LATENCY = (DDR_TYPE == DDR3) ?
+             (ADDITIVE_LAT + (CAS_LAT) + REG_ENABLE ) :
+             (DDR_TYPE == DDR2) ?
+             (ADDITIVE_LAT + (CAS_LAT-1) + REG_ENABLE ) :
+             (1 + REG_ENABLE );
+
+  // NOTE that ODT timing does not need to be delayed for registered
+  // DIMM case, since like other control/address signals, it gets
+  // delayed by one clock cycle at the DIMM
+  localparam ODT_WR_LATENCY = WR_LATENCY - REG_ENABLE;
+
+  wire                     dm_ce_0;
+  reg                      dm_ce_r;
+  wire [1:0]               dq_oe_0;
+  reg [1:0]                dq_oe_n_90_r1;
+  reg [1:0]                dq_oe_270;
+  wire                     dqs_oe_0;
+  reg                      dqs_oe_270;
+  reg                      dqs_oe_n_180_r1;
+  wire                     dqs_rst_0;
+  reg                      dqs_rst_n_180_r1;
+  reg                      dqs_rst_270;
+  reg                      ecc_dm_error_r;
+  reg                      ecc_dm_error_r1;
+  reg [(DQ_WIDTH-1):0]     init_data_f;
+  reg [(DQ_WIDTH-1):0]     init_data_r;
+  reg [3:0]                init_wdf_cnt_r;
+  wire                     odt_0;
+  reg                      rst90_r /* synthesis syn_maxfan = 10 */;
+  reg [10:0]               wr_stages ;
+  reg [(2*DQ_WIDTH)-1:0]   wdf_data_r;
+  reg [(2*DQ_WIDTH/8)-1:0] wdf_mask_r;
+  wire [(2*DQ_WIDTH/8)-1:0] wdf_ecc_mask;
+
+  reg [(2*DQ_WIDTH/8)-1:0] wdf_mask_r1;
+  wire                     wdf_rden_0;
+  reg                      calib_rden_90_r;
+  reg                      wdf_rden_90_r;
+  reg                      wdf_rden_90_r1;
+  reg                      wdf_rden_270;
+
+  always @(posedge clk90)
+      rst90_r <= rst90;
+
+  //***************************************************************************
+  // Analysis of additional pipeline delays:
+  //   1. dq_oe (DQ 3-state): 1 CLK90 cyc in IOB 3-state FF
+  //   2. dqs_oe (DQS 3-state): 1 CLK180 cyc in IOB 3-state FF
+  //   3. dqs_rst (DQS output value reset): 1 CLK180 cyc in FF + 1 CLK180 cyc
+  //      in IOB DDR
+  //   4. odt (ODT control): 1 CLK0 cyc in IOB FF
+  //   5. write data (output two cyc after wdf_rden - output of RAMB_FIFO w/
+  //      output register enabled): 2 CLK90 cyc in OSERDES
+  //***************************************************************************
+
+  // DQS 3-state must be asserted one extra clock cycle due b/c of write
+  // pre- and post-amble (extra half clock cycle for each)
+  assign dqs_oe_0 = wr_stages[WR_LATENCY-1] | wr_stages[WR_LATENCY-2];
+
+  // same goes for ODT, need to handle both pre- and post-amble (generate
+  // ODT only for DDR2)
+  // ODT generation for DDR2 based on write latency. The MIN write
+  // latency is 2. Based on the write latency ODT is asserted.
+  generate
+    if ((DDR_TYPE != DDR1) && (ODT_TYPE > 0))begin: gen_odt_ddr2
+       if(ODT_WR_LATENCY > 3)
+         assign odt_0 =
+                   wr_stages[ODT_WR_LATENCY-2] |
+                   wr_stages[ODT_WR_LATENCY-3] |
+                   wr_stages[ODT_WR_LATENCY-4] ;
+       else if ( ODT_WR_LATENCY == 3)
+         assign odt_0 =
+                   wr_stages[ODT_WR_LATENCY-1] |
+                   wr_stages[ODT_WR_LATENCY-2] |
+                   wr_stages[ODT_WR_LATENCY-3] ;
+       else
+         assign odt_0 =
+                  wr_stages[ODT_WR_LATENCY] |
+                  wr_stages[ODT_WR_LATENCY-1] |
+                  wr_stages[ODT_WR_LATENCY-2] ;
+    end else
+      assign odt_0 = 1'b0;
+   endgenerate
+
+  assign dq_oe_0[0]   = wr_stages[WR_LATENCY-1] | wr_stages[WR_LATENCY];
+  assign dq_oe_0[1]   = wr_stages[WR_LATENCY-1] | wr_stages[WR_LATENCY-2];
+  assign dqs_rst_0    = ~wr_stages[WR_LATENCY-2];
+  assign dm_ce_0      = wr_stages[WR_LATENCY] | wr_stages[WR_LATENCY-1]
+                        | wr_stages[WR_LATENCY-2];
+
+  // write data fifo, read flag assertion
+  generate
+    if (DDR_TYPE != DDR1) begin: gen_wdf_ddr2
+      if (WR_LATENCY > 2)
+        assign wdf_rden_0 = wr_stages[WR_LATENCY-3];
+      else
+        assign wdf_rden_0 = wr_stages[WR_LATENCY-2];
+    end else begin: gen_wdf_ddr1
+      assign wdf_rden_0 = wr_stages[WR_LATENCY-2];
+    end
+  endgenerate
+
+  // first stage isn't registered
+  always @(*)
+    wr_stages[0] = (phy_init_data_sel) ? ctrl_wren : phy_init_wren;
+
+  always @(posedge clk0) begin
+    wr_stages[1] <= wr_stages[0];
+    wr_stages[2] <= wr_stages[1];
+    wr_stages[3] <= wr_stages[2];
+    wr_stages[4] <= wr_stages[3];
+    wr_stages[5] <= wr_stages[4];
+    wr_stages[6] <= wr_stages[5];
+    wr_stages[7] <= wr_stages[6];
+    wr_stages[8] <= wr_stages[7];
+    wr_stages[9] <= wr_stages[8];
+    wr_stages[10] <= wr_stages[9];
+  end
+
+  // intermediate synchronization to CLK270
+  always @(negedge clk90) begin
+    dq_oe_270         <= dq_oe_0;
+    dqs_oe_270        <= dqs_oe_0;
+    dqs_rst_270       <= dqs_rst_0;
+    wdf_rden_270      <= wdf_rden_0;
+  end
+
+  // synchronize DQS signals to CLK180
+  always @(negedge clk0) begin
+    dqs_oe_n_180_r1  <= ~dqs_oe_270;
+    dqs_rst_n_180_r1 <= ~dqs_rst_270;
+  end
+
+  // All write data-related signals synced to CLK90
+  always @(posedge clk90) begin
+    dq_oe_n_90_r1  <= ~dq_oe_270;
+    wdf_rden_90_r  <= wdf_rden_270;
+  end
+
+  // generate for wdf_rden and calib rden. These signals
+  // are asserted based on write latency. For write
+  // latency of 2, the extra register stage is taken out.
+  generate
+   if (WR_LATENCY > 2) begin
+     always @(posedge clk90) begin
+        // assert wdf rden only for non calibration opertations
+        wdf_rden_90_r1 <=  wdf_rden_90_r &
+                           phy_init_data_sel;
+        // rden for calibration
+        calib_rden_90_r <= wdf_rden_90_r;
+     end
+   end else begin
+     always @(*) begin
+        wdf_rden_90_r1 = wdf_rden_90_r
+                         & phy_init_data_sel;
+        calib_rden_90_r = wdf_rden_90_r;
+     end
+  end // else: !if(WR_LATENCY > 2)
+  endgenerate
+
+  // dm CE signal to stop dm oscilation
+  always @(negedge clk90)begin
+    dm_ce_r <= dm_ce_0;
+    dm_ce <= dm_ce_r;
+  end
+
+  // When in ECC mode the upper byte [71:64] will have the
+  // ECC parity. Mapping the bytes which have valid data
+  // to the upper byte in ecc mode. Also in ecc mode there
+  // is an extra register stage to account for timing.
+
+  genvar mask_i;
+  generate
+    if(ECC_ENABLE) begin
+      for (mask_i  = 0; mask_i < (2*DQ_WIDTH)/72;
+          mask_i = mask_i+1) begin: gen_mask
+       assign wdf_ecc_mask[((mask_i*9)+9)-1:(mask_i*9)] =
+                {&wdf_mask_data[(mask_i*8)+(7+mask_i):mask_i*9],
+                wdf_mask_data[(mask_i*8)+(7+mask_i):mask_i*9]};
+      end
+    end
+   endgenerate
+
+  generate
+    if (ECC_ENABLE) begin:gen_ecc_reg
+       always @(posedge clk90)begin
+          if(phy_init_data_sel)
+               wdf_mask_r <= wdf_ecc_mask;
+          else
+             wdf_mask_r <= {(2*DQ_WIDTH/8){1'b0}};
+      end       
+    end else begin
+      always@(posedge clk90) begin
+        if (phy_init_data_sel)
+          wdf_mask_r <= wdf_mask_data;
+        else
+          wdf_mask_r <= {(2*DQ_WIDTH/8){1'b0}};
+      end
+    end
+  endgenerate
+
+   always @(posedge clk90) begin
+      if(phy_init_data_sel)
+          wdf_data_r <= wdf_data;
+      else
+          wdf_data_r <={init_data_f,init_data_r};
+   end
+
+  // Error generation block during simulation.
+  // Error will be displayed when all the DM
+  // bits are not zero. The error will be
+  // displayed only during the start of the sequence
+  // for errors that are continous over many cycles.
+  generate
+    if (ECC_ENABLE) begin: gen_ecc_error
+      always @(posedge clk90) begin
+        //synthesis translate_off
+        wdf_mask_r1 <= wdf_mask_r;
+        if(DQ_WIDTH > 72)
+           ecc_dm_error_r
+              <= (
+              (~wdf_mask_r1[35] && (|wdf_mask_r1[34:27])) ||
+              (~wdf_mask_r1[26] && (|wdf_mask_r1[25:18])) ||
+              (~wdf_mask_r1[17] && (|wdf_mask_r1[16:9])) ||
+              (~wdf_mask_r1[8] &&  (|wdf_mask_r1[7:0]))) && phy_init_data_sel;
+         else
+            ecc_dm_error_r
+              <= ((~wdf_mask_r1[17] && (|wdf_mask_r1[16:9])) ||
+              (~wdf_mask_r1[8] &&  (|wdf_mask_r1[7:0]))) && phy_init_data_sel;
+        ecc_dm_error_r1 <= ecc_dm_error_r ;
+        if (ecc_dm_error_r && ~ecc_dm_error_r1) // assert the error only once.
+          $display ("ECC DM ERROR. ");
+        //synthesis translate_on
+      end
+    end
+  endgenerate
+
+  //***************************************************************************
+  // State logic to write calibration training patterns
+  //***************************************************************************
+
+  always @(posedge clk90) begin
+    if (rst90_r) begin
+      init_wdf_cnt_r  <= 4'd0;
+      init_data_r <= {64{1'bx}};
+      init_data_f <= {64{1'bx}};
+    end else begin
+      init_wdf_cnt_r  <= init_wdf_cnt_r + calib_rden_90_r;
+      casex (init_wdf_cnt_r)
+        // First stage calibration. Pattern (rise/fall) = 1(r)->0(f)
+        // The rise data and fall data are already interleaved in the manner
+        // required for data into the WDF write FIFO
+        4'b00xx: begin
+          init_data_r <= {DQ_WIDTH{1'b1}};
+          init_data_f <= {DQ_WIDTH{1'b0}};
+        end
+        // Second stage calibration. Pattern = 1(r)->1(f)->0(r)->0(f)
+        4'b01x0: begin
+           init_data_r <= {DQ_WIDTH{1'b1}};
+           init_data_f <= {DQ_WIDTH{1'b1}};
+          end
+        4'b01x1: begin
+           init_data_r <= {DQ_WIDTH{1'b0}};
+           init_data_f <= {DQ_WIDTH{1'b0}};
+        end
+        // MIG 3.2: Changed Stage 3/4 training pattern
+        // Third stage calibration patern = 
+        //   11(r)->ee(f)->ee(r)->11(f)-ee(r)->11(f)->ee(r)->11(f)
+        4'b1000: begin
+          init_data_r <= {DQ_WIDTH/4{4'h1}};
+          init_data_f <= {DQ_WIDTH/4{4'hE}};
+        end
+        4'b1001: begin
+          init_data_r <= {DQ_WIDTH/4{4'hE}};
+          init_data_f <= {DQ_WIDTH/4{4'h1}};
+          end
+        4'b1010: begin
+          init_data_r <= {(DQ_WIDTH/4){4'hE}};
+          init_data_f <= {(DQ_WIDTH/4){4'h1}};
+        end
+        4'b1011: begin
+          init_data_r <= {(DQ_WIDTH/4){4'hE}};
+          init_data_f <= {(DQ_WIDTH/4){4'h1}};
+        end
+        // Fourth stage calibration patern = 
+        //   11(r)->ee(f)->ee(r)->11(f)-11(r)->ee(f)->ee(r)->11(f)
+        4'b1100: begin
+          init_data_r <= {DQ_WIDTH/4{4'h1}};
+          init_data_f <= {DQ_WIDTH/4{4'hE}};
+        end
+        4'b1101: begin
+          init_data_r <= {DQ_WIDTH/4{4'hE}};
+          init_data_f <= {DQ_WIDTH/4{4'h1}};
+          end
+        4'b1110: begin
+          init_data_r <= {(DQ_WIDTH/4){4'h1}};
+          init_data_f <= {(DQ_WIDTH/4){4'hE}};
+        end
+        4'b1111: begin
+          // MIG 3.5: Corrected last two writes for stage 4 calibration
+          // training pattern. Previously MIG 3.3 and MIG 3.4 had the
+          // incorrect pattern. This can sometimes result in a calibration
+          // point with small timing margin. 
+//          init_data_r <= {(DQ_WIDTH/4){4'h1}};
+//          init_data_f <= {(DQ_WIDTH/4){4'hE}};
+          init_data_r <= {(DQ_WIDTH/4){4'hE}};
+          init_data_f <= {(DQ_WIDTH/4){4'h1}};
+        end
+      endcase
+    end
+  end
+
+  //***************************************************************************
+
+  always @(posedge clk90)
+    dq_oe_n   <= dq_oe_n_90_r1;
+
+  always @(negedge clk0)
+    dqs_oe_n  <= dqs_oe_n_180_r1;
+
+  always @(negedge clk0)
+    dqs_rst_n <= dqs_rst_n_180_r1;
+
+  // generate for odt. odt is asserted based on
+  //  write latency. For write latency of 2
+  //  the extra register stage is taken out.
+  generate
+    if (ODT_WR_LATENCY > 3) begin
+      always @(posedge clk0) begin
+        odt    <= 'b0;
+        odt[0] <= odt_0;
+      end
+    end else begin
+      always @ (*) begin
+        odt = 'b0;
+        odt[0] = odt_0;
+      end
+    end
+  endgenerate
+
+  assign wdf_rden  = wdf_rden_90_r1;
+
+  //***************************************************************************
+  // Format write data/mask: Data is in format: {fall, rise}
+  //***************************************************************************
+
+  assign wr_data_rise = wdf_data_r[DQ_WIDTH-1:0];
+  assign wr_data_fall = wdf_data_r[(2*DQ_WIDTH)-1:DQ_WIDTH];
+  assign mask_data_rise = wdf_mask_r[MASK_WIDTH-1:0];
+  assign mask_data_fall = wdf_mask_r[(2*MASK_WIDTH)-1:MASK_WIDTH];
+
+endmodule
Index: trunk/Xilinx/pll.v
===================================================================
--- trunk/Xilinx/pll.v	(revision 6)
+++ trunk/Xilinx/pll.v	(revision 10)
@@ -44,5 +44,5 @@
    assign GND_BUS_16 = 16'b0000000000000000;
    assign VCC_BIT = 1;
-   IBUFG  CLKIN1_IBUFG_INST (.I(CLKIN1_IN), 
+   BUFG  CLKIN1_IBUFG_INST (.I(CLKIN1_IN), 
                             .O(CLKIN1_IBUFG));
    BUFG  CLKOUT0_BUFG_INST (.I(CLKOUT0_BUF), 
Index: trunk/Xilinx/ddr2_chipscope.v
===================================================================
--- trunk/Xilinx/ddr2_chipscope.v	(revision 10)
+++ trunk/Xilinx/ddr2_chipscope.v	(revision 10)
@@ -0,0 +1,114 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_chipscope.v
+// /___/   /\     Date Last Modified: $Data$ 
+// \   \  /  \	  Date Created: 9/14/06
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Purpose:
+//   Skeleton Chipscope module declarations - for simulation only
+//Reference:
+//Revision History:
+//
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module icon4 
+  (
+      control0,
+      control1,
+      control2,
+      control3
+  )
+  /* synthesis syn_black_box syn_noprune = 1 */;
+  output [35:0] control0;
+  output [35:0] control1;
+  output [35:0] control2;
+  output [35:0] control3;
+endmodule
+
+module vio_async_in192
+  (
+    control,
+    async_in
+  )
+  /* synthesis syn_black_box syn_noprune = 1 */;
+  input  [35:0] control;
+  input  [191:0] async_in;
+endmodule
+
+module vio_async_in96
+  (
+    control,
+    async_in
+  )
+  /* synthesis syn_black_box syn_noprune = 1 */;
+  input  [35:0] control;
+  input  [95:0] async_in;
+endmodule
+
+module vio_async_in100
+  (
+    control,
+    async_in
+  )
+  /* synthesis syn_black_box syn_noprune = 1 */;
+  input  [35:0] control;
+  input  [99:0] async_in;
+endmodule
+
+module vio_sync_out32
+  (
+    control,
+    clk,
+    sync_out
+  )
+  /* synthesis syn_black_box syn_noprune = 1 */;
+  input  [35:0] control;
+  input  clk;
+  output [31:0] sync_out;
+endmodule
Index: trunk/Xilinx/ddr2_phy_dq_iob.v
===================================================================
--- trunk/Xilinx/ddr2_phy_dq_iob.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_dq_iob.v	(revision 10)
@@ -0,0 +1,592 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_dq_iob.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module places the data in the IOBs.
+//Reference:
+//Revision History:
+//   Rev 1.1 - Parameter HIGH_PERFORMANCE_MODE added. PK. 7/10/08
+//   Rev 1.2 - DIRT strings removed and modified the code. PK. 11/13/08
+//   Rev 1.3 - Parameter IODELAY_GRP added and constraint IODELAY_GROUP added
+//             on IODELAY primitive. PK. 11/27/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_phy_dq_iob #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter HIGH_PERFORMANCE_MODE = "TRUE",
+   parameter IODELAY_GRP           = "IODELAY_MIG",
+   parameter FPGA_SPEED_GRADE      = 2
+   )
+  (
+   input        clk0,
+   input        clk90,
+   input        clkdiv0,
+   input        rst90,
+   input        dlyinc,
+   input        dlyce,
+   input        dlyrst,
+   input  [1:0] dq_oe_n,
+   input        dqs,
+   input        ce,
+   input        rd_data_sel,
+   input        wr_data_rise,
+   input        wr_data_fall,
+   output       rd_data_rise,
+   output       rd_data_fall,
+   inout        ddr_dq
+   );
+
+  wire       dq_iddr_clk;
+  wire       dq_idelay;
+  wire       dq_in;
+  wire       dq_oe_n_r;
+  wire       dq_out;
+  wire       stg2a_out_fall;
+  wire       stg2a_out_rise;
+  (* XIL_PAR_DELAY = "0 ps", XIL_PAR_IP_NAME = "MIG", syn_keep = "1", keep = "TRUE" *)
+  wire       stg2b_out_fall;
+  (* XIL_PAR_DELAY = "0 ps", XIL_PAR_IP_NAME = "MIG", syn_keep = "1", keep = "TRUE" *)
+  wire       stg2b_out_rise;
+  wire       stg3a_out_fall;
+  wire       stg3a_out_rise;
+  wire       stg3b_out_fall;
+  wire       stg3b_out_rise;
+
+  //***************************************************************************
+  // Directed routing constraints for route between IDDR and stage 2 capture
+  // in fabric.
+  // Only 2 out of the 12 wire declarations will be used for any given
+  // instantiation of this module.
+  // Varies according:
+  //  (1) I/O column (left, center, right) used
+  //  (2) Which I/O in I/O pair (master, slave) used
+  // Nomenclature: _Xy, X = column (0 = left, 1 = center, 2 = right),
+  //  y = master or slave
+  //***************************************************************************
+
+  // MODIFIED, RC, 06/13/08: Remove all references to DIRT, master/slave
+
+  (* XIL_PAR_DELAY = "515 ps", XIL_PAR_SKEW = "55 ps", XIL_PAR_IP_NAME = "MIG", syn_keep = "1", keep = "TRUE" *)
+  wire stg1_out_rise_sg3;
+  (* XIL_PAR_DELAY = "515 ps", XIL_PAR_SKEW = "55 ps", XIL_PAR_IP_NAME = "MIG", syn_keep = "1", keep = "TRUE" *)
+  wire stg1_out_fall_sg3;
+  (* XIL_PAR_DELAY = "575 ps", XIL_PAR_SKEW = "65 ps", XIL_PAR_IP_NAME = "MIG", syn_keep = "1", keep = "TRUE" *)
+  wire stg1_out_rise_sg2;
+  (* XIL_PAR_DELAY = "575 ps", XIL_PAR_SKEW = "65 ps", XIL_PAR_IP_NAME = "MIG", syn_keep = "1", keep = "TRUE" *)
+  wire stg1_out_fall_sg2;
+  (* XIL_PAR_DELAY = "650 ps", XIL_PAR_SKEW = "70 ps", XIL_PAR_IP_NAME = "MIG", syn_keep = "1", keep = "TRUE" *)
+  wire stg1_out_rise_sg1;
+  (* XIL_PAR_DELAY = "650 ps", XIL_PAR_SKEW = "70 ps", XIL_PAR_IP_NAME = "MIG", syn_keep = "1", keep = "TRUE" *)
+  wire stg1_out_fall_sg1;
+
+  //***************************************************************************
+  // Bidirectional I/O
+  //***************************************************************************
+
+  IOBUF u_iobuf_dq
+    (
+     .I  (dq_out),
+     .T  (dq_oe_n_r),
+     .IO (ddr_dq),
+     .O  (dq_in)
+     );
+
+  //***************************************************************************
+  // Write (output) path
+  //***************************************************************************
+
+  // on a write, rising edge of DQS corresponds to rising edge of CLK180
+  // (aka falling edge of CLK0 -> rising edge DQS). We also know:
+  //  1. data must be driven 1/4 clk cycle before corresponding DQS edge
+  //  2. first rising DQS edge driven on falling edge of CLK0
+  //  3. rising data must be driven 1/4 cycle before falling edge of CLK0
+  //  4. therefore, rising data driven on rising edge of CLK
+  ODDR #
+    (
+     .SRTYPE("SYNC"),
+     .DDR_CLK_EDGE("SAME_EDGE")
+     )
+    u_oddr_dq
+      (
+       .Q  (dq_out),
+       .C  (clk90),
+       .CE (1'b1),
+       .D1 (wr_data_rise),
+       .D2 (wr_data_fall),
+       .R  (1'b0),
+       .S  (1'b0)
+       );
+
+  // make sure output is tri-state during reset (DQ_OE_N_R = 1)
+  ODDR #
+    (
+     .SRTYPE("ASYNC"),
+     .DDR_CLK_EDGE("SAME_EDGE")
+     )
+    u_tri_state_dq
+      (
+       .Q  (dq_oe_n_r),
+       .C  (clk90),
+       .CE (1'b1),
+       .D1 (dq_oe_n[0]),
+       .D2 (dq_oe_n[1]),
+       .R  (1'b0),
+       .S  (rst90)
+       );
+
+  //***************************************************************************
+  // Read data capture scheme description:
+  // Data capture consists of 3 ranks of flops, and a MUX
+  //  1. Rank 1 ("Stage 1"): IDDR captures delayed DDR DQ from memory using
+  //     delayed DQS.
+  //     - Data is split into 2 SDR streams, one each for rise and fall data.
+  //     - BUFIO (DQS) input inverted to IDDR. IDDR configured in SAME_EDGE
+  //       mode. This means that: (1) Q1 = fall data, Q2 = rise data,
+  //       (2) Both rise and fall data are output on falling edge of DQS -
+  //       rather than rise output being output on one edge of DQS, and fall
+  //       data on the other edge if the IDDR were configured in OPPOSITE_EDGE
+  //       mode. This simplifies Stage 2 capture (only one core clock edge
+  //       used, removing effects of duty-cycle-distortion), and saves one
+  //       fabric flop in Rank 3.
+  //  2. Rank 2 ("Stage 2"): Fabric flops are used to capture output of first
+  //     rank into FPGA clock (CLK) domain. Each rising/falling SDR stream
+  //     from IDDR is feed into two flops, one clocked off rising and one off
+  //     falling edge of CLK. One of these flops is chosen, with the choice
+  //     being the one that reduces # of DQ/DQS taps necessary to align Stage
+  //     1 and Stage 2. Same edge is used to capture both rise and fall SDR
+  //     streams.
+  //  3. Rank 3 ("Stage 3"): Removes half-cycle paths in CLK domain from
+  //     output of Rank 2. This stage, like Stage 2, is clocked by CLK. Note
+  //     that Stage 3 can be expanded to also support SERDES functionality
+  //  4. Output MUX: Selects whether Stage 1 output is aligned to rising or
+  //     falling edge of CLK (i.e. specifically this selects whether IDDR
+  //     rise/fall output is transfered to rising or falling edge of CLK).
+  // Implementation:
+  //  1. Rank 1 is implemented using an IDDR primitive
+  //  2. Rank 2 is implemented using:
+  //     - An RPM to fix the location of the capture flops near the DQ I/O.
+  //       The exact RPM used depends on which I/O column (left, center,
+  //       right) the DQ I/O is placed at - this affects the optimal location
+  //       of the slice flops (or does it - can we always choose the two
+  //       columns to slices to the immediate right of the I/O to use, no
+  //       matter what the column?). The origin of the RPM must be set in the
+  //       UCF file using the RLOC_ORIGIN constraint (where the original is
+  //       based on the DQ I/O location).
+  //     - Directed Routing Constraints ("DIRT strings") to fix the routing
+  //       to the rank 2 fabric flops. This is done to minimize: (1) total
+  //       route delay (and therefore minimize voltage/temperature-related
+  //       variations), and (2) minimize skew both within each rising and
+  //       falling data net, as well as between the rising and falling nets.
+  //       The exact DIRT string used depends on: (1) which I/O column the
+  //       DQ I/O is placed, and (2) whether the DQ I/O is placed on the
+  //       "Master" or "Slave" I/O of a diff pair (DQ is not differential, but
+  //       the routing will be affected by which of each I/O pair is used)
+  // 3. Rank 3 is implemented using fabric flops. No LOC or DIRT contraints
+  //    are used, tools are expected to place these and meet PERIOD timing
+  //    without constraints (constraints may be necessary for "full" designs,
+  //    in this case, user may need to add LOC constraints - if this is the
+  //    case, there are no constraints - other than meeting PERIOD timing -
+  //    for rank 3 flops.
+  //***************************************************************************
+
+  //***************************************************************************
+  // MIG 2.2: Define AREA_GROUP = "DDR_CAPTURE_FFS" contain all RPM flops in
+  //          design. In UCF file, add constraint:
+  //             AREA_GROUP "DDR_CAPTURE_FFS" GROUP = CLOSED;
+  //          This is done to prevent MAP from packing unrelated logic into
+  //          the slices used by the RPMs. Doing so may cause the DIRT strings
+  //          that define the IDDR -> fabric flop routing to later become
+  //          unroutable during PAR because the unrelated logic placed by MAP
+  //          may use routing resources required by the DIRT strings. MAP
+  //          does not currently take into account DIRT strings when placing
+  //          logic
+  //***************************************************************************
+
+  // IDELAY to delay incoming data for synchronization purposes
+  (* IODELAY_GROUP = IODELAY_GRP *) IODELAY #
+    (
+     .DELAY_SRC             ("I"),
+     .IDELAY_TYPE           ("VARIABLE"),
+     .HIGH_PERFORMANCE_MODE (HIGH_PERFORMANCE_MODE),
+     .IDELAY_VALUE          (0),
+     .ODELAY_VALUE          (0)
+     )
+    u_idelay_dq
+      (
+       .DATAOUT (dq_idelay),
+       .C       (clkdiv0),
+       .CE      (dlyce),
+       .DATAIN  (),
+       .IDATAIN (dq_in),
+       .INC     (dlyinc),
+       .ODATAIN (),
+       .RST     (dlyrst),
+       .T       ()
+       );
+
+  //***************************************************************************
+  // Rank 1 capture: Use IDDR to generate two SDR outputs
+  //***************************************************************************
+
+  // invert clock to IDDR in order to use SAME_EDGE mode (otherwise, we "run
+  // out of clocks" because DQS is not continuous
+  assign dq_iddr_clk = ~dqs;
+
+  //***************************************************************************
+  // Rank 2 capture: Use fabric flops to capture Rank 1 output. Use RPM and
+  // DIRT strings here.
+  // BEL ("Basic Element of Logic") and relative location constraints for
+  // second stage capture. C
+  // Varies according:
+  //  (1) I/O column (left, center, right) used
+  //  (2) Which I/O in I/O pair (master, slave) used
+  //***************************************************************************
+
+  // MODIFIED, RC, 06/13/08: Remove all references to DIRT, master/slave
+  //  Take out generate statements - collapses to a single case
+
+  generate
+    if (FPGA_SPEED_GRADE == 3) begin: gen_stg2_sg3
+      IDDR #
+        (
+         .DDR_CLK_EDGE ("SAME_EDGE")
+         )
+        u_iddr_dq
+          (
+           .Q1 (stg1_out_fall_sg3),
+           .Q2 (stg1_out_rise_sg3),
+           .C  (dq_iddr_clk),
+           .CE (ce),
+           .D  (dq_idelay),
+           .R  (1'b0),
+           .S  (1'b0)
+           );
+
+      //*********************************************************
+      // Slice #1 (posedge CLK): Used for:
+      //  1. IDDR transfer to CLK0 rising edge domain ("stg2a")
+      //  2. stg2 falling edge -> stg3 rising edge transfer
+      //*********************************************************
+
+      // Stage 2 capture
+      FDRSE u_ff_stg2a_fall
+        (
+         .Q   (stg2a_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_fall_sg3),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      FDRSE u_ff_stg2a_rise
+        (
+         .Q   (stg2a_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_rise_sg3),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      // Stage 3 falling -> rising edge translation
+      FDRSE u_ff_stg3b_fall
+        (
+         .Q   (stg3b_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg2b_out_fall),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      FDRSE u_ff_stg3b_rise
+        (
+         .Q   (stg3b_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg2b_out_rise),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+
+      //*********************************************************
+      // Slice #2 (posedge CLK): Used for:
+      //  1. IDDR transfer to CLK0 falling edge domain ("stg2b")
+      //*********************************************************
+
+      FDRSE_1 u_ff_stg2b_fall
+        (
+         .Q   (stg2b_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_fall_sg3),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+
+      FDRSE_1 u_ff_stg2b_rise
+        (
+         .Q   (stg2b_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_rise_sg3),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+    end else if (FPGA_SPEED_GRADE == 2) begin: gen_stg2_sg2
+      IDDR #
+        (
+         .DDR_CLK_EDGE ("SAME_EDGE")
+         )
+        u_iddr_dq
+          (
+           .Q1 (stg1_out_fall_sg2),
+           .Q2 (stg1_out_rise_sg2),
+           .C  (dq_iddr_clk),
+           .CE (ce),
+           .D  (dq_idelay),
+           .R  (1'b0),
+           .S  (1'b0)
+           );
+
+      //*********************************************************
+      // Slice #1 (posedge CLK): Used for:
+      //  1. IDDR transfer to CLK0 rising edge domain ("stg2a")
+      //  2. stg2 falling edge -> stg3 rising edge transfer
+      //*********************************************************
+
+      // Stage 2 capture
+      FDRSE u_ff_stg2a_fall
+        (
+         .Q   (stg2a_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_fall_sg2),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      FDRSE u_ff_stg2a_rise
+        (
+         .Q   (stg2a_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_rise_sg2),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      // Stage 3 falling -> rising edge translation
+      FDRSE u_ff_stg3b_fall
+        (
+         .Q   (stg3b_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg2b_out_fall),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      FDRSE u_ff_stg3b_rise
+        (
+         .Q   (stg3b_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg2b_out_rise),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+
+      //*********************************************************
+      // Slice #2 (posedge CLK): Used for:
+      //  1. IDDR transfer to CLK0 falling edge domain ("stg2b")
+      //*********************************************************
+
+      FDRSE_1 u_ff_stg2b_fall
+        (
+         .Q   (stg2b_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_fall_sg2),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+
+      FDRSE_1 u_ff_stg2b_rise
+        (
+         .Q   (stg2b_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_rise_sg2),
+         .R   (1'b0),
+         .S   (1'b0)
+          )/* synthesis syn_preserve = 1 */
+           /* synthesis syn_replicate = 0 */;
+    end else if (FPGA_SPEED_GRADE == 1) begin: gen_stg2_sg1
+      IDDR #
+        (
+         .DDR_CLK_EDGE ("SAME_EDGE")
+         )
+        u_iddr_dq
+          (
+           .Q1 (stg1_out_fall_sg1),
+           .Q2 (stg1_out_rise_sg1),
+           .C  (dq_iddr_clk),
+           .CE (ce),
+           .D  (dq_idelay),
+           .R  (1'b0),
+           .S  (1'b0)
+           );
+
+      //*********************************************************
+      // Slice #1 (posedge CLK): Used for:
+      //  1. IDDR transfer to CLK0 rising edge domain ("stg2a")
+      //  2. stg2 falling edge -> stg3 rising edge transfer
+      //*********************************************************
+
+      // Stage 2 capture
+      FDRSE u_ff_stg2a_fall
+        (
+         .Q   (stg2a_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_fall_sg1),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      FDRSE u_ff_stg2a_rise
+        (
+         .Q   (stg2a_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_rise_sg1),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      // Stage 3 falling -> rising edge translation
+      FDRSE u_ff_stg3b_fall
+        (
+         .Q   (stg3b_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg2b_out_fall),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+      FDRSE u_ff_stg3b_rise
+        (
+         .Q   (stg3b_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg2b_out_rise),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+
+      //*********************************************************
+      // Slice #2 (posedge CLK): Used for:
+      //  1. IDDR transfer to CLK0 falling edge domain ("stg2b")
+      //*********************************************************
+
+      FDRSE_1 u_ff_stg2b_fall
+        (
+         .Q   (stg2b_out_fall),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_fall_sg1),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+
+      FDRSE_1 u_ff_stg2b_rise
+        (
+         .Q   (stg2b_out_rise),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (stg1_out_rise_sg1),
+         .R   (1'b0),
+         .S   (1'b0)
+         )/* synthesis syn_preserve = 1 */
+          /* synthesis syn_replicate = 0 */;
+    end
+  endgenerate
+
+  //***************************************************************************
+  // Second stage flops clocked by posedge CLK0 don't need another layer of
+  // registering
+  //***************************************************************************
+
+  assign stg3a_out_rise = stg2a_out_rise;
+  assign stg3a_out_fall = stg2a_out_fall;
+
+  //*******************************************************************
+
+  assign rd_data_rise = (rd_data_sel) ? stg3a_out_rise : stg3b_out_rise;
+  assign rd_data_fall = (rd_data_sel) ? stg3a_out_fall : stg3b_out_fall;
+
+endmodule
Index: trunk/Xilinx/ddr2_mem_if_top.v
===================================================================
--- trunk/Xilinx/ddr2_mem_if_top.v	(revision 10)
+++ trunk/Xilinx/ddr2_mem_if_top.v	(revision 10)
@@ -0,0 +1,380 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_mem_if_top.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR/DDR2
+//Purpose:
+//   Top-level for parameterizable (DDR or DDR2) memory interface
+//Reference:
+//Revision History:
+//   Rev 1.1 - Parameter USE_DM_PORT added. PK. 6/25/08
+//   Rev 1.2 - Parameter HIGH_PERFORMANCE_MODE added. PK. 7/10/08
+//   Rev 1.3 - Parameter CS_BITS added. PK. 10/8/08
+//   Rev 1.4 - Parameter IODELAY_GRP added. PK. 11/27/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_mem_if_top #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH            = 2,
+   parameter CKE_WIDTH             = 1,
+   parameter CLK_WIDTH             = 1,
+   parameter COL_WIDTH             = 10,
+   parameter CS_BITS               = 0,
+   parameter CS_NUM                = 1,
+   parameter CS_WIDTH              = 1,
+   parameter USE_DM_PORT           = 1,
+   parameter DM_WIDTH              = 9,
+   parameter DQ_WIDTH              = 72,
+   parameter DQ_BITS               = 7,
+   parameter DQ_PER_DQS            = 8,
+   parameter DQS_BITS              = 4,
+   parameter DQS_WIDTH             = 9,
+   parameter HIGH_PERFORMANCE_MODE = "TRUE",
+   parameter IODELAY_GRP           = "IODELAY_MIG",
+   parameter ODT_WIDTH             = 1,
+   parameter ROW_WIDTH             = 14,
+   parameter APPDATA_WIDTH         = 144,
+   parameter ADDITIVE_LAT          = 0,
+   parameter BURST_LEN             = 4,
+   parameter BURST_TYPE            = 0,
+   parameter CAS_LAT               = 5,
+   parameter ECC_ENABLE            = 0,
+   parameter MULTI_BANK_EN         = 1,
+   parameter TWO_T_TIME_EN         = 0,
+   parameter ODT_TYPE              = 1,
+   parameter DDR_TYPE              = 1,
+   parameter REDUCE_DRV            = 0,
+   parameter REG_ENABLE            = 1,
+   parameter TREFI_NS              = 7800,
+   parameter TRAS                  = 40000,
+   parameter TRCD                  = 15000,
+   parameter TRFC                  = 105000,
+   parameter TRP                   = 15000,
+   parameter TRTP                  = 7500,
+   parameter TWR                   = 15000,
+   parameter TWTR                  = 10000,
+   parameter CLK_PERIOD            = 3000,
+   parameter SIM_ONLY              = 0,
+   parameter DEBUG_EN              = 0,
+   parameter FPGA_SPEED_GRADE      = 2
+   )
+  (
+   input                                    clk0,
+   input                                    clk90,
+   input                                    clkdiv0,
+   input                                    rst0,
+   input                                    rst90,
+   input                                    rstdiv0,
+   input [2:0]                              app_af_cmd,
+   input [30:0]                             app_af_addr,
+   input                                    app_af_wren,
+   input                                    app_wdf_wren,
+   input [APPDATA_WIDTH-1:0]                app_wdf_data,
+   input [(APPDATA_WIDTH/8)-1:0]            app_wdf_mask_data,
+   output [1:0]                             rd_ecc_error,
+   output                                   app_af_afull,
+   output                                   app_wdf_afull,
+   output                                   rd_data_valid,
+   output [APPDATA_WIDTH-1:0]               rd_data_fifo_out,
+   output                                   phy_init_done,
+   output [CLK_WIDTH-1:0]                   ddr_ck,
+   output [CLK_WIDTH-1:0]                   ddr_ck_n,
+   output [ROW_WIDTH-1:0]                   ddr_addr,
+   output [BANK_WIDTH-1:0]                  ddr_ba,
+   output                                   ddr_ras_n,
+   output                                   ddr_cas_n,
+   output                                   ddr_we_n,
+   output [CS_WIDTH-1:0]                    ddr_cs_n,
+   output [CKE_WIDTH-1:0]                   ddr_cke,
+   output [ODT_WIDTH-1:0]                   ddr_odt,
+   output [DM_WIDTH-1:0]                    ddr_dm,
+   inout [DQS_WIDTH-1:0]                    ddr_dqs,
+   inout [DQS_WIDTH-1:0]                    ddr_dqs_n,
+   inout [DQ_WIDTH-1:0]                     ddr_dq,
+   // Debug signals (optional use)
+   input                                    dbg_idel_up_all,
+   input                                    dbg_idel_down_all,
+   input                                    dbg_idel_up_dq,
+   input                                    dbg_idel_down_dq,
+   input                                    dbg_idel_up_dqs,
+   input                                    dbg_idel_down_dqs,
+   input                                    dbg_idel_up_gate,
+   input                                    dbg_idel_down_gate,
+   input [DQ_BITS-1:0]                      dbg_sel_idel_dq,
+   input                                    dbg_sel_all_idel_dq,
+   input [DQS_BITS:0]                       dbg_sel_idel_dqs,
+   input                                    dbg_sel_all_idel_dqs,
+   input [DQS_BITS:0]                       dbg_sel_idel_gate,
+   input                                    dbg_sel_all_idel_gate,
+   output [3:0]                             dbg_calib_done,
+   output [3:0]                             dbg_calib_err,
+   output [(6*DQ_WIDTH)-1:0]                dbg_calib_dq_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]               dbg_calib_dqs_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]               dbg_calib_gate_tap_cnt,
+   output [DQS_WIDTH-1:0]                   dbg_calib_rd_data_sel,
+   output [(5*DQS_WIDTH)-1:0]               dbg_calib_rden_dly,
+   output [(5*DQS_WIDTH)-1:0]               dbg_calib_gate_dly
+   );
+
+  wire [30:0]                       af_addr;
+  wire [2:0]                        af_cmd;
+  wire                              af_empty;
+  wire [ROW_WIDTH-1:0]              ctrl_addr;
+  wire                              ctrl_af_rden;
+  wire [BANK_WIDTH-1:0]             ctrl_ba;
+  wire                              ctrl_cas_n;
+  wire [CS_NUM-1:0]                 ctrl_cs_n;
+  wire                              ctrl_ras_n;
+  wire                              ctrl_rden;
+  wire                              ctrl_ref_flag;
+  wire                              ctrl_we_n;
+  wire                              ctrl_wren;
+  wire [DQS_WIDTH-1:0]              phy_calib_rden;
+  wire [DQS_WIDTH-1:0]              phy_calib_rden_sel;
+  wire [DQ_WIDTH-1:0]               rd_data_fall;
+  wire [DQ_WIDTH-1:0]               rd_data_rise;
+  wire [(2*DQ_WIDTH)-1:0]           wdf_data;
+  wire [((2*DQ_WIDTH)/8)-1:0]       wdf_mask_data;
+  wire                              wdf_rden;
+
+  //***************************************************************************
+
+  ddr2_phy_top #
+    (
+     .BANK_WIDTH            (BANK_WIDTH),
+     .CKE_WIDTH             (CKE_WIDTH),
+     .CLK_WIDTH             (CLK_WIDTH),
+     .COL_WIDTH             (COL_WIDTH),
+     .CS_BITS               (CS_BITS),
+     .CS_NUM                (CS_NUM),
+     .CS_WIDTH              (CS_WIDTH),
+     .USE_DM_PORT           (USE_DM_PORT),
+     .DM_WIDTH              (DM_WIDTH),
+     .DQ_WIDTH              (DQ_WIDTH),
+     .DQ_BITS               (DQ_BITS),
+     .DQ_PER_DQS            (DQ_PER_DQS),
+     .DQS_BITS              (DQS_BITS),
+     .DQS_WIDTH             (DQS_WIDTH),
+     .HIGH_PERFORMANCE_MODE (HIGH_PERFORMANCE_MODE),
+     .IODELAY_GRP           (IODELAY_GRP),
+     .ODT_WIDTH             (ODT_WIDTH),
+     .ROW_WIDTH             (ROW_WIDTH),
+     .TWO_T_TIME_EN         (TWO_T_TIME_EN),
+     .ADDITIVE_LAT          (ADDITIVE_LAT),
+     .BURST_LEN             (BURST_LEN),
+     .BURST_TYPE            (BURST_TYPE),
+     .CAS_LAT               (CAS_LAT),
+     .ECC_ENABLE            (ECC_ENABLE),
+     .ODT_TYPE              (ODT_TYPE),
+     .DDR_TYPE              (DDR_TYPE),
+     .REDUCE_DRV            (REDUCE_DRV),
+     .REG_ENABLE            (REG_ENABLE),
+     .TWR                   (TWR),
+     .CLK_PERIOD            (CLK_PERIOD),
+     .SIM_ONLY              (SIM_ONLY),
+     .DEBUG_EN              (DEBUG_EN),
+     .FPGA_SPEED_GRADE      (FPGA_SPEED_GRADE)
+     )
+    u_phy_top
+      (
+       .clk0                   (clk0),
+       .clk90                  (clk90),
+       .clkdiv0                (clkdiv0),
+       .rst0                   (rst0),
+       .rst90                  (rst90),
+       .rstdiv0                (rstdiv0),
+       .ctrl_wren              (ctrl_wren),
+       .ctrl_addr              (ctrl_addr),
+       .ctrl_ba                (ctrl_ba),
+       .ctrl_ras_n             (ctrl_ras_n),
+       .ctrl_cas_n             (ctrl_cas_n),
+       .ctrl_we_n              (ctrl_we_n),
+       .ctrl_cs_n              (ctrl_cs_n),
+       .ctrl_rden              (ctrl_rden),
+       .ctrl_ref_flag          (ctrl_ref_flag),
+       .wdf_data               (wdf_data),
+       .wdf_mask_data          (wdf_mask_data),
+       .wdf_rden               (wdf_rden),
+       .phy_init_done          (phy_init_done),
+       .phy_calib_rden         (phy_calib_rden),
+       .phy_calib_rden_sel     (phy_calib_rden_sel),
+       .rd_data_rise           (rd_data_rise),
+       .rd_data_fall           (rd_data_fall),
+       .ddr_ck                 (ddr_ck),
+       .ddr_ck_n               (ddr_ck_n),
+       .ddr_addr               (ddr_addr),
+       .ddr_ba                 (ddr_ba),
+       .ddr_ras_n              (ddr_ras_n),
+       .ddr_cas_n              (ddr_cas_n),
+       .ddr_we_n               (ddr_we_n),
+       .ddr_cs_n               (ddr_cs_n),
+       .ddr_cke                (ddr_cke),
+       .ddr_odt                (ddr_odt),
+       .ddr_dm                 (ddr_dm),
+       .ddr_dqs                (ddr_dqs),
+       .ddr_dqs_n              (ddr_dqs_n),
+       .ddr_dq                 (ddr_dq),
+       .dbg_idel_up_all        (dbg_idel_up_all),
+       .dbg_idel_down_all      (dbg_idel_down_all),
+       .dbg_idel_up_dq         (dbg_idel_up_dq),
+       .dbg_idel_down_dq       (dbg_idel_down_dq),
+       .dbg_idel_up_dqs        (dbg_idel_up_dqs),
+       .dbg_idel_down_dqs      (dbg_idel_down_dqs),
+       .dbg_idel_up_gate       (dbg_idel_up_gate),
+       .dbg_idel_down_gate     (dbg_idel_down_gate),
+       .dbg_sel_idel_dq        (dbg_sel_idel_dq),
+       .dbg_sel_all_idel_dq    (dbg_sel_all_idel_dq),
+       .dbg_sel_idel_dqs       (dbg_sel_idel_dqs),
+       .dbg_sel_all_idel_dqs   (dbg_sel_all_idel_dqs),
+       .dbg_sel_idel_gate      (dbg_sel_idel_gate),
+       .dbg_sel_all_idel_gate  (dbg_sel_all_idel_gate),
+       .dbg_calib_done         (dbg_calib_done),
+       .dbg_calib_err          (dbg_calib_err),
+       .dbg_calib_dq_tap_cnt   (dbg_calib_dq_tap_cnt),
+       .dbg_calib_dqs_tap_cnt  (dbg_calib_dqs_tap_cnt),
+       .dbg_calib_gate_tap_cnt (dbg_calib_gate_tap_cnt),
+       .dbg_calib_rd_data_sel  (dbg_calib_rd_data_sel),
+       .dbg_calib_rden_dly     (dbg_calib_rden_dly),
+       .dbg_calib_gate_dly     (dbg_calib_gate_dly)
+       );
+
+  ddr2_usr_top #
+    (
+     .BANK_WIDTH    (BANK_WIDTH),
+     .COL_WIDTH     (COL_WIDTH),
+     .CS_BITS       (CS_BITS),
+     .DQ_WIDTH      (DQ_WIDTH),
+     .DQ_PER_DQS    (DQ_PER_DQS),
+     .DQS_WIDTH     (DQS_WIDTH),
+     .APPDATA_WIDTH (APPDATA_WIDTH),
+     .ECC_ENABLE    (ECC_ENABLE),
+     .ROW_WIDTH     (ROW_WIDTH)
+     )
+    u_usr_top
+      (
+       .clk0              (clk0),
+       .clk90             (clk90),
+       .rst0              (rst0),
+       .rd_data_in_rise   (rd_data_rise),
+       .rd_data_in_fall   (rd_data_fall),
+       .phy_calib_rden    (phy_calib_rden),
+       .phy_calib_rden_sel(phy_calib_rden_sel),
+       .rd_data_valid     (rd_data_valid),
+       .rd_ecc_error      (rd_ecc_error),
+       .rd_data_fifo_out  (rd_data_fifo_out),
+       .app_af_cmd        (app_af_cmd),
+       .app_af_addr       (app_af_addr),
+       .app_af_wren       (app_af_wren),
+       .ctrl_af_rden      (ctrl_af_rden),
+       .af_cmd            (af_cmd),
+       .af_addr           (af_addr),
+       .af_empty          (af_empty),
+       .app_af_afull      (app_af_afull),
+       .app_wdf_wren      (app_wdf_wren),
+       .app_wdf_data      (app_wdf_data),
+       .app_wdf_mask_data (app_wdf_mask_data),
+       .wdf_rden          (wdf_rden),
+       .app_wdf_afull     (app_wdf_afull),
+       .wdf_data          (wdf_data),
+       .wdf_mask_data     (wdf_mask_data)
+       );
+
+
+  ddr2_ctrl #
+    (
+     .BANK_WIDTH    (BANK_WIDTH),
+     .COL_WIDTH     (COL_WIDTH),
+     .CS_BITS       (CS_BITS),
+     .CS_NUM        (CS_NUM),
+     .ROW_WIDTH     (ROW_WIDTH),
+     .ADDITIVE_LAT  (ADDITIVE_LAT),
+     .BURST_LEN     (BURST_LEN),
+     .CAS_LAT       (CAS_LAT),
+     .ECC_ENABLE    (ECC_ENABLE),
+     .REG_ENABLE    (REG_ENABLE),
+     .MULTI_BANK_EN (MULTI_BANK_EN),
+     .TWO_T_TIME_EN (TWO_T_TIME_EN),
+     .TREFI_NS      (TREFI_NS),
+     .TRAS          (TRAS),
+     .TRCD          (TRCD),
+     .TRFC          (TRFC),
+     .TRP           (TRP),
+     .TRTP          (TRTP),
+     .TWR           (TWR),
+     .TWTR          (TWTR),
+     .CLK_PERIOD    (CLK_PERIOD),
+     .DDR_TYPE      (DDR_TYPE)
+     )
+    u_ctrl
+      (
+       .clk           (clk0),
+       .rst           (rst0),
+       .af_cmd        (af_cmd),
+       .af_addr       (af_addr),
+       .af_empty      (af_empty),
+       .phy_init_done (phy_init_done),
+       .ctrl_ref_flag (ctrl_ref_flag),
+       .ctrl_af_rden  (ctrl_af_rden),
+       .ctrl_wren     (ctrl_wren),
+       .ctrl_rden     (ctrl_rden),
+       .ctrl_addr     (ctrl_addr),
+       .ctrl_ba       (ctrl_ba),
+       .ctrl_ras_n    (ctrl_ras_n),
+       .ctrl_cas_n    (ctrl_cas_n),
+       .ctrl_we_n     (ctrl_we_n),
+       .ctrl_cs_n     (ctrl_cs_n)
+       );
+
+endmodule
Index: trunk/Xilinx/ddr2_infrastructure.v
===================================================================
--- trunk/Xilinx/ddr2_infrastructure.v	(revision 10)
+++ trunk/Xilinx/ddr2_infrastructure.v	(revision 10)
@@ -0,0 +1,366 @@
+// (c) Copyright 2006-2009 Xilinx, Inc. All rights reserved.
+//
+// This file contains confidential and proprietary information
+// of Xilinx, Inc. and is protected under U.S. and 
+// international copyright and other intellectual property
+// laws.
+//
+// DISCLAIMER
+// This disclaimer is not a license and does not grant any
+// rights to the materials distributed herewith. Except as
+// otherwise provided in a valid license issued to you by
+// Xilinx, and to the maximum extent permitted by applicable
+// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
+// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
+// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
+// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
+// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
+// (2) Xilinx shall not be liable (whether in contract or tort,
+// including negligence, or under any other theory of
+// liability) for any loss or damage of any kind or nature
+// related to, arising under or in connection with these
+// materials, including for any direct, or any indirect,
+// special, incidental, or consequential loss or damage
+// (including loss of data, profits, goodwill, or any type of
+// loss or damage suffered as a result of any action brought
+// by a third party) even if such damage or loss was
+// reasonably foreseeable or Xilinx had been advised of the
+// possibility of the same.
+//
+// CRITICAL APPLICATIONS
+// Xilinx products are not designed or intended to be fail-
+// safe, or for use in any application requiring fail-safe
+// performance, such as life-support or safety devices or
+// systems, Class III medical devices, nuclear facilities,
+// applications related to the deployment of airbags, or any
+// other applications that could lead to death, personal
+// injury, or severe property or environmental damage
+// (individually and collectively, "Critical
+// Applications"). Customer assumes the sole risk and
+// liability of any use of Xilinx products in Critical
+// Applications, subject only to applicable laws and
+// regulations governing limitations on product liability.
+//
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_infrastructure.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   Clock generation/distribution and reset synchronization
+//Reference:
+//Revision History:
+//   Rev 1.1 - Parameter CLK_TYPE added and logic for  DIFFERENTIAL and
+//             SINGLE_ENDED added. PK. 6/20/08
+//   Rev 1.2 - Loacalparam CLK_GENERATOR added and logic for clocks generation
+//             using PLL or DCM added as generic code. PK. 10/14/08
+//   Rev 1.3 - Added parameter NOCLK200 with default value '0'. Used for
+//             controlling the instantiation of IBUFG for clk200. jul/03/09
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_infrastructure #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter CLK_PERIOD    = 3000,
+   parameter CLK_TYPE      = "DIFFERENTIAL",
+   parameter DLL_FREQ_MODE = "HIGH",
+   parameter NOCLK200      = 0,
+   parameter RST_ACT_LOW  = 1
+   )
+  (
+   input  sys_clk_p,
+   input  sys_clk_n,
+   input  sys_clk,
+   input  clk200_p,
+   input  clk200_n,
+   input  idly_clk_200,
+   output clk0,
+   output clk90,
+   output clk200,
+   output clkdiv0,
+   input  sys_rst_n,
+   input  idelay_ctrl_rdy,
+   output rst0,
+   output rst90,
+   output rst200,
+   output rstdiv0
+   );
+
+  // # of clock cycles to delay deassertion of reset. Needs to be a fairly
+  // high number not so much for metastability protection, but to give time
+  // for reset (i.e. stable clock cycles) to propagate through all state
+  // machines and to all control signals (i.e. not all control signals have
+  // resets, instead they rely on base state logic being reset, and the effect
+  // of that reset propagating through the logic). Need this because we may not
+  // be getting stable clock cycles while reset asserted (i.e. since reset
+  // depends on PLL/DCM lock status)
+  localparam RST_SYNC_NUM = 25;
+  localparam CLK_PERIOD_NS = CLK_PERIOD / 1000.0;
+  localparam CLK_PERIOD_INT = CLK_PERIOD/1000;
+
+  // By default this Parameter (CLK_GENERATOR) value is "PLL". If this
+  // Parameter is set to "PLL", PLL is used to generate the design clocks.
+  // If this Parameter is set to "DCM",
+  // DCM is used to generate the design clocks.
+  localparam CLK_GENERATOR = "PLL";
+
+  wire                       clk0_bufg;
+  wire                       clk0_bufg_in;
+  wire                       clk90_bufg;
+  wire                       clk90_bufg_in;
+  wire                       clk200_bufg;
+  wire                       clk200_ibufg;
+  wire                       clkdiv0_bufg;
+  wire                       clkdiv0_bufg_in;
+  wire                       clkfbout_clkfbin;
+  wire                       locked;
+  reg [RST_SYNC_NUM-1:0]     rst0_sync_r    /* synthesis syn_maxfan = 10 */;
+  reg [RST_SYNC_NUM-1:0]     rst200_sync_r  /* synthesis syn_maxfan = 10 */;
+  reg [RST_SYNC_NUM-1:0]     rst90_sync_r   /* synthesis syn_maxfan = 10 */;
+  reg [(RST_SYNC_NUM/2)-1:0] rstdiv0_sync_r /* synthesis syn_maxfan = 10 */;
+  wire                       rst_tmp;
+  wire                       sys_clk_ibufg;
+  wire                       sys_rst;
+
+  assign sys_rst = RST_ACT_LOW ? ~sys_rst_n: sys_rst_n;
+
+  assign clk0    = clk0_bufg;
+  assign clk90   = clk90_bufg;
+  assign clk200  = clk200_bufg;
+  assign clkdiv0 = clkdiv0_bufg;
+
+  generate
+  if(CLK_TYPE == "DIFFERENTIAL") begin : DIFF_ENDED_CLKS_INST
+    //***************************************************************************
+    // Differential input clock input buffers
+    //***************************************************************************
+
+    IBUFGDS_LVPECL_25 SYS_CLK_INST
+      (
+       .I  (sys_clk_p),
+       .IB (sys_clk_n),
+       .O  (sys_clk_ibufg)
+       );
+
+    IBUFGDS_LVPECL_25 IDLY_CLK_INST
+      (
+       .I  (clk200_p),
+       .IB (clk200_n),
+       .O  (clk200_ibufg)
+       );
+
+  end else if(CLK_TYPE == "SINGLE_ENDED") begin : SINGLE_ENDED_CLKS_INST
+    //**************************************************************************
+    // Single ended input clock input buffers
+    //**************************************************************************
+
+    BUFG SYS_CLK_INST
+      (
+       .I  (sys_clk),
+       .O  (sys_clk_ibufg)
+       );
+    if ( NOCLK200 == 0 ) begin : IBUFG_INST
+        BUFG IDLY_CLK_INST
+          (
+           .I  (idly_clk_200),
+           .O  (clk200_ibufg)
+           );
+    end
+
+  end
+  endgenerate
+
+  generate
+    if ( ((NOCLK200 == 0) && (CLK_TYPE == "SINGLE_ENDED")) || (CLK_TYPE == "DIFFERENTIAL") ) begin : BUFG_INST
+      BUFG CLK_200_BUFG
+        (
+         .O (clk200_bufg),
+         .I (clk200_ibufg)
+         );
+    end else begin : NO_BUFG
+      assign clk200_bufg = 1'b0;
+    end
+  endgenerate
+
+  //***************************************************************************
+  // Global clock generation and distribution
+  //***************************************************************************
+
+  generate
+    if (CLK_GENERATOR == "PLL") begin : gen_pll_adv
+      PLL_ADV #
+        (
+         .BANDWIDTH          ("OPTIMIZED"),
+         .CLKIN1_PERIOD      (CLK_PERIOD_NS),
+         .CLKIN2_PERIOD      (10.000),
+         .CLKOUT0_DIVIDE     (CLK_PERIOD_INT),
+         .CLKOUT1_DIVIDE     (CLK_PERIOD_INT),
+         .CLKOUT2_DIVIDE     (CLK_PERIOD_INT*2),
+         .CLKOUT3_DIVIDE     (1),
+         .CLKOUT4_DIVIDE     (1),
+         .CLKOUT5_DIVIDE     (1),
+         .CLKOUT0_PHASE      (0.000),
+         .CLKOUT1_PHASE      (90.000),
+         .CLKOUT2_PHASE      (0.000),
+         .CLKOUT3_PHASE      (0.000),
+         .CLKOUT4_PHASE      (0.000),
+         .CLKOUT5_PHASE      (0.000),
+         .CLKOUT0_DUTY_CYCLE (0.500),
+         .CLKOUT1_DUTY_CYCLE (0.500),
+         .CLKOUT2_DUTY_CYCLE (0.500),
+         .CLKOUT3_DUTY_CYCLE (0.500),
+         .CLKOUT4_DUTY_CYCLE (0.500),
+         .CLKOUT5_DUTY_CYCLE (0.500),
+         .COMPENSATION       ("SYSTEM_SYNCHRONOUS"),
+         .DIVCLK_DIVIDE      (1),
+         .CLKFBOUT_MULT      (CLK_PERIOD_INT),
+         .CLKFBOUT_PHASE     (0.0),
+         .REF_JITTER         (0.005000)
+         )
+        u_pll_adv
+          (
+           .CLKFBIN     (clkfbout_clkfbin),
+           .CLKINSEL    (1'b1),
+           .CLKIN1      (sys_clk_ibufg),
+           .CLKIN2      (1'b0),
+           .DADDR       (5'b0),
+           .DCLK        (1'b0),
+           .DEN         (1'b0),
+           .DI          (16'b0),
+           .DWE         (1'b0),
+           .REL         (1'b0),
+           .RST         (sys_rst),
+           .CLKFBDCM    (),
+           .CLKFBOUT    (clkfbout_clkfbin),
+           .CLKOUTDCM0  (),
+           .CLKOUTDCM1  (),
+           .CLKOUTDCM2  (),
+           .CLKOUTDCM3  (),
+           .CLKOUTDCM4  (),
+           .CLKOUTDCM5  (),
+           .CLKOUT0     (clk0_bufg_in),
+           .CLKOUT1     (clk90_bufg_in),
+           .CLKOUT2     (clkdiv0_bufg_in),
+           .CLKOUT3     (),
+           .CLKOUT4     (),
+           .CLKOUT5     (),
+           .DO          (),
+           .DRDY        (),
+           .LOCKED      (locked)
+           );
+    end else if (CLK_GENERATOR == "DCM") begin: gen_dcm_base
+      DCM_BASE #
+        (
+         .CLKIN_PERIOD          (CLK_PERIOD_NS),
+         .CLKDV_DIVIDE          (2.0),
+         .DLL_FREQUENCY_MODE    (DLL_FREQ_MODE),
+         .DUTY_CYCLE_CORRECTION ("TRUE"),
+         .FACTORY_JF            (16'hF0F0)
+         )
+        u_dcm_base
+          (
+           .CLK0      (clk0_bufg_in),
+           .CLK180    (),
+           .CLK270    (),
+           .CLK2X     (),
+           .CLK2X180  (),
+           .CLK90     (clk90_bufg_in),
+           .CLKDV     (clkdiv0_bufg_in),
+           .CLKFX     (),
+           .CLKFX180  (),
+           .LOCKED    (locked),
+           .CLKFB     (clk0_bufg),
+           .CLKIN     (sys_clk_ibufg),
+           .RST       (sys_rst)
+           );
+    end
+  endgenerate
+
+  BUFG U_BUFG_CLK0
+    (
+     .O (clk0_bufg),
+     .I (clk0_bufg_in)
+     );
+
+  BUFG U_BUFG_CLK90
+    (
+     .O (clk90_bufg),
+     .I (clk90_bufg_in)
+     );
+
+   BUFG U_BUFG_CLKDIV0
+    (
+     .O (clkdiv0_bufg),
+     .I (clkdiv0_bufg_in)
+     );
+
+
+  //***************************************************************************
+  // Reset synchronization
+  // NOTES:
+  //   1. shut down the whole operation if the PLL/ DCM hasn't yet locked (and
+  //      by inference, this means that external SYS_RST_IN has been asserted -
+  //      PLL/DCM deasserts LOCKED as soon as SYS_RST_IN asserted)
+  //   2. In the case of all resets except rst200, also assert reset if the
+  //      IDELAY master controller is not yet ready
+  //   3. asynchronously assert reset. This was we can assert reset even if
+  //      there is no clock (needed for things like 3-stating output buffers).
+  //      reset deassertion is synchronous.
+  //***************************************************************************
+
+  assign rst_tmp = sys_rst | ~locked | ~idelay_ctrl_rdy;
+
+  // synthesis attribute max_fanout of rst0_sync_r is 10
+  always @(posedge clk0_bufg or posedge rst_tmp)
+    if (rst_tmp)
+      rst0_sync_r <= {RST_SYNC_NUM{1'b1}};
+    else
+      // logical left shift by one (pads with 0)
+      rst0_sync_r <= rst0_sync_r << 1;
+
+  // synthesis attribute max_fanout of rstdiv0_sync_r is 10
+  always @(posedge clkdiv0_bufg or posedge rst_tmp)
+    if (rst_tmp)
+      rstdiv0_sync_r <= {(RST_SYNC_NUM/2){1'b1}};
+    else
+      // logical left shift by one (pads with 0)
+      rstdiv0_sync_r <= rstdiv0_sync_r << 1;
+
+  // synthesis attribute max_fanout of rst90_sync_r is 10
+  always @(posedge clk90_bufg or posedge rst_tmp)
+    if (rst_tmp)
+      rst90_sync_r <= {RST_SYNC_NUM{1'b1}};
+    else
+      rst90_sync_r <= rst90_sync_r << 1;
+
+  // make sure CLK200 doesn't depend on IDELAY_CTRL_RDY, else chicken n' egg
+  // synthesis attribute max_fanout of rst200_sync_r is 10
+  always @(posedge clk200_bufg or negedge locked)
+    if (!locked)
+      rst200_sync_r <= {RST_SYNC_NUM{1'b1}};
+    else
+      rst200_sync_r <= rst200_sync_r << 1;
+
+
+  assign rst0    = rst0_sync_r[RST_SYNC_NUM-1];
+  assign rst90   = rst90_sync_r[RST_SYNC_NUM-1];
+  assign rst200  = rst200_sync_r[RST_SYNC_NUM-1];
+  assign rstdiv0 = rstdiv0_sync_r[(RST_SYNC_NUM/2)-1];
+
+endmodule
Index: trunk/Xilinx/ddr2_usr_wr.v
===================================================================
--- trunk/Xilinx/ddr2_usr_wr.v	(revision 10)
+++ trunk/Xilinx/ddr2_usr_wr.v	(revision 10)
@@ -0,0 +1,334 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_usr_wr.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Mon Aug 28 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR/DDR2
+//Purpose:
+//   This module instantiates the modules containing internal FIFOs
+//Reference:
+//Revision History:
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_usr_wr #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference 
+   // board design). Actual values may be different. Actual parameters values 
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH    = 2,
+   parameter COL_WIDTH     = 10,
+   parameter CS_BITS       = 0,
+   parameter DQ_WIDTH      = 72,
+   parameter APPDATA_WIDTH = 144,
+   parameter ECC_ENABLE    = 0,
+   parameter ROW_WIDTH     = 14
+   )
+  (
+   input                         clk0,
+   input                         clk90,
+   input                         rst0,
+   // Write data FIFO interface
+   input                         app_wdf_wren,
+   input [APPDATA_WIDTH-1:0]     app_wdf_data,
+   input [(APPDATA_WIDTH/8)-1:0] app_wdf_mask_data,
+   input                         wdf_rden,
+   output                        app_wdf_afull,
+   output [(2*DQ_WIDTH)-1:0]     wdf_data,
+   output [((2*DQ_WIDTH)/8)-1:0] wdf_mask_data
+   );
+
+  // determine number of FIFO72's to use based on data width
+  // round up to next integer value when determining WDF_FIFO_NUM
+  localparam WDF_FIFO_NUM = (ECC_ENABLE) ? (APPDATA_WIDTH+63)/64 :
+             ((2*DQ_WIDTH)+63)/64;
+  // MASK_WIDTH = number of bytes in data bus
+  localparam MASK_WIDTH = DQ_WIDTH/8;
+
+  wire [WDF_FIFO_NUM-1:0]      i_wdf_afull;
+  wire [DQ_WIDTH-1:0]          i_wdf_data_fall_in;
+  wire [DQ_WIDTH-1:0]          i_wdf_data_fall_out;
+  wire [(64*WDF_FIFO_NUM)-1:0] i_wdf_data_in;
+  wire [(64*WDF_FIFO_NUM)-1:0] i_wdf_data_out;
+  wire [DQ_WIDTH-1:0]          i_wdf_data_rise_in;
+  wire [DQ_WIDTH-1:0]          i_wdf_data_rise_out;
+  wire [MASK_WIDTH-1:0]        i_wdf_mask_data_fall_in;
+  wire [MASK_WIDTH-1:0]        i_wdf_mask_data_fall_out;
+  wire [(8*WDF_FIFO_NUM)-1:0]  i_wdf_mask_data_in;
+  wire [(8*WDF_FIFO_NUM)-1:0]  i_wdf_mask_data_out;
+  wire [MASK_WIDTH-1:0]        i_wdf_mask_data_rise_in;
+  wire [MASK_WIDTH-1:0]        i_wdf_mask_data_rise_out;
+  reg                          rst_r;
+
+  // ECC signals
+  wire [(2*DQ_WIDTH)-1:0]      i_wdf_data_out_ecc;
+  wire [((2*DQ_WIDTH)/8)-1:0]  i_wdf_mask_data_out_ecc;
+  wire [63:0]                  i_wdf_mask_data_out_ecc_wire;
+  wire [((2*DQ_WIDTH)/8)-1:0]  mask_data_in_ecc;
+  wire [63:0]                  mask_data_in_ecc_wire;
+
+  //***************************************************************************
+
+  assign app_wdf_afull = i_wdf_afull[0];
+
+  always @(posedge clk0 )
+      rst_r <= rst0;
+
+  genvar wdf_di_i;
+  genvar wdf_do_i;
+  genvar mask_i;
+  genvar wdf_i;
+  generate
+    if(ECC_ENABLE) begin    // ECC code
+
+      assign wdf_data = i_wdf_data_out_ecc;
+
+      // the byte 9 dm is always held to 0
+      assign wdf_mask_data = i_wdf_mask_data_out_ecc;
+
+
+
+      // generate for write data fifo .
+      for (wdf_i = 0; wdf_i < WDF_FIFO_NUM; wdf_i = wdf_i + 1) begin: gen_wdf
+
+        FIFO36_72  #
+          (
+           .ALMOST_EMPTY_OFFSET     (9'h007),
+           .ALMOST_FULL_OFFSET      (9'h00F),
+           .DO_REG                  (1),          // extra CC output delay
+           .EN_ECC_WRITE            ("TRUE"),
+           .EN_ECC_READ             ("FALSE"),
+           .EN_SYN                  ("FALSE"),
+           .FIRST_WORD_FALL_THROUGH ("FALSE")
+           )
+          u_wdf_ecc
+            (
+             .ALMOSTEMPTY (),
+             .ALMOSTFULL  (i_wdf_afull[wdf_i]),
+             .DBITERR     (),
+             .DO          (i_wdf_data_out_ecc[((64*(wdf_i+1))+(wdf_i *8))-1:
+                                              (64*wdf_i)+(wdf_i *8)]),
+             .DOP         (i_wdf_data_out_ecc[(72*(wdf_i+1))-1:
+                                              (64*(wdf_i+1))+ (8*wdf_i) ]),
+             .ECCPARITY   (),
+             .EMPTY       (),
+             .FULL        (),
+             .RDCOUNT     (),
+             .RDERR       (),
+             .SBITERR     (),
+             .WRCOUNT     (),
+             .WRERR       (),
+             .DI          (app_wdf_data[(64*(wdf_i+1))-1:
+                                        (64*wdf_i)]),
+             .DIP         (),
+             .RDCLK       (clk90),
+             .RDEN        (wdf_rden),
+             .RST         (rst_r),          // or can use rst0
+             .WRCLK       (clk0),
+             .WREN        (app_wdf_wren)
+             );
+      end
+
+      // remapping the mask data. The mask data from user i/f does not have
+      // the mask for the ECC byte. Assigning 0 to the ECC mask byte.
+      for (mask_i = 0; mask_i < (DQ_WIDTH)/36;
+           mask_i = mask_i +1) begin: gen_mask
+        assign mask_data_in_ecc[((8*(mask_i+1))+ mask_i)-1:((8*mask_i)+mask_i)]
+                 = app_wdf_mask_data[(8*(mask_i+1))-1:8*(mask_i)] ;
+        assign mask_data_in_ecc[((8*(mask_i+1))+mask_i)] = 1'd0;
+      end
+
+      // assign ecc bits to temp variables to avoid
+      // sim warnings. Not all the 64 bits of the fifo
+      // are used in ECC mode.
+       assign  mask_data_in_ecc_wire[((2*DQ_WIDTH)/8)-1:0] = mask_data_in_ecc;
+       assign  mask_data_in_ecc_wire[63:((2*DQ_WIDTH)/8)]  =
+              {(64-((2*DQ_WIDTH)/8)){1'b0}};
+       assign i_wdf_mask_data_out_ecc =
+               i_wdf_mask_data_out_ecc_wire[((2*DQ_WIDTH)/8)-1:0];
+
+
+      FIFO36_72  #
+        (
+         .ALMOST_EMPTY_OFFSET     (9'h007),
+         .ALMOST_FULL_OFFSET      (9'h00F),
+         .DO_REG                  (1),          // extra CC output delay
+         .EN_ECC_WRITE            ("TRUE"),
+         .EN_ECC_READ             ("FALSE"),
+         .EN_SYN                  ("FALSE"),
+         .FIRST_WORD_FALL_THROUGH ("FALSE")
+         )
+        u_wdf_ecc_mask
+          (
+           .ALMOSTEMPTY (),
+           .ALMOSTFULL  (),
+           .DBITERR     (),
+           .DO          (i_wdf_mask_data_out_ecc_wire),
+           .DOP         (),
+           .ECCPARITY   (),
+           .EMPTY       (),
+           .FULL        (),
+           .RDCOUNT     (),
+           .RDERR       (),
+           .SBITERR     (),
+           .WRCOUNT     (),
+           .WRERR       (),
+           .DI          (mask_data_in_ecc_wire),
+           .DIP         (),
+           .RDCLK       (clk90),
+           .RDEN        (wdf_rden),
+           .RST         (rst_r),          // or can use rst0
+           .WRCLK       (clk0),
+           .WREN        (app_wdf_wren)
+           );
+    end else begin
+
+      //***********************************************************************
+
+      // Define intermediate buses:
+      assign i_wdf_data_rise_in
+        = app_wdf_data[DQ_WIDTH-1:0];
+      assign i_wdf_data_fall_in
+        = app_wdf_data[(2*DQ_WIDTH)-1:DQ_WIDTH];
+      assign i_wdf_mask_data_rise_in
+        = app_wdf_mask_data[MASK_WIDTH-1:0];
+      assign i_wdf_mask_data_fall_in
+        = app_wdf_mask_data[(2*MASK_WIDTH)-1:MASK_WIDTH];
+
+      //***********************************************************************
+      // Write data FIFO Input:
+      // Arrange DQ's so that the rise data and fall data are interleaved.
+      // the data arrives at the input of the wdf fifo as {fall,rise}.
+      // It is remapped as:
+      //     {...fall[15:8],rise[15:8],fall[7:0],rise[7:0]}
+      // This is done to avoid having separate fifo's for rise and fall data
+      // and to keep rise/fall data for the same DQ's on same FIFO
+      // Data masks are interleaved in a similar manner
+      // NOTE: Initialization data from PHY_INIT module does not need to be
+      //  interleaved - it's already in the correct format - and the same
+      //  initialization pattern from PHY_INIT is sent to all write FIFOs
+      //***********************************************************************
+
+      for (wdf_di_i = 0; wdf_di_i < MASK_WIDTH;
+           wdf_di_i = wdf_di_i + 1) begin: gen_wdf_data_in
+        assign i_wdf_data_in[(16*wdf_di_i)+15:(16*wdf_di_i)]
+                 = {i_wdf_data_fall_in[(8*wdf_di_i)+7:(8*wdf_di_i)],
+                    i_wdf_data_rise_in[(8*wdf_di_i)+7:(8*wdf_di_i)]};
+        assign i_wdf_mask_data_in[(2*wdf_di_i)+1:(2*wdf_di_i)]
+                 = {i_wdf_mask_data_fall_in[wdf_di_i],
+                    i_wdf_mask_data_rise_in[wdf_di_i]};
+      end
+
+      //***********************************************************************
+      // Write data FIFO Output:
+      // FIFO DQ and mask outputs must be untangled and put in the standard
+      // format of {fall,rise}. Same goes for mask output
+      //***********************************************************************
+
+      for (wdf_do_i = 0; wdf_do_i < MASK_WIDTH;
+           wdf_do_i = wdf_do_i + 1) begin: gen_wdf_data_out
+        assign i_wdf_data_rise_out[(8*wdf_do_i)+7:(8*wdf_do_i)]
+                 = i_wdf_data_out[(16*wdf_do_i)+7:(16*wdf_do_i)];
+        assign i_wdf_data_fall_out[(8*wdf_do_i)+7:(8*wdf_do_i)]
+                 = i_wdf_data_out[(16*wdf_do_i)+15:(16*wdf_do_i)+8];
+        assign i_wdf_mask_data_rise_out[wdf_do_i]
+                 = i_wdf_mask_data_out[2*wdf_do_i];
+        assign i_wdf_mask_data_fall_out[wdf_do_i]
+                 = i_wdf_mask_data_out[(2*wdf_do_i)+1];
+      end
+
+      assign wdf_data = {i_wdf_data_fall_out,
+                         i_wdf_data_rise_out};
+
+      assign wdf_mask_data = {i_wdf_mask_data_fall_out,
+                              i_wdf_mask_data_rise_out};
+
+      //***********************************************************************
+
+      for (wdf_i = 0; wdf_i < WDF_FIFO_NUM; wdf_i = wdf_i + 1) begin: gen_wdf
+
+        FIFO36_72  #
+          (
+           .ALMOST_EMPTY_OFFSET     (9'h007),
+           .ALMOST_FULL_OFFSET      (9'h00F),
+           .DO_REG                  (1),          // extra CC output delay
+           .EN_ECC_WRITE            ("FALSE"),
+           .EN_ECC_READ             ("FALSE"),
+           .EN_SYN                  ("FALSE"),
+           .FIRST_WORD_FALL_THROUGH ("FALSE")
+           )
+          u_wdf
+            (
+             .ALMOSTEMPTY (),
+             .ALMOSTFULL  (i_wdf_afull[wdf_i]),
+             .DBITERR     (),
+             .DO          (i_wdf_data_out[(64*(wdf_i+1))-1:64*wdf_i]),
+             .DOP         (i_wdf_mask_data_out[(8*(wdf_i+1))-1:8*wdf_i]),
+             .ECCPARITY   (),
+             .EMPTY       (),
+             .FULL        (),
+             .RDCOUNT     (),
+             .RDERR       (),
+             .SBITERR     (),
+             .WRCOUNT     (),
+             .WRERR       (),
+             .DI          (i_wdf_data_in[(64*(wdf_i+1))-1:64*wdf_i]),
+             .DIP         (i_wdf_mask_data_in[(8*(wdf_i+1))-1:8*wdf_i]),
+             .RDCLK       (clk90),
+             .RDEN        (wdf_rden),
+             .RST         (rst_r),          // or can use rst0
+             .WRCLK       (clk0),
+             .WREN        (app_wdf_wren)
+             );
+      end
+    end
+  endgenerate
+
+endmodule
Index: trunk/Xilinx/ddr2_phy_top.v
===================================================================
--- trunk/Xilinx/ddr2_phy_top.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_top.v	(revision 10)
@@ -0,0 +1,395 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_top.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   Top-level for memory physical layer (PHY) interface
+//Reference:
+//Revision History:
+//   Rev 1.1 - Parameter USE_DM_PORT added. PK. 6/25/08
+//   Rev 1.2 - Parameter HIGH_PERFORMANCE_MODE added. PK. 7/10/08
+//   Rev 1.3 - Parameter CS_BITS added. PK. 10/8/08
+//   Rev 1.4 - Parameter IODELAY_GRP added. PK. 11/27/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+(* X_CORE_INFO = "mig_v3_6_ddr2_sdram_v5, Coregen 12.3" , CORE_GENERATION_INFO = "ddr2_sdram_v5,mig_v3_6,{component_name=ddr2_phy_top, BANK_WIDTH=2, CKE_WIDTH=1, CLK_WIDTH=2, COL_WIDTH=10, CS_NUM=1, CS_WIDTH=1, DM_WIDTH=8, DQ_WIDTH=64, DQ_PER_DQS=8, DQS_WIDTH=8, ODT_WIDTH=1, ROW_WIDTH=13, ADDITIVE_LAT=0, BURST_LEN=4, BURST_TYPE=0, CAS_LAT=3, ECC_ENABLE=0, MULTI_BANK_EN=1, TWO_T_TIME_EN=1, ODT_TYPE=1, REDUCE_DRV=0, REG_ENABLE=0, TREFI_NS=7800, TRAS=40000, TRCD=15000, TRFC=105000, TRP=15000, TRTP=7500, TWR=15000, TWTR=7500, CLK_PERIOD=5000, RST_ACT_LOW=1, INTERFACE_TYPE=DDR2_SDRAM, LANGUAGE=Verilog, SYNTHESIS_TOOL=ISE, NO_OF_CONTROLLERS=1}" *)
+module ddr2_phy_top #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH            = 2,
+   parameter CLK_WIDTH             = 1,
+   parameter CKE_WIDTH             = 1,
+   parameter COL_WIDTH             = 10,
+   parameter CS_BITS               = 0,
+   parameter CS_NUM                = 1,
+   parameter CS_WIDTH              = 1,
+   parameter USE_DM_PORT           = 1,
+   parameter DM_WIDTH              = 9,
+   parameter DQ_WIDTH              = 72,
+   parameter DQ_BITS               = 7,
+   parameter DQ_PER_DQS            = 8,
+   parameter DQS_WIDTH             = 9,
+   parameter DQS_BITS              = 4,
+   parameter HIGH_PERFORMANCE_MODE = "TRUE",
+   parameter IODELAY_GRP           = "IODELAY_MIG",
+   parameter ODT_WIDTH             = 1,
+   parameter ROW_WIDTH             = 14,
+   parameter ADDITIVE_LAT          = 0,
+   parameter TWO_T_TIME_EN         = 0,
+   parameter BURST_LEN             = 4,
+   parameter BURST_TYPE            = 0,
+   parameter CAS_LAT               = 5,
+   parameter TWR                   = 15000,
+   parameter ECC_ENABLE            = 0,
+   parameter ODT_TYPE              = 1,
+   parameter DDR_TYPE              = 1,
+   parameter REDUCE_DRV            = 0,
+   parameter REG_ENABLE            = 1,
+   parameter CLK_PERIOD            = 3000,
+   parameter SIM_ONLY              = 0,
+   parameter DEBUG_EN              = 0,
+   parameter FPGA_SPEED_GRADE      = 2
+   )
+  (
+   input                                  clk0,
+   input                                  clk90,
+   input                                  clkdiv0,
+   input                                  rst0,
+   input                                  rst90,
+   input                                  rstdiv0,
+   input                                  ctrl_wren,
+   input [ROW_WIDTH-1:0]                  ctrl_addr,
+   input [BANK_WIDTH-1:0]                 ctrl_ba,
+   input                                  ctrl_ras_n,
+   input                                  ctrl_cas_n,
+   input                                  ctrl_we_n,
+   input [CS_NUM-1:0]                     ctrl_cs_n,
+   input                                  ctrl_rden,
+   input                                  ctrl_ref_flag,
+   input [(2*DQ_WIDTH)-1:0]               wdf_data,
+   input [(2*DQ_WIDTH/8)-1:0]             wdf_mask_data,
+   output                                 wdf_rden,
+   output                                 phy_init_done,
+   output [DQS_WIDTH-1:0]                 phy_calib_rden,
+   output [DQS_WIDTH-1:0]                 phy_calib_rden_sel,
+   output [DQ_WIDTH-1:0]                  rd_data_rise,
+   output [DQ_WIDTH-1:0]                  rd_data_fall,
+   output [CLK_WIDTH-1:0]                 ddr_ck,
+   output [CLK_WIDTH-1:0]                 ddr_ck_n,
+   output [ROW_WIDTH-1:0]                 ddr_addr,
+   output [BANK_WIDTH-1:0]                ddr_ba,
+   output                                 ddr_ras_n,
+   output                                 ddr_cas_n,
+   output                                 ddr_we_n,
+   output [CS_WIDTH-1:0]                  ddr_cs_n,
+   output [CKE_WIDTH-1:0]                 ddr_cke,
+   output [ODT_WIDTH-1:0]                 ddr_odt,
+   output [DM_WIDTH-1:0]                  ddr_dm,
+   inout [DQS_WIDTH-1:0]                  ddr_dqs,
+   inout [DQS_WIDTH-1:0]                  ddr_dqs_n,
+   inout [DQ_WIDTH-1:0]                   ddr_dq,
+   // Debug signals (optional use)
+   input                                  dbg_idel_up_all,
+   input                                  dbg_idel_down_all,
+   input                                  dbg_idel_up_dq,
+   input                                  dbg_idel_down_dq,
+   input                                  dbg_idel_up_dqs,
+   input                                  dbg_idel_down_dqs,
+   input                                  dbg_idel_up_gate,
+   input                                  dbg_idel_down_gate,
+   input [DQ_BITS-1:0]                    dbg_sel_idel_dq,
+   input                                  dbg_sel_all_idel_dq,
+   input [DQS_BITS:0]                     dbg_sel_idel_dqs,
+   input                                  dbg_sel_all_idel_dqs,
+   input [DQS_BITS:0]                     dbg_sel_idel_gate,
+   input                                  dbg_sel_all_idel_gate,
+   output [3:0]                           dbg_calib_done,
+   output [3:0]                           dbg_calib_err,
+   output [(6*DQ_WIDTH)-1:0]              dbg_calib_dq_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]             dbg_calib_dqs_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]             dbg_calib_gate_tap_cnt,
+   output [DQS_WIDTH-1:0]                 dbg_calib_rd_data_sel,
+   output [(5*DQS_WIDTH)-1:0]             dbg_calib_rden_dly,
+   output [(5*DQS_WIDTH)-1:0]             dbg_calib_gate_dly
+   );
+
+  wire [3:0]               calib_done;
+  wire                     calib_ref_done;
+  wire                     calib_ref_req;
+  wire [3:0]               calib_start;
+  wire                     dm_ce;
+  wire [1:0]               dq_oe_n;
+  wire                     dqs_oe_n;
+  wire                     dqs_rst_n;
+  wire [(DQ_WIDTH/8)-1:0]  mask_data_fall;
+  wire [(DQ_WIDTH/8)-1:0]  mask_data_rise;
+  wire [CS_NUM-1:0]        odt;
+  wire [ROW_WIDTH-1:0]     phy_init_addr;
+  wire [BANK_WIDTH-1:0]    phy_init_ba;
+  wire                     phy_init_cas_n;
+  wire [CKE_WIDTH-1:0]     phy_init_cke;
+  wire [CS_NUM-1:0]        phy_init_cs_n;
+  wire                     phy_init_data_sel;
+  wire                     phy_init_ras_n;
+  wire                     phy_init_rden;
+  wire                     phy_init_we_n;
+  wire                     phy_init_wren;
+  wire [DQ_WIDTH-1:0]      wr_data_fall;
+  wire [DQ_WIDTH-1:0]      wr_data_rise;
+
+  //***************************************************************************
+
+  ddr2_phy_write #
+    (
+     .DQ_WIDTH     (DQ_WIDTH),
+     .CS_NUM       (CS_NUM),
+     .ADDITIVE_LAT (ADDITIVE_LAT),
+     .CAS_LAT      (CAS_LAT),
+     .ECC_ENABLE   (ECC_ENABLE),
+     .ODT_TYPE     (ODT_TYPE),
+     .REG_ENABLE   (REG_ENABLE),
+     .DDR_TYPE     (DDR_TYPE)
+     )
+    u_phy_write
+      (
+       .clk0                    (clk0),
+       .clk90                   (clk90),
+       .rst90                   (rst90),
+       .wdf_data                (wdf_data),
+       .wdf_mask_data           (wdf_mask_data),
+       .ctrl_wren               (ctrl_wren),
+       .phy_init_wren           (phy_init_wren),
+       .phy_init_data_sel       (phy_init_data_sel),
+       .dm_ce                   (dm_ce),
+       .dq_oe_n                 (dq_oe_n),
+       .dqs_oe_n                (dqs_oe_n),
+       .dqs_rst_n               (dqs_rst_n),
+       .wdf_rden                (wdf_rden),
+       .odt                     (odt),
+       .wr_data_rise            (wr_data_rise),
+       .wr_data_fall            (wr_data_fall),
+       .mask_data_rise          (mask_data_rise),
+       .mask_data_fall          (mask_data_fall)
+       );
+
+  ddr2_phy_io #
+    (
+     .CLK_WIDTH             (CLK_WIDTH),
+     .USE_DM_PORT           (USE_DM_PORT),
+     .DM_WIDTH              (DM_WIDTH),
+     .DQ_WIDTH              (DQ_WIDTH),
+     .DQ_BITS               (DQ_BITS),
+     .DQ_PER_DQS            (DQ_PER_DQS),
+     .DQS_BITS              (DQS_BITS),
+     .DQS_WIDTH             (DQS_WIDTH),
+     .HIGH_PERFORMANCE_MODE (HIGH_PERFORMANCE_MODE),
+     .IODELAY_GRP           (IODELAY_GRP),
+     .ODT_WIDTH             (ODT_WIDTH),
+     .ADDITIVE_LAT          (ADDITIVE_LAT),
+     .CAS_LAT               (CAS_LAT),
+     .REG_ENABLE            (REG_ENABLE),
+     .CLK_PERIOD            (CLK_PERIOD),
+     .DDR_TYPE              (DDR_TYPE),
+     .SIM_ONLY              (SIM_ONLY),
+     .DEBUG_EN              (DEBUG_EN),
+     .FPGA_SPEED_GRADE      (FPGA_SPEED_GRADE)
+     )
+    u_phy_io
+      (
+       .clk0                   (clk0),
+       .clk90                  (clk90),
+       .clkdiv0                (clkdiv0),
+       .rst0                   (rst0),
+       .rst90                  (rst90),
+       .rstdiv0                (rstdiv0),
+       .dm_ce                  (dm_ce),
+       .dq_oe_n                (dq_oe_n),
+       .dqs_oe_n               (dqs_oe_n),
+       .dqs_rst_n              (dqs_rst_n),
+       .calib_start            (calib_start),
+       .ctrl_rden              (ctrl_rden),
+       .phy_init_rden          (phy_init_rden),
+       .calib_ref_done         (calib_ref_done),
+       .calib_done             (calib_done),
+       .calib_ref_req          (calib_ref_req),
+       .calib_rden             (phy_calib_rden),
+       .calib_rden_sel         (phy_calib_rden_sel),
+       .wr_data_rise           (wr_data_rise),
+       .wr_data_fall           (wr_data_fall),
+       .mask_data_rise         (mask_data_rise),
+       .mask_data_fall         (mask_data_fall),
+       .rd_data_rise           (rd_data_rise),
+       .rd_data_fall           (rd_data_fall),
+       .ddr_ck                 (ddr_ck),
+       .ddr_ck_n               (ddr_ck_n),
+       .ddr_dm                 (ddr_dm),
+       .ddr_dqs                (ddr_dqs),
+       .ddr_dqs_n              (ddr_dqs_n),
+       .ddr_dq                 (ddr_dq),
+       .dbg_idel_up_all        (dbg_idel_up_all),
+       .dbg_idel_down_all      (dbg_idel_down_all),
+       .dbg_idel_up_dq         (dbg_idel_up_dq),
+       .dbg_idel_down_dq       (dbg_idel_down_dq),
+       .dbg_idel_up_dqs        (dbg_idel_up_dqs),
+       .dbg_idel_down_dqs      (dbg_idel_down_dqs),
+       .dbg_idel_up_gate       (dbg_idel_up_gate),
+       .dbg_idel_down_gate     (dbg_idel_down_gate),
+       .dbg_sel_idel_dq        (dbg_sel_idel_dq),
+       .dbg_sel_all_idel_dq    (dbg_sel_all_idel_dq),
+       .dbg_sel_idel_dqs       (dbg_sel_idel_dqs),
+       .dbg_sel_all_idel_dqs   (dbg_sel_all_idel_dqs),
+       .dbg_sel_idel_gate      (dbg_sel_idel_gate),
+       .dbg_sel_all_idel_gate  (dbg_sel_all_idel_gate),
+       .dbg_calib_done         (dbg_calib_done),
+       .dbg_calib_err          (dbg_calib_err),
+       .dbg_calib_dq_tap_cnt   (dbg_calib_dq_tap_cnt),
+       .dbg_calib_dqs_tap_cnt  (dbg_calib_dqs_tap_cnt),
+       .dbg_calib_gate_tap_cnt (dbg_calib_gate_tap_cnt),
+       .dbg_calib_rd_data_sel  (dbg_calib_rd_data_sel),
+       .dbg_calib_rden_dly     (dbg_calib_rden_dly),
+       .dbg_calib_gate_dly     (dbg_calib_gate_dly)
+       );
+
+  ddr2_phy_ctl_io #
+    (
+     .BANK_WIDTH    (BANK_WIDTH),
+     .CKE_WIDTH     (CKE_WIDTH),
+     .COL_WIDTH     (COL_WIDTH),
+     .CS_NUM        (CS_NUM),
+     .CS_WIDTH      (CS_WIDTH),
+     .TWO_T_TIME_EN (TWO_T_TIME_EN),
+     .ODT_WIDTH     (ODT_WIDTH),
+     .ROW_WIDTH     (ROW_WIDTH),
+     .DDR_TYPE      (DDR_TYPE)
+     )
+    u_phy_ctl_io
+      (
+       .clk0                    (clk0),
+       .clk90                   (clk90),
+       .rst0                    (rst0),
+       .rst90                   (rst90),
+       .ctrl_addr               (ctrl_addr),
+       .ctrl_ba                 (ctrl_ba),
+       .ctrl_ras_n              (ctrl_ras_n),
+       .ctrl_cas_n              (ctrl_cas_n),
+       .ctrl_we_n               (ctrl_we_n),
+       .ctrl_cs_n               (ctrl_cs_n),
+       .phy_init_addr           (phy_init_addr),
+       .phy_init_ba             (phy_init_ba),
+       .phy_init_ras_n          (phy_init_ras_n),
+       .phy_init_cas_n          (phy_init_cas_n),
+       .phy_init_we_n           (phy_init_we_n),
+       .phy_init_cs_n           (phy_init_cs_n),
+       .phy_init_cke            (phy_init_cke),
+       .phy_init_data_sel       (phy_init_data_sel),
+       .odt                     (odt),
+       .ddr_addr                (ddr_addr),
+       .ddr_ba                  (ddr_ba),
+       .ddr_ras_n               (ddr_ras_n),
+       .ddr_cas_n               (ddr_cas_n),
+       .ddr_we_n                (ddr_we_n),
+       .ddr_cke                 (ddr_cke),
+       .ddr_cs_n                (ddr_cs_n),
+       .ddr_odt                 (ddr_odt)
+       );
+
+  ddr2_phy_init #
+    (
+     .BANK_WIDTH   (BANK_WIDTH),
+     .CKE_WIDTH    (CKE_WIDTH),
+     .COL_WIDTH    (COL_WIDTH),
+     .CS_BITS      (CS_BITS),
+     .CS_NUM       (CS_NUM),
+     .DQ_WIDTH     (DQ_WIDTH),
+     .ODT_WIDTH    (ODT_WIDTH),
+     .ROW_WIDTH    (ROW_WIDTH),
+     .ADDITIVE_LAT (ADDITIVE_LAT),
+     .BURST_LEN    (BURST_LEN),
+     .BURST_TYPE   (BURST_TYPE),
+     .TWO_T_TIME_EN(TWO_T_TIME_EN),
+     .CAS_LAT      (CAS_LAT),
+     .ODT_TYPE     (ODT_TYPE),
+     .REDUCE_DRV   (REDUCE_DRV),
+     .REG_ENABLE   (REG_ENABLE),
+     .TWR          (TWR),
+     .CLK_PERIOD   (CLK_PERIOD),
+     .DDR_TYPE     (DDR_TYPE),
+     .SIM_ONLY     (SIM_ONLY)
+     )
+    u_phy_init
+      (
+       .clk0                    (clk0),
+       .clkdiv0                 (clkdiv0),
+       .rst0                    (rst0),
+       .rstdiv0                 (rstdiv0),
+       .calib_done              (calib_done),
+       .ctrl_ref_flag           (ctrl_ref_flag),
+       .calib_ref_req           (calib_ref_req),
+       .calib_start             (calib_start),
+       .calib_ref_done          (calib_ref_done),
+       .phy_init_wren           (phy_init_wren),
+       .phy_init_rden           (phy_init_rden),
+       .phy_init_addr           (phy_init_addr),
+       .phy_init_ba             (phy_init_ba),
+       .phy_init_ras_n          (phy_init_ras_n),
+       .phy_init_cas_n          (phy_init_cas_n),
+       .phy_init_we_n           (phy_init_we_n),
+       .phy_init_cs_n           (phy_init_cs_n),
+       .phy_init_cke            (phy_init_cke),
+       .phy_init_done           (phy_init_done),
+       .phy_init_data_sel       (phy_init_data_sel)
+       );
+
+endmodule
Index: trunk/Xilinx/ddr2_phy_init.v
===================================================================
--- trunk/Xilinx/ddr2_phy_init.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_init.v	(revision 10)
@@ -0,0 +1,1219 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_init.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Thu Aug 24 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//Reference:
+//   This module is the intialization control logic of the memory interface.
+//   All commands are issued from here acoording to the burst, CAS Latency and
+//   the user commands.
+//Revision History:
+//   Rev 1.1 - Localparam WR_RECOVERY added and mapped to
+//             load mode register. PK. 14/7/08
+//   Rev 1.2 - To issue an Auto Refresh command to each chip during various
+//             calibration stages logic modified. PK. 08/10/08
+//   Rev 1.3 - Retain current data pattern for stage 4 calibration, and create
+//             new pattern for stage 4. RC. 09/21/09.
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_phy_init #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH    = 2,
+   parameter CKE_WIDTH     = 1,
+   parameter COL_WIDTH     = 10,
+   parameter CS_BITS       = 0,
+   parameter CS_NUM        = 1,
+   parameter DQ_WIDTH      = 72,
+   parameter ODT_WIDTH     = 1,
+   parameter ROW_WIDTH     = 14,
+   parameter ADDITIVE_LAT  = 0,
+   parameter BURST_LEN     = 4,
+   parameter TWO_T_TIME_EN = 0,
+   parameter BURST_TYPE    = 0,
+   parameter CAS_LAT       = 5,
+   parameter ODT_TYPE      = 1,
+   parameter REDUCE_DRV    = 0,
+   parameter REG_ENABLE    = 1,
+   parameter TWR           = 15000,
+   parameter CLK_PERIOD    = 3000,
+   parameter DDR_TYPE      = 1,
+   parameter SIM_ONLY      = 0
+   )
+  (
+   input                                   clk0,
+   input                                   clkdiv0,
+   input                                   rst0,
+   input                                   rstdiv0,
+   input [3:0]                             calib_done,
+   input                                   ctrl_ref_flag,
+   input                                   calib_ref_req,
+   output reg [3:0]                        calib_start,
+   output reg                              calib_ref_done,
+   output reg                              phy_init_wren,
+   output reg                              phy_init_rden,
+   output [ROW_WIDTH-1:0]                  phy_init_addr,
+   output [BANK_WIDTH-1:0]                 phy_init_ba,
+   output                                  phy_init_ras_n,
+   output                                  phy_init_cas_n,
+   output                                  phy_init_we_n,
+   output [CS_NUM-1:0]                     phy_init_cs_n,
+   output [CKE_WIDTH-1:0]                  phy_init_cke,
+   output reg                              phy_init_done,
+   output                                  phy_init_data_sel
+   );
+
+  // time to wait between consecutive commands in PHY_INIT - this is a
+  // generic number, and must be large enough to account for worst case
+  // timing parameter (tRFC - refresh-to-active) across all memory speed
+  // grades and operating frequencies. Expressed in CLKDIV clock cycles.
+  localparam  CNTNEXT_CMD = 7'b1111111;
+  // time to wait between read and read or precharge for stage 3 & 4
+  // the larger CNTNEXT_CMD can also be used, use smaller number to
+  // speed up calibration - avoid tRAS violation, and speeds up simulation
+  localparam  CNTNEXT_RD  = 4'b1111;
+
+  // Write recovery (WR) time - is defined by
+  // tWR (in nanoseconds) by tCK (in nanoseconds) and rounding up a
+  // noninteger value to the next integer
+  localparam integer WR_RECOVERY =  ((TWR + CLK_PERIOD) - 1)/CLK_PERIOD;
+  localparam CS_BITS_FIX         = (CS_BITS == 0) ? 1 : CS_BITS;
+
+  localparam  INIT_CAL1_READ            = 5'h00;
+  localparam  INIT_CAL2_READ            = 5'h01;
+  localparam  INIT_CAL3_READ            = 5'h02;
+  localparam  INIT_CAL4_READ            = 5'h03;
+  localparam  INIT_CAL1_WRITE           = 5'h04;
+  localparam  INIT_CAL2_WRITE           = 5'h05;
+  localparam  INIT_CAL3_WRITE           = 5'h06;
+  localparam  INIT_DUMMY_ACTIVE_WAIT    = 5'h07;
+  localparam  INIT_PRECHARGE            = 5'h08;
+  localparam  INIT_LOAD_MODE            = 5'h09;
+  localparam  INIT_AUTO_REFRESH         = 5'h0A;
+  localparam  INIT_IDLE                 = 5'h0B;
+  localparam  INIT_CNT_200              = 5'h0C;
+  localparam  INIT_CNT_200_WAIT         = 5'h0D;
+  localparam  INIT_PRECHARGE_WAIT       = 5'h0E;
+  localparam  INIT_MODE_REGISTER_WAIT   = 5'h0F;
+  localparam  INIT_AUTO_REFRESH_WAIT    = 5'h10;
+  localparam  INIT_DEEP_MEMORY_ST       = 5'h11;
+  localparam  INIT_DUMMY_ACTIVE         = 5'h12;
+  localparam  INIT_CAL1_WRITE_READ      = 5'h13;
+  localparam  INIT_CAL1_READ_WAIT       = 5'h14;
+  localparam  INIT_CAL2_WRITE_READ      = 5'h15;
+  localparam  INIT_CAL2_READ_WAIT       = 5'h16;
+  localparam  INIT_CAL3_WRITE_READ      = 5'h17;
+  localparam  INIT_CAL3_READ_WAIT       = 5'h18;
+  localparam  INIT_CAL4_READ_WAIT       = 5'h19;
+  localparam  INIT_CALIB_REF            = 5'h1A;
+  localparam  INIT_ZQCL                 = 5'h1B;
+  localparam  INIT_WAIT_DLLK_ZQINIT     = 5'h1C;
+  localparam  INIT_CAL4_WRITE           = 5'h1D;  // MIG 3.3: New state
+  localparam  INIT_CAL4_WRITE_READ      = 5'h1E;  // MIG 3.3: New state
+  
+  localparam  INIT_CNTR_INIT            = 4'h0;
+  localparam  INIT_CNTR_PRECH_1         = 4'h1;
+  localparam  INIT_CNTR_EMR2_INIT       = 4'h2;
+  localparam  INIT_CNTR_EMR3_INIT       = 4'h3;
+  localparam  INIT_CNTR_EMR_EN_DLL      = 4'h4;
+  localparam  INIT_CNTR_MR_RST_DLL      = 4'h5;
+  localparam  INIT_CNTR_CNT_200_WAIT    = 4'h6;
+  localparam  INIT_CNTR_PRECH_2         = 4'h7;
+  localparam  INIT_CNTR_AR_1            = 4'h8;
+  localparam  INIT_CNTR_AR_2            = 4'h9;
+  localparam  INIT_CNTR_MR_ACT_DLL      = 4'hA;
+  localparam  INIT_CNTR_EMR_DEF_OCD     = 4'hB;
+  localparam  INIT_CNTR_EMR_EXIT_OCD    = 4'hC;
+  localparam  INIT_CNTR_DEEP_MEM        = 4'hD;
+  // MIG 3.3: Remove extra precharge occurring at end of calibration
+//  localparam  INIT_CNTR_PRECH_3         = 4'hE;
+//  localparam  INIT_CNTR_DONE            = 4'hF;
+  localparam  INIT_CNTR_DONE            = 4'hE;
+
+  localparam   DDR1                     = 0;
+  localparam   DDR2                     = 1;
+  localparam   DDR3                     = 2;
+
+  reg [CS_BITS_FIX :0]  auto_cnt_r;
+  reg [1:0]             burst_addr_r;
+  reg [1:0]             burst_cnt_r;
+  wire [1:0]            burst_val;
+  wire                  cal_read;
+  wire                  cal_write;
+  wire                  cal_write_read;
+  reg                   cal1_started_r;
+  reg                   cal2_started_r;
+  reg                   cal4_started_r;
+  reg [3:0]             calib_done_r;
+  reg                   calib_ref_req_posedge;
+  reg                   calib_ref_req_r;
+  reg [15:0]            calib_start_shift0_r;
+  reg [15:0]            calib_start_shift1_r;
+  reg [15:0]            calib_start_shift2_r;
+  reg [15:0]            calib_start_shift3_r;
+  reg [1:0]             chip_cnt_r;
+  reg [4:0]             cke_200us_cnt_r;
+  reg                   cke_200us_cnt_en_r;
+  reg [7:0]             cnt_200_cycle_r;
+  reg                   cnt_200_cycle_done_r;
+  reg [6:0]             cnt_cmd_r;
+  reg                   cnt_cmd_ok_r;
+  reg [3:0]             cnt_rd_r;
+  reg                   cnt_rd_ok_r;
+  reg                   ctrl_ref_flag_r;
+  reg                   done_200us_r;
+  reg [ROW_WIDTH-1:0]   ddr_addr_r;
+  reg [ROW_WIDTH-1:0]   ddr_addr_r1;
+  reg [BANK_WIDTH-1:0]  ddr_ba_r;
+  reg [BANK_WIDTH-1:0]  ddr_ba_r1;
+  reg                   ddr_cas_n_r;
+  reg                   ddr_cas_n_r1;
+  reg [CKE_WIDTH-1:0]   ddr_cke_r;
+  reg [CS_NUM-1:0]      ddr_cs_n_r;
+  reg [CS_NUM-1:0]      ddr_cs_n_r1;
+  reg [CS_NUM-1:0]      ddr_cs_disable_r;
+  reg                   ddr_ras_n_r;
+  reg                   ddr_ras_n_r1;
+  reg                   ddr_we_n_r;
+  reg                   ddr_we_n_r1;
+  wire [15:0]           ext_mode_reg;
+  reg [3:0]             init_cnt_r;
+  reg                   init_done_r;
+  reg [4:0]             init_next_state;
+  reg [4:0]             init_state_r;
+  reg [4:0]             init_state_r1;
+  reg [4:0]             init_state_r1_2t;
+  reg [4:0]             init_state_r2;
+  wire [15:0]           load_mode_reg;
+  wire [15:0]           load_mode_reg0;
+  wire [15:0]           load_mode_reg1;
+  wire [15:0]           load_mode_reg2;
+  wire [15:0]           load_mode_reg3;
+  reg                   phy_init_done_r;
+  reg                   phy_init_done_r1;
+  reg                   phy_init_done_r2;
+  reg                   phy_init_done_r3;
+  reg                   refresh_req;
+  wire [3:0]            start_cal;
+
+  //***************************************************************************
+
+  //*****************************************************************
+  // DDR1 and DDR2 Load mode register
+  // Mode Register (MR):
+  //   [15:14] - unused          - 00
+  //   [13]    - reserved        - 0
+  //   [12]    - Power-down mode - 0 (normal)
+  //   [11:9]  - write recovery  - for Auto Precharge (tWR/tCK)
+  //   [8]     - DLL reset       - 0 or 1
+  //   [7]     - Test Mode       - 0 (normal)
+  //   [6:4]   - CAS latency     - CAS_LAT
+  //   [3]     - Burst Type      - BURST_TYPE
+  //   [2:0]   - Burst Length    - BURST_LEN
+  //*****************************************************************
+
+  generate
+    if (DDR_TYPE == DDR2) begin: gen_load_mode_reg_ddr2
+      assign load_mode_reg[2:0]   = (BURST_LEN == 8) ? 3'b011 :
+                                    ((BURST_LEN == 4) ? 3'b010 : 3'b111);
+      assign load_mode_reg[3]     = BURST_TYPE;
+      assign load_mode_reg[6:4]   = (CAS_LAT == 3) ? 3'b011 :
+                                    ((CAS_LAT == 4) ? 3'b100 :
+                                     ((CAS_LAT == 5) ? 3'b101 : 3'b111));
+      assign load_mode_reg[7]     = 1'b0;
+      assign load_mode_reg[8]     = 1'b0;    // init value only (DLL not reset)
+      assign load_mode_reg[11:9]  = (WR_RECOVERY == 6) ? 3'b101 :
+                                    ((WR_RECOVERY == 5) ? 3'b100 :
+                                     ((WR_RECOVERY == 4) ? 3'b011 :
+                                      ((WR_RECOVERY == 3) ? 3'b010 :
+                                      3'b001)));
+      assign load_mode_reg[15:12] = 4'b000;
+    end else if (DDR_TYPE == DDR1)begin: gen_load_mode_reg_ddr1
+      assign load_mode_reg[2:0]   = (BURST_LEN == 8) ? 3'b011 :
+                                    ((BURST_LEN == 4) ? 3'b010 :
+                                     ((BURST_LEN == 2) ? 3'b001 : 3'b111));
+      assign load_mode_reg[3]     = BURST_TYPE;
+      assign load_mode_reg[6:4]   = (CAS_LAT == 2) ? 3'b010 :
+                                    ((CAS_LAT == 3) ? 3'b011 :
+                                     ((CAS_LAT == 25) ? 3'b110 : 3'b111));
+      assign load_mode_reg[12:7]  = 6'b000000; // init value only
+      assign load_mode_reg[15:13]  = 3'b000;
+    end
+  endgenerate
+
+  //*****************************************************************
+  // DDR1 and DDR2 ext mode register
+  // Extended Mode Register (MR):
+  //   [15:14] - unused          - 00
+  //   [13]    - reserved        - 0
+  //   [12]    - output enable   - 0 (enabled)
+  //   [11]    - RDQS enable     - 0 (disabled)
+  //   [10]    - DQS# enable     - 0 (enabled)
+  //   [9:7]   - OCD Program     - 111 or 000 (first 111, then 000 during init)
+  //   [6]     - RTT[1]          - RTT[1:0] = 0(no ODT), 1(75), 2(150), 3(50)
+  //   [5:3]   - Additive CAS    - ADDITIVE_CAS
+  //   [2]     - RTT[0]
+  //   [1]     - Output drive    - REDUCE_DRV (= 0(full), = 1 (reduced)
+  //   [0]     - DLL enable      - 0 (normal)
+  //*****************************************************************
+
+  generate
+    if (DDR_TYPE == DDR2) begin: gen_ext_mode_reg_ddr2
+      assign ext_mode_reg[0]     = 1'b0;
+      assign ext_mode_reg[1]     = REDUCE_DRV;
+      assign ext_mode_reg[2]     = ((ODT_TYPE == 1) || (ODT_TYPE == 3)) ?
+                                   1'b1 : 1'b0;
+      assign ext_mode_reg[5:3]   = (ADDITIVE_LAT == 0) ? 3'b000 :
+                                   ((ADDITIVE_LAT == 1) ? 3'b001 :
+                                    ((ADDITIVE_LAT == 2) ? 3'b010 :
+                                     ((ADDITIVE_LAT == 3) ? 3'b011 :
+                                      ((ADDITIVE_LAT == 4) ? 3'b100 :
+                                      3'b111))));
+      assign ext_mode_reg[6]     = ((ODT_TYPE == 2) || (ODT_TYPE == 3)) ?
+                                   1'b1 : 1'b0;
+      assign ext_mode_reg[9:7]   = 3'b000;
+      assign ext_mode_reg[10]    = 1'b0;
+      assign ext_mode_reg[15:10] = 6'b000000;
+    end else if (DDR_TYPE == DDR1) begin: gen_ext_mode_reg_ddr1
+      assign ext_mode_reg[0]     = 1'b0;
+      assign ext_mode_reg[1]     = REDUCE_DRV;
+      assign ext_mode_reg[12:2]  = 11'b00000000000;
+      assign ext_mode_reg[15:13] = 3'b000;
+    end
+  endgenerate
+
+  //*****************************************************************
+  // DDR3 Load mode reg0
+  // Mode Register (MR0):
+  //   [15:13] - unused          - 000
+  //   [12]    - Precharge Power-down DLL usage - 0 (DLL frozen, slow-exit),
+  //             1 (DLL maintained)
+  //   [11:9]  - write recovery for Auto Precharge (tWR/tCK = 6)
+  //   [8]     - DLL reset       - 0 or 1
+  //   [7]     - Test Mode       - 0 (normal)
+  //   [6:4],[2]   - CAS latency     - CAS_LAT
+  //   [3]     - Burst Type      - BURST_TYPE
+  //   [1:0]   - Burst Length    - BURST_LEN
+  //*****************************************************************
+
+  generate
+    if (DDR_TYPE == DDR3) begin: gen_load_mode_reg0_ddr3
+      assign load_mode_reg0[1:0]   = (BURST_LEN == 8) ? 2'b00 :
+                                     ((BURST_LEN == 4) ? 2'b10 : 2'b11);
+      // Part of CAS latency. This bit is '0' for all CAS latencies
+      assign load_mode_reg0[2]     = 1'b0;
+      assign load_mode_reg0[3]     = BURST_TYPE;
+      assign load_mode_reg0[6:4]   = (CAS_LAT == 5) ? 3'b001 :
+                                     (CAS_LAT == 6) ? 3'b010 : 3'b111;
+      assign load_mode_reg0[7]     = 1'b0;
+      // init value only (DLL reset)
+      assign load_mode_reg0[8]     = 1'b1;
+      assign load_mode_reg0[11:9]  = 3'b010;
+      // Precharge Power-Down DLL 'slow-exit'
+      assign load_mode_reg0[12]    = 1'b0;
+      assign load_mode_reg0[15:13] = 3'b000;
+    end
+  endgenerate
+
+  //*****************************************************************
+  // DDR3 Load mode reg1
+  // Mode Register (MR1):
+  //   [15:13] - unused          - 00
+  //   [12]    - output enable   - 0 (enabled for DQ, DQS, DQS#)
+  //   [11]    - TDQS enable     - 0 (TDQS disabled and DM enabled)
+  //   [10]    - reserved   - 0 (must be '0')
+  //   [9]     - RTT[2]     - 0
+  //   [8]     - reserved   - 0 (must be '0')
+  //   [7]     - write leveling - 0 (disabled), 1 (enabled)
+  //   [6]     - RTT[1]          - RTT[1:0] = 0(no ODT), 1(75), 2(150), 3(50)
+  //   [5]     - Output driver impedance[1] - 0 (RZQ/6 and RZQ/7)
+  //   [4:3]   - Additive CAS    - ADDITIVE_CAS
+  //   [2]     - RTT[0]
+  //   [1]     - Output driver impedance[0] - 0(RZQ/6), or 1 (RZQ/7)
+  //   [0]     - DLL enable      - 0 (normal)
+  //*****************************************************************
+
+  generate
+    if (DDR_TYPE == DDR3) begin: gen_ext_mode_reg1_ddr3
+      // DLL enabled during Imitialization
+      assign load_mode_reg1[0]     = 1'b0;
+      // RZQ/6
+      assign load_mode_reg1[1]     = REDUCE_DRV;
+      assign load_mode_reg1[2]     = ((ODT_TYPE == 1) || (ODT_TYPE == 3)) ?
+                                     1'b1 : 1'b0;
+      assign load_mode_reg1[4:3]   = (ADDITIVE_LAT == 0) ? 2'b00 :
+                                     ((ADDITIVE_LAT == 1) ? 2'b01 :
+                                      ((ADDITIVE_LAT == 2) ? 2'b10 :
+                                       3'b111));
+      // RZQ/6
+      assign load_mode_reg1[5]     = 1'b0;
+      assign load_mode_reg1[6]     = ((ODT_TYPE == 2) || (ODT_TYPE == 3)) ?
+                                   1'b1 : 1'b0;
+      // Make zero WRITE_LEVEL
+      assign load_mode_reg1[7]   = 0;
+      assign load_mode_reg1[8]   = 1'b0;
+      assign load_mode_reg1[9]   = 1'b0;
+      assign load_mode_reg1[10]    = 1'b0;
+      assign load_mode_reg1[15:11] = 5'b00000;
+    end
+  endgenerate
+
+  //*****************************************************************
+  // DDR3 Load mode reg2
+  // Mode Register (MR2):
+  //   [15:11] - unused     - 00
+  //   [10:9]  - RTT_WR     - 00 (Dynamic ODT off)
+  //   [8]     - reserved   - 0 (must be '0')
+  //   [7]     - self-refresh temperature range -
+  //               0 (normal), 1 (extended)
+  //   [6]     - Auto Self-Refresh - 0 (manual), 1(auto)
+  //   [5:3]   - CAS Write Latency (CWL) -
+  //               000 (5 for 400 MHz device),
+  //               001 (6 for 400 MHz to 533 MHz devices),
+  //               010 (7 for 533 MHz to 667 MHz devices),
+  //               011 (8 for 667 MHz to 800 MHz)
+  //   [2:0]   - Partial Array Self-Refresh (Optional)      -
+  //               000 (full array)
+  //*****************************************************************
+
+  generate
+    if (DDR_TYPE == DDR3) begin: gen_ext_mode_reg2_ddr3
+      assign load_mode_reg2[2:0]     = 3'b000;
+      assign load_mode_reg2[5:3]   = (CAS_LAT == 5) ? 3'b000 :
+                                     (CAS_LAT == 6) ? 3'b001 : 3'b111;
+      assign load_mode_reg2[6]     = 1'b0; // Manual Self-Refresh
+      assign load_mode_reg2[7]   = 1'b0;
+      assign load_mode_reg2[8]   = 1'b0;
+      assign load_mode_reg2[10:9]  = 2'b00;
+      assign load_mode_reg2[15:11] = 5'b00000;
+    end
+  endgenerate
+
+  //*****************************************************************
+  // DDR3 Load mode reg3
+  // Mode Register (MR3):
+  //   [15:3] - unused          - All zeros
+  //   [2]     - MPR Operation - 0(normal operation), 1(data flow from MPR)
+  //   [1:0]   - MPR location     - 00 (Predefined pattern)
+  //*****************************************************************
+
+  generate
+    if (DDR_TYPE == DDR3)begin: gen_ext_mode_reg3_ddr3
+      assign load_mode_reg3[1:0]   = 2'b00;
+      assign load_mode_reg3[2]     = 1'b0;
+      assign load_mode_reg3[15:3] = 13'b0000000000000;
+    end
+  endgenerate
+
+  //***************************************************************************
+  // Logic for calibration start, and for auto-refresh during cal request
+  // CALIB_REF_REQ is used by calibration logic to request auto-refresh
+  // durign calibration (used to avoid tRAS violation is certain calibration
+  // stages take a long time). Once the auto-refresh is complete and cal can
+  // be resumed, CALIB_REF_DONE is asserted by PHY_INIT.
+  //***************************************************************************
+
+  // generate pulse for each of calibration start controls
+  assign start_cal[0] = ((init_state_r1 == INIT_CAL1_READ) &&
+                         (init_state_r2 != INIT_CAL1_READ));
+  assign start_cal[1] = ((init_state_r1 == INIT_CAL2_READ) &&
+                         (init_state_r2 != INIT_CAL2_READ));
+  assign start_cal[2] = ((init_state_r1 == INIT_CAL3_READ) &&
+                         (init_state_r2 == INIT_CAL3_WRITE_READ));
+  assign start_cal[3] = ((init_state_r1 == INIT_CAL4_READ) &&
+                         (init_state_r2 != INIT_CAL4_READ));
+  // MIG 3.3: Change to accomodate FSM changes related to stage 4 calibration
+//                         (init_state_r2 == INIT_CAL4_WRITE_READ));
+
+  // Generate positive-edge triggered, latched signal to force initialization
+  // to pause calibration, and to issue auto-refresh. Clear flag as soon as
+  // refresh initiated
+  always @(posedge clkdiv0)
+    if (rstdiv0) begin
+      calib_ref_req_r       <= 1'b0;
+      calib_ref_req_posedge <= 1'b0;
+      refresh_req           <= 1'b0;
+    end else begin
+      calib_ref_req_r       <= calib_ref_req;
+      calib_ref_req_posedge <= calib_ref_req & ~calib_ref_req_r;
+      if (init_state_r1 == INIT_AUTO_REFRESH)
+        refresh_req <= 1'b0;
+      else if (calib_ref_req_posedge)
+        refresh_req <= 1'b1;
+    end
+
+  // flag to tell cal1 calibration was started.
+  // This flag is used for cal1 auto refreshes
+  // some of these bits may not be needed - only needed for those stages that
+  // need refreshes within the stage (i.e. very long stages)
+  always @(posedge clkdiv0)
+    if (rstdiv0) begin
+      cal1_started_r <= 1'b0;
+      cal2_started_r <= 1'b0;
+      cal4_started_r <= 1'b0;
+    end else begin
+      if (calib_start[0])
+        cal1_started_r <= 1'b1;
+      if (calib_start[1])
+        cal2_started_r <= 1'b1;
+      if (calib_start[3])
+        cal4_started_r <= 1'b1;
+    end
+
+  // Delay start of each calibration by 16 clock cycles to
+  // ensure that when calibration logic begins, that read data is already
+  // appearing on the bus. Don't really need it, it's more for simulation
+  // purposes. Each circuit should synthesize using an SRL16.
+  // In first stage of calibration  periodic auto refreshes
+  // will be issued to meet memory timing. calib_start_shift0_r[15] will be
+  // asserted more than once.calib_start[0] is anded with cal1_started_r so
+  // that it is asserted only once. cal1_refresh_done is anded with
+  // cal1_started_r so that it is asserted after the auto refreshes.
+  always @(posedge clkdiv0) begin
+    calib_start_shift0_r <= {calib_start_shift0_r[14:0], start_cal[0]};
+    calib_start_shift1_r <= {calib_start_shift1_r[14:0], start_cal[1]};
+    calib_start_shift2_r <= {calib_start_shift2_r[14:0], start_cal[2]};
+    calib_start_shift3_r <= {calib_start_shift3_r[14:0], start_cal[3]};
+    calib_start[0]       <= calib_start_shift0_r[15] & ~cal1_started_r;
+    calib_start[1]       <= calib_start_shift1_r[15] & ~cal2_started_r;
+    calib_start[2]       <= calib_start_shift2_r[15];
+    calib_start[3]       <= calib_start_shift3_r[15] & ~cal4_started_r;
+    calib_ref_done       <= calib_start_shift0_r[15] |
+                            calib_start_shift1_r[15] |
+                            calib_start_shift3_r[15];
+  end
+
+  // generate delay for various states that require it (no maximum delay
+  // requirement, make sure that terminal count is large enough to cover
+  // all cases)
+  always @(posedge clkdiv0) begin
+    case (init_state_r)
+      INIT_PRECHARGE_WAIT,
+      INIT_MODE_REGISTER_WAIT,
+      INIT_AUTO_REFRESH_WAIT,
+      INIT_DUMMY_ACTIVE_WAIT,
+      INIT_CAL1_WRITE_READ,
+      INIT_CAL1_READ_WAIT,
+      INIT_CAL2_WRITE_READ,
+      INIT_CAL2_READ_WAIT,
+      INIT_CAL3_WRITE_READ,
+      INIT_CAL4_WRITE_READ :
+        cnt_cmd_r <= cnt_cmd_r + 1;
+      default:
+        cnt_cmd_r <= 7'b0000000;
+    endcase
+  end
+
+  // assert when count reaches the value
+  always @(posedge clkdiv0) begin
+    if(cnt_cmd_r == CNTNEXT_CMD)
+      cnt_cmd_ok_r <= 1'b1;
+    else
+      cnt_cmd_ok_r <= 1'b0;
+  end
+
+  always @(posedge clkdiv0) begin
+    case (init_state_r)
+      INIT_CAL3_READ_WAIT,
+      INIT_CAL4_READ_WAIT:
+        cnt_rd_r <= cnt_rd_r + 1;
+      default:
+        cnt_rd_r <= 4'b0000;
+    endcase
+  end
+
+  always @(posedge clkdiv0) begin
+    if(cnt_rd_r == CNTNEXT_RD)
+      cnt_rd_ok_r <= 1'b1;
+    else
+      cnt_rd_ok_r <= 1'b0;
+  end
+
+  //***************************************************************************
+  // Initial delay after power-on
+  //***************************************************************************
+
+  // register the refresh flag from the controller.
+  // The refresh flag is in full frequency domain - so a pulsed version must
+  // be generated for half freq domain using 2 consecutive full clk cycles
+  // The registered version is used for the 200us counter
+  always @(posedge clk0)
+    ctrl_ref_flag_r <= ctrl_ref_flag;
+  always @(posedge clkdiv0)
+    cke_200us_cnt_en_r <= ctrl_ref_flag || ctrl_ref_flag_r;
+
+  // 200us counter for cke
+  always @(posedge clkdiv0)
+    if (rstdiv0) begin
+      // skip power-up count if only simulating
+      if (SIM_ONLY)
+        cke_200us_cnt_r <= 5'b00001;
+      else
+        cke_200us_cnt_r <= 5'd27;
+    end else if (cke_200us_cnt_en_r)
+      cke_200us_cnt_r <= cke_200us_cnt_r - 1;
+
+  always @(posedge clkdiv0)
+    if (rstdiv0)
+      done_200us_r <= 1'b0;
+    else if (!done_200us_r)
+      done_200us_r <= (cke_200us_cnt_r == 5'b00000);
+
+  // 200 clocks counter - count value : h'64 required for initialization
+  // Counts 100 divided by two clocks
+  always @(posedge clkdiv0)
+    if (rstdiv0 || (init_state_r == INIT_CNT_200))
+      cnt_200_cycle_r <= 8'h64;
+    else if  (init_state_r == INIT_ZQCL) // ddr3
+      cnt_200_cycle_r <= 8'hC8;
+    else if (cnt_200_cycle_r != 8'h00)
+      cnt_200_cycle_r <= cnt_200_cycle_r - 1;
+
+  always @(posedge clkdiv0)
+    if (rstdiv0 || (init_state_r == INIT_CNT_200)
+        || (init_state_r == INIT_ZQCL))
+      cnt_200_cycle_done_r <= 1'b0;
+    else if (cnt_200_cycle_r == 8'h00)
+      cnt_200_cycle_done_r <= 1'b1;
+
+  //*****************************************************************
+  //   handle deep memory configuration:
+  //   During initialization: Repeat initialization sequence once for each
+  //   chip select. Note that we could perform initalization for all chip
+  //   selects simulataneously. Probably fine - any potential SI issues with
+  //   auto refreshing all chip selects at once?
+  //   Once initialization complete, assert only CS[1] for calibration.
+  //*****************************************************************
+
+  always @(posedge clkdiv0)
+    if (rstdiv0) begin
+      chip_cnt_r <= 2'b00;
+    end else if (init_state_r == INIT_DEEP_MEMORY_ST) begin
+      if (chip_cnt_r != CS_NUM)
+        chip_cnt_r <= chip_cnt_r + 1;
+      else
+        chip_cnt_r <= 2'b00;
+    // MIG 2.4: Modified to issue an Auto Refresh commmand
+    // to each chip select during various calibration stages
+    end else if (init_state_r == INIT_PRECHARGE && init_done_r) begin
+      chip_cnt_r <= 2'b00;
+    end else if (init_state_r1 == INIT_AUTO_REFRESH && init_done_r) begin
+      if (chip_cnt_r < (CS_NUM-1))
+        chip_cnt_r <= chip_cnt_r + 1;
+    end
+
+  // keep track of which chip selects got auto-refreshed (avoid auto-refreshing
+  // all CS's at once to avoid current spike)
+  always @(posedge clkdiv0)begin
+    if (rstdiv0 || init_state_r == INIT_PRECHARGE)
+      auto_cnt_r <= 'd0;
+    else if (init_state_r == INIT_AUTO_REFRESH && init_done_r) begin
+      if (auto_cnt_r < CS_NUM)
+        auto_cnt_r <= auto_cnt_r + 1;
+    end
+  end
+
+  always @(posedge clkdiv0)
+    if (rstdiv0) begin
+      ddr_cs_n_r <= {CS_NUM{1'b1}};
+    end else begin
+      ddr_cs_n_r <= {CS_NUM{1'b1}};
+      if ((init_state_r == INIT_DUMMY_ACTIVE) ||
+          ((init_state_r == INIT_PRECHARGE) && (~init_done_r))||
+          (init_state_r == INIT_LOAD_MODE) ||
+          (init_state_r == INIT_AUTO_REFRESH) ||
+          (init_state_r  == INIT_ZQCL    ) ||
+          (((init_state_r == INIT_CAL1_READ) ||
+            (init_state_r == INIT_CAL2_READ) ||
+            (init_state_r == INIT_CAL3_READ) ||
+            (init_state_r == INIT_CAL4_READ) ||
+            (init_state_r == INIT_CAL1_WRITE) ||
+            (init_state_r == INIT_CAL2_WRITE) ||
+            (init_state_r == INIT_CAL3_WRITE) ||
+            (init_state_r == INIT_CAL4_WRITE)) && (burst_cnt_r == 2'b00)))
+        ddr_cs_n_r[chip_cnt_r] <= 1'b0;
+      else if (init_state_r == INIT_PRECHARGE)
+        ddr_cs_n_r <= {CS_NUM{1'b0}};
+      else
+        ddr_cs_n_r[chip_cnt_r] <= 1'b1;
+    end
+
+  //***************************************************************************
+  // Write/read burst logic
+  //***************************************************************************
+
+  assign cal_write = ((init_state_r == INIT_CAL1_WRITE) ||
+                      (init_state_r == INIT_CAL2_WRITE) ||
+                      (init_state_r == INIT_CAL3_WRITE) ||
+                      (init_state_r == INIT_CAL4_WRITE));
+  assign cal_read = ((init_state_r == INIT_CAL1_READ) ||
+                     (init_state_r == INIT_CAL2_READ) ||
+                     (init_state_r == INIT_CAL3_READ) ||
+                     (init_state_r == INIT_CAL4_READ));
+  assign cal_write_read = ((init_state_r == INIT_CAL1_READ) ||
+                           (init_state_r == INIT_CAL2_READ) ||
+                           (init_state_r == INIT_CAL3_READ) ||
+                           (init_state_r == INIT_CAL4_READ) ||
+                           (init_state_r == INIT_CAL1_WRITE) ||
+                           (init_state_r == INIT_CAL2_WRITE) ||
+                           (init_state_r == INIT_CAL3_WRITE) ||
+                           (init_state_r == INIT_CAL4_WRITE));
+
+  assign burst_val = (BURST_LEN == 4) ? 2'b00 :
+                     (BURST_LEN == 8) ? 2'b01 : 2'b00;
+
+  // keep track of current address - need this if burst length < 8 for
+  // stage 2-4 calibration writes and reads. Make sure value always gets
+  // initialized to 0 before we enter write/read state. This is used to
+  // keep track of when another burst must be issued
+  always @(posedge clkdiv0)
+    if (cal_write_read)
+      burst_addr_r <= burst_addr_r + 2;
+    else
+      burst_addr_r <= 2'b00;
+
+  // write/read burst count
+  always @(posedge clkdiv0)
+    if (cal_write_read)
+      if (burst_cnt_r == 2'b00)
+        burst_cnt_r <= burst_val;
+      else // SHOULD THIS BE -2 CHECK THIS LOGIC
+        burst_cnt_r <= burst_cnt_r - 1;
+    else
+      burst_cnt_r <= 2'b00;
+
+  // indicate when a write is occurring
+  always @(posedge clkdiv0)
+    // MIG 2.1: Remove (burst_addr_r<4) term - not used
+    // phy_init_wren <= cal_write && (burst_addr_r < 3'd4);
+    phy_init_wren <= cal_write;
+
+  // used for read enable calibration, pulse to indicate when read issued
+  always @(posedge clkdiv0)
+    // MIG 2.1: Remove (burst_addr_r<4) term - not used
+    // phy_init_rden <= cal_read && (burst_addr_r < 3'd4);
+    phy_init_rden <= cal_read;
+
+  //***************************************************************************
+  // Initialization state machine
+  //***************************************************************************
+
+  always @(posedge clkdiv0)
+    // every time we need to initialize another rank of memory, need to
+    // reset init count, and repeat the entire initialization (but not
+    // calibration) sequence
+    if (rstdiv0 || (init_state_r == INIT_DEEP_MEMORY_ST))
+      init_cnt_r <= INIT_CNTR_INIT;
+    else if ((DDR_TYPE == DDR1) && (init_state_r == INIT_PRECHARGE) &&
+             (init_cnt_r == INIT_CNTR_PRECH_1))
+      // skip EMR(2) and EMR(3) register loads
+      init_cnt_r <= INIT_CNTR_EMR_EN_DLL;
+    else if ((DDR_TYPE == DDR1) && (init_state_r == INIT_LOAD_MODE) &&
+             (init_cnt_r == INIT_CNTR_MR_ACT_DLL))
+      // skip OCD calibration for DDR1
+      init_cnt_r <= INIT_CNTR_DEEP_MEM;
+    else if ((DDR_TYPE == DDR3) && (init_state_r ==  INIT_ZQCL))
+      // skip states for DDR3
+      init_cnt_r <= INIT_CNTR_DEEP_MEM;
+    else if ((init_state_r == INIT_LOAD_MODE) ||
+             ((init_state_r == INIT_PRECHARGE) && 
+              (init_state_r1 != INIT_CALIB_REF)) ||
+             ((init_state_r == INIT_AUTO_REFRESH) && (~init_done_r)) ||
+             (init_state_r == INIT_CNT_200) ||
+             // MIG 3.3: Added increment when starting calibration
+             ((init_state_r == INIT_DUMMY_ACTIVE) &&
+              (init_state_r1 == INIT_IDLE)))
+      init_cnt_r <= init_cnt_r + 1;
+
+  always @(posedge clkdiv0) begin
+    if ((init_state_r == INIT_IDLE) && (init_cnt_r == INIT_CNTR_DONE)) begin
+      phy_init_done_r <= 1'b1;
+    end else
+      phy_init_done_r <= 1'b0;
+  end
+
+  // phy_init_done to the controller and the user interface.
+  // It is delayed by four clocks to account for the
+  // multi cycle path constraint to the (phy_init_data_sel)
+  // to the phy layer.
+  always @(posedge clkdiv0) begin
+    phy_init_done_r1 <= phy_init_done_r;
+    phy_init_done_r2 <= phy_init_done_r1;
+    phy_init_done_r3 <= phy_init_done_r2;
+    phy_init_done <= phy_init_done_r3;
+  end
+
+  // Instantiate primitive to allow this flop to be attached to multicycle
+  // path constraint in UCF. This signal goes to PHY_WRITE and PHY_CTL_IO
+  // datapath logic only. Because it is a multi-cycle path, it can be
+  // clocked by either CLKDIV0 or CLK0.
+  FDRSE u_ff_phy_init_data_sel
+    (
+     .Q   (phy_init_data_sel),
+     .C   (clkdiv0),
+     .CE  (1'b1),
+     .D   (phy_init_done_r1),
+     .R   (1'b0),
+     .S   (1'b0)
+     ) /* synthesis syn_preserve=1 */
+       /* synthesis syn_replicate = 0 */;
+
+  //synthesis translate_off
+  always @(posedge calib_done[0])
+      $display ("First Stage Calibration completed at time %t", $time);
+
+  always @(posedge calib_done[1])
+    $display ("Second Stage Calibration completed at time %t", $time);
+
+  always @(posedge calib_done[2]) begin
+    $display ("Third Stage Calibration completed at time %t", $time);
+  end
+
+  always @(posedge calib_done[3]) begin
+    $display ("Fourth Stage Calibration completed at time %t", $time);
+    $display ("Calibration completed at time %t", $time);
+  end
+  //synthesis translate_on
+
+  always @(posedge clkdiv0) begin
+    if ((init_cnt_r >= INIT_CNTR_DEEP_MEM))begin
+       init_done_r <= 1'b1;
+    end else
+       init_done_r <= 1'b0;
+  end
+
+  //*****************************************************************
+
+  always @(posedge clkdiv0)
+    if (rstdiv0) begin
+      init_state_r  <= INIT_IDLE;
+      init_state_r1 <= INIT_IDLE;
+      init_state_r2 <= INIT_IDLE;
+      calib_done_r  <= 4'b0000;
+    end else begin
+      init_state_r  <= init_next_state;
+      init_state_r1 <= init_state_r;
+      init_state_r2 <= init_state_r1;
+      calib_done_r  <= calib_done; // register for timing
+    end
+
+  always @(*) begin
+    init_next_state = init_state_r;
+    (* full_case, parallel_case *) case (init_state_r)
+      INIT_IDLE: begin
+        if (done_200us_r) begin
+          (* parallel_case *) case (init_cnt_r)
+            INIT_CNTR_INIT:
+              init_next_state = INIT_CNT_200;
+            INIT_CNTR_PRECH_1:
+              init_next_state = INIT_PRECHARGE;
+            INIT_CNTR_EMR2_INIT:
+              init_next_state = INIT_LOAD_MODE; // EMR(2)
+            INIT_CNTR_EMR3_INIT:
+              init_next_state = INIT_LOAD_MODE; // EMR(3);
+            INIT_CNTR_EMR_EN_DLL:
+              init_next_state = INIT_LOAD_MODE; // EMR, enable DLL
+            INIT_CNTR_MR_RST_DLL:
+              init_next_state = INIT_LOAD_MODE; // MR, reset DLL
+            INIT_CNTR_CNT_200_WAIT:begin
+              if(DDR_TYPE == DDR3)
+                 init_next_state = INIT_ZQCL; // DDR3
+              else
+                // Wait 200cc after reset DLL
+                init_next_state = INIT_CNT_200;
+            end
+            INIT_CNTR_PRECH_2:
+              init_next_state = INIT_PRECHARGE;
+            INIT_CNTR_AR_1:
+              init_next_state = INIT_AUTO_REFRESH;
+            INIT_CNTR_AR_2:
+              init_next_state = INIT_AUTO_REFRESH;
+            INIT_CNTR_MR_ACT_DLL:
+              init_next_state = INIT_LOAD_MODE; // MR, unreset DLL
+            INIT_CNTR_EMR_DEF_OCD:
+              init_next_state = INIT_LOAD_MODE; // EMR, OCD default
+            INIT_CNTR_EMR_EXIT_OCD:
+              init_next_state = INIT_LOAD_MODE; // EMR, enable OCD exit
+            INIT_CNTR_DEEP_MEM: begin
+               if ((chip_cnt_r < CS_NUM-1))
+                  init_next_state = INIT_DEEP_MEMORY_ST;
+              else if (cnt_200_cycle_done_r)
+                init_next_state = INIT_DUMMY_ACTIVE;
+              else
+                init_next_state = INIT_IDLE;
+            end
+  // MIG 3.3: Remove extra precharge occurring at end of calibration
+//            INIT_CNTR_PRECH_3:
+//              init_next_state = INIT_PRECHARGE;
+            INIT_CNTR_DONE:
+              init_next_state = INIT_IDLE;
+            default :
+              init_next_state = INIT_IDLE;
+          endcase
+        end
+      end
+      INIT_CNT_200:
+        init_next_state = INIT_CNT_200_WAIT;
+      INIT_CNT_200_WAIT:
+        if (cnt_200_cycle_done_r)
+          init_next_state = INIT_IDLE;
+      INIT_PRECHARGE:
+        init_next_state = INIT_PRECHARGE_WAIT;
+      INIT_PRECHARGE_WAIT:
+        if (cnt_cmd_ok_r)begin
+          if (init_done_r && (!(&calib_done_r)))
+            init_next_state = INIT_AUTO_REFRESH;
+          else
+            init_next_state = INIT_IDLE;
+        end
+      INIT_ZQCL:
+        init_next_state = INIT_WAIT_DLLK_ZQINIT;
+      INIT_WAIT_DLLK_ZQINIT:
+        if (cnt_200_cycle_done_r)
+          init_next_state = INIT_IDLE;
+      INIT_LOAD_MODE:
+        init_next_state = INIT_MODE_REGISTER_WAIT;
+      INIT_MODE_REGISTER_WAIT:
+        if (cnt_cmd_ok_r)
+          init_next_state = INIT_IDLE;
+      INIT_AUTO_REFRESH:
+        init_next_state = INIT_AUTO_REFRESH_WAIT;
+      INIT_AUTO_REFRESH_WAIT:
+        // MIG 2.4: Modified to issue an Auto Refresh commmand
+        // to each chip select during various calibration stages
+        if (auto_cnt_r < CS_NUM && init_done_r) begin
+          if (cnt_cmd_ok_r)
+            init_next_state = INIT_AUTO_REFRESH;
+        end else if (cnt_cmd_ok_r)begin
+            if (init_done_r)
+              init_next_state = INIT_DUMMY_ACTIVE;
+            else
+              init_next_state = INIT_IDLE;
+        end
+      INIT_DEEP_MEMORY_ST:
+        init_next_state = INIT_IDLE;
+      // single row activate. All subsequent calibration writes and
+      // read will take place in this row
+      INIT_DUMMY_ACTIVE:
+        init_next_state = INIT_DUMMY_ACTIVE_WAIT;
+      INIT_DUMMY_ACTIVE_WAIT:
+        if (cnt_cmd_ok_r)begin
+          if (~calib_done_r[0]) begin
+            // if returning to stg1 after refresh, don't need to write
+            if (cal1_started_r)
+              init_next_state = INIT_CAL1_READ;
+            // if first entering stg1, need to write training pattern
+            else
+              init_next_state = INIT_CAL1_WRITE;
+          end else if (~calib_done[1]) begin
+            if (cal2_started_r)
+              init_next_state = INIT_CAL2_READ;
+            else
+              init_next_state = INIT_CAL2_WRITE;
+          end else if (~calib_done_r[2])
+            // Stage 3 only requires a refresh after the entire stage is
+            // finished
+            init_next_state = INIT_CAL3_WRITE;
+          else begin
+            // Stage 4 requires a refresh after every DQS group
+            if (cal4_started_r)
+              init_next_state = INIT_CAL4_READ;
+            else
+              init_next_state = INIT_CAL4_WRITE;
+          end
+        end
+      // Stage 1 calibration (write and continuous read)
+      INIT_CAL1_WRITE:
+        if (burst_addr_r == 2'b10)
+          init_next_state = INIT_CAL1_WRITE_READ;
+      INIT_CAL1_WRITE_READ:
+        if (cnt_cmd_ok_r)
+          init_next_state = INIT_CAL1_READ;
+      INIT_CAL1_READ:
+        // Stage 1 requires inter-stage auto-refresh
+        if (calib_done_r[0] || refresh_req)
+          init_next_state = INIT_CAL1_READ_WAIT;
+      INIT_CAL1_READ_WAIT:
+        if (cnt_cmd_ok_r)
+          init_next_state = INIT_CALIB_REF;
+      // Stage 2 calibration (write and continuous read)
+      INIT_CAL2_WRITE:
+        if (burst_addr_r == 2'b10)
+          init_next_state = INIT_CAL2_WRITE_READ;
+      INIT_CAL2_WRITE_READ:
+        if (cnt_cmd_ok_r)
+          init_next_state = INIT_CAL2_READ;
+      INIT_CAL2_READ:
+        // Stage 2 requires inter-stage auto-refresh
+        if (calib_done_r[1] || refresh_req)
+          init_next_state = INIT_CAL2_READ_WAIT;
+      INIT_CAL2_READ_WAIT:
+        if (cnt_cmd_ok_r)
+          init_next_state = INIT_CALIB_REF;
+      // Stage 3 calibration (write and continuous read)
+      INIT_CAL3_WRITE:
+        if (burst_addr_r == 2'b10)
+          init_next_state = INIT_CAL3_WRITE_READ;
+      INIT_CAL3_WRITE_READ:
+        if (cnt_cmd_ok_r)
+          init_next_state = INIT_CAL3_READ;
+      INIT_CAL3_READ:
+        if (burst_addr_r == 2'b10)
+          init_next_state = INIT_CAL3_READ_WAIT;
+      INIT_CAL3_READ_WAIT: begin
+        if (cnt_rd_ok_r)
+          if (calib_done_r[2]) begin
+            init_next_state = INIT_CALIB_REF;
+          end else
+            init_next_state = INIT_CAL3_READ;
+      end
+      // Stage 4 calibration
+      INIT_CAL4_WRITE:
+        if (burst_addr_r == 2'b10)
+          init_next_state = INIT_CAL4_WRITE_READ;
+      INIT_CAL4_WRITE_READ:
+        if (cnt_cmd_ok_r)
+          init_next_state = INIT_CAL4_READ;
+      INIT_CAL4_READ:
+        if (burst_addr_r == 2'b10)
+          init_next_state = INIT_CAL4_READ_WAIT;
+      INIT_CAL4_READ_WAIT: begin
+        if (cnt_rd_ok_r)
+          // Stage 4 requires inter-stage auto-refresh
+          if (calib_done_r[3] || refresh_req)
+            // MIG 3.3: With removal of extra precharge, proceed to
+            //  state CALIB_REF first to avoid incrementing init_cntr
+//            init_next_state = INIT_PRECHARGE;
+            init_next_state = INIT_CALIB_REF;   
+          else
+            init_next_state = INIT_CAL4_READ;
+      end
+      INIT_CALIB_REF:
+        init_next_state = INIT_PRECHARGE;
+    endcase
+  end
+
+  //***************************************************************************
+  // Memory control/address
+  //***************************************************************************
+
+  always @(posedge clkdiv0)
+    if ((init_state_r == INIT_DUMMY_ACTIVE) ||
+        (init_state_r == INIT_PRECHARGE) ||
+        (init_state_r == INIT_LOAD_MODE) ||
+        (init_state_r == INIT_AUTO_REFRESH)) begin
+      ddr_ras_n_r <= 1'b0;
+    end else begin
+      ddr_ras_n_r <= 1'b1;
+    end
+
+  always @(posedge clkdiv0)
+    if ((init_state_r == INIT_LOAD_MODE) ||
+        (init_state_r == INIT_AUTO_REFRESH) ||
+        (cal_write_read && (burst_cnt_r == 2'b00))) begin
+      ddr_cas_n_r <= 1'b0;
+    end else begin
+      ddr_cas_n_r <= 1'b1;
+    end
+
+  always @(posedge clkdiv0)
+    if ((init_state_r == INIT_LOAD_MODE) ||
+        (init_state_r == INIT_PRECHARGE) ||
+        (init_state_r == INIT_ZQCL) ||
+        (cal_write && (burst_cnt_r == 2'b00)))begin
+      ddr_we_n_r <= 1'b0;
+    end else begin
+      ddr_we_n_r <= 1'b1;
+    end
+
+  //*****************************************************************
+  // memory address during init
+  //*****************************************************************
+
+  always @(posedge clkdiv0) begin
+    if ((init_state_r == INIT_PRECHARGE)
+        || (init_state_r == INIT_ZQCL))begin
+      // Precharge all - set A10 = 1
+      ddr_addr_r <= {ROW_WIDTH{1'b0}};
+      ddr_addr_r[10] <= 1'b1;
+      ddr_ba_r <= {BANK_WIDTH{1'b0}};
+    end else if (init_state_r == INIT_LOAD_MODE) begin
+      ddr_ba_r <= {BANK_WIDTH{1'b0}};
+      ddr_addr_r <= {ROW_WIDTH{1'b0}};
+      case (init_cnt_r)
+        // EMR (2)
+        INIT_CNTR_EMR2_INIT: begin
+          ddr_ba_r[1:0] <= 2'b10;
+          ddr_addr_r    <= {ROW_WIDTH{1'b0}};
+        end
+        // EMR (3)
+        INIT_CNTR_EMR3_INIT: begin
+          ddr_ba_r[1:0] <= 2'b11;
+          if(DDR_TYPE == DDR3)
+            ddr_addr_r    <= load_mode_reg3[ROW_WIDTH-1:0];
+          else
+            ddr_addr_r    <= {ROW_WIDTH{1'b0}};
+        end
+        // EMR write - A0 = 0 for DLL enable
+        INIT_CNTR_EMR_EN_DLL: begin
+          ddr_ba_r[1:0] <= 2'b01;
+          if(DDR_TYPE == DDR3)
+            ddr_addr_r <= load_mode_reg1[ROW_WIDTH-1:0];
+          else
+            ddr_addr_r <= ext_mode_reg[ROW_WIDTH-1:0];
+        end
+        // MR write, reset DLL (A8=1)
+        INIT_CNTR_MR_RST_DLL: begin
+          if(DDR_TYPE == DDR3)
+            ddr_addr_r <= load_mode_reg0[ROW_WIDTH-1:0];
+          else
+            ddr_addr_r <= load_mode_reg[ROW_WIDTH-1:0];
+          ddr_ba_r[1:0] <= 2'b00;
+          ddr_addr_r[8] <= 1'b1;
+        end
+        // MR write, unreset DLL (A8=0)
+        INIT_CNTR_MR_ACT_DLL: begin
+          ddr_ba_r[1:0] <= 2'b00;
+          ddr_addr_r <= load_mode_reg[ROW_WIDTH-1:0];
+        end
+        // EMR write, OCD default state
+        INIT_CNTR_EMR_DEF_OCD: begin
+          ddr_ba_r[1:0] <= 2'b01;
+          ddr_addr_r <= ext_mode_reg[ROW_WIDTH-1:0];
+          ddr_addr_r[9:7] <= 3'b111;
+        end
+        // EMR write - OCD exit
+        INIT_CNTR_EMR_EXIT_OCD: begin
+          ddr_ba_r[1:0] <= 2'b01;
+          ddr_addr_r <= ext_mode_reg[ROW_WIDTH-1:0];
+        end
+        default: begin
+          ddr_ba_r <= {BANK_WIDTH{1'bx}};
+          ddr_addr_r <= {ROW_WIDTH{1'bx}};
+        end
+      endcase
+    end else if (cal_write_read) begin
+      // when writing or reading for Stages 2-4, since training pattern is
+      // either 4 (stage 2) or 8 (stage 3-4) long, if BURST LEN < 8, then
+      // need to issue multiple bursts to read entire training pattern
+      ddr_addr_r[ROW_WIDTH-1:3] <= {ROW_WIDTH-4{1'b0}};
+      ddr_addr_r[2:0]           <= {burst_addr_r, 1'b0};
+      ddr_ba_r                  <= {BANK_WIDTH-1{1'b0}};
+    end else if (init_state_r == INIT_DUMMY_ACTIVE) begin
+      // all calibration writing read takes place in row 0x0 only
+      ddr_ba_r   <= {BANK_WIDTH{1'b0}};
+      ddr_addr_r <= {ROW_WIDTH{1'b0}};
+    end else begin
+      // otherwise, cry me a river
+      ddr_ba_r   <= {BANK_WIDTH{1'bx}};
+      ddr_addr_r <= {ROW_WIDTH{1'bx}};
+    end
+  end
+
+  // Keep CKE asserted after initial power-on delay
+  always @(posedge clkdiv0)
+    ddr_cke_r <= {CKE_WIDTH{done_200us_r}};
+
+  // register commands to memory. Two clock cycle delay from state -> output
+  always @(posedge clk0) begin
+    ddr_addr_r1   <= ddr_addr_r;
+    ddr_ba_r1     <= ddr_ba_r;
+    ddr_cas_n_r1  <= ddr_cas_n_r;
+    ddr_ras_n_r1  <= ddr_ras_n_r;
+    ddr_we_n_r1   <= ddr_we_n_r;
+    ddr_cs_n_r1   <= ddr_cs_n_r;
+  end // always @ (posedge clk0)
+
+  always @(posedge clk0)
+    init_state_r1_2t   <= init_state_r1;
+
+  // logic to toggle chip select. The chip_select is
+  // clocked of clkdiv0 and will be asserted for
+  // two clock cycles.
+   always @(posedge clk0) begin
+      if(rst0)
+        ddr_cs_disable_r <= {CS_NUM{1'b0}};
+      else begin
+         if(| ddr_cs_disable_r)
+            ddr_cs_disable_r <= {CS_NUM{1'b0}};
+         else begin
+           if (TWO_T_TIME_EN) begin
+             if (init_state_r1_2t == INIT_PRECHARGE && init_done_r)
+               ddr_cs_disable_r <= 'd3;
+             else
+              ddr_cs_disable_r[chip_cnt_r] <= ~ddr_cs_n_r1[chip_cnt_r];
+           end
+           else begin
+             if (init_state_r1 == INIT_PRECHARGE && init_done_r)
+               ddr_cs_disable_r <= 'd3;
+             else
+              ddr_cs_disable_r[chip_cnt_r] <= ~ddr_cs_n_r[chip_cnt_r];
+           end
+         end
+       end
+   end
+
+
+  assign phy_init_addr      = ddr_addr_r;
+  assign phy_init_ba        = ddr_ba_r;
+  assign phy_init_cas_n     = ddr_cas_n_r;
+  assign phy_init_cke       = ddr_cke_r;
+  assign phy_init_ras_n     = ddr_ras_n_r;
+  assign phy_init_we_n      = ddr_we_n_r;
+  assign phy_init_cs_n      = (TWO_T_TIME_EN) ?
+                              ddr_cs_n_r1 | ddr_cs_disable_r
+                              : ddr_cs_n_r| ddr_cs_disable_r;
+
+endmodule
Index: trunk/Xilinx/ddr2_phy_io.v
===================================================================
--- trunk/Xilinx/ddr2_phy_io.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_io.v	(revision 10)
@@ -0,0 +1,353 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_io.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module instantiates calibration logic, data, data strobe and the
+//   data mask iobs.
+//Reference:
+//Revision History:
+//   Rev 1.1 - DM_IOB instance made based on USE_DM_PORT value . PK. 25/6/08
+//   Rev 1.2 - Parameter HIGH_PERFORMANCE_MODE added. PK. 7/10/08
+//   Rev 1.3 - Parameter IODELAY_GRP added. PK. 11/27/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_phy_io #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter CLK_WIDTH             = 1,
+   parameter USE_DM_PORT           = 1,
+   parameter DM_WIDTH              = 9,
+   parameter DQ_WIDTH              = 72,
+   parameter DQ_BITS               = 7,
+   parameter DQ_PER_DQS            = 8,
+   parameter DQS_BITS              = 4,
+   parameter DQS_WIDTH             = 9,
+   parameter HIGH_PERFORMANCE_MODE = "TRUE",
+   parameter IODELAY_GRP           = "IODELAY_MIG",
+   parameter ODT_WIDTH             = 1,
+   parameter ADDITIVE_LAT          = 0,
+   parameter CAS_LAT               = 5,
+   parameter REG_ENABLE            = 1,
+   parameter CLK_PERIOD            = 3000,
+   parameter DDR_TYPE              = 1,
+   parameter SIM_ONLY              = 0,
+   parameter DEBUG_EN              = 0,
+   parameter FPGA_SPEED_GRADE      = 2
+   )
+  (
+   input                                clk0,
+   input                                clk90,
+   input                                clkdiv0,
+   input                                rst0,
+   input                                rst90,
+   input                                rstdiv0,
+   input                                dm_ce,
+   input [1:0]                          dq_oe_n,
+   input                                dqs_oe_n,
+   input                                dqs_rst_n,
+   input [3:0]                          calib_start,
+   input                                ctrl_rden,
+   input                                phy_init_rden,
+   input                                calib_ref_done,
+   output [3:0]                         calib_done,
+   output                               calib_ref_req,
+   output [DQS_WIDTH-1:0]               calib_rden,
+   output [DQS_WIDTH-1:0]               calib_rden_sel,
+   input [DQ_WIDTH-1:0]                 wr_data_rise,
+   input [DQ_WIDTH-1:0]                 wr_data_fall,
+   input [(DQ_WIDTH/8)-1:0]             mask_data_rise,
+   input [(DQ_WIDTH/8)-1:0]             mask_data_fall,
+   output [(DQ_WIDTH)-1:0]              rd_data_rise,
+   output [(DQ_WIDTH)-1:0]              rd_data_fall,
+   output [CLK_WIDTH-1:0]               ddr_ck,
+   output [CLK_WIDTH-1:0]               ddr_ck_n,
+   output [DM_WIDTH-1:0]                ddr_dm,
+   inout [DQS_WIDTH-1:0]                ddr_dqs,
+   inout [DQS_WIDTH-1:0]                ddr_dqs_n,
+   inout [DQ_WIDTH-1:0]                 ddr_dq,
+   // Debug signals (optional use)
+   input                                dbg_idel_up_all,
+   input                                dbg_idel_down_all,
+   input                                dbg_idel_up_dq,
+   input                                dbg_idel_down_dq,
+   input                                dbg_idel_up_dqs,
+   input                                dbg_idel_down_dqs,
+   input                                dbg_idel_up_gate,
+   input                                dbg_idel_down_gate,
+   input [DQ_BITS-1:0]                  dbg_sel_idel_dq,
+   input                                dbg_sel_all_idel_dq,
+   input [DQS_BITS:0]                   dbg_sel_idel_dqs,
+   input                                dbg_sel_all_idel_dqs,
+   input [DQS_BITS:0]                   dbg_sel_idel_gate,
+   input                                dbg_sel_all_idel_gate,
+   output [3:0]                         dbg_calib_done,
+   output [3:0]                         dbg_calib_err,
+   output [(6*DQ_WIDTH)-1:0]            dbg_calib_dq_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]           dbg_calib_dqs_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]           dbg_calib_gate_tap_cnt,
+   output [DQS_WIDTH-1:0]               dbg_calib_rd_data_sel,
+   output [(5*DQS_WIDTH)-1:0]           dbg_calib_rden_dly,
+   output [(5*DQS_WIDTH)-1:0]           dbg_calib_gate_dly
+   );
+
+  // ratio of # of physical DM outputs to bytes in data bus
+  // may be different - e.g. if using x4 components
+  localparam DM_TO_BYTE_RATIO = DM_WIDTH / (DQ_WIDTH/8);
+
+  wire [CLK_WIDTH-1:0]                     ddr_ck_q;
+  wire [DQS_WIDTH-1:0]                     delayed_dqs;
+  wire [DQ_WIDTH-1:0]                      dlyce_dq;
+  wire [DQS_WIDTH-1:0]                     dlyce_dqs;
+  wire [DQS_WIDTH-1:0]                     dlyce_gate;
+  wire [DQ_WIDTH-1:0]                      dlyinc_dq;
+  wire [DQS_WIDTH-1:0]                     dlyinc_dqs;
+  wire [DQS_WIDTH-1:0]                     dlyinc_gate;
+  wire                                     dlyrst_dq;
+  wire                                     dlyrst_dqs;
+  wire [DQS_WIDTH-1:0]                     dlyrst_gate;
+  wire [DQS_WIDTH-1:0]                     dq_ce;
+  (* KEEP = "TRUE" *) wire [DQS_WIDTH-1:0] en_dqs /* synthesis syn_keep = 1 */;
+  wire [DQS_WIDTH-1:0]                     rd_data_sel;
+
+  //***************************************************************************
+
+  ddr2_phy_calib #
+    (
+     .DQ_WIDTH      (DQ_WIDTH),
+     .DQ_BITS       (DQ_BITS),
+     .DQ_PER_DQS    (DQ_PER_DQS),
+     .DQS_BITS      (DQS_BITS),
+     .DQS_WIDTH     (DQS_WIDTH),
+     .ADDITIVE_LAT  (ADDITIVE_LAT),
+     .CAS_LAT       (CAS_LAT),
+     .REG_ENABLE    (REG_ENABLE),
+     .CLK_PERIOD    (CLK_PERIOD),
+     .SIM_ONLY      (SIM_ONLY),
+     .DEBUG_EN      (DEBUG_EN)
+     )
+    u_phy_calib
+      (
+       .clk                    (clk0),
+       .clkdiv                 (clkdiv0),
+       .rstdiv                 (rstdiv0),
+       .calib_start            (calib_start),
+       .ctrl_rden              (ctrl_rden),
+       .phy_init_rden          (phy_init_rden),
+       .rd_data_rise           (rd_data_rise),
+       .rd_data_fall           (rd_data_fall),
+       .calib_ref_done         (calib_ref_done),
+       .calib_done             (calib_done),
+       .calib_ref_req          (calib_ref_req),
+       .calib_rden             (calib_rden),
+       .calib_rden_sel         (calib_rden_sel),
+       .dlyrst_dq              (dlyrst_dq),
+       .dlyce_dq               (dlyce_dq),
+       .dlyinc_dq              (dlyinc_dq),
+       .dlyrst_dqs             (dlyrst_dqs),
+       .dlyce_dqs              (dlyce_dqs),
+       .dlyinc_dqs             (dlyinc_dqs),
+       .dlyrst_gate            (dlyrst_gate),
+       .dlyce_gate             (dlyce_gate),
+       .dlyinc_gate            (dlyinc_gate),
+       .en_dqs                 (en_dqs),
+       .rd_data_sel            (rd_data_sel),
+       .dbg_idel_up_all        (dbg_idel_up_all),
+       .dbg_idel_down_all      (dbg_idel_down_all),
+       .dbg_idel_up_dq         (dbg_idel_up_dq),
+       .dbg_idel_down_dq       (dbg_idel_down_dq),
+       .dbg_idel_up_dqs        (dbg_idel_up_dqs),
+       .dbg_idel_down_dqs      (dbg_idel_down_dqs),
+       .dbg_idel_up_gate       (dbg_idel_up_gate),
+       .dbg_idel_down_gate     (dbg_idel_down_gate),
+       .dbg_sel_idel_dq        (dbg_sel_idel_dq),
+       .dbg_sel_all_idel_dq    (dbg_sel_all_idel_dq),
+       .dbg_sel_idel_dqs       (dbg_sel_idel_dqs),
+       .dbg_sel_all_idel_dqs   (dbg_sel_all_idel_dqs),
+       .dbg_sel_idel_gate      (dbg_sel_idel_gate),
+       .dbg_sel_all_idel_gate  (dbg_sel_all_idel_gate),
+       .dbg_calib_done         (dbg_calib_done),
+       .dbg_calib_err          (dbg_calib_err),
+       .dbg_calib_dq_tap_cnt   (dbg_calib_dq_tap_cnt),
+       .dbg_calib_dqs_tap_cnt  (dbg_calib_dqs_tap_cnt),
+       .dbg_calib_gate_tap_cnt (dbg_calib_gate_tap_cnt),
+       .dbg_calib_rd_data_sel  (dbg_calib_rd_data_sel),
+       .dbg_calib_rden_dly     (dbg_calib_rden_dly),
+       .dbg_calib_gate_dly     (dbg_calib_gate_dly)
+       );
+
+  //***************************************************************************
+  // Memory clock generation
+  //***************************************************************************
+
+  genvar ck_i;
+  generate
+    for(ck_i = 0; ck_i < CLK_WIDTH; ck_i = ck_i+1) begin: gen_ck
+      ODDR #
+        (
+         .SRTYPE       ("SYNC"),
+         .DDR_CLK_EDGE ("OPPOSITE_EDGE")
+         )
+        u_oddr_ck_i
+          (
+           .Q   (ddr_ck_q[ck_i]),
+           .C   (clk0),
+           .CE  (1'b1),
+           .D1  (1'b0),
+           .D2  (1'b1),
+           .R   (1'b0),
+           .S   (1'b0)
+           );
+      // Can insert ODELAY here if required
+      OBUFDS u_obuf_ck_i
+        (
+         .I   (ddr_ck_q[ck_i]),
+         .O   (ddr_ck[ck_i]),
+         .OB  (ddr_ck_n[ck_i])
+         );
+    end
+  endgenerate
+
+  //***************************************************************************
+  // DQS instances
+  //***************************************************************************
+
+  genvar dqs_i;
+  generate
+    for(dqs_i = 0; dqs_i < DQS_WIDTH; dqs_i = dqs_i+1) begin: gen_dqs
+      ddr2_phy_dqs_iob #
+        (
+         .DDR_TYPE              (DDR_TYPE),
+         .HIGH_PERFORMANCE_MODE (HIGH_PERFORMANCE_MODE),
+         .IODELAY_GRP           (IODELAY_GRP)
+         )
+        u_iob_dqs
+          (
+           .clk0           (clk0),
+           .clkdiv0        (clkdiv0),
+           .rst0           (rst0),
+           .dlyinc_dqs     (dlyinc_dqs[dqs_i]),
+           .dlyce_dqs      (dlyce_dqs[dqs_i]),
+           .dlyrst_dqs     (dlyrst_dqs),
+           .dlyinc_gate    (dlyinc_gate[dqs_i]),
+           .dlyce_gate     (dlyce_gate[dqs_i]),
+           .dlyrst_gate    (dlyrst_gate[dqs_i]),
+           .dqs_oe_n       (dqs_oe_n),
+           .dqs_rst_n      (dqs_rst_n),
+           .en_dqs         (en_dqs[dqs_i]),
+           .ddr_dqs        (ddr_dqs[dqs_i]),
+           .ddr_dqs_n      (ddr_dqs_n[dqs_i]),
+           .dq_ce          (dq_ce[dqs_i]),
+           .delayed_dqs    (delayed_dqs[dqs_i])
+           );
+    end
+  endgenerate
+
+  //***************************************************************************
+  // DM instances
+  //***************************************************************************
+
+  genvar dm_i;
+  generate
+    if (USE_DM_PORT) begin: gen_dm_inst
+      for(dm_i = 0; dm_i < DM_WIDTH; dm_i = dm_i+1) begin: gen_dm
+        ddr2_phy_dm_iob u_iob_dm
+          (
+           .clk90           (clk90),
+           .dm_ce           (dm_ce),
+           .mask_data_rise  (mask_data_rise[dm_i/DM_TO_BYTE_RATIO]),
+           .mask_data_fall  (mask_data_fall[dm_i/DM_TO_BYTE_RATIO]),
+           .ddr_dm          (ddr_dm[dm_i])
+           );
+      end
+    end
+  endgenerate
+
+  //***************************************************************************
+  // DQ IOB instances
+  //***************************************************************************
+
+  genvar dq_i;
+  generate
+    for(dq_i = 0; dq_i < DQ_WIDTH; dq_i = dq_i+1) begin: gen_dq
+      ddr2_phy_dq_iob #
+        (
+         .HIGH_PERFORMANCE_MODE (HIGH_PERFORMANCE_MODE),
+         .IODELAY_GRP           (IODELAY_GRP),
+         .FPGA_SPEED_GRADE      (FPGA_SPEED_GRADE)
+         )
+        u_iob_dq
+        (
+         .clk0         (clk0),
+         .clk90        (clk90),
+         .clkdiv0      (clkdiv0),
+         .rst90        (rst90),
+         .dlyinc       (dlyinc_dq[dq_i]),
+         .dlyce        (dlyce_dq[dq_i]),
+         .dlyrst       (dlyrst_dq),
+         .dq_oe_n      (dq_oe_n),
+         .dqs          (delayed_dqs[dq_i/DQ_PER_DQS]),
+         .ce           (dq_ce[dq_i/DQ_PER_DQS]),
+         .rd_data_sel  (rd_data_sel[dq_i/DQ_PER_DQS]),
+         .wr_data_rise (wr_data_rise[dq_i]),
+         .wr_data_fall (wr_data_fall[dq_i]),
+         .rd_data_rise (rd_data_rise[dq_i]),
+         .rd_data_fall (rd_data_fall[dq_i]),
+         .ddr_dq       (ddr_dq[dq_i])
+         );
+    end
+  endgenerate
+
+endmodule
Index: trunk/Xilinx/cachedir.v
===================================================================
--- trunk/Xilinx/cachedir.v	(revision 10)
+++ trunk/Xilinx/cachedir.v	(revision 10)
@@ -0,0 +1,53 @@
+`timescale 1ns / 1ps
+//////////////////////////////////////////////////////////////////////////////////
+// Company: 
+// Engineer: 
+// 
+// Create Date:    12:52:07 03/14/2011 
+// Design Name: 
+// Module Name:    cachedir 
+// Project Name: 
+// Target Devices: 
+// Tool versions: 
+// Description: 
+//
+// Dependencies: 
+//
+// Revision: 
+// Revision 0.01 - File Created
+// Additional Comments: 
+//
+//////////////////////////////////////////////////////////////////////////////////
+module cachedir(
+    input clock,
+    input enable,
+    input wren_a,
+    input [ 7:0] address_a,
+    input [28:0] data_a,
+    output [ 28:0] q_a,
+    input wren_b,
+    input [ 7:0] address_b,
+    input [28:0] data_b,
+    output [28:0] q_b
+    );
+
+reg [28:0] mem1 [(2**7)-1:0];
+reg [28:0] mem2 [(2**7)-1:0];
+      
+always @(posedge clock)
+     begin
+		if (enable)
+         if (wren_a)
+            mem1[address_a] <= data_a;
+	  end
+
+assign  q_a = mem1[address_a]; 	  
+
+always @(posedge clock)
+     begin
+ 	   if (enable)
+         if (wren_b)
+            mem2[address_b] <= data_b;
+     end
+assign  q_b = mem2[address_b];
+endmodule
Index: trunk/Xilinx/ddr2_phy_ctl_io.v
===================================================================
--- trunk/Xilinx/ddr2_phy_ctl_io.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_ctl_io.v	(revision 10)
@@ -0,0 +1,304 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_ctl_io.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Thu Aug 24 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module puts the memory control signals like address, bank address,
+//   row address strobe, column address strobe, write enable and clock enable
+//   in the IOBs.
+//Reference:
+//Revision History:
+//   Rev 1.1 - To fix CR 540201, S attribute is added for CS, CKE and ODT
+//             module (FDCPE) instances. PK. 01/08/10
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_phy_ctl_io #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH    = 2,
+   parameter CKE_WIDTH     = 1,
+   parameter COL_WIDTH     = 10,
+   parameter CS_NUM        = 1,
+   parameter TWO_T_TIME_EN = 0,
+   parameter CS_WIDTH      = 1,
+   parameter ODT_WIDTH     = 1,
+   parameter ROW_WIDTH     = 14,
+   parameter DDR_TYPE      = 1
+   )
+  (
+   input                   clk0,
+   input                   clk90,
+   input                   rst0,
+   input                   rst90,
+   input [ROW_WIDTH-1:0]   ctrl_addr,
+   input [BANK_WIDTH-1:0]  ctrl_ba,
+   input                   ctrl_ras_n,
+   input                   ctrl_cas_n,
+   input                   ctrl_we_n,
+   input [CS_NUM-1:0]      ctrl_cs_n,
+   input [ROW_WIDTH-1:0]   phy_init_addr,
+   input [BANK_WIDTH-1:0]  phy_init_ba,
+   input                   phy_init_ras_n,
+   input                   phy_init_cas_n,
+   input                   phy_init_we_n,
+   input [CS_NUM-1:0]      phy_init_cs_n,
+   input [CKE_WIDTH-1:0]   phy_init_cke,
+   input                   phy_init_data_sel,
+   input [CS_NUM-1:0]      odt,
+   output [ROW_WIDTH-1:0]  ddr_addr,
+   output [BANK_WIDTH-1:0] ddr_ba,
+   output                  ddr_ras_n,
+   output                  ddr_cas_n,
+   output                  ddr_we_n,
+   output [CKE_WIDTH-1:0]  ddr_cke,
+   output [CS_WIDTH-1:0]   ddr_cs_n,
+   output [ODT_WIDTH-1:0]  ddr_odt
+   );
+
+  reg [ROW_WIDTH-1:0]     addr_mux;
+  reg [BANK_WIDTH-1:0]    ba_mux;
+  reg                     cas_n_mux;
+  reg [CS_NUM-1:0]        cs_n_mux;
+  reg                     ras_n_mux;
+  reg                     we_n_mux;
+
+
+
+  //***************************************************************************
+
+
+
+
+  // MUX to choose from either PHY or controller for SDRAM control
+
+  generate // in 2t timing mode the extra register stage cannot be used.
+    if(TWO_T_TIME_EN) begin // the control signals are asserted for two cycles
+      always @(*)begin
+        if (phy_init_data_sel) begin
+          addr_mux  = ctrl_addr;
+          ba_mux    = ctrl_ba;
+          cas_n_mux = ctrl_cas_n;
+          cs_n_mux  = ctrl_cs_n;
+          ras_n_mux = ctrl_ras_n;
+          we_n_mux  = ctrl_we_n;
+        end else begin
+          addr_mux  = phy_init_addr;
+          ba_mux    = phy_init_ba;
+          cas_n_mux = phy_init_cas_n;
+          cs_n_mux  = phy_init_cs_n;
+          ras_n_mux = phy_init_ras_n;
+          we_n_mux  = phy_init_we_n;
+        end
+      end
+    end else begin
+      always @(posedge clk0)begin // register the signals in non 2t mode
+        if (phy_init_data_sel) begin
+          addr_mux <= ctrl_addr;
+          ba_mux <= ctrl_ba;
+          cas_n_mux <= ctrl_cas_n;
+          cs_n_mux <= ctrl_cs_n;
+          ras_n_mux <= ctrl_ras_n;
+          we_n_mux <= ctrl_we_n;
+        end else begin
+          addr_mux <= phy_init_addr;
+          ba_mux <= phy_init_ba;
+          cas_n_mux <= phy_init_cas_n;
+          cs_n_mux <= phy_init_cs_n;
+          ras_n_mux <= phy_init_ras_n;
+          we_n_mux <= phy_init_we_n;
+        end
+      end
+    end
+  endgenerate
+
+  //***************************************************************************
+  // Output flop instantiation
+  // NOTE: Make sure all control/address flops are placed in IOBs
+  //***************************************************************************
+
+  // RAS: = 1 at reset
+  (* IOB = "FORCE" *) FDCPE u_ff_ras_n
+    (
+     .Q   (ddr_ras_n),
+     .C   (clk0),
+     .CE  (1'b1),
+     .CLR (1'b0),
+     .D   (ras_n_mux),
+     .PRE (rst0)
+     ) /* synthesis syn_useioff = 1 */;
+
+  // CAS: = 1 at reset
+  (* IOB = "FORCE" *) FDCPE u_ff_cas_n
+    (
+     .Q   (ddr_cas_n),
+     .C   (clk0),
+     .CE  (1'b1),
+     .CLR (1'b0),
+     .D   (cas_n_mux),
+     .PRE (rst0)
+     ) /* synthesis syn_useioff = 1 */;
+
+  // WE: = 1 at reset
+  (* IOB = "FORCE" *) FDCPE u_ff_we_n
+    (
+     .Q   (ddr_we_n),
+     .C   (clk0),
+     .CE  (1'b1),
+     .CLR (1'b0),
+     .D   (we_n_mux),
+     .PRE (rst0)
+     ) /* synthesis syn_useioff = 1 */;
+
+  // CKE: = 0 at reset
+  genvar cke_i;
+  generate
+    for (cke_i = 0; cke_i < CKE_WIDTH; cke_i = cke_i + 1) begin: gen_cke
+      (* IOB = "FORCE" *) (* S = "TRUE" *) FDCPE u_ff_cke
+        (
+         .Q   (ddr_cke[cke_i]),
+         .C   (clk0),
+         .CE  (1'b1),
+         .CLR (rst0),
+         .D   (phy_init_cke[cke_i]),
+         .PRE (1'b0)
+         ) /* synthesis syn_useioff = 1 */;
+    end
+  endgenerate
+
+  // chip select: = 1 at reset
+  // For unbuffered dimms the loading will be high. The chip select
+  // can be asserted early if the loading is very high. The
+  // code as is uses clock 0. If needed clock 270 can be used to
+  // toggle chip select 1/4 clock cycle early. The code has
+  // the clock 90 input for the early assertion of chip select.
+
+  genvar cs_i;
+  generate
+    for(cs_i = 0; cs_i < CS_WIDTH; cs_i = cs_i + 1) begin: gen_cs_n
+      if(TWO_T_TIME_EN) begin
+         (* IOB = "FORCE" *) (* S = "TRUE" *) FDCPE u_ff_cs_n
+           (
+            .Q   (ddr_cs_n[cs_i]),
+            .C   (clk0),
+            .CE  (1'b1),
+            .CLR (1'b0),
+            .D   (cs_n_mux[(cs_i*CS_NUM)/CS_WIDTH]),
+            .PRE (rst0)
+            ) /* synthesis syn_useioff = 1 */;
+      end else begin // if (TWO_T_TIME_EN)
+         (* IOB = "FORCE" *) (* S = "TRUE" *) FDCPE u_ff_cs_n
+           (
+            .Q   (ddr_cs_n[cs_i]),
+            .C   (clk0),
+            .CE  (1'b1),
+            .CLR (1'b0),
+            .D   (cs_n_mux[(cs_i*CS_NUM)/CS_WIDTH]),
+            .PRE (rst0)
+            ) /* synthesis syn_useioff = 1 */;
+      end // else: !if(TWO_T_TIME_EN)
+    end
+  endgenerate
+
+  // address: = X at reset
+  genvar addr_i;
+  generate
+    for (addr_i = 0; addr_i < ROW_WIDTH; addr_i = addr_i + 1) begin: gen_addr
+      (* IOB = "FORCE" *) FDCPE u_ff_addr
+        (
+         .Q   (ddr_addr[addr_i]),
+         .C   (clk0),
+         .CE  (1'b1),
+         .CLR (1'b0),
+         .D   (addr_mux[addr_i]),
+         .PRE (1'b0)
+         ) /* synthesis syn_useioff = 1 */;
+    end
+  endgenerate
+
+  // bank address = X at reset
+  genvar ba_i;
+  generate
+    for (ba_i = 0; ba_i < BANK_WIDTH; ba_i = ba_i + 1) begin: gen_ba
+      (* IOB = "FORCE" *) FDCPE u_ff_ba
+        (
+         .Q   (ddr_ba[ba_i]),
+         .C   (clk0),
+         .CE  (1'b1),
+         .CLR (1'b0),
+         .D   (ba_mux[ba_i]),
+         .PRE (1'b0)
+         ) /* synthesis syn_useioff = 1 */;
+    end
+  endgenerate
+
+  // ODT control = 0 at reset
+  genvar odt_i;
+  generate
+    if (DDR_TYPE > 0) begin: gen_odt_ddr2
+      for (odt_i = 0; odt_i < ODT_WIDTH; odt_i = odt_i + 1) begin: gen_odt
+        (* IOB = "FORCE" *) (* S = "TRUE" *) FDCPE u_ff_odt
+          (
+           .Q   (ddr_odt[odt_i]),
+           .C   (clk0),
+           .CE  (1'b1),
+           .CLR (rst0),
+           .D   (odt[(odt_i*CS_NUM)/ODT_WIDTH]),
+           .PRE (1'b0)
+           ) /* synthesis syn_useioff = 1 */;
+      end
+    end
+  endgenerate
+
+endmodule
Index: trunk/Xilinx/ddr2_phy_calib.v
===================================================================
--- trunk/Xilinx/ddr2_phy_calib.v	(revision 10)
+++ trunk/Xilinx/ddr2_phy_calib.v	(revision 10)
@@ -0,0 +1,2428 @@
+//*****************************************************************************
+// (c) Copyright 2006-2009 Xilinx, Inc. All rights reserved.
+//
+// This file contains confidential and proprietary information
+// of Xilinx, Inc. and is protected under U.S. and 
+// international copyright and other intellectual property
+// laws.
+//
+// DISCLAIMER
+// This disclaimer is not a license and does not grant any
+// rights to the materials distributed herewith. Except as
+// otherwise provided in a valid license issued to you by
+// Xilinx, and to the maximum extent permitted by applicable
+// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
+// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
+// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
+// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
+// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
+// (2) Xilinx shall not be liable (whether in contract or tort,
+// including negligence, or under any other theory of
+// liability) for any loss or damage of any kind or nature
+// related to, arising under or in connection with these
+// materials, including for any direct, or any indirect,
+// special, incidental, or consequential loss or damage
+// (including loss of data, profits, goodwill, or any type of
+// loss or damage suffered as a result of any action brought
+// by a third party) even if such damage or loss was
+// reasonably foreseeable or Xilinx had been advised of the
+// possibility of the same.
+//
+// CRITICAL APPLICATIONS
+// Xilinx products are not designed or intended to be fail-
+// safe, or for use in any application requiring fail-safe
+// performance, such as life-support or safety devices or
+// systems, Class III medical devices, nuclear facilities,
+// applications related to the deployment of airbags, or any
+// other applications that could lead to death, personal
+// injury, or severe property or environmental damage
+// (individually and collectively, "Critical
+// Applications"). Customer assumes the sole risk and
+// liability of any use of Xilinx products in Critical
+// Applications, subject only to applicable laws and
+// regulations governing limitations on product liability.
+//
+// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
+// PART OF THIS FILE AT ALL TIMES.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_phy_calib.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Thu Aug 10 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module handles calibration after memory initialization.
+//Reference:
+//Revision History:
+//   Rev 1.1 - Default statement is added for the CASE statement of
+//             rdd_mux_sel logic. PK. 03/23/09
+//   Rev 1.2 - Change training pattern detected for stage 3 calibration.
+//             Use 2-bits per DQS group for stage 3 pattern detection.
+//             RC. 09/21/09
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_phy_calib #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter DQ_WIDTH      = 72,
+   parameter DQ_BITS       = 7,
+   parameter DQ_PER_DQS    = 8,
+   parameter DQS_BITS      = 4,
+   parameter DQS_WIDTH     = 9,
+   parameter ADDITIVE_LAT  = 0,
+   parameter CAS_LAT       = 5,
+   parameter REG_ENABLE    = 1,
+   parameter CLK_PERIOD    = 3000,
+   parameter SIM_ONLY      = 0,
+   parameter DEBUG_EN      = 0
+   )
+  (
+   input                                   clk,
+   input                                   clkdiv,
+   input                                   rstdiv,
+   input [3:0]                             calib_start,
+   input                                   ctrl_rden,
+   input                                   phy_init_rden,
+   input [DQ_WIDTH-1:0]                    rd_data_rise,
+   input [DQ_WIDTH-1:0]                    rd_data_fall,
+   input                                   calib_ref_done,
+   output reg [3:0]                        calib_done,
+   output reg                              calib_ref_req,
+   output [DQS_WIDTH-1:0]                  calib_rden,
+   output reg [DQS_WIDTH-1:0]              calib_rden_sel,
+   output reg                              dlyrst_dq,
+   output reg [DQ_WIDTH-1:0]               dlyce_dq,
+   output reg [DQ_WIDTH-1:0]               dlyinc_dq,
+   output reg                              dlyrst_dqs,
+   output reg [DQS_WIDTH-1:0]              dlyce_dqs,
+   output reg [DQS_WIDTH-1:0]              dlyinc_dqs,
+   output reg [DQS_WIDTH-1:0]              dlyrst_gate,
+   output reg [DQS_WIDTH-1:0]              dlyce_gate,
+   output reg [DQS_WIDTH-1:0]              dlyinc_gate,
+   //(* XIL_PAR_NO_REG_ORDER = "TRUE", XIL_PAR_PATH="Q->u_iodelay_dq_ce.DATAIN", syn_keep = "1", keep = "TRUE"*)
+   output [DQS_WIDTH-1:0]                  en_dqs,
+   output [DQS_WIDTH-1:0]                  rd_data_sel,
+   // Debug signals (optional use)
+   input                                   dbg_idel_up_all,
+   input                                   dbg_idel_down_all,
+   input                                   dbg_idel_up_dq,
+   input                                   dbg_idel_down_dq,
+   input                                   dbg_idel_up_dqs,
+   input                                   dbg_idel_down_dqs,
+   input                                   dbg_idel_up_gate,
+   input                                   dbg_idel_down_gate,
+   input [DQ_BITS-1:0]                     dbg_sel_idel_dq,
+   input                                   dbg_sel_all_idel_dq,
+   input [DQS_BITS:0]                      dbg_sel_idel_dqs,
+   input                                   dbg_sel_all_idel_dqs,
+   input [DQS_BITS:0]                      dbg_sel_idel_gate,
+   input                                   dbg_sel_all_idel_gate,
+   output [3:0]                            dbg_calib_done,
+   output [3:0]                            dbg_calib_err,
+   output [(6*DQ_WIDTH)-1:0]               dbg_calib_dq_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]              dbg_calib_dqs_tap_cnt,
+   output [(6*DQS_WIDTH)-1:0]              dbg_calib_gate_tap_cnt,
+   output [DQS_WIDTH-1:0]                  dbg_calib_rd_data_sel,
+   output [(5*DQS_WIDTH)-1:0]              dbg_calib_rden_dly,
+   output [(5*DQS_WIDTH)-1:0]              dbg_calib_gate_dly
+   );
+
+  // minimum time (in IDELAY taps) for which capture data must be stable for
+  // algorithm to consider
+  localparam MIN_WIN_SIZE = 5;
+  // IDEL_SET_VAL = (# of cycles - 1) to wait after changing IDELAY value
+  // we only have to wait enough for input with new IDELAY value to
+  // propagate through pipeline stages.
+  localparam IDEL_SET_VAL = 3'b111;
+  // # of clock cycles to delay read enable to determine if read data pattern
+  // is correct for stage 3/4 (RDEN, DQS gate) calibration
+  localparam CALIB_RDEN_PIPE_LEN = 31;
+  // translate CAS latency into number of clock cycles for read valid delay
+  // determination. Really only needed for CL = 2.5 (set to 2)
+  localparam CAS_LAT_RDEN = (CAS_LAT == 25) ? 2 : CAS_LAT;
+  // an SRL32 is used to delay CTRL_RDEN to generate read valid signal. This
+  // is min possible value delay through SRL32 can be
+  localparam RDEN_BASE_DELAY = CAS_LAT_RDEN + ADDITIVE_LAT + REG_ENABLE;
+  // an SRL32 is used to delay the CTRL_RDEN from the read postamble DQS
+  // gate. This is min possible value the SRL32 delay can be:
+  //  - Delay from end of deassertion of CTRL_RDEN to last falling edge of
+  //    read burst = 3.5 (CTRL_RDEN -> CAS delay) + 3 (min CAS latency) = 6.5
+  //  - Minimum time for DQS gate circuit to be generated:
+  //      * 1 cyc to register CTRL_RDEN from controller
+  //      * 1 cyc after RDEN_CTRL falling edge
+  //      * 1 cyc min through SRL32
+  //      * 1 cyc through SRL32 output flop
+  //      * 0 (<1) cyc of synchronization to DQS domain via IDELAY
+  //      * 1 cyc of delay through IDDR to generate CE to DQ IDDR's
+  //    Total = 5 cyc < 6.5 cycles
+  //    The total should be less than 5.5 cycles to account prop delays
+  //    adding one cycle to the synchronization time via the IDELAY.
+  //    NOTE: Value differs because of optional pipeline register added
+  //      for case of RDEN_BASE_DELAY > 3 to improve timing
+  localparam GATE_BASE_DELAY = RDEN_BASE_DELAY - 3;
+  localparam GATE_BASE_INIT = (GATE_BASE_DELAY <= 1) ? 0 : GATE_BASE_DELAY;
+  // used for RDEN calibration: difference between shift value used during
+  // calibration, and shift value for actual RDEN SRL. Only applies when
+  // RDEN edge is immediately captured by CLKDIV0. If not (depends on phase
+  // of CLK0 and CLKDIV0 when RDEN is asserted), then add 1 to this value.
+  localparam CAL3_RDEN_SRL_DLY_DELTA = 6;
+  // fix minimum value of DQS to be 1 to handle the case where's there's only
+  // one DQS group. We could also enforce that user always inputs minimum
+  // value of 1 for DQS_BITS (even when DQS_WIDTH=1). Leave this as safeguard
+  // Assume we don't have to do this for DQ, DQ_WIDTH always > 1
+  localparam DQS_BITS_FIX = (DQS_BITS == 0) ? 1 : DQS_BITS;
+  // how many taps to "pre-delay" DQ before stg 1 calibration - not needed for
+  // current calibration, but leave for debug
+  localparam DQ_IDEL_INIT = 6'b000000;
+  // # IDELAY taps per bit time (i.e. half cycle). Limit to 63.
+  localparam integer BIT_TIME_TAPS = (CLK_PERIOD/150 < 64) ?
+             CLK_PERIOD/150 : 63;
+
+  // used in various places during stage 4 cal: (1) determines maximum taps
+  // to increment when finding right edge, (2) amount to decrement after
+  // finding left edge, (3) amount to increment after finding right edge
+  localparam CAL4_IDEL_BIT_VAL = (BIT_TIME_TAPS >= 6'b100000) ?
+             6'b100000 : BIT_TIME_TAPS;
+
+  localparam CAL1_IDLE                   = 4'h0;
+  localparam CAL1_INIT                   = 4'h1;
+  localparam CAL1_INC_IDEL               = 4'h2;
+  localparam CAL1_FIND_FIRST_EDGE        = 4'h3;
+  localparam CAL1_FIRST_EDGE_IDEL_WAIT   = 4'h4;
+  localparam CAL1_FOUND_FIRST_EDGE_WAIT  = 4'h5;
+  localparam CAL1_FIND_SECOND_EDGE       = 4'h6;
+  localparam CAL1_SECOND_EDGE_IDEL_WAIT  = 4'h7;
+  localparam CAL1_CALC_IDEL              = 4'h8;
+  localparam CAL1_DEC_IDEL               = 4'h9;
+  localparam CAL1_DONE                   = 4'hA;
+
+  localparam CAL2_IDLE                    = 4'h0;
+  localparam CAL2_INIT                    = 4'h1;
+  localparam CAL2_INIT_IDEL_WAIT          = 4'h2;
+  localparam CAL2_FIND_EDGE_POS           = 4'h3;
+  localparam CAL2_FIND_EDGE_IDEL_WAIT_POS = 4'h4;
+  localparam CAL2_FIND_EDGE_NEG           = 4'h5;
+  localparam CAL2_FIND_EDGE_IDEL_WAIT_NEG = 4'h6;
+  localparam CAL2_DEC_IDEL                = 4'h7;
+  localparam CAL2_DONE                    = 4'h8;
+
+  localparam CAL3_IDLE                    = 3'h0;
+  localparam CAL3_INIT                    = 3'h1;
+  localparam CAL3_DETECT                  = 3'h2;
+  localparam CAL3_RDEN_PIPE_CLR_WAIT      = 3'h3;
+  localparam CAL3_DONE                    = 3'h4;
+
+  localparam CAL4_IDLE                    = 3'h0;
+  localparam CAL4_INIT                    = 3'h1;
+  localparam CAL4_FIND_WINDOW             = 3'h2;
+  localparam CAL4_FIND_EDGE               = 3'h3;
+  localparam CAL4_IDEL_WAIT               = 3'h4;
+  localparam CAL4_RDEN_PIPE_CLR_WAIT      = 3'h5;
+  localparam CAL4_ADJ_IDEL                = 3'h6;
+  localparam CAL4_DONE                    = 3'h7;
+
+  integer                        i, j;
+
+  reg [5:0]                      cal1_bit_time_tap_cnt;
+  reg [1:0]                      cal1_data_chk_last;
+  reg                            cal1_data_chk_last_valid;
+  reg [1:0]                      cal1_data_chk_r;
+  reg                            cal1_dlyce_dq;
+  reg                            cal1_dlyinc_dq;
+  reg                            cal1_dqs_dq_init_phase;
+  reg                            cal1_detect_edge;
+  reg                            cal1_detect_stable;
+  reg                            cal1_found_second_edge;
+  reg                            cal1_found_rising;
+  reg                            cal1_found_window;
+  reg                            cal1_first_edge_done;
+  reg [5:0]                      cal1_first_edge_tap_cnt;
+  reg [6:0]                      cal1_idel_dec_cnt;
+  reg [5:0]                      cal1_idel_inc_cnt;
+  reg [5:0]                      cal1_idel_max_tap;
+  reg                            cal1_idel_max_tap_we;
+  reg [5:0]                      cal1_idel_tap_cnt;
+  reg                            cal1_idel_tap_limit_hit;
+  reg [6:0]                      cal1_low_freq_idel_dec;
+  reg                            cal1_ref_req;
+  wire                           cal1_refresh;
+  reg [3:0]                      cal1_state;
+  reg [3:0]                      cal1_window_cnt;
+  reg                            cal2_curr_sel;
+  wire                           cal2_detect_edge;
+  reg                            cal2_dlyce_dqs;
+  reg                            cal2_dlyinc_dqs;
+  reg [5:0]                      cal2_idel_dec_cnt;
+  reg [5:0]                      cal2_idel_tap_cnt;
+  reg [5:0]                      cal2_idel_tap_limit;
+  reg                            cal2_idel_tap_limit_hit;
+  reg                            cal2_rd_data_fall_last_neg;
+  reg                            cal2_rd_data_fall_last_pos;
+  reg                            cal2_rd_data_last_valid_neg;
+  reg                            cal2_rd_data_last_valid_pos;
+  reg                            cal2_rd_data_rise_last_neg;
+  reg                            cal2_rd_data_rise_last_pos;
+  reg [DQS_WIDTH-1:0]            cal2_rd_data_sel;
+  wire                           cal2_rd_data_sel_edge;
+  reg [DQS_WIDTH-1:0]            cal2_rd_data_sel_r;
+  reg                            cal2_ref_req;
+  reg [3:0]                      cal2_state;
+  reg                            cal3_data_match;
+  reg                            cal3_data_match_stgd;
+  wire                           cal3_data_valid;
+  wire                           cal3_match_found;
+  wire [4:0]                     cal3_rden_dly;
+  reg [4:0]                      cal3_rden_srl_a;
+  reg [2:0]                      cal3_state;
+  wire                           cal4_data_good;
+  reg                            cal4_data_match;
+  reg                            cal4_data_match_stgd;
+  wire                           cal4_data_valid;
+  reg                            cal4_dlyce_gate;
+  reg                            cal4_dlyinc_gate;
+  reg                            cal4_dlyrst_gate;
+  reg [4:0]                      cal4_gate_srl_a;
+  reg [5:0]                      cal4_idel_adj_cnt;
+  reg                            cal4_idel_adj_inc;
+  reg                            cal4_idel_bit_tap;
+  reg [5:0]                      cal4_idel_tap_cnt;
+  reg                            cal4_idel_max_tap;
+  reg [4:0]                      cal4_rden_srl_a;
+  reg                            cal4_ref_req;
+  reg                            cal4_seek_left;
+  reg                            cal4_stable_window;
+  reg [2:0]                      cal4_state;
+  reg [3:0]                      cal4_window_cnt;
+  reg [3:0]                      calib_done_tmp;         // only for stg1/2/4
+  reg                            calib_ctrl_gate_pulse_r;
+  reg                            calib_ctrl_rden;
+  reg                            calib_ctrl_rden_r;
+  wire                           calib_ctrl_rden_negedge;
+  reg                            calib_ctrl_rden_negedge_r;
+  reg [3:0]                      calib_done_r;
+  reg [3:0]                      calib_err;
+  reg [1:0]                      calib_err_2;
+  wire                           calib_init_gate_pulse;
+  reg                            calib_init_gate_pulse_r;
+  reg                            calib_init_gate_pulse_r1;
+  reg                            calib_init_rden;
+  reg                            calib_init_rden_r;
+  reg [4:0]                      calib_rden_srl_a;
+  wire [4:0]                     calib_rden_srl_a_r;
+  reg [(5*DQS_WIDTH)-1:0]        calib_rden_dly;
+  reg                            calib_rden_edge_r;
+  reg [4:0]                      calib_rden_pipe_cnt;
+  wire                           calib_rden_srl_out;
+  wire                           calib_rden_srl_out_r;
+  reg                            calib_rden_srl_out_r1;
+  reg                            calib_rden_valid;
+  reg                            calib_rden_valid_stgd;
+  reg [DQ_BITS-1:0]              count_dq;
+  reg [DQS_BITS_FIX-1:0]         count_dqs;
+  reg [DQS_BITS_FIX-1:0]         count_gate;
+  reg [DQS_BITS_FIX-1:0]         count_rden;
+  reg                            ctrl_rden_r;
+  wire                           dlyce_or;
+  reg [(5*DQS_WIDTH)-1:0]        gate_dly;
+  wire [(5*DQS_WIDTH)-1:0]       gate_dly_r;
+  wire                           gate_srl_in;
+  wire [DQS_WIDTH-1:0]           gate_srl_out;
+  wire [DQS_WIDTH-1:0]           gate_srl_out_r;
+  reg [2:0]                      idel_set_cnt;
+  wire                           idel_set_wait;
+  reg [DQ_BITS-1:0]              next_count_dq;
+  reg [DQS_BITS_FIX-1:0]         next_count_dqs;
+  reg [DQS_BITS_FIX-1:0]         next_count_gate;
+  reg                            phy_init_rden_r;
+  reg                            phy_init_rden_r1;
+  reg [DQS_WIDTH-1:0]            rd_data_fall_1x_bit1_r1;  
+  reg [DQ_WIDTH-1:0]             rd_data_fall_1x_r;
+  reg [DQS_WIDTH-1:0]            rd_data_fall_1x_r1;
+  reg [DQS_WIDTH-1:0]            rd_data_fall_2x_bit1_r;
+  reg [DQS_WIDTH-1:0]            rd_data_fall_2x_r;
+  wire [DQS_WIDTH-1:0]           rd_data_fall_chk_q1;
+  wire [DQS_WIDTH-1:0]           rd_data_fall_chk_q1_bit1;
+  wire [DQS_WIDTH-1:0]           rd_data_fall_chk_q2;
+  wire [DQS_WIDTH-1:0]           rd_data_fall_chk_q2_bit1;  
+  reg [DQS_WIDTH-1:0]            rd_data_rise_1x_bit1_r1;
+  reg [DQ_WIDTH-1:0]             rd_data_rise_1x_r;
+  reg [DQS_WIDTH-1:0]            rd_data_rise_1x_r1;
+  reg [DQS_WIDTH-1:0]            rd_data_rise_2x_bit1_r;
+  reg [DQS_WIDTH-1:0]            rd_data_rise_2x_r;
+  wire [DQS_WIDTH-1:0]           rd_data_rise_chk_q1;
+  wire [DQS_WIDTH-1:0]           rd_data_rise_chk_q1_bit1;  
+  wire [DQS_WIDTH-1:0]           rd_data_rise_chk_q2;
+  wire [DQS_WIDTH-1:0]           rd_data_rise_chk_q2_bit1;  
+  reg                            rdd_fall_q1;
+  reg                            rdd_fall_q1_bit1;
+  reg                            rdd_fall_q1_bit1_r;  
+  reg                            rdd_fall_q1_bit1_r1;  
+  reg                            rdd_fall_q1_r;
+  reg                            rdd_fall_q1_r1;
+  reg                            rdd_fall_q2;
+  reg                            rdd_fall_q2_bit1;  
+  reg                            rdd_fall_q2_bit1_r;  
+  reg                            rdd_fall_q2_r;
+  reg                            rdd_rise_q1;
+  reg                            rdd_rise_q1_bit1; 
+  reg                            rdd_rise_q1_bit1_r;  
+  reg                            rdd_rise_q1_bit1_r1;  
+  reg                            rdd_rise_q1_r;
+  reg                            rdd_rise_q1_r1;
+  reg                            rdd_rise_q2;
+  reg                            rdd_rise_q2_bit1;  
+  reg                            rdd_rise_q2_bit1_r;  
+  reg                            rdd_rise_q2_r;
+  reg [DQS_BITS_FIX-1:0]         rdd_mux_sel;
+  reg                            rden_dec;
+  reg [(5*DQS_WIDTH)-1:0]        rden_dly;
+  wire [(5*DQS_WIDTH)-1:0]       rden_dly_r;
+  reg [4:0]                      rden_dly_0;
+  reg                            rden_inc;
+  reg [DQS_WIDTH-1:0]            rden_mux;
+  wire [DQS_WIDTH-1:0]           rden_srl_out;
+
+  // Debug
+  integer                        x;
+  reg [5:0]                      dbg_dq_tap_cnt [DQ_WIDTH-1:0];
+  reg [5:0]                      dbg_dqs_tap_cnt [DQS_WIDTH-1:0];
+  reg [5:0]                      dbg_gate_tap_cnt [DQS_WIDTH-1:0];
+
+  //***************************************************************************
+  // Debug output ("dbg_phy_calib_*")
+  // NOTES:
+  //  1. All debug outputs coming out of PHY_CALIB are clocked off CLKDIV0,
+  //     although they are also static after calibration is complete. This
+  //     means the user can either connect them to a Chipscope ILA, or to
+  //     either a sync/async VIO input block. Using an async VIO has the
+  //     advantage of not requiring these paths to meet cycle-to-cycle timing.
+  //  2. The widths of most of these debug buses are dependent on the # of
+  //     DQS/DQ bits (e.g. dq_tap_cnt width = 6 * (# of DQ bits)
+  // SIGNAL DESCRIPTION:
+  //  1. calib_done:   4 bits - each one asserted as each phase of calibration
+  //                   is completed.
+  //  2. calib_err:    4 bits - each one asserted when a calibration error
+  //                   encountered for that stage. Some of these bits may not
+  //                   be used (not all cal stages report an error).
+  //  3. dq_tap_cnt:   final IDELAY tap counts for all DQ IDELAYs
+  //  4. dqs_tap_cnt:  final IDELAY tap counts for all DQS IDELAYs
+  //  5. gate_tap_cnt: final IDELAY tap counts for all DQS gate
+  //                   synchronization IDELAYs
+  //  6. rd_data_sel:  final read capture MUX (either "positive" or "negative"
+  //                   edge capture) settings for all DQS groups
+  //  7. rden_dly:     related to # of cycles after issuing a read until when
+  //                   read data is valid - for all DQS groups
+  //  8. gate_dly:     related to # of cycles after issuing a read until when
+  //                   clock enable for all DQ's is deasserted to prevent
+  //                   effect of DQS postamble glitch - for all DQS groups
+  //***************************************************************************
+
+  //*****************************************************************
+  // Record IDELAY tap values by "snooping" IDELAY control signals
+  //*****************************************************************
+
+  // record DQ IDELAY tap values
+  genvar dbg_dq_tc_i;
+  generate
+    for (dbg_dq_tc_i = 0; dbg_dq_tc_i < DQ_WIDTH;
+         dbg_dq_tc_i = dbg_dq_tc_i + 1) begin: gen_dbg_dq_tap_cnt
+      assign dbg_calib_dq_tap_cnt[(6*dbg_dq_tc_i)+5:(6*dbg_dq_tc_i)]
+               = dbg_dq_tap_cnt[dbg_dq_tc_i];
+      always @(posedge clkdiv)
+        if (rstdiv | dlyrst_dq)
+          dbg_dq_tap_cnt[dbg_dq_tc_i] <= 6'b000000;
+        else
+          if (dlyce_dq[dbg_dq_tc_i])
+            if (dlyinc_dq[dbg_dq_tc_i])
+              dbg_dq_tap_cnt[dbg_dq_tc_i]
+                <= dbg_dq_tap_cnt[dbg_dq_tc_i] + 1;
+            else
+              dbg_dq_tap_cnt[dbg_dq_tc_i]
+                <= dbg_dq_tap_cnt[dbg_dq_tc_i] - 1;
+    end
+  endgenerate
+
+  // record DQS IDELAY tap values
+  genvar dbg_dqs_tc_i;
+  generate
+    for (dbg_dqs_tc_i = 0; dbg_dqs_tc_i < DQS_WIDTH;
+         dbg_dqs_tc_i = dbg_dqs_tc_i + 1) begin: gen_dbg_dqs_tap_cnt
+      assign dbg_calib_dqs_tap_cnt[(6*dbg_dqs_tc_i)+5:(6*dbg_dqs_tc_i)]
+               = dbg_dqs_tap_cnt[dbg_dqs_tc_i];
+      always @(posedge clkdiv)
+        if (rstdiv | dlyrst_dqs)
+          dbg_dqs_tap_cnt[dbg_dqs_tc_i] <= 6'b000000;
+        else
+          if (dlyce_dqs[dbg_dqs_tc_i])
+            if (dlyinc_dqs[dbg_dqs_tc_i])
+              dbg_dqs_tap_cnt[dbg_dqs_tc_i]
+                <= dbg_dqs_tap_cnt[dbg_dqs_tc_i] + 1;
+            else
+              dbg_dqs_tap_cnt[dbg_dqs_tc_i]
+                <= dbg_dqs_tap_cnt[dbg_dqs_tc_i] - 1;
+    end
+  endgenerate
+
+  // record DQS gate IDELAY tap values
+  genvar dbg_gate_tc_i;
+  generate
+    for (dbg_gate_tc_i = 0; dbg_gate_tc_i < DQS_WIDTH;
+         dbg_gate_tc_i = dbg_gate_tc_i + 1) begin: gen_dbg_gate_tap_cnt
+      assign dbg_calib_gate_tap_cnt[(6*dbg_gate_tc_i)+5:(6*dbg_gate_tc_i)]
+               = dbg_gate_tap_cnt[dbg_gate_tc_i];
+      always @(posedge clkdiv)
+        if (rstdiv | dlyrst_gate[dbg_gate_tc_i])
+          dbg_gate_tap_cnt[dbg_gate_tc_i] <= 6'b000000;
+        else
+          if (dlyce_gate[dbg_gate_tc_i])
+            if (dlyinc_gate[dbg_gate_tc_i])
+              dbg_gate_tap_cnt[dbg_gate_tc_i]
+                <= dbg_gate_tap_cnt[dbg_gate_tc_i] + 1;
+            else
+              dbg_gate_tap_cnt[dbg_gate_tc_i]
+                <= dbg_gate_tap_cnt[dbg_gate_tc_i] - 1;
+    end
+  endgenerate
+
+  assign dbg_calib_done        = calib_done;
+  assign dbg_calib_err         = calib_err;
+  assign dbg_calib_rd_data_sel = cal2_rd_data_sel;
+  assign dbg_calib_rden_dly    = rden_dly;
+  assign dbg_calib_gate_dly    = gate_dly;
+
+  //***************************************************************************
+  // Read data pipelining, and read data "ISERDES" data width expansion
+  //***************************************************************************
+
+  // For all data bits, register incoming capture data to slow clock to improve
+  // timing. Adding single pipeline stage does not affect functionality (as
+  // long as we make sure to wait extra clock cycle after changing DQ IDELAY)
+  // Also note in this case that we're "missing" every other clock cycle's
+  // worth of data capture since we're sync'ing to the slow clock. This is
+  // fine for stage 1 and stage 2 cal, but not for stage 3 and 4 (see below
+  // for different circuit to handle those stages)
+  always @(posedge clkdiv) begin
+    rd_data_rise_1x_r <= rd_data_rise;
+    rd_data_fall_1x_r <= rd_data_fall;
+  end
+
+  // For every DQ_PER_DQS bit, generate what is essentially a ISERDES-type
+  // data width expander. Will need this for stage 3 and 4 cal, where we need
+  // to compare data over consecutive clock cycles. We can also use this for
+  // stage 2 as well (stage 2 doesn't require every bit to be looked at, only
+  // one bit per DQS group)
+  // MIG 3.3: Expand to use lower two bits of each DQS group - use for stage
+  //  3 calibration for added robustness, since we will be checking for the
+  //  training pattern from the memory even when the data bus is 3-stated.
+  //  Theoretically it is possible for whatever garbage data is on the bus
+  //  to be interpreted as the training sequence, although this can be made
+  //  very unlikely by the choice of training sequence (bit sequence, length)
+  //  and the number of bits compared for each DQS group. 
+  genvar rdd_i;
+  generate
+    for (rdd_i = 0; rdd_i < DQS_WIDTH; rdd_i = rdd_i + 1) begin: gen_rdd
+      // first stage: keep data in fast clk domain. Store data over two
+      // consecutive clock cycles for rise/fall data for proper transfer
+      // to slow clock domain
+      always @(posedge clk) begin
+        rd_data_rise_2x_r[rdd_i]      <= rd_data_rise[(rdd_i*DQ_PER_DQS)];
+        rd_data_fall_2x_r[rdd_i]      <= rd_data_fall[(rdd_i*DQ_PER_DQS)];
+        rd_data_rise_2x_bit1_r[rdd_i] <= rd_data_rise[(rdd_i*DQ_PER_DQS)+1];
+        rd_data_fall_2x_bit1_r[rdd_i] <= rd_data_fall[(rdd_i*DQ_PER_DQS)+1];
+      end
+      // second stage, register first stage to slow clock domain, 2nd stage
+      // consists of both these flops, and the rd_data_rise_1x_r flops
+      always @(posedge clkdiv) begin
+        rd_data_rise_1x_r1[rdd_i]      <= rd_data_rise_2x_r[rdd_i];
+        rd_data_fall_1x_r1[rdd_i]      <= rd_data_fall_2x_r[rdd_i];
+        rd_data_rise_1x_bit1_r1[rdd_i] <= rd_data_rise_2x_bit1_r[rdd_i];
+        rd_data_fall_1x_bit1_r1[rdd_i] <= rd_data_fall_2x_bit1_r[rdd_i];
+      end
+      // now we have four outputs - representing rise/fall outputs over last
+      // 2 fast clock cycles. However, the ordering these represent can either
+      // be: (1) Q2 = data @ time = n, Q1 = data @ time = n+1, or (2)
+      // Q2 = data @ time = n - 1, Q1 = data @ time = n (and data at [Q1,Q2]
+      // is "staggered") - leave it up to the stage of calibration using this
+      // to figure out which is which, if they care at all (e.g. stage 2 cal
+      // doesn't care about the ordering)
+      assign rd_data_rise_chk_q1[rdd_i]
+               = rd_data_rise_1x_r[(rdd_i*DQ_PER_DQS)];
+      assign rd_data_rise_chk_q2[rdd_i]
+               = rd_data_rise_1x_r1[rdd_i];
+      assign rd_data_fall_chk_q1[rdd_i]
+               = rd_data_fall_1x_r[(rdd_i*DQ_PER_DQS)];
+      assign rd_data_fall_chk_q2[rdd_i]
+               = rd_data_fall_1x_r1[rdd_i];
+    // MIG 3.3: Added comparison for second bit in DQS group for stage 3 cal
+      assign rd_data_rise_chk_q1_bit1[rdd_i]
+               = rd_data_rise_1x_r[(rdd_i*DQ_PER_DQS)+1];
+      assign rd_data_rise_chk_q2_bit1[rdd_i]
+               = rd_data_rise_1x_bit1_r1[rdd_i];
+      assign rd_data_fall_chk_q1_bit1[rdd_i]
+               = rd_data_fall_1x_r[(rdd_i*DQ_PER_DQS)+1];
+      assign rd_data_fall_chk_q2_bit1[rdd_i]
+               = rd_data_fall_1x_bit1_r1[rdd_i];
+    end
+  endgenerate
+
+  //*****************************************************************
+  // Outputs of these simplified ISERDES circuits then feed MUXes based on
+  // which DQ the current calibration algorithm needs to look at
+  //*****************************************************************
+
+  // generate MUX control; assume that adding an extra pipeline stage isn't
+  // an issue - whatever stage cal logic is using output of MUX will wait
+  // enough time after changing it
+  always @(posedge clkdiv) begin
+    (* full_case, parallel_case *) case (calib_done[2:0])
+      3'b001: rdd_mux_sel <= next_count_dqs;
+      3'b011: rdd_mux_sel <= count_rden;
+      3'b111: rdd_mux_sel <= next_count_gate;
+      default: rdd_mux_sel <= {DQS_BITS_FIX{1'bx}};
+    endcase
+  end
+
+  always @(posedge clkdiv) begin
+    rdd_rise_q1 <= rd_data_rise_chk_q1[rdd_mux_sel];
+    rdd_rise_q2 <= rd_data_rise_chk_q2[rdd_mux_sel];
+    rdd_fall_q1 <= rd_data_fall_chk_q1[rdd_mux_sel];
+    rdd_fall_q2 <= rd_data_fall_chk_q2[rdd_mux_sel];
+    rdd_rise_q1_bit1 <= rd_data_rise_chk_q1_bit1[rdd_mux_sel];
+    rdd_rise_q2_bit1 <= rd_data_rise_chk_q2_bit1[rdd_mux_sel];
+    rdd_fall_q1_bit1 <= rd_data_fall_chk_q1_bit1[rdd_mux_sel];
+    rdd_fall_q2_bit1 <= rd_data_fall_chk_q2_bit1[rdd_mux_sel];    
+  end
+
+  //***************************************************************************
+  // Demultiplexor to control (reset, increment, decrement) IDELAY tap values
+  //   For DQ:
+  //     STG1: for per-bit-deskew, only inc/dec the current DQ. For non-per
+  //       deskew, increment all bits in the current DQS set
+  //     STG2: inc/dec all DQ's in the current DQS set.
+  // NOTE: Nice to add some error checking logic here (or elsewhere in the
+  //       code) to check if logic attempts to overflow tap value
+  //***************************************************************************
+
+  // don't use DLYRST to reset value of IDELAY after reset. Need to change this
+  // if we want to allow user to recalibrate after initial reset
+  always @(posedge clkdiv)
+    if (rstdiv) begin
+      dlyrst_dq <= 1'b1;
+      dlyrst_dqs <= 1'b1;
+    end else begin
+      dlyrst_dq <= 1'b0;
+      dlyrst_dqs <= 1'b0;
+    end
+
+  always @(posedge clkdiv) begin
+    if (rstdiv) begin
+      dlyce_dq   <= 'b0;
+      dlyinc_dq  <= 'b0;
+      dlyce_dqs  <= 'b0;
+      dlyinc_dqs <= 'b0;
+    end else begin
+      dlyce_dq   <= 'b0;
+      dlyinc_dq  <= 'b0;
+      dlyce_dqs  <= 'b0;
+      dlyinc_dqs <= 'b0;
+
+      // stage 1 cal: change only specified DQ
+      if (cal1_dlyce_dq) begin
+        if (SIM_ONLY == 0) begin
+          dlyce_dq[count_dq] <= 1'b1;
+          dlyinc_dq[count_dq] <= cal1_dlyinc_dq;
+        end else begin
+          // if simulation, then calibrate only first DQ, apply results
+          // to all DQs (i.e. assume delay on all DQs is the same)
+          for (i = 0; i < DQ_WIDTH; i = i + 1) begin: loop_sim_dq_dly
+            dlyce_dq[i] <= 1'b1;
+            dlyinc_dq[i] <= cal1_dlyinc_dq;
+          end
+        end
+      end else if (cal2_dlyce_dqs) begin
+        // stage 2 cal: change DQS and all corresponding DQ's
+        if (SIM_ONLY == 0) begin
+          dlyce_dqs[count_dqs] <= 1'b1;
+          dlyinc_dqs[count_dqs] <= cal2_dlyinc_dqs;
+          for (i = 0; i < DQ_PER_DQS; i = i + 1) begin: loop_dqs_dly
+            dlyce_dq[(DQ_PER_DQS*count_dqs)+i] <= 1'b1;
+            dlyinc_dq[(DQ_PER_DQS*count_dqs)+i] <= cal2_dlyinc_dqs;
+          end
+        end else begin
+          for (i = 0; i < DQS_WIDTH; i = i + 1) begin: loop_sim_dqs_dly
+            // if simulation, then calibrate only first DQS
+            dlyce_dqs[i] <= 1'b1;
+            dlyinc_dqs[i] <= cal2_dlyinc_dqs;
+            for (j = 0; j < DQ_PER_DQS; j = j + 1) begin: loop_sim_dq_dqs_dly
+              dlyce_dq[(DQ_PER_DQS*i)+j] <= 1'b1;
+              dlyinc_dq[(DQ_PER_DQS*i)+j] <= cal2_dlyinc_dqs;
+            end
+          end
+        end
+      end else if (DEBUG_EN != 0) begin
+        // DEBUG: allow user to vary IDELAY tap settings
+        // For DQ IDELAY taps
+        if (dbg_idel_up_all || dbg_idel_down_all ||
+            dbg_sel_all_idel_dq) begin
+          for (x = 0; x < DQ_WIDTH; x = x + 1) begin: loop_dly_inc_dq
+            dlyce_dq[x] <= dbg_idel_up_all | dbg_idel_down_all |
+                           dbg_idel_up_dq  | dbg_idel_down_dq;
+            dlyinc_dq[x] <= dbg_idel_up_all | dbg_idel_up_dq;
+          end
+        end else begin
+          dlyce_dq <= 'b0;
+          dlyce_dq[dbg_sel_idel_dq] <= dbg_idel_up_dq |
+                                       dbg_idel_down_dq;
+          dlyinc_dq[dbg_sel_idel_dq] <= dbg_idel_up_dq;
+        end
+        // For DQS IDELAY taps
+        if (dbg_idel_up_all || dbg_idel_down_all ||
+            dbg_sel_all_idel_dqs) begin
+          for (x = 0; x < DQS_WIDTH; x = x + 1) begin: loop_dly_inc_dqs
+            dlyce_dqs[x] <= dbg_idel_up_all | dbg_idel_down_all |
+                            dbg_idel_up_dqs | dbg_idel_down_dqs;
+            dlyinc_dqs[x] <= dbg_idel_up_all | dbg_idel_up_dqs;
+          end
+        end else begin
+          dlyce_dqs <= 'b0;
+          dlyce_dqs[dbg_sel_idel_dqs] <= dbg_idel_up_dqs |
+                                         dbg_idel_down_dqs;
+          dlyinc_dqs[dbg_sel_idel_dqs] <= dbg_idel_up_dqs;
+        end
+      end
+    end
+  end
+
+  // GATE synchronization is handled directly by Stage 4 calibration FSM
+  always @(posedge clkdiv)
+    if (rstdiv) begin
+      dlyrst_gate <= {DQS_WIDTH{1'b1}};
+      dlyce_gate  <= {DQS_WIDTH{1'b0}};
+      dlyinc_gate <= {DQS_WIDTH{1'b0}};
+    end else begin
+      dlyrst_gate <= {DQS_WIDTH{1'b0}};
+      dlyce_gate  <= {DQS_WIDTH{1'b0}};
+      dlyinc_gate <= {DQS_WIDTH{1'b0}};
+
+      if (cal4_dlyrst_gate) begin
+        if (SIM_ONLY == 0)
+          dlyrst_gate[count_gate] <= 1'b1;
+        else
+          for (i = 0; i < DQS_WIDTH; i = i + 1) begin: loop_gate_sim_dly_rst
+            dlyrst_gate[i] <= 1'b1;
+          end
+      end
+
+      if (cal4_dlyce_gate) begin
+        if (SIM_ONLY == 0) begin
+          dlyce_gate[count_gate]  <= 1'b1;
+          dlyinc_gate[count_gate] <= cal4_dlyinc_gate;
+        end else begin
+          // if simulation, then calibrate only first gate
+          for (i = 0; i < DQS_WIDTH; i = i + 1) begin: loop_gate_sim_dly
+            dlyce_gate[i]  <= 1'b1;
+            dlyinc_gate[i] <= cal4_dlyinc_gate;
+          end
+        end
+      end else if (DEBUG_EN != 0) begin
+        // DEBUG: allow user to vary IDELAY tap settings
+        if (dbg_idel_up_all || dbg_idel_down_all ||
+            dbg_sel_all_idel_gate) begin
+          for (x = 0; x < DQS_WIDTH; x = x + 1) begin: loop_dly_inc_gate
+            dlyce_gate[x] <= dbg_idel_up_all | dbg_idel_down_all |
+                             dbg_idel_up_gate | dbg_idel_down_gate;
+            dlyinc_gate[x] <= dbg_idel_up_all | dbg_idel_up_gate;
+          end
+        end else begin
+          dlyce_gate <= {DQS_WIDTH{1'b0}};
+          dlyce_gate[dbg_sel_idel_gate] <= dbg_idel_up_gate |
+                                           dbg_idel_down_gate;
+          dlyinc_gate[dbg_sel_idel_gate] <= dbg_idel_up_gate;
+        end
+      end
+    end
+
+  //***************************************************************************
+  // signal to tell calibration state machines to wait and give IDELAY time to
+  // settle after it's value is changed (both time for IDELAY chain to settle,
+  // and for settled output to propagate through ISERDES). For general use: use
+  // for any calibration state machines that modify any IDELAY.
+  // Should give at least enough time for IDELAY output to settle (technically
+  // for V5, this should be "glitchless" when IDELAY taps are changed, so don't
+  // need any time here), and also time for new data to propagate through both
+  // ISERDES and the "RDD" MUX + associated pipelining
+  // For now, give very "generous" delay - doesn't really matter since only
+  // needed during calibration
+  //***************************************************************************
+
+  // determine if calibration polarity has changed
+  always @(posedge clkdiv)
+    cal2_rd_data_sel_r   <= cal2_rd_data_sel;
+
+  assign cal2_rd_data_sel_edge = |(cal2_rd_data_sel ^ cal2_rd_data_sel_r);
+
+  // combine requests to modify any of the IDELAYs into one. Also when second
+  // stage capture "edge" polarity is changed (IDELAY isn't changed in this
+  // case, but use the same counter to stall cal logic)
+  assign dlyce_or = cal1_dlyce_dq |
+                    cal2_dlyce_dqs |
+                    cal2_rd_data_sel_edge |
+                    cal4_dlyce_gate |
+                    cal4_dlyrst_gate;
+
+  // SYN_NOTE: Can later recode to avoid combinational path
+  assign idel_set_wait = dlyce_or || (idel_set_cnt != IDEL_SET_VAL);
+
+  always @(posedge clkdiv)
+    if (rstdiv)
+      idel_set_cnt <= 4'b0000;
+    else if (dlyce_or)
+      idel_set_cnt <= 4'b0000;
+    else if (idel_set_cnt != IDEL_SET_VAL)
+      idel_set_cnt <= idel_set_cnt + 1;
+
+  // generate request to PHY_INIT logic to issue auto-refresh
+  // used by certain states to force prech/auto-refresh part way through
+  // calibration to avoid a tRAS violation (which will happen if that
+  // stage of calibration lasts long enough). This signal must meet the
+  // following requirements: (1) only transition from 0->1 when the refresh
+  // request is needed, (2) stay at 1 and only transition 1->0 when
+  // CALIB_REF_DONE is asserted
+  always @(posedge clkdiv)
+    if (rstdiv)
+      calib_ref_req <= 1'b0;
+    else
+      calib_ref_req <= cal1_ref_req | cal2_ref_req  | cal4_ref_req;
+
+  // stage 1 calibration requests auto-refresh every 4 bits
+  generate
+    if (DQ_BITS < 2) begin: gen_cal1_refresh_dq_lte4
+      assign cal1_refresh = 1'b0;
+    end else begin: gen_cal1_refresh_dq_gt4
+      assign cal1_refresh = (next_count_dq[1:0] == 2'b00);
+    end
+  endgenerate
+
+  //***************************************************************************
+  // First stage calibration: DQ-DQS
+  // Definitions:
+  //  edge: detected when varying IDELAY, and current capture data != prev
+  //    capture data
+  //  valid bit window: detected when current capture data == prev capture
+  //    data for more than half the bit time
+  //  starting conditions for DQS-DQ phase:
+  //    case 1: when DQS starts somewhere in rising edge bit window, or
+  //      on the right edge of the rising bit window.
+  //    case 2: when DQS starts somewhere in falling edge bit window, or
+  //      on the right edge of the falling bit window.
+  // Algorithm Description:
+  //  1. Increment DQ IDELAY until we find an edge.
+  //  2. While we're finding the first edge, note whether a valid bit window
+  //     has been detected before we found an edge. If so, then figure out if
+  //     this is the rising or falling bit window. If rising, then our starting
+  //     DQS-DQ phase is case 1. If falling, then it's case 2. If don't detect
+  //     a valid bit window, then we must have started on the edge of a window.
+  //     Need to wait until later on to decide which case we are.
+  //       - Store FIRST_EDGE IDELAY value
+  //  3. Now look for second edge.
+  //  4. While we're finding the second edge, note whether valid bit window
+  //     is detected. If so, then use to, along with results from (2) to figure
+  //     out what the starting case is. If in rising bit window, then we're in
+  //     case 2. If falling, then case 1.
+  //       - Store SECOND_EDGE IDELAY value
+  //     NOTES:
+  //       a. Finding two edges allows us to calculate the bit time (although
+  //          not the "same" bit time polarity - need to investigate this
+  //          more).
+  //       b. If we run out of taps looking for the second edge, then the bit
+  //       time must be too long (>= 2.5ns, and DQS-DQ starting phase must be
+  //       case 1).
+  //  5. Calculate absolute amount to delay DQ as:
+  //       If second edge found, and case 1:
+  //         - DQ_IDELAY = FIRST_EDGE - 0.5*(SECOND_EDGE - FIRST_EDGE)
+  //       If second edge found, and case 2:
+  //         - DQ_IDELAY = SECOND_EDGE - 0.5*(SECOND_EDGE - FIRST_EDGE)
+  //       If second edge not found, then need to make an approximation on
+  //       how much to shift by (should be okay, because we have more timing
+  //       margin):
+  //         - DQ_IDELAY = FIRST_EDGE - 0.5 * (bit_time)
+  //     NOTE: Does this account for either case 1 or case 2?????
+  //     NOTE: It's also possible even when we find the second edge, that
+  //           to instead just use half the bit time to subtract from either
+  //           FIRST or SECOND_EDGE. Finding the actual bit time (which is
+  //           what (SECOND_EDGE - FIRST_EDGE) is, is slightly more accurate,
+  //           since it takes into account duty cycle distortion.
+  //  6. Repeat for each DQ in current DQS set.
+  //***************************************************************************
+
+  //*****************************************************************
+  // for first stage calibration - used for checking if DQS is aligned to the
+  // particular DQ, such that we're in the data valid window. Basically, this
+  // is one giant MUX.
+  //  = [falling data, rising data]
+  //  = [0, 1] = rising DQS aligned in proper (rising edge) bit window
+  //  = [1, 0] = rising DQS aligned in wrong (falling edge) bit window
+  //  = [0, 0], or [1,1] = in uncertain region between windows
+  //*****************************************************************
+
+  // SYN_NOTE: May have to split this up into multiple levels - MUX can get
+  //  very wide - as wide as the data bus width
+  always @(posedge clkdiv)
+    cal1_data_chk_r <= {rd_data_fall_1x_r[next_count_dq],
+                       rd_data_rise_1x_r[next_count_dq]};
+
+  //*****************************************************************
+  // determine when an edge has occurred - when either the current value
+  // is different from the previous latched value or when the DATA_CHK
+  // outputs are the same (rare, but indicates that we're at an edge)
+  // This is only valid when the IDELAY output and propagation of the
+  // data through the capture flops has had a chance to settle out.
+  //*****************************************************************
+
+  // write CAL1_DETECT_EDGE and CAL1_DETECT_STABLE in such a way that
+  // if X's are captured on the bus during functional simulation, that
+  // the logic will register this as an edge detected. Do this to allow
+  // use of this HDL with Denali memory models (Denali models drive DQ
+  // to X's on both edges of the data valid window to simulate jitter)
+  // This is only done for functional simulation purposes. **Should not**
+  // make the final synthesized logic more complicated, but it does make
+  // the HDL harder to understand b/c we have to "phrase" the logic
+  // slightly differently than when not worrying about X's
+  always @(*) begin
+    // no edge found if: (1) we have recorded prev edge, and rise
+    // data == fall data, (2) we haven't yet recorded prev edge, but
+    // rise/fall data is equal to either [0,1] or [1,0] (i.e. rise/fall
+    // data isn't either X's, or [0,0] or [1,1], which indicates we're
+    // in the middle of an edge, since normally rise != fall data for stg1)
+    if ((cal1_data_chk_last_valid &&
+         (cal1_data_chk_r == cal1_data_chk_last)) ||
+        (!cal1_data_chk_last_valid &&
+         ((cal1_data_chk_r == 2'b01) || (cal1_data_chk_r == 2'b10))))
+      cal1_detect_edge = 1'b0;
+    else
+      cal1_detect_edge = 1'b1;
+  end
+
+  always @(*) begin
+    // assert if we've found a region where data valid window is stable
+    // over consecutive IDELAY taps, and either rise/fall = [1,0], or [0,1]
+    if ((cal1_data_chk_last_valid &&
+         (cal1_data_chk_r == cal1_data_chk_last)) &&
+        ((cal1_data_chk_r == 2'b01) || (cal1_data_chk_r == 2'b10)))
+      cal1_detect_stable = 1'b1;
+    else
+      cal1_detect_stable = 1'b0;
+  end
+
+  //*****************************************************************
+  // Find valid window: keep track of how long we've been in the same data
+  // window. If it's been long enough, then declare that we've found a valid
+  // window. Also returns whether we found a rising or falling window (only
+  // valid when found_window is asserted)
+  //*****************************************************************
+
+  always @(posedge clkdiv) begin
+    if (cal1_state == CAL1_INIT) begin
+      cal1_window_cnt   <= 4'b0000;
+      cal1_found_window <= 1'b0;
+      cal1_found_rising <= 1'bx;
+    end else if (!cal1_data_chk_last_valid) begin
+      // if we haven't stored a previous value of CAL1_DATA_CHK (or it got
+      // invalidated because we detected an edge, and are now looking for the
+      // second edge), then make sure FOUND_WINDOW deasserted on following
+      // clock edge (to avoid finding a false window immediately after finding
+      // an edge). Note that because of jitter, it's possible to not find an
+      // edge at the end of the IDELAY increment settling time, but to find an
+      // edge on the next clock cycle (e.g. during CAL1_FIND_FIRST_EDGE)
+      cal1_window_cnt   <= 4'b0000;
+      cal1_found_window <= 1'b0;
+      cal1_found_rising <= 1'bx;
+    end else if (((cal1_state == CAL1_FIRST_EDGE_IDEL_WAIT) ||
+                  (cal1_state == CAL1_SECOND_EDGE_IDEL_WAIT)) &&
+                 !idel_set_wait) begin
+      // while finding the first and second edges, see if we can detect a
+      // stable bit window (occurs over MIN_WIN_SIZE number of taps). If
+      // so, then we're away from an edge, and can conclusively determine the
+      // starting DQS-DQ phase.
+      if (cal1_detect_stable) begin
+        cal1_window_cnt <= cal1_window_cnt + 1;
+        if (cal1_window_cnt == MIN_WIN_SIZE-1) begin
+          cal1_found_window <= 1'b1;
+          if (cal1_data_chk_r == 2'b01)
+            cal1_found_rising <= 1'b1;
+          else
+            cal1_found_rising <= 1'b0;
+        end
+      end else begin
+        // otherwise, we're not in a data valid window, reset the window
+        // counter, and indicate we're not currently in window. This should
+        // happen by design at least once after finding the first edge.
+        cal1_window_cnt <= 4'b0000;
+        cal1_found_window <= 1'b0;
+        cal1_found_rising <= 1'bx;
+      end
+    end
+  end
+
+  //*****************************************************************
+  // keep track of edge tap counts found, and whether we've
+  // incremented to the maximum number of taps allowed
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    if (cal1_state == CAL1_INIT) begin
+      cal1_idel_tap_limit_hit   <= 1'b0;
+      cal1_idel_tap_cnt   <= 6'b000000;
+    end else if (cal1_dlyce_dq) begin
+      if (cal1_dlyinc_dq) begin
+        cal1_idel_tap_cnt <= cal1_idel_tap_cnt + 1;
+        cal1_idel_tap_limit_hit <= (cal1_idel_tap_cnt == 6'b111110);
+      end else begin
+        cal1_idel_tap_cnt <= cal1_idel_tap_cnt - 1;
+        cal1_idel_tap_limit_hit <= 1'b0;
+      end
+    end
+
+  //*****************************************************************
+  // Pipeline for better timing - amount to decrement by if second
+  // edge not found
+  //*****************************************************************
+  // if only one edge found (possible for low frequencies), then:
+  //  1. Assume starting DQS-DQ phase has DQS in DQ window (aka "case 1")
+  //  2. We have to decrement by (63 - first_edge_tap_cnt) + (BIT_TIME_TAPS/2)
+  //     (i.e. decrement by 63-first_edge_tap_cnt to get to right edge of
+  //     DQ window. Then decrement again by (BIT_TIME_TAPS/2) to get to center
+  //     of DQ window.
+  //  3. Clamp the above value at 63 to ensure we don't underflow IDELAY
+  //     (note: clamping happens in the CAL1 state machine)
+  always @(posedge clkdiv)
+    cal1_low_freq_idel_dec
+      <= (7'b0111111 - {1'b0, cal1_first_edge_tap_cnt}) +
+         (BIT_TIME_TAPS/2);
+
+  //*****************************************************************
+  // Keep track of max taps used during stage 1, use this to limit
+  // the number of taps that can be used in stage 2
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    if (rstdiv) begin
+      cal1_idel_max_tap    <= 6'b000000;
+      cal1_idel_max_tap_we <= 1'b0;
+    end else begin
+      // pipeline latch enable for CAL1_IDEL_MAX_TAP - we have plenty
+      // of time, tap count gets updated, then dead cycles waiting for
+      // IDELAY output to settle
+      cal1_idel_max_tap_we <= (cal1_idel_max_tap < cal1_idel_tap_cnt);
+      // record maximum # of taps used for stg 1 cal
+      if ((cal1_state == CAL1_DONE) && cal1_idel_max_tap_we)
+        cal1_idel_max_tap <= cal1_idel_tap_cnt;
+    end
+
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    if (rstdiv) begin
+      calib_done[0]            <= 1'b0;
+      calib_done_tmp[0]        <= 1'bx;
+      calib_err[0]             <= 1'b0;
+      count_dq                 <= {DQ_BITS{1'b0}};
+      next_count_dq            <= {DQ_BITS{1'b0}};
+      cal1_bit_time_tap_cnt    <= 6'bxxxxxx;
+      cal1_data_chk_last       <= 2'bxx;
+      cal1_data_chk_last_valid <= 1'bx;
+      cal1_dlyce_dq            <= 1'b0;
+      cal1_dlyinc_dq           <= 1'b0;
+      cal1_dqs_dq_init_phase   <= 1'bx;
+      cal1_first_edge_done     <= 1'bx;
+      cal1_found_second_edge   <= 1'bx;
+      cal1_first_edge_tap_cnt  <= 6'bxxxxxx;
+      cal1_idel_dec_cnt        <= 7'bxxxxxxx;
+      cal1_idel_inc_cnt        <= 6'bxxxxxx;
+      cal1_ref_req             <= 1'b0;
+      cal1_state               <= CAL1_IDLE;
+    end else begin
+      // default values for all "pulse" outputs
+      cal1_ref_req        <= 1'b0;
+      cal1_dlyce_dq       <= 1'b0;
+      cal1_dlyinc_dq      <= 1'b0;
+
+      case (cal1_state)
+        CAL1_IDLE: begin
+          count_dq      <= {DQ_BITS{1'b0}};
+          next_count_dq <= {DQ_BITS{1'b0}};
+          if (calib_start[0]) begin
+            calib_done[0] <= 1'b0;
+            calib_done_tmp[0] <= 1'b0;
+            cal1_state    <= CAL1_INIT;
+          end
+        end
+
+        CAL1_INIT: begin
+          cal1_data_chk_last_valid <= 1'b0;
+          cal1_found_second_edge <= 1'b0;
+          cal1_dqs_dq_init_phase <= 1'b0;
+          cal1_idel_inc_cnt      <= 6'b000000;
+          cal1_state <= CAL1_INC_IDEL;
+        end
+
+        // increment DQ IDELAY so that either: (1) DQS starts somewhere in
+        // first rising DQ window, or (2) DQS starts in first falling DQ
+        // window. The amount to shift is frequency dependent (and is either
+        // precalculated by MIG or possibly adjusted by the user)
+        CAL1_INC_IDEL:
+          if ((cal1_idel_inc_cnt == DQ_IDEL_INIT) && !idel_set_wait) begin
+            cal1_state <= CAL1_FIND_FIRST_EDGE;
+          end else if (cal1_idel_inc_cnt != DQ_IDEL_INIT) begin
+            cal1_idel_inc_cnt <= cal1_idel_inc_cnt + 1;
+            cal1_dlyce_dq <= 1'b1;
+            cal1_dlyinc_dq <= 1'b1;
+          end
+
+        // look for first edge
+        CAL1_FIND_FIRST_EDGE: begin
+          // Determine DQS-DQ phase if we can detect enough of a valid window
+          if (cal1_found_window)
+            cal1_dqs_dq_init_phase <= ~cal1_found_rising;
+          // find first edge - if found then record position
+          if (cal1_detect_edge) begin
+            cal1_state <= CAL1_FOUND_FIRST_EDGE_WAIT;
+            cal1_first_edge_done   <= 1'b0;
+            cal1_first_edge_tap_cnt <= cal1_idel_tap_cnt;
+            cal1_data_chk_last_valid <= 1'b0;
+          end else begin
+            // otherwise, store the current value of DATA_CHK, increment
+            // DQ IDELAY, and compare again
+            cal1_state <= CAL1_FIRST_EDGE_IDEL_WAIT;
+            cal1_data_chk_last <= cal1_data_chk_r;
+            // avoid comparing against DATA_CHK_LAST for previous iteration
+            cal1_data_chk_last_valid <= 1'b1;
+            cal1_dlyce_dq <= 1'b1;
+            cal1_dlyinc_dq <= 1'b1;
+          end
+        end
+
+        // wait for DQ IDELAY to settle
+        CAL1_FIRST_EDGE_IDEL_WAIT:
+          if (!idel_set_wait)
+            cal1_state <= CAL1_FIND_FIRST_EDGE;
+
+        // delay state between finding first edge and looking for second
+        // edge. Necessary in order to invalidate CAL1_FOUND_WINDOW before
+        // starting to look for second edge
+        CAL1_FOUND_FIRST_EDGE_WAIT:
+          cal1_state <= CAL1_FIND_SECOND_EDGE;
+
+        // Try and find second edge
+        CAL1_FIND_SECOND_EDGE: begin
+          // When looking for 2nd edge, first make sure data stabilized (by
+          // detecting valid data window) - needed to avoid false edges
+          if (cal1_found_window) begin
+            cal1_first_edge_done <= 1'b1;
+            cal1_dqs_dq_init_phase <= cal1_found_rising;
+          end
+          // exit if run out of taps to increment
+          if (cal1_idel_tap_limit_hit)
+            cal1_state <= CAL1_CALC_IDEL;
+          else begin
+            // found second edge, record the current edge count
+            if (cal1_first_edge_done && cal1_detect_edge) begin
+              cal1_state <= CAL1_CALC_IDEL;
+              cal1_found_second_edge <= 1'b1;
+              cal1_bit_time_tap_cnt <= cal1_idel_tap_cnt -
+                                       cal1_first_edge_tap_cnt + 1;
+            end else begin
+              cal1_state <= CAL1_SECOND_EDGE_IDEL_WAIT;
+              cal1_data_chk_last <= cal1_data_chk_r;
+              cal1_data_chk_last_valid <= 1'b1;
+              cal1_dlyce_dq <= 1'b1;
+              cal1_dlyinc_dq <= 1'b1;
+            end
+          end
+        end
+
+        // wait for DQ IDELAY to settle, then store ISERDES output
+        CAL1_SECOND_EDGE_IDEL_WAIT:
+          if (!idel_set_wait)
+            cal1_state <= CAL1_FIND_SECOND_EDGE;
+
+        // pipeline delay state to calculate amount to decrement DQ IDELAY
+        // NOTE: We're calculating the amount to decrement by, not the
+        //  absolute setting for DQ IDELAY
+        CAL1_CALC_IDEL: begin
+          // if two edges found
+          if (cal1_found_second_edge)
+            // case 1: DQS was in DQ window to start with. First edge found
+            // corresponds to left edge of DQ rising window. Backup by 1.5*BT
+            // NOTE: In this particular case, it is possible to decrement
+            //  "below 0" in the case where DQS delay is less than 0.5*BT,
+            //  need to limit decrement to prevent IDELAY tap underflow
+            if (!cal1_dqs_dq_init_phase)
+              cal1_idel_dec_cnt <= {1'b0, cal1_bit_time_tap_cnt} +
+                                   {1'b0, (cal1_bit_time_tap_cnt >> 1)};
+            // case 2: DQS was in wrong DQ window (in DQ falling window).
+            // First edge found is right edge of DQ rising window. Second
+            // edge is left edge of DQ rising window. Backup by 0.5*BT
+            else
+              cal1_idel_dec_cnt <= {1'b0, (cal1_bit_time_tap_cnt >> 1)};
+          // if only one edge found - assume will always be case 1 - DQS in
+          // DQS window. Case 2 only possible if path delay on DQS > 5ns
+          else
+            cal1_idel_dec_cnt <= cal1_low_freq_idel_dec;
+          cal1_state <= CAL1_DEC_IDEL;
+        end
+
+        // decrement DQ IDELAY for final adjustment
+        CAL1_DEC_IDEL:
+          // once adjustment is complete, we're done with calibration for
+          // this DQ, now return to IDLE state and repeat for next DQ
+          // Add underflow protection for case of 2 edges found and DQS
+          // starting in DQ window (see comments for above state) - note we
+          // have to take into account delayed value of CAL1_IDEL_TAP_CNT -
+          // gets updated one clock cycle after CAL1_DLYCE/INC_DQ
+          if ((cal1_idel_dec_cnt == 7'b0000000) ||
+              (cal1_dlyce_dq && (cal1_idel_tap_cnt == 6'b000001))) begin
+            cal1_state <= CAL1_DONE;
+            // stop when all DQ's calibrated, or DQ[0] cal'ed (for sim)
+            if ((count_dq == DQ_WIDTH-1) || (SIM_ONLY != 0))
+              calib_done_tmp[0] <= 1'b1;
+            else
+              // need for VHDL simulation to prevent out-of-index error
+              next_count_dq <= count_dq + 1;
+          end else begin
+            // keep decrementing until final tap count reached
+            cal1_idel_dec_cnt <= cal1_idel_dec_cnt - 1;
+            cal1_dlyce_dq <= 1'b1;
+            cal1_dlyinc_dq <= 1'b0;
+          end
+
+        // delay state to allow count_dq and DATA_CHK to point to the next
+        // DQ bit (allows us to potentially begin checking for an edge on
+        // next DQ right away).
+        CAL1_DONE:
+          if (!idel_set_wait) begin
+            count_dq <= next_count_dq;
+            if (calib_done_tmp[0]) begin
+              calib_done[0] <= 1'b1;
+              cal1_state <= CAL1_IDLE;
+            end else begin
+              // request auto-refresh after every 8-bits calibrated to
+              // avoid tRAS violation
+              if (cal1_refresh) begin
+                cal1_ref_req <= 1'b1;
+                if (calib_ref_done)
+                  cal1_state <= CAL1_INIT;
+              end else
+                // if no need this time for refresh, proceed to next bit
+                cal1_state <= CAL1_INIT;
+            end
+          end
+      endcase
+    end
+
+  //***************************************************************************
+  // Second stage calibration: DQS-FPGA Clock
+  // Algorithm Description:
+  //  1. Assumes a training pattern that will produce a pattern oscillating at
+  //     half the core clock frequency each on rise and fall outputs, and such
+  //     that rise and fall outputs are 180 degrees out of phase from each
+  //     other. Note that since the calibration logic runs at half the speed
+  //     of the interface, expect that data sampled with the slow clock always
+  //     to be constant (either always = 1, or = 0, and rise data != fall data)
+  //     unless we cross the edge of the data valid window
+  //  2. Start by setting RD_DATA_SEL = 0. This selects the rising capture data
+  //     sync'ed to rising edge of core clock, and falling edge data sync'ed
+  //     to falling edge of core clock
+  //  3. Start looking for an edge. An edge is defined as either: (1) a
+  //     change in capture value or (2) an invalid capture value (e.g. rising
+  //     data != falling data for that same clock cycle).
+  //  4. If an edge is found, go to step (6). If edge hasn't been found, then
+  //     set RD_DATA_SEL = 1, and try again.
+  //  5. If no edge is found, then increment IDELAY and return to step (3)
+  //  6. If an edge if found, then invert RD_DATA_SEL - this shifts the
+  //     capture point 180 degrees from the edge of the window (minus duty
+  //     cycle distortion, delay skew between rising/falling edge capture
+  //     paths, etc.)
+  //  7. If no edge is found by CAL2_IDEL_TAP_LIMIT (= 63 - # taps used for
+  //     stage 1 calibration), then decrement IDELAY (without reinverting
+  //     RD_DATA_SEL) by CAL2_IDEL_TAP_LIMIT/2. This guarantees we at least
+  //     have CAL2_IDEL_TAP_LIMIT/2 of slack both before and after the
+  //     capture point (not optimal, but best we can do not having found an
+  //     of the window). This happens only for very low frequencies.
+  //  8. Repeat for each DQS group.
+  //  NOTE: Step 6 is not optimal. A better (and perhaps more complicated)
+  //   algorithm might be to find both edges of the data valid window (using
+  //   the same polarity of RD_DATA_SEL), and then decrement to the midpoint.
+  //***************************************************************************
+
+  // RD_DATA_SEL should be tagged with FROM-TO (multi-cycle) constraint in
+  // UCF file to relax timing. This net is "pseudo-static" (after value is
+  // changed, FSM waits number of cycles before using the output).
+  // Note that we are adding one clock cycle of delay (to isolate it from
+  // the other logic CAL2_RD_DATA_SEL feeds), make sure FSM waits long
+  // enough to compensate (by default it does, it waits a few cycles more
+  // than minimum # of clock cycles)
+  genvar rd_i;
+  generate
+    for (rd_i = 0; rd_i < DQS_WIDTH; rd_i = rd_i+1) begin: gen_rd_data_sel
+      FDRSE u_ff_rd_data_sel
+        (
+         .Q   (rd_data_sel[rd_i]),
+         .C   (clkdiv),
+         .CE  (1'b1),
+         .D   (cal2_rd_data_sel[rd_i]),
+         .R   (1'b0),
+         .S   (1'b0)
+         ) /* synthesis syn_preserve = 1 */
+           /* synthesis syn_replicate = 0 */;
+    end
+  endgenerate
+
+  //*****************************************************************
+  // Max number of taps used for stg2 cal dependent on number of taps
+  // used for stg1 (give priority to stg1 cal - let it use as many
+  // taps as it needs - the remainder of the IDELAY taps can be used
+  // by stg2)
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    cal2_idel_tap_limit <= 6'b111111 - cal1_idel_max_tap;
+
+  //*****************************************************************
+  // second stage calibration uses readback pattern of "1100" (i.e.
+  // 1st rising = 1, 1st falling = 1, 2nd rising = 0, 2nd falling = 0)
+  // only look at the first bit of each DQS group
+  //*****************************************************************
+
+  // deasserted when captured data has changed since IDELAY was
+  // incremented, or when we're right on the edge (i.e. rise data =
+  // fall data).
+  assign cal2_detect_edge =
+    ((((rdd_rise_q1 != cal2_rd_data_rise_last_pos) ||
+       (rdd_fall_q1 != cal2_rd_data_fall_last_pos)) &&
+      cal2_rd_data_last_valid_pos && (!cal2_curr_sel)) ||
+     (((rdd_rise_q1 != cal2_rd_data_rise_last_neg) ||
+       (rdd_fall_q1 != cal2_rd_data_fall_last_neg)) &&
+      cal2_rd_data_last_valid_neg && (cal2_curr_sel)) ||
+     (rdd_rise_q1 != rdd_fall_q1));
+
+  //*****************************************************************
+  // keep track of edge tap counts found, and whether we've
+  // incremented to the maximum number of taps allowed
+  // NOTE: Assume stage 2 cal always increments the tap count (never
+  //       decrements) when searching for edge of the data valid window
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    if (cal2_state == CAL2_INIT) begin
+      cal2_idel_tap_limit_hit <= 1'b0;
+      cal2_idel_tap_cnt <= 6'b000000;
+    end else if (cal2_dlyce_dqs) begin
+      cal2_idel_tap_cnt <= cal2_idel_tap_cnt + 1;
+      cal2_idel_tap_limit_hit <= (cal2_idel_tap_cnt ==
+                                  cal2_idel_tap_limit - 1);
+    end
+
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    if (rstdiv) begin
+      calib_done[1]               <= 1'b0;
+      calib_done_tmp[1]           <= 1'bx;
+      calib_err[1]                <= 1'b0;
+      count_dqs                   <= 'b0;
+      next_count_dqs              <= 'b0;
+      cal2_dlyce_dqs              <= 1'b0;
+      cal2_dlyinc_dqs             <= 1'b0;
+      cal2_idel_dec_cnt           <= 6'bxxxxxx;
+      cal2_rd_data_last_valid_neg <= 1'bx;
+      cal2_rd_data_last_valid_pos <= 1'bx;
+      cal2_rd_data_sel            <= 'b0;
+      cal2_ref_req                <= 1'b0;
+      cal2_state                  <= CAL2_IDLE;
+    end else begin
+      cal2_ref_req      <= 1'b0;
+      cal2_dlyce_dqs    <= 1'b0;
+      cal2_dlyinc_dqs   <= 1'b0;
+
+      case (cal2_state)
+        CAL2_IDLE: begin
+          count_dqs      <= 'b0;
+          next_count_dqs <= 'b0;
+          if (calib_start[1]) begin
+            cal2_rd_data_sel  <= {DQS_WIDTH{1'b0}};
+            calib_done[1]     <= 1'b0;
+            calib_done_tmp[1] <= 1'b0;
+            cal2_state        <= CAL2_INIT;
+          end
+        end
+
+        // Pass through this state every time we calibrate a new DQS group
+        CAL2_INIT: begin
+          cal2_curr_sel <= 1'b0;
+          cal2_rd_data_last_valid_neg <= 1'b0;
+          cal2_rd_data_last_valid_pos <= 1'b0;
+          cal2_state <= CAL2_INIT_IDEL_WAIT;
+        end
+
+        // Stall state only used if calibration run more than once. Can take
+        // this state out if design never runs calibration more than once.
+        // We need this state to give time for MUX'ed data to settle after
+        // resetting RD_DATA_SEL
+        CAL2_INIT_IDEL_WAIT:
+          if (!idel_set_wait)
+            cal2_state <= CAL2_FIND_EDGE_POS;
+
+        // Look for an edge - first check "positive-edge" stage 2 capture
+        CAL2_FIND_EDGE_POS: begin
+          // if found an edge, then switch to the opposite edge stage 2
+          // capture and we're done - no need to decrement the tap count,
+          // since switching to the opposite edge will shift the capture
+          // point by 180 degrees
+          if (cal2_detect_edge) begin
+            cal2_curr_sel <= 1'b1;
+            cal2_state <= CAL2_DONE;
+            // set all DQS groups to be the same for simulation
+            if (SIM_ONLY != 0)
+              cal2_rd_data_sel <= {DQS_WIDTH{1'b1}};
+            else
+              cal2_rd_data_sel[count_dqs] <= 1'b1;
+            if ((count_dqs == DQS_WIDTH-1) || (SIM_ONLY != 0))
+              calib_done_tmp[1] <= 1'b1;
+            else
+              // MIG 2.1: Fix for simulation out-of-bounds error when
+              // SIM_ONLY=0, and DQS_WIDTH=(power of 2) (needed for VHDL)
+              next_count_dqs <= count_dqs + 1;
+          end else begin
+            // otherwise, invert polarity of stage 2 capture and look for
+            // an edge with opposite capture clock polarity
+            cal2_curr_sel <= 1'b1;
+            cal2_rd_data_sel[count_dqs] <= 1'b1;
+            cal2_state <= CAL2_FIND_EDGE_IDEL_WAIT_POS;
+            cal2_rd_data_rise_last_pos  <= rdd_rise_q1;
+            cal2_rd_data_fall_last_pos  <= rdd_fall_q1;
+            cal2_rd_data_last_valid_pos <= 1'b1;
+          end
+        end
+
+        // Give time to switch from positive-edge to negative-edge second
+        // stage capture (need time for data to filter though pipe stages)
+        CAL2_FIND_EDGE_IDEL_WAIT_POS:
+          if (!idel_set_wait)
+            cal2_state <= CAL2_FIND_EDGE_NEG;
+
+        // Look for an edge - check "negative-edge" stage 2 capture
+        CAL2_FIND_EDGE_NEG:
+          if (cal2_detect_edge) begin
+            cal2_curr_sel <= 1'b0;
+            cal2_state <= CAL2_DONE;
+            // set all DQS groups to be the same for simulation
+            if (SIM_ONLY != 0)
+              cal2_rd_data_sel <= {DQS_WIDTH{1'b0}};
+            else
+              cal2_rd_data_sel[count_dqs] <= 1'b0;
+            if ((count_dqs == DQS_WIDTH-1) || (SIM_ONLY != 0))
+              calib_done_tmp[1] <= 1'b1;
+            else
+              // MIG 2.1: Fix for simulation out-of-bounds error when
+              // SIM_ONLY=0, and DQS_WIDTH=(power of 2) (needed for VHDL)
+              next_count_dqs <= count_dqs + 1;
+          end else if (cal2_idel_tap_limit_hit) begin
+            // otherwise, if we've run out of taps, then immediately
+            // backoff by half # of taps used - that's our best estimate
+            // for optimal calibration point. Doesn't matter whether which
+            // polarity we're using for capture (we don't know which one is
+            // best to use)
+            cal2_idel_dec_cnt <= {1'b0, cal2_idel_tap_limit[5:1]};
+            cal2_state <= CAL2_DEC_IDEL;
+            if ((count_dqs == DQS_WIDTH-1) || (SIM_ONLY != 0))
+              calib_done_tmp[1] <= 1'b1;
+            else
+              // MIG 2.1: Fix for simulation out-of-bounds error when
+              // SIM_ONLY=0, and DQS_WIDTH=(power of 2) (needed for VHDL)
+              next_count_dqs <= count_dqs + 1;
+          end else begin
+            // otherwise, increment IDELAY, and start looking for edge again
+            cal2_curr_sel <= 1'b0;
+            cal2_rd_data_sel[count_dqs] <= 1'b0;
+            cal2_state <= CAL2_FIND_EDGE_IDEL_WAIT_NEG;
+            cal2_rd_data_rise_last_neg  <= rdd_rise_q1;
+            cal2_rd_data_fall_last_neg  <= rdd_fall_q1;
+            cal2_rd_data_last_valid_neg <= 1'b1;
+            cal2_dlyce_dqs  <= 1'b1;
+            cal2_dlyinc_dqs <= 1'b1;
+          end
+
+        CAL2_FIND_EDGE_IDEL_WAIT_NEG:
+          if (!idel_set_wait)
+            cal2_state <= CAL2_FIND_EDGE_POS;
+
+        // if no edge found, then decrement by half # of taps used
+        CAL2_DEC_IDEL: begin
+          if (cal2_idel_dec_cnt == 6'b000000)
+            cal2_state <= CAL2_DONE;
+          else begin
+            cal2_idel_dec_cnt <= cal2_idel_dec_cnt - 1;
+            cal2_dlyce_dqs  <= 1'b1;
+            cal2_dlyinc_dqs <= 1'b0;
+          end
+        end
+
+        // delay state to allow count_dqs and ISERDES data to point to next
+        // DQ bit (DQS group) before going to INIT
+        CAL2_DONE:
+          if (!idel_set_wait) begin
+            count_dqs <= next_count_dqs;
+            if (calib_done_tmp[1]) begin
+              calib_done[1] <= 1'b1;
+              cal2_state <= CAL2_IDLE;
+            end else begin
+              // request auto-refresh after every DQS group calibrated to
+              // avoid tRAS violation
+              cal2_ref_req <= 1'b1;
+              if (calib_ref_done)
+                cal2_state <= CAL2_INIT;
+            end
+          end
+      endcase
+    end
+
+  //***************************************************************************
+  // Stage 3 calibration: Read Enable
+  // Description:
+  // read enable calibration determines the "round-trip" time (in # of CLK0
+  // cycles) between when a read command is issued by the controller, and
+  // when the corresponding read data is synchronized by into the CLK0 domain
+  // this is a long delay chain to delay read enable signal from controller/
+  // initialization logic (i.e. this is used for both initialization and
+  // during normal controller operation). Stage 3 calibration logic decides
+  // which delayed version is appropriate to use (which is affected by the
+  // round trip delay of DQ/DQS) as a "valid" signal to tell rest of logic
+  // when the captured data output from ISERDES is valid.
+  //***************************************************************************
+
+  //*****************************************************************
+  // Delay chains: Use shift registers
+  // Two sets of delay chains are used:
+  //  1. One to delay RDEN from PHY_INIT module for calibration
+  //     purposes (delay required for RDEN for calibration is different
+  //     than during normal operation)
+  //  2. One per DQS group to delay RDEN from controller for normal
+  //     operation - the value to delay for each DQS group can be different
+  //     as is determined during calibration
+  //*****************************************************************
+
+  //*****************************************************************
+  // First delay chain, use only for calibration
+  // input = asserted on rising edge of RDEN from PHY_INIT module
+  //*****************************************************************
+
+  always @(posedge clk) begin
+    ctrl_rden_r       <= ctrl_rden;
+    phy_init_rden_r   <= phy_init_rden;
+    phy_init_rden_r1  <= phy_init_rden_r;
+    calib_rden_edge_r <= phy_init_rden_r & ~phy_init_rden_r1;
+  end
+
+  // Calibration shift register used for both Stage 3 and Stage 4 cal
+  // (not strictly necessary for stage 4, but use as an additional check
+  // to make sure we're checking for correct data on the right clock cycle)
+  always @(posedge clkdiv)
+    if (!calib_done[2])
+      calib_rden_srl_a <= cal3_rden_srl_a;
+    else
+      calib_rden_srl_a <= cal4_rden_srl_a;
+
+  // Flops for targetting of multi-cycle path in UCF
+  genvar cal_rden_ff_i;
+  generate
+    for (cal_rden_ff_i = 0; cal_rden_ff_i < 5;
+         cal_rden_ff_i = cal_rden_ff_i+1) begin: gen_cal_rden_dly
+      FDRSE u_ff_cal_rden_dly
+        (
+         .Q   (calib_rden_srl_a_r[cal_rden_ff_i]),
+         .C   (clkdiv),
+         .CE  (1'b1),
+         .D   (calib_rden_srl_a[cal_rden_ff_i]),
+         .R   (1'b0),
+         .S   (1'b0)
+         ) /* synthesis syn_preserve = 1 */
+           /* synthesis syn_replicate = 0 */;
+    end
+  endgenerate
+
+  SRLC32E u_calib_rden_srl
+    (
+     .Q   (calib_rden_srl_out),
+     .Q31 (),
+     .A   (calib_rden_srl_a_r),
+     .CE  (1'b1),
+     .CLK (clk),
+     .D   (calib_rden_edge_r)
+     );
+
+  FDRSE u_calib_rden_srl_out_r
+    (
+         .Q   (calib_rden_srl_out_r),
+         .C   (clk),
+         .CE  (1'b1),
+         .D   (calib_rden_srl_out),
+         .R   (1'b0),
+         .S   (1'b0)
+     ) /* synthesis syn_preserve = 1 */;
+
+  // convert to CLKDIV domain. Two version are generated because we need
+  // to be able to tell exactly which fast (clk) clock cycle the read
+  // enable was asserted in. Only one of CALIB_DATA_VALID or
+  // CALIB_DATA_VALID_STGD will be asserted for any given shift value
+  always @(posedge clk)
+    calib_rden_srl_out_r1 <= calib_rden_srl_out_r;
+
+  always @(posedge clkdiv) begin
+    calib_rden_valid      <= calib_rden_srl_out_r;
+    calib_rden_valid_stgd <= calib_rden_srl_out_r1;
+  end
+
+  //*****************************************************************
+  // Second set of delays chain, use for normal reads
+  // input = RDEN from controller
+  //*****************************************************************
+
+  // Flops for targetting of multi-cycle path in UCF
+  genvar rden_ff_i;
+  generate
+    for (rden_ff_i = 0; rden_ff_i < 5*DQS_WIDTH;
+         rden_ff_i = rden_ff_i+1) begin: gen_rden_dly
+      FDRSE u_ff_rden_dly
+        (
+         .Q   (rden_dly_r[rden_ff_i]),
+         .C   (clkdiv),
+         .CE  (1'b1),
+         .D   (rden_dly[rden_ff_i]),
+         .R   (1'b0),
+         .S   (1'b0)
+         ) /* synthesis syn_preserve = 1 */
+           /* synthesis syn_replicate = 0 */;
+    end
+  endgenerate
+
+  // NOTE: Comment this section explaining purpose of SRL's
+  genvar rden_i;
+  generate
+    for (rden_i = 0; rden_i < DQS_WIDTH; rden_i = rden_i + 1) begin: gen_rden
+      SRLC32E u_rden_srl
+        (
+         .Q   (rden_srl_out[rden_i]),
+         .Q31 (),
+         .A   ({rden_dly_r[(rden_i*5)+4],
+                rden_dly_r[(rden_i*5)+3],
+                rden_dly_r[(rden_i*5)+2],
+                rden_dly_r[(rden_i*5)+1],
+                rden_dly_r[(rden_i*5)]}),
+         .CE  (1'b1),
+         .CLK (clk),
+         .D   (ctrl_rden_r)
+         );
+      FDRSE u_calib_rden_r
+        (
+         .Q   (calib_rden[rden_i]),
+         .C   (clk),
+         .CE  (1'b1),
+         .D   (rden_srl_out[rden_i]),
+         .R   (1'b0),
+         .S   (1'b0)
+         ) /* synthesis syn_preserve = 1 */;
+    end
+  endgenerate
+
+  //*****************************************************************
+  // indicates that current received data is the correct pattern. Check both
+  // rising and falling data for first DQ in each DQS group. Note that
+  // we're checking using a pipelined version of read data, so need to take
+  // this inherent delay into account in determining final read valid delay
+  // Data is written to the memory in the following order (first -> last):
+  //   0x1, 0xE, 0xE, 0x1, 0x1, 0xE, 0x1, 0xE
+  // Looking at the two LSb bits, expect data in sequence (in binary):
+  //   bit[0]: 1, 0, 0, 1, 0, 1, 0, 1
+  //   bit[1]: 0, 1, 1, 0, 1, 0, 1, 0
+  // Check for the presence of the first 7 words, and compensate read valid
+  // delay accordingly. Don't check last falling edge data, it may be
+  // corrupted by the DQS tri-state glitch at end of read postamble
+  // (glitch protection not yet active until stage 4 cal)
+  //*****************************************************************
+
+  always @(posedge clkdiv) begin
+    rdd_rise_q1_r  <= rdd_rise_q1;
+    rdd_fall_q1_r  <= rdd_fall_q1;
+    rdd_rise_q2_r  <= rdd_rise_q2;
+    rdd_fall_q2_r  <= rdd_fall_q2;
+    rdd_rise_q1_r1 <= rdd_rise_q1_r;
+    rdd_fall_q1_r1 <= rdd_fall_q1_r;
+    // MIG 3.3: Added comparison for second bit in DQS group for stage 3 cal
+    rdd_rise_q1_bit1_r  <= rdd_rise_q1_bit1;
+    rdd_fall_q1_bit1_r  <= rdd_fall_q1_bit1;
+    rdd_rise_q2_bit1_r  <= rdd_rise_q2_bit1;
+    rdd_fall_q2_bit1_r  <= rdd_fall_q2_bit1;
+    rdd_rise_q1_bit1_r1 <= rdd_rise_q1_bit1_r;
+    rdd_fall_q1_bit1_r1 <= rdd_fall_q1_bit1_r;    
+  end
+
+  always @(posedge clkdiv) begin
+    // For the following sequence from memory:
+    //   rise[0], fall[0], rise[1], fall[1]
+    // if data is aligned out of fabric ISERDES:
+    //   RDD_RISE_Q2 = rise[0]
+    //   RDD_FALL_Q2 = fall[0]
+    //   RDD_RISE_Q1 = rise[1]
+    //   RDD_FALL_Q1 = fall[1]
+    cal3_data_match <= ((rdd_rise_q2_r == 1) &&
+                        (rdd_fall_q2_r == 0) &&
+                        (rdd_rise_q1_r == 0) &&
+                        (rdd_fall_q1_r == 1) &&
+                        (rdd_rise_q2   == 0) &&
+                        (rdd_fall_q2   == 1) &&
+                        (rdd_rise_q1   == 0) &&
+                        (rdd_rise_q2_bit1_r == 0) &&
+                        (rdd_fall_q2_bit1_r == 1) &&
+                        (rdd_rise_q1_bit1_r == 1) &&
+                        (rdd_fall_q1_bit1_r == 0) &&
+                        (rdd_rise_q2_bit1   == 1) &&
+                        (rdd_fall_q2_bit1   == 0) &&
+                        (rdd_rise_q1_bit1   == 1));
+
+    // if data is staggered out of fabric ISERDES:
+    //   RDD_RISE_Q1_R = rise[0]
+    //   RDD_FALL_Q1_R = fall[0]
+    //   RDD_RISE_Q2   = rise[1]
+    //   RDD_FALL_Q2   = fall[1]
+    cal3_data_match_stgd <= ((rdd_rise_q1_r1 == 1) &&
+                             (rdd_fall_q1_r1 == 0) &&
+                             (rdd_rise_q2_r  == 0) &&
+                             (rdd_fall_q2_r  == 1) &&
+                             (rdd_rise_q1_r  == 0) &&
+                             (rdd_fall_q1_r  == 1) &&
+                             (rdd_rise_q2    == 0) &&
+                             (rdd_rise_q1_bit1_r1 == 0) &&
+                             (rdd_fall_q1_bit1_r1 == 1) &&
+                             (rdd_rise_q2_bit1_r  == 1) &&
+                             (rdd_fall_q2_bit1_r  == 0) &&
+                             (rdd_rise_q1_bit1_r  == 1) &&
+                             (rdd_fall_q1_bit1_r  == 0) &&
+                             (rdd_rise_q2_bit1    == 1));
+  end
+
+  assign cal3_rden_dly = cal3_rden_srl_a - CAL3_RDEN_SRL_DLY_DELTA;
+  assign cal3_data_valid = (calib_rden_valid | calib_rden_valid_stgd);
+  assign cal3_match_found
+    = ((calib_rden_valid && cal3_data_match) ||
+       (calib_rden_valid_stgd && cal3_data_match_stgd));
+
+  // when calibrating, check to see which clock cycle (after the read is
+  // issued) does the expected data pattern arrive. Record this result
+  // NOTE: Can add error checking here in case valid data not found on any
+  //  of the available pipeline stages
+  always @(posedge clkdiv) begin
+    if (rstdiv) begin
+      cal3_rden_srl_a <= 5'bxxxxx;
+      cal3_state      <= CAL3_IDLE;
+      calib_done[2]   <= 1'b0;
+      calib_err_2[0]  <= 1'b0;
+      count_rden      <= {DQS_WIDTH{1'b0}};
+      rden_dly        <= {5*DQS_WIDTH{1'b0}};
+    end else begin
+
+      case (cal3_state)
+        CAL3_IDLE: begin
+          count_rden <= {DQS_WIDTH{1'b0}};
+          if (calib_start[2]) begin
+            calib_done[2] <= 1'b0;
+            cal3_state    <= CAL3_INIT;
+          end
+        end
+
+        CAL3_INIT: begin
+          cal3_rden_srl_a <= RDEN_BASE_DELAY;
+          // let SRL pipe clear after loading initial shift value
+          cal3_state      <= CAL3_RDEN_PIPE_CLR_WAIT;
+        end
+
+        CAL3_DETECT:
+          if (cal3_data_valid)
+            // if match found at the correct clock cycle
+            if (cal3_match_found) begin
+
+              // For simulation, load SRL addresses for all DQS with same value
+              if (SIM_ONLY != 0) begin
+                for (i = 0; i < DQS_WIDTH; i = i + 1) begin: loop_sim_rden_dly
+                  rden_dly[(i*5)]   <= cal3_rden_dly[0];
+                  rden_dly[(i*5)+1] <= cal3_rden_dly[1];
+                  rden_dly[(i*5)+2] <= cal3_rden_dly[2];
+                  rden_dly[(i*5)+3] <= cal3_rden_dly[3];
+                  rden_dly[(i*5)+4] <= cal3_rden_dly[4];
+                end
+              end else begin
+                rden_dly[(count_rden*5)]   <= cal3_rden_dly[0];
+                rden_dly[(count_rden*5)+1] <= cal3_rden_dly[1];
+                rden_dly[(count_rden*5)+2] <= cal3_rden_dly[2];
+                rden_dly[(count_rden*5)+3] <= cal3_rden_dly[3];
+                rden_dly[(count_rden*5)+4] <= cal3_rden_dly[4];
+              end
+
+              // Use for stage 4 calibration
+              calib_rden_dly[(count_rden*5)]   <= cal3_rden_srl_a[0];
+              calib_rden_dly[(count_rden*5)+1] <= cal3_rden_srl_a[1];
+              calib_rden_dly[(count_rden*5)+2] <= cal3_rden_srl_a[2];
+              calib_rden_dly[(count_rden*5)+3] <= cal3_rden_srl_a[3];
+              calib_rden_dly[(count_rden*5)+4] <= cal3_rden_srl_a[4];
+              cal3_state <= CAL3_DONE;
+            end else begin
+              // If we run out of stages to shift, without finding correct
+              // result, the stop and assert error
+              if (cal3_rden_srl_a == 5'b11111) begin
+                calib_err_2[0] <= 1'b1;
+                cal3_state   <= CAL3_IDLE;
+              end else begin
+                // otherwise, increase the shift value and try again
+                cal3_rden_srl_a <= cal3_rden_srl_a + 1;
+                cal3_state      <= CAL3_RDEN_PIPE_CLR_WAIT;
+              end
+            end
+
+        // give additional time for RDEN_R pipe to clear from effects of
+        // previous pipeline or IDELAY tap change
+        CAL3_RDEN_PIPE_CLR_WAIT:
+          if (calib_rden_pipe_cnt == 5'b00000)
+              cal3_state <= CAL3_DETECT;
+
+        CAL3_DONE: begin
+          if ((count_rden == DQS_WIDTH-1) || (SIM_ONLY != 0)) begin
+            calib_done[2] <= 1'b1;
+            cal3_state    <= CAL3_IDLE;
+          end else begin
+            count_rden    <= count_rden + 1;
+            cal3_state    <= CAL3_INIT;
+          end
+        end
+      endcase
+    end
+  end
+
+  //*****************************************************************
+  // Last part of stage 3 calibration - compensate for differences
+  // in delay between different DQS groups. Assume that in the worst
+  // case, DQS groups can only differ by one clock cycle. Data for
+  // certain DQS groups must be delayed by one clock cycle.
+  // NOTE: May need to increase allowable variation to greater than
+  //  one clock cycle in certain customer designs.
+  // Algorithm is:
+  //   1. Record shift delay value for DQS[0]
+  //   2. Compare each DQS[x] delay value to that of DQS[0]:
+  //     - If different, than record this fact (RDEN_MUX)
+  //     - If greater than DQS[0], set RDEN_INC. Assume greater by
+  //       one clock cycle only - this is a key assumption, assume no
+  //       more than a one clock cycle variation.
+  //     - If less than DQS[0], set RDEN_DEC
+  //   3. After calibration is complete, set control for DQS group
+  //      delay (CALIB_RDEN_SEL):
+  //     - If RDEN_DEC = 1, then assume that DQS[0] is the lowest
+  //       delay (and at least one other DQS group has a higher
+  //       delay).
+  //     - If RDEN_INC = 1, then assume that DQS[0] is the highest
+  //       delay (and that all other DQS groups have the same or
+  //       lower delay).
+  //     - If both RDEN_INC and RDEN_DEC = 1, then flag error
+  //       (variation is too high for this algorithm to handle)
+  //*****************************************************************
+
+  always @(posedge clkdiv) begin
+    if (rstdiv) begin
+      calib_err_2[1] <= 1'b0;
+      calib_rden_sel <= {DQS_WIDTH{1'bx}};
+      rden_dec       <= 1'b0;
+      rden_dly_0     <= 5'bxxxxx;
+      rden_inc       <= 1'b0;
+      rden_mux       <= {DQS_WIDTH{1'b0}};
+    end else begin
+      // if a match if found, then store the value of rden_dly
+      if (!calib_done[2]) begin
+        if ((cal3_state == CAL3_DETECT) && cal3_match_found) begin
+          // store the value for DQS[0] as a reference
+          if (count_rden == 0) begin
+            // for simulation, RDEN calibration only happens for DQS[0]
+            // set RDEN_MUX for all DQS groups to be the same as DQS[0]
+            if (SIM_ONLY != 0)
+              rden_mux <= {DQS_WIDTH{1'b0}};
+            else begin
+              // otherwise, load values for DQS[0]
+              rden_dly_0  <= cal3_rden_srl_a;
+              rden_mux[0] <= 1'b0;
+            end
+          end else if (SIM_ONLY == 0) begin
+            // for all other DQS groups, compare RDEN_DLY delay value with
+            // that of DQS[0]
+            if (rden_dly_0 != cal3_rden_srl_a) begin
+              // record that current DQS group has a different delay
+              // than DQS[0] (the "reference" DQS group)
+              rden_mux[count_rden] <= 1'b1;
+              if (rden_dly_0 > cal3_rden_srl_a)
+                rden_inc <= 1'b1;
+              else if (rden_dly_0 < cal3_rden_srl_a)
+                rden_dec <= 1'b1;
+              // otherwise, if current DQS group has same delay as DQS[0],
+              // then rden_mux[count_rden] remains at 0 (since rden_mux
+              // array contents initialized to 0)
+            end
+          end
+        end
+      end else begin
+        // Otherwise - if we're done w/ stage 2 calibration:
+        // set final value for RDEN data delay
+        // flag error if there's more than one cycle variation from DQS[0]
+        calib_err_2[1] <= (rden_inc && rden_dec);
+        if (rden_inc)
+          // if DQS[0] delay represents max delay
+          calib_rden_sel <= ~rden_mux;
+        else
+          // if DQS[0] delay represents min delay (or all the delays are
+          // the same between DQS groups)
+          calib_rden_sel <= rden_mux;
+      end
+    end
+  end
+
+  // flag error for stage 3 if appropriate
+  always @(posedge clkdiv)
+    calib_err[2] <= calib_err_2[0] | calib_err_2[1];
+
+  //***************************************************************************
+  // Stage 4 calibration: DQS gate
+  //***************************************************************************
+
+  //*****************************************************************
+  // indicates that current received data is the correct pattern. Same as
+  // for READ VALID calibration, except that the expected data sequence is
+  // different since DQS gate is asserted after the 6th word.
+  // Data sequence:
+  //  Arrives from memory (at FPGA input) (R, F): 1 0 0 1 1 0 0 1
+  //  After gating the sequence looks like: 1 0 0 1 1 0 1 0 (7th word =
+  //   5th word, 8th word = 6th word)
+  // What is the gate timing is off? Need to make sure we can distinquish
+  // between the results of correct vs. incorrect gate timing. We also use
+  // the "read_valid" signal from stage 3 calibration to help us determine
+  // when to check for a valid sequence for stage 4 calibration (i.e. use
+  // CAL4_DATA_VALID in addition to CAL4_DATA_MATCH/CAL4_DATA_MATCH_STGD)
+  // Note that since the gate signal from the CLK0 domain is synchronized
+  // to the falling edge of DQS, that the effect of the gate will only be
+  // seen starting with a rising edge data (although it is possible
+  // the GATE IDDR output could go metastable and cause a unexpected result
+  // on the first rising and falling edges after the gate is enabled).
+  // Also note that the actual DQS glitch can come more than 0.5*tCK after
+  // the last falling edge of DQS and the constraint for this path is can
+  // be > 0.5*tCK; however, this means when calibrating, the output of the
+  // GATE IDDR may miss the setup time requirement of the rising edge flop
+  // and only meet it for the falling edge flop. Therefore the rising
+  // edge data immediately following the assertion of the gate can either
+  // be a 1 or 0 (can rely on either)
+  // As the timing on the gate is varied, we expect to see (sequence of
+  // captured read data shown below):
+  //       - 1 0 0 1 1 0 0 1 (gate is really early, starts and ends before
+  //                          read burst even starts)
+  //       - x 0 0 1 1 0 0 1 (gate pulse starts before the burst, and ends
+  //       - x y 0 1 1 0 0 1  sometime during the burst; x,y = 0, or 1, but
+  //       - x y x 1 1 0 0 1  all bits that show an x are the same value,
+  //       - x y x y 1 0 0 1  and y are the same value)
+  //       - x y x y x 0 0 1
+  //       - x y x y x y 0 1 (gate starts just before start of burst)
+  //       - 1 0 x 0 x 0 x 0 (gate starts after 1st falling word. The "x"
+  //                          represents possiblity that gate may not disable
+  //                          clock for 2nd rising word in time)
+  //       - 1 0 0 1 x 1 x 1 (gate starts after 2nd falling word)
+  //       - 1 0 0 1 1 0 x 0 (gate starts after 3rd falling word - GOOD!!)
+  //       - 1 0 0 1 1 0 0 1 (gate starts after burst is already done)
+  //*****************************************************************
+
+  assign cal4_data_valid = calib_rden_valid | calib_rden_valid_stgd;
+  assign cal4_data_good  = (calib_rden_valid &
+                            cal4_data_match) |
+                           (calib_rden_valid_stgd &
+                            cal4_data_match_stgd);
+
+  always @(posedge clkdiv) begin
+    // if data is aligned out of fabric ISERDES:
+    cal4_data_match <= ((rdd_rise_q2_r == 1) &&
+                        (rdd_fall_q2_r == 0) &&
+                        (rdd_rise_q1_r == 0) &&
+                        (rdd_fall_q1_r == 1) &&
+                        (rdd_rise_q2   == 1) &&
+                        (rdd_fall_q2   == 0) &&
+                        // MIG 2.1: Last rising edge data value not
+                        // guaranteed to be certain value at higher
+                        // frequencies
+                        // (rdd_rise_q1   == 0) &&
+                        (rdd_fall_q1   == 0));
+    // if data is staggered out of fabric ISERDES:
+    cal4_data_match_stgd <= ((rdd_rise_q1_r1 == 1) &&
+                             (rdd_fall_q1_r1 == 0) &&
+                             (rdd_rise_q2_r  == 0) &&
+                             (rdd_fall_q2_r  == 1) &&
+                             (rdd_rise_q1_r  == 1) &&
+                             (rdd_fall_q1_r  == 0) &&
+                             // MIG 2.1: Last rising edge data value not
+                             // guaranteed to be certain value at higher
+                             // frequencies
+                             // (rdd_rise_q2    == 0) &&
+                             (rdd_fall_q2    == 0));
+  end
+
+  //*****************************************************************
+  // DQS gate enable generation:
+  // This signal gets synchronized to DQS domain, and drives IDDR
+  // register that in turn asserts/deasserts CE to all 4 or 8 DQ
+  // IDDR's in that DQS group.
+  //   1. During normal (post-cal) operation, this is only for 2 clock
+  //      cycles following the end of a burst. Check for falling edge
+  //      of RDEN. But must also make sure NOT assert for a read-idle-
+  //      read (two non-consecutive reads, separated by exactly one
+  //      idle cycle) - in this case, don't assert the gate because:
+  //      (1) we don't have enough time to deassert the gate before the
+  //          first rising edge of DQS for second burst (b/c of fact
+  //          that DQS gate is generated in the fabric only off rising
+  //          edge of CLK0 - if we somehow had an ODDR in fabric, we
+  //          could pull this off, (2) assumption is that the DQS glitch
+  //          will not rise enough to cause a glitch because the
+  //          post-amble of the first burst is followed immediately by
+  //          the pre-amble of the next burst
+  //   2. During stage 4 calibration, assert for 3 clock cycles
+  //      (assert gate enable one clock cycle early), since we gate out
+  //      the last two words (in addition to the crap on the DQ bus after
+  //      the DQS read postamble).
+  // NOTE: PHY_INIT_RDEN and CTRL_RDEN have slightly different timing w/r
+  //  to when they are asserted w/r to the start of the read burst
+  //  (PHY_INIT_RDEN is one cycle earlier than CTRL_RDEN).
+  //*****************************************************************
+
+  // register for timing purposes for fast clock path - currently only
+  // calib_done_r[2] used
+  always @(posedge clk)
+    calib_done_r <= calib_done;
+
+  always @(*) begin
+    calib_ctrl_rden = ctrl_rden;
+    calib_init_rden = calib_done_r[2] & phy_init_rden;
+  end
+
+  assign calib_ctrl_rden_negedge = ~calib_ctrl_rden & calib_ctrl_rden_r;
+  // check for read-idle-read before asserting DQS pulse at end of read
+  assign calib_ctrl_gate_pulse   = calib_ctrl_rden_negedge_r &
+                                   ~calib_ctrl_rden;
+  always @(posedge clk) begin
+    calib_ctrl_rden_r         <= calib_ctrl_rden;
+    calib_ctrl_rden_negedge_r <= calib_ctrl_rden_negedge;
+    calib_ctrl_gate_pulse_r   <= calib_ctrl_gate_pulse;
+  end
+
+  assign calib_init_gate_pulse = ~calib_init_rden & calib_init_rden_r;
+  always @(posedge clk) begin
+    calib_init_rden_r        <= calib_init_rden;
+    calib_init_gate_pulse_r  <= calib_init_gate_pulse;
+    calib_init_gate_pulse_r1 <= calib_init_gate_pulse_r;
+  end
+
+  // Gate is asserted: (1) during cal, for 3 cycles, starting 1 cycle
+  // after falling edge of CTRL_RDEN, (2) during normal ops, for 2
+  // cycles, starting 2 cycles after falling edge of CTRL_RDEN
+  assign gate_srl_in = ~((calib_ctrl_gate_pulse |
+                          calib_ctrl_gate_pulse_r) |
+                         (calib_init_gate_pulse   |
+                          calib_init_gate_pulse_r |
+                          calib_init_gate_pulse_r1));
+
+  //*****************************************************************
+  // generate DQS enable signal for each DQS group
+  // There are differences between DQS gate signal for calibration vs. during
+  // normal operation:
+  //  * calibration gates the second to last clock cycle of the burst,
+  //    rather than after the last word (e.g. for a 8-word, 4-cycle burst,
+  //    cycle 4 is gated for calibration; during normal operation, cycle
+  //    5 (i.e. cycle after the last word) is gated)
+  // enable for DQS is deasserted for two clock cycles, except when
+  // we have the preamble for the next read immediately following
+  // the postamble of the current read - assume DQS does not glitch
+  // during this time, that it stays low. Also if we did have to gate
+  // the DQS for this case, then we don't have enough time to deassert
+  // the gate in time for the first rising edge of DQS for the second
+  // read
+  //*****************************************************************
+
+  // Flops for targetting of multi-cycle path in UCF
+  genvar gate_ff_i;
+  generate
+    for (gate_ff_i = 0; gate_ff_i < 5*DQS_WIDTH;
+         gate_ff_i = gate_ff_i+1) begin: gen_gate_dly
+      FDRSE u_ff_gate_dly
+        (
+         .Q   (gate_dly_r[gate_ff_i]),
+         .C   (clkdiv),
+         .CE  (1'b1),
+         .D   (gate_dly[gate_ff_i]),
+         .R   (1'b0),
+         .S   (1'b0)
+         ) /* synthesis syn_preserve = 1 */
+           /* synthesis syn_replicate = 0 */;
+    end
+  endgenerate
+
+  genvar gate_i;
+  generate
+    for (gate_i = 0; gate_i < DQS_WIDTH; gate_i = gate_i + 1) begin: gen_gate
+      SRLC32E u_gate_srl
+        (
+         .Q   (gate_srl_out[gate_i]),
+         .Q31 (),
+         .A   ({gate_dly_r[(gate_i*5)+4],
+                gate_dly_r[(gate_i*5)+3],
+                gate_dly_r[(gate_i*5)+2],
+                gate_dly_r[(gate_i*5)+1],
+                gate_dly_r[(gate_i*5)]}),
+         .CE  (1'b1),
+         .CLK (clk),
+         .D   (gate_srl_in)
+         );
+
+      // For GATE_BASE_DELAY > 0, have one extra cycle to register outputs
+      // from controller before generating DQS gate pulse. In PAR, the
+      // location of the controller logic can be far from the DQS gate
+      // logic (DQS gate logic located near the DQS I/O's), contributing
+      // to large net delays. Registering the controller outputs for
+      // CL >= 4 (above 200MHz) adds a stage of pipelining to reduce net
+      // delays
+      if (GATE_BASE_DELAY > 0) begin: gen_gate_base_dly_gt3
+        // add flop between SRL32 and EN_DQS flop (which is located near the
+        // DDR2 IOB's)
+        FDRSE u_gate_srl_ff
+          (
+         .Q   (gate_srl_out_r[gate_i]),
+         .C   (clk),
+         .CE  (1'b1),
+         .D   (gate_srl_out[gate_i]),
+         .R   (1'b0),
+         .S   (1'b0)
+           ) /* synthesis syn_preserve = 1 */;
+      end else begin: gen_gate_base_dly_le3
+        assign gate_srl_out_r[gate_i] = gate_srl_out[gate_i];
+      end
+
+      FDRSE u_en_dqs_ff
+        (
+         .Q   (en_dqs[gate_i]),
+         .C   (clk),
+         .CE  (1'b1),
+         .D   (gate_srl_out_r[gate_i]),
+         .R   (1'b0),
+         .S   (1'b0)
+         ) /* synthesis syn_preserve = 1 */
+           /* synthesis syn_replicate = 0 */;
+    end
+  endgenerate
+
+  //*****************************************************************
+  // Find valid window: keep track of how long we've been in the same data
+  // window. If it's been long enough, then declare that we've found a stable
+  // valid window - in particular, that we're past any region of instability
+  // associated with the edge of the window. Use only when finding left edge
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    // reset before we start to look for window
+    if (cal4_state == CAL4_INIT) begin
+      cal4_window_cnt    <= 4'b0000;
+      cal4_stable_window <= 1'b0;
+    end else if ((cal4_state == CAL4_FIND_EDGE) && cal4_seek_left) begin
+      // if we're looking for left edge, and incrementing IDELAY, count
+      // consecutive taps over which we're in the window
+      if (cal4_data_valid) begin
+        if (cal4_data_good)
+          cal4_window_cnt <= cal4_window_cnt + 1;
+        else
+          cal4_window_cnt <= 4'b0000;
+      end
+
+      if (cal4_window_cnt == MIN_WIN_SIZE-1)
+        cal4_stable_window <= 1'b1;
+    end
+
+  //*****************************************************************
+  // keep track of edge tap counts found, and whether we've
+  // incremented to the maximum number of taps allowed
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    if ((cal4_state == CAL4_INIT) || cal4_dlyrst_gate) begin
+      cal4_idel_max_tap <= 1'b0;
+      cal4_idel_bit_tap <= 1'b0;
+      cal4_idel_tap_cnt <= 6'b000000;
+    end else if (cal4_dlyce_gate) begin
+      if (cal4_dlyinc_gate) begin
+        cal4_idel_tap_cnt <= cal4_idel_tap_cnt + 1;
+        cal4_idel_bit_tap <= (cal4_idel_tap_cnt == CAL4_IDEL_BIT_VAL-2);
+        cal4_idel_max_tap <= (cal4_idel_tap_cnt == 6'b111110);
+      end else begin
+        cal4_idel_tap_cnt <= cal4_idel_tap_cnt - 1;
+        cal4_idel_bit_tap <= 1'b0;
+        cal4_idel_max_tap <= 1'b0;
+      end
+    end
+
+  always @(posedge clkdiv)
+    if ((cal4_state != CAL4_RDEN_PIPE_CLR_WAIT) &&
+        (cal3_state != CAL3_RDEN_PIPE_CLR_WAIT))
+      calib_rden_pipe_cnt <= CALIB_RDEN_PIPE_LEN-1;
+    else
+      calib_rden_pipe_cnt <= calib_rden_pipe_cnt - 1;
+
+  //*****************************************************************
+  // Stage 4 cal state machine
+  //*****************************************************************
+
+  always @(posedge clkdiv)
+    if (rstdiv) begin
+      calib_done[3]      <= 1'b0;
+      calib_done_tmp[3]  <= 1'b0;
+      calib_err[3]       <= 1'b0;
+      count_gate         <= 'b0;
+      gate_dly           <= 'b0;
+      next_count_gate    <= 'b0;
+      cal4_idel_adj_cnt  <= 6'bxxxxxx;
+      cal4_dlyce_gate    <= 1'b0;
+      cal4_dlyinc_gate   <= 1'b0;
+      cal4_dlyrst_gate   <= 1'b0;    // reset handled elsewhere in code
+      cal4_gate_srl_a    <= 5'bxxxxx;
+      cal4_rden_srl_a    <= 5'bxxxxx;
+      cal4_ref_req       <= 1'b0;
+      cal4_seek_left     <= 1'bx;
+      cal4_state         <= CAL4_IDLE;
+    end else begin
+      cal4_ref_req     <= 1'b0;
+      cal4_dlyce_gate  <= 1'b0;
+      cal4_dlyinc_gate <= 1'b0;
+      cal4_dlyrst_gate <= 1'b0;
+
+      case (cal4_state)
+        CAL4_IDLE: begin
+          count_gate      <= 'b0;
+          next_count_gate <= 'b0;
+          if (calib_start[3]) begin
+            gate_dly      <= 'b0;
+            calib_done[3] <= 1'b0;
+            cal4_state    <= CAL4_INIT;
+          end
+        end
+
+        CAL4_INIT: begin
+          // load: (1) initial value of gate delay SRL, (2) appropriate
+          // value of RDEN SRL (so that we get correct "data valid" timing)
+          cal4_gate_srl_a <= GATE_BASE_INIT;
+          cal4_rden_srl_a <= {calib_rden_dly[(count_gate*5)+4],
+                              calib_rden_dly[(count_gate*5)+3],
+                              calib_rden_dly[(count_gate*5)+2],
+                              calib_rden_dly[(count_gate*5)+1],
+                              calib_rden_dly[(count_gate*5)]};
+          // let SRL pipe clear after loading initial shift value
+          cal4_state <= CAL4_RDEN_PIPE_CLR_WAIT;
+        end
+
+        // sort of an initial state - start checking to see whether we're
+        // already in the window or not
+        CAL4_FIND_WINDOW:
+          // decide right away if we start in the proper window - this
+          // determines if we are then looking for the left (trailing) or
+          // right (leading) edge of the data valid window
+          if (cal4_data_valid) begin
+            // if we find a match - then we're already in window, now look
+            // for left edge. Otherwise, look for right edge of window
+            cal4_seek_left  <= cal4_data_good;
+            cal4_state      <= CAL4_FIND_EDGE;
+          end
+
+        CAL4_FIND_EDGE:
+          // don't do anything until the exact clock cycle when to check that
+          // readback data is valid or not
+          if (cal4_data_valid) begin
+            // we're currently in the window, look for left edge of window
+            if (cal4_seek_left) begin
+              // make sure we've passed the right edge before trying to detect
+              // the left edge (i.e. avoid any edge "instability") - else, we
+              // may detect an "false" edge too soon. By design, if we start in
+              // the data valid window, always expect at least
+              // MIN(BIT_TIME_TAPS,32) (-/+ jitter, see below) taps of valid
+              // window before we hit the left edge (this is because when stage
+              // 4 calibration first begins (i.e., gate_dly = 00, and IDELAY =
+              // 00), we're guaranteed to NOT be in the window, and we always
+              // start searching for MIN(BIT_TIME_TAPS,32) for the right edge
+              // of window. If we don't find it, increment gate_dly, and if we
+              // now start in the window, we have at least approximately
+              // CLK_PERIOD-MIN(BIT_TIME_TAPS,32) = MIN(BIT_TIME_TAPS,32) taps.
+              // It's approximately because jitter, noise, etc. can bring this
+              // value down slightly. Because of this (although VERY UNLIKELY),
+              // we have to protect against not decrementing IDELAY below 0
+              // during adjustment phase).
+              if (cal4_stable_window && !cal4_data_good) begin
+                // found left edge of window, dec by MIN(BIT_TIME_TAPS,32)
+                cal4_idel_adj_cnt <= CAL4_IDEL_BIT_VAL;
+                cal4_idel_adj_inc <= 1'b0;
+                cal4_state        <= CAL4_ADJ_IDEL;
+              end else begin
+                // Otherwise, keep looking for left edge:
+                if (cal4_idel_max_tap) begin
+                  // ran out of taps looking for left edge (max=63) - happens
+                  // for low frequency case, decrement by 32
+                  cal4_idel_adj_cnt <= 6'b100000;
+                  cal4_idel_adj_inc <= 1'b0;
+                  cal4_state        <= CAL4_ADJ_IDEL;
+                end else begin
+                  cal4_dlyce_gate  <= 1'b1;
+                  cal4_dlyinc_gate <= 1'b1;
+                  cal4_state       <= CAL4_IDEL_WAIT;
+                end
+              end
+            end else begin
+              // looking for right edge of window:
+              // look for the first match - this means we've found the right
+              // (leading) edge of the data valid window, increment by
+              // MIN(BIT_TIME_TAPS,32)
+              if (cal4_data_good) begin
+                cal4_idel_adj_cnt <= CAL4_IDEL_BIT_VAL;
+                cal4_idel_adj_inc <= 1'b1;
+                cal4_state        <= CAL4_ADJ_IDEL;
+              end else begin
+                // Otherwise, keep looking:
+                // only look for MIN(BIT_TIME_TAPS,32) taps for right edge,
+                // if we haven't found it, then inc gate delay, try again
+                if (cal4_idel_bit_tap) begin
+                  // if we're already maxed out on gate delay, then error out
+                  // (simulation only - calib_err isn't currently connected)
+                  if (cal4_gate_srl_a == 5'b11111) begin
+                    calib_err[3] <= 1'b1;
+                    cal4_state   <= CAL4_IDLE;
+                  end else begin
+                    // otherwise, increment gate delay count, and start
+                    // over again
+                    cal4_gate_srl_a <= cal4_gate_srl_a + 1;
+                    cal4_dlyrst_gate <= 1'b1;
+                    cal4_state <= CAL4_RDEN_PIPE_CLR_WAIT;
+                  end
+                end else begin
+                  // keep looking for right edge
+                  cal4_dlyce_gate  <= 1'b1;
+                  cal4_dlyinc_gate <= 1'b1;
+                  cal4_state       <= CAL4_IDEL_WAIT;
+                end
+              end
+            end
+          end
+
+        // wait for GATE IDELAY to settle, after reset or increment
+        CAL4_IDEL_WAIT: begin
+          // For simulation, load SRL addresses for all DQS with same value
+          if (SIM_ONLY != 0) begin
+            for (i = 0; i < DQS_WIDTH; i = i + 1) begin: loop_sim_gate_dly
+              gate_dly[(i*5)+4] <= cal4_gate_srl_a[4];
+              gate_dly[(i*5)+3] <= cal4_gate_srl_a[3];
+              gate_dly[(i*5)+2] <= cal4_gate_srl_a[2];
+              gate_dly[(i*5)+1] <= cal4_gate_srl_a[1];
+              gate_dly[(i*5)]   <= cal4_gate_srl_a[0];
+            end
+          end else begin
+            gate_dly[(count_gate*5)+4] <= cal4_gate_srl_a[4];
+            gate_dly[(count_gate*5)+3] <= cal4_gate_srl_a[3];
+            gate_dly[(count_gate*5)+2] <= cal4_gate_srl_a[2];
+            gate_dly[(count_gate*5)+1] <= cal4_gate_srl_a[1];
+            gate_dly[(count_gate*5)]   <= cal4_gate_srl_a[0];
+          end
+          // check to see if we've found edge of window
+          if (!idel_set_wait)
+            cal4_state <= CAL4_FIND_EDGE;
+        end
+
+        // give additional time for RDEN_R pipe to clear from effects of
+        // previous pipeline (and IDELAY reset)
+        CAL4_RDEN_PIPE_CLR_WAIT: begin
+          // MIG 2.2: Bug fix - make sure to update GATE_DLY count, since
+          // possible for FIND_EDGE->RDEN_PIPE_CLR_WAIT->FIND_WINDOW
+          // transition (i.e. need to make sure the gate count updated in
+          // FIND_EDGE gets reflected in GATE_DLY by the time we reach
+          // state FIND_WINDOW) - previously GATE_DLY only being updated
+          // during state CAL4_IDEL_WAIT
+          if (SIM_ONLY != 0) begin
+            for (i = 0; i < DQS_WIDTH; i = i + 1) begin: loop_sim_gate_dly_pipe
+              gate_dly[(i*5)+4] <= cal4_gate_srl_a[4];
+              gate_dly[(i*5)+3] <= cal4_gate_srl_a[3];
+              gate_dly[(i*5)+2] <= cal4_gate_srl_a[2];
+              gate_dly[(i*5)+1] <= cal4_gate_srl_a[1];
+              gate_dly[(i*5)]   <= cal4_gate_srl_a[0];
+            end
+          end else begin
+            gate_dly[(count_gate*5)+4] <= cal4_gate_srl_a[4];
+            gate_dly[(count_gate*5)+3] <= cal4_gate_srl_a[3];
+            gate_dly[(count_gate*5)+2] <= cal4_gate_srl_a[2];
+            gate_dly[(count_gate*5)+1] <= cal4_gate_srl_a[1];
+            gate_dly[(count_gate*5)]   <= cal4_gate_srl_a[0];
+          end
+          // look for new window
+          if (calib_rden_pipe_cnt == 5'b00000)
+            cal4_state <= CAL4_FIND_WINDOW;
+        end
+
+        // increment/decrement DQS/DQ IDELAY for final adjustment
+        CAL4_ADJ_IDEL:
+          // add underflow protection for corner case when left edge found
+          // using fewer than MIN(BIT_TIME_TAPS,32) taps
+          if ((cal4_idel_adj_cnt == 6'b000000) ||
+              (cal4_dlyce_gate && !cal4_dlyinc_gate &&
+               (cal4_idel_tap_cnt == 6'b000001))) begin
+            cal4_state <= CAL4_DONE;
+            // stop when all gates calibrated, or gate[0] cal'ed (for sim)
+            if ((count_gate == DQS_WIDTH-1) || (SIM_ONLY != 0))
+              calib_done_tmp[3] <= 1'b1;
+            else
+              // need for VHDL simulation to prevent out-of-index error
+              next_count_gate <= count_gate + 1;
+          end else begin
+            cal4_idel_adj_cnt <= cal4_idel_adj_cnt - 1;
+            cal4_dlyce_gate  <= 1'b1;
+            // whether inc or dec depends on whether left or right edge found
+            cal4_dlyinc_gate <= cal4_idel_adj_inc;
+          end
+
+        // wait for IDELAY output to settle after decrement. Check current
+        // COUNT_GATE value and decide if we're done
+        CAL4_DONE:
+          if (!idel_set_wait) begin
+            count_gate <= next_count_gate;
+            if (calib_done_tmp[3]) begin
+              calib_done[3] <= 1'b1;
+              cal4_state <= CAL4_IDLE;
+            end else begin
+              // request auto-refresh after every DQS group calibrated to
+              // avoid tRAS violation
+              cal4_ref_req <= 1'b1;
+              if (calib_ref_done)
+                cal4_state <= CAL4_INIT;
+            end
+          end
+      endcase
+    end
+
+endmodule
Index: trunk/Xilinx/ddr2_idelay_ctrl.v
===================================================================
--- trunk/Xilinx/ddr2_idelay_ctrl.v	(revision 10)
+++ trunk/Xilinx/ddr2_idelay_ctrl.v	(revision 10)
@@ -0,0 +1,87 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_idelay_ctrl.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Wed Aug 16 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module instantiates the IDELAYCTRL primitive of the Virtex-5 device
+//   which continuously calibrates the IDELAY elements in the region in case of
+//   varying operating conditions. It takes a 200MHz clock as an input
+//Reference:
+//Revision History:
+//   Rev 1.1 - Parameter IODELAY_GRP added and constraint IODELAY_GROUP added
+//             on IOELAYCTRL primitive. Generate logic on IDELAYCTRL removed
+//             since tools will replicate idelactrl primitives.PK. 11/27/08
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_idelay_ctrl #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference
+   // board design). Actual values may be different. Actual parameters values
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter IODELAY_GRP     = "IODELAY_MIG"
+   )
+
+  (
+   input  clk200,
+   input  rst200,
+   output idelay_ctrl_rdy
+   );
+
+  (* IODELAY_GROUP = IODELAY_GRP *) IDELAYCTRL u_idelayctrl
+    (
+     .RDY(idelay_ctrl_rdy),
+     .REFCLK(clk200),
+     .RST(rst200)
+     );
+
+endmodule
Index: trunk/Xilinx/ddr2_usr_top.v
===================================================================
--- trunk/Xilinx/ddr2_usr_top.v	(revision 10)
+++ trunk/Xilinx/ddr2_usr_top.v	(revision 10)
@@ -0,0 +1,181 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_usr_top.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Mon Aug 28 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   This module interfaces with the user. The user should provide the data
+//   and  various commands.
+//Reference:
+//Revision History:
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_usr_top #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference 
+   // board design). Actual values may be different. Actual parameters values 
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter BANK_WIDTH     = 2,
+   parameter CS_BITS        = 0,
+   parameter COL_WIDTH      = 10,
+   parameter DQ_WIDTH       = 72,
+   parameter DQ_PER_DQS     = 8,
+   parameter APPDATA_WIDTH  = 144,
+   parameter ECC_ENABLE     = 0,
+   parameter DQS_WIDTH      = 9,
+   parameter ROW_WIDTH      = 14
+   )
+  (
+   input                                     clk0,
+   input                                     clk90,
+   input                                     rst0,
+   input [DQ_WIDTH-1:0]                      rd_data_in_rise,
+   input [DQ_WIDTH-1:0]                      rd_data_in_fall,
+   input [DQS_WIDTH-1:0]                     phy_calib_rden,
+   input [DQS_WIDTH-1:0]                     phy_calib_rden_sel,
+   output                                    rd_data_valid,
+   output [APPDATA_WIDTH-1:0]                rd_data_fifo_out,
+   input [2:0]                               app_af_cmd,
+   input [30:0]                              app_af_addr,
+   input                                     app_af_wren,
+   input                                     ctrl_af_rden,
+   output [2:0]                              af_cmd,
+   output [30:0]                             af_addr,
+   output                                    af_empty,
+   output                                    app_af_afull,
+   output [1:0]                              rd_ecc_error,
+   input                                     app_wdf_wren,
+   input [APPDATA_WIDTH-1:0]                 app_wdf_data,
+   input [(APPDATA_WIDTH/8)-1:0]             app_wdf_mask_data,
+   input                                     wdf_rden,
+   output                                    app_wdf_afull,
+   output [(2*DQ_WIDTH)-1:0]                 wdf_data,
+   output [((2*DQ_WIDTH)/8)-1:0]             wdf_mask_data
+   );
+
+  wire [(APPDATA_WIDTH/2)-1:0] i_rd_data_fifo_out_fall;
+  wire [(APPDATA_WIDTH/2)-1:0] i_rd_data_fifo_out_rise;
+
+  //***************************************************************************
+
+  assign rd_data_fifo_out = {i_rd_data_fifo_out_fall,
+                             i_rd_data_fifo_out_rise};
+
+  // read data de-skew and ECC calculation
+  ddr2_usr_rd #
+    (
+     .DQ_PER_DQS    (DQ_PER_DQS),
+     .ECC_ENABLE    (ECC_ENABLE),
+     .APPDATA_WIDTH (APPDATA_WIDTH),
+     .DQS_WIDTH     (DQS_WIDTH)
+     )
+     u_usr_rd
+      (
+       .clk0             (clk0),
+       .rst0             (rst0),
+       .rd_data_in_rise  (rd_data_in_rise),
+       .rd_data_in_fall  (rd_data_in_fall),
+       .rd_ecc_error     (rd_ecc_error),
+       .ctrl_rden        (phy_calib_rden),
+       .ctrl_rden_sel    (phy_calib_rden_sel),
+       .rd_data_valid    (rd_data_valid),
+       .rd_data_out_rise (i_rd_data_fifo_out_rise),
+       .rd_data_out_fall (i_rd_data_fifo_out_fall)
+       );
+
+  // Command/Addres FIFO
+  ddr2_usr_addr_fifo #
+    (
+     .BANK_WIDTH (BANK_WIDTH),
+     .COL_WIDTH  (COL_WIDTH),
+     .CS_BITS    (CS_BITS),
+     .ROW_WIDTH  (ROW_WIDTH)
+     )
+     u_usr_addr_fifo
+      (
+       .clk0         (clk0),
+       .rst0         (rst0),
+       .app_af_cmd   (app_af_cmd),
+       .app_af_addr  (app_af_addr),
+       .app_af_wren  (app_af_wren),
+       .ctrl_af_rden (ctrl_af_rden),
+       .af_cmd       (af_cmd),
+       .af_addr      (af_addr),
+       .af_empty     (af_empty),
+       .app_af_afull (app_af_afull)
+       );
+
+  ddr2_usr_wr #
+    (
+     .BANK_WIDTH    (BANK_WIDTH),
+     .COL_WIDTH     (COL_WIDTH),
+     .CS_BITS       (CS_BITS),
+     .DQ_WIDTH      (DQ_WIDTH),
+     .APPDATA_WIDTH (APPDATA_WIDTH),
+     .ECC_ENABLE    (ECC_ENABLE),
+     .ROW_WIDTH     (ROW_WIDTH)
+     )
+    u_usr_wr
+      (
+       .clk0              (clk0),
+       .clk90             (clk90),
+       .rst0              (rst0),
+       .app_wdf_wren      (app_wdf_wren),
+       .app_wdf_data      (app_wdf_data),
+       .app_wdf_mask_data (app_wdf_mask_data),
+       .wdf_rden          (wdf_rden),
+       .app_wdf_afull     (app_wdf_afull),
+       .wdf_data          (wdf_data),
+       .wdf_mask_data     (wdf_mask_data)
+       );
+
+endmodule
Index: trunk/Xilinx/ddr2_usr_rd.v
===================================================================
--- trunk/Xilinx/ddr2_usr_rd.v	(revision 10)
+++ trunk/Xilinx/ddr2_usr_rd.v	(revision 10)
@@ -0,0 +1,297 @@
+//*****************************************************************************
+// DISCLAIMER OF LIABILITY
+//
+// This file contains proprietary and confidential information of
+// Xilinx, Inc. ("Xilinx"), that is distributed under a license
+// from Xilinx, and may be used, copied and/or disclosed only
+// pursuant to the terms of a valid license agreement with Xilinx.
+//
+// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
+// ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+// EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
+// LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
+// MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
+// does not warrant that functions included in the Materials will
+// meet the requirements of Licensee, or that the operation of the
+// Materials will be uninterrupted or error-free, or that defects
+// in the Materials will be corrected. Furthermore, Xilinx does
+// not warrant or make any representations regarding use, or the
+// results of the use, of the Materials in terms of correctness,
+// accuracy, reliability or otherwise.
+//
+// Xilinx products are not designed or intended to be fail-safe,
+// or for use in any application requiring fail-safe performance,
+// such as life-support or safety devices or systems, Class III
+// medical devices, nuclear facilities, applications related to
+// the deployment of airbags, or any other applications that could
+// lead to death, personal injury or severe property or
+// environmental damage (individually and collectively, "critical
+// applications"). Customer assumes the sole risk and liability
+// of any use of Xilinx products in critical applications,
+// subject only to applicable laws and regulations governing
+// limitations on product liability.
+//
+// Copyright 2006, 2007, 2008 Xilinx, Inc.
+// All rights reserved.
+//
+// This disclaimer and copyright notice must be retained as part
+// of this file at all times.
+//*****************************************************************************
+//   ____  ____
+//  /   /\/   /
+// /___/  \  /    Vendor: Xilinx
+// \   \   \/     Version: 3.6
+//  \   \         Application: MIG
+//  /   /         Filename: ddr2_usr_rd.v
+// /___/   /\     Date Last Modified: $Date: 2010/06/29 12:03:43 $
+// \   \  /  \    Date Created: Tue Aug 29 2006
+//  \___\/\___\
+//
+//Device: Virtex-5
+//Design Name: DDR2
+//Purpose:
+//   The delay between the read data with respect to the command issued is
+//   calculted in terms of no. of clocks. This data is then stored into the
+//   FIFOs and then read back and given as the ouput for comparison.
+//Reference:
+//Revision History:
+//*****************************************************************************
+
+`timescale 1ns/1ps
+
+module ddr2_usr_rd #
+  (
+   // Following parameters are for 72-bit RDIMM design (for ML561 Reference 
+   // board design). Actual values may be different. Actual parameters values 
+   // are passed from design top module dram module. Please refer to
+   // the dram module for actual values.
+   parameter DQ_PER_DQS    = 8,
+   parameter DQS_WIDTH     = 9,
+   parameter APPDATA_WIDTH = 144,
+   parameter ECC_WIDTH     = 72,
+   parameter ECC_ENABLE    = 0
+   )
+  (
+   input                                    clk0,
+   input                                    rst0,
+   input [(DQS_WIDTH*DQ_PER_DQS)-1:0]       rd_data_in_rise,
+   input [(DQS_WIDTH*DQ_PER_DQS)-1:0]       rd_data_in_fall,
+   input [DQS_WIDTH-1:0]                    ctrl_rden,
+   input [DQS_WIDTH-1:0]                    ctrl_rden_sel,
+   output reg [1:0]                         rd_ecc_error,
+   output                                   rd_data_valid,
+   output reg [(APPDATA_WIDTH/2)-1:0]       rd_data_out_rise,
+   output reg [(APPDATA_WIDTH/2)-1:0]       rd_data_out_fall
+   );
+
+  // determine number of FIFO72's to use based on data width
+  localparam RDF_FIFO_NUM = ((APPDATA_WIDTH/2)+63)/64;
+
+  reg [DQS_WIDTH-1:0]               ctrl_rden_r;
+  wire [(DQS_WIDTH*DQ_PER_DQS)-1:0] fall_data;
+  reg [(DQS_WIDTH*DQ_PER_DQS)-1:0]  rd_data_in_fall_r;
+  reg [(DQS_WIDTH*DQ_PER_DQS)-1:0]  rd_data_in_rise_r;
+  wire                              rden;
+  reg [DQS_WIDTH-1:0]               rden_sel_r
+                                    /* synthesis syn_preserve=1 */;
+  wire [DQS_WIDTH-1:0]              rden_sel_mux;
+  wire [(DQS_WIDTH*DQ_PER_DQS)-1:0] rise_data;
+
+  // ECC specific signals
+  wire [((RDF_FIFO_NUM -1) *2)+1:0] db_ecc_error;
+  reg [(DQS_WIDTH*DQ_PER_DQS)-1:0]  fall_data_r;
+  reg                               fifo_rden_r0;
+  reg                               fifo_rden_r1;
+  reg                               fifo_rden_r2;
+  reg                               fifo_rden_r3;
+  reg                               fifo_rden_r4;
+  reg                               fifo_rden_r5;
+  reg                               fifo_rden_r6;
+  wire [(APPDATA_WIDTH/2)-1:0]      rd_data_out_fall_temp;
+  wire [(APPDATA_WIDTH/2)-1:0]      rd_data_out_rise_temp;
+  reg                               rst_r;
+  reg [(DQS_WIDTH*DQ_PER_DQS)-1:0]  rise_data_r;
+  wire [((RDF_FIFO_NUM -1) *2)+1:0] sb_ecc_error;
+
+
+  //***************************************************************************
+
+  always @(posedge clk0) begin
+    rden_sel_r        <= ctrl_rden_sel;
+    ctrl_rden_r       <= ctrl_rden;
+    rd_data_in_rise_r <= rd_data_in_rise;
+    rd_data_in_fall_r <= rd_data_in_fall;
+  end
+
+  // Instantiate primitive to allow this flop to be attached to multicycle
+  // path constraint in UCF. Multicycle path allowed for data from read FIFO.
+  // This is the same signal as RDEN_SEL_R, but is only used to select data
+  // (does not affect control signals)
+  genvar rd_i;
+  generate
+    for (rd_i = 0; rd_i < DQS_WIDTH; rd_i = rd_i+1) begin: gen_rden_sel_mux
+      FDRSE u_ff_rden_sel_mux
+        (
+         .Q   (rden_sel_mux[rd_i]),
+         .C   (clk0),
+         .CE  (1'b1),
+         .D   (ctrl_rden_sel[rd_i]),
+         .R   (1'b0),
+         .S   (1'b0)
+         ) /* synthesis syn_preserve=1 */;
+    end
+  endgenerate
+
+  // determine correct read data valid signal timing
+  assign rden = (rden_sel_r[0]) ? ctrl_rden[0] : ctrl_rden_r[0];
+
+  // assign data based on the skew
+  genvar data_i;
+  generate
+    for(data_i = 0; data_i < DQS_WIDTH; data_i = data_i+1) begin: gen_data
+      assign rise_data[(data_i*DQ_PER_DQS)+(DQ_PER_DQS-1):
+                       (data_i*DQ_PER_DQS)]
+               = (rden_sel_mux[data_i]) ?
+                 rd_data_in_rise[(data_i*DQ_PER_DQS)+(DQ_PER_DQS-1) :
+                                 (data_i*DQ_PER_DQS)] :
+                 rd_data_in_rise_r[(data_i*DQ_PER_DQS)+(DQ_PER_DQS-1):
+                                   (data_i*DQ_PER_DQS)];
+       assign fall_data[(data_i*DQ_PER_DQS)+(DQ_PER_DQS-1):
+                        (data_i*DQ_PER_DQS)]
+                = (rden_sel_mux[data_i]) ?
+                  rd_data_in_fall[(data_i*DQ_PER_DQS)+(DQ_PER_DQS-1):
+                                  (data_i*DQ_PER_DQS)] :
+                  rd_data_in_fall_r[(data_i*DQ_PER_DQS)+(DQ_PER_DQS-1):
+                                    (data_i*DQ_PER_DQS)];
+    end
+  endgenerate
+
+  // Generate RST for FIFO reset AND for read/write enable:
+  // ECC FIFO always being read from and written to
+  always @(posedge clk0)
+    rst_r <= rst0;
+
+  genvar rdf_i;
+  generate
+    if (ECC_ENABLE) begin
+      always @(posedge clk0) begin
+        rd_ecc_error[0]   <= (|sb_ecc_error) & fifo_rden_r5;
+        rd_ecc_error[1]   <= (|db_ecc_error) & fifo_rden_r5;
+        rd_data_out_rise  <= rd_data_out_rise_temp;
+        rd_data_out_fall  <= rd_data_out_fall_temp;
+        rise_data_r       <= rise_data;
+        fall_data_r       <= fall_data;
+      end
+
+      // can use any of the read valids, they're all delayed by same amount
+      assign rd_data_valid = fifo_rden_r6;
+
+      // delay read valid to take into account max delay difference btw
+      // the read enable coming from the different DQS groups
+      always @(posedge clk0) begin
+        if (rst0) begin
+          fifo_rden_r0 <= 1'b0;
+          fifo_rden_r1 <= 1'b0;
+          fifo_rden_r2 <= 1'b0;
+          fifo_rden_r3 <= 1'b0;
+          fifo_rden_r4 <= 1'b0;
+          fifo_rden_r5 <= 1'b0;
+          fifo_rden_r6 <= 1'b0;
+        end else begin
+          fifo_rden_r0 <= rden;
+          fifo_rden_r1 <= fifo_rden_r0;
+          fifo_rden_r2 <= fifo_rden_r1;
+          fifo_rden_r3 <= fifo_rden_r2;
+          fifo_rden_r4 <= fifo_rden_r3;
+          fifo_rden_r5 <= fifo_rden_r4;
+          fifo_rden_r6 <= fifo_rden_r5;
+        end
+      end
+
+      for (rdf_i = 0; rdf_i < RDF_FIFO_NUM; rdf_i = rdf_i + 1) begin: gen_rdf
+
+        FIFO36_72  # // rise fifo
+          (
+           .ALMOST_EMPTY_OFFSET     (9'h007),
+           .ALMOST_FULL_OFFSET      (9'h00F),
+           .DO_REG                  (1),          // extra CC output delay
+           .EN_ECC_WRITE            ("FALSE"),
+           .EN_ECC_READ             ("TRUE"),
+           .EN_SYN                  ("FALSE"),
+           .FIRST_WORD_FALL_THROUGH ("FALSE")
+           )
+          u_rdf
+            (
+             .ALMOSTEMPTY (),
+             .ALMOSTFULL  (),
+             .DBITERR     (db_ecc_error[rdf_i + rdf_i]),
+             .DO          (rd_data_out_rise_temp[(64*(rdf_i+1))-1:
+                                                 (64 *rdf_i)]),
+             .DOP         (),
+             .ECCPARITY   (),
+             .EMPTY       (),
+             .FULL        (),
+             .RDCOUNT     (),
+             .RDERR       (),
+             .SBITERR     (sb_ecc_error[rdf_i + rdf_i]),
+             .WRCOUNT     (),
+             .WRERR       (),
+             .DI          (rise_data_r[((64*(rdf_i+1)) + (rdf_i*8))-1:
+                                       (64 *rdf_i)+(rdf_i*8)]),
+             .DIP         (rise_data_r[(72*(rdf_i+1))-1:
+                                       (64*(rdf_i+1))+ (8*rdf_i)]),
+             .RDCLK       (clk0),
+             .RDEN        (~rst_r),
+             .RST         (rst_r),
+             .WRCLK       (clk0),
+             .WREN        (~rst_r)
+             );
+
+        FIFO36_72  # // fall_fifo
+          (
+           .ALMOST_EMPTY_OFFSET     (9'h007),
+           .ALMOST_FULL_OFFSET      (9'h00F),
+           .DO_REG                  (1),          // extra CC output delay
+           .EN_ECC_WRITE            ("FALSE"),
+           .EN_ECC_READ             ("TRUE"),
+           .EN_SYN                  ("FALSE"),
+           .FIRST_WORD_FALL_THROUGH ("FALSE")
+           )
+          u_rdf1
+            (
+             .ALMOSTEMPTY (),
+             .ALMOSTFULL  (),
+             .DBITERR     (db_ecc_error[(rdf_i+1) + rdf_i]),
+             .DO          (rd_data_out_fall_temp[(64*(rdf_i+1))-1:
+                                                 (64 *rdf_i)]),
+             .DOP         (),
+             .ECCPARITY   (),
+             .EMPTY       (),
+             .FULL        (),
+             .RDCOUNT     (),
+             .RDERR       (),
+             .SBITERR     (sb_ecc_error[(rdf_i+1) + rdf_i]),
+             .WRCOUNT     (),
+             .WRERR       (),
+             .DI          (fall_data_r[((64*(rdf_i+1)) + (rdf_i*8))-1:
+                                       (64*rdf_i)+(rdf_i*8)]),
+             .DIP         (fall_data_r[(72*(rdf_i+1))-1:
+                                       (64*(rdf_i+1))+ (8*rdf_i)]),
+             .RDCLK       (clk0),
+             .RDEN        (~rst_r),
+             .RST         (rst_r),          // or can use rst0
+             .WRCLK       (clk0),
+             .WREN        (~rst_r)
+             );
+      end
+    end else begin
+      assign rd_data_valid = fifo_rden_r0;
+      always @(posedge clk0) begin
+        rd_data_out_rise <= rise_data;
+        rd_data_out_fall <= fall_data;
+        fifo_rden_r0 <= rden;
+      end
+    end
+  endgenerate
+
+endmodule
Index: trunk/os2wb/os2wb.v
===================================================================
--- trunk/os2wb/os2wb.v	(revision 6)
+++ trunk/os2wb/os2wb.v	(revision 10)
@@ -154,5 +154,5 @@
    end
         
-pcx_fifo pcx_fifo_inst( 
+/*pcx_fifo pcx_fifo_inst( 
        // FIFO should be first word fall-through
        // It has no full flag as the core will send only limited number of requests,
@@ -171,4 +171,17 @@
     .q(pcx_data_fifo)
 );
+*/
+pcx_fifo pcx_fifo_inst( 
+    .clk(clk),
+	 .rst(!rstn),
+    .din({pcx_atom_1,pcx_req_1,pcx_data}),
+    .rd_en(fifo_rd),
+    .wr_en((pcx_req_1!=5'b00000 && pcx_data[123]) || (pcx_atom_2 && pcx_data_123_d)), 
+    .empty(pcx_fifo_empty),
+    .dout(pcx_data_fifo)
+);
+	
+
+
 // --------------------------
 
Index: trunk/os2wb/s1_top.v
===================================================================
--- trunk/os2wb/s1_top.v	(revision 6)
+++ trunk/os2wb/s1_top.v	(revision 10)
@@ -180,5 +180,5 @@
 
   );
-
+/*
   sparc sparc_1 (
 
@@ -230,5 +230,5 @@
 
   );
-
+*/
   /*
    * SPARC Core to Wishbone Master bridge
@@ -240,5 +240,6 @@
 wire [144:0] fp_cpx;
 
-os2wb_dual os2wb_inst (
+//os2wb_dual os2wb_inst (
+os2wb os2wb_inst (
     .clk(sys_clock_i), 
     .rstn(~sys_reset_final), 
@@ -251,10 +252,10 @@
     .cpx_packet(cpx_spc_data_cx2), 
 	 
-    .pcx1_req(spc1_pcx_req_pq), 
-    .pcx1_atom(spc1_pcx_atom_pq), 
-    .pcx1_data(spc1_pcx_data_pa), 
-    .pcx1_grant(pcx1_spc_grant_px), 
-    .cpx1_ready(cpx1_spc_data_rdy_cx2), 
-    .cpx1_packet(cpx1_spc_data_cx2), 
+    //.pcx1_req(spc1_pcx_req_pq), 
+    //.pcx1_atom(spc1_pcx_atom_pq), 
+    //.pcx1_data(spc1_pcx_data_pa), 
+    //.pcx1_grant(pcx1_spc_grant_px), 
+    //.cpx1_ready(cpx1_spc_data_rdy_cx2), 
+    //.cpx1_packet(cpx1_spc_data_cx2), 
 
     .wb_data_i(wbm_data_i), 
