OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openrisc/trunk
    from Rev 414 to Rev 415
    Reverse comparison

Rev 414 → Rev 415

/orpsocv2/bench/verilog/eth_phy.v
1306,10 → 1306,12
smii_rx_len = len;
smii_rx_go = 1;
send_mii_rx_packet(preamble_data, preamble_len, sfd_data, start_addr, len, plus_drible_nibble,
assert_rx_err);
send_mii_rx_packet(preamble_data, preamble_len, sfd_data, start_addr,
len, plus_drible_nibble, assert_rx_err);
`ifdef SMII0
while(smii_rx_go)
@(posedge smii_clk_i);
`endif
end
endtask // send_rx_packet
1347,7 → 1349,8
rx_mem_addr_in = start_addr;
// send preamble
for (rx_cnt = 0; (rx_cnt < (preamble_len << 1)) && (rx_cnt < 16); rx_cnt = rx_cnt + 1)
for (rx_cnt = 0; (rx_cnt < (preamble_len << 1)) && (rx_cnt < 16);
rx_cnt = rx_cnt + 1)
begin
#1 mrxd_o = preamble_data[3:0];
#1 preamble_data = preamble_data >> 4;
1373,8 → 1376,9
@(posedge mrx_clk_o);
#1;
// Assert error if told to .... TODO: make this occur at random time
// jb
// Assert error if told to .... TODO: make this occur at random
// time - JPB
if (rx_cnt > 18) rx_err(assert_rx_err);
mrxd_o = rx_mem_data_out[7:4];
/orpsocv2/bench/verilog/or1200_monitor.v
35,11 → 35,21
`include "or1200_defines.v"
`include "orpsoc-testbench-defines.v"
`include "test-defines.v"
 
//
// Top of TB
//
`define TB_TOP orpsoc_testbench
//
// Top of DUT
//
`define DUT_TOP `TB_TOP.dut
//
// Top of OR1200 inside test bench
//
`define OR1200_TOP orpsoc_testbench.dut.or1200_top0
`define OR1200_TOP `DUT_TOP.or1200_top0
 
//
// Define to enable lookup file generation
72,6 → 82,12
`endif
 
//
// Memory coherence checking (double check instruction in fetch stage against
// what is in memory.)
//
//`define MEM_COHERENCE_CHECK
 
//
// Top of OR1200 inside test bench
//
`define CPU or1200
438,8 → 454,19
end
 
 
`ifdef RAM_WB
`define RAM_WB_TOP `DUT_TOP.wb_ram_b3_0
task get_insn_from_wb_ram;
input [31:0] addr;
output [31:0] insn;
begin
insn = `RAM_WB_TOP.mem[addr[31:2]];
end
endtask // get_insn_from_wb_ram
`endif
`ifdef VERSATILE_SDRAM
`define SDRAM_TOP orpsoc_testbench.sdram0
`define SDRAM_TOP `TB_TOP.sdram0
// Bit selects to define the bank
// 32 MB part with 4 banks
`define SDRAM_BANK_SEL_BITS 24:23
465,15 → 492,17
`endif // `ifdef VERSATILE_SDRAM
 
`ifdef XILINX_DDR2
`define DDR2_TOP orpsoc_testbench.gen_cs[0]
`define DDR2_TOP `TB_TOP.gen_cs[0]
// Gets instruction word from correct bank
task get_insn_from_xilinx_ddr2;
input [31:0] addr;
output [31:0] insn;
reg [16*8-1:0] ddr2_array_line0,ddr2_array_line1,ddr2_array_line2,ddr2_array_line3;
reg [16*8-1:0] ddr2_array_line0,ddr2_array_line1,ddr2_array_line2,
ddr2_array_line3;
integer word_in_line_num;
begin
// Get our 4 128-bit chunks (8 half-words in each!! Confused yet?), 16 words total
// Get our 4 128-bit chunks (8 half-words in each!! Confused yet?),
// 16 words total
`DDR2_TOP.gen[0].u_mem0.memory_read(addr[28:27],addr[26:13],{addr[12:6],3'd0},ddr2_array_line0);
`DDR2_TOP.gen[1].u_mem0.memory_read(addr[28:27],addr[26:13],{addr[12:6],3'd0},ddr2_array_line1);
`DDR2_TOP.gen[2].u_mem0.memory_read(addr[28:27],addr[26:13],{addr[12:6],3'd0},ddr2_array_line2);
578,7 → 607,11
`ifdef XILINX_DDR2
4'h0:
get_insn_from_xilinx_ddr2(id_pc, insn);
`endif
`endif
`ifdef RAM_WB
4'h0:
get_insn_from_wb_ram(id_pc, insn);
`endif
4'hf:
// Flash isn't stored in a memory, it's an FSM so just skip/ignore
insn = `OR1200_TOP.`CPU_cpu.`CPU_ctrl.id_insn;
596,9 → 629,9
reg [31:0] last_addr = 0;
reg [31:0] last_mem_word;
 
//`define TRIGGER_FOR_CHECK (`OR1200_TOP.`CPU_cpu.`CPU_ctrl.id_void === 1'b0)
// Disabled:
`define TRIGGER_FOR_CHECK 0
`ifdef MEM_COHERENCE_CHECK
`define MEM_COHERENCE_TRIGGER (`OR1200_TOP.`CPU_cpu.`CPU_ctrl.id_void === 1'b0)
 
`define INSN_TO_CHECK `OR1200_TOP.`CPU_cpu.`CPU_ctrl.id_insn
`define PC_TO_CHECK `OR1200_TOP.`CPU_cpu.`CPU_except.id_pc
605,7 → 638,7
// Check instruction in decode stage is what is in the RAM
always @(posedge `OR1200_TOP.`CPU_cpu.`CPU_ctrl.clk)
begin
if (`TRIGGER_FOR_CHECK)
if (`MEM_COHERENCE_TRIGGER)
begin
// Check if it's a new PC - will also get triggered if the
// instruction has changed since we last checked it
631,8 → 664,9
end
end // always @ (posedge `OR1200_TOP.`CPU_cpu.`CPU_ctrl.clk)
`endif // `ifdef MEM_COHERENCE_CHECK
 
 
/////////////////////////////////////////////////////////////////////////
// Instruction decode task
/////////////////////////////////////////////////////////////////////////
/orpsocv2/rtl/verilog/include/orpsoc-defines.v
40,6 → 40,7
// Included modules: define to include
`define JTAG_DEBUG
`define UART0
`define RAM_WB
 
// end of included module defines - keep this comment line here
 
/orpsocv2/rtl/verilog/or1200/or1200_immu_top.v
3,7 → 3,7
//// OR1200's Instruction MMU top level ////
//// ////
//// This file is part of the OpenRISC 1200 project ////
//// http://www.opencores.org/cores/or1k/ ////
//// http://www.opencores.org/project,or1k ////
//// ////
//// Description ////
//// Instantiation of all IMMU blocks. ////
40,81 → 40,6
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
//
// CVS Revision History
//
// $Log: or1200_immu_top.v,v $
// Revision 2.0 2010/06/30 11:00:00 ORSoC
// Major update:
// Structure reordered and bugs fixed.
//
// Revision 1.15 2004/06/08 18:17:36 lampret
// Non-functional changes. Coding style fixes.
//
// Revision 1.14 2004/04/05 08:29:57 lampret
// Merged branch_qmem into main tree.
//
// Revision 1.12.4.2 2003/12/09 11:46:48 simons
// Mbist nameing changed, Artisan ram instance signal names fixed, some synthesis waning fixed.
//
// Revision 1.12.4.1 2003/07/08 15:36:37 lampret
// Added embedded memory QMEM.
//
// Revision 1.12 2003/06/06 02:54:47 lampret
// When OR1200_NO_IMMU and OR1200_NO_IC are not both defined or undefined at the same time, results in a IC bug. Fixed.
//
// Revision 1.11 2002/10/17 20:04:40 lampret
// Added BIST scan. Special VS RAMs need to be used to implement BIST.
//
// Revision 1.10 2002/09/16 03:08:56 lampret
// Disabled cache inhibit atttribute.
//
// Revision 1.9 2002/08/18 19:54:17 lampret
// Added store buffer.
//
// Revision 1.8 2002/08/14 06:23:50 lampret
// Disabled ITLB translation when 1) doing access to ITLB SPRs or 2) crossing page. This modification was tested only with parts of IMMU test - remaining test cases needs to be run.
//
// Revision 1.7 2002/08/12 05:31:30 lampret
// Delayed external access at page crossing.
//
// Revision 1.6 2002/03/29 15:16:56 lampret
// Some of the warnings fixed.
//
// Revision 1.5 2002/02/11 04:33:17 lampret
// Speed optimizations (removed duplicate _cyc_ and _stb_). Fixed D/IMMU cache-inhibit attr.
//
// Revision 1.4 2002/02/01 19:56:54 lampret
// Fixed combinational loops.
//
// Revision 1.3 2002/01/28 01:16:00 lampret
// Changed 'void' nop-ops instead of insn[0] to use insn[16]. Debug unit stalls the tick timer. Prepared new flag generation for add and and insns. Blocked DC/IC while they are turned off. Fixed I/D MMU SPRs layout except WAYs. TODO: smart IC invalidate, l.j 2 and TLB ways.
//
// Revision 1.2 2002/01/14 06:18:22 lampret
// Fixed mem2reg bug in FAST implementation. Updated debug unit to work with new genpc/if.
//
// Revision 1.1 2002/01/03 08:16:15 lampret
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
//
// Revision 1.6 2001/10/21 17:57:16 lampret
// Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF.
//
// Revision 1.5 2001/10/14 13:12:09 lampret
// MP3 version.
//
// Revision 1.1.1.1 2001/10/06 10:18:36 igorm
// no message
//
// Revision 1.1 2001/08/17 08:03:35 lampret
// *** empty log message ***
//
// Revision 1.2 2001/07/22 03:31:53 lampret
// Fixed RAM's oen bug. Cache bypass under development.
//
// Revision 1.1 2001/07/20 00:46:03 lampret
// Development version of RTL. Libraries are missing.
//
//
 
// synopsys translate_off
`include "timescale.v"
254,27 → 179,35
always @(`OR1200_RST_EVENT rst or posedge clk)
// default value
if (rst == `OR1200_RST_VALUE) begin
// select async. value due to reset state
icpu_adr_default <= 32'h0000_0100;
icpu_adr_select <= 1'b1; // select async. value due to reset state
icpu_adr_select <= 1'b1;
end
// selected value (different from default) is written into FF after reset state
// selected value (different from default) is written
// into FF after reset state
else if (icpu_adr_select) begin
icpu_adr_default <= icpu_adr_boot; // dynamic value can only be assigned to FF out of reset!
icpu_adr_select <= 1'b0; // select FF value
// dynamic value can only be assigned to FF out of reset!
icpu_adr_default <= icpu_adr_boot;
// select FF value
icpu_adr_select <= 1'b0;
end
else begin
icpu_adr_default <= icpu_adr_i;
end
 
// select async. value for boot address after reset - PC jumps to the address selected after boot!
//assign icpu_adr_boot = {(boot_adr_sel_i ? `OR1200_EXCEPT_EPH1_P : `OR1200_EXCEPT_EPH0_P), 12'h100} ;
// select async. value for boot address after reset - PC jumps to the address
// selected after boot!
//assign icpu_adr_boot = {(boot_adr_sel_i ? `OR1200_EXCEPT_EPH1_P :
// `OR1200_EXCEPT_EPH0_P), 12'h100} ;
assign icpu_adr_boot = `OR1200_BOOT_ADR; // jb
 
always @(icpu_adr_boot or icpu_adr_default or icpu_adr_select)
if (icpu_adr_select)
icpu_adr_o = icpu_adr_boot ; // async. value is selected due to reset state
// async. value is selected due to reset state
icpu_adr_o = icpu_adr_boot ;
else
icpu_adr_o = icpu_adr_default ; // FF value is selected 2nd clock after reset state
// FF value is selected 2nd clock after reset state
icpu_adr_o = icpu_adr_default ;
`else
Unsupported !!!
`endif
/orpsocv2/rtl/verilog/or1200/or1200_ic_top.v
1,6 → 1,6
//////////////////////////////////////////////////////////////////////
//// ////
//// OR1200's Data Cache top level ////
//// OR1200's Instruction Cache top level ////
//// ////
//// This file is part of the OpenRISC 1200 project ////
//// http://opencores.org/project,or1k ////
51,7 → 51,7
`include "or1200_defines.v"
 
//
// Data cache
// Instruction cache top
//
module or1200_ic_top(
// Rst, clk and clock control
58,13 → 58,12
clk, rst,
 
// External i/f
icbiu_dat_o, icbiu_adr_o, icbiu_cyc_o, icbiu_stb_o, icbiu_we_o, icbiu_sel_o, icbiu_cab_o,
icbiu_dat_i, icbiu_ack_i, icbiu_err_i,
icbiu_dat_o, icbiu_adr_o, icbiu_cyc_o, icbiu_stb_o, icbiu_we_o,
icbiu_sel_o, icbiu_cab_o, icbiu_dat_i, icbiu_ack_i, icbiu_err_i,
 
// Internal i/f
ic_en,
icqmem_adr_i, icqmem_cycstb_i, icqmem_ci_i,
icqmem_sel_i, icqmem_tag_i,
icqmem_adr_i, icqmem_cycstb_i, icqmem_ci_i, icqmem_sel_i, icqmem_tag_i,
icqmem_dat_o, icqmem_ack_o, icqmem_rty_o, icqmem_err_o, icqmem_tag_o,
 
`ifdef OR1200_BIST
145,7 → 144,9
wire ictag_we;
wire [31:0] ic_addr;
wire icfsm_biu_read;
/* verilator lint_off UNOPTFLAT */
reg tagcomp_miss;
/* verilator lint_on UNOPTFLAT */
wire [`OR1200_ICINDXH:`OR1200_ICLS] ictag_addr;
wire ictag_en;
wire ictag_v;
155,6 → 156,8
wire icfsm_first_miss_err;
wire icfsm_burst;
wire icfsm_tag_we;
reg ic_inv_q;
`ifdef OR1200_BIST
//
// RAM BIST
217,13 → 220,25
assign icqmem_dat_o = icfsm_first_miss_ack | !ic_en ? icbiu_dat_i : from_icram;
 
//
// Detect falling edge of IC invalidate signal
//
always @(posedge clk or `OR1200_RST_EVENT rst)
if (rst==`OR1200_RST_VALUE)
ic_inv_q <= 1'b0;
else
ic_inv_q <= ic_inv;
//
// Tag comparison
//
// During line invalidate, ensure it stays the same
// /* TODO - do this properly! */
always @(tag or saved_addr or tag_v) begin
if ((tag != saved_addr[31:`OR1200_ICTAGL]) || !tag_v)
tagcomp_miss = 1'b1;
else
tagcomp_miss = 1'b0;
if ((tag != saved_addr[31:`OR1200_ICTAGL]) | !tag_v)
tagcomp_miss = (ic_inv | ic_inv_q) ? tagcomp_miss : 1'b1;
else
tagcomp_miss = (ic_inv | ic_inv_q) ? tagcomp_miss : 1'b0;
end
 
//
/orpsocv2/rtl/verilog/or1200/or1200_ic_fsm.v
58,7 → 58,7
`define OR1200_ICFSM_IFETCH 2'd3
 
//
// Data cache FSM for cache line of 16 bytes (4x singleword)
// Instruction cache FSM
//
 
module or1200_ic_fsm(
67,9 → 67,13
 
// Internal i/f to top level IC
ic_en, icqmem_cycstb_i, icqmem_ci_i,
tagcomp_miss, biudata_valid, biudata_error, start_addr, saved_addr,
icram_we, biu_read, first_hit_ack, first_miss_ack, first_miss_err,
burst, tag_we
tagcomp_miss,
biudata_valid, biudata_error,
start_addr, saved_addr,
icram_we, tag_we,
biu_read,
first_hit_ack, first_miss_ack, first_miss_err,
burst
);
 
//
102,7 → 106,7
reg hitmiss_eval;
reg load;
reg cache_inhibit;
reg waiting_for_first_fill_ack; // JPB
reg last_eval_miss; // JPB
//
// Generate of ICRAM write enables
145,7 → 149,7
load <= 1'b0;
cnt <= 3'b000;
cache_inhibit <= 1'b0;
waiting_for_first_fill_ack <= 0; // JPB
last_eval_miss <= 0; // JPB
end
else
157,7 → 161,7
hitmiss_eval <= 1'b1;
load <= 1'b1;
cache_inhibit <= icqmem_ci_i;
waiting_for_first_fill_ack <= 0; // JPB
last_eval_miss <= 0; // JPB
end
else begin // idle
hitmiss_eval <= 1'b0;
182,9 → 186,8
hitmiss_eval <= 1'b0;
load <= 1'b0;
cache_inhibit <= 1'b0;
waiting_for_first_fill_ack <= 0;
end // if ((!ic_en) ||...
// fetch missed, finish current external fetch and refill
// fetch missed, wait for first fetch and continue filling line
else if (tagcomp_miss & biudata_valid) begin
state <= `OR1200_ICFSM_LREFILL3;
saved_addr_r[3:2] <= saved_addr_r[3:2] + 1'd1;
191,22 → 194,18
hitmiss_eval <= 1'b0;
cnt <= `OR1200_ICLS-2;
cache_inhibit <= 1'b0;
waiting_for_first_fill_ack <= 0; // JPB
end
// fetch aborted (usually caused by exception)
else if (!icqmem_cycstb_i) begin
else if (!icqmem_cycstb_i
& !last_eval_miss // JPB
) begin
state <= `OR1200_ICFSM_IDLE;
hitmiss_eval <= 1'b0;
load <= 1'b0;
cache_inhibit <= 1'b0;
waiting_for_first_fill_ack <= 0; // JPB
end
// fetch hit, finish immediately
else if (!tagcomp_miss & !icqmem_ci_i &
!waiting_for_first_fill_ack) begin
state <= `OR1200_ICFSM_IDLE; // JPB
load <= 1'b0; // JPB
hitmiss_eval <= 1'b0; // JPB
// fetch hit, wait in this state for now
else if (!tagcomp_miss & !icqmem_ci_i) begin
saved_addr_r <= start_addr;
cache_inhibit <= 1'b0;
end
213,8 → 212,8
else // fetch in-progress
hitmiss_eval <= 1'b0;
 
if (hitmiss_eval & tagcomp_miss) // JPB
waiting_for_first_fill_ack <= 1;
if (hitmiss_eval & !tagcomp_miss) // JPB
last_eval_miss <= 1; // JPB
end
`OR1200_ICFSM_LREFILL3 : begin
/orpsocv2/rtl/verilog/orpsoc_top/orpsoc_top.v
688,6 → 688,7
////////////////////////////////////////////////////////////////////////
 
`ifdef RAM_WB
////////////////////////////////////////////////////////////////////////
//
// Generic main RAM
807,7 → 808,7
.wb_rst_i (wb_rst));
////////////////////////////////////////////////////////////////////////
`endif
`ifdef UART0
////////////////////////////////////////////////////////////////////////
//
/orpsocv2/doc/orpsoc.texi
61,6 → 61,7
* Reference Design::
* Board Designs::
* ORDB1A3PE1500::
* ML501::
* GNU Free Documentation License:: The license for this documentation
* Index::
@end menu
70,7 → 71,7
 
@cindex introduction to this @value{ORPSOC}
 
@value{ORPSOC} is intended to be a reference implementation of processors in the OpenRISC family. It provides a smallest-possible reference system, primarily for testing of the processors, and systems intended to be synthesized and run on physical hardware (boards.) The simple refernce system contains just enough to test the processor's functionality, whereas the board targeted builds will include many additional peripherals.
@value{ORPSOC} is intended to be a reference implementation of processors in the OpenRISC family. It provides a smallest-possible reference system, primarily for testing of the processors, and systems intended to be synthesized and run on physical hardware (boards.) The simple reference system contains just enough to test the processor's functionality, whereas the board targeted builds will include many additional peripherals.
 
The reference design will contain a minimal set of resources to create an OpenRISC-based SoC. It is expected the board builds will contain their own set of peripheral modules and software, and still draw upon the resources available in the reference implementation. It is hoped that, with this structure, the project can serve dual roles; to be a development platform for OpenRISC family processors, and to provide a platform for development of complex OpenRISC-based systems on chip.
 
97,7 → 98,7
 
The @value{ORPSOC} project is intended for dual uses. One is to act as a development platform for OpenRISC processors, as well as development of complex OpenRISC-based SoCs. Organising a single project to satisfy these requirements can lead to some confusion. This section is intended to make the organisation of the project clear.
 
In essense, the reference implementation based in the root of the project contains enough to get a simple OpenRISC-based SoC together, the board builds are intended to implement fully-featured systems. The project is organised in such a way that the board builds can use both the reference implementation's RTL and software, as well as its own set of RTL and software. The reference implementation, however, cannot use any board's modules, software or scripts.
In essence, the reference implementation based in the root of the project contains enough to get a simple OpenRISC-based SoC together, the board builds are intended to implement fully-featured systems. The project is organised in such a way that the board builds can use both the reference implementation's RTL and software, as well as its own set of RTL and software. The reference implementation, however, cannot use any board's modules, software or scripts.
 
The following sections outline the organisation of the software, RTL, and board designs.
 
177,7 → 178,7
 
Performing the installation of tools required to design, simulate, verify, compile and debug a SoC is not for the faint hearted. The various sets of tools must be first installed, and the user's environment configured to allow them to run correctly.
 
First the host system must be capable of building and running development tools, next the various compilers, simulators and utilities must be installed, and finally, if required, additional tools to interact with the built design are installed. Once complete, the set up rarely needs to be touched, and results in grealty improved productivity.
First the host system must be capable of building and running development tools, next the various compilers, simulators and utilities must be installed, and finally, if required, additional tools to interact with the built design are installed. Once complete, the set up rarely needs to be touched, and results in greatly improved productivity.
 
The required tools can be divided into four groups.
 
224,7 → 225,7
 
The reference design included in @value{ORPSOC} is intended to be the minimal implementation (or thereabouts) of a SoC required to exercise an OpenRISC processor. In this regard, very little apart from the processor, memory, debug interface and interconnect modules are instantiated.
 
The primary role for this design is to implement a system that an OpenRISC processor can be instaniated in for for development purposes. The automated testing mechanism, capable of compiling, executing and checking software on the design, is used as a method of regression testing for the processor as it is developed. After features are added or modified in the processor, new software tests can be added to the existing suite, checking for the expected functionality and ensuring legacy behavior is also unchanged.
The primary role for this design is to implement a system that an OpenRISC processor can be instantiated in for for development purposes. The automated testing mechanism, capable of compiling, executing and checking software on the design, is used as a method of regression testing for the processor as it is developed. After features are added or modified in the processor, new software tests can be added to the existing suite, checking for the expected functionality and ensuring legacy behavior is also unchanged.
 
The design can be simulated two ways. The first uses the standard event-driven simulators such as Icarus Verilog and Mentor Graphics' Modelsim. The second method involves creating a cycle accurate (C or SystemC) model from the Verilog HDL description using the Verilator tool.
 
471,7 → 472,7
@subsubsection Results
@cindex output from simulation of reference design
 
The following files are generted from the event driven simulation. For output options of the cycle accurate model, see the section on Cycle Accurate Model Executable Usage.
The following files are generated from the event driven simulation. For output options of the cycle accurate model, see the section on Cycle Accurate Model Executable Usage.
 
@subsubheading Processor Execution Trace
 
537,7 → 538,7
 
This board port of ORPSoC implements an example of a configurable system, with many cores that can be enabled or disabled as required by the expansion board's capabilities.
 
The port was mainly developed with the ORSoC ethernet expansion board (OREEB1), and was used with the OpenRISC port of the Linux kernel and BusyBox suite running network applications.
The port was mainly developed with the ORSoC Ethernet expansion board (OREEB1), and was used with the OpenRISC port of the Linux kernel and BusyBox suite running network applications.
 
This guide will overview how to simulation, synthesize and customise the system.
 
685,7 → 686,7
@itemize @bullet
@item bootrom.v
 
If the bootROM module is being used to provide the processor with a progrm at startup, check that board software include file, in the board's @code{sw/board/include} path, is selecting the correct bootROM program.
If the bootROM module is being used to provide the processor with a program at startup, check that board software include file, in the board's @code{sw/board/include} path, is selecting the correct bootROM program.
 
Do a @kbd{make clean-all} from the synthesis run directory to be sure that the previous bootROM file is cleared away and regenerated when synthesis is run.
 
713,12 → 714,12
 
This will create a @code{.adb} file in the same path.
 
All steps, up to programming file generation are done here. This is mainly a licensing thing (free liceneses for Libero under Linux @emph{do not} allow programming file generation - they do, however, under Windows.)
All steps, up to programming file generation are done here. This is mainly a licensing thing (free licenses for Libero under Linux @emph{do not} allow programming file generation - they do, however, under Windows.)
 
@node ORDB1A3PE1500 Place and route options
@subsubsection Options
 
Most of the design's parameters are deteremined by processing the @code{orpsoc-defines.v} file and determining, for example, the frequency of the clocks entering the design.
Most of the design's parameters are determined by processing the @code{orpsoc-defines.v} file and determining, for example, the frequency of the clocks entering the design.
 
The following can be passed as environment variables when running @kbd{make all}.
 
797,7 → 798,7
 
The design relies on the Verilog HDL @emph{define} function to indicate which modules are included.
 
There are only a few modules included by deafult.
There are only a few modules included by default.
 
@itemize @bullet
@item Processor - @emph{or1200}
809,7 → 810,7
 
Inspect that file to see which modules are able to be included. At present the list includes USB 1.1 host controller and/or slave interface, I2C master/slave core, and SPI master cores.
 
These cores should be supported and ready to go by just defining them (uncommont in the @code{orspco-defines.v} file.)
These cores should be supported and ready to go by just defining them (uncomment in the @code{orspco-defines.v} file.)
 
@node ORDB1A3PE1500 Customising Adding Modules
@subsubsection Adding RTL Modules
850,11 → 851,11
 
@item Update Backend Scripts
 
If any I/O is added, or special timing specified, the board's backend main Makefile, @code{backend/par/bin/Makefile} and pinout files (in @code{backend/par/bin} wll need to be updated.
If any I/O is added, or special timing specified, the board's backend main Makefile, @code{backend/par/bin/Makefile} and pinout files (in @code{backend/par/bin} will need to be updated.
 
The section in @code{backend/par/bin/Makefile} mapping signals to Makefile variables will need to have these new signals added to them. The section in the file begins with @code{$(PDC_FILE):} and is actually a set of long bash lines.
 
Continuing the format already there should be easy enough. Rememeber that the @code{orspoc-defines.v} file is parsed and it's possible to tell if the module is included by testing if the variable is defined.
Continuing the format already there should be easy enough. Remember that the @code{orspoc-defines.v} file is parsed and it's possible to tell if the module is included by testing if the variable is defined.
 
For example, to add I/Os for a module called @code{foo}, and in @code{orpsoc-defines.v} a value @code{FOO1} is defined, we can add I/Os @code{foo1_srx_i} and @code{foo1_tx_o[3:0]} with the following.
 
884,7 → 885,7
 
The values of the bus settings variables depend on the desired I/O standards and other examples in the Makefile can be referenced.
 
The pin numbers need to be set in the @code{.mkpinassigns} which is included intot he Makefile (according to the @code{BOARD_CONFIG} variable set when running the @code{make} command.)
The pin numbers need to be set in the @code{.mkpinassigns} which is included into the Makefile (according to the @code{BOARD_CONFIG} variable set when running the @code{make} command.)
 
These files are simple assignments of values to variables (and potentially then to other variables) which correspond to the variables finally used in the main Makefile.
 
892,10 → 893,423
 
@end itemize
 
@c ****************************************************************************
@c ML501 board build chapter
@c ****************************************************************************
 
@node ML501
@chapter ML501
@cindex ML501 board build information
 
@menu
* Overview::
* Structure::
* Tools::
* Simulating::
* Synthesis and Backend::
* Programming File Generation::
* Customising::
* Running And Debugging Software::
@end menu
 
@node ML501 Overview
@subsection Overview
 
The Xilinx ML501 board contains a Virtex LX50 part, varied memories and peripherals. See Xilinx's site for specific details:
 
http://www.xilinx.com/products/devkits/HW-V5-ML501-UNI-G.htm
 
Not all peripherals are supported, and adding support for each is a goal.
 
At present the build contains a memory controller for the DDR2 SDRAM (based around a Xilinx MIG derived controller) and SSRAM. None of the other peripherals (VGA/AC97/PS2/USB/LCD) have controllers in the design yet.
 
The OpenCores 10/100 Ethernet MAC can be used for Ethernet, but still has some bugs to do with memory access, although it appears to be using the RGMII interface to the 10/10/1000 PHY on the ML501 OK.
 
The project is configured to generate either a @code{.bit} file for direct programming via JTAG, or a @code{.mcs} file with inbuilt bootloader software for the processor, meaning the board can be powered up and an application like ORPmon loaded without having to reprogram it from iMPACT between power cycles.
 
This guide is far from complete, but provides the basics on running simulations, and building the design.
 
@node ML501 Structure
@subsection Structure
 
Note that in this chapter the term @emph{board path} refers to the path in the project for this board port; @code{boards/xilinx/ml501}.
 
The board port's structure is similar to that of a standalone project which accords with the OpenCores coding guidelines. However, all software and RTL that is available in the reference design is also available to the board port, with any local (ie. in the board's @code{rtl} or @code{sw} paths) versions taking precedence over the versions available in the reference design.
 
The Verilog RTL specific to this board is under @code{rtl/verilog} in the board path. The @code{include} path in there is the place where all required definitions files, configuring the RTL, are found.
 
Backend files, mainly binary NGC files for mapping, are found in the board's @code{backend/bin} path.
 
Be sure to set the environment variable @code{XILINX_PATH} to the path of the ISE path on the host machine. This can be done with something like @kbd{export XILINX_PATH=/software/xilinx_11.1/ISE} and additionally a symbolic link to the Verilog simulation library sources will be required - see the simulation section on this. Note that it helps to add the @code{XILINX_PATH} variable to the user's @code{.bashrc} script or similar to save setting it each time a new shell is opened.
 
If the @code{XILINX_PATH} variable is not set correctly, the makefiles will not run.
 
@node ML501 Tools
@subsection Tools
 
@menu
* Host Tools::
* Target System Tools::
* EDA Tools::
* Debug Tools::
@end menu
 
@node ML501 Host Tools
@subsubsection Host Tools
@cindex host tools required ML501
 
Standard development suite of tools: gcc, make, etc.
 
@node ML501 Target System Tools
@subsubsection Target System Tools
@cindex target system tools required ML501
 
OpenRISC GNU toolchain. For installation, see OpenRISC GNU toolchain page on OpenCores.org.
 
@node ML501 EDA Tools
@subsubsection EDA Tools
@cindex EDA tools required ML501
 
RTL, gatelevel simulation: Mentor Graphics' Modelsim
Synthesis: XST (from Xilinx ISE)
Backend: ngdbuild/map/par/bitgen/promgen, etc. (from Xilinx ISE)
Programming: iMPACT (from Xilinx ISE)
 
This has been developed with Xilinx ISE 11.1 under Linux.
 
 
@node ML501 Debug Tools
@subsubsection Debug Tools
@cindex Debug tools required ML501
 
or_debug_proxy, ORPmon
 
@node ML501 Simulating
@subsection Simulating
@cindex simulating ML501
 
@node ML501 Xilinx Source Directory
@subsubsection Setup Link To Xilinx Simulation Library Directory
 
The Xilinx simulation library is too big to include in this project, and is installed with ISE, which is required to run this project. The simplest way to get access to it is to create a @emph{symbolic link} to it.
 
A link must be made in the board's @code{backend/rtl} path to ISE's @code{verilog} path.
 
If the @code{XILINX_PATH} environment variable is set, this is very easy to do in the board's @code{backend/rtl} path:
 
@example
@kbd{ln -s $XILINX_PATH/verilog verilog}
@end example
 
Note that if this path is not set, simulations will be unable to compile.
 
@subsubheading Run RTL Regression Test
 
To run the default set of regression tests for the build, run the following command in the board's @code{sw/run} path.
 
@example
@kbd{make rtl-tests}
@end example
 
The same set of options for RTL tests available in the reference design should available in this build. @xref{Running A Set Of Specific Reference Design RTL Tests}.
 
Options specific to the ML501 build.
 
@table @code
 
@item PRELOAD_RAM
Set to '1' to enable loading of the software image into RAM at the beginning of simulation.
 
If the chosen bootROM program (set via a define in software header file in the board's @code{sw/board/include} path) will jump straight to RAM to begin execution, then the software image will need to be in RAM for the simulation to work. This define @emph{must} be used in that case for the simulation to do anything.
 
 
@end table
 
 
 
@node ML501 Synthesis
@subsection Synthesis
 
Synthesis of the board port for the Actel technology with the Synplify tool can be run in the board's @code{syn/xst/run} path with the following command.
 
@example
@kbd{make all}
@end example
 
This will create an NGC file in @code{syn/xst/run} named @code{orpsoc.ngc}.
 
Hopefully it's all automated enough so that, as long as the design is simulating as desired, the correct set of RTL will be picked up and synthesized without any need for customising scripts for the tool.
 
@node ML501 Synthesis Options
@subsubsection Options
 
Use the following command int the @code{syn/xst/run} path to get a list of the variables used during synthesis. Any can be set on the command line when running @code{make all}.
 
@example
@kbd{make print-config}
@end example
 
 
@node ML501 Synthesis Warnings
@subsubsection Checks
 
The following is a list of some considerations before synthesis.
 
@itemize @bullet
@item bootrom.v
 
If the bootROM module is being used to provide the processor with a program at startup (reset address in processor's define file is set to @code{0xf0000100} or similar), check that board software include file, in the board's @code{sw/board/include} path, is selecting the correct bootROM program.
 
Do a @kbd{make clean-all} from the synthesis run directory to be sure that the previous bootROM file is cleared away and regenerated when synthesis is run.
 
 
@item Clean away old leftovers
 
If the unwanted files from an old synthesis run are still there before the next run, it's best to clean them away with @kbd{make clean} from the synthesis run directory.
 
 
 
@end itemize
 
@node ML501 Synthesised Netlist
@subsubsection Netlist generation
 
To create a Verilog HDL netlist of the post-synthesis design, run the following in the board's @code{syn/xst/run} path.
 
@example
@kbd{make orpsoc.v}
@end example
 
@node ML501 Place and Route
@subsection Place and Route
 
Place and route of the design can be run from the board's @code{backend/par/run} path with the following command.
 
@example
@kbd{make orpsoc.ncd}
@end example
 
@node ML501 Timing Report
@subsection Post-PAR STA Report
 
The @code{trce} tool can be used to generate a timing report of the post-place and route design.
 
@example
@kbd{make timingreport}
@end example
 
@node ML501 Back-annotated Netlist
@subsection Back-annotated Netlist
 
A post-PAR back-annotated netlist can be generated with the following command.
 
@example
@kbd{make netlist}
@end example
 
This will make a new directory under the board's @code{backend/par/run} path named @code{netlist} and will contain a Verilog netlist and SDF file with timing information.
 
 
@node ML501 Place and route options
@subsubsection Options
 
To get a list of options that can be set when running the backend flow, run the following in the board's @code{backend/par/run} path.
 
@example
@kbd{make print-config}
@end example
 
@node ML501 Constraints
@subsubsection Constraints
 
A Xilinx User Constraints File (UCF) file is in the board's @code{backend/par/bin} path. It is named @code{ml501.ucf}. It should be edited if any extra I/O or constraints are required.
 
Eventually it would be good to dynamically generated this, based on what is included in the design, but for now this must be hand modified if modules are added ore removed from the design.
 
@node ML501 Programming File Generation
@subsection Programming File Generation
 
Programming file generation is run from the board's @code{backend/par/run} path with the following command.
 
@example
@kbd{make orpsoc.bit}
@end example
 
This file can then be loaded into the Xilinx iMPACT program and programmed onto the Virtex 5 part on the ML501.
 
@node ML501 SPI programming file
@subsubsection SPI programming file generation
 
To generate a file, which can be programmed into the SPI flash on the board (and thus allowing the FPGA to be configured without using iMPACT each time) run the following command in the board's @code{backend/par/run} path.
 
@example
@kbd{make orpsoc.mcs}
@end example
 
@node ML501 SPI programming file with software
@subsubsection SPI programming file generation with software
 
To generate a file, which can be programmed into the SPI flash on the board (and thus allowing the FPGA to be configured without using iMPACT each time) and also has a bootloader the processor can run (such as ORPmon) run the following command in the board's @code{backend/par/run} path.
 
@example
@kbd{make orpsoc.mcs BOOTLOADER_BIN=/path/to/bootloader-binary-file.bin}
@end example
 
The image is allowed to be up to 256KBytes in size.
 
As the SPI flash on the ML501 is only 2MBytes in size, and the FPGA configuration image takes up almost 1.5MBytes, the final 256KBytes are reserved for a software image to be loaded at reset by the processor.
 
This mark (the last 256KBytes of memory) is at hex address @code{0x1c0000}. This value is passed to the @code{promgen} tool when creating the @code{.mcs} file, and is set in the board's @code{board.h} file so the embedded bootloader in the design knows which address to load from.
 
If changing the address of the bootloader, to accommodate a larger image for example, be sure to update the address in the @code{board.h} file and set the environment variable @code{SPI_BOOTLOADER_SW_OFFSET_HEX} to the hex address to embed the binary image at (hexadecimal value without the leading ``@code{0x}''.) Note that changing the address to load from in @code{board.h} will require the entire design is re synthesized.
 
The file pointed to by @code{BOOTLOADER_BIN} should be a binary image with the size of the image embedded in the first word.
 
The tool @code{bin2binsizeword} in ORPSoC's @code{sw/utils} path can add the sizeword to a binary image. A binary image is something created with the processor toolchains @code{objcopy -O binary} option. A tool like ORPmon is a good candidate for being embedded in the SPI flash as bootloader software - a binary image is automatically created when it's compiled, usually named @code{orpmon.or32.bin}. To embed that, it would simply need to be passed to the @code{bin2binsizeword} like the following:
 
@example
@kbd{bin2binsizeword /path/to/orpmon/orpmon.or32.bin orpmon-sizeword.bin}
@end example
 
This @code{orpmon-sizeword.bin} file should then be passed via the BOOTLOADER_BIN option when creating the @code{.mcs} file to embed it.
 
If once the FPGA configuration image, and a bootloader image is embedded in the SPI flash, the FPGA can be configured with ORPSoC and then the processor can load the bootloader (like ORPmon) with a single press of the board's @code{PROG} button. This makes developing on the board very easy.
 
@node ML501 SPI flash programming
@subsubsection SPI flash programming
 
For a guide on how to actually set up the ML501 board to program the SPI flash, see the section under ``@emph{My Own SPI Flash Image Demonstration}'' on page 26 of the Xilinx UG228 document, http://www.xilinx.com/support/documentation/boards_and_kits/ug228.pdf . Follow steps 1 to 4, and then 9 to 16, and supply the @code{.mcs} file generated here.
 
Be sure to set the @emph{CONFIG} switches to @code{00010101} (left-to-right when Xilinx logo in North-West of board) before attempting to program the SPI flash. The be sure to switch them back to @code{00000101} before attempting to boot the image.
 
Note that this will require fly-leads from the Xilinx programming cable to the the board. See page 6 of XAPP1053 for a picture of this for a @emph{different} board, but to get the idea: http://www.xilinx.com/support/documentation/application_notes/xapp1053.pdf .
 
Note that the other cable from the progammer (going to the JP1 header) @emph{must} be unplugged from the board before attempting to program the SPI flash.
 
Booting from the SPI flash to ORPmon prompt is about 3 to 4 seconds.
 
 
@node ML501 Customising
@subsection Customising
 
The large amount of peripherals on the ML501 means that things will want to be added or removed to suit the design.
 
The following sections have information on how to configure the design.
 
@node ML501 Customising Enabling Existing Modules
@subsubsection Enabling Existing RTL Modules
 
The design relies on the Verilog HDL @emph{define} function to indicate which modules are included. See the board's @code{rtl/verilog/include/orpsoc-defines.v} file to determine which options are enabled by uncommented @code{`define} values.
 
These @code{`defines} will correspond to defines in the board's top level RTL file @code{boardpath/rtl/verilog/orpsoc_top/orpsoc_top.v}.
 
There are only a few modules included by default.
 
@itemize @bullet
@item Processor - @emph{or1200}
@item Clock and reset generation - @emph{clkgen}
@item Bus arbiters - @emph{arbiter_ibus}, @emph{arbiter_dbus}, @emph{arbiter_bytebus}
@end itemize
 
The rest are optional, depending on what is defined in the board's @code{rtl/verilog/include/orpsoc-defines.v} file.
 
@node ML501 Customising Adding Modules
@subsubsection Adding RTL Modules
 
There are a number of steps to take when adding a new module to the design.
 
@itemize @bullet
@item RTL Files
 
Create a directory under the board's @code{rtl/verilog} directory, and name it the same as the top level of the module.
 
Ensure the module's top level file and actual name of the module when it will be instantiated are @emph{all the same}.
 
Place any include files into the board's @code{rtl/verilog/include} path.
 
@item Instantiate in ORPSoC Top Level File
 
Instantiate the module in the ORPSoC top level file, @code{rtl/verilog/orpsoc_top/orpsoc_top.v}, and be sure to take care of the following.
@itemize @bullet
@item Create appropriate @emph{`define} in @code{orpsoc-defines.v} and surround module instantiation with it.
@item Add required I/Os (surrounded by appropriate @emph{`ifdef })
@item Attach to appropriate bus arbiter, declaring any signals required. Be sure to tie them off if modules is not included.
@item Update appropriate bus arbiter (in board's @code{rtl/verilog/arbiters} path) adding (uncommenting) additional ports as needed.
@item Update board's @code{rtl/verilog/include/orpsoc-params.v} file with appropriate set of parameters for new module, as well as arbiter memory mapping assignment.
@item Attach appropriate clocks and resets, modify the board's @code{rtl/verilog/clkgen/clkgen.v} file generating appropriate clocks if required.
@item Attach any interrupts to the processor's PIC vector in, assigned as the last thing in the file.
@end itemize
 
@item Update ORPSoC Testbench
 
Update the board's @code{bench/verilog/orpsoc_testbench.v} file with appropriate ports (surrounded by appropriate @emph{`ifdef}.)
 
Add any desired models to help test the module to the board's @code{bench/verilog} path and instantiate it correctly in the testbench.
 
@item Add Software Drivers and Tests
 
In a similar fashion to what is already in the board's @code{sw/drivers} and @code{sw/tests} path, create desired driver and test software to be used during simulation (and potentially on target.)
 
@item Update Backend Scripts
 
If any I/O is added, or special timing specified, the board's UCF file will need updating - see @code{boardpath/backend/par/bin/ml501.ucf}.
 
@end itemize
 
@node ML501 Running And Debugging Software
@subsection Running And Debugging Software
 
@node ML501 Debug Interface
@subsubsection Debug Interface
 
The debug interface uses a separate JTAG tap and some fly-leads must be connected from an @emph{ORSoC USB debugger} (http://opencores.com/shop,item,3) to the ML501.
 
From the USB debugger, a fly lead must take the following signals to the following pins on header J4 on the ML501.
 
@itemize @bullet
@item
tdo - HDR2_6
@item
tdi - HDR2_8
@item
tms - HDR2_10
@item
tck - HDR2_12
@end itemize
 
This corresponds to right-most column of pins on the J4 header, starting on the third row going down.
 
Supply and ground pins must also be hooked up for the USB debugger.
 
The left column of pins on J4 are all tied to ground. All pins on J7 (expansion header located adjacent to J4) are all tied to VCC2V5, 2.5V DC, and this is OK for supplying the buffers on the USB debug cable, and can be used. So essentially put the supply leads anywhere on J7 and ground leads anywhere on the left column of J4.
 
Once the debug interface is connected, the @code{or_debug_proxy} application can be used to provide a stub for GDB to connect to. See http://opencores.org/openrisc,debugging_physical for more information.
 
@node ML501 UART
@subsubsection UART
 
There are 2 ways of connecting to the UART in the design.
 
One is via the usual serial port connector, P3, on the ML501. This will obviously require a PC with a serial input and appropriate terminal application.
 
There is also a connection available via the USB debugger mentioned in the previous subsection.
 
The following pins are used for RX/TX to/from the design on header J4.
 
@itemize @bullet
@item
UART RX - HDR2_2
@item
UART TX - HDR2_4
@end itemize
 
Again, supply and ground leads for the UART drivers on the USB debugger can be sourced from J7/left-column J4 as per the debug interface subsection.
 
If both UART and debug interface are connected via the ORSoC USB debugger, this ultimately ends up witht he first 2 pins on the right column of J4 as RX/TX for the UART then the JTAG TDO, TDI, TMS and TCK in succession down the right column of J4.
 
See the ML501 schematic (http://www.xilinx.com/support/documentation/boards_and_kits/ml501_20061010_bw.pdf) for more details on these headers, and refer to the pinouts in the ML501 UCF, in the board's @code{backend/par/bin/ml501.ucf} file.
 
 
@c ****************************************************************************
@c End bits
@c ****************************************************************************
/orpsocv2/sw/utils/bin2hex.c
64,6 → 64,7
int filename_index=1;
int bytes_per_line=1;
int bytes_per_line_index=2;
int padding = 0;
unsigned int image_size;
 
if(argc < 3) {
74,16 → 75,42
fprintf(stderr,"\tOptionally specify the option -size_word to output,\n");
fprintf(stderr,"\tthe size of the image in the first 4 bytes. This is\n");
fprintf(stderr,"\tused by some of the new OR1k bootloaders.\n\n");
fprintf(stderr,"\tOptionally specify padding to be applied to the file,\n");
fprintf(stderr,"\twith the -pad switch, followed by either decimal or\n");
fprintf(stderr,"\thexademical format offset. Value is in bytes, pad\n");
fprintf(stderr,"\tfill will be zeros.\n");
fprintf(stderr,"\n");
exit(1);
}
if(argc == 4)
 
if (argc >= 4)
{
for (i = 1; i< argc; i++)
{
if ((strcmp("-pad", argv[i]) == 0) ||
(strcmp("--pad", argv[i]) == 0))
{
if (i+1 < argc)
{
if (1 == (sscanf(argv[i+1], "0x%x", &padding)))
i++;
else if (1 == (sscanf(argv[i+1], "%d", &padding)))
i++;
//fprintf(stderr,"Padding offset: 0x%x\n",padding);
}
}
}
// This will always be in argv[3]
if (strcmp("-size_word", argv[3]) == 0)
// We will calculate the number of bytes first
write_size_word=1;
}
 
fd = fopen( argv[filename_index], "r" );
 
bytes_per_line = atoi(argv[bytes_per_line_index]);
90,7 → 117,8
if ((bytes_per_line == 0) || (bytes_per_line > 8))
{
fprintf(stderr,"bytes per line incorrect or missing: %s\n",argv[bytes_per_line_index]);
fprintf(stderr,"bytes per line incorrect or missing: %s\n",
argv[bytes_per_line_index]);
exit(1);
}
103,15 → 131,30
exit(1);
}
 
i=0;
// Write out padding bytes amount of zeros
while (padding) {
printf("00");
if (++i == bytes_per_line) {
printf("\n");
i = 0;
}
padding--;
}
 
if (write_size_word)
{
// or1200 startup method of determining size of boot image we're copying by reading out
// the very first word in flash is used. Determine the length of this file
// or1200 startup method of determining size of boot image we're
// copying by reading out the very first word in flash is used.
// Determine the length of this file
fseek(fd, 0, SEEK_END);
image_size = ftell(fd);
fseek(fd,0,SEEK_SET);
// Now we should have the size of the file in bytes. Let's ensure it's a word multiple
// Now we should have the size of the file in bytes. Let's ensure
// it's a word multiple
image_size+=3;
image_size &= 0xfffffffc;
 
133,7 → 176,8
if(++i==bytes_per_line){ printf("\n"); i=0; }
}
 
// Fix for the current bootloader software! Skip the first 4 bytes of application data. Hopefully it's not important. 030509 -- jb
// Fix for the current bootloader software! Skip the first 4 bytes of
// application data. Hopefully it's not important. 030509 -- jb
for(i=0;i<4;i++)
c=fgetc(fd);
 
/orpsocv2/sw/bootrom/bootrom.S
42,6 → 42,8
#ifdef BOOTROM_SPI_FLASH
/* Assembly program to go into the boot ROM */
/* For use with simple_spi SPI master core and standard SPI flash
interface-compatible parts (ST M25P16 for example.)*/
/* Currently just loads a program from SPI flash into RAM */
/* Assuming address at RAM_LOAD_BASE gets clobbered, we need
a byte writable address somewhere!*/
67,52 → 69,75
l.movhi r4, hi(SPI_BASE)
spi_init:
l.ori r2, r0, SPI_SPCR_XFER_GO /* Setup SPCR with enable bit set */
l.sb SPI_SPCR(r4), r2
l.sb SPI_SPSS(r4), r0 /* Clear SPI slave selects */
l.ori r6, r0, SPI_SPSS_INIT
l.sb SPI_SPSS(r4), r6 /* Now put in appropriate slave select */
l.jal spi_xfer
l.ori r3, r0, 0x3 /* READ command opcode for SPI device */
l.jal spi_xfer
l.or r3, r0, r0
l.jal spi_xfer
l.or r3, r0, r0
l.jal spi_xfer
l.or r3, r0, r0
l.ori r2, r0, SPI_SPCR_XFER_GO /* Setup SPCR with enable bit set */
l.sb SPI_SPCR(r4), r2
l.sb SPI_SPSS(r4), r0 /* Clear SPI slave selects */
l.ori r6, r0, SPI_SPSS_INIT
l.sb SPI_SPSS(r4), r6 /* Set appropriate slave select */
l.jal spi_xfer
l.ori r3, r0, 0x3 /* READ command opcode for SPI device*/
l.jal spi_xfer
#ifdef BOOTROM_ADDR_BYTE2
l.ori r3, r0, BOOTROM_ADDR_BYTE2 /* Use addr if defined. MSB first */
#else
l.or r3, r0, r0
#endif
l.jal spi_xfer
#ifdef BOOTROM_ADDR_BYTE1
l.ori r3, r0, BOOTROM_ADDR_BYTE1
#else
l.or r3, r0, r0
#endif
l.jal spi_xfer
#ifdef BOOTROM_ADDR_BYTE0
l.ori r3, r0, BOOTROM_ADDR_BYTE0
#else
l.or r3, r0, r0
#endif
l.movhi r6, 0
l.movhi r7, 0xffff
 
copy:
l.jal spi_xfer /* Read a byte into r3 */
l.add r8, r1, r6 /* Calculate store address */
l.sb 0(r8), r3 /* Write byte to memory */
l.addi r6, r6, 1 /* Increment counter */
l.sfeqi r6, 0x4 /* Is this the first word */
l.bf store_sizeword /* put sizeword in the register */
l.sfeq r6, r7 /* Check if we've finished loading the words */
l.bnf copy /* Continue copying if not last word */
l.jal spi_xfer /* Read a byte into r3 */
l.add r8, r1, r6 /* Calculate store address */
l.sb 0(r8), r3 /* Write byte to memory */
l.addi r6, r6, 1 /* Increment counter */
l.sfeqi r6, 0x4 /* Is this the first word ?*/
l.bf store_sizeword /* put sizeword in the register */
l.sfeq r6, r7 /* Check if we've finished loading the words */
l.bnf copy /* Continue copying if not last word */
l.nop
 
goto_reset:
l.ori r1, r1, RESET_ADDR
l.jr r1
l.sb SPI_SPSS(r4), r0 /* Clear SPI slave selects */
l.ori r1, r1, RESET_ADDR
l.jr r1
l.sb SPI_SPSS(r4), r0 /* Clear SPI slave selects */
store_sizeword:
l.j copy
l.lwz r7, 0(r1) /* Size word is in first word of SDRAM */
#ifdef SPI_RETRY_IF_INSANE_SIZEWORD
l.lwz r7, 0(r1) /* Size word is in first word of SDRAM */
l.srli r10, r7, 16 /* Chop the sizeword we read in half */
l.sfgtui r10, 0x0200 /* It's unlikely we'll ever load > 32MB */
l.bf boot_init
l.nop
l.j copy
l.nop
 
#else
l.j copy
l.lwz r7, 0(r1) /* Size word is in first word of SDRAM */
#endif
spi_xfer:
l.sb SPI_SPDR(r4), r3 /* Dummy write what's in r3 */
l.ori r3, r0, SPI_SPSR_RX_CHECK /* r3 = , ensure loop just once */
l.sb SPI_SPDR(r4), r3 /* Dummy write what's in r3 */
l.ori r3, r0, SPI_SPSR_RX_CHECK /* r3 = , ensure loop just once */
spi_xfer_poll:
l.andi r3, r3, SPI_SPSR_RX_CHECK /* AND read fifo bit empty */
l.andi r3, r3, SPI_SPSR_RX_CHECK /* AND read fifo bit empty */
l.sfeqi r3, SPI_SPSR_RX_CHECK /* is bit set? ... */
l.bf spi_xfer_poll /* ... if so, rxfifo empty, keep polling */
l.lbz r3, SPI_SPSR(r4) /* Read SPSR */
l.jr r9
l.lbz r3, SPI_SPDR(r4) /* Get data byte */
l.bf spi_xfer_poll /* ... if so, rxfifo empty, keep polling */
l.lbz r3, SPI_SPSR(r4) /* Read SPSR */
l.jr r9
l.lbz r3, SPI_SPDR(r4) /* Get data byte */
 
 
#endif
121,8 → 146,8
/* Jump to reset vector in the SDRAM */
l.movhi r0, 0
l.movhi r4, SDRAM_BASE
l.ori r4, r4, 0x100
l.jr r4
l.ori r4, r4, 0x100
l.jr r4
l.nop
#endif
134,13 → 159,13
*/
l.movhi r0, 0
l.movhi r4, SDRAM_BASE
l.sw 0x0(r4), r0
l.sw 0x0(r4), r0
l.movhi r5, hi(0x15000001) /* A l.nop 1 so sim exits if this enabled */
l.ori r5, r5, lo(0x15000001)
l.sw 0x4(r4), r5
l.sw 0x8(r4), r5
l.sw 0xc(r4), r5
l.jr r4
l.ori r5, r5, lo(0x15000001)
l.sw 0x4(r4), r5
l.sw 0x8(r4), r5
l.sw 0xc(r4), r5
l.jr r4
l.nop
 
153,11 → 178,8
of memory and jump there.
*/
l.movhi r0, 0
l.nop 0x1
l.j 0
l.nop 0x1
l.j 0
l.nop
l.nop
 
 
#endif
/orpsocv2/sw/tests/ethmac/board/ethmac-ping.c
61,10 → 61,14
#define OUR_IP_BYTES 0xc0,0xa8,0x1,0x2 // 192.168.1.2
#define OUR_IP_LONG 0xc0a80102
 
//#define OUR_IP_BYTES 0xac,0x1e,0x0,0x2 // 172.30.0.2
//#define OUR_IP_LONG 0xac1e0002
 
static char our_ip[4] = {OUR_IP_BYTES};
 
//#define DEST_IP_BYTES 0xc0,0xa8,0x64,0x69 // 192 .168.100.105
#define DEST_IP_BYTES 0xc0,0xa8,0x01,0x08 // 192 .168.1.8
//#define DEST_IP_BYTES 0xac,0x1e,0x0,0x01 // 172.30.0.1
 
/* Functions in this file */
void ethmac_setup(void);
129,7 → 133,6
// struct net_device_stats stats;
};
 
 
void oeth_printregs(void)
{
volatile oeth_regs *regs;
257,7 → 260,7
regs->miitx_data = 0;
for (regnum=0;regnum<29;regnum++)
for (regnum=0;regnum<32;regnum++)
{
printf("scan_ethphy%d: r%x ",phynum, regnum);
1895,12 → 1898,18
tx_packet((void*) ping_packet, 98);
if (c == 'S')
tx_packet((void*)big_ping_packet, 1514);
if (c == 'h')
if (c == 'h')
scan_ethphys();
if (c == 'i')
ethphy_init();
if (c == 'P')
print_packet_contents = print_packet_contents ? 0 : 1;
{
print_packet_contents = print_packet_contents ? 0 : 1;
if (print_packet_contents)
printf("Enabling packet dumping\n");
else
printf("Packet dumping disabled\n");
}
if (c == 'p')
oeth_printregs();
if (c == '0')
1909,21 → 1918,52
scan_ethphy(1);
if (c == '7')
{
scan_ethphy(7);
ethphy_print_status(7);
//scan_ethphy(7);
//ethphy_print_status(7);
printf("ext_sr 0x%x\n",eth_mii_read(0x7, 0x1b));
}
if (c == 'r')
ethphy_reset(0);
{
ethphy_reset(7);
printf("PHY reset\n");
}
if (c == 'R')
oeth_reset_tx_bd_pointer();
{
//oeth_reset_tx_bd_pointer();
ethmac_setup();
printf("MAC reset\n");
}
if (c == 'n')
ethphy_reneg(0);
ethphy_reneg(7);
if (c == 'N')
ethphy_set_autoneg(0);
ethphy_set_autoneg(7);
if (c == 'm')
ethmac_togglehugen();
if (c == 't')
ethphy_set_10mbit(0);
if (c == 'w')
{
// Play with HWCFG mode of Alaska 88e1111 Phy
c = uart_getc(DEFAULT_UART);
short newvalue;
// c is an ascii char, let's convert it to actual hex value
if (c >= 'A' && c <= 'F')
newvalue = c - (65 - 10);
else if (c >= 'a' && c <= 'f')
newvalue = c - (99 - 10);
else if (c >= '0' && c <= '9')
newvalue = c - 48;
 
// Take this value and or it into the bottom bit (supposedly ext_sr)
#define MII_M1111_PHY_EXT_SR 0x1b
short ext_sr;
ext_sr = eth_mii_read(0x7, MII_M1111_PHY_EXT_SR);
#define MII_M1111_HWCFG_MODE_MASK 0xf
ext_sr &= ~MII_M1111_HWCFG_MODE_MASK;
ext_sr |= (short) newvalue;
eth_mii_write(0x7, MII_M1111_PHY_EXT_SR, ext_sr);
printf("ext_sr updated to - 0x%x\n",eth_mii_read(0x7, MII_M1111_PHY_EXT_SR));
}
if ( c == 'b' )
{
printf("\n\t---\n");
/orpsocv2/sw/tests/spi/board/Makefile
0,0 → 1,13
SW_ROOT=../../..
 
include $(SW_ROOT)/Makefile.inc
 
%.dis: %.elf
$(Q)$(OR32_OBJDUMP) -d $< > $@
 
%.bin: %.elf
$(Q)$(OR32_OBJCOPY) -O binary $< $@
 
clean:
$(Q)rm -f *.elf *.bin *.vmem *.flashin *.dis
 
/orpsocv2/sw/tests/spi/board/simplespi-readflash.c
0,0 → 1,184
// Little program to dump the contents of the SPI flash memory it's connected
// to on the board
 
#include "cpu-utils.h"
 
#include "board.h"
#include "uart.h"
#include "simple-spi.h"
#include "printf.h"
 
 
int spi_master;
char slave;
 
 
void
spi_write_ignore_read(int core, char dat)
{
spi_core_write_data(core,dat);
while (!(spi_core_data_avail(core))); // Wait for the transaction (should
// generate a byte)
spi_core_read_data(core);
}
 
char
spi_read_ignore_write(int core)
{
spi_core_write_data(core, 0x00);
while (!(spi_core_data_avail(core))); // Wait for the transaction (should
// generate a byte)
return spi_core_read_data(core);
}
 
 
unsigned long
spi_read_id(int core, char slave_sel)
{
unsigned long rdid;
char* rdid_ptr = (char*) &rdid;
int i;
spi_core_slave_select(core, slave_sel); // Select slave
rdid_ptr[3] = 0;
// Send the RDID command
spi_write_ignore_read(core,0x9f); // 0x9f is READ ID command
// Now we read the next 3 bytes
for(i=0;i<3;i++)
{
rdid_ptr[i] = spi_read_ignore_write(core);
}
spi_core_slave_select(core, 0); // Deselect slave
return rdid;
}
 
// Read status regsiter
char
spi_read_sr(int core, char slave_sel)
{
char rdsr;
spi_core_slave_select(core, slave_sel); // Select slave
// Send the RDSR command
spi_write_ignore_read(core,0x05); // 0x05 is READ status register command
rdsr = spi_read_ignore_write(core);
spi_core_slave_select(core, 0); // Deselect slave
return rdsr;
}
 
 
void
spi_read_block(int core, char slave_sel, unsigned int addr, int num_bytes,
char* buf)
{
int i;
spi_core_slave_select(core, slave_sel); // Select slave
spi_write_ignore_read(core, 0x3); // READ command
spi_write_ignore_read(core,((addr >> 16) & 0xff)); // addres high byte
spi_write_ignore_read(core,((addr >> 8) & 0xff)); // addres middle byte
spi_write_ignore_read(core,((addr >> 0) & 0xff)); // addres low byte
for(i=0;i<num_bytes;i++)
buf[i] = spi_read_ignore_write(core);
spi_core_slave_select(core, 0); // Deselect slave
}
 
 
#define printhelp() printf("\nUsage: \n\t[d]ump\t\tdump 256 bytes of data to screen from flash\n\t[+/-]\t\tIncrease/decrease dump address by 256 bytes\n\t[</>]\t\tIncrease/decrease dump address by 4096 bytes\n\t[s]tatus\t\tprint status of SPI flash\n\n")
 
void
print_spi_status(void)
{
 
printf("SPI core: %d\n",spi_master);
printf("SPI slave select: 0x%x\n",slave&0xff);
 
printf("SPI slave info:\n");
printf("\tID:\t%x\n", spi_read_id(spi_master, slave));
printf("\tSR:\t%x\n", spi_read_sr(spi_master, slave));
printf("\n");
 
}
 
 
 
int
main()
{
 
uart_init(0); // init the UART before we can printf
volatile char c;
int i,j;
spi_master = 0;
slave = 1;
 
spi_core_slave_select(spi_master, 0); // Deselect slaves
 
// Clear the read FIFO
while (spi_core_data_avail(spi_master))
c = spi_core_read_data(spi_master);
 
// SPI core 0, should already be configured to read out data
// when we reset.
 
printf("\n\n\tSPI dumping app\n\n");
unsigned long dump_addr = 0;
char read_buf[256];
int dump_amount = 0x100;
 
while(1){
printf("[d,+,-,s,h] > ");
c = uart_getc(DEFAULT_UART);
 
if ((c != '+') && (c != '-') && (c != '<') && (c != '>') )
{
printf("%c ",c);
printf("\n");
}
if (c == 'h')
printhelp();
else if (c == 's')
print_spi_status();
else if (c == '+')
{
dump_addr += dump_amount;
printf("dump_addr= 0x%x\r", dump_addr);
}
else if (c == '-')
{
dump_addr -= dump_amount;
printf("dump_addr= 0x%x\r", dump_addr);
}
else if (c == '>')
{
dump_addr += dump_amount*16;
printf("dump_addr= 0x%x\r", dump_addr);
}
else if (c == '<')
{
dump_addr -= dump_amount*16;
printf("dump_addr= 0x%x\r", dump_addr);
}
else if (c == 'd')
{
spi_read_block(spi_master, 1, dump_addr, dump_amount, read_buf);
// Print it out, 32 bytes across each time
for(i=0;i<(dump_amount/32);i++)
{
printf("%.5x: ", (i*32)+dump_addr);
for(j=0;j<32;j++)
printf("%.2x", read_buf[(i*32)+j] & 0xff);
printf("\n");
}
dump_addr += dump_amount;
 
}
 
}
return 0;
 
}
/orpsocv2/sw/Makefile.inc
116,9 → 116,10
 
OR32_CFLAGS ?=-g -nostdlib -O2 $(MARCH_FLAGS) \
$(INCLUDE_FLAGS) \
-I$(SW_ROOT)/lib/include
-I$(SW_ROOT)/lib/include \
 
OR32_LDFLAGS ?=-lgcc -T$(CPU_DRIVER)/link.ld -e 256
OR32_LDFLAGS ?=-L$(SW_ROOT)/lib -lorpsoc -lgcc -T$(CPU_DRIVER)/link.ld -e 256
OR32_ARFLAGS ?=-r
# RTL_VERILOG_INCLUDE_DIR *MUST* be set!
# Backup one - default, but may be wrong!
132,7 → 133,9
 
PROCESSED_DEFINES=$(DESIGN_PROCESSED_VERILOG_DEFINES) $(OR1200_PROCESSED_VERILOG_DEFINES)
 
ELF_DEPENDS+= $(SUPPORT_LIBS)
# Mother makefile can set this if extra things are needed to be built and
# compild with a certain app.
ELF_DEPENDS ?=
 
# Set V=1 when calling make to enable verbose output
# mainly for debugging purposes.
177,16 → 180,17
 
# Default make
%.flashin: %.bin $(UTILS_BIN2HEX)
$(Q)$(UTILS_BIN2HEX) $< 1 -size_word > $@
$(Q)$(UTILS_BIN2HEX) $< 1 -size_word -pad $(HEX_IMAGE_PADDING) > $@
 
%.vmem: %.bin $(UTILS_BIN2VMEM)
$(Q)$(UTILS_BIN2VMEM) $< > $@
 
%.elf: %.c $(ELF_DEPENDS) $(VECTORS_OBJ)
$(Q)$(OR32_CC) $^ $(OR32_CFLAGS) $(OR32_LDFLAGS) -o $@
%.elf: %.c $(VECTORS_OBJ) $(ELF_DEPENDS) $(SUPPORT_LIBS)
$(Q)$(OR32_CC) $< $(VECTORS_OBJ) $(ELF_DEPENDS) $(OR32_CFLAGS) \
$(OR32_LDFLAGS) -o $@
 
%.elf: %.S $(ELF_DEPENDS)
$(Q)$(OR32_CC) $^ $(OR32_CFLAGS) $(OR32_LDFLAGS) -o $@
%.elf: %.S $(ELF_DEPENDS) $(SUPPORT_LIBS)
$(Q)$(OR32_CC) $< $(ELF_DEPENDS) $(OR32_CFLAGS) $(OR32_LDFLAGS) -o $@
 
%.o: %.S
$(Q)$(OR32_CC) $(OR32_CFLAGS) -c $< -o $@
/orpsocv2/sw/drivers/simple-spi/simple-spi.c
79,7 → 79,7
REG8((spi_base_adr[core] + SIMPLESPI_SPER)) = sper;
}
// slave_sel_dec is decoded (so asserted bit in right place)
// No decode on slave select lines, so assert correct bit to select slave
void
spi_core_slave_select(int core, char slave_sel_dec)
{
/orpsocv2/boards/actel/ordb1a3pe1500/syn/synplify/bin/Makefile
174,13 → 174,12
#
 
BOOTROM_FILE=bootrom.v
SW_DIR=$(BOARD_DIR)/sw
BOOTROM_SW_DIR=$(SW_DIR)/bootrom
BOOTROM_SRC=$(shell ls $(BOOTROM_SW_DIR)/* | grep -v $(BOOTROM_FILE))
BOOTROM_VERILOG=$(BOOTROM_SW_DIR)/$(BOOTROM_FILE)
BOARD_SW_DIR=$(BOARD_DIR)/sw
BOARD_BOOTROM_SW_DIR=$(BOARD_SW_DIR)/bootrom
BOOTROM_VERILOG=$(BOARD_BOOTROM_SW_DIR)/$(BOOTROM_FILE)
bootrom: $(BOOTROM_VERILOG)
$(BOOTROM_VERILOG): $(BOOTROM_SRC)
$(MAKE) -C $(BOOTROM_SW_DIR) $(BOOTROM_FILE)
$(BOOTROM_VERILOG):
$(MAKE) -C $(BOARD_BOOTROM_SW_DIR) $(BOOTROM_FILE)
 
SYNDIR_BOOTROM_VERILOG=$(SYN_WORK_DIR)/$(BOOTROM_FILE)
$(SYNDIR_BOOTROM_VERILOG): $(BOOTROM_VERILOG)
/orpsocv2/boards/xilinx/ml501/bench/verilog/include/eth_stim.v
451,6 → 451,137
 
 
`ifdef XILINX_DDR2
// Gets word from correct bank
task get_32bitword_from_xilinx_ddr2;
input [31:0] addr;
output [31:0] insn;
reg [16*8-1:0] ddr2_array_line0,ddr2_array_line1,ddr2_array_line2,
ddr2_array_line3;
integer word_in_line_num;
begin
// Get our 4 128-bit chunks (8 half-words in each!! Confused yet?),
// 16 words total
gen_cs[0].gen[0].u_mem0.memory_read(addr[28:27],addr[26:13],
{addr[12:6],3'd0},
ddr2_array_line0);
gen_cs[0].gen[1].u_mem0.memory_read(addr[28:27],addr[26:13],
{addr[12:6],3'd0},
ddr2_array_line1);
gen_cs[0].gen[2].u_mem0.memory_read(addr[28:27],addr[26:13],
{addr[12:6],3'd0},
ddr2_array_line2);
gen_cs[0].gen[3].u_mem0.memory_read(addr[28:27],addr[26:13],
{addr[12:6],3'd0},
ddr2_array_line3);
case (addr[5:2])
4'h0:
begin
insn[15:0] = ddr2_array_line0[15:0];
insn[31:16] = ddr2_array_line1[15:0];
end
4'h1:
begin
insn[15:0] = ddr2_array_line2[15:0];
insn[31:16] = ddr2_array_line3[15:0];
end
4'h2:
begin
insn[15:0] = ddr2_array_line0[31:16];
insn[31:16] = ddr2_array_line1[31:16];
end
4'h3:
begin
insn[15:0] = ddr2_array_line2[31:16];
insn[31:16] = ddr2_array_line3[31:16];
end
4'h4:
begin
insn[15:0] = ddr2_array_line0[47:32];
insn[31:16] = ddr2_array_line1[47:32];
end
4'h5:
begin
insn[15:0] = ddr2_array_line2[47:32];
insn[31:16] = ddr2_array_line3[47:32];
end
4'h6:
begin
insn[15:0] = ddr2_array_line0[63:48];
insn[31:16] = ddr2_array_line1[63:48];
end
4'h7:
begin
insn[15:0] = ddr2_array_line2[63:48];
insn[31:16] = ddr2_array_line3[63:48];
end
4'h8:
begin
insn[15:0] = ddr2_array_line0[79:64];
insn[31:16] = ddr2_array_line1[79:64];
end
4'h9:
begin
insn[15:0] = ddr2_array_line2[79:64];
insn[31:16] = ddr2_array_line3[79:64];
end
4'ha:
begin
insn[15:0] = ddr2_array_line0[95:80];
insn[31:16] = ddr2_array_line1[95:80];
end
4'hb:
begin
insn[15:0] = ddr2_array_line2[95:80];
insn[31:16] = ddr2_array_line3[95:80];
end
4'hc:
begin
insn[15:0] = ddr2_array_line0[111:96];
insn[31:16] = ddr2_array_line1[111:96];
end
4'hd:
begin
insn[15:0] = ddr2_array_line2[111:96];
insn[31:16] = ddr2_array_line3[111:96];
end
4'he:
begin
insn[15:0] = ddr2_array_line0[127:112];
insn[31:16] = ddr2_array_line1[127:112];
end
4'hf:
begin
insn[15:0] = ddr2_array_line2[127:112];
insn[31:16] = ddr2_array_line3[127:112];
end
endcase // case (addr[5:2])
end
endtask
task get_byte_from_xilinx_ddr2;
input [31:0] addr;
output [7:0] data_byte;
reg [31:0] word;
begin
get_32bitword_from_xilinx_ddr2(addr, word);
case (addr[1:0])
2'b00:
data_byte = word[31:24];
2'b01:
data_byte = word[23:16];
2'b10:
data_byte = word[15:8];
2'b11:
data_byte = word[7:0];
endcase // case (addr[1:0])
end
endtask // get_byte_from_xilinx_ddr2
 
`endif
 
 
//
// Check packet TX'd by MAC was good
//
496,13 → 627,29
// Variable we'll use for index in the PHY's TX buffer
buffer = 0; // Start of TX data
`ifdef VERSATILE_SDRAM
 
for (i=0;i<tx_len_bd;i=i+1)
begin
//$display("Checking address in tx bd 0x%0h",txpnt_sdram);
sdram_byte = 8'hx;
sdram0.get_byte(txpnt_sdram,sdram_byte);
`ifdef VERSATILE_SDRAM
sdram0.get_byte(txpnt_sdram,sdram_byte);
`endif
`ifdef XILINX_DDR2
get_byte_from_xilinx_ddr2(txpnt_sdram, sdram_byte);
`endif
if (sdram_byte === 8'hx)
begin
$display(" * Error: sdram_byte was %x", sdram_byte);
$display(" * eth_stim needs to be able to access the main memory to check packet rx/tx");
$display(" * RAM pointer for BD is 0x%h, bank offset we'll use is 0x%h",
tx_bd_addr, txpnt_wb);
$finish;
end
 
 
phy_byte = eth_phy0.tx_mem[buffer];
// Debugging output
//$display("txpnt_sdram = 0x%h, sdram_byte = 0x%h, buffer = 0x%h, phy_byte = 0x%h", txpnt_sdram, sdram_byte, buffer, phy_byte);
519,12 → 666,6
end // for (i=0;i<tx_len_bd;i=i+1)
`else
$display("SET ME UP TO LOOK IN ANOTHER MEMORY!");
$display("RAM pointer for BD is 0x%h, bank offset we'll use is 0x%h",
tx_bd_addr, txpnt_wb);
$finish;
`endif // !`ifdef VERSATILE_SDRAM
if (failure)
begin
#100
1002,14 → 1143,8
rxpnt_wb = {14'd0,rx_bd_addr[17:0]};
rxpnt_sdram = rx_bd_addr[24:0];
`ifdef VERSATILE_SDRAM
// We'll look inside the SDRAM array
// Hard coded for the SDRAM buffer area to be from the halfway mark in
// memory (so starting in Bank2)
// We'll be passed the offset from the beginning of the buffer area
// in rxpnt_wb. This value will be in bytes.
//$display("RAM pointer for BD is 0x%h, SDRAM addr is 0x%h", rx_bd_addr, rxpnt_sdram);
 
 
1016,7 → 1151,22
for (i=0;i<len;i=i+1)
begin
 
sdram0.get_byte(rxpnt_sdram,sdram_byte);
sdram_byte = 8'hx;
`ifdef VERSATILE_SDRAM
sdram0.get_byte(rxpnt_sdram,sdram_byte);
`endif
`ifdef XILINX_DDR2
get_byte_from_xilinx_ddr2(rxpnt_sdram, sdram_byte);
`endif
if (sdram_byte === 8'hx)
begin
$display(" * Error:");
$display(" * eth_stim needs to be able to access the main memory to check packet rx/tx");
$display("RAM pointer for BD is 0x%h, bank offset we'll use is 0x%h",
rx_bd_addr, rxpnt_wb);
$finish;
end
 
phy_byte = eth_rx_sent_circbuf[eth_rx_sent_circbuf_read_ptr];//phy_rx_mem[buffer]; //eth_phy0.rx_mem[buffer];
 
1034,16 → 1184,7
rxpnt_sdram = rxpnt_sdram+1;
end // for (i=0;i<len;i=i+2)
`else
 
$display("SET ME UP TO LOOK IN ANOTHER MEMORY!");
$display("RAM pointer for BD is 0x%h, bank offset we'll use is 0x%h",
rx_bd_addr, rxpnt_wb);
$finish;
`endif // !`ifdef VERSATILE_SDRAM
 
if (failure)
begin
#100
/orpsocv2/boards/xilinx/ml501/bench/verilog/include/ddr2_model_preload.v
53,4 → 53,4
end // for (ram_ptr = 0 ; ram_ptr < ...
$display("(%t) * DDR2 RAM %1d preloaded",$time, i);
end // initial begin
 
/orpsocv2/boards/xilinx/ml501/bench/verilog/orpsoc_testbench.v
73,14 → 73,14
tri1 i2c_scl, i2c_sda;
`ifdef JTAG_DEBUG
wire tdo_pad_o;
wire tck_pad_i;
wire tms_pad_i;
wire tdi_pad_i;
wire tdo_pad_o;
wire tck_pad_i;
wire tms_pad_i;
wire tdi_pad_i;
`endif
`ifdef UART0
wire uart0_stx_pad_o;
wire uart0_srx_pad_i;
wire uart0_stx_pad_o;
wire uart0_srx_pad_i;
`endif
`ifdef GPIO0
wire [gpio0_io_width-1:0] gpio0_io;
151,16 → 151,16
wire [ODT_WIDTH-1:0] ddr2_odt_fpga;
`endif
`ifdef XILINX_SSRAM
wire sram_clk;
wire sram_clk_fb;
wire sram_adv_ld_n;
wire [3:0] sram_bw;
wire sram_cen;
wire [21:1] sram_flash_addr;
wire [31:0] sram_flash_data;
wire sram_flash_oe_n;
wire sram_flash_we_n;
wire sram_mode;
wire sram_clk;
wire sram_clk_fb;
wire sram_adv_ld_n;
wire [3:0] sram_bw;
wire sram_cen;
wire [21:1] sram_flash_addr;
wire [31:0] sram_flash_data;
wire sram_flash_oe_n;
wire sram_flash_we_n;
wire sram_mode;
`endif
 
orpsoc_top dut
206,9 → 206,12
.uart0_srx_expheader_pad_i (uart0_srx_pad_i),
`endif
`ifdef SPI0
.spi0_sck_o (spi0_sck_o),
/*
via STARTUP_VIRTEX5
.spi0_sck_o (spi0_sck_o),
.spi0_miso_i (spi0_miso_i),
*/
.spi0_mosi_o (spi0_mosi_o),
.spi0_miso_i (spi0_miso_i),
.spi0_ss_o (spi0_ss_o),
`endif
`ifdef I2C0
252,11 → 255,11
`ifndef SIM_QUIET
`define CPU_ic_top or1200_ic_top
`define CPU_dc_top or1200_dc_top
wire ic_en = orpsoc_testbench.dut.or1200_top0.or1200_ic_top.ic_en;
wire ic_en = orpsoc_testbench.dut.or1200_top0.or1200_ic_top.ic_en;
always @(posedge ic_en)
$display("Or1200 IC enabled at %t", $time);
 
wire dc_en = orpsoc_testbench.dut.or1200_top0.or1200_dc_top.dc_en;
wire dc_en = orpsoc_testbench.dut.or1200_top0.or1200_dc_top.dc_en;
always @(posedge dc_en)
$display("Or1200 DC enabled at %t", $time);
`endif
281,8 → 284,15
`endif // `ifdef JTAG_DEBUG
`ifdef SPI0
// STARTUP_VIRTEX5 module routes these out on the board.
// So for now just connect directly to the internals here.
assign spi0_sck_o = dut.spi0_sck_o;
assign dut.spi0_miso_i = spi0_miso_i;
// SPI flash memory - M25P16 compatible SPI protocol
AT26DFxxx spi0_flash
AT26DFxxx
#(.MEMSIZE(2048*1024)) // 2MB flash on ML501
spi0_flash
(// Outputs
.SO (spi0_miso_i),
// Inputs
291,6 → 301,8
.SI (spi0_mosi_o),
.WPB (1'b1)
);
 
`endif // `ifdef SPI0
 
`ifdef ETH0
331,11 → 343,11
`endif // `ifdef ETH0
 
`ifdef XILINX_SSRAM
wire [18:0] sram_a;
wire [3:0] dqp;
wire [18:0] sram_a;
wire [3:0] dqp;
assign sram_a[18:0] = sram_flash_addr[19:1];
wire sram_ce1b, sram_ce2, sram_ce3b;
wire sram_ce1b, sram_ce2, sram_ce3b;
assign sram_ce1b = 1'b0;
assign sram_ce2 = 1'b1;
assign sram_ce3b = 1'b0;
446,28 → 458,30
 
`ifdef PRELOAD_RAM
`include "ddr2_model_preload.v"
`endif
ddr2_model u_mem0
(
.ck (ddr2_ck_sdram[CLK_WIDTH*i/DQS_WIDTH]),
.ck_n (ddr2_ck_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_a_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
endgenerate
`endif
end
ddr2_model u_mem0
(
.ck (ddr2_ck_sdram[CLK_WIDTH*i/DQS_WIDTH]),
.ck_n (ddr2_ck_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_a_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
endgenerate
`endif
 
495,9 → 509,9
`define VCD_SUFFIX ".vcd"
`endif
`ifndef SIM_QUIET
`ifndef SIM_QUIET
$display("* VCD in %s\n", {"../out/",`TEST_NAME_STRING,`VCD_SUFFIX});
`endif
`endif
$dumpfile({"../out/",`TEST_NAME_STRING,`VCD_SUFFIX});
`ifndef VCD_DEPTH
`define VCD_DEPTH 0
523,9 → 537,9
`ifdef END_TIME
initial begin
#(`END_TIME);
`ifndef SIM_QUIET
`ifndef SIM_QUIET
$display("* Finish simulation due to END_TIME being set at %t", $time);
`endif
`endif
$finish;
end
`endif
/orpsocv2/boards/xilinx/ml501/rtl/verilog/include/or1200_defines.v
1725,8 → 1725,8
// used to determine where vectors are located. //
///////////////////////////////////////////////////////////////////////////////
// Boot from 0xf0000100
//`define OR1200_BOOT_PCREG_DEFAULT 30'h3c00003f
//`define OR1200_BOOT_ADR 32'hf0000100
`define OR1200_BOOT_PCREG_DEFAULT 30'h3c00003f
`define OR1200_BOOT_ADR 32'hf0000100
// Boot from 0x100
`define OR1200_BOOT_PCREG_DEFAULT 30'h0000003f
`define OR1200_BOOT_ADR 32'h00000100
// `define OR1200_BOOT_PCREG_DEFAULT 30'h0000003f
// `define OR1200_BOOT_ADR 32'h00000100
/orpsocv2/boards/xilinx/ml501/rtl/verilog/include/orpsoc-defines.v
72,7 → 72,9
//`define ARBITER_IBUS_REGISTERING
`define ARBITER_IBUS_WATCHDOG
// Watchdog timeout: 2^(ARBITER_IBUS_WATCHDOG_TIMER_WIDTH+1) cycles
`define ARBITER_IBUS_WATCHDOG_TIMER_WIDTH 12
// This has to be kind of long, as DDR2 initialisation can take a little while
// and after reset, and if this is too short we'll always get bus error.
`define ARBITER_IBUS_WATCHDOG_TIMER_WIDTH 20
 
// Data bus arbiter
 
79,7 → 81,7
//`define ARBITER_DBUS_REGISTERING
`define ARBITER_DBUS_WATCHDOG
// Watchdog timeout: 2^(ARBITER_DBUS_WATCHDOG_TIMER_WIDTH+1) cycles
`define ARBITER_DBUS_WATCHDOG_TIMER_WIDTH 12
`define ARBITER_DBUS_WATCHDOG_TIMER_WIDTH 20
 
// Byte bus (peripheral bus) arbiter
// Don't really need the watchdog here - the databus will pick it up
/orpsocv2/boards/xilinx/ml501/rtl/verilog/orpsoc_top/orpsoc_top.v
55,7 → 55,7
uart0_srx_expheader_pad_i, uart0_stx_expheader_pad_o,
`endif
`ifdef SPI0
spi0_sck_o, spi0_mosi_o, spi0_miso_i, spi0_ss_o,
spi0_mosi_o, spi0_ss_o,/* spi0_sck_o, spi0_miso_i,via STARTUP_VIRTEX5*/
`endif
`ifdef I2C0
i2c0_sda_io, i2c0_scl_io,
133,10 → 133,12
output uart0_stx_expheader_pad_o;
`endif
`ifdef SPI0
output spi0_sck_o;
output spi0_mosi_o;
output [spi0_ss_width-1:0] spi0_ss_o;
output [spi0_ss_width-1:0] spi0_ss_o;
/* via STARTUP_VIRTEX5
output spi0_sck_o;
input spi0_miso_i;
*/
`endif
`ifdef I2C0
inout i2c0_sda_io, i2c0_scl_io;
1227,7 → 1229,7
assign wbs_d_uart0_rty_o = 0;
 
// Two UART lines coming to single one (ensure they go high when unconnected)
assign uart_srx = uart0_srx_pad_i & uart0_srx_expheader_pad_i;
assign uart0_srx = uart0_srx_pad_i & uart0_srx_expheader_pad_i;
assign uart0_stx_pad_o = uart0_stx;
assign uart0_stx_expheader_pad_o = uart0_stx;
1315,6 → 1317,23
);
 
defparam spi0.slave_select_width = spi0_ss_width;
 
// SPI clock and MISO lines must go through STARTUP_VIRTEX5 block.
STARTUP_VIRTEX5 startup_virtex5
(
.CFGCLK(),
.CFGMCLK(),
.DINSPI(spi0_miso_i),
.EOS(),
.TCKSPI(),
.CLK(),
.GSR(1'b0),
.GTS(1'b0),
.USRCCLKO(spi0_sck_o),
.USRCCLKTS(1'b0),
.USRDONEO(),
.USRDONETS()
);
////////////////////////////////////////////////////////////////////////
`else // !`ifdef SPI0
/orpsocv2/boards/xilinx/ml501/backend/par/run/Makefile
0,0 → 1,2
include ../bin/Makefile
 
/orpsocv2/boards/xilinx/ml501/backend/par/bin/ml501.ucf
0,0 → 1,962
######################################################################
#
# UCF file for ML501 PAR
#
######################################################################
 
#------------------------------------------------------------------------------
# ZBT SSRAM controller multi-cycle path constraints (ssram_controller)
#------------------------------------------------------------------------------
 
# Define the two clock domains as timespecs
#NET dcm0_clkdv TNM_NET="wb_clk";
#TIMESPEC "TS_wb_clk" = PERIOD "wb_clk" 20 ns HIGH 10;
#NET dcm0_clk0 TNM_NET = "ssram_clk200";
#TIMESPEC "TS_ssram_clk200" = PERIOD "ssram_clk200" "TS_wb_clk" / 4;
 
# Now define their relationship - logic should be configured so that there's
# 1 WB cycle at all times before anything is sampled across domains
#TIMESPEC "TS_wb_clk_ssram_clk200" = from "wb_clk" TO "ssram_clk200" 15 ns;
#TIMESPEC "TS_ssram_clk200_wb_clk" = from "ssram_clk200" TO "wb_clk" 15 ns;
 
#------------------------------------------------------------------------------
# Pins used
#------------------------------------------------------------------------------
 
# 100MHz fixed freq clock.
#NET sys_clk_in LOC = AD8;
#NET sys_clk_in IOSTANDARD = LVCMOS33;
#NET "sys_clk_in" TNM_NET = "sys_clk_in";
#TIMESPEC "TS_sys_clk_in" = PERIOD "sys_clk_in" 10 ns HIGH 50.00%;
 
NET sys_clk_in_p LOC = E16;
NET sys_clk_in_n LOC = E17;
NET sys_clk_in_p IOSTANDARD = LVDS_25;
NET sys_clk_in_n IOSTANDARD = LVDS_25;
INST *sys_clk_in_ibufds DIFF_TERM=TRUE;
 
NET "clkgen0/sys_clk_in_200" TNM_NET = "sys_clk_in_200";
TIMESPEC "TSSYSCLK200" = PERIOD "sys_clk_in_200" 5 ns HIGH 50 %;
 
 
NET rst_n_pad_i LOC = T23 | IOSTANDARD = LVDCI_33;
NET rst_n_pad_i PULLUP;
NET rst_n_pad_i TIG;
 
 
#------------------------------------------------------------------------------
# User Reset pins (hook up so user can reset system from processor)
#------------------------------------------------------------------------------
 
#NET usr_rst_out LOC = P20 | IOSTANDARD = LVCMOS25; # HDR2_62
#NET usr_rst_out PULLUP;
#NET usr_rst_out TIG;
#NET usr_rst_in LOC = P21 | IOSTANDARD = LVCMOS25; # HDR2_64
#NET usr_rst_in PULLUP;
#NET usr_rst_in TIG;
 
#------------------------------------------------------------------------------
# All pins for ML501
#------------------------------------------------------------------------------
 
#NET "sys_clk_s" TNM_NET = "sys_clk";
#TIMESPEC "TSSYSCLK" = PERIOD "sys_clk" 10 ns HIGH 50 %;
#NET "sys_clk_in_200" TNM_NET = "sys_clk_in_200";
#TIMESPEC "TSSYSCLK200" = PERIOD "sys_clk_in_200" 5 ns HIGH 50 %;
 
#NET sys_clk_in_p LOC = E16;
#NET sys_clk_in_n LOC = E17;
#NET sys_clk_in_p IOSTANDARD = LVDS_25;
#NET sys_clk_in_n IOSTANDARD = LVDS_25;
#INST *sys_clk_in_ibufds DIFF_TERM=TRUE;
 
#NET sys_rst_pin LOC = T23 | IOSTANDARD = LVCMOS33 | PULLUP;
 
#NET Interrupt TIG;
 
# Reset timing ignore - treat as async paths
#NET sys_rst_s TIG;
#NET opb_v20_0_OPB_Rst TIG;
#NET lmb_v10_1_OPB_Rst TIG;
#NET lmb_v10_0_OPB_Rst TIG;
#NET opb_v20_0_Debug_SYS_Rst TIG;
#NET plb_v34_0_PLB_Rst TIG;
#NET dcm_locked TIG;
 
#------------------------------------------------------------------------------
# OpenCores JTAG Debug signals and User UART on EXP Header pins
#------------------------------------------------------------------------------
 
NET uart0_srx_expheader_pad_i LOC = F25; # HDR2_2
NET uart0_srx_expheader_pad_i TIG;
NET uart0_srx_expheader_pad_i PULLUP;
NET uart0_srx_expheader_pad_i IOSTANDARD = LVCMOS25;
 
NET uart0_stx_expheader_pad_o LOC = F24; # HDR2_4
NET uart0_stx_expheader_pad_o TIG;
NET uart0_stx_expheader_pad_o PULLUP;
NET uart0_stx_expheader_pad_o IOSTANDARD = LVCMOS25;
 
NET tdo_pad_o LOC = E26; # HDR2_6
NET tdi_pad_i LOC = E25; # HDR2_8
NET tms_pad_i LOC = G22; # HDR2_10
NET tck_pad_i LOC = G21; # HDR2_12
 
NET tdo_pad_o TIG; NET tdo_pad_o PULLUP; NET tdo_pad_o IOSTANDARD = LVCMOS25;
NET tdi_pad_i TIG; NET tdi_pad_i PULLUP; NET tdi_pad_i IOSTANDARD = LVCMOS25;
NET tms_pad_i TIG; NET tms_pad_i PULLUP; NET tms_pad_i IOSTANDARD = LVCMOS25;
NET tck_pad_i TIG; NET tck_pad_i PULLUP; NET tck_pad_i IOSTANDARD = LVCMOS25;
# Overide the following mapping error:
# ERROR:Place:645 - A clock IOB clock component is not placed at an optimal clock
# IOB site.
NET "tck_pad_i" CLOCK_DEDICATED_ROUTE = FALSE;
 
#////////////////////////////////////////////////////////////////////////////
#// Buttons, LEDs, Piezo, and DIP Switches
#////////////////////////////////////////////////////////////////////////////
 
# GPLED
NET gpio0_io<0> LOC = E11; #GPLED7 (Rightmost - LSB)
NET gpio0_io<1> LOC = E10; #GPLED6
NET gpio0_io<2> LOC = E15; #GPLED5
NET gpio0_io<3> LOC = D15; #GPLED4
NET gpio0_io<4> LOC = F12; #GPLED3
NET gpio0_io<5> LOC = E12; #GPLED2
NET gpio0_io<6> LOC = D14; #GPLED1
NET gpio0_io<7> LOC = E13; #GPLED0 (Leftmost - MSB)
 
NET gpio0_io<0> IOSTANDARD = LVCMOS25;
NET gpio0_io<1> IOSTANDARD = LVCMOS25;
NET gpio0_io<2> IOSTANDARD = LVCMOS25;
NET gpio0_io<3> IOSTANDARD = LVCMOS25;
NET gpio0_io<4> IOSTANDARD = LVCMOS25;
NET gpio0_io<5> IOSTANDARD = LVCMOS25;
NET gpio0_io<6> IOSTANDARD = LVCMOS25;
NET gpio0_io<7> IOSTANDARD = LVCMOS25;
 
# North-East-South-West-Center LEDs
NET gpio0_io<8> LOC = T22; # C LED
NET gpio0_io<9> LOC = AA18; # W LED
NET gpio0_io<10> LOC = AA8; # S LED
NET gpio0_io<11> LOC = Y18; # E LED
NET gpio0_io<12> LOC = Y8; # N LED
NET gpio0_io<8> IOSTANDARD = LVCMOS33;
NET gpio0_io<9> IOSTANDARD = LVCMOS33;
NET gpio0_io<10> IOSTANDARD = LVCMOS33;
NET gpio0_io<11> IOSTANDARD = LVCMOS33;
NET gpio0_io<12> IOSTANDARD = LVCMOS33;
 
# North-East-South-West-Center Buttons
NET gpio0_io<13> LOC = B21; # C Button
NET gpio0_io<14> LOC = C21; # W Button
NET gpio0_io<15> LOC = B22; # S Button
NET gpio0_io<16> LOC = A23; # E Button
NET gpio0_io<17> LOC = A22; # N Button
NET gpio0_io<13> IOSTANDARD = LVCMOS33;
NET gpio0_io<14> IOSTANDARD = LVCMOS33;
NET gpio0_io<15> IOSTANDARD = LVCMOS33;
NET gpio0_io<16> IOSTANDARD = LVCMOS33;
NET gpio0_io<17> IOSTANDARD = LVCMOS33;
 
# Dip Switches 1-8
NET gpio0_io<18> LOC = T7; # DIP SW 8
NET gpio0_io<19> LOC = U7; # DIP SW 7
NET gpio0_io<20> LOC = U5; # DIP SW 6
NET gpio0_io<21> LOC = U6; # DIP SW 5
NET gpio0_io<22> LOC = T5; # DIP SW 4
NET gpio0_io<23> LOC = T4; # DIP SW 3
#NET gpio0_io<24> LOC = V3; # DIP SW 2
#NET gpio0_io<25> LOC = U4; # DIP SW 1
NET gpio0_io<18> IOSTANDARD = LVCMOS18;
NET gpio0_io<19> IOSTANDARD = LVCMOS18;
NET gpio0_io<20> IOSTANDARD = LVCMOS18;
NET gpio0_io<21> IOSTANDARD = LVCMOS18;
NET gpio0_io<22> IOSTANDARD = LVCMOS18;
NET gpio0_io<23> IOSTANDARD = LVCMOS18;
#NET gpio0_io<24> IOSTANDARD = LVCMOS18;
#NET gpio0_io<25> IOSTANDARD = LVCMOS18;
 
#SMA Connectors
#NET gpio0_io<22> LOC = F10; # SMA_IN_N
#NET gpio0_io<23> LOC = F9; # SMA_IN_P
#NET gpio0_io<24> LOC = F19; # SMA_OUT_N
#NET gpio0_io<25> LOC = E18; # SMA_OUT_P
#NET gpio0_io<26> LOC = AD8; # USERCLK
#NET gpio0_io<22> IOSTANDARD = LVCMOS25;
#NET gpio0_io<23> IOSTANDARD = LVCMOS25;
#NET gpio0_io<24> IOSTANDARD = LVCMOS25;
#NET gpio0_io<25> IOSTANDARD = LVCMOS25;
#NET gpio0_io<26> IOSTANDARD = LVCMOS33;
 
NET "gpio0_io<*>" PULLDOWN;
NET "gpio0_io<*>" TIG;
NET "gpio0_io<*>" SLEW = SLOW;
NET "gpio0_io<*>" DRIVE = 2;
 
#NET "gpio0_io<22>" SLEW = FAST;
#NET "gpio0_io<22>" DRIVE = 12;
#NET "gpio0_io<23>" SLEW = FAST;
#NET "gpio0_io<23>" DRIVE = 12;
#NET "gpio0_io<24>" SLEW = FAST;
#NET "gpio0_io<24>" DRIVE = 12;
#NET "gpio0_io<25>" SLEW = FAST;
#NET "gpio0_io<25>" DRIVE = 12;
 
## #NET "gpio2_d_out<*>" TIG;
## #NET "gpio2_t_out<*>" TIG;
## NET "gpio2_in<*>" TIG;
 
## NET "piezo" LOC = V1;
## NET "piezo" IOSTANDARD = LVCMOS18;
## NET "piezo" TIG;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for PS/2 Ports
## #------------------------------------------------------------------------------
 
## #Keyboard
## NET ps2_keyb_clk LOC = J1;
## NET ps2_keyb_clk SLEW = SLOW;
## NET ps2_keyb_clk DRIVE = 2;
## NET ps2_keyb_clk IOSTANDARD = LVCMOS18;
## NET ps2_keyb_clk TIG;
## NET ps2_keyb_data LOC = H2;
## NET ps2_keyb_data SLEW = SLOW;
## NET ps2_keyb_data DRIVE = 2;
## NET ps2_keyb_data IOSTANDARD = LVCMOS18;
## NET ps2_keyb_data TIG;
 
## #Mouse
## NET ps2_mouse_clk LOC = L2;
## NET ps2_mouse_clk SLEW = SLOW;
## NET ps2_mouse_clk DRIVE = 2;
## NET ps2_mouse_clk IOSTANDARD = LVCMOS18;
## NET ps2_mouse_clk TIG;
## NET ps2_mouse_data LOC = K1;
## NET ps2_mouse_data SLEW = SLOW;
## NET ps2_mouse_data DRIVE = 2;
## NET ps2_mouse_data IOSTANDARD = LVCMOS18;
## NET ps2_mouse_data TIG;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for IIC Controller
## #------------------------------------------------------------------------------
 
# General I2C bus
 
NET i2c0_scl_io LOC = R20;
NET i2c0_sda_io LOC = T20;
NET i2c0_scl_io SLEW = SLOW;
NET i2c0_scl_io DRIVE = 6;
NET i2c0_scl_io TIG;
NET i2c0_scl_io IOSTANDARD = LVCMOS33;
NET i2c0_sda_io SLEW = SLOW;
NET i2c0_sda_io DRIVE = 6;
NET i2c0_sda_io TIG;
NET i2c0_sda_io IOSTANDARD = LVCMOS33;
 
# DDR2 I2C bus
 
NET i2c1_scl_io LOC = Y7;
NET i2c1_sda_io LOC = AA7;
NET i2c1_scl_io SLEW = SLOW;
NET i2c1_scl_io DRIVE = 6;
NET i2c1_scl_io TIG;
NET i2c1_scl_io IOSTANDARD = LVCMOS18;
NET i2c1_sda_io SLEW = SLOW;
NET i2c1_sda_io DRIVE = 6;
NET i2c1_sda_io TIG;
NET i2c1_sda_io IOSTANDARD = LVCMOS18;
 
## #------------------------------------------------------------------------------
## # IO Pad Locations Constraints for SPI memory
## #------------------------------------------------------------------------------
 
NET spi0_mosi_o LOC = AA9 | IOSTANDARD = LVCMOS33 | DRIVE = 6 | SLEW = FAST | TIG;
NET spi0_ss_o<0> LOC = AC14 | IOSTANDARD = LVCMOS33 | DRIVE = 6 | SLEW = FAST | TIG;
# These go through the STARTUP_VIRTEX5 block - don't worry about assigning them
# here.
#NET spi0_miso_i LOC = K11 | IOSTANDARD = LVCMOS33 | DRIVE = 6 | SLEW = FAST | TIG;
 
#NET spi0_sck_o LOC = J10 | IOSTANDARD = LVCMOS33 | DRIVE = 6 | SLEW = FAST | TIG;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for System ACE MPU / USB
## #------------------------------------------------------------------------------
 
## NET sysace_clk_in LOC = AB12;
## NET sysace_clk_in IOSTANDARD = LVCMOS33;
## NET sysace_clk_in TNM_NET = "sysace_clk_in";
## # Leave 1 ns margin
## TIMESPEC "TSSYSACE" = PERIOD "sysace_clk_in" 29 ns;
 
## NET sace_usb_a<0> LOC = N6;
## NET sace_usb_a<1> LOC = E5;
## NET sace_usb_a<2> LOC = F5;
## NET sace_usb_a<3> LOC = F4;
## NET sace_usb_a<4> LOC = J5;
## NET sace_usb_a<5> LOC = E7;
## NET sace_usb_a<6> LOC = G7;
## NET sace_usb_a<*> IOSTANDARD = LVCMOS33;
## NET sace_usb_a<*> SLEW = FAST;
## NET sace_usb_a<*> DRIVE = 8;
## NET sace_mpce LOC = F7;
## NET sace_mpce IOSTANDARD = LVCMOS33;
## NET sace_mpce SLEW = FAST;
## NET sace_mpce DRIVE = 8;
## NET sace_usb_d<0> LOC = M6;
## NET sace_usb_d<1> LOC = K5;
## NET sace_usb_d<2> LOC = L3;
## NET sace_usb_d<3> LOC = L4;
## NET sace_usb_d<4> LOC = L7;
## NET sace_usb_d<5> LOC = L5;
## NET sace_usb_d<6> LOC = H6;
## NET sace_usb_d<7> LOC = G5;
## NET sace_usb_d<8> LOC = M7;
## NET sace_usb_d<9> LOC = H7;
## NET sace_usb_d<10> LOC = J6;
## NET sace_usb_d<11> LOC = G4;
## NET sace_usb_d<12> LOC = K7;
## NET sace_usb_d<13> LOC = J4;
## NET sace_usb_d<14> LOC = H4;
## NET sace_usb_d<15> LOC = K6;
## NET sace_usb_d<*> IOSTANDARD = LVCMOS33;
## NET sace_usb_d<*> SLEW = FAST;
## NET sace_usb_d<*> DRIVE = 8;
## NET sace_usb_d<*> PULLDOWN;
## NET sace_usb_oen LOC = E6;
## NET sace_usb_oen IOSTANDARD = LVCMOS33;
## NET sace_usb_oen SLEW = FAST;
## NET sace_usb_oen DRIVE = 8;
## NET sace_usb_wen LOC = M5;
## NET sace_usb_wen IOSTANDARD = LVCMOS33;
## NET sace_usb_wen SLEW = FAST;
## NET sace_usb_wen DRIVE = 8;
## NET sysace_mpirq LOC = G6;
## NET sysace_mpirq IOSTANDARD = LVCMOS33;
## NET sysace_mpirq TIG;
## NET sysace_mpirq PULLDOWN;
 
## NET usb_csn LOC = N3;
## NET usb_csn IOSTANDARD = LVCMOS33;
## NET usb_csn SLEW = FAST;
## NET usb_csn DRIVE = 8;
## NET usb_hpi_reset_n LOC = P3;
## NET usb_hpi_reset_n IOSTANDARD = LVCMOS33;
## NET usb_hpi_reset_n TIG;
## NET usb_hpi_int LOC = M4;
## NET usb_hpi_int IOSTANDARD = LVCMOS33;
## NET usb_hpi_int TIG;
## NET usb_hpi_int PULLDOWN;
 
## ////////////////////////////////////////////////////////////////////////////
## // Misc Board Signals
## ////////////////////////////////////////////////////////////////////////////
 
## NET plb_error LOC = N4; # Bus Error 1
## NET plb_error IOSTANDARD = LVCMOS33;
## NET plb_error TIG;
## NET opb_error LOC = P5; # Bus Error 2
## NET opb_error IOSTANDARD = LVCMOS33;
## NET opb_error TIG;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for Expansion Header GPIO
## #------------------------------------------------------------------------------
 
## NET gpio_exp_hdr1<31> LOC = AB26; # HDR1_64
## NET gpio_exp_hdr1<30> LOC = AC26; # HDR1_62
## NET gpio_exp_hdr1<29> LOC = AA25; # HDR1_60
## NET gpio_exp_hdr1<28> LOC = P26; # HDR1_58
## NET gpio_exp_hdr1<27> LOC = Y26; # HDR1_56
## NET gpio_exp_hdr1<26> LOC = Y25; # HDR1_54
## NET gpio_exp_hdr1<25> LOC = W26; # HDR1_52
## NET gpio_exp_hdr1<24> LOC = W25; # HDR1_50
## NET gpio_exp_hdr1<23> LOC = U25; # HDR1_48
## NET gpio_exp_hdr1<22> LOC = U24; # HDR1_46
## NET gpio_exp_hdr1<21> LOC = T25; # HDR1_44
## NET gpio_exp_hdr1<20> LOC = T24; # HDR1_42
## NET gpio_exp_hdr1<19> LOC = P24; # HDR1_40
## NET gpio_exp_hdr1<18> LOC = P25; # HDR1_38
## NET gpio_exp_hdr1<17> LOC = N26; # HDR1_36
## NET gpio_exp_hdr1<16> LOC = AB25; # HDR1_34
## NET gpio_exp_hdr1<15> LOC = M24; # HDR1_32
## NET gpio_exp_hdr1<14> LOC = N24; # HDR1_30
## NET gpio_exp_hdr1<13> LOC = M25; # HDR1_28
## NET gpio_exp_hdr1<12> LOC = M26; # HDR1_26
## NET gpio_exp_hdr1<11> LOC = K25; # HDR1_24
## NET gpio_exp_hdr1<10> LOC = K26; # HDR1_22
## NET gpio_exp_hdr1<9> LOC = L24; # HDR1_20
## NET gpio_exp_hdr1<8> LOC = L25; # HDR1_18
## NET gpio_exp_hdr1<7> LOC = M21; # HDR1_16
## NET gpio_exp_hdr1<6> LOC = K21; # HDR1_14
## NET gpio_exp_hdr1<5> LOC = K20; # HDR1_12
## NET gpio_exp_hdr1<4> LOC = M22; # HDR1_10
## NET gpio_exp_hdr1<3> LOC = H23; # HDR1_8
## NET gpio_exp_hdr1<2> LOC = J21; # HDR1_6
## NET gpio_exp_hdr1<1> LOC = J23; # HDR1_4
## NET gpio_exp_hdr1<0> LOC = J20; # HDR1_2
#NET gpio_exp_hdr1<*> TIG;
#NET gpio_exp_hdr1<*> PULLDOWN;
#NET gpio_exp_hdr1<*> IOSTANDARD = LVCMOS25;
 
## NET gpio_exp_hdr2<31> LOC = P21; # HDR2_64
## NET gpio_exp_hdr2<30> LOC = P20; # HDR2_62
## NET gpio_exp_hdr2<29> LOC = H24; # HDR2_60
## NET gpio_exp_hdr2<28> LOC = J24; # HDR2_58
## NET gpio_exp_hdr2<27> LOC = M20; # HDR2_56
## NET gpio_exp_hdr2<26> LOC = M19; # HDR2_54
## NET gpio_exp_hdr2<25> LOC = G24; # HDR2_52
## NET gpio_exp_hdr2<24> LOC = G25; # HDR2_50
## NET gpio_exp_hdr2<23> LOC = P23; # HDR2_48
## NET gpio_exp_hdr2<22> LOC = N23; # HDR2_46
## NET gpio_exp_hdr2<21> LOC = L20; # HDR2_44
## NET gpio_exp_hdr2<20> LOC = L19; # HDR2_42
## NET gpio_exp_hdr2<19> LOC = G26; # HDR2_40
## NET gpio_exp_hdr2<18> LOC = H26; # HDR2_38
## NET gpio_exp_hdr2<17> LOC = K23; # HDR2_36
## NET gpio_exp_hdr2<16> LOC = K22; # HDR2_34
## NET gpio_exp_hdr2<15> LOC = V26; # HDR2_32
## NET gpio_exp_hdr2<14> LOC = U26; # HDR2_30
## NET gpio_exp_hdr2<13> LOC = N22; # HDR2_28
## NET gpio_exp_hdr2<12> LOC = N21; # HDR2_26
## NET gpio_exp_hdr2<11> LOC = R22; # HDR2_24
## NET gpio_exp_hdr2<10> LOC = R23; # HDR2_22
## NET gpio_exp_hdr2<9> LOC = J25; # HDR2_20
## NET gpio_exp_hdr2<8> LOC = J26; # HDR2_18
## NET gpio_exp_hdr2<7> LOC = P19; # HDR2_16
## NET gpio_exp_hdr2<6> LOC = N19; # HDR2_14
## NET gpio_exp_hdr2<5> LOC = G21; # HDR2_12
## NET gpio_exp_hdr2<4> LOC = G22; # HDR2_10
## NET gpio_exp_hdr2<3> LOC = E25; # HDR2_8
## NET gpio_exp_hdr2<2> LOC = E26; # HDR2_6
## NET gpio_exp_hdr2<1> LOC = F24; # HDR2_4
## NET gpio_exp_hdr2<0> LOC = F25; # HDR2_2
## NET gpio_exp_hdr2<*> TIG;
## NET gpio_exp_hdr2<*> PULLDOWN;
## NET gpio_exp_hdr2<*> IOSTANDARD = LVCMOS25;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for Character LCD GPIO
## #------------------------------------------------------------------------------
 
## NET gpio_char_lcd<6> LOC = P6; # LCD_E
## NET gpio_char_lcd<5> LOC = R7; # LCD_RS
## NET gpio_char_lcd<4> LOC = R5; # LCD_RW
## NET gpio_char_lcd<3> LOC = P4; # LCD_DB7
## NET gpio_char_lcd<2> LOC = R3; # LCD_DB6
## NET gpio_char_lcd<1> LOC = T3; # LCD_DB5
## NET gpio_char_lcd<0> LOC = R6; # LCD_DB4
## NET gpio_char_lcd<*> IOSTANDARD = LVCMOS33;
## NET gpio_char_lcd<*> TIG;
## NET gpio_char_lcd<*> PULLDOWN;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for DDR Controllers
## #------------------------------------------------------------------------------
 
########################################################################
# Controller 0
# Memory Device: DDR2_SDRAM->SODIMMs->MT4HTF3264HY-53E #
# Data Width: 64 #
# Data Mask: 1 #
########################################################################
 
 
NET ddr2_a<0> LOC = Y5; # DDR_A0
NET ddr2_a<1> LOC = Y6; # DDR_A1
NET ddr2_a<2> LOC = W6; # DDR_A2
NET ddr2_a<3> LOC = W5; # DDR_A3
NET ddr2_a<4> LOC = V7; # DDR_A4
NET ddr2_a<5> LOC = V6; # DDR_A5
NET ddr2_a<6> LOC = Y3; # DDR_A6
NET ddr2_a<7> LOC = W3; # DDR_A7
NET ddr2_a<8> LOC = W4; # DDR_A8
NET ddr2_a<9> LOC = V4; # DDR_A9
NET ddr2_a<10> LOC = AD3; # DDR_A10
NET ddr2_a<11> LOC = AD4; # DDR_A11
NET ddr2_a<12> LOC = AC3; # DDR_A12
NET ddr2_ba<0> LOC = AB5; # DDR_BA0
NET ddr2_ba<1> LOC = AB6; # DDR_BA1
NET ddr2_cas_n LOC = AE3; # DDR_CAS_N
NET ddr2_cke<0> LOC = AA3; # DDR_CKE
NET ddr2_cke<1> LOC = AB4; # DDR_CKE
NET ddr2_cs_n<0> LOC = AF3; # DDR_CS_N
NET ddr2_cs_n<1> LOC = AD6; # DDR_CS_N
NET ddr2_ras_n LOC = AC6; # DDR_RAS_N
NET ddr2_we_n LOC = AB7; # DDR_WE_N
NET ddr2_ck<0> LOC = E2; # DDR_CK0_P
NET ddr2_ck_n<0> LOC = E1; # DDR_CK0_N
NET ddr2_ck<1> LOC = P1; # DDR_CK1_P
NET ddr2_ck_n<1> LOC = R1; # DDR_CK1_N
NET ddr2_odt<0> LOC =AE6; # DDR_ODT0
NET ddr2_odt<1> LOC =AE5; # DDR_ODT1
 
NET ddr2_dm<0> LOC = B9; # DDR_DM0
NET ddr2_dm<1> LOC = A8; # DDR_DM1
NET ddr2_dm<2> LOC = C4; # DDR_DM2
NET ddr2_dm<3> LOC = F2; # DDR_DM3
NET ddr2_dm<4> LOC = AB1; # DDR_DM4
NET ddr2_dm<5> LOC = AF24; # DDR_DM5
NET ddr2_dm<6> LOC = AF22; # DDR_DM6
NET ddr2_dm<7> LOC = AF8; # DDR_DM7
 
NET ddr2_dqs<0> LOC = B7; # DDR_DQS0
NET ddr2_dqs_n<0> LOC = A7; # DDR_DQSN0
NET ddr2_dqs<1> LOC = D5; # DDR_DQS1
NET ddr2_dqs_n<1> LOC = D6; # DDR_DQSN1
NET ddr2_dqs<2> LOC = C6; # DDR_DQS2
NET ddr2_dqs_n<2> LOC = C7; # DDR_DQSN2
NET ddr2_dqs<3> LOC = M1; # DDR_DQS3
NET ddr2_dqs_n<3> LOC = N1; # DDR_DQSN3
NET ddr2_dqs<4> LOC = T2; # DDR_DQS4
NET ddr2_dqs_n<4> LOC = R2; # DDR_DQSN4
NET ddr2_dqs<5> LOC = AF18; # DDR_DQS5
NET ddr2_dqs_n<5> LOC = AE18; # DDR_DQSN5
NET ddr2_dqs<6> LOC = AF19; # DDR_DQS6
NET ddr2_dqs_n<6> LOC = AF20; # DDR_DQSN6
NET ddr2_dqs<7> LOC = AF17; # DDR_DQS7
NET ddr2_dqs_n<7> LOC = AE17; # DDR_DQSN7
 
NET ddr2_dq<0> LOC = C11; # DDR_D0
NET ddr2_dq<1> LOC = C13; # DDR_D1
NET ddr2_dq<2> LOC = A12; # DDR_D2
NET ddr2_dq<3> LOC = C9; # DDR_D3
NET ddr2_dq<4> LOC = D10; # DDR_D4
NET ddr2_dq<5> LOC = C12; # DDR_D5
NET ddr2_dq<6> LOC = B12; # DDR_D6
NET ddr2_dq<7> LOC = A13; # DDR_D7
NET ddr2_dq<8> LOC = A10; # DDR_D8
NET ddr2_dq<9> LOC = A9; # DDR_D9
NET ddr2_dq<10> LOC = B5; # DDR_D10
NET ddr2_dq<11> LOC = D3; # DDR_D11
NET ddr2_dq<12> LOC = B10; # DDR_D12
NET ddr2_dq<13> LOC = B11; # DDR_D13
NET ddr2_dq<14> LOC = B6; # DDR_D14
NET ddr2_dq<15> LOC = B4; # DDR_D15
NET ddr2_dq<16> LOC = C2; # DDR_D16
NET ddr2_dq<17> LOC = A2; # DDR_D17
NET ddr2_dq<18> LOC = D1; # DDR_D18
NET ddr2_dq<19> LOC = B1; # DDR_D19
NET ddr2_dq<20> LOC = C3; # DDR_D20
NET ddr2_dq<21> LOC = A3; # DDR_D21
NET ddr2_dq<22> LOC = C1; # DDR_D22
NET ddr2_dq<23> LOC = B2; # DDR_D23
NET ddr2_dq<24> LOC = F3; # DDR_D24
NET ddr2_dq<25> LOC = G1; # DDR_D25
NET ddr2_dq<26> LOC = G2; # DDR_D26
NET ddr2_dq<27> LOC = H3; # DDR_D27
NET ddr2_dq<28> LOC = E3; # DDR_D28
NET ddr2_dq<29> LOC = H1; # DDR_D29
NET ddr2_dq<30> LOC = K3; # DDR_D30
NET ddr2_dq<31> LOC = J3; # DDR_D31
 
NET ddr2_dq<32> LOC = Y1; # DDR_D32
NET ddr2_dq<33> LOC = Y2; # DDR_D33
NET ddr2_dq<34> LOC = AC1; # DDR_D34
NET ddr2_dq<35> LOC = AD1; # DDR_D35
NET ddr2_dq<36> LOC = AA2; # DDR_D36
NET ddr2_dq<37> LOC = AB2; # DDR_D37
NET ddr2_dq<38> LOC = AC2; # DDR_D38
NET ddr2_dq<39> LOC = AE1; # DDR_D39
NET ddr2_dq<40> LOC = AD23; # DDR_D40
NET ddr2_dq<41> LOC = AD26; # DDR_D41
NET ddr2_dq<42> LOC = AF25; # DDR_D42
NET ddr2_dq<43> LOC = AD25; # DDR_D43
NET ddr2_dq<44> LOC = AD24; # DDR_D44
NET ddr2_dq<45> LOC = AE26; # DDR_D45
NET ddr2_dq<46> LOC = AE25; # DDR_D46
NET ddr2_dq<47> LOC = AF23; # DDR_D47
NET ddr2_dq<48> LOC = AD20; # DDR_D48
NET ddr2_dq<49> LOC = AE20; # DDR_D49
NET ddr2_dq<50> LOC = AF14; # DDR_D50
NET ddr2_dq<51> LOC = AF12; # DDR_D51
NET ddr2_dq<52> LOC = AD21; # DDR_D52
NET ddr2_dq<53> LOC = AE21; # DDR_D53
NET ddr2_dq<54> LOC = AF13; # DDR_D54
NET ddr2_dq<55> LOC = AE12; # DDR_D55
NET ddr2_dq<56> LOC = AE11; # DDR_D56
NET ddr2_dq<57> LOC = AE10; # DDR_D57
NET ddr2_dq<58> LOC = AF7; # DDR_D58
NET ddr2_dq<59> LOC = AE7; # DDR_D59
NET ddr2_dq<60> LOC = AF10; # DDR_D60
NET ddr2_dq<61> LOC = AF9; # DDR_D61
NET ddr2_dq<62> LOC = AE8; # DDR_D62
NET ddr2_dq<63> LOC = AD9; # DDR_D63
 
NET ddr2_a<*> IOSTANDARD = SSTL18_II;
NET ddr2_ba<*> IOSTANDARD = SSTL18_II;
NET ddr2_cke<*> IOSTANDARD = SSTL18_II;
NET ddr2_cas_n IOSTANDARD = SSTL18_II;
NET ddr2_cs_n<*> IOSTANDARD = SSTL18_II;
NET ddr2_ras_n IOSTANDARD = SSTL18_II;
NET ddr2_we_n IOSTANDARD = SSTL18_II;
NET ddr2_odt<*> IOSTANDARD = SSTL18_II;
 
NET ddr2_dm<*> IOSTANDARD = SSTL18_II_DCI;
NET ddr2_dq<*> IOSTANDARD = SSTL18_II_DCI;
 
NET ddr2_ck<*> IOSTANDARD = DIFF_SSTL18_II;
NET ddr2_ck_n<*> IOSTANDARD = DIFF_SSTL18_II;
NET ddr2_dqs<*> IOSTANDARD = DIFF_SSTL18_II_DCI;
NET ddr2_dqs_n<*> IOSTANDARD = DIFF_SSTL18_II_DCI;
 
## NET "ddr2_cal_clk" TNM_NET = "ddr2_cal_clk";
## NET "ddr2_dev_clk_*" TNM_NET = "ddr2_dev_clk";
## TIMESPEC "TSCAL_DEV" = FROM "ddr2_cal_clk" TO "ddr2_dev_clk" TIG;
## TIMESPEC "TSDEV_CAL" = FROM "ddr2_dev_clk" TO "ddr2_cal_clk" TIG;
###############################################################################
# Define multicycle paths - these paths may take longer because additional
# time allowed for logic to settle in calibration/initialization FSM
###############################################################################
 
# MIG 2.1: Eliminate Timegroup definitions for CLK0, and CLK90. Instead trace
# multicycle paths from originating flip-flop to ANY destination
# flip-flop (or in some cases, it can also be a BRAM)
# MUX Select for either rising/falling CLK0 for 2nd stage read capture
INST "*/u_phy_calib/gen_rd_data_sel*.u_ff_rd_data_sel" TNM = "TNM_RD_DATA_SEL";
TIMESPEC "TS_MC_RD_DATA_SEL" = FROM "TNM_RD_DATA_SEL" TO FFS
"TS_SYS_CLK" * 4;
# MUX select for read data - optional delay on data to account for byte skews
INST "*/u_usr_rd/gen_rden_sel_mux*.u_ff_rden_sel_mux" TNM = "TNM_RDEN_SEL_MUX";
TIMESPEC "TS_MC_RDEN_SEL_MUX" = FROM "TNM_RDEN_SEL_MUX" TO FFS
"TS_SYS_CLK" * 4;
# Calibration/Initialization complete status flag (for PHY logic only) - can
# be used to drive both flip-flops and BRAMs
INST "*/u_phy_init/u_ff_phy_init_data_sel" TNM = "TNM_PHY_INIT_DATA_SEL";
TIMESPEC "TS_MC_PHY_INIT_DATA_SEL_0" = FROM "TNM_PHY_INIT_DATA_SEL" TO FFS
"TS_SYS_CLK" * 4;
TIMESPEC "TS_MC_PHY_INIT_DATA_SEL_90" = FROM "TNM_PHY_INIT_DATA_SEL" TO RAMS
"TS_SYS_CLK" * 4;
# Select (address) bits for SRL32 shift registers used in stage3/stage4
# calibration
INST "*/u_phy_calib/gen_gate_dly*.u_ff_gate_dly" TNM = "TNM_GATE_DLY";
TIMESPEC "TS_MC_GATE_DLY" = FROM "TNM_GATE_DLY" TO FFS "TS_SYS_CLK" * 4;
 
INST "*/u_phy_calib/gen_rden_dly*.u_ff_rden_dly" TNM = "TNM_RDEN_DLY";
TIMESPEC "TS_MC_RDEN_DLY" = FROM "TNM_RDEN_DLY" TO FFS "TS_SYS_CLK" * 4;
 
INST "*/u_phy_calib/gen_cal_rden_dly*.u_ff_cal_rden_dly"
TNM = "TNM_CAL_RDEN_DLY";
TIMESPEC "TS_MC_CAL_RDEN_DLY" = FROM "TNM_CAL_RDEN_DLY" TO FFS
"TS_SYS_CLK" * 4;
 
 
###############################################################################
# DQS Read Post amble Glitch Squelch circuit related constraints
###############################################################################
 
###############################################################################
# LOC placement of DQS-squelch related IDDR and IDELAY elements
# Each circuit can be located at any of the following locations:
# 1. Unused "N"-side of DQS differential pair I/O
# 2. DM data mask (output only, input side is free for use)
# 3. Any output-only site
###############################################################################
 
#INST "*/gen_dqs[0].u_iob_dqs/u_iddr_dq_ce" LOC = "ILOGIC_X0Y182";
#INST "*/gen_dqs[0].u_iob_dqs/u_iodelay_dq_ce" LOC = "IODELAY_X0Y182";
#INST "*/gen_dqs[1].u_iob_dqs/u_iddr_dq_ce" LOC = "ILOGIC_X0Y180";
#INST "*/gen_dqs[1].u_iob_dqs/u_iodelay_dq_ce" LOC = "IODELAY_X0Y180";
#INST "*/gen_dqs[2].u_iob_dqs/u_iddr_dq_ce" LOC = "ILOGIC_X0Y178";
#INST "*/gen_dqs[2].u_iob_dqs/u_iodelay_dq_ce" LOC = "IODELAY_X0Y178";
#INST "*/gen_dqs[3].u_iob_dqs/u_iddr_dq_ce" LOC = "ILOGIC_X0Y142";
#INST "*/gen_dqs[3].u_iob_dqs/u_iodelay_dq_ce" LOC = "IODELAY_X0Y142";
#INST "*/gen_dqs[4].u_iob_dqs/u_iddr_dq_ce" LOC = "ILOGIC_X0Y140";
#INST "*/gen_dqs[4].u_iob_dqs/u_iodelay_dq_ce" LOC = "IODELAY_X0Y140";
#INST "*/gen_dqs[5].u_iob_dqs/u_iddr_dq_ce" LOC = "ILOGIC_X0Y138";
#INST "*/gen_dqs[5].u_iob_dqs/u_iodelay_dq_ce" LOC = "IODELAY_X0Y138";
#INST "*/gen_dqs[6].u_iob_dqs/u_iddr_dq_ce" LOC = "ILOGIC_X0Y102";
#INST "*/gen_dqs[6].u_iob_dqs/u_iodelay_dq_ce" LOC = "IODELAY_X0Y102";
#INST "*/gen_dqs[7].u_iob_dqs/u_iddr_dq_ce" LOC = "ILOGIC_X0Y100";
#INST "*/gen_dqs[7].u_iob_dqs/u_iodelay_dq_ce" LOC = "IODELAY_X0Y100";
 
###############################################################################
# LOC and timing constraints for flop driving DQS CE enable signal
# from fabric logic. Even though the absolute delay on this path is
# calibrated out (when synchronizing this output to DQS), the delay
# should still be kept as low as possible to reduce post-calibration
# voltage/temp variations - these are roughly proportional to the
# absolute delay of the path
###############################################################################
INST "*/u_phy_calib/gen_gate[0].u_en_dqs_ff" LOC = SLICE_X0Y91;
INST "*/u_phy_calib/gen_gate[1].u_en_dqs_ff" LOC = SLICE_X0Y90;
INST "*/u_phy_calib/gen_gate[2].u_en_dqs_ff" LOC = SLICE_X0Y89;
INST "*/u_phy_calib/gen_gate[3].u_en_dqs_ff" LOC = SLICE_X0Y71;
INST "*/u_phy_calib/gen_gate[4].u_en_dqs_ff" LOC = SLICE_X0Y70;
INST "*/u_phy_calib/gen_gate[5].u_en_dqs_ff" LOC = SLICE_X0Y69;
INST "*/u_phy_calib/gen_gate[6].u_en_dqs_ff" LOC = SLICE_X0Y51;
INST "*/u_phy_calib/gen_gate[7].u_en_dqs_ff" LOC = SLICE_X0Y50;
 
# Control for DQS gate - from fabric flop. Prevent "runaway" delay -
# two parts to this path: (1) from fabric flop to IDELAY, (2) from
# IDELAY to asynchronous reset of IDDR that drives the DQ CE's
# This can be relaxed by the user for lower frequencies:
# 300MHz = 850ps, 267MHz = 900ps. At 200MHz = 950ps.
# In general PAR should be able to route this
# within 900ps over all speed grades.
#NET "*/u_phy_io/en_dqs*" MAXDELAY = 900 ps;
# JB: Every single one failed with < 2ns slack!! Try upping this...
NET "*/u_phy_io/en_dqs*" MAXDELAY = 3000 ps;
NET "*/u_phy_io/gen_dqs*.u_iob_dqs/en_dqs_sync" MAXDELAY = 850 ps;
 
###############################################################################
# Define multicycle paths - these paths may take longer because additional
# time allowed for logic to settle in calibration/initialization FSM
###############################################################################
## DDR2 clock domain nets
NET "*/xilinx_ddr2_if0/ddr2_read_done" TNM_NET = "DDR2_READ_DONE_GRP";
NET "*/xilinx_ddr2_if0/ddr2_write_done" TNM_NET = "DDR2_WRITE_DONE_GRP";
NET "*/xilinx_ddr2_if0/do_writeback_ddr2_shifter*" TNM_NET = "DDR2_WRITEBACK_SHIFTER";
 
TIMEGRP "DDR2_MC_REGS" = "DDR2_READ_DONE_GRP" "DDR2_WRITE_DONE_GRP" "DDR2_WRITEBACK_SHIFTER";
## System bus (wishbone) domain nets
NET "*/xilinx_ddr2_if0/do_writeback*" TNM_NET = "WB_DO_WRITEBACK";
NET "*/xilinx_ddr2_if0/do_readfrom*" TNM_NET = "WB_DO_READFROM";
 
TIMEGRP "WB_MC_REGS" = "WB_DO_WRITEBACK" "WB_DO_READFROM";
 
# Path constraints - if bus clock is 50Mhz they have 20ns
TIMESPEC TS_ddr2_controller_mc_paths = FROM "WB_MC_REGS" to "DDR2_MC_REGS" 20ns;
TIMESPEC TS_ddr2_controller_mc_paths2 = FROM "DDR2_MC_REGS" to "WB_MC_REGS" 20ns;
 
###############################################################################
# "Half-cycle" path constraint from IDDR to CE pin for all DQ IDDR's
# for DQS Read Post amble Glitch Squelch circuit
###############################################################################
 
# Max delay from output of IDDR to CE input of DQ IDDRs = tRPST + some slack
# where slack account for rise-time of DQS on board. For now assume slack =
# 0.400ns (based on initial SPICE simulations, assumes use of ODT), so
# time = 0.4*Tcyc + 0.40ns = 1.6ns @333MHz
INST "*/gen_dqs[*].u_iob_dqs/u_iddr_dq_ce" TNM = "TNM_DQ_CE_IDDR";
INST "*/gen_dq[*].u_iob_dq/gen_stg2_*.u_iddr_dq" TNM = "TNM_DQS_FLOPS";
#TIMESPEC "TS_DQ_CE" = FROM "TNM_DQ_CE_IDDR" TO "TNM_DQS_FLOPS" 2.4 ns;
# JB: Was very closely failing on some paths, so up it by 100ps, but note it as an issue!
TIMESPEC "TS_DQ_CE" = FROM "TNM_DQ_CE_IDDR" TO "TNM_DQS_FLOPS" 2.5 ns;
 
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for UART
## #------------------------------------------------------------------------------
 
#NET uart_RX LOC = AC7;
#NET uart_RX IOSTANDARD = LVCMOS33;
#NET uart_RX TIG;
#NET uart_TX LOC = AD14;
#NET uart_TX IOSTANDARD = LVCMOS33;
#NET uart_TX TIG;
 
NET uart0_srx_pad_i LOC = AC7;
NET uart0_srx_pad_i IOSTANDARD = LVCMOS33;
NET uart0_srx_pad_i TIG;
NET uart0_stx_pad_o LOC = AD14;
NET uart0_stx_pad_o IOSTANDARD = LVCMOS33;
NET uart0_stx_pad_o TIG;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for SRAM
## #------------------------------------------------------------------------------
 
#NET sram_clk LOC = U22;
#NET sram_clk_fb LOC = AD15;
#NET sram_clk_fb IOSTANDARD = LVCMOS33;
#NET sram_clk IOSTANDARD = LVDCI_33;
 
#NET sram_clk_fb FEEDBACK = 1500ps NET sram_clk;
 
##NET sram_flash_addr<23> LOC = Y10;
##NET sram_flash_addr<22> LOC = Y11;
#NET sram_flash_addr<21> LOC = AA17;
#NET sram_flash_addr<20> LOC = AB17;
#NET sram_flash_addr<19> LOC = G14;
#NET sram_flash_addr<18> LOC = F13;
#NET sram_flash_addr<17> LOC = H14;
#NET sram_flash_addr<16> LOC = H13;
#NET sram_flash_addr<15> LOC = F15;
#NET sram_flash_addr<14> LOC = G15;
#NET sram_flash_addr<13> LOC = G12;
#NET sram_flash_addr<12> LOC = H12;
#NET sram_flash_addr<11> LOC = G16;
#NET sram_flash_addr<10> LOC = H16;
#NET sram_flash_addr<9> LOC = H11;
#NET sram_flash_addr<8> LOC = G11;
#NET sram_flash_addr<7> LOC = H17;
#NET sram_flash_addr<6> LOC = G17;
#NET sram_flash_addr<5> LOC = G10;
#NET sram_flash_addr<4> LOC = G9;
#NET sram_flash_addr<3> LOC = G19;
#NET sram_flash_addr<2> LOC = H18;
#NET sram_flash_addr<1> LOC = H9;
##NET sram_flash_addr<0> LOC = H8;
#NET sram_flash_addr<*> IOSTANDARD = LVCMOS33;
#NET sram_flash_addr<*> SLEW = FAST;
#NET sram_flash_addr<*> DRIVE = 8;
 
#NET sram_flash_data<31> LOC = AD18 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<30> LOC = AC18 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<29> LOC = AB10 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<28> LOC = AB9 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<27> LOC = AC17 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<26> LOC = AC16 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<25> LOC = AC8 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<24> LOC = AC9 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<23> LOC = Y12 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<22> LOC = Y13 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<21> LOC = AA15 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<20> LOC = AB14 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<19> LOC = AA12 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<18> LOC = AB11 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<17> LOC = AA13 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_data<16> LOC = AA14 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
 
#NET sram_flash_data<15> LOC = AC24 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<14> LOC = AB22 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<13> LOC = AA22 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<12> LOC = AC21 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<11> LOC = AB21 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<10> LOC = W21 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<9> LOC = W20 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<8> LOC = U19 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<7> LOC = U20 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<6> LOC = V19 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<5> LOC = W19 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<4> LOC = Y21 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<3> LOC = Y20 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<2> LOC = AD19 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<1> LOC = AC19 | IOSTANDARD = LVDCI_33;
#NET sram_flash_data<0> LOC = AB20 | IOSTANDARD = LVDCI_33;
 
#NET sram_flash_data<*> PULLDOWN;
 
#NET sram_cen LOC = AB24 | IOSTANDARD = LVDCI_33;
#NET sram_flash_oe_n LOC = AC22 | IOSTANDARD = LVDCI_33;
##NET flash_oe_n LOC = AA9 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_flash_we_n LOC = AB15 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_bw<3> LOC = W24 | IOSTANDARD = LVDCI_33;
#NET sram_bw<2> LOC = W23 | IOSTANDARD = LVDCI_33;
#NET sram_bw<1> LOC = V24 | IOSTANDARD = LVDCI_33;
#NET sram_bw<0> LOC = V23 | IOSTANDARD = LVDCI_33;
##NET flash_cen LOC = AA10 | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = FAST;
#NET sram_adv_ld_n LOC = U21 | IOSTANDARD = LVDCI_33;
#NET sram_mode LOC = AC23 | IOSTANDARD = LVDCI_33;
# NET flash_audio_reset_n LOC = AD10 | IOSTANDARD = LVCMOS33;
 
#------------------------------------------------------------------------------
# IO Pad Location Constraints / Properties for TFT VGA LCD Controller
#------------------------------------------------------------------------------
 
#NET dvi_iic_scl LOC = D21;
#NET dvi_iic_sda LOC = D20;
#NET dvi_iic_scl SLEW = SLOW;
#NET dvi_iic_scl DRIVE = 6;
#NET dvi_iic_scl TIG;
#NET dvi_iic_scl IOSTANDARD = LVCMOS33;
#NET dvi_iic_sda SLEW = SLOW;
#NET dvi_iic_sda DRIVE = 6;
#NET dvi_iic_sda TIG;
#NET dvi_iic_sda IOSTANDARD = LVCMOS33;
 
#NET tft_lcd_data<0> LOC = A17;
#NET tft_lcd_data<1> LOC = B17;
#NET tft_lcd_data<2> LOC = C17;
#NET tft_lcd_data<3> LOC = D18;
#NET tft_lcd_data<4> LOC = C16;
#NET tft_lcd_data<5> LOC = D16;
#NET tft_lcd_data<6> LOC = B16;
#NET tft_lcd_data<7> LOC = B15;
#NET tft_lcd_data<8> LOC = A15;
#NET tft_lcd_data<9> LOC = A14;
#NET tft_lcd_data<10> LOC = B14;
#NET tft_lcd_data<11> LOC = C14;
#NET tft_lcd_data<*> IOSTANDARD = LVDCI_33;
 
#NET tft_lcd_clk_p LOC = A20;
#NET tft_lcd_clk_p IOSTANDARD = LVCMOS33 | DRIVE = 24 | SLEW = FAST;
#NET tft_lcd_clk_n LOC = B20;
#NET tft_lcd_clk_n IOSTANDARD = LVCMOS33 | DRIVE = 24 | SLEW = FAST;
 
#NET tft_lcd_hsync LOC = C19;
#NET tft_lcd_hsync IOSTANDARD = LVDCI_33;
#NET tft_lcd_vsync LOC = D19;
#NET tft_lcd_vsync IOSTANDARD = LVDCI_33;
#NET tft_lcd_de LOC = C18;
#NET tft_lcd_de IOSTANDARD = LVDCI_33;
#NET tft_lcd_reset_b LOC = A18;
#NET tft_lcd_reset_b IOSTANDARD = LVCMOS33;
 
## NET "tft_clk" TNM_NET = "tft_clk";
## TIMESPEC "TSPLB_TFT" = FROM "sys_clk" TO "tft_clk" TIG;
## TIMESPEC "TSTFT_PLB" = FROM "tft_clk" TO "sys_clk" TIG;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for Ethernet
## #------------------------------------------------------------------------------
 
NET eth0_col LOC = G20 | IOSTANDARD = LVCMOS25;
NET eth0_crs LOC = H22 | IOSTANDARD = LVCMOS25;
NET eth0_dv LOC = J19 | IOSTANDARD = LVCMOS25;
NET eth0_rx_clk LOC = F14 | IOSTANDARD = LVCMOS25;
NET eth0_rx_data<3> LOC = E22 | IOSTANDARD = LVCMOS25;
NET eth0_rx_data<2> LOC = E20 | IOSTANDARD = LVCMOS25;
NET eth0_rx_data<1> LOC = E21 | IOSTANDARD = LVCMOS25;
NET eth0_rx_data<0> LOC = F20 | IOSTANDARD = LVCMOS25;
 
NET eth0_rx_er LOC = H19 | IOSTANDARD = LVCMOS25;
NET eth0_tx_clk LOC = D13 | IOSTANDARD = LVCMOS25;
#NET eth0_mii_int_n LOC = F17 | IOSTANDARD = LVCMOS25;
NET eth0_rst_n_o LOC = F8 | IOSTANDARD = LVCMOS25 | PULLUP; # PHY_RESET pin on phy
NET eth0_tx_data<3> LOC = B25 | IOSTANDARD = LVDCI_33;
NET eth0_tx_data<2> LOC = C24 | IOSTANDARD = LVDCI_33;
NET eth0_tx_data<1> LOC = D24 | IOSTANDARD = LVDCI_33;
NET eth0_tx_data<0> LOC = C23 | IOSTANDARD = LVDCI_33;
NET eth0_tx_en LOC = B24 | IOSTANDARD = LVDCI_33;
NET eth0_tx_er LOC = A24 | IOSTANDARD = LVDCI_33;
 
## PHY Serial Management Interface pins
NET eth0_mdc_pad_o LOC = F18 | IOSTANDARD = LVCMOS25;
NET eth0_md_pad_io LOC = E8 | IOSTANDARD = LVCMOS25;
 
## NET phy_mii_int_n PULLUP;
 
## NET phy_mii_int_n TIG;
NET eth0_rst_n_o TIG;
 
## # Timing Constraints (these are recommended in documentation and
## # are unaltered except for the TIG)
#NET "eth0_rx_clk" TNM_NET = "RXCLK_GRP";
NET "eth0_rx_clk_BUFGP" TNM_NET = "RXCLK_GRP";
#NET "eth0_tx_clk" TNM_NET = "TXCLK_GRP";
NET "eth0_tx_clk_BUFGP" TNM_NET = "TXCLK_GRP";
TIMESPEC "TSTXOUT" = FROM "TXCLK_GRP" TO "PADS" 10 ns;
TIMESPEC "TSRXIN" = FROM "PADS" TO "RXCLK_GRP" 6 ns;
 
NET "eth0_rx_data<3>" IOBDELAY=NONE;
NET "eth0_rx_data<2>" IOBDELAY=NONE;
NET "eth0_rx_data<1>" IOBDELAY=NONE;
NET "eth0_rx_data<0>" IOBDELAY=NONE;
NET "eth0_dv" IOBDELAY=NONE;
NET "eth0_rx_er" IOBDELAY=NONE;
NET "eth0_crs" IOBDELAY=NONE;
NET "eth0_col" IOBDELAY=NONE;
 
## # Timing ignores (to specify unconstrained paths)
#FIXME? NET "*clkgen0/wb_clk_o" TNM_NET = "sys_clk"; # Wishbone clock
TIMESPEC "TS_PHYTX_OPB" = FROM "TXCLK_GRP" TO "sys_clk" TIG;
TIMESPEC "TS_OPB_PHYTX" = FROM "sys_clk" TO "TXCLK_GRP" TIG;
TIMESPEC "TS_PHYRX_OPB" = FROM "RXCLK_GRP" TO "sys_clk" TIG;
TIMESPEC "TS_OPB_PHYRX" = FROM "sys_clk" TO "RXCLK_GRP" TIG;
 
## #------------------------------------------------------------------------------
## # IO Pad Location Constraints / Properties for AC97 Sound Controller
## #------------------------------------------------------------------------------
 
## NET ac97_bit_clk LOC = AC13;
## NET ac97_bit_clk IOSTANDARD = LVCMOS33;
## NET ac97_bit_clk PERIOD = 80;
## NET ac97_sdata_in LOC = AC12;
## NET ac97_sdata_in IOSTANDARD = LVCMOS33;
## NET ac97_sdata_out LOC = AC11;
## NET ac97_sdata_out IOSTANDARD = LVCMOS33;
## NET ac97_sync LOC = AD11;
## NET ac97_sync IOSTANDARD = LVCMOS33;
/orpsocv2/boards/xilinx/ml501/backend/par/bin/Makefile
0,0 → 1,195
######################################################################
#### ####
#### ORPSoC Xilinx backend Makefile ####
#### ####
#### Author(s): ####
#### - Julius Baxter, julius@opencores.org ####
#### ####
#### ####
######################################################################
#### ####
#### Copyright (C) 2009,2010 Authors and OPENCORES.ORG ####
#### ####
#### This source file may be used and distributed without ####
#### restriction provided that this copyright statement is not ####
#### removed from the file and that any derivative work contains ####
#### the original copyright notice and the associated disclaimer. ####
#### ####
#### This source file is free software; you can redistribute it ####
#### and/or modify it under the terms of the GNU Lesser General ####
#### Public License as published by the Free Software Foundation; ####
#### either version 2.1 of the License, or (at your option) any ####
#### later version. ####
#### ####
#### This source is distributed in the hope that it will be ####
#### useful, but WITHOUT ANY WARRANTY; without even the implied ####
#### warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ####
#### PURPOSE. See the GNU Lesser General Public License for more ####
#### details. ####
#### ####
#### You should have received a copy of the GNU Lesser General ####
#### Public License along with this source; if not, download it ####
#### from http://www.opencores.org/lgpl.shtml ####
#### ####
######################################################################
 
# Name of the directory we're currently in
CUR_DIR=$(shell pwd)
 
# The root path of the board build
BOARD_DIR ?=$(CUR_DIR)/../../..
PROJECT_ROOT=$(BOARD_DIR)/../../..
 
SYN_DIR=$(BOARD_DIR)/syn/xst
SYN_RUN_DIR=$(SYN_DIR)/run
 
BOARD_BACKEND_DIR=$(BOARD_DIR)/backend/bin
 
DESIGN_NAME=orpsoc
BOARD_NAME=ml501
 
# Set V=1 when calling make to enable verbose output
# mainly for debugging purposes.
ifeq ($(V), 1)
Q=
else
Q ?=@
endif
 
BOARD_RTL_DIR=$(BOARD_DIR)/rtl
BOARD_RTL_VERILOG_DIR=$(BOARD_RTL_DIR)/verilog
# Only 1 include path for board builds - their own!
BOARD_RTL_VERILOG_INCLUDE_DIR=$(BOARD_RTL_VERILOG_DIR)/include
BOARD_DESIGN_VERILOG_DEFINES=$(BOARD_RTL_VERILOG_INCLUDE_DIR)/$(DESIGN_NAME)-defines.v
 
DEFINES_FILE_CUTOFF=$(shell grep -n "end of included module defines" $(BOARD_DESIGN_VERILOG_DEFINES) | cut -d ':' -f 1)
DESIGN_DEFINES=$(shell cat $(BOARD_DESIGN_VERILOG_DEFINES) | sed s://.*::g | sed s:\`:\#:g | sed 's:^[ ]*::' | awk '{print};/^\#define/{printf "_%s=%s\n",$$2,$$2}' | grep -v PERIOD | cpp -P | sed s:^_::g | sed s:=$$::g )
 
# Rule to look at what defines are being extracted from main file
print-defines:
@echo; echo "\t### Design defines ###"; echo
@echo "\tParsing "$(BOARD_DESIGN_VERILOG_DEFINES)" and exporting:"
@echo $(DESIGN_DEFINES)
 
 
# Backend tool path
# Check that the XILINX_PATH variable is set
ifeq ($(XILINX_PATH),)
$(error XILINX_PATH environment variable not set. Set it and rerun)
endif
XILINX_SETTINGS_SCRIPT=$(XILINX_PATH)/settings32.sh
XILINX_SETTINGS_SCRIPT_EXISTS=$(shell if [ -e $(XILINX_SETTINGS_SCRIPT) ]; then echo 1; else echo 0; fi)
ifeq ($(XILINX_SETTINGS_SCRIPT_EXISTS),0)
$(error XILINX_PATH variable not set correctly. Cannot find $$XILINX_PATH/settings32.sh)
endif
 
 
#
# Options for Xilinx PAR tools
#
FPGA_PART=xc5vlx50-ff676-1
XILINX_FLAGS=-intstyle silent
XILINX_MAP_FLAGS=-logic_opt off
XILINX_AREA_TARGET = speed
TIMING_REPORT_OPTIONS = -u 1000 -e 1000
SPI_FLASH_SIZE_KBYTES ?=2048
SPI_BOOTLOADER_SW_OFFSET_HEX ?=1c0000
 
print-config:
$(Q)echo; echo "\t### Backend make configuration ###"; echo
$(Q)echo "\tFPGA_PART="$(FPGA_PART)
$(Q)echo "\tXILINX_FLAGS="$(XILINX_FLAGS)
$(Q)echo "\tXILINX_MAP_FLAGS="$(XILINX_MAP_FLAGS)
$(Q)echo "\tXILINX_AREA_TARGET="$(XILINX_AREA_TARGET)
$(Q)echo "\tTIMING_REPORT_OPTIONS="$(TIMING_REPORT_OPTIONS)
$(Q)echo "\tSPI_FLASH_SIZE_KBYTES="$(SPI_FLASH_SIZE_KBYTES)
$(Q)echo "\tSPI_BOOTLOADER_SW_OFFSET_HEX="$(SPI_BOOTLOADER_SW_OFFSET_HEX)
 
 
 
NGC_FILE=$(SYN_RUN_DIR)/$(DESIGN_NAME).ngc
NGD_FILE=$(DESIGN_NAME).ngd
UCF_FILE=../bin/$(BOARD_NAME).ucf
MAPPED_NCD=$(DESIGN_NAME)_mapped.ncd
PARRED_NCD=$(DESIGN_NAME).ncd
PCF_FILE=$(DESIGN_NAME).pcf
BIT_FILE=$(DESIGN_NAME).bit
BIT_FILE_FOR_SPI=$(DESIGN_NAME)_spiboot.bit
BATCH_FILE=$(DESIGN_NAME).batch
MCS_FILE=$(DESIGN_NAME).mcs
 
$(NGC_FILE):
$(Q)$(MAKE) -C $(SYN_RUN_DIR) $(DESIGN_NAME).ngc
 
$(NGD_FILE): $(UCF_FILE) $(NGC_FILE)
@echo; echo "\t#### Running NGDBuild ####";
$(Q)( . $(XILINX_SETTINGS_SCRIPT) && \
ngdbuild -p $(FPGA_PART) -sd $(BOARD_BACKEND_DIR) -uc $(UCF_FILE) \
$(NGC_FILE) $@ )
 
#This target uses Xilinx tools to perform Mapping
$(MAPPED_NCD): $(NGD_FILE)
@echo; echo "\t#### Mapping ####";
$(Q)( . $(XILINX_SETTINGS_SCRIPT) && \
export XIL_MAP_NO_DSP_AUTOREG=1 && \
export XIL_MAP_ALLOW_ANY_DLL_INPUT=1 && \
map -p $(FPGA_PART) -detail -pr b -cm ${XILINX_AREA_TARGET} \
-timing -ol high -w $(XILINX_FLAGS) -o $@ -xe n $(NGD_FILE) $(PCF_FILE))
 
#This target uses Xilinx tools to Place & Route the design
$(PARRED_NCD): $(MAPPED_NCD)
@echo; echo "\t#### PAR'ing ####";
$(Q)( . $(XILINX_SETTINGS_SCRIPT) && \
par -w -pl high -rl high $(XILINX_FLAGS) $< $@ $(PCD_FILE) )
 
#This target uses Xilinx tools to generate a bitstream for download
$(BIT_FILE): $(PARRED_NCD)
@echo; echo "\t#### Generating .bit file ####";
$(Q)( . $(XILINX_SETTINGS_SCRIPT) && \
bitgen -w $(XILINX_FLAGS) -g StartUpClk:JtagClk $< $@ )
 
$(BIT_FILE_FOR_SPI): $(PARRED_NCD)
@echo; echo "\t#### Generating .bit file for SPI load ####";
$(Q)( . $(XILINX_SETTINGS_SCRIPT) && \
bitgen -w $(XILINX_FLAGS) -g StartUpClk:CClk $< $@ )
ifeq ($(BOOTLOADER_BIN),)
$(MCS_FILE): $(BIT_FILE_FOR_SPI)
@echo; echo "\t#### Generating .mcs file for SPI load ####";
$(Q)( . $(XILINX_SETTINGS_SCRIPT) && \
promgen -spi -p mcs -o $@ -s $(SPI_FLASH_SIZE_KBYTES) -u 0 $< )
else
$(MCS_FILE): $(BIT_FILE_FOR_SPI)
@echo; echo "\t#### Generating .mcs file for SPI load ####";
$(Q)( . $(XILINX_SETTINGS_SCRIPT) && \
promgen -spi -p mcs -o $@ -s $(SPI_FLASH_SIZE_KBYTES) -u 0 $< \
-data_file up $(SPI_BOOTLOADER_SW_OFFSET_HEX) $(BOOTLOADER_BIN) \
)
endif
 
#this target downloads the bitstream to the target fpga
download: $(BIT_FILE) $(BATCH_FILE)
$(Q)( . ${XILINX_PATH}/settings32.sh && \
impact -batch $(BATCH_FILE) )
 
#This target uses netgen to make a simulation netlist
netlist: $(PARRED_NCD)
@echo; echo "\t#### Generating netlist ####";
$(Q)(. $(XILINX_SETTINGS_SCRIPT) && \
netgen -ofmt verilog -sim -dir netlist -pcf $(PCF_FILE) $<)
 
#This one uses TRCE to make a timing report
timingreport: $(PARRED_NCD)
@echo; echo "\t#### Generating timing report ####";
$(Q)(. $(XILINX_SETTINGS_SCRIPT) && \
trce $(TIMING_REPORT_OPTIONS) $< )
 
 
clean:
$(Q)rm -rf *.*
 
clean-syn:
$(Q)$(MAKE) -C $(SYN_RUN_DIR) clean-all
 
clean-all: clean-syn clean
 
.PRECIOUS : $(PARRED_NCD) $(MAPPED_NCD) $(NGC_FILE) $(NGD_FILE) $(BIT_FILE) $(BIT_FILE_FOR_SPI)
/orpsocv2/boards/xilinx/ml501/backend/bin/xilinx_ddr2_if_cache.ngc
0,0 → 1,3
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.5e
$74444<,[o}e~g`n;"2*776(-30<=>?0123416<89:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?01234567;2;%<<=4118JJUSS2hno~o26:1<2<>772F__\XZ5recg`wcdk531<3?:;00;>LHW]]0oecl313594;7038836B[[PTV9`jssj5;9;7>115926?OIX\^1mij}a=32>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>586:2;=6D@_UU8tag:6=3:5=?5<2;KMTPR=L@K7?<4?>00877<NFY__6IGM<2394;743:81EC^ZT;fjjd:493:5=>5<2;MVPUSS2MEJ0>?50?30?64=G\^[YY4KOC>05?699<18>7AZTQWW>air|h68=7>11097>LHW]]0OE]O33;2=54=32@D[YY4KIQ@?7?69981?6D@_UU8TADJ;;3:5=<5;:HLSQQ<PMH_7?7>11197>LHW]]0|il2<:1<26>2=G\^[YY4KOQC?7?699;1?6B[[PTV9@JVE4:0;2i5:vmz64c`1??':=<57:HLSQQ<PMKF7;7>1109;>LHW]]0\IO[37;2==>GCL[KG0=0n;@FGVDJ;994j7LJKR@N?548f3HNO^LB313<b?DBCZHF7=>0n;@FGVDJ;9=4h7LJKR@N?50<76h1JHI\NL=36:<=FLMXJ@1?19:CG@WGK4;427LJKR@N?7;?<IMNYMA2;>89B@ATFD5?556OKDSCO838>3HNO^LB37?;8EABUIE63245NDEPBH9?912KOH_OZ<1<b?DBCZH_7==0n;@FGVDS;984j7LJKR@W?578f3HNO^L[312<`?DBCZH_7=94?>`9B@ATF]5;?245NDEPBQ97912KOH_OZ<3<:?DBCZH_7?374AEFQEP:3601JHI\NU=7==>GCL[K^0;06;@FGVDS;?730MIJ]AT>;:<=FLMXJY1719:CG@WDK494j7LJKRCN?558f3HNO^OB310<b?DBCZKF7=?0n;@FGVGJ;9:4j7LJKRCN?518d3HNO^OB31483:d=FLMXI@1?:>89B@ATED5;556OKDS@O878>3HNO^OB33?;8EABUJE6?245NDEPAH93912KOH_LC<7<:?DBCZKF7;374AEFQFI:?601JHI\ML=;==>GCL[H^0=0n;@FGVGS;994j7LJKRCW?548f3HNO^O[313<b?DBCZK_7=>0l;@FGVGS;9=0;2l5NDEPAQ973601JHI\MU=3==>GCL[H^0?06;@FGVGS;;730MIJ]BT>7:<=FLMXIY1;19:CG@WDR4?427LJKRCW?3;?<IMNYNX27>89B@ATE]535?6OCL29AQ7><J\YTECH@d:ABWFGCM@DGMYOk;BCPGDBBAGFJXOj4C@Q@EACNF[OLMi5LARAB@@OIZLMIi6MNSBCGAJSSDH^Ji6MNSBCGAJSSDH^Ii6MNSBCGAJSSZLMJi6MNSBCGAJSSZLMI=?5LHDAH[IODMGYNSYW_E49@HNGK=2IGGL[:;BNHFI3<KEAIY45LOLOJPQCC9=1HC_KPGDLFVDRNGGUBBKA8;BPFEQCC>2NBM1>17:FJE9776>1OEL2>1?58@LG;9;4<7IGN<01=3>BNI5;?2:5KI@>21;1<L@K7=;08;EKB8419?2NBM1?7>69GMD:617<0HDO31?58@LG;:94<7IGN<33=3>BNI5892:5KI@>17;1<L@K7>908;EKB8739?2NBM1<9>69GMD:5?7=0HDO329<4?AOF4;35:6JFA=0=3>BNI59;245KI@>05?69?2NBM1=>>79GMD:46?1OEL2;>79GMD:26?1OEL29>79GMD:06?1OEL27>79GMD:>6?1OEO2?>69GMG:687=0HDL310<4?AOE4885;6JFB=30:2=CAK6:8394DH@?50803MCI0<817:FJF9706>1OEO2>8?58@LD;904=7IGM<0<4?AOE4;:5;6JFB=02:2=CAK69>394DH@?66803MCI0?:17:FJF9426>1OEO2=6?58@LD;:>4<7IGM<3:=3>BNJ5822;5KIC>1:2=CAK68<374DH@?74<76>1OEO2<1?48@LD;;7<0HDL34?48@LD;=7<0HDL36?48@LD;?7<0HDL38?48@LD;17=0HD^N<1<4?AOWI5;5;6JFP@>1:<=CAYK7?7>17:FJTD:46>1OE]L30?58@LVE484<7IG_B=0==>BNXK686=08;EKSF959>2NDM1>17:FLE9776>1OCL2>1?58@JG;9;4<7IAN<01=3>BHI5;?2:5KO@>21;1<LFK7=;08;EMB8419?2NDM1?7>69GKD:617<0HBO31?58@JG;:94<7IAN<33=3>BHI5892:5KO@>17;1<LFK7>908;EMB8739?2NDM1<9>69GKD:5?7=0HBO329<4?AIF4;35:6J@A=0=3>BHI59;245KO@>05?69?2NDM1=>>79GKD:46?1OCL2;>79GKD:26?1OCL29>79GKD:06?1OCL27>79GKD:>6>1OCLQ]EF48@JD;87=0HBL311<4?AIE48;5;6J@B=31:2=CGK6:?394DN@?51803MEI0<;17:FLF9716>1OCO2>7?58@JD;914<7IAM<0;=2>BHJ5;5;6J@B=03:2=CGK69=394DN@?67803MEI0?=17:FLF9436>1OCO2=5?58@JD;:?4<7IAM<35=3>BHJ5832:5KOC>1=;0<LFH7>394DN@?758>3MEI0>?50?58@JD;;84=7IAM<2<5?AIE4=4=7IAM<4<5?AIE4?4=7IAM<6<5?AIE414=7IAM<8<4?AIEW[OL;6J@P@>3:2=CGYK7=394DNRB878>3ME[M1=50?58@JVF4:4<7IA_B=2=3>BHXK6:2:5KOQ@?6;?<LFZI0>4?>69GKUD;;7>0ICOC4:GMEP2<MGHG86KABT78BDJTM81L?6IAD99JJLRWW9: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?F69JJLRX89=0ECG[_134?LHN\V:9;6GAIU]372=NF@^T<994IOKW[5303@DBXR>97:KMMQY7?>1BBDZP0958MKOSW93<7D@FT^2B3>OIA]U;N:5FNHV\4F1<AGC_S=J8;HLJPZ6B?2CEEYQ?F69JJLRX99=0ECG[_034?LHN\V;9;6GAIU]272=NF@^T=994IOKW[4303@DBXR?97:KMMQY6?>1BBDZP1958MKOSW83<7D@FT^3B3>OIA]U:N:5FNHV\5F1<AGC_S<J8;HLJPZ7B?2CEEYQ>F69JJLRX:9=0ECG[_334?LHN\V89;6GAIU]172=NF@^T>994IOKW[7303@DBXR<97:KMMQY5?>1BBDZP2958MKOSW;3<7D@FT^0B3>OIA]U9N:5FNHV\6F1<AGC_S?J8;HLJPZ4B?2CEEYQ=F69JJLRX;9=0ECG[_234?LHN\V99;6GAIU]072=NF@^T?994IOKW[6303@DBXR=97:KMMQY4?>1BBDZP3958MKOSW:3<7D@FT^1B3>OIA]U8N:5FNHV\7F1<AGC_S>J8;HLJPZ5B?2CEEYQ<F69JJLRX<9=0ECG[_534?LHN\V>9;6GAIU]772=NF@^T8994IOKW[1303@DBXR:97:KMMQY3?>1BBDZP4958MKOSW=3<7D@FT^6B3>OIA]U?N:5FNHV\0F1<AGC_S9J8;HLJPZ2B?2CEEYQ;F69JJLRX=9=0ECG[_434?LHN\V?9;6GAIU]672=NF@^T9994IOKW[0303@DBXR;97:KMMQY2?>1BBDZP5958MKOSW<3<7D@FT^7B3>OIA]U>N:5FNHV\1F1<AGC_S8J8;HLJPZ3B?2CEEYQ:F69JJLRX>9=0ECG[_734?LHN\V<9;6GAIU]572=NF@^T:994IOKW[3303@DBXR897:KMMQY1?>1BBDZP6958MKOSW?3<7D@FT^4B3>OIA]U=N:5FNHV\2F1<AGC_S;J8;HLJPZ0B?2CEEYQ9F69JJLRX?9=0ECG[_634?LHN\V=9;6GAIU]472=NF@^T;994IOKW[2303@DBXR997:KMMQY0?>1BBDZP7958MKOSW>3<7D@FT^5B3>OIA]U<N:5FNHV\3F1<AGC_S:J8;HLJPZ1B?2CEEYQ8F79JJLRXI?1BBDZPB89JJLRXN@FN:6B@AEGG3>JHO@IJ@n5BakmqR`ttafdh7@gaosTfvvohf:1E==:4N0230>H688>0B<>=4:L2462<F8:?86@>0468J461<2D:<::4N02;0>H68090B<?;;O3241=I98;?7C?>259M54533G;:895A1077?K76>=1E=<9;;O32<1=I98387C?=4:L2652<F88:86@>2368J444<2D:>9:4N0060>H6:?>0B<<84:L26=2<F882?6@>359M56633G;8=95A1207?K74;=1E=>:;;O3011=I9:<?7C?<759M56>33G;85>5A1568J427<2D:8<:4N0610>H6<:>0B<:;4:L2002<F8>=86@>4668J42?<2D:84=4N077?K728=1E=8?;;O3661=I9<9?7C?:459M50333G;>:95A1457?K720=1E=87<;O350>H6>9>0B<8>4:L2272<F8<886@>6568J402<2D::;:4N0440>H6>1>0B<863:L231=I9>:?7C?8159M52433G;<?95A1667?K70==1E=:8;;O3431=I9>2?7C?8929M5=2<F82;86@>8068J4>5<2D:4>:4N0:70>H60<>0B<694:L2<22<F82386@>8818J4?33G;2<95A1837?K7>:=1E=4=;;O3:01=I90??7C?6659M5<133G;2495A18;1?K443G8;86@=0168J766<2D9<?:4N3200>H58=>0B?>:4:L1432<F;:<86@=0968J76>;2D9=95A2027?K469=1E><<;;O0271=I:8>?7C<>559M64033G8:;95A20:7?K461:1E>?:4N3030>H5:8>0B?<=4:L1662<F;8?86@=2468J741<2D9>::4N30;0>H5:090B?=;;O0041=I::;?7C<<259M66533G88895A2277?K44>=1E>>9;;O00<1=I::387C<;4:L1052<F;>:86@=4368J724<2D989:4N3660>H5<?>0B?:84:L10=2<F;>2?6@=559M60633G8>=95A2407?K42;=1E>8:;;O0611=I:<<?7C<:759M60>33G8>5>5A2768J707<2D9:<:4N3410>H5>:>0B?8;4:L1202<F;<=86@=6668J70?<2D9:4=4N357?K408=1E>:?;;O0461=I:>9?7C<8459M62333G8<:95A2657?K400=1E>:7<;O0;0>H509>0B?6>4:L1<72<F;2886@=8568J7>2<2D94;:4N3:40>H501>0B?663:L1=1=I:0:?7C<6159M6<433G82?95A2867?K4>==1E>48;;O0:31=I:02?7C<6929M752<F::;86@<0068J665<2D8<>:4N2270>H48<>0B>>94:L0422<F::386@<0818J6733G9:<95A3037?K56:=1E?<=;;O1201=I;8??7C=>659M74133G9:495A30;0?K55<2D8>=:4N2020>H4:;>0B><<4:L0612<F:8>86@<2768J640<2D8>5:4N20:7>H4;=1E?>>;;O1051=I;:8?7C=<359M76233G98995A3247?K54?=1E?>6;;O10=6=I;=>0B>:?4:L0042<F:>986@<4268J623<2D888:4N2650>H4<>>0B>:74:L00<5<F:??7C=:059M70733G9>>95A3417?K52<=1E?8;;;O1621=I;<=?7C=:859M70?43G9=86@<6168J606<2D8:?:4N2400>H4>=>0B>8:4:L0232<F:<<86@<6968J60>;2D8;95A3627?K509:1E?5=4N2;1?K243G>;?6@;129M075<F=987C:;3:L716=I<?90B99<;O6;7>H31:1E9==4N430?K35;2D>?>5A5518J0343G?=?6@:729M1=5<F<397C8<;O437>H19:1E:?=4N710?K03;2D=9>5A6718J3143G<3?6@9939M36=I?990B:?<;O517>H0;:1E;9=4N670?K11;2D<;>5A7918J2?53G287C6?3:L;56=I0;90B5=<;O:77>H?=:1E4;=4N9:1?K?43G3;?6@6129M=75<F0987C7;3:L:16=I1?90B49<;O;;7>H>1o1ENRLZSQKM[UTHXZ=0BHZXOSI7?KIIM;1DG<5_4:RBVQg<X@DTNX]FDY`8TLHXJ\YEM@Kn;SCNF60XMQZm7_OB_DZWAKUNGGUJj6\NM^G[P@HTAFDTNn5]E@F\SLBS@VKh7_KND^UJ@QNXJ>1YIJMJAM58V@ADMH_<7_KHCD@O3>TBOJOIY55]EFAOODJ?3[OLOAENU99QABEKCKF37_KHCMIAQ1=TIOO37^OYEECWE45<[@GTOBBCIRKLJZEOMJA37^GB_LMGA3=TG\XHI:5\RWCO[D1<[[\J@RL:;RQQEI3<[ZXJY85\SS@O1>UTZK_?7YW_E4:8Q5)edbUfi`Qheogqeqiu'kgei lsup,vdkkgfzP<P }al,q+s3Xffceey }al-WVPCXLY$XECICE^RQMH51&]N[955Z0.`ooZkbeVmnbh|ntnp,rdjnl'ixx!}alnlku]6U'xja#| v4]mklhn|'xja"Z]UD]GT+UNFNFNS]\FM24-PAV202_;#obd_lgn[bcim{kc!yamkg*fusz&xjaaa`pZ0^*wgj&{%}9R``iokw*wgj']X^IRJ_.RKMCICXX[CF?; [DQ7;?P6(jeaTahcPgdlfvdrhz&|j`dj!crvq+wgjdfe{W>S!r`o-v*p2Wgebbdz!r`o,PWSBWMZ%_D@HLD]SVLK4>'^O\l5ZSDP\EIOF[j1^_H\PVHQJFIC43_IH56XFEV]W]UC03^OJ@1>17:UFEI:66>1\ILB32?;8S@GK4:0;2:5XE@N?7;1<_LK^0=08;VGBQ979?2]NMX2=>89TADS;;3:5;6YJAT>0:2=PMKF7<394WD@O84803^OI@1<17:UFFI:46>1\IOB34?58S@DK4<4<7ZKML=4==>QBJE6<6=08;VGAH919?2]NNX2?>69TAGS;97=0[HLZ<3<4?RCE]595;6YJBT>7:2=PMK_79394WD@V838>3^OIY1950?58S@DR4>4i7Z\FTD]EMWUSk2]YEYKPMNFF[De<_[C_IRC@DD]A`>QUA]OT[DJ[H^Cg?RTN\LU\EIZG_C3g?]OKAGR&TIL/0/3#WQSE(9$:,L]LIH48\VRKAK=0T^ZPGOFa?]YDG[OTECH@6:ZgfZOcn2RodR^}ilTfvvohf8:0TicPM`hlvScu{`ee==5Wdl]Nmkiu^lxxeb`7;`fgvd.7!11jhi|n(0+:?dbczh":<$74aefqe-76!11jhi|n(3+;?dbczh"8%55ndepb,1/?3hno~l&:)99b`atf ?#37ljkr`*4-==flmxj$5'7;`fgvd.>!11jhi|n<1<:?dbczh6:<3l4aefqe97629427ljkr`>25;><imnym1?18:cg`wg;:720mij}a=1=<>gcl{k78364aefqe93902koho36?:8eabui5=546okdsc?<;><imnym1718:cg`wd/8 20mij}b)3*<>gcl{h#>$64aefqf-5.02kohl'4(:8eabuj!?"46okds`+2,><imnyn%9&8:cg`wd/0 20mij}b);*<>gcl{h7<364aefqf97902kohl32?:8eabuj59546okds`?0;><imnyn1;18:cg`wd;>720mij}b=5=<>gcl{h743o4aefqf9?=8720mij}b=;=6f=edbUfi`Qheo]u7Z7+(Qcgecv/CNPF$Bcim{kc.>1/37?fjli=1h`fl8;e`jp`tu?2nbbl&?)69gmkg/9 20hd`n(02*<>bnfh":=$64dhlb,44.02nbbl&>3(:8`lhf 8>"46jfn`*21,><l`dj$<8&8:fjjd.6? 20hd`n(0:*<>bnfh":5$94dhlb,7/?3mcem%<?)99gmkg/:8#37igaa)01-==cagk#>>'7;ekme-43!11oeco'24+;?aoii!8=%55kioc+62/?3mcem%<7)99gmkg/:0#<7igaa)1*<>bnfh"8<$64dhlb,67.?2nbbl&;)69gmkg/= =0hd`n(7+4?aoii!=";6jfn`*;-2=cagk#5$94dhlb858?3mcem1??>99gmkg;98437igaa=31:==cagk7=>07;ekme973611oeco314<;?aoii5;=255kioc?528?3mcem1?7>99gmkg;904<7igaa=3=<>bnfh69<364dhlb877902nbbl2=2?:8`lhf4;9546jfn`>10;><l`dj0?;18:fjjd:5>720hd`n<35=<>bnfh694364dhlb87?9?2nbbl2=>99gmkg;;94j7igaa=12>58?3mcem1=>>69gmkg;;7=0hd`n<5<4?aoii5?5;6jfn`>5:2=cagk7;394dhlb8=803mcem1717:fjjg.7!>1oecl'1(:8`lhe 8:"56jfnc*245/>3mcen%??1(;8`lhe 8:9%45kio`+555.12nbbo&>05+:?aoij!;;9$74dhla,461!01oecl'115*=>bnfk":<5'6;ekmf-771 20hd`m(03*=>bnfk":=='6;ekmf-769 30hd`m(031-<=cagh#=<=&9:fjjg.69=#27igab)321,?<l`di$<?9)89gmkd/98="56jfnc*25=/>3mcen%?>9(:8`lhe 88"56jfnc*265/>3mcen%?=1(;8`lhe 889%45kio`+575.12nbbo&>25+:?aoij!;99$74dhla,441!01oecl'135*<>bnfk":?$64dhla,42.02nbbo&>5(:8`lhe 8<"46jfnc*23,><l`di$<6&8:fjjg.61 =0hd`m(3+;?aoij!8;%55kio`+64/?3mcen%<=)99gmkd/::#37igab)07-==cagh#>8'7;ekmf-41!11oecl'26+;?aoij!83%55kio`+6</03mcen%=&8:fjjg.48 20hd`m(23*<>bnfk"8>$64dhla,65.02nbbo&<4(:8`lhe :?"46jfnc*02,><l`di$>9&8:fjjg.40 20hd`m(2;*3>bnfk"?%55kio`+05/?3mcen%:>)99gmkd/<;#37igab)60-==cagh#89'7;ekmf-22!11oecl'47+;?aoij!><%55kio`+0=/?3mcen%:6)69gmkd/= 20hd`m(42*<>bnfk">=$64dhla,04.02nbbo&:3(:8`lhe <>"46jfnc*61,><l`di$88&8:fjjg.2? 20hd`m(4:*<>bnfk">5$94dhla,3/?3mcen%8?)99gmkd/>8#37igab)41-==cagh#:>'7;ekmf-03!11oecl'64+;?aoij!<=%55kio`+22/?3mcen%87)99gmkd/>0#<7igab)5*<>bnfk"<<$64dhla,27.02nbbo&82(:8`lhe >9"46jfnc*40,><l`di$:;&8:fjjg.0> 20hd`m(65*<>bnfk"<4$64dhla,2?.?2nbbo&7)99gmkd/09#37igab):2-==cagh#4?'7;ekmf->4!11oecl'85+;?aoij!2>%55kio`+<3/?3mcen%68)99gmkd/01#37igab)::-2=cagh#5$64dhla,<6.02nbbo&61(:8`lhe 08"46jfnc*:7,><l`di$4:&8:fjjg.>= 20hd`m(84*<>bnfk"2;$64dhla,<>.02nbbo&69(58`lhe49427igab=334;?<l`di0<>>>89gmkd;998556jfnc>2468>3mcen1??4?;8`lhe48:>245kio`?550912nbbo2>06<:?aoij5;;4374dhla846>611oecl311<:?aoij5;:<374dhla8476601oecl3100==>bnfk6:=>06;ekmf976<730hd`m<036:<=cagh7=<819:fjjg:69>427igab=32<;?<l`di0<?6>99gmkd;98427igab=314;?<l`di0<<>>89gmkd;9;8556jfnc>2668>3mcen1?=4?;8`lhe488>245kio`?5709j2nbbo2>2683:<=cagh7=?918:fjjg:6:720hd`m<01=<>bnfk6:8364dhla843902nbbo2>6?:8`lhe48=546jfnc>2<;><l`di0<717:fjjg:6611oecl321<;?aoij58:255kio`?678?3mcen1<<>99gmkd;:=437igab=06:==cagh7>;07;ekmf940611oecl329<;?aoij5822:5kio`?6;><l`di0>>18:fjjg:49720hd`m<20=<>bnfk68?364dhla862902nbbo2<5?:8`lhe4:<546jfnc>03;><l`di0>618:fjjg:417=0hd`m<2<;?aoij5>;255kio`?048?3mcen1:=>99gmkd;<:437igab=67:==cagh78807;ekmf921611oecl346<;?aoij5>3255kio`?0<803mcen1:18:fjjg:28720hd`m<43=<>bnfk6>>364dhla805902nbbo2:4?:8`lhe4<?546jfnc>62;><l`di08918:fjjg:20720hd`m<4;=3>bnfk6>255kio`?258?3mcen18>>99gmkd;>;437igab=40:==cagh7:907;ekmf902611oecl367<;?aoij5<<255kio`?2=8?3mcen186>69gmkd;>720hd`m<62=<>bnfk6<=364dhla824902nbbo283?:8`lhe4>>546jfnc>41;><l`di0:818:fjjg:0?720hd`m<6:=<>bnfk6<5394dhla828?3mcen16?>99gmkd;08437igab=:1:==cagh74>07;ekmf9>3611oecl384<;?aoij52=255kio`?<28?3mcen167>99gmkd;004<7igab=:=<>bnfk62<364dhla8<7902nbbo262?:8`lhe409546jfnc>:0;><l`di04;18:fjjg:>>720hd`m<85=<>bnfk624364dhla8<?9?2nbbo26>99gkprf 9#37iazt`*2-<=cg|~j$<>&9:flqqg/98#27iazt`*26,?<lfm%?<)89gkprf 8>"56j`uuc+50/>3me~xl&>6(;8`jssi!;<%45kotvb,4>.12ndyyo'18+;?air|h"9%45kotvb,76.12ndyyo'20+:?air|h"9>$74dnwwe-44!01ocxzn(36*=>bh}}k#>8'6;emvpd.5> 30hb{{a)04-<=cg|~j$?6&9:flqqg/:0#37iazt`*0-<=cg|~j$>>&9:flqqg/;8#37iazt`*7-==cg|~j$8'7;emvpd.1!11ocxzn(6+;?air|h"3%55kotvb,</?3me~xl2?>89gkprf48:556j`uuc?548>3me~xl2>2?;8`jssi5;8245kotvb842912ndyyo314<:?air|h6::374dnwwe970601ocxzn<0:==>bh}}k7=407;emvpd:6601ocxzn<32==>bh}}k7><06;emvpd:5:730hb{{a=00:<=cg|~j0?:19:flqqg;:<427iazt`>12;?<lfm1<8>89gkprf4;2556j`uuc?6<8?3me~xl2=>89gkprf4::5n6j`uuc?74<7601ocxzn<23=<>bh}}k7?364dnwwe92902ndyyo35?:8`jssi5<546j`uuc?3;><lfm1618:flqqg;1720hb{{b)2*<>bh}}h#=$74dnwwf-77!h1ocxzm(023-d=cg|~i$<>>)`9gkpre 8:9%l5kotva,464!h1ocxzm(027-d=cg|~i$<>:)`9gkpre 8:=%l5kotva,460!h1ocxzm(02;-d=cg|~i$<>6)89gkpre 8;"m6j`uu`+546.i2ndyyl'103*e>bh}}h#=<<&a:flqqd/989"m6j`uu`+542.i2ndyyl'107*e>bh}}h#=<8&a:flqqd/98="m6j`uu`+54>.i2ndyyl'10;*=>bh}}h#=?'n;emvpg.6:9#j7iaztc*264/f3me~xo&>23+b?air|k":>>'n;emvpg.6:=#j7iaztc*260/f3me~xo&>27+b?air|k":>:'6;emvpg.6; 30hb{{b)37-<=cg|~i$<;&9:flqqd/9?#27iaztc*23,?<lfn%?7)89gkpre 83"46j`uu`+6,?<lfn%<?)89gkpre ;;"56j`uu`+67/>3me~xo&=3(;8`jssj!8?%45kotva,73.12ndyyl'27+:?air|k"9;$74dnwwf-4?!01ocxzm(3;*<>bh}}h#?$74dnwwf-57!01ocxzm(23*=>bh}}h#??'6;emvpg.4; 30hb{{b)17-<=cg|~i$>;&9:flqqd/;?#27iaztc*03,?<lfn%=7)89gkpre :3"46j`uu`+0,?<lfn%:?)89gkpre =;"56j`uu`+07/>3me~xo&;3(;8`jssj!>?%45kotva,13.12ndyyl'47+:?air|k"?;$74dnwwf-2?!01ocxzm(5;*<>bh}}h#9$74dnwwf-37!01ocxzm(43*=>bh}}h#9?'6;emvpg.2; 30hb{{b)77-<=cg|~i$8;&9:flqqd/=?#27iaztc*63,?<lfn%;7)89gkpre <3"46j`uu`+2,?<lfn%8?)89gkpre ?;"56j`uu`+27/>3me~xo&93(;8`jssj!<?%45kotva,33.12ndyyl'67+:?air|k"=;$74dnwwf-0?!01ocxzm(7;*<>bh}}h#;$74dnwwf-17!01ocxzm(63*=>bh}}h#;?'6;emvpg.0; 30hb{{b)57-<=cg|~i$:;&9:flqqd/??#27iaztc*43,?<lfn%97)89gkpre >3"46j`uu`+<,?<lfn%6?)89gkpre 1;"56j`uu`+<7/>3me~xo&73(;8`jssj!2?%45kotva,=3.12ndyyl'87+:?air|k"3;$74dnwwf->?!01ocxzm(9;*<>bh}}h#5$74dnwwf-?7!01ocxzm(83*=>bh}}h#5?'6;emvpg.>; 30hb{{b);7-<=cg|~i$4;&9:flqqd/1?#27iaztc*:3,?<lfn%77)89gkpre 03"46j`uu`?4;g<lfn1??0?c8`jssj5;;=3o4dnwwf977:7k0hb{{b=337;g<lfn1??4?c8`jssj5;;93o4dnwwf977>7k0hb{{b=333;g<lfn1??8?c8`jssj5;;5374dnwwf9776h1ocxzm<033:d=cg|~i0<?>>`9gkpre48;92l5kotva84746h1ocxzm<037:d=cg|~i0<?:>`9gkpre48;=2l5kotva84706h1ocxzm<03;:d=cg|~i0<?6>89gkpre48;5m6j`uu`?5769i2ndyyl3133=e>bh}}h7=?<1a:flqqd;9;95m6j`uu`?5729i2ndyyl3137=e>bh}}h7=?81c:flqqd;9;=1<3o4dnwwf975?730hb{{b=31:<=cg|~i0<=19:flqqd;9=427iaztc>21;?<lfn1?9>89gkpre48=556j`uu`?5=8>3me~xo2>9?:8`jssj5;556j`uu`?658>3me~xo2=1?;8`jssj589245kotva875912ndyyl325<:?air|k699374dnwwf941601ocxzm<35==>bh}}h7>506;emvpg:51720hb{{b=0==>bh}}h7?=06;emvpg:49730hb{{b=11:<=cg|~i0>=19:flqqd;;=427iaztc>01;?<lfn1=9>89gkpre4:=556j`uu`?7=8>3me~xo2<9?:8`jssj59556j`uu`?058>3me~xo2;1?;8`jssj5>9245kotva815912ndyyl345<:?air|k6?9374dnwwf921601ocxzm<55==>bh}}h78506;emvpg:31720hb{{b=6==>bh}}h79=06;emvpg:29730hb{{b=71:<=cg|~i08=19:flqqd;==427iaztc>61;?<lfn1;9>89gkpre4<=556j`uu`?1=8>3me~xo2:9?:8`jssj5?556j`uu`?258>3me~xo291?;8`jssj5<9245kotva835912ndyyl365<:?air|k6=9374dnwwf901601ocxzm<75==>bh}}h7:506;emvpg:11720hb{{b=4==>bh}}h7;=06;emvpg:09730hb{{b=51:<=cg|~i0:=19:flqqd;?=427iaztc>41;?<lfn199>89gkpre4>=556j`uu`?3=8>3me~xo289?:8`jssj5=556j`uu`?<58>3me~xo271?;8`jssj529245kotva8=5912ndyyl385<:?air|k639374dnwwf9>1601ocxzm<95==>bh}}h74506;emvpg:?1720hb{{b=:==>bh}}h75=06;emvpg:>9730hb{{b=;1:<=cg|~i04=19:flqqd;1=427iaztc>:1;?<lfn179>89gkpre40=556j`uu`?==8>3me~xo269?:8`jssj53546kkig0mca5<mgk87h`md:kmn`eslkci|k;hliafrtj`~n~?9;ln644Ycl{8T{oQff^abgmc492gg9=?Pdep1[rdXaoUhmnfj,cnh[hcjWnoeS{=P1-LLJ@*IGGO8h>5bl422[abu:V}iSdhPc`aka)dkcVgnaRijn^t0[4*|kVbjR|jgbga95*dWakxSkhcdc>4)eXelgTxt~j=3.`[wuszhgTn0>#c^pppwgjWh7; nQ}su]w}uc:[PDH nQgar]jjocd|lxy1="l_qpjiZr~xl7: nQfnhva[sgk59&hSknd^uj`qnXj4;94!mPrdcg[roc|aUj1><#c^fjwddkmV}j~cQmhw]`kij:8%iTecg{_gkoaZhfel7ecRm`e^djh`Ykghnnh!mPwskwaZkhllUi1Z\FTD]EMWUS$jU|~dzj_lmgaZg:_[C_IRHFRRV/gZkrpVzb|hbfnd]ppdab{4:'oRfns^ofiZir|ySkhs^`>4)eXdfkoSd`ft^djh`;7$jUcm~Qbel]lqqvr|Vxnk~Qn=1.`[rtn|lUoi}zg_c?2472+kV}yeykPddrwlZg:<93= nQgar]qwqd:8%iTdl}Prrvb95*dW`dbxlQyam?3(fYoizUfyuQ`uurvpZtbozUi1="l_icp[hsWf|xzPrdep[d;7$jUjhi|n_vkgpm;6:%iTmij}b^uj`qn:99&hSikiatnw[agsi4:'oR{|e^g`g86+kVkgkb|ftio>5)eXl`yjnakPw`pm[gnqW{kekh3?,b]tvlrbW~coxeQm=00;(fYpz`~nSzgkti]b964+kVxnmiQkeqvk[g;68;>'oRlvtd]pmc:0%iT~hok_egspmYf5=:2:!mPsho\gjjkazcdbRmgebi>EIJ+kVida`aa_bnh95*dW~ojSzgkti?7(fYoizUnbo3>,b]kevYbfh7: nQxec]tmaro58<'obcoogmpZhfel7f`8>>_efq6ZqeW`lTolmge-a\qvcXjp~nSzkm=0.`[pubWksiRyja<3/gZtt|Vzyeb|ftx]a9FC+kVxxxR~}inpjp|Yf5JO'oR{|e^ffbdsk|Vnjxl3?,|0g?hj288Uoh<Pwc]jbZefkaoTnaePmdo\c`hX~:U:Su}{_0:8jbee}`foo6|kaefqafe/8 i0~iokdsg`g-7.k2xomij}eba+6,e<zmkohklc)1*g>tcimnyinm'4(a8vagcl{oho%;&c:pgeabumji#:$m4recg`wcdk!="o6|kaefqafe/0 i0~iokdsg`g-?.k2xomij}eba?4;c<zmkohklc=;94;0<zlmhil84rde`ag2<zz~j86||tc58wgosm{x9>6zbp.]`c*kk=9;Thi|=_v`\mcYdijbn"ci`6:ufe-6.>2}nm%?&6:ufe-4.>2}nm%=&6:ufe969>2}nm1?16:ufe94902}nm1=50?48s`g;;7<0{hl'0(48s`d/9 =0{hl'11+4?rce 8;";6yjb)31-2=pmk":?$94wd`+51/03~oi$<;&6:uff-4.>2}nn%=&6:uff-2.>2}nn%;&6:uff-0.>2}nn%9&6:uff->.>2}nn%7&6:uff969?2}nn1??>69tag:697=0{hl313<4?rce4895;6yjb=37:<=pmk6:97>17:uff9726?1|io2>>79tag:56?1|io2<>79tag:36?1|io2:>79tag:16?1|io28>79tag:?6?1|io26>|BCtg3?3IJs:>m5F;695~U0:3<9=7=5120a02b=90;iiv`<6882?k51i3?0(>88:240?xU083<9=7=5120a02b=90;ii6]>a6856d<72899n99k:0;2g4=T?90=>l4?:011f11c283:o?5k63494?7=9rY<>78=1;19564e<>n1=4?me:tW764=83;1=7?9fzQ46?059391=><m46f95<7em2.88<4>a99U73>=:r:m44>;t3be?6<u-9:i7?m;c412?6=9?o1?7?9ezJ07c=]>;03w<65d;:90?742>0:<785}%10=?05>2.8:;4<989j274=831b:?=50;9j216=83.8>=49459m74`=821b:>h50;&065<1<=1e?<h51:9j26c=83.8>=49459m74`=:21b:>j50;&065<1<=1e?<h53:9j21b=83.8>=495b9m74`=821b:9m50;&065<1=j1e?<h51:9j21d=83.8>=495b9m74`=:21b:9o50;&065<1=j1e?<h53:9j21?=83.8>=495b9m74`=<21b:9650;&065<1=j1e?<h55:9j203=83.8>=495b9m74`=>21b:8:50;&065<1=j1e?<h57:9j205=83.8>=495b9m74`=021b:8<50;&065<1=j1e?<h59:9j207=83.8>=495b9m74`=i21b:8>50;&065<1=j1e?<h5b:9j21`=83.8>=495b9m74`=k21b:9k50;&065<1=j1e?<h5d:9j211=83.8>=495b9m74`=m21b:9850;&065<1=j1e?<h5f:9j73c=83.8>=4<789m74`=821b?;j50;&065<4?01e?<h51:9j720=83.8>=4<789m74`=:21b?:;50;&065<4?01e?<h53:9j722=83.8>=4<789m74`=<21b?:=50;&065<4?01e?<h55:9j724=83.8>=4<789m74`=>21b?:?50;&065<4?01e?<h57:9j726=83.8>=4<789m74`=021b?;h50;&065<4?01e?<h59:9j73e=83.8>=4<789m74`=i21b?;l50;&065<4?01e?<h5b:9j7=b=83.8>=4<969m74`=821b?5m50;&065<41>1e?<h51:9j7=d=83.8>=4<969m74`=:21b?5o50;&065<41>1e?<h53:9j7=?=83.8>=4<969m74`=<21b?5650;&065<41>1e?<h55:9j7=1=83.8>=4<969m74`=>21b?5850;&065<41>1e?<h57:9j7=3=83.8>=4<969m74`=021b?5:50;&065<41>1e?<h59:9l0c>=83.8>=4:169m74`=821d8k950;&065<29>1e?<h51:9l0c3=83.8>=4:169m74`=:21d8k:50;&065<29>1e?<h53:9l0c5=83.8>=4:169m74`=<21d8k<50;&065<29>1e?<h55:9l0c7=83.8>=4:169m74`=>21d8k>50;&065<29>1e?<h57:9l0``=83.8>=4:169m74`=021d8hk50;&065<29>1e?<h59:9l0`b=83.8>=4:169m74`=i21d8hm50;&065<29>1e?<h5b:9l0`g=83.8>=4:169m74`=k21d8h750;&065<29>1e?<h5d:9l0`>=83.8>=4:169m74`=m21d8h950;&065<29>1e?<h5f:9l0`0=83.8>=4:169m74`=9910c9k::18'776==8=0b>?i:038?j2b<3:1(><?:434?k56n3;976a;e283>!5583?:;6`<1g827>=h<l81<7*<218652=i;8l1=954o5g2>5<#;;:19<94n23e>43<3f>mi7>5$203>0703g9:j7?9;:m7ba<72-99<7;>7:l05c<6?21d8km50;&065<29>1e?<h51998k1`e290/??>55058j67a28307b:ia;29 6472<;<7c=>f;3b?>i3n00;6)==0;723>h49o0:n65`4g494?"4:90>=:5a30d95f=<g=oi6=4+3329141<f:;m6<j4;n6f4?6=,:8;68?8;o12b?7b32e?hk4?:%114?36?2d8=k4>f:9l116=83.8>=4:bd9m74`=821d9>h50;&065<2jl1e?<h51:9l16c=83.8>=4:bd9m74`=:21d9>j50;&065<2jl1e?<h53:9l16e=83.8>=4:bd9m74`=<21d9>l50;&065<2jl1e?<h55:9l16g=83.8>=4:bd9m74`=>21d9>750;&065<2jl1e?<h57:9l161=83.8>=4:bd9m74`=021d9>850;&065<2jl1e?<h59:9l163=83.8>=4:bd9m74`=i21d9>:50;&065<2jl1e?<h5b:9l165=83.8>=4:bd9m74`=k21d9><50;&065<2jl1e?<h5d:9l167=83.8>=4:bd9m74`=m21d9>>50;&065<2jl1e?<h5f:9l17`=83.8>=4:bd9m74`=9910c8<j:18'776==ko0b>?i:038?j35k3:1(><?:4`f?k56n3;976a:2c83>!5583?ii6`<1g827>=h=;k1<7*<2186f`=i;8l1=954o40:>5<#;;:19ok4n23e>43<3f?947>5$203>0db3g9:j7?9;:m662<72-99<7;me:l05c<6?21d9?850;&065<2jl1e?<h51998k042290/??>55cg8j67a28307b;=4;29 6472<hn7c=>f;3b?>i2::0;6)==0;7aa>h49o0:n65`58d94?"4:90>nh5a30d95f=<g<3n6=4+33291gc<f:;m6<j4;n7:`?6=,:8;68lj;o12b?7b32e>5n4?:%114?3em2d8=k4>f:9l1<d=83.8>=4:bd9m74`=:910c87n:18'776==ko0b>?i:338?j3>13:1(><?:4`f?k56n38976a:9983>!5583?ii6`<1g817>=h=0=1<7*<2186f`=i;8l1>954o4;5>5<#;;:19ok4n23e>73<3f?287>5$203>0db3g9:j7<9;:m6=6<72-99<7;me:l05c<5?21d94<50;&065<2jl1e?<h52998k0?6290/??>55cg8j67a2;307b;60;29 6472<hn7c=>f;0b?>i20o0;6)==0;7aa>h49o09n65`59g94?"4:90>nh5a30d96f=<g<2o6=4+33291gc<f:;m6?j4;n7;g?6=,:8;68lj;o12b?4b32e>4o4?:%114?3em2d8=k4=f:9l1=?=83.8>=4:bd9m74`=;910c867:18'776==ko0b>?i:238?j3??3:1(><?:4`f?k56n39976a:8783>!5583?ii6`<1g807>=h=1?1<7*<2186f`=i;8l1?954o4:7>5<#;;:19ok4n23e>63<3f?3?7>5$203>0db3g9:j7=9;:m6<7<72-99<7;me:l05c<4?21d95?50;&065<2jl1e?<h53998k0>7290/??>55cg8j67a2:307b;8e;29 6472<hn7c=>f;1b?>i2?m0;6)==0;7aa>h49o08n65`56a94?"4:90>nh5a30d97f=<g<=i6=4+33291gc<f:;m6>j4;n74e?6=,:8;68lj;o12b?5b32e>;44?:%114?3em2d8=k4<f:9l12>=83.8>=4:bd9m74`=<910c898:18'776==ko0b>?i:538?j30>3:1(><?:4`f?k56n3>976a:7483>!5583?ii6`<1g877>=h=>91<7*<2186f`=i;8l18954o451>5<#;;:19ok4n23e>13<3f?<=7>5$203>0db3g9:j7:9;:m635<72-99<7;me:l05c<3?21d9;h50;&065<2jl1e?<h54998k00b290/??>55cg8j67a2=307b;9d;29 6472<hn7c=>f;6b?>i2>j0;6)==0;7aa>h49o0?n65`57`94?"4:90>nh5a30d90f=<g<<j6=4+33291gc<f:;m69j4;n75<?6=,:8;68lj;o12b?2b32e>::4?:%114?3em2d8=k4;f:9l130=83.8>=4:bd9m74`==910c88::18'776==ko0b>?i:438?j31<3:1(><?:4`f?k56n3?976a:6283>!5583?ii6`<1g867>=h=?81<7*<2186f`=i;8l19954o442>5<#;;:19ok4n23e>03<3f?=<7>5$203>0db3g9:j7;9;:m61c<72-99<7;me:l05c<2?21d98j50;&065<2jl1e?<h55998k03d290/??>55cg8j67a2<307b;:b;29 6472<hn7c=>f;7b?>i2=h0;6)==0;7aa>h49o0>n65`54;94?"4:90>nh5a30d91f=<g<?36=4+33291gc<f:;m68j4;n763?6=,:8;68lj;o12b?3b32e>9;4?:%114?3em2d8=k4:f:9l103=83.8>=4:bd9m74`=>910c8;;:18'776==ko0b>?i:738?j32:3:1(><?:4`f?k56n3<976a:5083>!5583?ii6`<1g857>=h=<:1<7*<2186f`=i;8l1:954o46e>5<#;;:19ok4n23e>33<3f??i7>5$203>0db3g9:j789;:m60a<72-99<7;me:l05c<1?21d99m50;&065<2jl1e?<h56998k02e290/??>55cg8j67a2?307b;;a;29 6472<hn7c=>f;4b?>i2<00;6)==0;7aa>h49o0=n65`55594?"4:90>nh5a30d92f=<g<>=6=4+33291gc<f:;m6;j4;n771?6=,:8;68lj;o12b?0b32e>894?:%114?3em2d8=k49f:9l115=83.8>=4:bd9m74`=?910c8:=:18'776==ko0b>?i:638?j3393:1(><?:4`f?k56n3=976a:3983>!5583?ii6`<1g847>=h=;n1<7*<2186f`=i;8l1;954o401>5<#;;:19ok4n23e>23<3f?297>5$203>0db3g9:j799;:m6<d<72-99<7;me:l05c<0?21d9:h50;&065<2jl1e?<h57998k013290/??>55cg8j67a2>307b;99;29 6472<hn7c=>f;5b?>i2=l0;6)==0;7aa>h49o0<n65`54194?"4:90>nh5a30d93f=<g<>36=4+33291gc<f:;m6:j4;n715?6=,:8;68lj;o12b?1b32e>>=4?:%114?3em2d8=k48f:9j7<g=831b?4l50;9j7g0=83.8>=4<d49m74`=821b?o;50;&065<4l<1e?<h51:9j7g5=83.8>=4<d49m74`=:21b?o<50;&065<4l<1e?<h53:9j7g7=83.8>=4<d49m74`=<21b?o>50;&065<4l<1e?<h55:9j7d`=83.8>=4<d49m74`=>21b?lk50;&065<4l<1e?<h57:9j7db=83.8>=4<d49m74`=021b?lm50;&065<4l<1e?<h59:9j7dd=83.8>=4<d49m74`=i21b?lo50;&065<4l<1e?<h5b:9j7d>=83.8>=4<d49m74`=k21b?l950;&065<4l<1e?<h5d:9j7d0=83.8>=4<d49m74`=m21b?l;50;&065<4l<1e?<h5f:9j7d2=83.8>=4<d49m74`=9910e>o<:18'776=;m?0b>?i:038?l5f:3:1(><?:2f6?k56n3;976g<a083>!55839o96`<1g827>=n;h:1<7*<2180`0=i;8l1=954i2;e>5<#;;:1?i;4n23e>43<3`9io7>5$203>6b23g9:j7?9;:k0fg<72-99<7=k5:l05c<6?21b?oo50;&065<4l<1e?<h51998m6d>290/??>53e78j67a28307d=m8;29 6472:n>7c=>f;3b?>o4j>0;6)==0;1g1>h49o0:n65f3c694?"4:908h85a30d95f=<a:k26=4+33297a3<f:;m6<j4;h1:a?6=,:8;6>j:;o12b?7b32c85i4?:%114?5c=2d8=k4>f:9j7cc=83.8>=4;7b9m74`=821b?kj50;&065<3?j1e?<h51:9j7ce=83.8>=4;7b9m74`=:21b?kl50;&065<3?j1e?<h53:9j7cg=83.8>=4;7b9m74`=<21b?k750;&065<3?j1e?<h55:9j7c>=83.8>=4;7b9m74`=>21b?k950;&065<3?j1e?<h57:9j7c3=83.8>=4;7b9m74`=021b?k:50;&065<3?j1e?<h59:9j7c5=83.8>=4;7b9m74`=i21b?k<50;&065<3?j1e?<h5b:9j7c7=83.8>=4;7b9m74`=k21b?k>50;&065<3?j1e?<h5d:9j7``=83.8>=4;7b9m74`=m21b?hk50;&065<3?j1e?<h5f:9j7`b=83.8>=4;7b9m74`=9910e>kl:18'776=<>i0b>?i:038?l5bi3:1(><?:55`?k56n3;976g<e883>!5583><o6`<1g827>=n;l21<7*<21873f=i;8l1=954i2g4>5<#;;:18:m4n23e>43<3`9n:7>5$203>11d3g9:j7?9;:k0a0<72-99<7:8c:l05c<6?21b?h:50;&065<3?j1e?<h51998m6c4290/??>546a8j67a28307d=j2;29 6472==h7c=>f;3b?>o4m80;6)==0;64g>h49o0:n65f44f94?"4:90?;n5a30d95f=<a=?h6=4+332902e<f:;m6<j4;h66f?6=,:8;699l;o12b?7b32c?9l4?:%114?20k2d8=k4>f:9j00?=83.8>=4;7b9m74`=:910e9;7:18'776=<>i0b>?i:338?l22?3:1(><?:55`?k56n38976g;5783>!5583><o6`<1g817>=n<<?1<7*<21873f=i;8l1>954i577>5<#;;:18:m4n23e>73<3`>>>7>5$203>11d3g9:j7<9;:k714<72-99<7:8c:l05c<5?21b88>50;&065<3?j1e?<h52998m12a290/??>546a8j67a2;307d:;e;29 6472==h7c=>f;0b?>o3<m0;6)==0;64g>h49o09n65f45a94?"4:90?;n5a30d96f=<a=>i6=4+332902e<f:;m6?j4;h67e?6=,:8;699l;o12b?4b32c?844?:%114?20k2d8=k4=f:9j011=83.8>=4;7b9m74`=;910e9:9:18'776=<>i0b>?i:238?l23=3:1(><?:55`?k56n39976g;4583>!5583><o6`<1g807>=n<=91<7*<21873f=i;8l1?954i561>5<#;;:18:m4n23e>63<3`>?=7>5$203>11d3g9:j7=9;:k705<72-99<7:8c:l05c<4?21b8>h50;&065<3?j1e?<h53998m15b290/??>546a8j67a2:307d:<c;29 6472==h7c=>f;1b?>o3;k0;6)==0;64g>h49o08n65f42c94?"4:90?;n5a30d97f=<a=926=4+332902e<f:;m6>j4;h60<?6=,:8;699l;o12b?5b32c??:4?:%114?20k2d8=k4<f:9j060=83.8>=4;7b9m74`=<910e9=::18'776=<>i0b>?i:538?l24<3:1(><?:55`?k56n3>976g;3283>!5583><o6`<1g877>=n<:;1<7*<21873f=i;8l18954i513>5<#;;:18:m4n23e>13<3`>9j7>5$203>11d3g9:j7:9;:k76`<72-99<7:8c:l05c<3?21b8?j50;&065<3?j1e?<h54998m14d290/??>546a8j67a2=307d:=b;29 6472==h7c=>f;6b?>o3:h0;6)==0;64g>h49o0?n65f43;94?"4:90?;n5a30d90f=<a=836=4+332902e<f:;m69j4;h612?6=,:8;699l;o12b?2b32c?>84?:%114?20k2d8=k4;f:9j072=83.8>=4;7b9m74`==910e9<<:18'776=<>i0b>?i:438?l25:3:1(><?:55`?k56n3?976g;2083>!5583><o6`<1g867>=n<;:1<7*<21873f=i;8l19954i53e>5<#;;:18:m4n23e>03<3`>:i7>5$203>11d3g9:j7;9;:k75a<72-99<7:8c:l05c<2?21b8<l50;&065<3?j1e?<h55998m17f290/??>546a8j67a2<307d:>9;29 6472==h7c=>f;7b?>o3910;6)==0;64g>h49o0>n65f40594?"4:90?;n5a30d91f=<a=;=6=4+332902e<f:;m68j4;h621?6=,:8;699l;o12b?3b32c?=94?:%114?20k2d8=k4:f:9j045=83.8>=4;7b9m74`=>910e9?=:18'776=<>i0b>?i:738?l2683:1(><?:55`?k56n3<976g;0g83>!5583><o6`<1g857>=n<9o1<7*<21873f=i;8l1:954i52g>5<#;;:18:m4n23e>33<3`>;o7>5$203>11d3g9:j789;:k74g<72-99<7:8c:l05c<1?21b8=o50;&065<3?j1e?<h56998m16>290/??>546a8j67a2?307d:?8;29 6472==h7c=>f;4b?>o38>0;6)==0;64g>h49o0=n65f41794?"4:90?;n5a30d92f=<a=:?6=4+332902e<f:;m6;j4;h637?6=,:8;699l;o12b?0b32c?<?4?:%114?20k2d8=k49f:9j057=83.8>=4;7b9m74`=?910e9>?:18'776=<>i0b>?i:638?l5an3:1(><?:55`?k56n3=976g<f783>!5583><o6`<1g847>=n;lh1<7*<21873f=i;8l1;954i2g3>5<#;;:18:m4n23e>23<3`>>?7>5$203>11d3g9:j799;:k70=<72-99<7:8c:l05c<0?21b8>j50;&065<3?j1e?<h57998m155290/??>546a8j67a2>307d:=7;29 6472==h7c=>f;5b?>o39j0;6)==0;64g>h49o0<n65f40394?"4:90?;n5a30d93f=<a=:=6=4+332902e<f:;m6:j4;h1gb?6=,:8;699l;o12b?1b32c8hh4?:%114?20k2d8=k48f:9a716=83;1<7>tH21e?!54139?<6a<1e83>>{e9891<7?50;2xL65a3-9857?>3:m257<722wi:<4?:0:3>0<6>oqC?>h4Z70957}603n147:51284>0<683<197?<:682<?b=03>1==49:|&07<<1:01/:o49269'34<1:11/?<7530a8m3452900e;<<:188m3432900e;=8:188m35?2900e;:?:18'776=>=>0b>?i:198m35a290/??>56568j67a2810e;=j:18'776=>=>0b>?i:398m35c290/??>56568j67a2:10e;:k:18'776=><i0b>?i:198m32d290/??>564a8j67a2810e;:m:18'776=><i0b>?i:398m32f290/??>564a8j67a2:10e;:6:18'776=><i0b>?i:598m32?290/??>564a8j67a2<10e;;::18'776=><i0b>?i:798m333290/??>564a8j67a2>10e;;<:18'776=><i0b>?i:998m335290/??>564a8j67a2010e;;>:18'776=><i0b>?i:`98m337290/??>564a8j67a2k10e;:i:18'776=><i0b>?i:b98m32b290/??>564a8j67a2m10e;:8:18'776=><i0b>?i:d98m321290/??>564a8j67a2o10e>8j:18'776=;>30b>?i:198m60c290/??>536;8j67a2810e>99:18'776=;>30b>?i:398m612290/??>536;8j67a2:10e>9;:18'776=;>30b>?i:598m614290/??>536;8j67a2<10e>9=:18'776=;>30b>?i:798m616290/??>536;8j67a2>10e>9?:18'776=;>30b>?i:998m60a290/??>536;8j67a2010e>8l:18'776=;>30b>?i:`98m60e290/??>536;8j67a2k10e>6k:18'776=;0=0b>?i:198m6>d290/??>53858j67a2810e>6m:18'776=;0=0b>?i:398m6>f290/??>53858j67a2:10e>66:18'776=;0=0b>?i:598m6>?290/??>53858j67a2<10e>68:18'776=;0=0b>?i:798m6>1290/??>53858j67a2>10e>6::18'776=;0=0b>?i:998m6>3290/??>53858j67a2010e;=6:188m35f2900c;=m:188k1`?290/??>55058j67a2910c9h8:18'776==8=0b>?i:098k1`2290/??>55058j67a2;10c9h;:18'776==8=0b>?i:298k1`4290/??>55058j67a2=10c9h=:18'776==8=0b>?i:498k1`6290/??>55058j67a2?10c9h?:18'776==8=0b>?i:698k1ca290/??>55058j67a2110c9kj:18'776==8=0b>?i:898k1cc290/??>55058j67a2h10c9kl:18'776==8=0b>?i:c98k1cf290/??>55058j67a2j10c9k6:18'776==8=0b>?i:e98k1c?290/??>55058j67a2l10c9k8:18'776==8=0b>?i:g98k1c1290/??>55058j67a28:07b:j5;29 6472<;<7c=>f;32?>i3m=0;6)==0;723>h49o0:>65`4d194?"4:90>=:5a30d956=<g=o96=4+3329141<f:;m6<:4;n6f5?6=,:8;68?8;o12b?7232e?jh4?:%114?36?2d8=k4>6:9l0cb=83.8>=4:169m74`=9>10c9hl:18'776==8=0b>?i:0:8?j2aj3:1(><?:434?k56n3;276a;f`83>!5583?:;6`<1g82e>=h<o31<7*<218652=i;8l1=o54o5d5>5<#;;:19<94n23e>4e<3f>nn7>5$203>0703g9:j7?k;:m7a5<72-99<7;>7:l05c<6m21d8ih50;&065<29>1e?<h51g98k027290/??>55cg8j67a2910c8=i:18'776==ko0b>?i:098k05b290/??>55cg8j67a2;10c8=k:18'776==ko0b>?i:298k05d290/??>55cg8j67a2=10c8=m:18'776==ko0b>?i:498k05f290/??>55cg8j67a2?10c8=6:18'776==ko0b>?i:698k050290/??>55cg8j67a2110c8=9:18'776==ko0b>?i:898k052290/??>55cg8j67a2h10c8=;:18'776==ko0b>?i:c98k054290/??>55cg8j67a2j10c8==:18'776==ko0b>?i:e98k056290/??>55cg8j67a2l10c8=?:18'776==ko0b>?i:g98k04a290/??>55cg8j67a28:07b;=e;29 6472<hn7c=>f;32?>i2:j0;6)==0;7aa>h49o0:>65`53`94?"4:90>nh5a30d956=<g<8j6=4+33291gc<f:;m6<:4;n71=?6=,:8;68lj;o12b?7232e>>54?:%114?3em2d8=k4>6:9l171=83.8>=4:bd9m74`=9>10c8<9:18'776==ko0b>?i:0:8?j35=3:1(><?:4`f?k56n3;276a:2583>!5583?ii6`<1g82e>=h=;91<7*<2186f`=i;8l1=o54o4;e>5<#;;:19ok4n23e>4e<3f?2i7>5$203>0db3g9:j7?k;:m6=a<72-99<7;me:l05c<6m21d94m50;&065<2jl1e?<h51g98k0?e290/??>55cg8j67a2;:07b;6a;29 6472<hn7c=>f;02?>i2100;6)==0;7aa>h49o09>65`58:94?"4:90>nh5a30d966=<g<3<6=4+33291gc<f:;m6?:4;n7:2?6=,:8;68lj;o12b?4232e>594?:%114?3em2d8=k4=6:9l1<5=83.8>=4:bd9m74`=:>10c87=:18'776==ko0b>?i:3:8?j3>93:1(><?:4`f?k56n38276a:9183>!5583?ii6`<1g81e>=h=1l1<7*<2186f`=i;8l1>o54o4:f>5<#;;:19ok4n23e>7e<3f?3h7>5$203>0db3g9:j7<k;:m6<f<72-99<7;me:l05c<5m21d95l50;&065<2jl1e?<h52g98k0>>290/??>55cg8j67a2::07b;78;29 6472<hn7c=>f;12?>i20>0;6)==0;7aa>h49o08>65`59494?"4:90>nh5a30d976=<g<2>6=4+33291gc<f:;m6>:4;n7;0?6=,:8;68lj;o12b?5232e>4>4?:%114?3em2d8=k4<6:9l1=4=83.8>=4:bd9m74`=;>10c86>:18'776==ko0b>?i:2:8?j3?83:1(><?:4`f?k56n39276a:7d83>!5583?ii6`<1g80e>=h=>n1<7*<2186f`=i;8l1?o54o45`>5<#;;:19ok4n23e>6e<3f?<n7>5$203>0db3g9:j7=k;:m63d<72-99<7;me:l05c<4m21d9:750;&065<2jl1e?<h53g98k01?290/??>55cg8j67a2=:07b;87;29 6472<hn7c=>f;62?>i2??0;6)==0;7aa>h49o0?>65`56794?"4:90>nh5a30d906=<g<=86=4+33291gc<f:;m69:4;n746?6=,:8;68lj;o12b?2232e>;<4?:%114?3em2d8=k4;6:9l126=83.8>=4:bd9m74`=<>10c88i:18'776==ko0b>?i:5:8?j31m3:1(><?:4`f?k56n3>276a:6e83>!5583?ii6`<1g87e>=h=?i1<7*<2186f`=i;8l18o54o44a>5<#;;:19ok4n23e>1e<3f?=m7>5$203>0db3g9:j7:k;:m62=<72-99<7;me:l05c<3m21d9;950;&065<2jl1e?<h54g98k001290/??>55cg8j67a2<:07b;95;29 6472<hn7c=>f;72?>i2>=0;6)==0;7aa>h49o0>>65`57194?"4:90>nh5a30d916=<g<<96=4+33291gc<f:;m68:4;n755?6=,:8;68lj;o12b?3232e>:=4?:%114?3em2d8=k4:6:9l10`=83.8>=4:bd9m74`==>10c8;k:18'776==ko0b>?i:4:8?j32k3:1(><?:4`f?k56n3?276a:5c83>!5583?ii6`<1g86e>=h=<k1<7*<2186f`=i;8l19o54o47:>5<#;;:19ok4n23e>0e<3f?>47>5$203>0db3g9:j7;k;:m612<72-99<7;me:l05c<2m21d98850;&065<2jl1e?<h55g98k032290/??>55cg8j67a2?:07b;:4;29 6472<hn7c=>f;42?>i2=;0;6)==0;7aa>h49o0=>65`54394?"4:90>nh5a30d926=<g<?;6=4+33291gc<f:;m6;:4;n77b?6=,:8;68lj;o12b?0232e>8h4?:%114?3em2d8=k496:9l11b=83.8>=4:bd9m74`=>>10c8:l:18'776==ko0b>?i:7:8?j33j3:1(><?:4`f?k56n3<276a:4`83>!5583?ii6`<1g85e>=h==31<7*<2186f`=i;8l1:o54o464>5<#;;:19ok4n23e>3e<3f??:7>5$203>0db3g9:j78k;:m600<72-99<7;me:l05c<1m21d99:50;&065<2jl1e?<h56g98k024290/??>55cg8j67a2>:07b;;2;29 6472<hn7c=>f;52?>i2<80;6)==0;7aa>h49o0<>65`52:94?"4:90>nh5a30d936=<g<8o6=4+33291gc<f:;m6::4;n716?6=,:8;68lj;o12b?1232e>584?:%114?3em2d8=k486:9l1=g=83.8>=4:bd9m74`=?>10c89i:18'776==ko0b>?i:6:8?j30<3:1(><?:4`f?k56n3=276a:6883>!5583?ii6`<1g84e>=h=<o1<7*<2186f`=i;8l1;o54o470>5<#;;:19ok4n23e>2e<3f??47>5$203>0db3g9:j79k;:m664<72-99<7;me:l05c<0m21d9?>50;&065<2jl1e?<h57g98m6?f2900e>7m:188k353290/??>56248j67a2910c;=<:18'776=>:<0b>?i:098k355290/??>56248j67a2;10c;=>:18'776=>:<0b>?i:298k357290/??>56248j67a2=10c;<i:18'776=>:<0b>?i:498k34b290/??>56248j67a2?10c;<k:18'776=>:<0b>?i:698k34d290/??>56248j67a2110c;<m:18'776=>:<0b>?i:898m6d1290/??>53e78j67a2910e>l::18'776=;m?0b>?i:098m6d4290/??>53e78j67a2;10e>l=:18'776=;m?0b>?i:298m6d6290/??>53e78j67a2=10e>l?:18'776=;m?0b>?i:498m6ga290/??>53e78j67a2?10e>oj:18'776=;m?0b>?i:698m6gc290/??>53e78j67a2110e>ol:18'776=;m?0b>?i:898m6ge290/??>53e78j67a2h10e>on:18'776=;m?0b>?i:c98m6g?290/??>53e78j67a2j10e>o8:18'776=;m?0b>?i:e98m6g1290/??>53e78j67a2l10e>o::18'776=;m?0b>?i:g98m6g3290/??>53e78j67a28:07d=n3;29 6472:n>7c=>f;32?>o4i;0;6)==0;1g1>h49o0:>65f3`394?"4:908h85a30d956=<a:k;6=4+33297a3<f:;m6<:4;h1:b?6=,:8;6>j:;o12b?7232c8nn4?:%114?5c=2d8=k4>6:9j7gd=83.8>=4<d49m74`=9>10e>ln:18'776=;m?0b>?i:0:8?l5e13:1(><?:2f6?k56n3;276g<b983>!55839o96`<1g82e>=n;k=1<7*<2180`0=i;8l1=o54i2`7>5<#;;:1?i;4n23e>4e<3`9j57>5$203>6b23g9:j7?k;:k0=`<72-99<7=k5:l05c<6m21b?4j50;&065<4l<1e?<h51g98m6`b290/??>546a8j67a2910e>hk:18'776=<>i0b>?i:098m6`d290/??>546a8j67a2;10e>hm:18'776=<>i0b>?i:298m6`f290/??>546a8j67a2=10e>h6:18'776=<>i0b>?i:498m6`?290/??>546a8j67a2?10e>h8:18'776=<>i0b>?i:698m6`2290/??>546a8j67a2110e>h;:18'776=<>i0b>?i:898m6`4290/??>546a8j67a2h10e>h=:18'776=<>i0b>?i:c98m6`6290/??>546a8j67a2j10e>h?:18'776=<>i0b>?i:e98m6ca290/??>546a8j67a2l10e>kj:18'776=<>i0b>?i:g98m6cc290/??>546a8j67a28:07d=jc;29 6472==h7c=>f;32?>o4mh0;6)==0;64g>h49o0:>65f3d;94?"4:90?;n5a30d956=<a:o36=4+332902e<f:;m6<:4;h1f3?6=,:8;699l;o12b?7232c8i;4?:%114?20k2d8=k4>6:9j7`3=83.8>=4;7b9m74`=9>10e>k;:18'776=<>i0b>?i:0:8?l5b;3:1(><?:55`?k56n3;276g<e383>!5583><o6`<1g82e>=n;l;1<7*<21873f=i;8l1=o54i57g>5<#;;:18:m4n23e>4e<3`>>o7>5$203>11d3g9:j7?k;:k71g<72-99<7:8c:l05c<6m21b88o50;&065<3?j1e?<h51g98m13>290/??>546a8j67a2;:07d::8;29 6472==h7c=>f;02?>o3=>0;6)==0;64g>h49o09>65f44494?"4:90?;n5a30d966=<a=?>6=4+332902e<f:;m6?:4;h660?6=,:8;699l;o12b?4232c?9?4?:%114?20k2d8=k4=6:9j007=83.8>=4;7b9m74`=:>10e9;?:18'776=<>i0b>?i:3:8?l23n3:1(><?:55`?k56n38276g;4d83>!5583><o6`<1g81e>=n<=n1<7*<21873f=i;8l1>o54i56`>5<#;;:18:m4n23e>7e<3`>?n7>5$203>11d3g9:j7<k;:k70d<72-99<7:8c:l05c<5m21b89750;&065<3?j1e?<h52g98m120290/??>546a8j67a2::07d:;6;29 6472==h7c=>f;12?>o3<<0;6)==0;64g>h49o08>65f45694?"4:90?;n5a30d976=<a=>86=4+332902e<f:;m6>:4;h676?6=,:8;699l;o12b?5232c?8<4?:%114?20k2d8=k4<6:9j016=83.8>=4;7b9m74`=;>10e9=i:18'776=<>i0b>?i:2:8?l24m3:1(><?:55`?k56n39276g;3b83>!5583><o6`<1g80e>=n<:h1<7*<21873f=i;8l1?o54i51b>5<#;;:18:m4n23e>6e<3`>857>5$203>11d3g9:j7=k;:k77=<72-99<7:8c:l05c<4m21b8>950;&065<3?j1e?<h53g98m151290/??>546a8j67a2=:07d:<5;29 6472==h7c=>f;62?>o3;=0;6)==0;64g>h49o0?>65f42194?"4:90?;n5a30d906=<a=9:6=4+332902e<f:;m69:4;h604?6=,:8;699l;o12b?2232c?>k4?:%114?20k2d8=k4;6:9j07c=83.8>=4;7b9m74`=<>10e9<k:18'776=<>i0b>?i:5:8?l25k3:1(><?:55`?k56n3>276g;2c83>!5583><o6`<1g87e>=n<;k1<7*<21873f=i;8l18o54i50:>5<#;;:18:m4n23e>1e<3`>947>5$203>11d3g9:j7:k;:k763<72-99<7:8c:l05c<3m21b8?;50;&065<3?j1e?<h54g98m143290/??>546a8j67a2<:07d:=3;29 6472==h7c=>f;72?>o3:;0;6)==0;64g>h49o0>>65f43394?"4:90?;n5a30d916=<a=8;6=4+332902e<f:;m68:4;h62b?6=,:8;699l;o12b?3232c?=h4?:%114?20k2d8=k4:6:9j04b=83.8>=4;7b9m74`==>10e9?m:18'776=<>i0b>?i:4:8?l26i3:1(><?:55`?k56n3?276g;1883>!5583><o6`<1g86e>=n<821<7*<21873f=i;8l19o54i534>5<#;;:18:m4n23e>0e<3`>::7>5$203>11d3g9:j7;k;:k750<72-99<7:8c:l05c<2m21b8<:50;&065<3?j1e?<h55g98m174290/??>546a8j67a2?:07d:>2;29 6472==h7c=>f;42?>o3990;6)==0;64g>h49o0=>65f41d94?"4:90?;n5a30d926=<a=:n6=4+332902e<f:;m6;:4;h63`?6=,:8;699l;o12b?0232c?<n4?:%114?20k2d8=k496:9j05d=83.8>=4;7b9m74`=>>10e9>n:18'776=<>i0b>?i:7:8?l2713:1(><?:55`?k56n3<276g;0983>!5583><o6`<1g85e>=n<9=1<7*<21873f=i;8l1:o54i526>5<#;;:18:m4n23e>3e<3`>;87>5$203>11d3g9:j78k;:k746<72-99<7:8c:l05c<1m21b8=<50;&065<3?j1e?<h56g98m166290/??>546a8j67a2>:07d:?0;29 6472==h7c=>f;52?>o4no0;6)==0;64g>h49o0<>65f3g494?"4:90?;n5a30d936=<a:oi6=4+332902e<f:;m6::4;h1f4?6=,:8;699l;o12b?1232c?9>4?:%114?20k2d8=k486:9j01>=83.8>=4;7b9m74`=?>10e9=k:18'776=<>i0b>?i:6:8?l24:3:1(><?:55`?k56n3=276g;2683>!5583><o6`<1g84e>=n<8i1<7*<21873f=i;8l1;o54i532>5<#;;:18:m4n23e>2e<3`>;:7>5$203>11d3g9:j79k;:k0`c<72-99<7:8c:l05c<0m21b?ik50;&065<3?j1e?<h57g98m3422900c>7l:188f602290:6=4?{%10=?76;2B8:95G32d8k4752900qo=<d;29554=83:p(>=6:202?M51<2B8?k5U63824~c=9=0m6<;5b;;9g?g=9>0::7?k:0a954<613;96<o5}og3>5=i9981<6*>a381?!7f;380(<?;:39'543=:2.:=;4=;%323?4<,8;36?5+10;96>"69h097)?>b;08 47d2;1/=<j52:&25`<53-;:j7<4$003>7=#9;;1>6*<3282?!54<3;0(<<;:39'573=:2.:>;4=;%313?4<,8836?5+13;96>"6:h097)?=b;08 44d2;1/=?j52:&26`<53-;9j7<4$013>7=#9:;1>6*>3381?!74;380(<=;:39'563=:2.:?;4=;%303?4<,8936?5+12;96>"6;h097)?<b;08 45d2;1/=>j52:&27`<53-;8j7<4$063>7=#9=;1>6*>4381?!73;380(<:;:39'513=:2.:8;4=;%373?4<,8>36?5+15;96>"6<h097)?;b;08 42d2;1/=9j52:&20`<53-;?j7<4$073>7=#9<;1>6*>5381?!72;380(<;;:39'503=:2.:9;4=;%363?4<,8?36?5+14;96>"6=h097)?:b;08 43d2;1/=8j52:&21`<53-;>j7<4$043>7=#9?;1>6*>6381?!71;380(<8;:39'533=:2.::;4=;%353?4<,8<36?5+17;96>"6>h097)?9b;08 40d2;1/=;j52:&22`<53-;=j7<4$053>7=#9>;1>6*>7381?!70;380(<9;:39'523=:2.:;;4=;%343?4<,8=36?5+16;96>"6?h097)?8b;08 41d2;1/=:j52:&23`<53-;<j7<4$0:3>7=#91;1>6*>8381?!7?;380(<6;:39'5=3=:2.:4;4=;%3;3?4<,8236?5+19;96>"60h097)?7b;08 4>d2;1/=5j52:&2<`<53-;3j7<4$0;3>7=#90;1>6*>9381?!7>;380(<7;:39'5<3=:2.:5;4=;%3:3?4<,8336?5+18;96>"61h097)?6b;08 4?d2;1/=4j52:&2=`<53-;2j7<4$0c3>7=#9h;1>6*<2g8254=#9;81>6*>a7805g=#;;81?<l4$200>67e3g998774n206>72<,:9;6;>4$212>64b3-;j87?4$0c6>4=#;<l1?8k4$243>63b3g9==774n241>72<,8886?5f11g94?=n99n1<75f10294?=n99l1<75f32494?=n;:?1<75f32:94?=n;:=1<75f6e83>>o1k3:17d8i:188m3c=831b??l50;9j77g=831b??j50;9j77e=831b??950;9j770=831b??750;9j77>=831b:>4?::k50?6=3`<>6=44i7494?=h>>0;66a98;29?j0>2900c;o50;9j<f<72-99<76m;o12b?6<3`2j6=4+3329<g=i;8l1=65f8983>!55832i7c=>f;08?l>0290/??>58c9m74`=;21b4;4?:%114?>e3g9:j7:4;h:6>5<#;;:14o5a30d91>=n0=0;6)==0;:a?k56n3<07d6<:18'776=0k1e?<h57:9j<7<72-99<76m;o12b?><3`2:6=4+3329<g=i;8l1565f8183>!55832i7c=>f;c8?l1a290/??>58c9m74`=j21b;i4?:%114?>e3g9:j7m4;h5`>5<#;;:14o5a30d9`>=n?k0;6)==0;:a?k56n3o07d9n:18'776=0k1e?<h5f:9j3<<72-99<76m;o12b?7732c<47>5$203>=d<f:;m6<?4;h54>5<#;;:14o5a30d957=<a><1<7*<218;f>h49o0:?65f7483>!55832i7c=>f;37?>o0<3:1(><?:9`8j67a28?07d7<:18'776=0k1e?<h51798m<4=83.8>=47b:l05c<6?21b5<4?:%114?>e3g9:j7?7;:k:4?6=,:8;65l4n23e>4?<3`2m6=4+3329<g=i;8l1=l54i9g94?"4:903n6`<1g82f>=n0m0;6)==0;:a?k56n3;h76g79;29 64721h0b>?i:0f8?l1b290/??>58c9m74`=9l10e:=50;&065<?j2d8=k4>f:9jf<<72-99<7l7;o12b?6<3`h<6=4+3329f==i;8l1=65fb783>!5583h37c=>f;08?ld2290/??>5b99m74`=;21bmi4?:%114?gd3g9:j7>4;hca>5<#;;:1mn5a30d95>=ni00;6)==0;c`?k56n3807do7:18'776=ij1e?<h53:9je2<72-99<7ol;o12b?2<3`k=6=4+3329ef=i;8l1965fa483>!5583kh7c=>f;48?lg3290/??>5ab9m74`=?21bm>4?:%114?gd3g9:j764;hc1>5<#;;:1mn5a30d9=>=ni80;6)==0;c`?k56n3k07do?:18'776=ij1e?<h5b:9j=`<72-99<7ol;o12b?e<3`3o6=4+3329ef=i;8l1h65f9b83>!5583kh7c=>f;g8?l?e290/??>5ab9m74`=n21b5l4?:%114?gd3g9:j7??;:k:=?6=,:8;6lm4n23e>47<3`336=4+3329ef=i;8l1=?54i8594?"4:90jo6`<1g827>=n1?0;6)==0;c`?k56n3;?76g65;29 6472hi0b>?i:078?ld3290/??>5ab9m74`=9?10eo=50;&065<fk2d8=k4>7:9jf7<72-99<7ol;o12b?7?32ci=7>5$203>de<f:;m6<74;h`3>5<#;;:1mn5a30d95d=<ahl1<7*<218bg>h49o0:n65fad83>!5583kh7c=>f;3`?>ofi3:1(><?:`a8j67a28n07d7i:18'776=ij1e?<h51d98m<2=83.8>=4nc:l05c<6n21bnh4?:%114?dc3g9:j7>4;h``>5<#;;:1ni5a30d95>=njk0;6)==0;`g?k56n3807dln:18'776=jm1e?<h53:9j60<72-99<7<;;o12b?6<3`886=4+332961=i;8l1=65f2383>!55838?7c=>f;08?l46290/??>5259m74`=;21b>=4?:%114?433g9:j7:4;h3e>5<#;;:1>95a30d91>=n:l0;6)==0;07?k56n3<07d<k:18'776=:=1e?<h57:9j6f<72-99<7<;;o12b?><3`8i6=4+332961=i;8l1565f2`83>!55838?7c=>f;c8?l4>290/??>5259m74`=j21b>54?:%114?433g9:j7m4;h04>5<#;;:1>95a30d9`>=n:?0;6)==0;07?k56n3o07d?j:18'776=:=1e?<h5f:9j70<72-99<7=;;o12b?6<3`986=4+332971=i;8l1=65f3383>!55839?7c=>f;08?l56290/??>5359m74`=;21b?=4?:%114?533g9:j7:4;h1f>5<#;;:1?95a30d91>=n;m0;6)==0;17?k56n3<07d=l:18'776=;=1e?<h57:9j7g<72-99<7=;;o12b?><3`9j6=4+332971=i;8l1565f3883>!55839?7c=>f;c8?l5?290/??>5359m74`=j21b?:4?:%114?533g9:j7m4;h15>5<#;;:1?95a30d9`>=n:o0;6)==0;17?k56n3o07d:9:18'776=<<1e?<h50:9j01<72-99<7::;o12b?7<3`>86=4+332900=i;8l1>65f4383>!5583>>7c=>f;18?l26290/??>5449m74`=<21b8=4?:%114?223g9:j7;4;h6e>5<#;;:1885a30d92>=n<l0;6)==0;66?k56n3=07d:k:18'776=<<1e?<h58:9j0f<72-99<7::;o12b??<3`>i6=4+332900=i;8l1m65f4`83>!5583>>7c=>f;`8?l2>290/??>5449m74`=k21b854?:%114?223g9:j7j4;h64>5<#;;:1885a30d9a>=n;o0;6)==0;66?k56n3l07d;9:18'776==<1e?<h50:9j11<72-99<7;:;o12b?7<3`?86=4+332910=i;8l1>65f5383>!5583?>7c=>f;18?l36290/??>5549m74`=<21b9k4?:%114?323g9:j7;4;h7f>5<#;;:1985a30d92>=n=m0;6)==0;76?k56n3=07d;l:18'776==<1e?<h58:9j1g<72-99<7;:;o12b??<3`?j6=4+332910=i;8l1m65f5883>!5583?>7c=>f;`8?l3?290/??>5549m74`=k21b9:4?:%114?323g9:j7j4;h73>5<#;;:1985a30d9a>=n;=h1<7*<21800d=i;8l1<65f35;94?"4:9088l5a30d95>=n;=21<7*<21800d=i;8l1>65f35594?"4:9088l5a30d97>=n;=<1<7*<218000=i;8l1<65f35694?"4:908885a30d95>=n;=91<7*<218000=i;8l1>65f35094?"4:908885a30d97>=n;<n1<7*<21801f=i;8l1<65f34`94?"4:9089n5a30d95>=n;<k1<7*<21801f=i;8l1>65f34;94?"4:9089n5a30d97>=n;<21<7*<21801f=i;8l1865f34594?"4:9089n5a30d91>=n;<<1<7*<21801f=i;8l1:65f34794?"4:9089n5a30d93>=n;<>1<7*<218016=i;8l1<65f34094?"4:9089>5a30d95>=n;<;1<7*<218016=i;8l1>65f34294?"4:9089>5a30d97>=n;=l1<7*<218016=i;8l1865f35g94?"4:9089>5a30d91>=n;=n1<7*<218016=i;8l1:65f35a94?"4:9089>5a30d93>=hl10;6)==0;f4?k56n3:07bj9:18'776=l>1e?<h51:9l`1<72-99<7j8;o12b?4<3fn86=4+3329`2=i;8l1?65`d383>!5583n<7c=>f;68?jb6290/??>5d69m74`==21dh=4?:%114?b03g9:j784;nae>5<#;;:1h:5a30d93>=hkl0;6)==0;f4?k56n3207bmk:18'776=l>1e?<h59:9lgf<72-99<7j8;o12b?g<3fii6=4+3329`2=i;8l1n65`c883>!5583n<7c=>f;a8?je?290/??>5d69m74`=l21do:4?:%114?b03g9:j7k4;na5>5<#;;:1h:5a30d9b>=hk<0;6)==0;f4?k56n3;;76al4;29 6472m=0b>?i:038?je4290/??>5d69m74`=9;10cn<50;&065<c?2d8=k4>3:9lg4<72-99<7j8;o12b?7332eh<7>5$203>a1<f:;m6<;4;nfe>5<#;;:1h:5a30d953=<gmo1<7*<218g3>h49o0:;65`de83>!5583n<7c=>f;3;?>ick3:1(><?:e58j67a28307bjm:18'776=l>1e?<h51`98kag=83.8>=4k7:l05c<6j21dh44?:%114?b03g9:j7?l;:mg1?6=,:8;6i94n23e>4b<3fij6=4+3329`2=i;8l1=h54ocd94?"4:90o;6`<1g82b>=h99=1<7*<218243=i;8l1<65`11794?"4:90:<;5a30d95>=h99>1<7*<218243=i;8l1>65`11194?"4:90:<;5a30d97>=hnh0;6)==0;d:?k56n3:07bh7:18'776=n01e?<h51:9lb3<72-99<7h6;o12b?4<3fl>6=4+3329b<=i;8l1?65`f583>!5583l27c=>f;68?j`4290/??>5f89m74`==21dj?4?:%114?`>3g9:j784;nd2>5<#;;:1j45a30d93>=hn90;6)==0;d:?k56n3207bki:18'776=n01e?<h59:9la`<72-99<7h6;o12b?g<3foo6=4+3329b<=i;8l1n65`ec83>!5583l27c=>f;a8?jcf290/??>5f89m74`=l21di44?:%114?`>3g9:j7k4;ng;>5<#;;:1j45a30d9b>=hm>0;6)==0;d:?k56n3;;76aj6;29 6472o30b>?i:038?jc2290/??>5f89m74`=9;10ch:50;&065<a12d8=k4>3:9la6<72-99<7h6;o12b?7332en>7>5$203>c?<f:;m6<;4;n335?6=,:8;6k74n23e>40<3f;;<7>5$203>c?<f:;m6<94;nde>5<#;;:1j45a30d95==<goo1<7*<218e=>h49o0:565`fe83>!5583l27c=>f;3b?>iak3:1(><?:g;8j67a28h07bhm:18'776=n01e?<h51b98kc1=83.8>=4i9:l05c<6l21din4?:%114?`>3g9:j7?j;:mf5?6=,:8;6k74n23e>4`<3f;;o7>5$203>46e3g9:j7>4;n33e?6=,:8;6<>m;o12b?7<3f;;57>5$203>46e3g9:j7<4;n33<?6=,:8;6<>m;o12b?5<3th8?n4?:021>5<7s-9857==1:J021=O;:l0V;<511yf>42=n3;>6o46:b8b>41=9?0:h7?l:0395<<6:3;j6p`j0;28j465291/=l<52:&2e6<53-;:87<4$036>7=#98<1>6*>1681?!760380(<?6:39'54g=:2.:=o4=;%32g?4<,8;o6?5+10g96>"69o097)?=0;08 4462;1/?>=51:&071<63-;987<4$006>7=#9;<1>6*>2681?!750380(<<6:39'57g=:2.:>o4=;%31g?4<,88o6?5+13g96>"6:o097)?<0;08 4562;1/=><52:&276<53-;887<4$016>7=#9:<1>6*>3681?!740380(<=6:39'56g=:2.:?o4=;%30g?4<,89o6?5+12g96>"6;o097)?;0;08 4262;1/=9<52:&206<53-;?87<4$066>7=#9=<1>6*>4681?!730380(<:6:39'51g=:2.:8o4=;%37g?4<,8>o6?5+15g96>"6<o097)?:0;08 4362;1/=8<52:&216<53-;>87<4$076>7=#9<<1>6*>5681?!720380(<;6:39'50g=:2.:9o4=;%36g?4<,8?o6?5+14g96>"6=o097)?90;08 4062;1/=;<52:&226<53-;=87<4$046>7=#9?<1>6*>6681?!710380(<86:39'53g=:2.::o4=;%35g?4<,8<o6?5+17g96>"6>o097)?80;08 4162;1/=:<52:&236<53-;<87<4$056>7=#9><1>6*>7681?!700380(<96:39'52g=:2.:;o4=;%34g?4<,8=o6?5+16g96>"6?o097)?70;08 4>62;1/=5<52:&2<6<53-;387<4$0:6>7=#91<1>6*>8681?!7?0380(<66:39'5=g=:2.:4o4=;%3;g?4<,82o6?5+19g96>"60o097)?60;08 4?62;1/=4<52:&2=6<53-;287<4$0;6>7=#90<1>6*>9681?!7>0380(<76:39'5<g=:2.:5o4=;%3:g?4<,83o6?5+18g96>"61o097)?n0;08 4g62;1/??h51038 4452;1/=l8530`8 6452:;i7)==3;12f>h4:=027c==5;07?!5483<;7)=<1;11a>"6i=0:7)?n5;38 63a2:?n7)=90;16a>h4>8027c=92;07?!75;380e<>j:188m46c2900e<??:188m46a2900e>=9:188m6522900e>=7:188m6502900e;j50;9j2f<722c=j7>5;h4f>5<<a:8i6=44i20b>5<<a:8o6=44i20`>5<<a:8<6=44i205>5<<a:826=44i20;>5<<a?91<75f6583>>o1=3:17d89:188k31=831d:54?::m5=?6=3f<j6=44i9a94?"4:903n6`<1g83?>o?i3:1(><?:9`8j67a2810e5650;&065<?j2d8=k4=;:k;3?6=,:8;65l4n23e>6=<a1<1<7*<218;f>h49o0?76g75;29 64721h0b>?i:498m=2=83.8>=47b:l05c<132c3?7>5$203>=d<f:;m6:54i9094?"4:903n6`<1g8;?>o?93:1(><?:9`8j67a2010e5>50;&065<?j2d8=k4n;:k4b?6=,:8;65l4n23e>g=<a>n1<7*<218;f>h49o0h76g8c;29 64721h0b>?i:e98m2d=83.8>=47b:l05c<b32c<m7>5$203>=d<f:;m6k54i6;94?"4:903n6`<1g824>=n?10;6)==0;:a?k56n3;:76g87;29 64721h0b>?i:008?l11290/??>58c9m74`=9:10e:;50;&065<?j2d8=k4>4:9j31<72-99<76m;o12b?7232c2?7>5$203>=d<f:;m6<84;h;1>5<#;;:14o5a30d952=<a0;1<7*<218;f>h49o0:465f9183>!55832i7c=>f;3:?>o?n3:1(><?:9`8j67a28k07d6j:18'776=0k1e?<h51c98m=b=83.8>=47b:l05c<6k21b444?:%114?>e3g9:j7?k;:k4a?6=,:8;65l4n23e>4c<3`=86=4+3329<g=i;8l1=k54ic;94?"4:90i46`<1g83?>oe?3:1(><?:c:8j67a2810eo850;&065<e02d8=k4=;:ka1?6=,:8;6o64n23e>6=<ahn1<7*<218bg>h49o0;76gnb;29 6472hi0b>?i:098md?=83.8>=4nc:l05c<532cj47>5$203>de<f:;m6>54i`594?"4:90jo6`<1g87?>of>3:1(><?:`a8j67a2<10el;50;&065<fk2d8=k49;:kb0?6=,:8;6lm4n23e>2=<ah91<7*<218bg>h49o0376gn2;29 6472hi0b>?i:898md7=83.8>=4nc:l05c<f32cj<7>5$203>de<f:;m6o54i8g94?"4:90jo6`<1g8`?>o>l3:1(><?:`a8j67a2m10e4m50;&065<fk2d8=k4j;:k:f?6=,:8;6lm4n23e>c=<a0k1<7*<218bg>h49o0:<65f9883>!5583kh7c=>f;32?>o>03:1(><?:`a8j67a28807d78:18'776=ij1e?<h51298m<0=83.8>=4nc:l05c<6<21b584?:%114?gd3g9:j7?:;:ka0?6=,:8;6lm4n23e>40<3`h86=4+3329ef=i;8l1=:54ic094?"4:90jo6`<1g82<>=nj80;6)==0;c`?k56n3;276gm0;29 6472hi0b>?i:0c8?lga290/??>5ab9m74`=9k10elk50;&065<fk2d8=k4>c:9jed<72-99<7ol;o12b?7c32c2j7>5$203>de<f:;m6<k4;h;7>5<#;;:1mn5a30d95c=<ako1<7*<218a`>h49o0;76gmc;29 6472kn0b>?i:098mgd=83.8>=4md:l05c<532cim7>5$203>gb<f:;m6>54i3794?"4:90986`<1g83?>o5;3:1(><?:368j67a2810e?<50;&065<5<2d8=k4=;:k15?6=,:8;6?:4n23e>6=<a;:1<7*<21810>h49o0?76g>f;29 6472;>0b>?i:498m7c=83.8>=4=4:l05c<132c9h7>5$203>72<f:;m6:54i3a94?"4:90986`<1g8;?>o5j3:1(><?:368j67a2010e?o50;&065<5<2d8=k4n;:k1=?6=,:8;6?:4n23e>g=<a;21<7*<21810>h49o0h76g=7;29 6472;>0b>?i:e98m70=83.8>=4=4:l05c<b32c:i7>5$203>72<f:;m6k54i2794?"4:90886`<1g83?>o4;3:1(><?:268j67a2810e><50;&065<4<2d8=k4=;:k05?6=,:8;6>:4n23e>6=<a::1<7*<21800>h49o0?76g<e;29 6472:>0b>?i:498m6b=83.8>=4<4:l05c<132c8o7>5$203>62<f:;m6:54i2`94?"4:90886`<1g8;?>o4i3:1(><?:268j67a2010e>750;&065<4<2d8=k4n;:k0<?6=,:8;6>:4n23e>g=<a:=1<7*<21800>h49o0h76g<6;29 6472:>0b>?i:e98m7`=83.8>=4<4:l05c<b32c?:7>5$203>13<f:;m6=54i5694?"4:90?96`<1g82?>o3;3:1(><?:578j67a2;10e9<50;&065<3=2d8=k4<;:k75?6=,:8;69;4n23e>1=<a=:1<7*<21871>h49o0>76g;f;29 6472=?0b>?i:798m1c=83.8>=4;5:l05c<032c?h7>5$203>13<f:;m6554i5a94?"4:90?96`<1g8:?>o3j3:1(><?:578j67a2h10e9o50;&065<3=2d8=k4m;:k7=?6=,:8;69;4n23e>f=<a=21<7*<21871>h49o0o76g;7;29 6472=?0b>?i:d98m6`=83.8>=4;5:l05c<a32c>:7>5$203>03<f:;m6=54i4694?"4:90>96`<1g82?>o2;3:1(><?:478j67a2;10e8<50;&065<2=2d8=k4<;:k65?6=,:8;68;4n23e>1=<a<l1<7*<21861>h49o0>76g:e;29 6472<?0b>?i:798m0b=83.8>=4:5:l05c<032c>o7>5$203>03<f:;m6554i4`94?"4:90>96`<1g8:?>o2i3:1(><?:478j67a2h10e8750;&065<2=2d8=k4m;:k6<?6=,:8;68;4n23e>f=<a<=1<7*<21861>h49o0o76g:0;29 6472<?0b>?i:d98m62e290/??>535c8j67a2910e>:6:18'776=;=k0b>?i:098m62?290/??>535c8j67a2;10e>:8:18'776=;=k0b>?i:298m621290/??>53578j67a2910e>:;:18'776=;=?0b>?i:098m624290/??>53578j67a2;10e>:=:18'776=;=?0b>?i:298m63c290/??>534a8j67a2910e>;m:18'776=;<i0b>?i:098m63f290/??>534a8j67a2;10e>;6:18'776=;<i0b>?i:298m63?290/??>534a8j67a2=10e>;8:18'776=;<i0b>?i:498m631290/??>534a8j67a2?10e>;::18'776=;<i0b>?i:698m633290/??>53418j67a2910e>;=:18'776=;<90b>?i:098m636290/??>53418j67a2;10e>;?:18'776=;<90b>?i:298m62a290/??>53418j67a2=10e>:j:18'776=;<90b>?i:498m62c290/??>53418j67a2?10e>:l:18'776=;<90b>?i:698ka>=83.8>=4k7:l05c<732eo:7>5$203>a1<f:;m6<54oe694?"4:90o;6`<1g81?>ic;3:1(><?:e58j67a2:10ci<50;&065<c?2d8=k4;;:mg5?6=,:8;6i94n23e>0=<gm:1<7*<218g3>h49o0=76alf;29 6472m=0b>?i:698kfc=83.8>=4k7:l05c<?32ehh7>5$203>a1<f:;m6454oba94?"4:90o;6`<1g8b?>idj3:1(><?:e58j67a2k10cn750;&065<c?2d8=k4l;:m`<?6=,:8;6i94n23e>a=<gj=1<7*<218g3>h49o0n76al6;29 6472m=0b>?i:g98kf3=83.8>=4k7:l05c<6821do94?:%114?b03g9:j7?>;:m`7?6=,:8;6i94n23e>44<3fi96=4+3329`2=i;8l1=>54ob394?"4:90o;6`<1g820>=hk90;6)==0;f4?k56n3;>76akf;29 6472m=0b>?i:048?jbb290/??>5d69m74`=9>10cij50;&065<c?2d8=k4>8:9l`f<72-99<7j8;o12b?7>32eon7>5$203>a1<f:;m6<o4;nfb>5<#;;:1h:5a30d95g=<gm31<7*<218g3>h49o0:o65`d483>!5583n<7c=>f;3g?>idi3:1(><?:e58j67a28o07bli:18'776=l>1e?<h51g98k460290/??>51148j67a2910c<>::18'776=99<0b>?i:098k463290/??>51148j67a2;10c<><:18'776=99<0b>?i:298kcg=83.8>=4i9:l05c<732em47>5$203>c?<f:;m6<54og494?"4:90m56`<1g81?>ia=3:1(><?:g;8j67a2:10ck:50;&065<a12d8=k4;;:me7?6=,:8;6k74n23e>0=<go81<7*<218e=>h49o0=76ai1;29 6472o30b>?i:698kc6=83.8>=4i9:l05c<?32enj7>5$203>c?<f:;m6454odg94?"4:90m56`<1g8b?>ibl3:1(><?:g;8j67a2k10chl50;&065<a12d8=k4l;:mfe?6=,:8;6k74n23e>a=<gl31<7*<218e=>h49o0n76aj8;29 6472o30b>?i:g98k`1=83.8>=4i9:l05c<6821di;4?:%114?`>3g9:j7?>;:mf1?6=,:8;6k74n23e>44<3fo?6=4+3329b<=i;8l1=>54od194?"4:90m56`<1g820>=hm;0;6)==0;d:?k56n3;>76a>0083>!5583l27c=>f;35?>i6890;6)==0;d:?k56n3;<76aif;29 6472o30b>?i:0:8?j`b290/??>5f89m74`=9010ckj50;&065<a12d8=k4>a:9lbf<72-99<7h6;o12b?7e32emn7>5$203>c?<f:;m6<m4;nd4>5<#;;:1j45a30d95a=<gli1<7*<218e=>h49o0:i65`e083>!5583l27c=>f;3e?>i68j0;6)==0;33f>h49o0;76a>0`83>!5583;;n6`<1g82?>i6800;6)==0;33f>h49o0976a>0983>!5583;;n6`<1g80?>{e;:h1<7??2;294~"4;008><5G3768L65a3S<96<>te;37>c<6=3h157m5a;34>40=9m0:o7?>:0;957<6i3wei=4?;o336?6<,8k96?5+1`196>"69=097)?>5;08 4712;1/=<952:&25=<53-;:57<4$03b>7=#98h1>6*>1b81?!76l380(<?j:39'54`=:2.:>=4=;%315?4<,:986<5+32695>"6:=097)?=5;08 4412;1/=?952:&26=<53-;957<4$00b>7=#9;h1>6*>2b81?!75l380(<<j:39'57`=:2.:?=4=;%305?4<,8996?5+12196>"6;=097)?<5;08 4512;1/=>952:&27=<53-;857<4$01b>7=#9:h1>6*>3b81?!74l380(<=j:39'56`=:2.:8=4=;%375?4<,8>96?5+15196>"6<=097)?;5;08 4212;1/=9952:&20=<53-;?57<4$06b>7=#9=h1>6*>4b81?!73l380(<:j:39'51`=:2.:9=4=;%365?4<,8?96?5+14196>"6==097)?:5;08 4312;1/=8952:&21=<53-;>57<4$07b>7=#9<h1>6*>5b81?!72l380(<;j:39'50`=:2.::=4=;%355?4<,8<96?5+17196>"6>=097)?95;08 4012;1/=;952:&22=<53-;=57<4$04b>7=#9?h1>6*>6b81?!71l380(<8j:39'53`=:2.:;=4=;%345?4<,8=96?5+16196>"6?=097)?85;08 4112;1/=:952:&23=<53-;<57<4$05b>7=#9>h1>6*>7b81?!70l380(<9j:39'52`=:2.:4=4=;%3;5?4<,8296?5+19196>"60=097)?75;08 4>12;1/=5952:&2<=<53-;357<4$0:b>7=#91h1>6*>8b81?!7?l380(<6j:39'5=`=:2.:5=4=;%3:5?4<,8396?5+18196>"61=097)?65;08 4?12;1/=4952:&2==<53-;257<4$0;b>7=#90h1>6*>9b81?!7>l380(<7j:39'5<`=:2.:m=4=;%3b5?4<,:8m6<?>;%316?4<,8k=6>?m;%116?56j2.8>>4<1c9m772=12d8>84=4:&075<182.8?<4<2d9'5d2=92.:m84>;%16b?52m2.8:=4<5d9m737=12d8:?4=4:&266<53`;;i7>5;h33`?6=3`;:<7>5;h33b?6=3`98:7>5;h101?6=3`9847>5;h103?6=3`<o6=44i7a94?=n>o0;66g9e;29?l55j3:17d==a;29?l55l3:17d==c;29?l55?3:17d==6;29?l5513:17d==8;29?l042900e;:50;9j20<722c=:7>5;n44>5<<g?21<75`6883>>i1i3:17d6l:18'776=0k1e?<h50:9j<d<72-99<76m;o12b?7<3`236=4+3329<g=i;8l1>65f8683>!55832i7c=>f;18?l>1290/??>58c9m74`=<21b484?:%114?>e3g9:j7;4;h:7>5<#;;:14o5a30d92>=n0:0;6)==0;:a?k56n3=07d6=:18'776=0k1e?<h58:9j<4<72-99<76m;o12b??<3`2;6=4+3329<g=i;8l1m65f7g83>!55832i7c=>f;`8?l1c290/??>58c9m74`=k21b;n4?:%114?>e3g9:j7j4;h5a>5<#;;:14o5a30d9a>=n?h0;6)==0;:a?k56n3l07d96:18'776=0k1e?<h51198m2>=83.8>=47b:l05c<6921b;:4?:%114?>e3g9:j7?=;:k42?6=,:8;65l4n23e>45<3`=>6=4+3329<g=i;8l1=954i6694?"4:903n6`<1g821>=n1:0;6)==0;:a?k56n3;=76g62;29 64721h0b>?i:058?l?6290/??>58c9m74`=9110e4>50;&065<?j2d8=k4>9:9j<c<72-99<76m;o12b?7f32c3i7>5$203>=d<f:;m6<l4;h:g>5<#;;:14o5a30d95f=<a131<7*<218;f>h49o0:h65f7d83>!55832i7c=>f;3f?>o0;3:1(><?:9`8j67a28l07dl6:18'776=j11e?<h50:9jf2<72-99<7l7;o12b?7<3`h=6=4+3329f==i;8l1>65fb483>!5583h37c=>f;18?lgc290/??>5ab9m74`=821bmo4?:%114?gd3g9:j7?4;hc:>5<#;;:1mn5a30d96>=ni10;6)==0;c`?k56n3907do8:18'776=ij1e?<h54:9je3<72-99<7ol;o12b?3<3`k>6=4+3329ef=i;8l1:65fa583>!5583kh7c=>f;58?lg4290/??>5ab9m74`=021bm?4?:%114?gd3g9:j774;hc2>5<#;;:1mn5a30d9e>=ni90;6)==0;c`?k56n3h07d7j:18'776=ij1e?<h5c:9j=a<72-99<7ol;o12b?b<3`3h6=4+3329ef=i;8l1i65f9c83>!5583kh7c=>f;d8?l?f290/??>5ab9m74`=9910e4750;&065<fk2d8=k4>1:9j==<72-99<7ol;o12b?7532c2;7>5$203>de<f:;m6<=4;h;5>5<#;;:1mn5a30d951=<a0?1<7*<218bg>h49o0:965fb583>!5583kh7c=>f;35?>oe;3:1(><?:`a8j67a28=07dl=:18'776=ij1e?<h51998mg7=83.8>=4nc:l05c<6121bn=4?:%114?gd3g9:j7?n;:kbb?6=,:8;6lm4n23e>4d<3`kn6=4+3329ef=i;8l1=n54i`c94?"4:90jo6`<1g82`>=n1o0;6)==0;c`?k56n3;n76g64;29 6472hi0b>?i:0d8?ldb290/??>5be9m74`=821bnn4?:%114?dc3g9:j7?4;h`a>5<#;;:1ni5a30d96>=njh0;6)==0;`g?k56n3907d<::18'776=:=1e?<h50:9j66<72-99<7<;;o12b?7<3`896=4+332961=i;8l1>65f2083>!55838?7c=>f;18?l47290/??>5259m74`=<21b=k4?:%114?433g9:j7;4;h0f>5<#;;:1>95a30d92>=n:m0;6)==0;07?k56n3=07d<l:18'776=:=1e?<h58:9j6g<72-99<7<;;o12b??<3`8j6=4+332961=i;8l1m65f2883>!55838?7c=>f;`8?l4?290/??>5259m74`=k21b>:4?:%114?433g9:j7j4;h05>5<#;;:1>95a30d9a>=n9l0;6)==0;07?k56n3l07d=::18'776=;=1e?<h50:9j76<72-99<7=;;o12b?7<3`996=4+332971=i;8l1>65f3083>!55839?7c=>f;18?l57290/??>5359m74`=<21b?h4?:%114?533g9:j7;4;h1g>5<#;;:1?95a30d92>=n;j0;6)==0;17?k56n3=07d=m:18'776=;=1e?<h58:9j7d<72-99<7=;;o12b??<3`926=4+332971=i;8l1m65f3983>!55839?7c=>f;`8?l50290/??>5359m74`=k21b?;4?:%114?533g9:j7j4;h0e>5<#;;:1?95a30d9a>=n<?0;6)==0;66?k56n3:07d:;:18'776=<<1e?<h51:9j06<72-99<7::;o12b?4<3`>96=4+332900=i;8l1?65f4083>!5583>>7c=>f;68?l27290/??>5449m74`==21b8k4?:%114?223g9:j784;h6f>5<#;;:1885a30d93>=n<m0;6)==0;66?k56n3207d:l:18'776=<<1e?<h59:9j0g<72-99<7::;o12b?g<3`>j6=4+332900=i;8l1n65f4883>!5583>>7c=>f;a8?l2?290/??>5449m74`=l21b8:4?:%114?223g9:j7k4;h1e>5<#;;:1885a30d9b>=n=?0;6)==0;76?k56n3:07d;;:18'776==<1e?<h51:9j16<72-99<7;:;o12b?4<3`?96=4+332910=i;8l1?65f5083>!5583?>7c=>f;68?l3a290/??>5549m74`==21b9h4?:%114?323g9:j784;h7g>5<#;;:1985a30d93>=n=j0;6)==0;76?k56n3207d;m:18'776==<1e?<h59:9j1d<72-99<7;:;o12b?g<3`?26=4+332910=i;8l1n65f5983>!5583?>7c=>f;a8?l30290/??>5549m74`=l21b9=4?:%114?323g9:j7k4;h17f?6=,:8;6>:n;o12b?6<3`9?57>5$203>62f3g9:j7?4;h17<?6=,:8;6>:n;o12b?4<3`9?;7>5$203>62f3g9:j7=4;h172?6=,:8;6>::;o12b?6<3`9?87>5$203>6223g9:j7?4;h177?6=,:8;6>::;o12b?4<3`9?>7>5$203>6223g9:j7=4;h16`?6=,:8;6>;l;o12b?6<3`9>n7>5$203>63d3g9:j7?4;h16e?6=,:8;6>;l;o12b?4<3`9>57>5$203>63d3g9:j7=4;h16<?6=,:8;6>;l;o12b?2<3`9>;7>5$203>63d3g9:j7;4;h162?6=,:8;6>;l;o12b?0<3`9>97>5$203>63d3g9:j794;h160?6=,:8;6>;<;o12b?6<3`9>>7>5$203>6343g9:j7?4;h165?6=,:8;6>;<;o12b?4<3`9><7>5$203>6343g9:j7=4;h17b?6=,:8;6>;<;o12b?2<3`9?i7>5$203>6343g9:j7;4;h17`?6=,:8;6>;<;o12b?0<3`9?o7>5$203>6343g9:j794;nf;>5<#;;:1h:5a30d94>=hl?0;6)==0;f4?k56n3;07bj;:18'776=l>1e?<h52:9l`6<72-99<7j8;o12b?5<3fn96=4+3329`2=i;8l1865`d083>!5583n<7c=>f;78?jb7290/??>5d69m74`=>21dok4?:%114?b03g9:j794;naf>5<#;;:1h:5a30d9<>=hkm0;6)==0;f4?k56n3307bml:18'776=l>1e?<h5a:9lgg<72-99<7j8;o12b?d<3fi26=4+3329`2=i;8l1o65`c983>!5583n<7c=>f;f8?je0290/??>5d69m74`=m21do;4?:%114?b03g9:j7h4;na6>5<#;;:1h:5a30d955=<gj>1<7*<218g3>h49o0:=65`c283>!5583n<7c=>f;31?>id:3:1(><?:e58j67a28907bm>:18'776=l>1e?<h51598kf6=83.8>=4k7:l05c<6=21dhk4?:%114?b03g9:j7?9;:mga?6=,:8;6i94n23e>41<3fno6=4+3329`2=i;8l1=554oea94?"4:90o;6`<1g82=>=hlk0;6)==0;f4?k56n3;j76aka;29 6472m=0b>?i:0`8?jb>290/??>5d69m74`=9j10ci;50;&065<c?2d8=k4>d:9lgd<72-99<7j8;o12b?7b32eij7>5$203>a1<f:;m6<h4;n333?6=,:8;6<>9;o12b?6<3f;;97>5$203>4613g9:j7?4;n330?6=,:8;6<>9;o12b?4<3f;;?7>5$203>4613g9:j7=4;ndb>5<#;;:1j45a30d94>=hn10;6)==0;d:?k56n3;07bh9:18'776=n01e?<h52:9lb0<72-99<7h6;o12b?5<3fl?6=4+3329b<=i;8l1865`f283>!5583l27c=>f;78?j`5290/??>5f89m74`=>21dj<4?:%114?`>3g9:j794;nd3>5<#;;:1j45a30d9<>=hmo0;6)==0;d:?k56n3307bkj:18'776=n01e?<h5a:9laa<72-99<7h6;o12b?d<3foi6=4+3329b<=i;8l1o65`e`83>!5583l27c=>f;f8?jc>290/??>5f89m74`=m21di54?:%114?`>3g9:j7h4;ng4>5<#;;:1j45a30d955=<gl<1<7*<218e=>h49o0:=65`e483>!5583l27c=>f;31?>ib<3:1(><?:g;8j67a28907bk<:18'776=n01e?<h51598k`4=83.8>=4i9:l05c<6=21d==?50;&065<a12d8=k4>6:9l556=83.8>=4i9:l05c<6?21djk4?:%114?`>3g9:j7?7;:mea?6=,:8;6k74n23e>4?<3flo6=4+3329b<=i;8l1=l54oga94?"4:90m56`<1g82f>=hnk0;6)==0;d:?k56n3;h76ai7;29 6472o30b>?i:0f8?jcd290/??>5f89m74`=9l10ch?50;&065<a12d8=k4>f:9l55e=83.8>=4>0c9m74`=821d==o50;&065<68k1e?<h51:9l55?=83.8>=4>0c9m74`=:21d==650;&065<68k1e?<h53:9~f65f290:<?4?:1y'76?=;;;0D>8;;I10b>\1:3;;wh4>4;d950<e200h6l4>7;35>4b=9j0:=7?6:0095d<zfl:1<6`>0383?!7f:380(<o<:39'542=:2.:=84=;%322?4<,8;<6?5+10:96>"690097)?>a;08 47e2;1/=<m52:&25a<53-;:i7<4$03e>7=#9;:1>6*>2081?!54;3;0(>=;:09'572=:2.:>84=;%312?4<,88<6?5+13:96>"6:0097)?=a;08 44e2;1/=?m52:&26a<53-;9i7<4$00e>7=#9::1>6*>3081?!74:380(<=<:39'562=:2.:?84=;%302?4<,89<6?5+12:96>"6;0097)?<a;08 45e2;1/=>m52:&27a<53-;8i7<4$01e>7=#9=:1>6*>4081?!73:380(<:<:39'512=:2.:884=;%372?4<,8><6?5+15:96>"6<0097)?;a;08 42e2;1/=9m52:&20a<53-;?i7<4$06e>7=#9<:1>6*>5081?!72:380(<;<:39'502=:2.:984=;%362?4<,8?<6?5+14:96>"6=0097)?:a;08 43e2;1/=8m52:&21a<53-;>i7<4$07e>7=#9?:1>6*>6081?!71:380(<8<:39'532=:2.::84=;%352?4<,8<<6?5+17:96>"6>0097)?9a;08 40e2;1/=;m52:&22a<53-;=i7<4$04e>7=#9>:1>6*>7081?!70:380(<9<:39'522=:2.:;84=;%342?4<,8=<6?5+16:96>"6?0097)?8a;08 41e2;1/=:m52:&23a<53-;<i7<4$05e>7=#91:1>6*>8081?!7?:380(<6<:39'5=2=:2.:484=;%3;2?4<,82<6?5+19:96>"600097)?7a;08 4>e2;1/=5m52:&2<a<53-;3i7<4$0:e>7=#90:1>6*>9081?!7>:380(<7<:39'5<2=:2.:584=;%3:2?4<,83<6?5+18:96>"610097)?6a;08 4?e2;1/=4m52:&2=a<53-;2i7<4$0;e>7=#9h:1>6*>a081?!55n3;:=6*>2381?!7f>39:n6*<23805g=#;;91?<l4n207><=i;;?1>95+322925=#;:;1??k4$0c7>4=#9h?1=6*<5g801`=#;?:1?8k4n242><=i;?81>95+13196>o68l0;66g>0e83>>o6990;66g>0g83>>o4;?0;66g<3483>>o4;10;66g<3683>>o1l3:17d8l:188m3`=831b:h4?::k06g<722c8>l4?::k06a<722c8>n4?::k062<722c8>;4?::k06<<722c8>54?::k57?6=3`<?6=44i7794?=n>?0;66a97;29?j0?2900c;750;9l2d<722c3o7>5$203>=d<f:;m6=54i9c94?"4:903n6`<1g82?>o?03:1(><?:9`8j67a2;10e5950;&065<?j2d8=k4<;:k;2?6=,:8;65l4n23e>1=<a1?1<7*<218;f>h49o0>76g74;29 64721h0b>?i:798m=5=83.8>=47b:l05c<032c3>7>5$203>=d<f:;m6554i9394?"4:903n6`<1g8:?>o?83:1(><?:9`8j67a2h10e:h50;&065<?j2d8=k4m;:k4`?6=,:8;65l4n23e>f=<a>i1<7*<218;f>h49o0o76g8b;29 64721h0b>?i:d98m2g=83.8>=47b:l05c<a32c<57>5$203>=d<f:;m6<>4;h5;>5<#;;:14o5a30d954=<a>=1<7*<218;f>h49o0:>65f7783>!55832i7c=>f;30?>o0=3:1(><?:9`8j67a28>07d9;:18'776=0k1e?<h51498m<5=83.8>=47b:l05c<6>21b5?4?:%114?>e3g9:j7?8;:k:5?6=,:8;65l4n23e>4><3`3;6=4+3329<g=i;8l1=454i9d94?"4:903n6`<1g82e>=n0l0;6)==0;:a?k56n3;i76g7d;29 64721h0b>?i:0a8?l>>290/??>58c9m74`=9m10e:k50;&065<?j2d8=k4>e:9j36<72-99<76m;o12b?7a32ci57>5$203>g><f:;m6=54ic594?"4:90i46`<1g82?>oe>3:1(><?:c:8j67a2;10eo;50;&065<e02d8=k4<;:kb`?6=,:8;6lm4n23e>5=<ahh1<7*<218bg>h49o0:76gn9;29 6472hi0b>?i:398md>=83.8>=4nc:l05c<432cj;7>5$203>de<f:;m6954i`494?"4:90jo6`<1g86?>of=3:1(><?:`a8j67a2?10el:50;&065<fk2d8=k48;:kb7?6=,:8;6lm4n23e>==<ah81<7*<218bg>h49o0276gn1;29 6472hi0b>?i:`98md6=83.8>=4nc:l05c<e32c2i7>5$203>de<f:;m6n54i8f94?"4:90jo6`<1g8g?>o>k3:1(><?:`a8j67a2l10e4l50;&065<fk2d8=k4i;:k:e?6=,:8;6lm4n23e>46<3`326=4+3329ef=i;8l1=<54i8:94?"4:90jo6`<1g826>=n1>0;6)==0;c`?k56n3;876g66;29 6472hi0b>?i:068?l?2290/??>5ab9m74`=9<10eo:50;&065<fk2d8=k4>6:9jf6<72-99<7ol;o12b?7032ci>7>5$203>de<f:;m6<64;h`2>5<#;;:1mn5a30d95<=<ak:1<7*<218bg>h49o0:m65fag83>!5583kh7c=>f;3a?>ofm3:1(><?:`a8j67a28i07don:18'776=ij1e?<h51e98m<`=83.8>=4nc:l05c<6m21b594?:%114?gd3g9:j7?i;:kaa?6=,:8;6oj4n23e>5=<aki1<7*<218a`>h49o0:76gmb;29 6472kn0b>?i:398mgg=83.8>=4md:l05c<432c997>5$203>72<f:;m6=54i3194?"4:90986`<1g82?>o5:3:1(><?:368j67a2;10e??50;&065<5<2d8=k4<;:k14?6=,:8;6?:4n23e>1=<a8l1<7*<21810>h49o0>76g=e;29 6472;>0b>?i:798m7b=83.8>=4=4:l05c<032c9o7>5$203>72<f:;m6554i3`94?"4:90986`<1g8:?>o5i3:1(><?:368j67a2h10e?750;&065<5<2d8=k4m;:k1<?6=,:8;6?:4n23e>f=<a;=1<7*<21810>h49o0o76g=6;29 6472;>0b>?i:d98m4c=83.8>=4=4:l05c<a32c897>5$203>62<f:;m6=54i2194?"4:90886`<1g82?>o4:3:1(><?:268j67a2;10e>?50;&065<4<2d8=k4<;:k04?6=,:8;6>:4n23e>1=<a:o1<7*<21800>h49o0>76g<d;29 6472:>0b>?i:798m6e=83.8>=4<4:l05c<032c8n7>5$203>62<f:;m6554i2c94?"4:90886`<1g8:?>o413:1(><?:268j67a2h10e>650;&065<4<2d8=k4m;:k03?6=,:8;6>:4n23e>f=<a:<1<7*<21800>h49o0o76g=f;29 6472:>0b>?i:d98m10=83.8>=4;5:l05c<732c?87>5$203>13<f:;m6<54i5194?"4:90?96`<1g81?>o3:3:1(><?:578j67a2:10e9?50;&065<3=2d8=k4;;:k74?6=,:8;69;4n23e>0=<a=l1<7*<21871>h49o0=76g;e;29 6472=?0b>?i:698m1b=83.8>=4;5:l05c<?32c?o7>5$203>13<f:;m6454i5`94?"4:90?96`<1g8b?>o3i3:1(><?:578j67a2k10e9750;&065<3=2d8=k4l;:k7<?6=,:8;69;4n23e>a=<a==1<7*<21871>h49o0n76g<f;29 6472=?0b>?i:g98m00=83.8>=4:5:l05c<732c>87>5$203>03<f:;m6<54i4194?"4:90>96`<1g81?>o2:3:1(><?:478j67a2:10e8?50;&065<2=2d8=k4;;:k6b?6=,:8;68;4n23e>0=<a<o1<7*<21861>h49o0=76g:d;29 6472<?0b>?i:698m0e=83.8>=4:5:l05c<?32c>n7>5$203>03<f:;m6454i4c94?"4:90>96`<1g8b?>o213:1(><?:478j67a2k10e8650;&065<2=2d8=k4l;:k63?6=,:8;68;4n23e>a=<a<:1<7*<21861>h49o0n76g<4c83>!55839?m6`<1g83?>o4<00;6)==0;17e>h49o0:76g<4983>!55839?m6`<1g81?>o4<>0;6)==0;17e>h49o0876g<4783>!55839?96`<1g83?>o4<=0;6)==0;171>h49o0:76g<4283>!55839?96`<1g81?>o4<;0;6)==0;171>h49o0876g<5e83>!55839>o6`<1g83?>o4=k0;6)==0;16g>h49o0:76g<5`83>!55839>o6`<1g81?>o4=00;6)==0;16g>h49o0876g<5983>!55839>o6`<1g87?>o4=>0;6)==0;16g>h49o0>76g<5783>!55839>o6`<1g85?>o4=<0;6)==0;16g>h49o0<76g<5583>!55839>?6`<1g83?>o4=;0;6)==0;167>h49o0:76g<5083>!55839>?6`<1g81?>o4=90;6)==0;167>h49o0876g<4g83>!55839>?6`<1g87?>o4<l0;6)==0;167>h49o0>76g<4e83>!55839>?6`<1g85?>o4<j0;6)==0;167>h49o0<76ak8;29 6472m=0b>?i:198ka0=83.8>=4k7:l05c<632eo87>5$203>a1<f:;m6?54oe194?"4:90o;6`<1g80?>ic:3:1(><?:e58j67a2=10ci?50;&065<c?2d8=k4:;:mg4?6=,:8;6i94n23e>3=<gjl1<7*<218g3>h49o0<76ale;29 6472m=0b>?i:998kfb=83.8>=4k7:l05c<>32eho7>5$203>a1<f:;m6l54ob`94?"4:90o;6`<1g8a?>id13:1(><?:e58j67a2j10cn650;&065<c?2d8=k4k;:m`3?6=,:8;6i94n23e>`=<gj<1<7*<218g3>h49o0m76al5;29 6472m=0b>?i:028?je3290/??>5d69m74`=9810cn=50;&065<c?2d8=k4>2:9lg7<72-99<7j8;o12b?7432eh=7>5$203>a1<f:;m6<:4;na3>5<#;;:1h:5a30d950=<gml1<7*<218g3>h49o0::65`dd83>!5583n<7c=>f;34?>icl3:1(><?:e58j67a28207bjl:18'776=l>1e?<h51898kad=83.8>=4k7:l05c<6i21dhl4?:%114?b03g9:j7?m;:mg=?6=,:8;6i94n23e>4e<3fn>6=4+3329`2=i;8l1=i54obc94?"4:90o;6`<1g82a>=hjo0;6)==0;f4?k56n3;m76a>0683>!5583;;:6`<1g83?>i68<0;6)==0;332>h49o0:76a>0583>!5583;;:6`<1g81?>i68:0;6)==0;332>h49o0876aia;29 6472o30b>?i:198kc>=83.8>=4i9:l05c<632em:7>5$203>c?<f:;m6?54og794?"4:90m56`<1g80?>ia<3:1(><?:g;8j67a2=10ck=50;&065<a12d8=k4:;:me6?6=,:8;6k74n23e>3=<go;1<7*<218e=>h49o0<76ai0;29 6472o30b>?i:998k``=83.8>=4i9:l05c<>32eni7>5$203>c?<f:;m6l54odf94?"4:90m56`<1g8a?>ibj3:1(><?:g;8j67a2j10cho50;&065<a12d8=k4k;:mf=?6=,:8;6k74n23e>`=<gl21<7*<218e=>h49o0m76aj7;29 6472o30b>?i:028?jc1290/??>5f89m74`=9810ch;50;&065<a12d8=k4>2:9la1<72-99<7h6;o12b?7432en?7>5$203>c?<f:;m6<:4;ng1>5<#;;:1j45a30d950=<g8::6=4+3329b<=i;8l1=;54o023>5<#;;:1j45a30d952=<gol1<7*<218e=>h49o0:465`fd83>!5583l27c=>f;3:?>ial3:1(><?:g;8j67a28k07bhl:18'776=n01e?<h51c98kcd=83.8>=4i9:l05c<6k21dj:4?:%114?`>3g9:j7?k;:mfg?6=,:8;6k74n23e>4c<3fo:6=4+3329b<=i;8l1=k54o02`>5<#;;:1==l4n23e>5=<g8:j6=4+332955d<f:;m6<54o02:>5<#;;:1==l4n23e>7=<g8:36=4+332955d<f:;m6>54}r401?6=9;?pR>7l;_40f>X1;=1U:>=4^711?[0492T=?=5Q63d8Z34b3W<9h6P92b9]27d<5:<>6<?=;<10`?54>278?i4<349>76b=;:201>=k:214?854l399;63<3e8063=:;:n1??74=21g>64?3498h78<;<10`?033498h78:;<10`?013498h76l;<10`?>f3498h767;<10`?>03498h769;<10`?>23498h76;;<10`?>43498h76=;<10`?>63498h76?;<10`?1a3498h79k;<10`?1d3498h79m;<10`?1f3498h796;<10`?1?3498h798;<10`?113498h79:;<10`?133498h77<;<10`??53498h7l6;<10`?d03498h7l9;<10`?d23498h7lj;<10`?dd3498h7lm;<10`?df3498h7<:;<10`?403498h7<9;<10`?7b3498h7=8;<10`?513498h7<i;<10`?213498h7:n;<10`?2>3498h7:7;<10`?203498h7=i;<10`?3f3498h7;6;<10`?3?3498h7;8;<10`?373498h7=:d:?07a<4=k16?>j534c8965c2:?270=<d;160>;4;m089?5232f9707<5:9o6>;?;<10g?54>278?n4<349>76e=;:201>=l:214?854k399;63<3b8063=:;:i1??74=21`>64?3498o78<;<10g?033498o78:;<10g?013498o76l;<10g?>f3498o767;<10g?>03498o769;<10g?>23498o76;;<10g?>43498o76=;<10g?>63498o76?;<10g?1a3498o79k;<10g?1d3498o79m;<10g?1f3498o796;<10g?1?3498o798;<10g?113498o79:;<10g?133498o77<;<10g??53498o7l6;<10g?d03498o7l9;<10g?d23498o7lj;<10g?dd3498o7lm;<10g?df3498o7<:;<10g?403498o7<9;<10g?7b3498o7=8;<10g?513498o7<i;<10g?213498o7:n;<10g?2>3498o7:7;<10g?203498o7=i;<10g?3f3498o7;6;<10g?3?3498o7;8;<10g?373498o7=:d:?07f<4=k16?>m534c8965d2:?270=<c;160>;4;j089?5232a9707<5:9h6>;?;<10f?54>278?o4<349>76d=;:201>=m:214?854j399;63<3c8063=:;:h1??74=21a>64?3498n78<;<10f?033498n78:;<10f?013498n76l;<10f?>f3498n767;<10f?>03498n769;<10f?>23498n76;;<10f?>43498n76=;<10f?>63498n76?;<10f?1a3498n79k;<10f?1d3498n79m;<10f?1f3498n796;<10f?1?3498n798;<10f?113498n79:;<10f?133498n77<;<10f??53498n7l6;<10f?d03498n7l9;<10f?d23498n7lj;<10f?dd3498n7lm;<10f?df3498n7<:;<10f?403498n7<9;<10f?7b3498n7=8;<10f?513498n7<i;<10f?213498n7:n;<10f?2>3498n7:7;<10f?203498n7=i;<10f?3f3498n7;6;<10f?3?3498n7;8;<10f?373498n7=:d:?07g<4=k16?>l534c8965e2:?270=<b;160>;4;k089?5232`9707<5:9i6>;?;<10e?54>278?l4<349>76g=;:201>=n:214?854i399;63<3`8063=:;:k1??74=21b>64?3498m78<;<10e?033498m78:;<10e?013498m76l;<10e?>f3498m767;<10e?>03498m769;<10e?>23498m76;;<10e?>43498m76=;<10e?>63498m76?;<10e?1a3498m79k;<10e?1d3498m79m;<10e?1f3498m796;<10e?1?3498m798;<10e?113498m79:;<10e?133498m77<;<10e??53498m7l6;<10e?d03498m7l9;<10e?d23498m7lj;<10e?dd3498m7lm;<10e?df3498m7<:;<10e?403498m7<9;<10e?7b3498m7=8;<10e?513498m7<i;<10e?213498m7:n;<10e?2>3498m7:7;<10e?203498m7=i;<10e?3f3498m7;6;<10e?3?3498m7;8;<10e?373498m7=:d:?07d<4=k16?>o534c8965f2:?270=<a;160>;4;h089?5232c9707<5:9j6>;?;|q567<720qU:?<4=21g>46b3498h7??d:?07f<68l16?>m511f8965e28:n70=<b;33`>;4;h0:<h5232c955b<uz<9?7>59z\566=:;:n1=<>4=21g>46a3498o7?>0:?07f<68o16?>l51028965e28:m70=<a;324>;4;h0:<k5rs2;b>5<69rT85l5232f92a=:;:n1:n5232f977d<5:9o6><n;<10g?0c3498o78l;<10g?55j278?n4<2`9>76d=>m16?>l56b9>76d=;;h01>=m:20b?854i3<o70=<a;4`?854i399n63<3`806d=z{:3i6=4>1z\0=g=:;:n1:k5232f92`=:;:n1??j4=21g>64d3498o78i;<10g?0b3498o7==d:?07f<4:j16?>l56g9>76d=>l16?>l533f8965e2:8h70=<a;4e?854i3<n70=<a;11`>;4;h08>n5rs43;>5<5sW>m463<3e8g`>{t=8<1<7<t^5d4?854l3nh7p}:1583>7}Y<o?01>=k:e`8yv36;3:1>vP;f59>76b=lh1v8?=:181[2a;278?i4k9:p147=838pR9h=;<10`?b23ty>==4?:3y]0c7<5:9o6no4}r73b?6=:rT?j=5232f9fc=z{<:n6=4={_6fb>;4;j0oh6s|51f94?4|V=on70=<c;f`?xu28j0;6?uQ4df8965d2mh0q~;?b;296~X3mj16?>m5d`9~w06>2909wS:ja:?07f<c12wx9=650;0xZ1c>3498o7j:;|q642<72;qU8h64=21`>fg<uz?;:7>52z\7a2=:;:i1nk5rs426>5<5sW>n:63<3c8g`>{t=9>1<7<t^5g6?854j3nh7p}:0283>7}Y<l>01>=m:e`8yv37:3:1>vP;e29>76d=lh1v8>>:181[2b:278?o4k9:p156=838pR9k>;<10f?b23ty>=k4?:3y]0cc<5:9i6no4}r72a?6=:rT?ji5232`9fc=z{<;o6=4={_6eg>;4;h0oh6s|50a94?4|V=li70=<a;f`?xu29k0;6?uQ4gc8965f2mh0q~;>a;296~X3n016?>o5d`9~w07>2909wS:i6:?07d<c12wx9<;50;0xZ1ce3498m7j:;|q64d<72;qU8h>4=21b>fg<uz>mj7>52z\7`c=:;:k1nk5rs4`e>5<5sW??<63<3e8ee>{t=kn1<7<t^41e?854l3l37p}:bb83>7}Y=:o01>=k:g48yv3ej3:1>vP:3e9>76b=n<1v8ln:181[34k278?i4i4:p1g?=838pR8=m;<10`?`43ty>n54?:3y]16g<5:9o6k<4}r7a3?6=:rT>?45232f9b4=z{<h>6=4={_703>;4;j0mm6s|5c694?4|V<9=70=<c;d;?xu2j:0;6?uQ5278965d2o<0q~;m2;296~X2;=16?>m5f49~w0d62909wS;<3:?07f<a<2wx9o>50;0xZ0553498o7h<;|q6ec<72;qU9>?4=21`>c4<uz?ji7>52z\675=:;:i1j<5rs4cg>5<5sW?9j63<3c8ee>{t=hi1<7<t^40f?854j3l37p}:a`83>7}Y=;i01>=m:g48yv3f13:1>vP:2c9>76d=n<1v8o7:181[35i278?o4i4:p1d1=838pR8<6;<10f?`43ty>m;4?:3y]17><5:9i6k<4}r7b1?6=:rT>>:5232`9b4=z{<k?6=4={_712>;4;h0mm6s|5`194?4|V<8>70=<a;d;?xu2i;0;6?uQ5368965f2o<0q~;n1;296~X2::16?>o5f49~w37a2909wS;6f:?07d<a<2wx:<k50;0xZ0?b3498m7h<;|q55a<72;qU94j4=21b>c4<uz<:o7>52z\6=f=:;:k1j<5rs73a>5<5sW?2n63<3e8e4>{t>8k1<7<t^4;b?854l3om7p}91883>7}Y=0301>=k:dg8yv0603:1>vP:999>76b=mm1v;?8:181[3>?278?i4jb:p240=838pR879;<10`?cf3ty==94?:3y]1<2<5:9o6h74}r427?6=:rT>5>5232f9a==z{?;96=4={_7:6>;4;j0m<6s|60394?4|V<3:70=<c;ge?xu1990;6?uQ5828965d2lo0q~8?f;296~X20o16?>m5ee9~w36b2909wS;7e:?07f<bj2wx:=j50;0xZ0>c3498o7kn;|q54f<72;qU95m4=21`>`?<uz<;n7>52z\6<g=:;:i1i55rs72:>5<5sW?3563<3c8e4>{t>921<7<t^4:;?854j3om7p}90683>7}Y=1=01>=m:dg8yv07>3:1>vP:879>76d=mm1v;>::181[3?=278?o4jb:p252=838pR86;;<10f?cf3ty=<>4?:3y]1=5<5:9i6h74}r436?6=:rT>4?5232`9a==z{?::6=4={_7;5>;4;h0m<6s|61294?4|V<2;70=<a;ge?xu2nl0;6?uQ56g8965f2lo0q~;id;296~X2?m16?>o5ee9~w0`d2909wS;8c:?07d<bj2wx9kl50;0xZ01e3498m7kn;|q6bd<72;qU9:o4=21b>`?<uz?m57>52z\63<=:;:k1i55rs4d;>5<5sW?<463<3e8f3>{t=o=1<7<t^454?854l3o=7p}:f783>7}Y=><01>=k:d78yv3a=3:1>vP:749>76b=m=1v8h<:181[30;278?i4j3:p1c4=838pR89=;<10`?c53ty>j<4?:3y]127<5:9o6<>>;|q6b5<72;qU9:>4=21g>4673ty>ik4?:3y]13`<5:9h6h94}r7fa?6=:rT>:h5232a9a3=z{<oo6=4={_75`>;4;j0n96s|5da94?4|V<<h70=<c;g7?xu2mk0;6?uQ57`8965d2l90q~;ja;296~X2>h16?>m5e39~w0c?2909wS;98:?07f<6881v8k8:181[31?278?n4>019~w0c12909wS;96:?07g<b?2wx9h;50;0xZ0023498n7k9;|q6a1<72;qU9;:4=21a>`3<uz?n?7>52z\626=:;:h1i95rs4g1>5<5sW?=>63<3c8f7>{t=l;1<7<t^442?854j3o97p}:e183>7}Y=?:01>=m:022?xu2lo0;6?uQ54d8965e28:;7p}:de83>7}Y=<n01>=n:d58yv3ck3:1>vP:5b9>76g=m?1v8jm:181[32j278?l4j5:p1ag=838pR8;n;<10e?c33ty>h44?:3y]10?<5:9j6h=4}r7g<?6=:rT>955232c9a7=z{<n<6=4={_763>;4;h0:<<5rs4f5>5<5sW?>:63<3`8245=z{<n>6=4={_761>;4;m0mj6s|5e694?4|V<??70=<d;df?xu2l;0;6?uQ5408965c2on0q~;k1;296~X2=816?>j5fb9~w0b72909wS;:0:?07a<aj2wx9nh50;0xZ02a3498h7h8;|q6g`<72;qU99k4=21g>`e<uz?hh7>52z\60a=:;:n1i<5rs4a`>5<5sW??o63<3b8eb>{t=jh1<7<t^46a?854k3ln7p}:c`83>7}Y==k01>=l:gf8yv3d13:1>vP:489>76e=nj1v8m8:181[33?278?n4ib:p1f0=838pR8:9;<10g?`03ty>o84?:3y]113<5:9h6hm4}r7`0?6=:rT>895232a9a4=z{<i86=4={_777>;4;k0mj6s|5b094?4|V<>970=<b;df?xu2k80;6?uQ5538965e2on0q~;l0;296~X2;116?>l5fb9~w0d12909wS;=d:?07g<aj2wx9ll50;0xZ0453498n7h8;|q565<72;qU94;4=21a>`e<uz<:97>52z\6<d=:;:h1i<5rs72b>5<5sW?<j63<3`8eb>{t=ol1<7<t^457?854i3ln7p}:f583>7}Y=?301>=n:gf8yv3b13:1>vP:5d9>76g=nj1v8jj:181[32;278?l4ib:p1a5=838pR8:7;<10e?`03ty>o54?:3y]177<5:9j6hm4}r7b4?6=:rT>>=5232c9a4=z{?>>6=46{_474>;4;m088o5232f971?<5:9o6>:7;<10`?53?278?i4<479>76b=;=>01>=k:260?854l39?>6s|65194??|V?9m70=<c;17f>;4;j08845232a971><5:9h6>:8;<10g?53>278?n4<459>76e=;=901>=l:261?xu1<;0;64uQ62g8965e2:>i70=<b;17=>;4;k08855232`9711<5:9i6>:9;<10f?53<278?o4<429>76d=;=80q~8;1;29=~X1;m16?>o535`8965f2:>270=<a;17<>;4;h088:5232c9710<5:9j6>:;;<10e?53;278?l4<439~w33c2908wS8;d:?07a<4=116?>j535d8yv02j3:1?vP94b9>76e=;<201>=l:26e?xu1=h0;6>uQ65`8965e2:?370=<b;17b>{t><31<7=t^76b?854i39>463<3`800c=z{??36=4<{_47=>;4;m089:5232f971c<uz<>;7>53z\50==:;:i1?894=21`>62b3ty=:;4?:2y]203<5:9i6>;8;<10f?53m2wx:;;50;1xZ3333498m7=:7:?07d<4<l1v;8;:180[02;278?i4<579>76b=;=n0q~893;297~X1=;16?>m53448965d2:>o7p}96383>6}Y><;01>=m:275?854j39?h6s|67394?5|V??;70=<a;162>;4;h088i5rs743>5<4sW<?j63<3e8010=:;:n1?9m4}r46b?6=;rT=8h5232a9703<5:9h6>:l;|q51`<72:qU:994=21a>6323498n7=;c:p200=839pR;:9;<10e?52=278?l4<4b9~w61f2902wS=9e:?07a<5;278?i4<5:?07f<5;278?n4<5:?07g<5;278?o4<5:?07d<5;278?l4<5:p72>=833pR>8k;<10`?453498h7=<;<10g?453498o7=<;<10f?453498n7=<;<10e?453498m7=<;|q0<6<720qU?:84=21g>77<5:9o6><4=21`>77<5:9h6><4=21a>77<5:9i6><4=21b>77<5:9j6><4}r1;6?6=1rT8;85232f965=:;:n1?<5232a965=:;:i1?<5232`965=:;:h1?<5232c965=:;:k1?<5rs2:2>5<>sW9<863<3e82b>;4;m08<63<3b82b>;4;j08<63<3c82b>;4;k08<63<3`82b>;4;h08<6s|39294??|V:=870=<d;0f?854l39n70=<c;0f?854k39n70=<b;0f?854j39n70=<a;0f?854i39n7p}<7g83><}Y;>801>=k:3f8965c2:n01>=l:3f8965d2:n01>=m:3f8965e2:n01>=n:3f8965f2:n0q~=8e;29=~X4?816?>j52b9>76b=;j16?>m52b9>76e=;j16?>l52b9>76d=;j16?>o52b9>76g=;j1v>9k:18:[508278?i4=b:?07a<4j278?n4=b:?07f<4j278?o4=b:?07g<4j278?l4=b:?07d<4j2wx?:m50;;xZ60a3498h7<n;<10`?5f3498o7<n;<10g?5f3498n7<n;<10f?5f3498m7<n;<10e?5f3ty8;o4?:8y]73e<5:9o6?74=21g>6?<5:9h6?74=21`>6?<5:9i6?74=21a>6?<5:9j6?74=21b>6?<uz9<;7>59z\02g=:;:n1>55232f97==:;:i1>55232a97==:;:h1>55232`97==:;:k1>55232c97==z{:336=46{_1;`>;4;m0?863<3e862>;4;j0?863<3b862>;4;k0?863<3c862>;4;h0?863<3`862>{t;0<1<77t^2:`?854l3>870=<d;77?854k3>870=<c;77?854j3>870=<b;77?854i3>870=<a;77?xu41<0;64uQ39`8965c2=801>=k:418965d2=801>=l:418965e2=801>=m:418965f2=801>=n:418yv5><3:15vP<8`9>76b=<816?>j5539>76e=<816?>m5539>76d=<816?>l5539>76g=<816?>o5539~w6?42902wS=79:?07a<38278?i4:1:?07f<38278?n4:1:?07g<38278?o4:1:?07d<38278?l4:1:p7<4=833pR>67;<10`?2a3498h7;i;<10g?2a3498o7;i;<10f?2a3498n7;i;<10e?2a3498m7;i;|q0=4<720qU?594=21g>1c<5:9o68k4=21`>1c<5:9h68k4=21a>1c<5:9i68k4=21b>1c<5:9j68k4}r1:4?6=1rT84;5232f90a=:;:n19i5232a90a=:;:i19i5232`90a=:;:h19i5232c90a=:;:k19i5rs2:e>5<>sW93963<3e87g>;4;m0>o63<3b87g>;4;j0>o63<3c87g>;4;k0>o63<3`87g>;4;h0>o6s|39g94??|V:2?70=<d;6a?854l3?i70=<c;6a?854k3?i70=<b;6a?854j3?i70=<a;6a?854i3?i7p}<d783>7}Y;k<01>=k:838yv5c<3:1>vP<b49>76b=191v>j=:181[5e;278?i47f:p7a7=838pR>l=;<10`?>b3ty8h=4?:3y]7g7<5:9o65j4}r1`b?6=:rT8n=5232f9<<=z{:in6=4={_1bb>;4;m0<i6s|3bf94?4|V:kn70=<d;50?xu4kj0;6?uQ3`f8965d20;0q~=lb;296~X4ij16?>m5919~w6ef2909wS=nb:?07f<?n2wx?n750;0xZ6gf3498o76j;|q0g2<72;qU?l64=21`>=b<uz9h:7>52z\0e2=:;:i1445rs2a6>5<5sW9j:63<3b84a>{t;j>1<7<t^2c6?854k3=87p}<c283>7}Y;h>01>=m:838yv5d:3:1>vP<a29>76d=191v>m>:181[5f:278?o47f:p7f6=838pR>o>;<10f?>b3ty8nk4?:3y]7d6<5:9i65j4}r1aa?6=:rT85k5232`9<<=z{:no6=4={_1ag>;4;k0<i6s|3ea94?4|V:hi70=<b;50?xu4lk0;6?uQ3cc8965f20;0q~=ka;296~X4j016?>o5919~w6b>2909wS=m8:?07d<?n2wx?i650;0xZ6d03498m76j;|q0`2<72;qU?o:4=21b>=b<uz9o?7>52z\0e<=:;:k1445rs2a;>5<5sW92i63<3`84a>{t;kn1<7<t^2;g?854i3=87p};7e83>7}Y;oo01>=k:`f8yv20j3:1>vP<fe9>76b=ik1v99n:181[5ak278?i4n9:p02?=838pR>hm;<10`?g?3ty?;54?:3y]7cg<5:9o6l94}r643?6=:rT8j45232f9e3=z{===6=4={_1e<>;4;m0j96s|46794?4|V:l<70=<d;c7?xu3?:0;6?uQ3g78965d2hn0q~:82;296~X4n=16?>m5ac9~w1162909wS=i3:?07f<f12wx8:>50;0xZ6`53498o7o7;|q72c<72;qU?k?4=21`>d1<uz>=i7>52z\0b5=:;:i1m;5rs54g>5<5sW9nj63<3b8b1>{t<?i1<7<t^2gf?854k3k?7p};6c83>7}Y;ln01>=m:`f8yv21i3:1>vP<eb9>76d=ik1v987:181[5bi278?o4n9:p031=838pR>k6;<10f?g?3ty?:;4?:3y]7`><5:9i6l94}r651?6=:rT8i:5232`9e3=z{=<?6=4={_1f2>;4;k0j96s|47194?4|V:o>70=<b;c7?xu3>;0;6?uQ3d68965f2hn0q~:91;296~X4m:16?>o5ac9~w1072909wS=j2:?07d<f12wx88h50;0xZ6c63498m7o7;|q7`a<72;qU88j4=21b>d1<uz>oo7>52z\71f=:;:k1m;5rs5fa>5<5sW>>n63<3`8b1>{t<mk1<7<t^57b?854i3k?7p};d883>7}Y<<301>=k:`18yv2c03:1>vP;599>76b=i;1v9j8:181[22?278?i4n1:p0a0=838pR9;9;<10`?g73ty?h84?:3y]003<5:9o64k4}r6g0?6=:rT?995232f9=a=z{=n96=4={_666>;4;m02o6s|4e394?4|V=?:70=<d;;a?xu3l90;6?uQ4428965d2h90q~:lf;296~X3<o16?>m5a39~w1eb2909wS:;e:?07f<f92wx8nj50;0xZ12c3498o7o?;|q7gf<72;qU89m4=21`><c<uz>hn7>52z\70g=:;:i15i5rs5ab>5<5sW>?m63<3b8:g>{t<j31<7<t^56:?854k33i7p};c683>7}Y<==01>=m:`18yv2d>3:1>vP;479>76d=i;1v9m::181[23=278?o4n1:p0f2=838pR9:;;<10f?g73ty?o>4?:3y]015<5:9i64k4}r6`6?6=:rT?8?5232`9=a=z{=i:6=4={_675>;4;k02o6s|4b294?4|V=>;70=<b;;a?xu3jo0;6?uQ42d8965f2h90q~:me;296~X3;l16?>o5a39~w1dd2909wS:<c:?07d<f92wx8ol50;0xZ15e3498m7o?;|q7fd<72;qU8>o4=21b><c<uz>i57>52z\77<=:;:k15i5rs5`;>5<5sW>8463<3`8:g>{t<k=1<7<t^514?854i33i7p};b783>7}Y<:<01>=k:8c8yv2e=3:1>vP;349>76b=101v9l;:181[24<278?i468:p0g5=838pR9=<;<10`??03ty?n<4?:3y]067<5:9o6484}r6a4?6=:rT??=5232f9=0=z{=km6=4={_61b>;4;m0i86s|4`g94?4|V=8n70=<d;`0?xu3im0;6?uQ43f8965d20k0q~:nc;296~X3:j16?>m5989~w1ge2909wS:=b:?07f<>02wx8lo50;0xZ14f3498o778;|q7e<<72;qU8?74=21`><0<uz>j47>52z\76==:;:i1585rs5c5>5<5sW>9:63<3b8a0>{t<h?1<7<t^506?854k3h87p};a583>7}Y<;>01>=m:8c8yv2f;3:1>vP;229>76d=101v9o=:181[25:278?o468:p0d7=838pR9<>;<10f??03ty?m=4?:3y]076<5:9i6484}r6:b?6=:rT?=k5232`9=0=z{=3n6=4={_62a>;4;k0i86s|48f94?4|V=;o70=<b;`0?xu31k0;6?uQ40`8965f20k0q~:6a;296~X39h16?>o5989~w1?>2909wS:>9:?07d<>02wx84650;0xZ17?3498m778;|q7=2<72;qU8<94=21b><0<uz>2:7>52z\753=:;:k1585rs5;6>5<5sW>:963<3`8a0>{t<0>1<7<t^537?854i3h87p};9283>7}Y<8901>=k:c08yv2>:3:1>vP;139>76b=j81v97?:181[268278?i4m0:p0=`=838pR9>i;<10`?ga3ty?4h4?:3y]05c<5:9o6lk4}r6;`?6=:rT?<i5232f9ed=z{=2h6=4={_63g>;4;m02j6s|49`94?4|V=:i70=<d;;7?xu30h0;6?uQ41c8965d2k80q~:79;296~X38016?>m5b09~w1>?2909wS:?8:?07f<e82wx85950;0xZ1603498o7oi;|q7<0<72;qU8=;4=21`>dc<uz>387>52z\741=:;:i1ml5rs5:0>5<5sW>;?63<3b8:b>{t<181<7<t^521?854k33?7p};8083>7}Y<9;01>=m:c08yv2?83:1>vP;019>76d=j81v99i:181[5an278?o4m0:p02c=838pR>h9;<10f?ga3ty?;94?:3y]7`d<5:9i6lk4}r65=?6=:rT8i=5232`9ed=z{=nn6=4={_667>;4;k02j6s|4e194?4|V=>370=<b;;7?xu3k10;6?uQ42f8965f2k80q~:md;296~X3;;16?>o5b09~w1d52909wS:=7:?07d<e82wx8l950;0xZ17d3498m7oi;|q7=f<72;qU8<?4=21b>dc<uz>2=7>52z\743=:;:k1ml5rs5:5>5<5sW9oj63<3`8:b>{t<<o1<7<t^2ff?854i33?7ps|38c94?4|V:3j708>:2;b?!54m38:56s|63094?4|V?89708>:701?!54m38om6s|65794?4|V?>;708>:763?!54m38nj6s|65194?4|V?9m708>:71e?!54m38mm6s|65094?4|V?9n708>:71f?!54m39;96s|65394?4|V?9o708>:71g?!54m39;i6s|36c94?4|V:<n708>:24f?!54m3;jn6s|36:94?4|V:<o708>:24g?!54m3;i:6s|39194?4|V:==708>:255?!54m3;h=6s|39094?4|V:=>708>:256?!54m3;ho6s|39394?4|V:=?708>:257?!54m3;o;6s|39294?4|V:=8708>:250?!54m3;n>6s|36d94?4|V:=9708>:251?!54m3;nh6s|36g94?4|V:=:708>:252?!54m3;m46s|36f94?4|V:=;708>:253?!54m38;?6s|36a94?4|V:<m708>:24e?!54m38;i6s|36`94?4|V:<h708>:24`?!54m38:m6s|36594?4|V:<i708>:24a?!54m38996s|3e494?4|V:h=708>:2`5?!54m388<6s|3e694?4|V:h>708>:2`6?!54m388n6s|3e094?4|V:h8708>:2`0?!54m38?:6s|3e394?4|V:h9708>:2`1?!54m38>=6s|3e294?4|V:h:708>:2`2?!54m38>o6s|3bd94?4|V:h;708>:2`3?!54m38=;6s|3bg94?4|V:km708>:2ce?!54m38<>6s|3bf94?4|V:kn708>:2cf?!54m38<h6s|3ba94?4|V:ko708>:2cg?!54m38346s|3b`94?4|V:kh708>:2c`?!54m382?6s|3bc94?4|V:ki708>:2ca?!54m382i6s|3b;94?4|V:kj708>:2cb?!54m38j56s|3b594?4|V:k3708>:2c;?!54m38i86s|3b494?4|V:k<708>:2c4?!54m38ij6s|3b794?4|V:k=708>:2c5?!54m38hm6s|3b694?4|V:k>708>:2c6?!54m38o96s|3b194?4|V:k?708>:2c7?!54m38o46s|3b094?4|V:k8708>:2c0?!54m38o56s|3b394?4|V:k9708>:2c1?!54m38on6s|3b294?4|V:k:708>:2c2?!54m38oo6s|3cd94?4|V:k;708>:2c3?!54m38oh6s|3cg94?4|V:3m708>:2;e?!54m38oi6s|3ef94?4|V:hh708>:2``?!54m38oj6s|3ea94?4|V:hi708>:2`a?!54m38n<6s|3e`94?4|V:hj708>:2`b?!54m38n=6s|3ec94?4|V:h2708>:2`:?!54m38n>6s|3e;94?4|V:h3708>:2`;?!54m38n?6s|3e:94?4|V:h<708>:2`4?!54m38n86s|3e594?4|V:h?708>:2`7?!54m38n96s|3e194?4|V:k2708>:2c:?!54m38n:6s|3b:94?4|V:3n708>:2;f?!54m38n;6s|3cf94?4|V:3o708>:2;g?!54m38n46s|50:94?4|V=l3708>:5d;?!54m38n56s|50494?4|V=l<708>:5d4?!54m38nm6s|50694?4|V=l>708>:5d6?!54m38nn6s|50194?4|V=l?708>:5d7?!54m38no6s|50094?4|V=l8708>:5d0?!54m38nh6s|50394?4|V=l9708>:5d1?!54m38ni6s|50294?4|V=l:708>:5d2?!54m38m<6s|51d94?4|V=l;708>:5d3?!54m38m=6s|51g94?4|V=om708>:5ge?!54m38m>6s|51f94?4|V=on708>:5gf?!54m38m?6s|51a94?4|V=oo708>:5gg?!54m38m86s|51`94?4|V=oh708>:5g`?!54m38m96s|51;94?4|V=oj708>:5gb?!54m38m:6s|51:94?4|V=o2708>:5g:?!54m38m;6s|51594?4|V=o3708>:5g;?!54m38m46s|51494?4|V=o<708>:5g4?!54m38m56s|51794?4|V=o=708>:5g5?!54m38mn6s|51694?4|V=o>708>:5g6?!54m38mo6s|51194?4|V=o?708>:5g7?!54m38mh6s|51094?4|V=o8708>:5g0?!54m38mi6s|51394?4|V=o9708>:5g1?!54m38mj6s|51294?4|V=o:708>:5g2?!54m39;<6s|50d94?4|V=ln708>:5df?!54m39;=6s|50g94?4|V=lo708>:5dg?!54m39;>6s|50f94?4|V=lh708>:5d`?!54m39;?6s|50a94?4|V=li708>:5da?!54m39;86s|50`94?4|V=lj708>:5db?!54m39;:6s|50c94?4|V=l2708>:5d:?!54m39;;6s|50;94?4|V=l=708>:5d5?!54m39;46s|50794?4|V=oi708>:5ga?!54m39;56s|51c94?4|V=o;708>:5g3?!54m39;m6s|4gd94?4|V=nm708>:5fe?!54m39;n6s|38`94?4|V:3i708>:2;a?!54m39;o6s|63194?4|V?88708>:700?!54m39;h6s|64f94?4|V?>o708>:76g?!54m39;j6s|64`94?4|V?>h708>:76`?!54m39:<6s|64c94?4|V?>i708>:76a?!54m39:=6s|64;94?4|V?>j708>:76b?!54m39:>6s|64:94?4|V?>2708>:76:?!54m39:?6s|64594?4|V?>3708>:76;?!54m39:86s|67494?4|V??>708>:776?!54m39:96s|67794?4|V???708>:777?!54m39::6s|67694?4|V??8708>:770?!54m39:;6s|67194?4|V??9708>:771?!54m39:46s|67094?4|V??:708>:772?!54m3;jo6s|67394?4|V??;708>:773?!54m3;jh6s|67294?4|V?>m708>:76e?!54m3;ji6s|64d94?4|V?>n708>:76f?!54m3;jj6s|64g94?4|V?><708>:764?!54m3;i<6s|64494?4|V?>=708>:765?!54m3;i=6s|38:94?4|V:2o708>:2:g?!54m3;i>6s|38494?4|V:2h708>:2:`?!54m3;i?6s|38794?4|V:2i708>:2:a?!54m3;i86s|38694?4|V:2j708>:2:b?!54m3;i96s|38194?4|V:22708>:2::?!54m3;i;6s|38094?4|V:23708>:2:;?!54m3;i46s|38394?4|V:2<708>:2:4?!54m3;i56s|38294?4|V:2=708>:2:5?!54m3;im6s|39d94?4|V:2>708>:2:6?!54m3;in6s|39g94?4|V:2?708>:2:7?!54m3;io6s|46f94?4|V:ln708>:2df?!54m3;ih6s|46`94?4|V:lo708>:2dg?!54m3;ii6s|46c94?4|V:lh708>:2d`?!54m3;ij6s|46;94?4|V:li708>:2da?!54m3;h<6s|46:94?4|V:lj708>:2db?!54m3;h>6s|46594?4|V:l2708>:2d:?!54m3;h?6s|46494?4|V:l3708>:2d;?!54m3;h86s|46794?4|V:l<708>:2d4?!54m3;h96s|46194?4|V:l>708>:2d6?!54m3;h:6s|46094?4|V:l?708>:2d7?!54m3;h;6s|46394?4|V:l8708>:2d0?!54m3;h46s|46294?4|V:l9708>:2d1?!54m3;h56s|47d94?4|V:l:708>:2d2?!54m3;hm6s|47g94?4|V:l;708>:2d3?!54m3;hn6s|47f94?4|V:om708>:2ge?!54m3;hh6s|47a94?4|V:on708>:2gf?!54m3;hi6s|47`94?4|V:oo708>:2gg?!54m3;hj6s|47c94?4|V:oh708>:2g`?!54m3;o<6s|47:94?4|V:oj708>:2gb?!54m3;o=6s|47594?4|V:o2708>:2g:?!54m3;o>6s|47494?4|V:o3708>:2g;?!54m3;o?6s|47794?4|V:o<708>:2g4?!54m3;o86s|47694?4|V:o=708>:2g5?!54m3;o96s|47194?4|V:o>708>:2g6?!54m3;o:6s|47094?4|V:o?708>:2g7?!54m3;o46s|47394?4|V:o8708>:2g0?!54m3;o56s|47294?4|V:o9708>:2g1?!54m3;om6s|44d94?4|V:o:708>:2g2?!54m3;on6s|4ef94?4|V=?o708>:57g?!54m3;oo6s|4ea94?4|V=?h708>:57`?!54m3;oh6s|4e`94?4|V=?i708>:57a?!54m3;oi6s|4ec94?4|V=?j708>:57b?!54m3;oj6s|4e;94?4|V=?2708>:57:?!54m3;n<6s|4e:94?4|V=?3708>:57;?!54m3;n=6s|4e594?4|V=?<708>:574?!54m3;n?6s|4e494?4|V=?=708>:575?!54m3;n86s|4e794?4|V=?>708>:576?!54m3;n96s|4e694?4|V=??708>:577?!54m3;n:6s|4e094?4|V=?9708>:571?!54m3;n;6s|4e394?4|V=?:708>:572?!54m3;n46s|4e294?4|V=?;708>:573?!54m3;n56s|4bd94?4|V=>m708>:56e?!54m3;nm6s|4bg94?4|V=>n708>:56f?!54m3;nn6s|4bf94?4|V=>o708>:56g?!54m3;no6s|4ba94?4|V=>h708>:56`?!54m3;ni6s|4b`94?4|V=>i708>:56a?!54m3;nj6s|4bc94?4|V=>j708>:56b?!54m3;m<6s|4b;94?4|V=>2708>:56:?!54m3;m=6s|4b594?4|V=><708>:564?!54m3;m>6s|4b494?4|V=>=708>:565?!54m3;m?6s|4b794?4|V=>>708>:566?!54m3;m86s|4b694?4|V=>?708>:567?!54m3;m96s|4b194?4|V=>8708>:560?!54m3;m:6s|4b094?4|V=>9708>:561?!54m3;m;6s|4b394?4|V=>:708>:562?!54m3;m56s|4b294?4|V=>;708>:563?!54m3;mm6s|4cd94?4|V=9m708>:51e?!54m3;mn6s|4cg94?4|V=9n708>:51f?!54m3;mo6s|4ca94?4|V=9h708>:51`?!54m3;mh6s|4c`94?4|V=9i708>:51a?!54m3;mi6s|4cc94?4|V=9j708>:51b?!54m3;mj6s|4c;94?4|V=92708>:51:?!54m38;<6s|4c:94?4|V=93708>:51;?!54m38;=6s|4c594?4|V=9<708>:514?!54m38;>6s|4c494?4|V=9=708>:515?!54m38;86s|4c794?4|V=9>708>:516?!54m38;96s|4c694?4|V=9?708>:517?!54m38;:6s|4c194?4|V=98708>:510?!54m38;;6s|4c394?4|V=9:708>:512?!54m38;46s|4c294?4|V=9;708>:513?!54m38;56s|4`d94?4|V=8m708>:50e?!54m38;m6s|4`g94?4|V=8n708>:50f?!54m38;n6s|4`f94?4|V=8o708>:50g?!54m38;o6s|4`a94?4|V=8h708>:50`?!54m38;h6s|4``94?4|V=8i708>:50a?!54m38;j6s|4`c94?4|V=8j708>:50b?!54m38:<6s|4`;94?4|V=82708>:50:?!54m38:=6s|4`:94?4|V=83708>:50;?!54m38:>6s|4`494?4|V=8=708>:505?!54m38:?6s|4`794?4|V=8>708>:506?!54m38:86s|4`694?4|V=8?708>:507?!54m38:96s|4`194?4|V=88708>:500?!54m38::6s|4`094?4|V=89708>:501?!54m38:;6s|4`394?4|V=8:708>:502?!54m38:46s|4`294?4|V=8;708>:503?!54m38:n6s|48d94?4|V=;m708>:53e?!54m38:o6s|48g94?4|V=;n708>:53f?!54m38:h6s|48f94?4|V=;o708>:53g?!54m38:i6s|48`94?4|V=;i708>:53a?!54m38:j6s|48c94?4|V=;j708>:53b?!54m389<6s|48;94?4|V=;2708>:53:?!54m389=6s|48:94?4|V=;3708>:53;?!54m389>6s|48594?4|V=;<708>:534?!54m389?6s|48494?4|V=;=708>:535?!54m38986s|48794?4|V=;>708>:536?!54m389:6s|48694?4|V=;?708>:537?!54m389;6s|48194?4|V=;8708>:530?!54m38946s|48094?4|V=;9708>:531?!54m38956s|48294?4|V=;;708>:533?!54m389m6s|49d94?4|V=:m708>:52e?!54m389n6s|49g94?4|V=:n708>:52f?!54m389o6s|49f94?4|V=:o708>:52g?!54m389h6s|49a94?4|V=:h708>:52`?!54m389i6s|49`94?4|V=:i708>:52a?!54m389j6s|49c94?4|V=:j708>:52b?!54m388=6s|49;94?4|V=:2708>:52:?!54m388>6s|49:94?4|V=:3708>:52;?!54m388?6s|49594?4|V=:<708>:524?!54m38886s|49794?4|V=:>708>:526?!54m38896s|49694?4|V=:?708>:527?!54m388:6s|49194?4|V=:8708>:520?!54m388;6s|49094?4|V=:9708>:521?!54m38846s|49394?4|V=::708>:522?!54m38856s|49294?4|V=:;708>:523?!54m388m6s|46d94?4|V:lm708>:2de?!54m388o6s|46g94?4|V:l=708>:2d5?!54m388h6s|46694?4|V:oi708>:2ga?!54m388i6s|47;94?4|V:o;708>:2g3?!54m388j6s|4eg94?4|V=?8708>:570?!54m38?<6s|4e194?4|V=>3708>:56;?!54m38?=6s|4b:94?4|V=9o708>:51g?!54m38?>6s|4cf94?4|V=99708>:511?!54m38??6s|4c094?4|V=8<708>:504?!54m38?86s|4`594?4|V=;h708>:53`?!54m38?96s|48a94?4|V=;:708>:532?!54m38?;6s|48394?4|V=:=708>:525?!54m38?46s|49494?4|V:nm708>:2fe?!54m38?56s|44g94?4|V:nn708>:2ff?!54m38?m6s|5cd94?4|V<>;708>:463?!54m38?n6s|5cf94?4|V<9m708>:41e?!54m38?o6s|5ca94?4|V<9n708>:41f?!54m38?h6s|5c`94?4|V<9o708>:41g?!54m38?i6s|5cc94?4|V<9h708>:41`?!54m38?j6s|5c;94?4|V<9i708>:41a?!54m38><6s|5c:94?4|V<9j708>:41b?!54m38>>6s|5c594?4|V<92708>:41:?!54m38>?6s|5c794?4|V<9<708>:414?!54m38>86s|5c694?4|V<9=708>:415?!54m38>96s|5c194?4|V<9>708>:416?!54m38>:6s|5c094?4|V<9?708>:417?!54m38>;6s|5c394?4|V<98708>:410?!54m38>46s|5c294?4|V<99708>:411?!54m38>56s|5`d94?4|V<9:708>:412?!54m38>m6s|5`g94?4|V<9;708>:413?!54m38>n6s|5`f94?4|V<8m708>:40e?!54m38>h6s|5`a94?4|V<8n708>:40f?!54m38>i6s|5`c94?4|V<8h708>:40`?!54m38>j6s|5`;94?4|V<8i708>:40a?!54m38=<6s|5`:94?4|V<8j708>:40b?!54m38==6s|5`594?4|V<82708>:40:?!54m38=>6s|5`494?4|V<83708>:40;?!54m38=?6s|5`794?4|V<8<708>:404?!54m38=86s|5`694?4|V<8=708>:405?!54m38=96s|5`194?4|V<8>708>:406?!54m38=:6s|5`094?4|V<8?708>:407?!54m38=46s|5`394?4|V<88708>:400?!54m38=56s|60d94?4|V<3m708>:4;e?!54m38=m6s|60g94?4|V<3n708>:4;f?!54m38=n6s|60f94?4|V<3o708>:4;g?!54m38=o6s|60a94?4|V<3h708>:4;`?!54m38=h6s|60`94?4|V<3i708>:4;a?!54m38=i6s|60c94?4|V<3j708>:4;b?!54m38=j6s|60;94?4|V<32708>:4;:?!54m38<<6s|60:94?4|V<33708>:4;;?!54m38<=6s|60594?4|V<3<708>:4;4?!54m38<?6s|60494?4|V<3=708>:4;5?!54m38<86s|60694?4|V<3?708>:4;7?!54m38<96s|60194?4|V<38708>:4;0?!54m38<:6s|60094?4|V<39708>:4;1?!54m38<;6s|60394?4|V<3:708>:4;2?!54m38<46s|60294?4|V<3;708>:4;3?!54m38<56s|61d94?4|V<2m708>:4:e?!54m38<m6s|61g94?4|V<2n708>:4:f?!54m38<n6s|61f94?4|V<2o708>:4:g?!54m38<o6s|61a94?4|V<2h708>:4:`?!54m38<i6s|61`94?4|V<2i708>:4:a?!54m38<j6s|61;94?4|V<22708>:4::?!54m383<6s|61:94?4|V<23708>:4:;?!54m383=6s|61594?4|V<2<708>:4:4?!54m383>6s|61494?4|V<2=708>:4:5?!54m383?6s|61794?4|V<2>708>:4:6?!54m38386s|61694?4|V<2?708>:4:7?!54m38396s|61194?4|V<28708>:4:0?!54m383:6s|61094?4|V<29708>:4:1?!54m383;6s|61394?4|V<2:708>:4:2?!54m38356s|61294?4|V<2;708>:4:3?!54m383m6s|5gg94?4|V<=n708>:45f?!54m383n6s|5gf94?4|V<=o708>:45g?!54m383o6s|5ga94?4|V<=h708>:45`?!54m383h6s|5g`94?4|V<=i708>:45a?!54m383i6s|5gc94?4|V<=j708>:45b?!54m383j6s|5g;94?4|V<=2708>:45:?!54m382<6s|5g:94?4|V<=3708>:45;?!54m382=6s|5g594?4|V<=<708>:454?!54m382>6s|5g494?4|V<==708>:455?!54m38286s|5g794?4|V<=>708>:456?!54m38296s|5g194?4|V<=8708>:450?!54m382:6s|5g094?4|V<=9708>:451?!54m382;6s|5g394?4|V<=:708>:452?!54m38246s|5g294?4|V<=;708>:453?!54m38256s|5dd94?4|V<<m708>:44e?!54m382m6s|5dg94?4|V<<n708>:44f?!54m382n6s|5df94?4|V<<o708>:44g?!54m382o6s|5da94?4|V<<h708>:44`?!54m382h6s|5d`94?4|V<<i708>:44a?!54m382j6s|5dc94?4|V<<j708>:44b?!54m38j<6s|5d:94?4|V<<3708>:44;?!54m38j=6s|5d594?4|V<<<708>:444?!54m38j>6s|5d494?4|V<<=708>:445?!54m38j?6s|5d794?4|V<<>708>:446?!54m38j86s|5d694?4|V<<?708>:447?!54m38j96s|5d194?4|V<<8708>:440?!54m38j:6s|5d094?4|V<<9708>:441?!54m38j;6s|5d394?4|V<<:708>:442?!54m38j46s|5d294?4|V<<;708>:443?!54m38jm6s|5ed94?4|V<?m708>:47e?!54m38jn6s|5ef94?4|V<?o708>:47g?!54m38jo6s|5ea94?4|V<?h708>:47`?!54m38jh6s|5e`94?4|V<?i708>:47a?!54m38ji6s|5ec94?4|V<?j708>:47b?!54m38jj6s|5e;94?4|V<?2708>:47:?!54m38i<6s|5e:94?4|V<?3708>:47;?!54m38i=6s|5e594?4|V<?<708>:474?!54m38i>6s|5e494?4|V<?=708>:475?!54m38i?6s|5e794?4|V<?>708>:476?!54m38i96s|5e694?4|V<??708>:477?!54m38i:6s|5e094?4|V<?9708>:471?!54m38i;6s|5e394?4|V<?:708>:472?!54m38i46s|5e294?4|V<?;708>:473?!54m38i56s|5bd94?4|V<>m708>:46e?!54m38im6s|5bg94?4|V<>n708>:46f?!54m38in6s|5bf94?4|V<>o708>:46g?!54m38io6s|5ba94?4|V<>h708>:46`?!54m38ih6s|5b`94?4|V<>i708>:46a?!54m38ii6s|5bc94?4|V<>j708>:46b?!54m38h<6s|5b;94?4|V<>2708>:46:?!54m38h=6s|5b594?4|V<><708>:464?!54m38h>6s|5b494?4|V<>=708>:465?!54m38h?6s|5b794?4|V<>>708>:466?!54m38h86s|5b694?4|V<>?708>:467?!54m38h96s|5b194?4|V<>8708>:460?!54m38h:6s|5b094?4|V<>9708>:461?!54m38h;6s|5b394?4|V<>:708>:462?!54m38h46s|5b294?4|V<93708>:41;?!54m38h56s|5c494?4|V<8o708>:40g?!54m38hn6s|5``94?4|V<89708>:401?!54m38ho6s|63294?4|V<3>708>:4;6?!54m38hh6s|60794?4|V<2j708>:4:b?!54m38hi6s|61c94?4|V<=m708>:45e?!54m38hj6s|5gd94?4|V<=?708>:457?!54m38o<6s|5g694?4|V<<2708>:44:?!54m38o=6s|5d;94?4|V<?n708>:47f?!54m38o>6s|5eg94?4|V<?8708>:470?!54m38o?6s|5e194?4|V<>3708>:46;?!54m38o86s|5b:94?4|V<8:708>:402?!54m38o:6s|5`294?4|V<8;708>:403?!54m38o;6srn95a>5<5sA98j6sa86a94?4|@:9m7p`77e83>7}O;:l0qc68e;296~N4;o1vb59i:181M54n2we45>50;0xL65a3td34<4?:3yK76`<ug23>7>52zJ07c=zf1286=4={I10b>{i01>1<7<tH21e?xh?0<0;6?uG32d8yk>?>3:1>vF<3g9~j=>02909wE=<f:m<=>=838pD>=i;|l;<<<72;qC?>h4}o:;e?6=:rB8?k5rn9:a>5<5sA98j6sa89a94?4|@:9m7p`78e83>7}O;:l0qc67e;296~N4;o1vb56i:181M54n2we44>50;0xL65a3td35<4?:3yK76`<ug22>7>52zJ07c=zf1386=4={I10b>{i00>1<7<tH21e?xh?1<0;6?uG32d8yk>>>3:1>vF<3g9~j=?02909wE=<f:m<<>=838pD>=i;|l;=<<72;qC?>h4}o::e?6=:rB8?k5rn9;a>5<5sA98j6sa88a94?4|@:9m7p`79e83>7}O;:l0qc66e;296~N4;o1vb57i:181M54n2we4l>50;0xL65a3td3m<4?:3yK76`<ug2j>7>52zJ07c=zf1k86=4={I10b>{i0h>1<7<tH21e?xh?i<0;6?uG32d8yk>f>3:1>vF<3g9~j=g02909wE=<f:m<d>=838pD>=i;|l;e<<72;qC?>h4}o:be?6=:rB8?k5rn9ca>5<5sA98j6sa8`a94?4|@:9m7p`7ae83>7}O;:l0qc6ne;296~N4;o1vb5oi:181M54n2we4o>50;0xL65a3td3n<4?:3yK76`<ug2i>7>52zJ07c=zf1h86=4={I10b>{i0k>1<7<tH21e?xh?j<0;6?uG32d8yk>e>3:1>vF<3g9~j=d02909wE=<f:m<g>=838pD>=i;|l;f<<72;qC?>h4}o:ae?6=:rB8?k5rn9`a>5<5sA98j6sa8ca94?4|@:9m7p`7be83>7}O;:l0qc6me;296~N4;o1vb5li:181M54n2we4n>50;0xL65a3td3o<4?:3yK76`<ug2h>7>52zJ07c=zf1i86=4={I10b>{i0j>1<7<tH21e?xh?k<0;6?uG32d8yk>d>3:1>vF<3g9~j=e02909wE=<f:m<f>=838pD>=i;|l;g<<72;qC?>h4}o:`e?6=:rB8?k5rn9aa>5<5sA98j6sa8ba94?4|@:9m7p`7ce83>7}O;:l0qc6le;296~N4;o1vb5mi:181M54n2we4i>50;0xL65a3td3h<4?:3yK76`<ug2o>7>52zJ07c=zf1n86=4={I10b>{i0m>1<7<tH21e?xh?l<0;6?uG32d8yk>c>3:1>vF<3g9~j=b02909wE=<f:m<a>=838pD>=i;|l;`<<72;qC?>h4}o:ge?6=:rB8?k5rn9fa>5<5sA98j6sa8ea94?4|@:9m7p`7de83>7}O;:l0qc6ke;296~N4;o1vb5ji:181M54n2we4h>50;0xL65a3td3i<4?:3yK76`<ug2n>7>52zJ07c=zf1o86=4={I10b>{i0l>1<7<tH21e?xh?m<0;6?uG32d8yk>b>3:1>vF<3g9~j=c02909wE=<f:m<`>=838pD>=i;|l;a<<72;qC?>h4}o:fe?6=:rB8?k5rn9ga>5<5sA98j6sa8da94?4|@:9m7p`7ee83>7}O;:l0qc6je;296~N4;o1vb5ki:181M54n2we4k>50;0xL65a3td3j<4?:3yK76`<ug2m>7>52zJ07c=zf1l86=4={I10b>{i0o>1<7<tH21e?xh?n<0;6?uG32d8yk>a>3:1>vF<3g9~j=`02909wE=<f:m<c>=838pD>=i;|l;b<<72;qC?>h4}o:ee?6=:rB8?k5rn9da>5<5sA98j6sa8ga94?4|@:9m7p`7fe83>7}O;:l0qc6ie;296~N4;o1vb5hi:181M54n2we5=>50;0xL65a3td2<<4?:3yK76`<ug3;>7>52zJ07c=zf0:86=4={I10b>{i19>1<7<tH21e?xh>8<0;6?uG32d8yk?7>3:1>vF<3g9~j<602909wE=<f:m=5>=838pD>=i;|l:4<<72;qC?>h4}o;3e?6=:rB8?k5rn82a>5<5sA98j6sa91a94?4|@:9m7p`60e83>7}O;:l0qc7?e;296~N4;o1vb4>i:181M54n2we5<>50;0xL65a3td2=<4?:3yK76`<ug3:>7>52zJ07c=zf0;86=4={I10b>{i18>1<7<tH21e?xh>9<0;6?uG32d8yk?6>3:1>vF<3g9~j<702909wE=<f:m=4>=838pD>=i;|l:5<<72;qC?>h4}o;2e?6=:rB8?k5rn83a>5<5sA98j6sa90a94?4|@:9m7p`61e83>7}O;:l0qc7>e;296~N4;o1vb4?i:181M54n2we5?>50;0xL65a3td2><4?:3yK76`<ug39>7>52zJ07c=zf0886=4={I10b>{i1;>1<7<tH21e?xh>:<0;6?uG32d8yk?5>3:1>vF<3g9~j<402909wE=<f:m=7>=838pD>=i;|l:6<<72;qC?>h4}o;1e?6=:rB8?k5rn80a>5<5sA98j6sa93a94?4|@:9m7p`62e83>7}O;:l0qc7=e;296~N4;o1vb4<i:181M54n2we5>>50;0xL65a3td2?<4?:3yK76`<ug38>7>52zJ07c=zf0986=4={I10b>{i1:>1<7<tH21e?xh>;<0;6?uG32d8yk?4>3:1>vF<3g9~j<502909wE=<f:m=6>=838pD>=i;|l:7<<72;qC?>h4}o;0e?6=:rB8?k5rn81a>5<5sA98j6sa92a94?4|@:9m7p`63e83>7}O;:l0qc7<e;296~N4;o1vb4=i:181M54n2we59>50;0xL65a3td28<4?:3yK76`<ug3?>7>52zJ07c=zf0>86=4={I10b>{i1=>1<7<tH21e?xh><<0;6?uG32d8yk?3>3:1>vF<3g9~j<202909wE=<f:m=1>=838pD>=i;|l:0<<72;qC?>h4}o;7e?6=:rB8?k5rn86a>5<5sA98j6sa95a94?4|@:9m7p`64e83>7}O;:l0qc7;e;296~N4;o1vb4:i:181M54n2we58>50;0xL65a3td29<4?:3yK76`<ug3>>7>52zJ07c=zf0?86=4={I10b>{i1<>1<7<tH21e?xh>=<0;6?uG32d8yk?2>3:1>vF<3g9~j<302909wE=<f:m=0>=838pD>=i;|l:1<<72;qC?>h4}o;6e?6=:rB8?k5rn87a>5<5sA98j6sa94a94?4|@:9m7p`65e83>7}O;:l0qc7:e;296~N4;o1vb4;i:181M54n2we5;>50;0xL65a3td2:<4?:3yK76`<ug3=>7>52zJ07c=zf0<86=4={I10b>{i1?>1<7<tH21e?xh>><0;6?uG32d8yk?1>3:1>vF<3g9~j<002909wE=<f:m=3>=838pD>=i;|l:2<<72;qC?>h4}o;5e?6=:rB8?k5rn84a>5<5sA98j6sa97a94?4|@:9m7p`66e83>7}O;:l0qc79e;296~N4;o1vb48i:181M54n2we5:>50;0xL65a3td2;<4?:3yK76`<ug3<>7>52zJ07c=zf0=86=4={I10b>{i1>>1<7<tH21e?xh>?<0;6?uG32d8yk?0>3:1>vF<3g9~j<102909wE=<f:m=2>=838pD>=i;|l:3<<72;qC?>h4}o;4e?6=:rB8?k5rn85a>5<5sA98j6sa96a94?4|@:9m7p`67e83>7}O;:l0qc78e;296~N4;o1vb49i:181M54n2we55>50;0xL65a3td24<4?:3yK76`<ug33>7>52zJ07c=zf0286=4={I10b>{i11>1<7<tH21e?xh>0<0;6?uG32d8yk??>3:1>vF<3g9~j<>02909wE=<f:m==>=838pD>=i;|l:<<<72;qC?>h4}o;;e?6=:rB8?k5rn8:a>5<5sA98j6sa99a94?4|@:9m7p`68e83>7}O;:l0qc77e;296~N4;o1vb46i:181M54n2we54>50;0xL65a3td25<4?:3yK76`<ug32>7>52zJ07c=zf0386=4={I10b>{i10>1<7<tH21e?xh>1<0;6?uG32d8yk?>>3:1>vF<3g9~j<?02909wE=<f:m=<>=838pD>=i;|l:=<<72;qC?>h4}o;:e?6=:rB8?k5rn8;a>5<5sA98j6sa98a94?4|@:9m7p`69e83>7}O;:l0qc76e;296~N4;o1vb47i:181M54n2we5l>50;0xL65a3td2m<4?:3yK76`<ug3j>7>52zJ07c=zf0k86=4={I10b>{i1h>1<7<tH21e?xh>i<0;6?uG32d8yk?f>3:1>vF<3g9~j<g02909wE=<f:m=d>=838pD>=i;|l:e<<72;qC?>h4}o;be?6=:rB8?k5rn8ca>5<5sA98j6sa9`a94?4|@:9m7p`6ae83>7}O;:l0qc7ne;296~N4;o1vb4oi:181M54n2we5o>50;0xL65a3td2n<4?:3yK76`<ug3i>7>52zJ07c=zf0h86=4={I10b>{i1k>1<7<tH21e?xh>j<0;6?uG32d8yk?e>3:1>vF<3g9~j<d02909wE=<f:m=g>=838pD>=i;|l:f<<72;qC?>h4}o;ae?6=:rB8?k5rn8`a>5<5sA98j6sa9ca94?4|@:9m7p`6be83>7}O;:l0qc7me;296~N4;o1vb4li:181M54n2we5n>50;0xL65a3td2o<4?:3yK76`<ug3h>7>52zJ07c=zf0i86=4={I10b>{i1j>1<7<tH21e?xh>k<0;6?uG32d8yk?d>3:1>vF<3g9~j<e02909wE=<f:m=f>=838pD>=i;|l:g<<72;qC?>h4}o;`e?6=:rB8?k5rn8aa>5<5sA98j6sa9ba94?4|@:9m7p`6ce83>7}O;:l0qc7le;296~N4;o1vb4mi:181M54n2we5i>50;0xL65a3td2h<4?:3yK76`<ug3o>7>52zJ07c=zf0n86=4={I10b>{i1m>1<7<tH21e?xh>l<0;6?uG32d8yk?c>3:1>vF<3g9~j<b02909wE=<f:m=a>=838pD>=i;|l:`<<72;qC?>h4}o;ge?6=:rB8?k5rn8fa>5<5sA98j6sa9ea94?4|@:9m7p`6de83>7}O;:l0qc7ke;296~N4;o1vb4ji:181M54n2we5h>50;0xL65a3td2i<4?:3yK76`<ug3n>7>52zJ07c=zf0o86=4={I10b>{i1l>1<7<tH21e?xh>m<0;6?uG32d8yk?b>3:1>vF<3g9~j<c02909wE=<f:m=`>=838pD>=i;|l44f<728qC?>h4}|~DEE|j<21j9kj51f6yEFEs9wKL]ur@A
/orpsocv2/boards/xilinx/ml501/sim/bin/Makefile
144,15 → 144,15
 
# BootROM code, which generates a verilog array select values
BOOTROM_FILE=bootrom.v
BOOTROM_SW_DIR=$(BOARD_SW_DIR)/bootrom
BOOTROM_SRC=$(shell ls $(BOOTROM_SW_DIR)/* | grep -v $(BOOTROM_FILE))
BOOTROM_VERILOG=$(BOOTROM_SW_DIR)/$(BOOTROM_FILE)
BOARD_BOOTROM_SW_DIR=$(BOARD_SW_DIR)/bootrom
BOOTROM_SRC=$(shell ls $(BOARD_BOOTROM_SW_DIR)/* | grep -v $(BOOTROM_FILE))
BOOTROM_VERILOG=$(BOARD_BOOTROM_SW_DIR)/$(BOOTROM_FILE)
 
bootrom: $(BOOTROM_VERILOG)
 
$(BOOTROM_VERILOG): $(BOOTROM_SRC)
$(Q)echo; echo "\t### Generating bootup ROM ###"; echo
$(Q)$(MAKE) -C $(BOOTROM_SW_DIR) $(BOOTROM_FILE)
$(Q)$(MAKE) -C $(BOARD_BOOTROM_SW_DIR) $(BOOTROM_FILE)
 
# Suffix of file to check after each test for the string
TEST_OUT_FILE_SUFFIX=-general.log
161,6 → 161,7
# Dynamically generated verilog file defining configuration for various things
# Rule actually generating this is found in definesgen.inc file.
TEST_DEFINES_VLG=test-defines.v
.PHONY: $(TEST_DEFINES_VLG)
# Set V=1 when calling make to enable verbose output
# mainly for debugging purposes.
ifeq ($(V), 1)
355,7 → 356,7
# DUT compile script
modelsim_dut.scr: rtl $(RTL_VERILOG_SRC) $(RTL_VERILOG_INCLUDES) $(BOOTROM_VERILOG)
$(Q)echo "+incdir+"$(BOARD_RTL_VERILOG_INCLUDE_DIR) > $@;
$(Q)echo "+incdir+"$(BOOTROM_SW_DIR) >> $@;
$(Q)echo "+incdir+"$(BOARD_BOOTROM_SW_DIR) >> $@;
$(Q)echo "+incdir+"$(BOARD_BENCH_VERILOG_INCLUDE_DIR) >> $@;
$(Q)echo "+libext+.v" >> $@;
$(Q)for module in $(BOARD_RTL_VERILOG_MODULES); do if [ -d $(BOARD_RTL_VERILOG_DIR)/$$module ]; then echo "-y " $(BOARD_RTL_VERILOG_DIR)/$$module >> $@; fi; done
473,6 → 474,9
SIM_SW_IMAGE ?=flash.in
endif
 
# Amount to pad the image we'll load into the SPI flash
HEX_IMAGE_PADDING ?=0x1c0000
 
.PHONY : sw
sw: $(SIM_SW_IMAGE)
 
488,7 → 492,8
.PHONY: $(SW_TEST_DIR)/$(TEST).flashin
$(SW_TEST_DIR)/$(TEST).flashin:
$(Q) echo; echo "\t### Compiling software ###"; echo;
$(Q)$(MAKE) -C $(SW_TEST_DIR) $(TEST).flashin
$(Q)$(MAKE) -C $(SW_TEST_DIR) $(TEST).flashin \
HEX_IMAGE_PADDING=$(HEX_IMAGE_PADDING)
 
.PHONY: $(SW_TEST_DIR)/$(TEST).vmem
$(SW_TEST_DIR)/$(TEST).vmem:
514,7 → 519,7
# No VPI support for now. $(Q) if [ -e $(VPI_SRC_C_DIR) ]; then $(MAKE) -C $(VPI_SRC_C_DIR) clean; fi
 
clean-bootrom:
$(MAKE) -C $(BOOTROM_SW_DIR) clean
$(MAKE) -C $(BOARD_BOOTROM_SW_DIR) clean
 
clean-out:
$(Q)rm -rf $(RTL_SIM_RESULTS_DIR)/*.*
/orpsocv2/boards/xilinx/ml501/sw/board/include/board.h
16,11 → 16,18
// file, which is compiled and converted into Verilog for inclusion at
// synthesis time. See bootloader/bootloader.S for details on each option.
 
//#define BOOTROM_SPI_FLASH
#define BOOTROM_GOTO_RESET
#define BOOTROM_SPI_FLASH
//#define BOOTROM_GOTO_RESET
//#define BOOTROM_LOOP_AT_ZERO
//#define BOOTROM_LOOP_IN_ROM
 
// Address bootloader should start from in FLASH
#define BOOTROM_ADDR_BYTE2 0x1c
#define BOOTROM_ADDR_BYTE1 0x00
#define BOOTROM_ADDR_BYTE0 0x00
// Causes SPI bootloader to loop if SPI didn't give correct size of image
#define SPI_RETRY_IF_INSANE_SIZEWORD
 
//
// Defines for each core (memory map base, OR1200 interrupt line number, etc.)
//
/orpsocv2/boards/xilinx/ml501/syn/ml501_ddr2_wb_if_cache.ngc File deleted \ No newline at end of file
/orpsocv2/boards/xilinx/ml501/syn/Makefile File deleted \ No newline at end of file
/orpsocv2/boards/xilinx/ml501/syn/xst/run/Makefile
0,0 → 1,2
include ../bin/Makefile
 
/orpsocv2/boards/xilinx/ml501/syn/xst/bin/Makefile
0,0 → 1,301
######################################################################
#### ####
#### ORPSoC Xilinx Synthesis Makefile ####
#### ####
#### Author(s): ####
#### - Julius Baxter, julius@opencores.org ####
#### ####
#### ####
######################################################################
#### ####
#### Copyright (C) 2009,2010 Authors and OPENCORES.ORG ####
#### ####
#### This source file may be used and distributed without ####
#### restriction provided that this copyright statement is not ####
#### removed from the file and that any derivative work contains ####
#### the original copyright notice and the associated disclaimer. ####
#### ####
#### This source file is free software; you can redistribute it ####
#### and/or modify it under the terms of the GNU Lesser General ####
#### Public License as published by the Free Software Foundation; ####
#### either version 2.1 of the License, or (at your option) any ####
#### later version. ####
#### ####
#### This source is distributed in the hope that it will be ####
#### useful, but WITHOUT ANY WARRANTY; without even the implied ####
#### warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ####
#### PURPOSE. See the GNU Lesser General Public License for more ####
#### details. ####
#### ####
#### You should have received a copy of the GNU Lesser General ####
#### Public License along with this source; if not, download it ####
#### from http://www.opencores.org/lgpl.shtml ####
#### ####
######################################################################
 
# Name of the directory we're currently in
CUR_DIR=$(shell pwd)
 
# The root path of the board build
BOARD_DIR ?=$(CUR_DIR)/../../..
PROJECT_ROOT=$(BOARD_DIR)/../../..
 
DESIGN_NAME=orpsoc
 
SYN_DIR=$(BOARD_DIR)/syn/xst
SYN_RUN_DIR=$(SYN_DIR)/run
 
# Paths to other important parts of this test suite
COMMON_RTL_DIR = $(PROJECT_ROOT)/rtl
COMMON_RTL_VERILOG_DIR = $(COMMON_RTL_DIR)/verilog
#COMMON_RTL_VHDL_DIR = $(COMMON_RTL_DIR)/vhdl
 
BOARD_RTL_DIR=$(BOARD_DIR)/rtl
BOARD_RTL_VERILOG_DIR=$(BOARD_RTL_DIR)/verilog
# Only 1 include path for board builds - their own!
BOARD_RTL_VERILOG_INCLUDE_DIR=$(BOARD_RTL_VERILOG_DIR)/include
BOARD_DESIGN_VERILOG_DEFINES=$(BOARD_RTL_VERILOG_INCLUDE_DIR)/$(DESIGN_NAME)-defines.v
#BOARD_RTL_VHDL_DIR = $(BOARD_RTL_DIR)/vhdl
 
BACKEND_DIR=$(BOARD_DIR)/backend
BACKEND_BIN_DIR=$(BACKEND_DIR)/bin
 
# Set V=1 when calling make to enable verbose output
# mainly for debugging purposes.
ifeq ($(V), 1)
Q=
else
Q ?=@
endif
 
 
DEFINES_FILE_CUTOFF=$(shell grep -n "end of included module defines" $(BOARD_DESIGN_VERILOG_DEFINES) | cut -d ':' -f 1)
DESIGN_DEFINES=$(shell cat $(BOARD_DESIGN_VERILOG_DEFINES) | sed s://.*::g | sed s:\`:\#:g | sed 's:^[ ]*::' | awk '{print};/^\#define/{printf "_%s=%s\n",$$2,$$2}' | grep -v PERIOD | cpp -P | sed s:^_::g | sed s:=$$::g )
# Rule to look at what defines are being extracted from main file
print-defines:
@echo; echo "\t### Design defines ###"; echo
@echo "\tParsing "$(BOARD_DESIGN_VERILOG_DEFINES)" and exporting:"
@echo $(DESIGN_DEFINES)
 
 
# Backend tool path
# Check that the XILINX_PATH variable is set
ifeq ($(XILINX_PATH),)
$(error XILINX_PATH environment variable not set. Set it and rerun)
endif
XILINX_SETTINGS_SCRIPT=$(XILINX_PATH)/settings32.sh
XILINX_SETTINGS_SCRIPT_EXISTS=$(shell if [ -e $(XILINX_SETTINGS_SCRIPT) ]; then echo 1; else echo 0; fi)
ifeq ($(XILINX_SETTINGS_SCRIPT_EXISTS),0)
$(error XILINX_PATH variable not set correctly. Cannot find $$XILINX_PATH/settings32.sh)
endif
 
#
# Verilog DUT source variables
#
# First we get a list of modules in the RTL path of the board's path.
# Next we check which modules not in the board's RTL path are in the root RTL
# path (modules which can be commonly instantiated, but over which board
# build-specific versions take precedence.)
 
# Paths under board/***/rtl/verilog we wish to exclude when getting modules
BOARD_VERILOG_MODULES_EXCLUDE= include
BOARD_VERILOG_MODULES_DIR_LIST=$(shell ls $(BOARD_RTL_VERILOG_DIR))
# Apply exclude to list of modules
BOARD_RTL_VERILOG_MODULES=$(filter-out $(BOARD_VERILOG_MODULES_EXCLUDE),$(BOARD_VERILOG_MODULES_DIR_LIST))
 
# Rule for debugging this script
print-board-modules:
$(Q)echo echo; echo "\t### Board verilog modules ###"; echo;
$(Q)echo $(BOARD_RTL_VERILOG_MODULES)
 
# Now get list of modules that we don't have a version of in the board path
# List others that cause clahes (ie. source listed, due to utterly pathetic XST
# not supporting ability to specify search paths, and requiring includes but
# not used in this board build, hence its includes are not there and result
# in error.)
COMMON_VERILOG_MODULES_EXCLUDE= include usbhostslave
COMMON_VERILOG_MODULES_EXCLUDE += $(BOARD_RTL_VERILOG_MODULES)
 
COMMON_RTL_VERILOG_MODULES_DIR_LIST=$(shell ls $(COMMON_RTL_VERILOG_DIR))
COMMON_RTL_VERILOG_MODULES=$(filter-out $(COMMON_VERILOG_MODULES_EXCLUDE), $(COMMON_RTL_VERILOG_MODULES_DIR_LIST))
 
# Rule for debugging this script
print-common-modules-exclude:
$(Q)echo echo; echo "\t### Common verilog modules being excluded due to board versions ###"; echo;
$(Q)echo "$(COMMON_VERILOG_MODULES_EXCLUDE)"
 
print-common-modules:
$(Q)echo echo; echo "\t### Verilog modules from common RTL dir ###"; echo
$(Q)echo $(COMMON_RTL_VERILOG_MODULES)
 
# List of verilog source files (only .v files!)
# Board RTL modules first
VERILOG_SRC_PATHS=$(addprefix $(BOARD_RTL_VERILOG_DIR)/,$(BOARD_RTL_VERILOG_MODULES))
VERILOG_SRC_PATHS +=$(addprefix $(COMMON_RTL_VERILOG_DIR)/,$(COMMON_RTL_VERILOG_MODULES))
RTL_VERILOG_SRC=$(shell for modulepath in $(VERILOG_SRC_PATHS); do \
if [ -d $$modulepath ]; then \
ls $$modulepath/*.v; \
fi; done)
 
# List of verilog includes from board RTL path - only for rule sensitivity
RTL_VERILOG_INCLUDES=$(shell ls $(BOARD_RTL_VERILOG_INCLUDE_DIR)/*.*)
 
#
# VHDL DUT source variables
#
# VHDL modules
#RTL_VHDL_MODULES=$(shell ls $(RTL_VHDL_DIR))
# VHDL sources
#RTL_VHDL_SRC=$(shell for module in $(RTL_VHDL_MODULES); do if [ -d $(RTL_VHDL_DIR)/$$module ]; then ls $(RTL_VHDL_DIR)/$$module/*.vhd; fi; done)
 
 
#
# Dynamically created files included by different parts of the defines
#
 
BOARD_SW_DIR=$(BOARD_DIR)/sw
 
# BootROM code, which generates a verilog array select values
BOOTROM_FILE=bootrom.v
BOARD_BOOTROM_SW_DIR=$(BOARD_SW_DIR)/bootrom
BOOTROM_VERILOG=$(BOARD_BOOTROM_SW_DIR)/$(BOOTROM_FILE)
# Export BOARD_PATH for the software makefiles
BOARD_PATH=$(BOARD_DIR)
export BOARD_PATH
bootrom: $(BOOTROM_VERILOG)
$(BOOTROM_VERILOG):
$(MAKE) -C $(BOARD_BOOTROM_SW_DIR) $(BOOTROM_FILE)
 
TIMESCALE_FILE=timescale.v
SYNDIR_TIMESCALE_FILE=$(SYN_RUN_DIR)/$(TIMESCALE_FILE)
$(SYNDIR_TIMESCALE_FILE):
$(Q)echo "" > $@
 
SYN_VERILOG_DEFINES=synthesis-defines.v
SYNDIR_SYN_VERILOG_DEFINES=$(SYN_RUN_DIR)/$(SYN_VERILOG_DEFINES)
$(SYNDIR_SYN_VERILOG_DEFINES):
$(Q)echo "\`define SYNTHESIS" > $@
$(Q)echo "\`define XILINX" >> $@
$(Q)echo "" >> $@
 
GENERATED_DEFINES = $(BOOTROM_VERILOG)
GENERATED_DEFINES += $(SYNDIR_TIMESCALE_FILE)
GENERATED_DEFINES += $(SYNDIR_SYN_VERILOG_DEFINES)
 
 
FPGA_PART ?=xc5vlx50-ff676-1
OPT_MODE ?=Speed
OPT_LEVEL ?=2
 
 
XILINX_FLAGS ?=-intstyle silent
XILINX_XST_FLAGS ?= -power NO -glob_opt AllClockNets -write_timing_constraints NO -cross_clock_analysis NO -slice_utilization_ratio 100 -bram_utilization_ratio 100 -dsp_utilization_ratio 100 -safe_implementation No -fsm_style lut -ram_extract Yes -ram_style Auto -rom_extract Yes -rom_style Auto -auto_bram_packing NO -mux_extract YES -mux_style Auto -decoder_extract YES -priority_extract YES -shreg_extract YES -shift_extract YES -xor_collapse YES -resource_sharing YES -async_to_sync NO -use_dsp48 auto -iobuf YES -max_fanout 100000 -bufg 32 -register_duplication YES -equivalent_register_removal YES -register_balancing No -slice_packing YES -optimize_primitives NO -use_clock_enable Auto -use_sync_set Auto -use_sync_reset Auto -iob Auto -slice_utilization_ratio_maxmargin 5
 
XCF_FILE=$(DESIGN_NAME).xcf
XST_FILE=$(DESIGN_NAME).xst
PRJ_FILE=$(DESIGN_NAME).prj
NGC_FILE=$(DESIGN_NAME).ngc
NETLIST_FILE=$(DESIGN_NAME).v
 
XST_PRJ_FILE_SRC_DECLARE=verilog work
 
print-config:
$(Q)echo; echo "\t### Synthesis make configuration ###"; echo
$(Q)echo "\tFPGA_PART="$(FPGA_PART)
$(Q)echo "\tOPT_MODE="$(OPT_MODE)
$(Q)echo "\tOTP_LEVEL="$(OPT_LEVEL)
$(Q)echo "\tXILINX_XST_FLAGS="$(XILINX_XST_FLAGS)
$(Q)echo
 
all: $(NGC_FILE)
 
# Generate the .xst file
# See this page for information on options:
# http://www.xilinx.com/itp/xilinx4/data/docs/xst/command_line5.html
$(XST_FILE):
$(Q)echo; echo "\t#### Generating XST file ####"; echo
$(Q)echo "# XST Script for ORPSoC Synthesis" > $@
$(Q)echo "# This file is autogenerated - any changes will be overwritten" >> $@
$(Q)echo "# See the Makefile in syn/xst/bin to make changes" >> $@
$(Q)echo "run" >> $@
$(Q)echo "-ifn "$(PRJ_FILE) >> $@
$(Q)echo "-ifmt mixed" >> $@
$(Q)echo "-top "$(DESIGN_NAME)"_top" >> $@
$(Q)echo "-ofmt NGC" >> $@
$(Q)echo "-ofn "$(NGC_FILE) >> $@
$(Q)echo "-p "$(FPGA_PART) >> $@
$(Q)echo "-opt_level "$(OPT_LEVEL) >> $@
$(Q)echo "-opt_mode "$(OPT_MODE) >> $@
$(Q)echo "-uc "$(XCF_FILE) >> $@
# $(Q)echo "elaborate " >> $@
# $(Q)echo -n "-vlgpath \"" >> $@
# option missing from XST - wtf?! $(Q)for vlogpath in $(VERILOG_SRC_PATHS); do \
echo -n $$vlogpath" "; done >> $@
# $(Q)echo "\"" >> $@
$(Q)echo "-vlgincdir { "$(BOARD_RTL_VERILOG_INCLUDE_DIR)" "$(BOARD_BOOTROM_SW_DIR) " }" >> $@
$(Q)echo >> $@
 
# Generate Xilinx project (.prj) file
$(PRJ_FILE): $(RTL_VERILOG_SRC)
$(Q)echo; echo "\t#### Generating Xilinx PRJ file ####";
# $(Q)echo "# Autogenerated XST .prj file" > $@
# $(Q)echo "# Any changes will be written over." >> $@
$(Q)for file in $(RTL_VERILOG_SRC); do \
echo $(XST_PRJ_FILE_SRC_DECLARE) $$file >> $@ ; \
done
$(Q)echo >> $@
$(Q)echo
 
# Constraints file
$(XCF_FILE):
$(Q)echo; echo "\t#### Generating Xilinx PRJ file ####"; echo
$(Q)echo "# Autogenerated XST .prj file" > $@
$(Q)echo "#" >> $@
$(Q)echo "# Not much here, XST is smart enough to determine clocks through DCMs" >> $@
$(Q)echo "#" >> $@
$(Q)echo "# TODO: Potentially use the other XTAL for DDR RAM clocking" >> $@
$(Q)echo "#" >> $@
$(Q)echo "# 200MHz diff. XTAL used as main system clock" >> $@
$(Q)echo "NET \"sys_clk_in_p\" TNM_NET = \"sys_clk_in_p_grp\";" >> $@
$(Q)echo "NET \"sys_clk_in_n\" TNM_NET = \"sys_clk_in_n_grp\";" >> $@
$(Q)echo "TIMESPEC \"TS_sys_clk_in_p_grp\" = PERIOD \"sys_clk_in_p_grp\" 5 ns HIGH 50 %;" >> $@
$(Q)echo "TIMESPEC \"TS_sys_clk_in_n_grp\" = PERIOD \"sys_clk_in_n_grp\" 5 ns LOW 50 %;" >> $@
$(Q)echo "# 100 MHz user clock" >> $@
$(Q)echo "#NET \"sys_clk_in\" TNM_NET = \"sys_clk_in_grp\";" >> $@
$(Q)echo "#TIMESPEC \"TS_sys_clk_in\" = PERIOD \"sys_clk_in_grp\" 10 ns HIGH 50%;" >> $@
$(Q)echo "# Ignore the reset logic" >> $@
$(Q)echo "NET rst_n_pad_i* TIG;" >> $@
$(Q)echo "# SSRAM multicylce constraints:" >> $@
$(Q)echo "# Define the two clock domains as timespecs" >> $@
$(Q)echo "#NET dcm0_clkdv TNM_NET=\"wb_clk\";" >> $@
$(Q)echo "#TIMESPEC \"TS_wb_clk\" = PERIOD \"wb_clk\" 20 ns HIGH 10;" >> $@
$(Q)echo "#NET dcm0_clk0 TNM_NET = \"ssram_clk200\";" >> $@
$(Q)echo "#TIMESPEC \"TS_ssram_clk200\" = PERIOD \"ssram_clk200\" \"TS_wb_clk\" / 4;" >> $@
$(Q)echo "# Now define their relationship - logic should be configured so that there's" >> $@
$(Q)echo "# 1 WB cycle at all times before anything is sampled across domains" >> $@
$(Q)echo "#TIMESPEC \"TS_wb_clk_ssram_clk200\" = from \"wb_clk\" TO \"ssram_clk200\" 15 ns;" >> $@
$(Q)echo "#TIMESPEC \"TS_ssram_clk200_wb_clk\" = from \"ssram_clk200\" TO \"wb_clk\" 20 ns;" >> $@
 
# XST command
$(NGC_FILE): $(PRJ_FILE) $(XST_FILE) $(XCF_FILE) $(GENERATED_DEFINES)
$(Q)echo; echo "\t#### Running XST ####"; echo;
$(Q)(. $(XILINX_SETTINGS_SCRIPT) ; xst -ifn $(XST_FILE) $(XILINX_FLAGS) $(XST_FLAGS) )
$(Q)echo
 
# Netlist generation command
$(NETLIST_FILE): $(NGC_FILE)
$(Q)echo; echo "\t#### Generating verilog netlist ####"; echo;
$(Q)(. $(XILINX_SETTINGS_SCRIPT) ; \
netgen -sim -aka -dir . -ofmt verilog $< -w $@ )
 
 
clean:
$(Q)rm -rf *.* xst
 
clean-sw:
$(MAKE) -C $(PROJECT_ROOT)/sw/lib clean-all
 
clean-all: clean-sw clean
 
 
.PRECIOUS : $(NGC_FILE) $(XST_FILE) $(XCF_FILE)
/orpsocv2/boards/README
1,15 → 1,8
ORPSoCv2 board builds
ORPSoC board builds
 
This directory contains scripts and support RTL for synthesizing ORPSoC to run on various vendors' FPGAs and boards.
This directory contains a path for each technology vendor the board builds
target.
 
The directory hierarchy should first be organised by target FPGA vendor, and then by board model. Various configurations for each board may exist, and it's up to the maintainer of the board support to decide how that is handled (either several different make targets, or user modifiable scripts/constraints.)
Under each of those vendor paths are the specific board paths.
 
The boards/tools.inc file:
 
This file contains various paths to vendor-specific FPGA development tools. It can be included in any Makefile used to synthesize the design, and is designed to provide a single place where users can set their own paths to tools, rather than having several hard-set paths throughout the scripts.
 
Add path variables to this file if it's likely a user will need to supply their own due to differing installation locations of tools.
 
Board build documentation
 
Please include a readme in each board's path, containing a rundown on the different configurations possible and the commands necessary to start synthesis.
See the main documentation in ORPSoC's root path doc/ for more information.

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.