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

Subversion Repositories hpdmc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 20 to Rev 21
    Reverse comparison

Rev 20 → Rev 21

/hpdmc/trunk/hpdmc.tar Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
hpdmc/trunk/hpdmc.tar Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: hpdmc/trunk/hpdmc_ddr32/test/common.mak =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/common.mak (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/common.mak (revision 21) @@ -0,0 +1,14 @@ +SOURCES_MODEL=tb_model.v ddr.v + +all: hpdmc + +model: $(SOURCES_MODEL) + cver $(SOURCES_MODEL) + +hpdmc: $(SOURCES) + cver $(SOURCES_HPDMC) + +clean: + rm -f verilog.log hpdmc.vcd + +.PHONY: clean model hpdmc Index: hpdmc/trunk/hpdmc_ddr32/test/obuft.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/obuft.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/obuft.v (revision 21) @@ -0,0 +1,38 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 1995/2004 Xilinx, Inc. +// All Right Reserved. +/////////////////////////////////////////////////////////////////////////////// +// Modified for HPDMC simulation, based on Xilinx 05/23/07 revision +/////////////////////////////////////////////////////////////////////////////// + +`timescale 1 ps / 1 ps + + +module OBUFT (O, I, T); + + parameter CAPACITANCE = "DONT_CARE"; + parameter integer DRIVE = 12; + parameter IOSTANDARD = "DEFAULT"; + parameter SLEW = "SLOW"; + + output O; + input I, T; + + bufif0 T1 (O, I, T); + + initial begin + + case (CAPACITANCE) + + "LOW", "NORMAL", "DONT_CARE" : ; + default : begin + $display("Attribute Syntax Error : The attribute CAPACITANCE on OBUFT instance %m is set to %s. Legal values for this attribute are DONT_CARE, LOW or NORMAL.", CAPACITANCE); + $finish; + end + + endcase + + end + +endmodule + Index: hpdmc/trunk/hpdmc_ddr32/test/tb_hpdmc.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/tb_hpdmc.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/tb_hpdmc.v (revision 21) @@ -0,0 +1,390 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +`timescale 1ns / 1ps + +//`define ENABLE_VCD +`define TEST_SOMETRANSFERS +//`define TEST_RANDOMTRANSFERS + +module tb_hpdmc(); + +/* 100MHz system clock */ +reg clk; +initial clk = 1'b0; +always #5 clk = ~clk; + +/* DQS clock is phased out by 90 degrees, resulting in 2.5ns delay */ +reg dqs_clk; +always @(clk) #2.5 dqs_clk = clk; + +wire sdram_cke; +wire sdram_cs_n; +wire sdram_we_n; +wire sdram_cas_n; +wire sdram_ras_n; +wire [3:0] sdram_dm; +wire [12:0] sdram_adr; +wire [1:0] sdram_ba; +wire [31:0] sdram_dq; +wire [3:0] sdram_dqs; + +ddr sdram1( + .Addr(sdram_adr), + .Ba(sdram_ba), + .Clk(clk), + .Clk_n(~clk), + .Cke(sdram_cke), + .Cs_n(sdram_cs_n), + .Ras_n(sdram_ras_n), + .Cas_n(sdram_cas_n), + .We_n(sdram_we_n), + + .Dm(sdram_dm[3:2]), + .Dqs(sdram_dqs[3:2]), + .Dq(sdram_dq[31:16]) +); + +ddr sdram0( + .Addr(sdram_adr), + .Ba(sdram_ba), + .Clk(clk), + .Clk_n(~clk), + .Cke(sdram_cke), + .Cs_n(sdram_cs_n), + .Ras_n(sdram_ras_n), + .Cas_n(sdram_cas_n), + .We_n(sdram_we_n), + + .Dm(sdram_dm[1:0]), + .Dqs(sdram_dqs[1:0]), + .Dq(sdram_dq[15:0]) +); + +reg rst; + +reg [13:0] csr_a; +reg csr_we; +reg [31:0] csr_di; +wire [31:0] csr_do; + +reg [25:0] fml_adr; +reg fml_stb; +reg fml_we; +wire fml_ack; +reg [7:0] fml_sel; +reg [63:0] fml_di; +wire [63:0] fml_do; + +hpdmc dut( + .sys_clk(clk), + .sys_clk_n(~clk), + .dqs_clk(dqs_clk), + .dqs_clk_n(~dqs_clk), + .sys_rst(rst), + + .csr_a(csr_a), + .csr_we(csr_we), + .csr_di(csr_di), + .csr_do(csr_do), + + .fml_adr(fml_adr), + .fml_stb(fml_stb), + .fml_we(fml_we), + .fml_ack(fml_ack), + .fml_sel(fml_sel), + .fml_di(fml_di), + .fml_do(fml_do), + + .sdram_cke(sdram_cke), + .sdram_cs_n(sdram_cs_n), + .sdram_we_n(sdram_we_n), + .sdram_cas_n(sdram_cas_n), + .sdram_ras_n(sdram_ras_n), + .sdram_dm(sdram_dm), + .sdram_adr(sdram_adr), + .sdram_ba(sdram_ba), + .sdram_dq(sdram_dq), + .sdram_dqs(sdram_dqs), + + .dqs_psen(), + .dqs_psincdec(), + .dqs_psdone(1'b1) +); + +task waitclock; +begin + @(posedge clk); + #1; +end +endtask + +task waitnclock; +input [15:0] n; +integer i; +begin + for(i=0;i 32'h80000000) begin + writeburst(addr); + //writeburst(addr+32'h20); + //writeburst(addr+32'h40); + end else begin + readburst(addr); + //readburst(addr+32'h20); + //readburst(addr+32'h40); + end + end + + $display(""); + $display("======================================================="); + $display(" Tested: %.0f reads, %.0f writes ", reads, writes); + $display("======================================================="); + $display(" Average read latency: %f cycles", read_clocks/reads); + $display(" Average write latency: %f cycles", write_clocks/writes); + $display("======================================================="); + $display(" Average read bandwidth: %f MBit/s @ 100MHz", (4/(4+read_clocks/reads))*64*100); + $display(" Average write bandwidth: %f MBit/s @ 100MHz", (4/(4+write_clocks/writes))*64*100); + $display("======================================================="); + +`endif + + $finish; +end + +endmodule + Index: hpdmc/trunk/hpdmc_ddr32/test/subtest.vh =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/subtest.vh (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/subtest.vh (revision 21) @@ -0,0 +1,236 @@ +initial begin : test + +cke <= 1'b0; +cs_n <= 1'b1; +ras_n <= 1'b1; +cas_n <= 1'b1; +we_n <= 1'b1; +ba <= {BA_BITS{1'bz}}; +a <= {ADDR_BITS{1'bz}}; +dq_en <= 1'b0; +dqs_en <= 1'b0; +cke <= 1'b1; +power_up; +$display("Powerup complete"); +precharge('h00000000, 1); +nop(trp); +load_mode('h1, 'h00002000); +nop(tmrd-1); +load_mode('h0, 'h0000013A); +nop(tmrd-1); +precharge('h00000000, 1); +nop(trp); +refresh; +nop(trfc); +refresh; +nop(trfc); +load_mode('h0, 'h0000003A); +nop(tmrd-1); +nop('h000000C8); +activate('h00000000, 'h00000000); +nop(trcd-1); +write('h00000000, 'h00000000, 1, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h30003000, 32'h20002000, 32'h10001000, 32'h0}); +nop(BL/2+twr); +activate('h00000001, 'h00000000); +nop(trcd-1); +write('h00000001, 'h00000000, 1, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h30013001, 32'h20012001, 32'h10011001, 32'h10001}); +nop(BL/2+twr); +activate('h00000002, 'h00000000); +nop(trcd-1); +write('h00000002, 'h00000000, 1, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h30023002, 32'h20022002, 32'h10021002, 32'h20002}); +nop(BL/2+twr); +activate('h00000003, 'h00000000); +nop(trcd-1); +write('h00000003, 'h00000000, 1, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h30033003, 32'h20032003, 32'h10031003, 32'h30003}); +nop(BL/2+twr); +activate('h00000000, 'h00000000); +nop(trrd-1); +activate('h00000001, 'h00000000); +nop(trrd-1); +activate('h00000002, 'h00000000); +nop(trrd-1); +activate('h00000003, 'h00000000); +read('h00000000, 'h00000000, 1); +nop(BL/2-1); +read('h00000001, 'h00000000, 1); +nop(BL/2-1); +read('h00000002, 'h00000000, 1); +nop(BL/2-1); +read('h00000003, 'h00000000, 1); +nop(BL/2+twr-2); +activate('h00000001, 'h00000000); +nop(trrd-1); +activate('h00000000, 'h00000000); +nop(trcd-1); +$display("%m At time %t: WRITE Burst", $time);write('h00000000, 'h00000004, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h30403040, 32'h20402040, 32'h10401040, 32'h400040}); +nop(BL/2+4); +$display("%m At time %t: Consecutive WRITE to WRITE", $time);write('h00000000, 'h00000008, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h30803080, 32'h20802080, 32'h10801080, 32'h800080}); +nop(BL/2-1); +write('h00000000, 'h0000000C, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h31203120, 32'h21202120, 32'h11201120, 32'h1200120}); +nop(BL/2-1); +$display("%m At time %t: Nonconsecutive WRITE to WRITE", $time);write('h00000000, 'h00000010, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h31603160, 32'h21602160, 32'h11601160, 32'h1600160}); +nop(BL/2+4); +write('h00000000, 'h00000014, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h32003200, 32'h22002200, 32'h12001200, 32'h2000200}); +nop(BL/2+twr+4); +$display("%m At time %t: Random WRITE Cycles", $time);write('h00000000, 'h00000018, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h32403240, 32'h22402240, 32'h12401240, 32'h2400240}); +nop(BL/2-1); +write('h00000000, 'h0000001C, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h32803280, 32'h22802280, 32'h12801280, 32'h2800280}); +nop(BL/2-1); +write('h00000000, 'h00000020, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h33203320, 32'h23202320, 32'h13201320, 32'h3200320}); +nop(BL/2-1); +write('h00000000, 'h00000024, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h33603360, 32'h23602360, 32'h13601360, 32'h3600360}); +nop(BL/2-1); +$display("%m At time %t: WRITE to READ - Uninterrupting", $time);write('h00000000, 'h00000028, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h34003400, 32'h24002400, 32'h14001400, 32'h4000400}); +nop(BL/2+1); +read('h00000000, 'h00000028, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Interrupting", $time);write('h00000000, 'h0000002C, 0, { 4'h1, 4'h1, 4'h0, 4'h0}, { 32'h34403440, 32'h24402440, 32'h14401440, 32'h4400440}); +nop(BL/2+1); +read('h00000000, 'h0000002C, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Odd Number of Data, Interrupting", $time);write('h00000000, 'h00000030, 0, { 4'h1, 4'h1, 4'h1, 4'h0}, { 32'h34803480, 32'h24802480, 32'h14801480, 32'h4800480}); +nop(BL/2+1); +read('h00000000, 'h00000030, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to PRECHARGE - Uninterrupting", $time);write('h00000000, 'h00000034, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h35203520, 32'h25202520, 32'h15201520, 32'h5200520}); +nop(BL/2+twr); +precharge('h00000000, 0); +nop(trp-1); +$display("%m At time %t: WRITE with AUTO PRECHARGE", $time);activate('h00000000, 'h00000000); +nop(trcd-1); +write('h00000000, 'h00000040, 1, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h36603660, 32'h26602660, 32'h16601660, 32'h6600660}); +nop(BL/2+twr+trp); +activate('h00000000, 'h00000000); +nop(trcd-1); +$display("%m At time %t: READ Burst", $time);read('h00000000, 'h00000000, 0); +nop(BL/2-1); +$display("%m At time %t: Consecutive READ Bursts", $time);read('h00000000, 'h00000004, 0); +nop(BL/2-2); +read('h00000000, 'h00000008, 0); +nop(BL/2-1); +$display("%m At time %t: Nonconsecutive READ Bursts", $time);read('h00000000, 'h0000000C, 0); +nop(BL/2); +read('h00000000, 'h00000010, 0); +nop(BL/2); +$display("%m At time %t: Random READ Accesses", $time);read('h00000000, 'h00000014, 0); +read('h00000000, 'h00000018, 0); +read('h00000000, 'h0000001C, 0); +read('h00000000, 'h00000020, 0); +nop(BL/2); +$display("%m At time %t: Terminating a READ Burst", $time);read('h00000000, 'h00000024, 0); +burst_term; +nop(BL/2-2); +$display("%m At time %t: READ to WRITE", $time);read('h00000000, 'h00000028, 0); +burst_term; +nop(CL); +write('h00000000, 'h0000002C, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'h34C034C0, 32'h24C024C0, 32'h14C014C0, 32'h4C004C0}); +nop(BL/2+1); +$display("%m At time %t: READ to PRECHARGE", $time);read('h00000000, 'h00000030, 0); +nop('h00000001); +precharge('h00000000, 0); +nop(trp-1); +$display("%m At time %t: READ with AUTO PRECHARGE", $time);activate('h00000000, 'h00000000); +nop(trcd-1); +read('h00000000, 'h00000034, 1); +nop(CL+BL/2+twr); +$display("%m At time %t: WRITE to READ - Mask byte 0 of Burst 0", $time);activate('h00000000, 'h00000000); +nop(trcd-1); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h1}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 1 of Burst 0", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h2}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 2 of Burst 0", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h4}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 3 of Burst 0", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h8}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 0 of Burst 1", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h1, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 1 of Burst 1", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h2, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 2 of Burst 1", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h4, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 3 of Burst 1", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h8, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 0 of Burst 2", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h1, 4'h0, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 1 of Burst 2", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h2, 4'h0, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 2 of Burst 2", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h4, 4'h0, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 3 of Burst 2", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h0, 4'h8, 4'h0, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 0 of Burst 3", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h1, 4'h0, 4'h0, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 1 of Burst 3", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h2, 4'h0, 4'h0, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 2 of Burst 3", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h4, 4'h0, 4'h0, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 0); +nop(CL+BL/2-1); +$display("%m At time %t: WRITE to READ - Mask byte 3 of Burst 3", $time);write('h00000000, 'h00000064, 0, { 4'h0, 4'h0, 4'h0, 4'h0}, { 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF, 32'hFFFFFFFF}); +nop(BL/2); +write('h00000000, 'h00000064, 0, { 4'h8, 4'h0, 4'h0, 4'h0}, { 32'h33333333, 32'h22222222, 32'h11111111, 32'h0}); +nop(BL/2+1); +read('h00000000, 'h00000064, 1); +nop(CL+BL/2-1); +test_done = 1; +end + Index: hpdmc/trunk/hpdmc_ddr32/test/iddr.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/iddr.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/iddr.v (revision 21) @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 1995/2005 Xilinx, Inc. +// All Right Reserved. +/////////////////////////////////////////////////////////////////////////////// +// Modified for HPDMC simulation, based on Xilinx 05/29/07 revision +/////////////////////////////////////////////////////////////////////////////// + + +module IDDR #( + parameter DDR_CLK_EDGE = "OPPOSITE_EDGE", + parameter INIT_Q1 = 1'b0, + parameter INIT_Q2 = 1'b0, + parameter SRTYPE = "SYNC" +) ( + output Q1, + output Q2, + input C, + input CE, + input D, + input R, + input S +); + +reg q1_out = INIT_Q1, q2_out = INIT_Q2; +reg q1_out_int, q2_out_int; +reg q1_out_pipelined, q2_out_same_edge_int; + +wire c_in; +wire ce_in; +wire d_in; +wire gsr_in; +wire r_in; +wire s_in; + +buf buf_c(c_in, C); +buf buf_ce(ce_in, CE); +buf buf_d(d_in, D); +buf buf_q1(Q1, q1_out); +buf buf_q2(Q2, q2_out); +buf buf_r(r_in, R); +buf buf_s(s_in, S); + +initial begin + if((INIT_Q1 != 0) && (INIT_Q1 != 1)) begin + $display("Attribute Syntax Error : The attribute INIT_Q1 on IDDR instance %m is set to %d. Legal values for this attribute are 0 or 1.", INIT_Q1); + $finish; + end + + if((INIT_Q2 != 0) && (INIT_Q2 != 1)) begin + $display("Attribute Syntax Error : The attribute INIT_Q1 on IDDR instance %m is set to %d. Legal values for this attribute are 0 or 1.", INIT_Q2); + $finish; + end + + if((DDR_CLK_EDGE != "OPPOSITE_EDGE") && (DDR_CLK_EDGE != "SAME_EDGE") && (DDR_CLK_EDGE != "SAME_EDGE_PIPELINED")) begin + $display("Attribute Syntax Error : The attribute DDR_CLK_EDGE on IDDR instance %m is set to %s. Legal values for this attribute are OPPOSITE_EDGE, SAME_EDGE or SAME_EDGE_PIPELINED.", DDR_CLK_EDGE); + $finish; + end + + if((SRTYPE != "ASYNC") && (SRTYPE != "SYNC")) begin + $display("Attribute Syntax Error : The attribute SRTYPE on IDDR instance %m is set to %s. Legal values for this attribute are ASYNC or SYNC.", SRTYPE); + $finish; + end +end + +always @(r_in, s_in) begin + if(r_in == 1'b1 && SRTYPE == "ASYNC") begin + assign q1_out_int = 1'b0; + assign q1_out_pipelined = 1'b0; + assign q2_out_same_edge_int = 1'b0; + assign q2_out_int = 1'b0; + end else if(r_in == 1'b0 && s_in == 1'b1 && SRTYPE == "ASYNC") begin + assign q1_out_int = 1'b1; + assign q1_out_pipelined = 1'b1; + assign q2_out_same_edge_int = 1'b1; + assign q2_out_int = 1'b1; + end else if((r_in == 1'b1 || s_in == 1'b1) && SRTYPE == "SYNC") begin + deassign q1_out_int; + deassign q1_out_pipelined; + deassign q2_out_same_edge_int; + deassign q2_out_int; + end else if(r_in == 1'b0 && s_in == 1'b0) begin + deassign q1_out_int; + deassign q1_out_pipelined; + deassign q2_out_same_edge_int; + deassign q2_out_int; + end +end + +always @(posedge c_in) begin + if(r_in == 1'b1) begin + q1_out_int <= 1'b0; + q1_out_pipelined <= 1'b0; + q2_out_same_edge_int <= 1'b0; + end else if(r_in == 1'b0 && s_in == 1'b1) begin + q1_out_int <= 1'b1; + q1_out_pipelined <= 1'b1; + q2_out_same_edge_int <= 1'b1; + end else if(ce_in == 1'b1 && r_in == 1'b0 && s_in == 1'b0) begin + q1_out_int <= d_in; + q1_out_pipelined <= q1_out_int; + q2_out_same_edge_int <= q2_out_int; + end +end + +always @(negedge c_in) begin + if(r_in == 1'b1) + q2_out_int <= 1'b0; + else if(r_in == 1'b0 && s_in == 1'b1) + q2_out_int <= 1'b1; + else if(ce_in == 1'b1 && r_in == 1'b0 && s_in == 1'b0) + q2_out_int <= d_in; +end + +always @(c_in, q1_out_int, q2_out_int, q2_out_same_edge_int, q1_out_pipelined) begin + case(DDR_CLK_EDGE) + "OPPOSITE_EDGE" : begin + q1_out <= q1_out_int; + q2_out <= q2_out_int; + end + "SAME_EDGE" : begin + q1_out <= q1_out_int; + q2_out <= q2_out_same_edge_int; + end + "SAME_EDGE_PIPELINED" : begin + q1_out <= q1_out_pipelined; + q2_out <= q2_out_same_edge_int; + end + default: begin + $display("Attribute Syntax Error : The attribute DDR_CLK_EDGE on IDDR instance %m is set to %s. Legal values for this attribute are OPPOSITE_EDGE, SAME_EDGE or SAME_EDGE_PIPELINED.", DDR_CLK_EDGE); + $finish; + end + endcase +end + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/test/ddr_parameters.vh =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/ddr_parameters.vh (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/ddr_parameters.vh (revision 21) @@ -0,0 +1,143 @@ +/**************************************************************************************** +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +****************************************************************************************/ + +`define sg75E +`define x16 + + // Timing parameters based on Speed Grade 04/07 + // SYMBOL UNITS DESCRIPTION + // ------ ----- ----------- +`ifdef sg5B // Timing Parameters for -5B (CL = 3) + parameter tCK = 5.0; // tCK ns Nominal Clock Cycle Time + parameter tDQSQ = 0.4; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter tMRD = 10.0; // tMRD ns Load Mode Register command cycle time + parameter tRAP = 15.0; // tRAP ns ACTIVE to READ with Auto precharge command + parameter tRAS = 40.0; // tRAS ns Active to Precharge command time + parameter tRC = 55.0; // tRC ns Active to Active/Auto Refresh command time + parameter tRFC = 70.0; // tRFC ns Refresh to Refresh Command interval time + parameter tRCD = 15.0; // tRCD ns Active to Read/Write command time + parameter tRP = 15.0; // tRP ns Precharge command period + parameter tRRD = 10.0; // tRRD ns Active bank a to Active bank b command time + parameter tWR = 15.0; // tWR ns Write recovery time +`endif +`ifdef sg6T // Timing Parameters for -6T (CL = 2.5) + parameter tCK = 6.0; // tCK ns Nominal Clock Cycle Time + parameter tDQSQ = 0.45; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter tMRD = 12.0; // tMRD ns Load Mode Register command cycle time + parameter tRAP = 15.0; // tRAP ns ACTIVE to READ with Auto precharge command + parameter tRAS = 42.0; // tRAS ns Active to Precharge command time + parameter tRC = 60.0; // tRC ns Active to Active/Auto Refresh command time + parameter tRFC = 72.0; // tRFC ns Refresh to Refresh Command interval time + parameter tRCD = 15.0; // tRCD ns Active to Read/Write command time + parameter tRP = 15.0; // tRP ns Precharge command period + parameter tRRD = 12.0; // tRRD ns Active bank a to Active bank b command time + parameter tWR = 15.0; // tWR ns Write recovery time +`endif +`ifdef sg6 // Timing Parameters for -6 (CL = 2.5) + parameter tCK = 6.0; // tCK ns Nominal Clock Cycle Time + parameter tDQSQ = 0.4; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter tMRD = 12.0; // tMRD ns Load Mode Register command cycle time + parameter tRAP = 15.0; // tRAP ns ACTIVE to READ with Auto precharge command + parameter tRAS = 42.0; // tRAS ns Active to Precharge command time + parameter tRC = 60.0; // tRC ns Active to Active/Auto Refresh command time + parameter tRFC = 72.0; // tRFC ns Refresh to Refresh Command interval time + parameter tRCD = 15.0; // tRCD ns Active to Read/Write command time + parameter tRP = 15.0; // tRP ns Precharge command period + parameter tRRD = 12.0; // tRRD ns Active bank a to Active bank b command time + parameter tWR = 15.0; // tWR ns Write recovery time +`endif +`ifdef sg75E // Timing Parameters for -75E (CL = 2) + parameter tCK = 7.5; // tCK ns Nominal Clock Cycle Time + parameter tDQSQ = 0.5; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter tMRD = 15.0; // tMRD ns Load Mode Register command cycle time + parameter tRAP = 15.0; // tRAP ns ACTIVE to READ with Auto precharge command + parameter tRAS = 40.0; // tRAS ns Active to Precharge command time + parameter tRC = 60.0; // tRC ns Active to Active/Auto Refresh command time + parameter tRFC = 75.0; // tRFC ns Refresh to Refresh Command interval time + parameter tRCD = 15.0; // tRCD ns Active to Read/Write command time + parameter tRP = 15.0; // tRP ns Precharge command period + parameter tRRD = 15.0; // tRRD ns Active bank a to Active bank b command time + parameter tWR = 15.0; // tWR ns Write recovery time +`endif +`ifdef sg75Z // Timing Parameters for -75Z (CL = 2) + parameter tCK = 7.5; // tCK ns Nominal Clock Cycle Time + parameter tDQSQ = 0.5; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter tMRD = 15.0; // tMRD ns Load Mode Register command cycle time + parameter tRAP = 20.0; // tRAP ns ACTIVE to READ with Auto precharge command + parameter tRAS = 40.0; // tRAS ns Active to Precharge command time + parameter tRC = 65.0; // tRC ns Active to Active/Auto Refresh command time + parameter tRFC = 75.0; // tRFC ns Refresh to Refresh Command interval time + parameter tRCD = 20.0; // tRCD ns Active to Read/Write command time + parameter tRP = 20.0; // tRP ns Precharge command period + parameter tRRD = 15.0; // tRRD ns Active bank a to Active bank b command time + parameter tWR = 15.0; // tWR ns Write recovery time +`endif +`ifdef sg75 // Timing Parameters for -75 (CL = 2.5) + parameter tCK = 7.5; // tCK ns Nominal Clock Cycle Time + parameter tDQSQ = 0.5; // tDQSQ ns DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter tMRD = 15.0; // tMRD ns Load Mode Register command cycle time + parameter tRAP = 20.0; // tRAP ns ACTIVE to READ with Auto precharge command + parameter tRAS = 40.0; // tRAS ns Active to Precharge command time + parameter tRC = 65.0; // tRC ns Active to Active/Auto Refresh command time + parameter tRFC = 75.0; // tRFC ns Refresh to Refresh Command interval time + parameter tRCD = 20.0; // tRCD ns Active to Read/Write command time + parameter tRP = 20.0; // tRP ns Precharge command period + parameter tRRD = 15.0; // tRRD ns Active bank a to Active bank b command time + parameter tWR = 15.0; // tWR ns Write recovery time +`endif + + // Size Parameters based on Part Width + +`ifdef x4 + parameter ADDR_BITS = 13; // Set this parameter to control how many Address bits are used + parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used + parameter DQS_BITS = 1; // Set this parameter to control how many DQS bits are used + parameter DM_BITS = 1; // Set this parameter to control how many DM bits are used + parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used +`endif +`ifdef x8 + parameter ADDR_BITS = 13; // Set this parameter to control how many Address bits are used + parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used + parameter DQS_BITS = 1; // Set this parameter to control how many DQS bits are used + parameter DM_BITS = 1; // Set this parameter to control how many DM bits are used + parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used +`endif +`ifdef x16 + parameter ADDR_BITS = 13; // Set this parameter to control how many Address bits are used + parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used + parameter DQS_BITS = 2; // Set this parameter to control how many DQS bits are used + parameter DM_BITS = 2; // Set this parameter to control how many DM bits are used + parameter COL_BITS = 9; // Set this parameter to control how many Column bits are used +`endif + + parameter BA_BITS = 2; // Set this parmaeter to control how many Bank Address bits are used + parameter full_mem_bits = BA_BITS+ADDR_BITS+COL_BITS; // Set this parameter to control how many unique addresses are used + parameter part_mem_bits = 10; // Set this parameter to control how many unique addresses are used + + parameter no_halt = 0; // If set to 1, the model won't halt on command sequence/major errors + parameter DEBUG = 1; // Turn on DEBUG message +`define FULL_MEM Index: hpdmc/trunk/hpdmc_ddr32/test/iddr2.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/iddr2.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/iddr2.v (revision 21) @@ -0,0 +1,161 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 1995/2004 Xilinx, Inc. +// All Right Reserved. +/////////////////////////////////////////////////////////////////////////////// +// Modified for HPDMC simulation, based on Xilinx 04/08/09 revision +/////////////////////////////////////////////////////////////////////////////// + + +`timescale 1 ps / 1 ps + +module IDDR2 (Q0, Q1, C0, C1, CE, D, R, S); + + output Q0; + output Q1; + + input C0; + input C1; + input CE; + input D; + + input R; + input S; + + parameter DDR_ALIGNMENT = "NONE"; + parameter INIT_Q0 = 1'b0; + parameter INIT_Q1 = 1'b0; + parameter SRTYPE = "SYNC"; + + pullup P1 (CE); + pulldown P2 (R); + pulldown P3 (S); + + reg q0_out, q1_out; + reg q0_out_int, q1_out_int; + reg q0_c0_out_int, q1_c0_out_int; + + wire PC0, PC1; + + buf buf_q0 (Q0, q0_out); + buf buf_q1 (Q1, q1_out); + + + initial begin + + if ((INIT_Q0 != 1'b0) && (INIT_Q0 != 1'b1)) begin + $display("Attribute Syntax Error : The attribute INIT_Q0 on IDDR2 instance %m is set to %d. Legal values for this attribute are 0 or 1.", INIT_Q0); + $finish; + end + + if ((INIT_Q1 != 1'b0) && (INIT_Q1 != 1'b1)) begin + $display("Attribute Syntax Error : The attribute INIT_Q0 on IDDR2 instance %m is set to %d. Legal values for this attribute are 0 or 1.", INIT_Q1); + $finish; + end + + if ((DDR_ALIGNMENT != "C1") && (DDR_ALIGNMENT != "C0") && (DDR_ALIGNMENT != "NONE")) begin + $display("Attribute Syntax Error : The attribute DDR_ALIGNMENT on IDDR2 instance %m is set to %s. Legal values for this attribute are C0, C1 or NONE.", DDR_ALIGNMENT); + $finish; + end + + if ((SRTYPE != "ASYNC") && (SRTYPE != "SYNC")) begin + $display("Attribute Syntax Error : The attribute SRTYPE on IDDR2 instance %m is set to %s. Legal values for this attribute are ASYNC or SYNC.", SRTYPE); + $finish; + end + + end // initial begin + + assign PC0 = ((DDR_ALIGNMENT== "C0") || (DDR_ALIGNMENT== "NONE"))? C0 : C1; + assign PC1 = ((DDR_ALIGNMENT== "C0") || (DDR_ALIGNMENT== "NONE"))? C1 : C0; + + initial begin + assign q0_out_int = INIT_Q0; + assign q1_out_int = INIT_Q1; + assign q0_c0_out_int = INIT_Q0; + assign q1_c0_out_int = INIT_Q1; + end + + always @(R or S) begin + + deassign q0_out_int; + deassign q1_out_int; + deassign q0_c0_out_int; + deassign q1_c0_out_int; + + if (SRTYPE == "ASYNC") begin + if (R == 1) begin + assign q0_out_int = 0; + assign q1_out_int = 0; + assign q0_c0_out_int = 0; + assign q1_c0_out_int = 0; + end + else if (R == 0 && S == 1) begin + assign q0_out_int = 1; + assign q1_out_int = 1; + end + end // if (SRTYPE == "ASYNC") + + end // always @ (GSR or R or S) + + + always @(posedge PC0) begin + if (R == 1 && SRTYPE == "SYNC") begin + q0_out_int <= 0; + q0_c0_out_int <= 0; + q1_c0_out_int <= 0; + end + else if (R == 0 && S == 1 && SRTYPE == "SYNC") begin + q0_out_int <= 1; + end + else if (CE == 1 && R == 0 && S == 0) begin + q0_out_int <= D; + q0_c0_out_int <= q0_out_int; + q1_c0_out_int <= q1_out_int; + end + end // always @ (posedge PC0) + + + always @(posedge PC1) begin + if (R == 1 && SRTYPE == "SYNC") begin + q1_out_int <= 0; + end + else if (R == 0 && S == 1 && SRTYPE == "SYNC") begin + q1_out_int <= 1; + end + else if (CE == 1 && R == 0 && S == 0) begin + q1_out_int <= D; + end + end // always @ (posedge PC1) + + + always @(q0_out_int or q1_out_int or q1_c0_out_int or q0_c0_out_int) begin + + case (DDR_ALIGNMENT) + "NONE" : begin + q0_out <= q0_out_int; + q1_out <= q1_out_int; + end + "C0" : begin + q0_out <= q0_out_int; + q1_out <= q1_c0_out_int; + end + "C1" : begin + q0_out <= q0_out_int; + q1_out <= q1_c0_out_int; + end + endcase // case(DDR_ALIGNMENT) + + end // always @ (q0_out_int or q1_out_int or q1_c0_out_int or q0_c0_out_int) + + + specify + + if (C0) (C0 => Q0) = (100, 100); + if (C0) (C0 => Q1) = (100, 100); + if (C1) (C1 => Q1) = (100, 100); + if (C1) (C1 => Q0) = (100, 100); + specparam PATHPULSE$ = 0; + + endspecify + +endmodule // IDDR2 + Index: hpdmc/trunk/hpdmc_ddr32/test/iobuf.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/iobuf.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/iobuf.v (revision 21) @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 1995/2004 Xilinx, Inc. +// All Right Reserved. +/////////////////////////////////////////////////////////////////////////////// +// Modified for HPDMC simulation, based on Xilinx 04/22/09 revision +/////////////////////////////////////////////////////////////////////////////// + +`timescale 1 ps / 1 ps + + +module IOBUF (O, IO, I, T); + + parameter CAPACITANCE = "DONT_CARE"; + parameter integer DRIVE = 12; + parameter IBUF_DELAY_VALUE = "0"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IFD_DELAY_VALUE = "AUTO"; + parameter IOSTANDARD = "DEFAULT"; + parameter SLEW = "SLOW"; + + output O; + inout IO; + input I, T; + + bufif0 T1 (IO, I, T); + + buf B1 (O, IO); + + initial begin + + case (CAPACITANCE) + + "LOW", "NORMAL", "DONT_CARE" : ; + default : begin + $display("Attribute Syntax Error : The attribute CAPACITANCE on IOBUF instance %m is set to %s. Legal values for this attribute are DONT_CARE, LOW or NORMAL.", CAPACITANCE); + $finish; + end + + endcase + + case (IBUF_DELAY_VALUE) + + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16" : ; + default : begin + $display("Attribute Syntax Error : The attribute IBUF_DELAY_VALUE on IOBUF instance %m is set to %s. Legal values for this attribute are 0, 1, 2, ... or 16.", IBUF_DELAY_VALUE); + $finish; + end + + endcase + + case (IBUF_LOW_PWR) + + "FALSE", "TRUE" : ; + default : begin + $display("Attribute Syntax Error : The attribute IBUF_LOW_PWR on IBUF instance %m is set to %s. Legal values for this attribute are TRUE or FALSE.", IBUF_LOW_PWR); + $finish; + end + + endcase + + case (IFD_DELAY_VALUE) + + "AUTO", "0", "1", "2", "3", "4", "5", "6", "7", "8" : ; + default : begin + $display("Attribute Syntax Error : The attribute IFD_DELAY_VALUE on IOBUF instance %m is set to %s. Legal values for this attribute are AUTO, 0, 1, 2, ... or 8.", IFD_DELAY_VALUE); + $finish; + end + + endcase + + end // initial begin + +endmodule + Index: hpdmc/trunk/hpdmc_ddr32/test/tb_model.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/test/tb_model.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/test/tb_model.v (revision 21) @@ -0,0 +1,556 @@ +/**************************************************************************************** +* +* File Name: tb.v +* Version: 5.7 +* Model: BUS Functional +* +* Dependencies: ddr.v, ddr_parameters.v +* +* Description: Micron SDRAM DDR (Double Data Rate) test bench +* +* Note: - Set simulator resolution to "ps" accuracy +* - Set Debug = 0 to disable $display messages +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +* Rev Author Date Changes +* -------------------------------------------------------------------------------- +* 2.1 SPH 03/19/2002 - Second Release +* - Fix tWR and several incompatability +* between different simulators +* 3.0 TFK 02/18/2003 - Added tDSS and tDSH timing checks. +* - Added tDQSH and tDQSL timing checks. +* 3.1 CAH 05/28/2003 - update all models to release version 3.1 +* (no changes to this model) +* 3.2 JMK 06/16/2003 - updated all DDR400 models to support CAS Latency 3 +* 3.3 JMK 09/11/2003 - Added initialization sequence checks. +* 4.0 JMK 12/01/2003 - Grouped parameters into "ddr_parameters.v" +* - Fixed tWTR check +* 4.1 JMK 01/14/2001 - Grouped specify parameters by speed grade +* - Fixed mem_sizes parameter +* 4.2 JMK 03/19/2004 - Fixed pulse width checking on Dqs +* 4.3 JMK 04/27/2004 - Changed BL wire size in tb module +* - Changed Dq_buf size to [15:0] +* 5.0 JMK 06/16/2004 - Added read to write checking. +* - Added read with precharge truncation to write checking. +* - Added associative memory array to reduce memory consumption. +* - Added checking for required DQS edges during write. +* 5.1 JMK 08/16/2004 - Fixed checking for required DQS edges during write. +* - Fixed wdqs_valid window. +* 5.2 JMK 09/24/2004 - Read or Write without activate will be ignored. +* 5.3 JMK 10/27/2004 - Added tMRD checking during Auto Refresh and Activate. +* - Added tRFC checking during Load Mode and Precharge. +* 5.4 JMK 12/13/2004 - The model will not respond to illegal command sequences. +* 5.5 SPH 01/13/2005 - The model will issue a halt on illegal command sequences. +* JMK 02/11/2005 - Changed the display format for numbers to hex. +* 5.6 JMK 04/22/2005 - Fixed Write with auto precharge calculation. +* 5.7 JMK 08/05/2005 - Changed conditions for read with precharge truncation error. +* - Renamed parameters file with .vh extension. +* 5.8 BAS 12/26/2006 - Added parameters for T46A part - 256Mb +* - Added x32 functionality +* 6.0 BAS 05/31/2007 - Added read_verify command +****************************************************************************************/ + +`timescale 1ns / 1ps + +module tb; + +`include "ddr_parameters.vh" + + reg clk ; + reg clk_n ; + reg cke ; + reg cs_n ; + reg ras_n ; + reg cas_n ; + reg we_n ; + reg [BA_BITS - 1 : 0] ba ; + reg [ADDR_BITS - 1 : 0] a ; + reg dq_en ; + reg [DM_BITS - 1 : 0] dm_out ; + reg [DQ_BITS - 1 : 0] dq_out ; + reg [DM_BITS-1 : 0] dm_fifo [0 : 13]; + reg [DQ_BITS-1 : 0] dq_fifo [0 : 13]; + reg [DQ_BITS-1 : 0] dq_in_pos ; + reg [DQ_BITS-1 : 0] dq_in_neg ; + reg dqs_en ; + reg [DQS_BITS - 1 : 0] dqs_out ; + + reg [12 : 0] mode_reg ; //Mode Register + reg [12 : 0] ext_mode_reg; //Extended Mode Register + + wire BO = mode_reg[3]; //Burst Order + wire [7 : 0] BL = (1< $rtoi(number)) + ciel = $rtoi(number) + 1; + else + ciel = number; + endfunction + + task power_up; + begin + cke <= 1'b0; + repeat(10) @(negedge clk); + $display ("%m at time %t TB: A 200 us delay is required before CKE can be brought high.", $time); + @ (negedge clk) cke = 1'b1; + nop (400/tck+1); + end + endtask + + task load_mode; + input [BA_BITS - 1 : 0] bank; + input [ADDR_BITS - 1 : 0] addr; + begin + case (bank) + 0: mode_reg = addr; + 1: ext_mode_reg = addr; + endcase + cke = 1'b1; + cs_n = 1'b0; + ras_n = 1'b0; + cas_n = 1'b0; + we_n = 1'b0; + ba = bank; + a = addr; + @(negedge clk); + end + endtask + + task refresh; + begin + cke = 1'b1; + cs_n = 1'b0; + ras_n = 1'b0; + cas_n = 1'b0; + we_n = 1'b1; + @(negedge clk); + end + endtask + + task burst_term; + integer i; + begin + cke = 1'b1; + cs_n = 1'b0; + ras_n = 1'b1; + cas_n = 1'b1; + we_n = 1'b0; + @(negedge clk); + for (i=0; i>10)<<11; //ADDR[ N:11] = COL[ N:10] + a = atemp[0] | atemp[1] | (ap<<10); + + for (i=0; i<=BL; i=i+1) begin + dqs_en <= #(WL*tck + i*tck/2) 1'b1; + if (i%2 === 0) begin + dqs_out <= #(WL*tck + i*tck/2) {DQS_BITS{1'b0}}; + end else begin + dqs_out <= #(WL*tck + i*tck/2) {DQS_BITS{1'b1}}; + end + dq_en <= #(WL*tck + i*tck/2 + tck/4) 1'b1; + for (j=0; j>((i*DM_BITS + j)*DQ_BITS/DM_BITS); + dm_out[j] <= #(WL*tck + i*tck/2 + tck/4) &dm_temp; + end + dq_out <= #(WL*tck + i*tck/2 + tck/4) dq>>i*DQ_BITS; + case (i) + 15: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[16*DM_BITS-1 : 15*DM_BITS]; + 14: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[15*DM_BITS-1 : 14*DM_BITS]; + 13: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[14*DM_BITS-1 : 13*DM_BITS]; + 12: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[13*DM_BITS-1 : 12*DM_BITS]; + 11: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[12*DM_BITS-1 : 11*DM_BITS]; + 10: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[11*DM_BITS-1 : 10*DM_BITS]; + 9: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[10*DM_BITS-1 : 9*DM_BITS]; + 8: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 9*DM_BITS-1 : 8*DM_BITS]; + 7: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 8*DM_BITS-1 : 7*DM_BITS]; + 6: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 7*DM_BITS-1 : 6*DM_BITS]; + 5: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 6*DM_BITS-1 : 5*DM_BITS]; + 4: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 5*DM_BITS-1 : 4*DM_BITS]; + 3: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 4*DM_BITS-1 : 3*DM_BITS]; + 2: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 3*DM_BITS-1 : 2*DM_BITS]; + 1: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 2*DM_BITS-1 : 1*DM_BITS]; + 0: dm_out <= #(WL*tck + i*tck/2 + tck/4) dm[ 1*DM_BITS-1 : 0*DM_BITS]; + endcase + case (i) + 15: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[16*DQ_BITS-1 : 15*DQ_BITS]; + 14: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[15*DQ_BITS-1 : 14*DQ_BITS]; + 13: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[14*DQ_BITS-1 : 13*DQ_BITS]; + 12: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[13*DQ_BITS-1 : 12*DQ_BITS]; + 11: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[12*DQ_BITS-1 : 11*DQ_BITS]; + 10: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[11*DQ_BITS-1 : 10*DQ_BITS]; + 9: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[10*DQ_BITS-1 : 9*DQ_BITS]; + 8: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 9*DQ_BITS-1 : 8*DQ_BITS]; + 7: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 8*DQ_BITS-1 : 7*DQ_BITS]; + 6: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 7*DQ_BITS-1 : 6*DQ_BITS]; + 5: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 6*DQ_BITS-1 : 5*DQ_BITS]; + 4: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 5*DQ_BITS-1 : 4*DQ_BITS]; + 3: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 4*DQ_BITS-1 : 3*DQ_BITS]; + 2: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 3*DQ_BITS-1 : 2*DQ_BITS]; + 1: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 2*DQ_BITS-1 : 1*DQ_BITS]; + 0: dq_out <= #(WL*tck + i*tck/2 + tck/4) dq[ 1*DQ_BITS-1 : 0*DQ_BITS]; + endcase + dq_en <= #(WL*tck + i*tck/2 + tck/4) 1'b1; + end + dqs_en <= #(WL*tck + BL*tck/2 + tck/2) 1'b0; + dq_en <= #(WL*tck + BL*tck/2 + tck/4) 1'b0; + @(negedge clk); + end + endtask + + task read; + input [BA_BITS - 1 : 0]bank; + input [COL_BITS - 1 : 0] col; + input ap; //Auto Precharge + reg [ADDR_BITS - 1 : 0] atemp [1:0]; + begin + cke = 1'b1; + cs_n = 1'b0; + ras_n = 1'b1; + cas_n = 1'b0; + we_n = 1'b1; + ba = bank; + atemp[0] = col & 10'h3ff; //ADDR[ 9: 0] = COL[ 9: 0] + atemp[1] = (col>>10)<<11; //ADDR[ N:11] = COL[ N:10] + a = atemp[0] | atemp[1] | (ap<<10); + @(negedge clk); + end + endtask + + // read with data verification + task read_verify; + input [BA_BITS - 1 : 0] bank; + input [COL_BITS - 1 : 0] col; + input ap; //Auto Precharge + input [16*DM_BITS - 1 : 0] dm; //Expected Data Mask + input [16*DQ_BITS - 1 : 0] dq; //Expected Data + integer i; + reg [2:0] brst_col; + begin + read (bank, col, ap); + for (i=0; i> (i*DM_BITS); + dq_fifo[2*RL + i] = dq >> (i*DQ_BITS); + end + end + endtask + + task nop; + input count; + integer count; + begin + cke = 1'b1; + cs_n = 1'b0; + ras_n = 1'b1; + cas_n = 1'b1; + we_n = 1'b1; + repeat(count) @(negedge clk); + end + endtask + + task deselect; + input count; + integer count; + begin + cke = 1'b1; + cs_n = 1'b1; + ras_n = 1'b1; + cas_n = 1'b1; + we_n = 1'b1; + repeat(count) @(negedge clk); + end + endtask + + task power_down; + input count; + integer count; + begin + cke = 1'b0; + cs_n = 1'b1; + ras_n = 1'b1; + cas_n = 1'b1; + we_n = 1'b1; + repeat(count) @(negedge clk); + end + endtask + + function [16*DQ_BITS - 1 : 0] sort_data; + input [16*DQ_BITS - 1 : 0] dq; + input [2:0] col; + integer i; + reg [2:0] brst_col; + reg [DQ_BITS - 1 :0] burst; + begin + sort_data = 0; + for (i=0; i> (brst_col*DQ_BITS); + sort_data = sort_data | burst<<(i*DQ_BITS); + end + end + endfunction + + // receiver(s) for data_verify process + always @(dqs_in[0]) begin #(tDQSQ); dqs_receiver(0); end + always @(dqs_in[1]) begin #(tDQSQ); dqs_receiver(1); end + always @(dqs_in[2]) begin #(tDQSQ); dqs_receiver(2); end + always @(dqs_in[3]) begin #(tDQSQ); dqs_receiver(3); end + always @(dqs_in[4]) begin #(tDQSQ); dqs_receiver(4); end + always @(dqs_in[5]) begin #(tDQSQ); dqs_receiver(5); end + always @(dqs_in[6]) begin #(tDQSQ); dqs_receiver(6); end + always @(dqs_in[7]) begin #(tDQSQ); dqs_receiver(7); end + + task dqs_receiver; + input i; + integer i; + begin + if (dqs_in[i]) begin + case (i) + 0: dq_in_pos[ 7: 0] <= dq_in[ 7: 0]; + 1: dq_in_pos[15: 8] <= dq_in[15: 8]; +/* 2: dq_in_pos[23:16] <= dq_in[23:16]; + 3: dq_in_pos[31:24] <= dq_in[31:24]; + 4: dq_in_pos[39:32] <= dq_in[39:32]; + 5: dq_in_pos[47:40] <= dq_in[47:40]; + 6: dq_in_pos[55:48] <= dq_in[55:48]; + 7: dq_in_pos[63:56] <= dq_in[63:56];*/ + endcase + end else if (!dqs_in[i]) begin + case (i) + 0: dq_in_neg[ 7: 0] <= dq_in[ 7: 0]; + 1: dq_in_neg[15: 8] <= dq_in[15: 8]; +/* 2: dq_in_neg[23:16] <= dq_in[23:16]; + 3: dq_in_neg[31:24] <= dq_in[31:24]; + 4: dq_in_pos[39:32] <= dq_in[39:32]; + 5: dq_in_pos[47:40] <= dq_in[47:40]; + 6: dq_in_pos[55:48] <= dq_in[55:48]; + 7: dq_in_pos[63:56] <= dq_in[63:56];*/ + endcase + end + end + endtask + + + // perform data verification as a result of read_verify task call + always @(clk) begin : data_verify + integer i; + reg [DM_BITS-1 : 0] data_mask; + reg [8*DM_BITS-1 : 0] bit_mask; + + for (i=0; i<=14; i=i+1) begin + dm_fifo[i] = dm_fifo[i+1]; + dq_fifo[i] = dq_fifo[i+1]; + end + dm_fifo[13] = 'bz; + dq_fifo[13] = 'bz; +// dm_fifo[30] = 0; +// dq_fifo[30] = 0; + data_mask = dm_fifo[0]; + + data_mask = dm_fifo[0]; + for (i=0; i= 2) begin + if (DEBUG) $display ("%m: at time %t MEMORY: Power Up and Initialization Sequence is complete", $time); + power_up_done = 1; + end else begin + aref_count = 0; + @ (aref_count >= 2) begin + if (DEBUG) $display ("%m: at time %t MEMORY: Power Up and Initialization Sequence is complete", $time); + power_up_done = 1; + end + end + end + end + end + end + end + + // Write Memory + task write_mem; + input [full_mem_bits - 1 : 0] addr; + input [DQ_BITS - 1 : 0] data; + reg [part_mem_bits : 0] i; + begin +`ifdef FULL_MEM + mem_array[addr] = data; +`else + begin : loop + for (i = 0; i < mem_used; i = i + 1) begin + if (addr_array[i] === addr) begin + disable loop; + end + end + end + if (i === mem_used) begin + if (i === (1<= burst_length) begin + Data_in_enable = 1'b0; + Data_out_enable = 1'b0; + read_precharge_truncation = 4'h0; + end + + end + endtask + + // Manual Precharge Pipeline + task Manual_Precharge_Pipeline; + begin + // A10 Precharge Pipeline + A10_precharge[0] = A10_precharge[1]; + A10_precharge[1] = A10_precharge[2]; + A10_precharge[2] = A10_precharge[3]; + A10_precharge[3] = A10_precharge[4]; + A10_precharge[4] = A10_precharge[5]; + A10_precharge[5] = A10_precharge[6]; + A10_precharge[6] = 1'b0; + + // Bank Precharge Pipeline + Bank_precharge[0] = Bank_precharge[1]; + Bank_precharge[1] = Bank_precharge[2]; + Bank_precharge[2] = Bank_precharge[3]; + Bank_precharge[3] = Bank_precharge[4]; + Bank_precharge[4] = Bank_precharge[5]; + Bank_precharge[5] = Bank_precharge[6]; + Bank_precharge[6] = 2'b0; + + // Command Precharge Pipeline + Cmnd_precharge[0] = Cmnd_precharge[1]; + Cmnd_precharge[1] = Cmnd_precharge[2]; + Cmnd_precharge[2] = Cmnd_precharge[3]; + Cmnd_precharge[3] = Cmnd_precharge[4]; + Cmnd_precharge[4] = Cmnd_precharge[5]; + Cmnd_precharge[5] = Cmnd_precharge[6]; + Cmnd_precharge[6] = 1'b0; + + // Terminate a Read if same bank or all banks + if (Cmnd_precharge[0] === 1'b1) begin + if (Bank_precharge[0] === Bank_addr || A10_precharge[0] === 1'b1) begin + if (Data_out_enable === 1'b1) begin + Data_out_enable = 1'b0; + read_precharge_truncation = 4'hF; + end + end + end + end + endtask + + // Burst Terminate Pipeline + task Burst_Terminate_Pipeline; + begin + // Command Precharge Pipeline + Cmnd_bst[0] = Cmnd_bst[1]; + Cmnd_bst[1] = Cmnd_bst[2]; + Cmnd_bst[2] = Cmnd_bst[3]; + Cmnd_bst[3] = Cmnd_bst[4]; + Cmnd_bst[4] = Cmnd_bst[5]; + Cmnd_bst[5] = Cmnd_bst[6]; + Cmnd_bst[6] = 1'b0; + + // Terminate a Read regardless of banks + if (Cmnd_bst[0] === 1'b1 && Data_out_enable === 1'b1) begin + Data_out_enable = 1'b0; + end + end + endtask + + // Dq and Dqs Drivers + task Dq_Dqs_Drivers; + begin + // read command pipeline + Read_cmnd [0] = Read_cmnd [1]; + Read_cmnd [1] = Read_cmnd [2]; + Read_cmnd [2] = Read_cmnd [3]; + Read_cmnd [3] = Read_cmnd [4]; + Read_cmnd [4] = Read_cmnd [5]; + Read_cmnd [5] = Read_cmnd [6]; + Read_cmnd [6] = 1'b0; + + // read bank pipeline + Read_bank [0] = Read_bank [1]; + Read_bank [1] = Read_bank [2]; + Read_bank [2] = Read_bank [3]; + Read_bank [3] = Read_bank [4]; + Read_bank [4] = Read_bank [5]; + Read_bank [5] = Read_bank [6]; + Read_bank [6] = 2'b0; + + // read column pipeline + Read_cols [0] = Read_cols [1]; + Read_cols [1] = Read_cols [2]; + Read_cols [2] = Read_cols [3]; + Read_cols [3] = Read_cols [4]; + Read_cols [4] = Read_cols [5]; + Read_cols [5] = Read_cols [6]; + Read_cols [6] = 0; + + // Initialize Read command + if (Read_cmnd [0] === 1'b1) begin + Data_out_enable = 1'b1; + Bank_addr = Read_bank [0]; + Cols_addr = Read_cols [0]; + Cols_brst = Cols_addr [2 : 0]; + Burst_counter = 0; + + // Row Address Mux + case (Bank_addr) + 2'd0 : Rows_addr = B0_row_addr; + 2'd1 : Rows_addr = B1_row_addr; + 2'd2 : Rows_addr = B2_row_addr; + 2'd3 : Rows_addr = B3_row_addr; + default : $display ("%m: At time %t ERROR: Invalid Bank Address", $time); + endcase + end + + // Toggle Dqs during Read command + if (Data_out_enable === 1'b1) begin + Dqs_int = 1'b0; + if (Dqs_out === {DQS_BITS{1'b0}}) begin + Dqs_out = {DQS_BITS{1'b1}}; + end else if (Dqs_out === {DQS_BITS{1'b1}}) begin + Dqs_out = {DQS_BITS{1'b0}}; + end else begin + Dqs_out = {DQS_BITS{1'b0}}; + end + end else if (Data_out_enable === 1'b0 && Dqs_int === 1'b0) begin + Dqs_out = {DQS_BITS{1'bz}}; + end + + // Initialize dqs for Read command + if (Read_cmnd [2] === 1'b1) begin + if (Data_out_enable === 1'b0) begin + Dqs_int = 1'b1; + Dqs_out = {DQS_BITS{1'b0}}; + end + end + + // Read latch + if (Data_out_enable === 1'b1) begin + // output data + read_mem({Bank_addr, Rows_addr, Cols_addr}, Dq_out); + if (DEBUG) begin + $display ("%m: At time %t READ : Bank = %h, Row = %h, Col = %h, Data = %h", $time, Bank_addr, Rows_addr, Cols_addr, Dq_out); + end + end else begin + Dq_out = {DQ_BITS{1'bz}}; + end + end + endtask + + // Write FIFO and DM Mask Logic + task Write_FIFO_DM_Mask_Logic; + begin + // Write command pipeline + Write_cmnd [0] = Write_cmnd [1]; + Write_cmnd [1] = Write_cmnd [2]; + Write_cmnd [2] = Write_cmnd [3]; + Write_cmnd [3] = 1'b0; + + // Write command pipeline + Write_bank [0] = Write_bank [1]; + Write_bank [1] = Write_bank [2]; + Write_bank [2] = Write_bank [3]; + Write_bank [3] = 2'b0; + + // Write column pipeline + Write_cols [0] = Write_cols [1]; + Write_cols [1] = Write_cols [2]; + Write_cols [2] = Write_cols [3]; + Write_cols [3] = {COL_BITS{1'b0}}; + + // Initialize Write command + if (Write_cmnd [0] === 1'b1) begin + Data_in_enable = 1'b1; + Bank_addr = Write_bank [0]; + Cols_addr = Write_cols [0]; + Cols_brst = Cols_addr [2 : 0]; + Burst_counter = 0; + + // Row address mux + case (Bank_addr) + 2'd0 : Rows_addr = B0_row_addr; + 2'd1 : Rows_addr = B1_row_addr; + 2'd2 : Rows_addr = B2_row_addr; + 2'd3 : Rows_addr = B3_row_addr; + default : $display ("%m: At time %t ERROR: Invalid Row Address", $time); + endcase + end + + // Write data + if (Data_in_enable === 1'b1) begin + + // Data Buffer + read_mem({Bank_addr, Rows_addr, Cols_addr}, Dq_buf); + + // write negedge Dqs on posedge Sys_clk + if (Sys_clk) begin + if (!dm_fall[0]) begin + Dq_buf [ 7 : 0] = dq_fall [ 7 : 0]; + end + if (!dm_fall[1]) begin + Dq_buf [15 : 8] = dq_fall [15 : 8]; + end + if (!dm_fall[2]) begin + Dq_buf [23 : 16] = dq_fall [23 : 16]; + end + if (!dm_fall[3]) begin + Dq_buf [31 : 24] = dq_fall [31 : 24]; + end + if (~&dm_fall) begin + if (DEBUG) begin + $display ("%m: At time %t WRITE: Bank = %h, Row = %h, Col = %h, Data = %h", $time, Bank_addr, Rows_addr, Cols_addr, Dq_buf[DQ_BITS-1:0]); + end + end + // write posedge Dqs on negedge Sys_clk + end else begin + if (!dm_rise[0]) begin + Dq_buf [ 7 : 0] = dq_rise [ 7 : 0]; + end + if (!dm_rise[1]) begin + Dq_buf [15 : 8] = dq_rise [15 : 8]; + end + if (!dm_rise[2]) begin + Dq_buf [23 : 16] = dq_rise [23 : 16]; + end + if (!dm_rise[3]) begin + Dq_buf [31 : 24] = dq_rise [31 : 24]; + end + if (~&dm_rise) begin + if (DEBUG) begin + $display ("%m: At time %t WRITE: Bank = %h, Row = %h, Col = %h, Data = %h", $time, Bank_addr, Rows_addr, Cols_addr, Dq_buf[DQ_BITS-1:0]); + end + end + end + + // Write Data + write_mem({Bank_addr, Rows_addr, Cols_addr}, Dq_buf); + + // tWR start and tWTR check + if (Sys_clk && &dm_pair === 1'b0) begin + case (Bank_addr) + 2'd0 : WR_chk0 = $time; + 2'd1 : WR_chk1 = $time; + 2'd2 : WR_chk2 = $time; + 2'd3 : WR_chk3 = $time; + default : $display ("%m: At time %t ERROR: Invalid Bank Address (tWR)", $time); + endcase + + // tWTR check + if (Read_enable === 1'b1) begin + $display ("%m: At time %t ERROR: tWTR violation during Read", $time); + end + end + end + end + endtask + + // Auto Precharge Calculation + task Auto_Precharge_Calculation; + begin + // Precharge counter + if (Read_precharge [0] === 1'b1 || Write_precharge [0] === 1'b1) begin + Count_precharge [0] = Count_precharge [0] + 1; + end + if (Read_precharge [1] === 1'b1 || Write_precharge [1] === 1'b1) begin + Count_precharge [1] = Count_precharge [1] + 1; + end + if (Read_precharge [2] === 1'b1 || Write_precharge [2] === 1'b1) begin + Count_precharge [2] = Count_precharge [2] + 1; + end + if (Read_precharge [3] === 1'b1 || Write_precharge [3] === 1'b1) begin + Count_precharge [3] = Count_precharge [3] + 1; + end + + // Read with AutoPrecharge Calculation + // The device start internal precharge when: + // 1. Meet tRAS requirement + // 2. BL/2 cycles after command + if ((Read_precharge[0] === 1'b1) && ($time - RAS_chk0 >= tRAS)) begin + if (Count_precharge[0] >= burst_length/2) begin + Pc_b0 = 1'b1; + Act_b0 = 1'b0; + RP_chk0 = $time; + Read_precharge[0] = 1'b0; + end + end + if ((Read_precharge[1] === 1'b1) && ($time - RAS_chk1 >= tRAS)) begin + if (Count_precharge[1] >= burst_length/2) begin + Pc_b1 = 1'b1; + Act_b1 = 1'b0; + RP_chk1 = $time; + Read_precharge[1] = 1'b0; + end + end + if ((Read_precharge[2] === 1'b1) && ($time - RAS_chk2 >= tRAS)) begin + if (Count_precharge[2] >= burst_length/2) begin + Pc_b2 = 1'b1; + Act_b2 = 1'b0; + RP_chk2 = $time; + Read_precharge[2] = 1'b0; + end + end + if ((Read_precharge[3] === 1'b1) && ($time - RAS_chk3 >= tRAS)) begin + if (Count_precharge[3] >= burst_length/2) begin + Pc_b3 = 1'b1; + Act_b3 = 1'b0; + RP_chk3 = $time; + Read_precharge[3] = 1'b0; + end + end + + // Write with AutoPrecharge Calculation + // The device start internal precharge when: + // 1. Meet tRAS requirement + // 2. Write Latency PLUS BL/2 cycles PLUS tWR after Write command + + if ((Write_precharge[0] === 1'b1) && ($time - RAS_chk0 >= tRAS)) begin + if ((Count_precharge[0] >= burst_length/2+1) && ($time - WR_chk0 >= tWR)) begin + Pc_b0 = 1'b1; + Act_b0 = 1'b0; + RP_chk0 = $time; + Write_precharge[0] = 1'b0; + end + end + if ((Write_precharge[1] === 1'b1) && ($time - RAS_chk1 >= tRAS)) begin + if ((Count_precharge[1] >= burst_length/2+1) && ($time - WR_chk1 >= tWR)) begin + Pc_b1 = 1'b1; + Act_b1 = 1'b0; + RP_chk1 = $time; + Write_precharge[1] = 1'b0; + end + end + if ((Write_precharge[2] === 1'b1) && ($time - RAS_chk2 >= tRAS)) begin + if ((Count_precharge[2] >= burst_length/2+1) && ($time - WR_chk2 >= tWR)) begin + Pc_b2 = 1'b1; + Act_b2 = 1'b0; + RP_chk2 = $time; + Write_precharge[2] = 1'b0; + end + end + if ((Write_precharge[3] === 1'b1) && ($time - RAS_chk3 >= tRAS)) begin + if ((Count_precharge[3] >= burst_length/2+1) && ($time - WR_chk3 >= tWR)) begin + Pc_b3 = 1'b1; + Act_b3 = 1'b0; + RP_chk3 = $time; + Write_precharge[3] = 1'b0; + end + end + end + endtask + + // DLL Counter + task DLL_Counter; + begin + if (DLL_reset === 1'b1 && DLL_done === 1'b0) begin + DLL_count = DLL_count + 1; + if (DLL_count >= 200) begin + DLL_done = 1'b1; + end + end + end + endtask + + // Control Logic + task Control_Logic; + begin + // Auto Refresh + if (Aref_enable === 1'b1) begin + // Display DEBUG Message + if (DEBUG) begin + $display ("%m: At time %t AREF : Auto Refresh", $time); + end + + // Precharge to Auto Refresh + if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || + ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin + $display ("%m: At time %t ERROR: tRP violation during Auto Refresh", $time); + end + + // LMR/EMR to Auto Refresh + if ($time - MRD_chk < tMRD) begin + $display ("%m: At time %t ERROR: tMRD violation during Auto Refresh", $time); + end + + // Auto Refresh to Auto Refresh + if ($time - RFC_chk < tRFC) begin + $display ("%m: At time %t ERROR: tRFC violation during Auto Refresh", $time); + end + + // Precharge to Auto Refresh + if (Pc_b0 === 1'b0 || Pc_b1 === 1'b0 || Pc_b2 === 1'b0 || Pc_b3 === 1'b0) begin + $display ("%m: At time %t ERROR: All banks must be Precharged before Auto Refresh", $time); + if (!no_halt) $stop (0); + end else begin + aref_count = aref_count + 1; + RFC_chk = $time; + end + end + + // Extended Mode Register + if (Ext_mode_enable === 1'b1) begin + if (DEBUG) begin + $display ("%m: At time %t EMR : Extended Mode Register", $time); + end + + // Precharge to LMR/EMR + if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || + ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin + $display ("%m: At time %t ERROR: tRP violation during Extended Mode Register", $time); + end + + // LMR/EMR to LMR/EMR + if ($time - MRD_chk < tMRD) begin + $display ("%m: At time %t ERROR: tMRD violation during Extended Mode Register", $time); + end + + // Auto Refresh to LMR/EMR + if ($time - RFC_chk < tRFC) begin + $display ("%m: At time %t ERROR: tRFC violation during Extended Mode Register", $time); + end + + // Precharge to LMR/EMR + if (Pc_b0 === 1'b0 || Pc_b1 === 1'b0 || Pc_b2 === 1'b0 || Pc_b3 === 1'b0) begin + $display ("%m: At time %t ERROR: all banks must be Precharged before Extended Mode Register", $time); + if (!no_halt) $stop (0); + end else begin + if (Addr[0] === 1'b0) begin + DLL_enable = 1'b1; + if (DEBUG) begin + $display ("%m: At time %t EMR : Enable DLL", $time); + end + end else begin + DLL_enable = 1'b0; + if (DEBUG) begin + $display ("%m: At time %t EMR : Disable DLL", $time); + end + end + MRD_chk = $time; + end + end + + // Load Mode Register + if (Mode_reg_enable === 1'b1) begin + if (DEBUG) begin + $display ("%m: At time %t LMR : Load Mode Register", $time); + end + + // Precharge to LMR/EMR + if (($time - RP_chk0 < tRP) || ($time - RP_chk1 < tRP) || + ($time - RP_chk2 < tRP) || ($time - RP_chk3 < tRP)) begin + $display ("%m: At time %t ERROR: tRP violation during Load Mode Register", $time); + end + + // LMR/EMR to LMR/EMR + if ($time - MRD_chk < tMRD) begin + $display ("%m: At time %t ERROR: tMRD violation during Load Mode Register", $time); + end + + // Auto Refresh to LMR/EMR + if ($time - RFC_chk < tRFC) begin + $display ("%m: At time %t ERROR: tRFC violation during Load Mode Register", $time); + end + + // Precharge to LMR/EMR + if (Pc_b0 === 1'b0 || Pc_b1 === 1'b0 || Pc_b2 === 1'b0 || Pc_b3 === 1'b0) begin + $display ("%m: At time %t ERROR: all banks must be Precharged before Load Mode Register", $time); + end else begin + // Register Mode + Mode_reg = Addr; + + // DLL Reset + if (DLL_enable === 1'b1 && Addr [8] === 1'b1) begin + DLL_reset = 1'b1; + DLL_done = 1'b0; + DLL_count = 0; + end else if (DLL_enable === 1'b1 && DLL_reset === 1'b0 && Addr [8] === 1'b0) begin + $display ("%m: At time %t ERROR: DLL is ENABLE: DLL RESET is required.", $time); + end else if (DLL_enable === 1'b0 && Addr [8] === 1'b1) begin + $display ("%m: At time %t ERROR: DLL is DISABLE: DLL RESET will be ignored.", $time); + end + + // Burst Length + case (Addr [2 : 0]) + 3'b001 : $display ("%m: At time %t LMR : Burst Length = 2", $time); + 3'b010 : $display ("%m: At time %t LMR : Burst Length = 4", $time); + 3'b011 : $display ("%m: At time %t LMR : Burst Length = 8", $time); + default : $display ("%m: At time %t ERROR: Burst Length not supported", $time); + endcase + + // CAS Latency + case (Addr [6 : 4]) + 3'b010 : $display ("%m: At time %t LMR : CAS Latency = 2", $time); + 3'b110 : $display ("%m: At time %t LMR : CAS Latency = 2.5", $time); + 3'b011 : $display ("%m: At time %t LMR : CAS Latency = 3", $time); + default : $display ("%m: At time %t ERROR: CAS Latency not supported", $time); + endcase + + // Record current tMRD time + MRD_chk = $time; + end + end + + // Activate Block + if (Active_enable === 1'b1) begin + if (!(power_up_done)) begin + $display ("%m: %m: at time %t ERROR: Power Up and Initialization Sequence not completed before executing Activate command", $time); + end + // Display DEBUG Message + if (DEBUG) begin + $display ("%m: At time %t ACT : Bank = %h, Row = %h", $time, Ba, Addr); + end + + // Activate to Activate (different bank) + if ((Prev_bank != Ba) && ($time - RRD_chk < tRRD)) begin + $display ("%m: At time %t ERROR: tRRD violation during Activate bank %h", $time, Ba); + end + + // LMR/EMR to Activate + if ($time - MRD_chk < tMRD) begin + $display ("%m: At time %t ERROR: tMRD violation during Activate bank %h", $time, Ba); + end + + // AutoRefresh to Activate + if ($time - RFC_chk < tRFC) begin + $display ("%m: At time %t ERROR: tRFC violation during Activate bank %h", $time, Ba); + end + + // Precharge to Activate + if ((Ba === 2'b00 && Pc_b0 === 1'b0) || (Ba === 2'b01 && Pc_b1 === 1'b0) || + (Ba === 2'b10 && Pc_b2 === 1'b0) || (Ba === 2'b11 && Pc_b3 === 1'b0)) begin + $display ("%m: At time %t ERROR: Bank = %h is already activated - Command Ignored", $time, Ba); + if (!no_halt) $stop (0); + end else begin + // Activate Bank 0 + if (Ba === 2'b00 && Pc_b0 === 1'b1) begin + // Activate to Activate (same bank) + if ($time - RC_chk0 < tRC) begin + $display ("%m: At time %t ERROR: tRC violation during Activate bank %h", $time, Ba); + end + + // Precharge to Activate + if ($time - RP_chk0 < tRP) begin + $display ("%m: At time %t ERROR: tRP violation during Activate bank %h", $time, Ba); + end + + // Record variables for checking violation + Act_b0 = 1'b1; + Pc_b0 = 1'b0; + B0_row_addr = Addr; + RC_chk0 = $time; + RCD_chk0 = $time; + RAS_chk0 = $time; + RAP_chk0 = $time; + end + + // Activate Bank 1 + if (Ba === 2'b01 && Pc_b1 === 1'b1) begin + // Activate to Activate (same bank) + if ($time - RC_chk1 < tRC) begin + $display ("%m: At time %t ERROR: tRC violation during Activate bank %h", $time, Ba); + end + + // Precharge to Activate + if ($time - RP_chk1 < tRP) begin + $display ("%m: At time %t ERROR: tRP violation during Activate bank %h", $time, Ba); + end + + // Record variables for checking violation + Act_b1 = 1'b1; + Pc_b1 = 1'b0; + B1_row_addr = Addr; + RC_chk1 = $time; + RCD_chk1 = $time; + RAS_chk1 = $time; + RAP_chk1 = $time; + end + + // Activate Bank 2 + if (Ba === 2'b10 && Pc_b2 === 1'b1) begin + // Activate to Activate (same bank) + if ($time - RC_chk2 < tRC) begin + $display ("%m: At time %t ERROR: tRC violation during Activate bank %h", $time, Ba); + end + + // Precharge to Activate + if ($time - RP_chk2 < tRP) begin + $display ("%m: At time %t ERROR: tRP violation during Activate bank %h", $time, Ba); + end + + // Record variables for checking violation + Act_b2 = 1'b1; + Pc_b2 = 1'b0; + B2_row_addr = Addr; + RC_chk2 = $time; + RCD_chk2 = $time; + RAS_chk2 = $time; + RAP_chk2 = $time; + end + + // Activate Bank 3 + if (Ba === 2'b11 && Pc_b3 === 1'b1) begin + // Activate to Activate (same bank) + if ($time - RC_chk3 < tRC) begin + $display ("%m: At time %t ERROR: tRC violation during Activate bank %h", $time, Ba); + end + + // Precharge to Activate + if ($time - RP_chk3 < tRP) begin + $display ("%m: At time %t ERROR: tRP violation during Activate bank %h", $time, Ba); + end + + // Record variables for checking violation + Act_b3 = 1'b1; + Pc_b3 = 1'b0; + B3_row_addr = Addr; + RC_chk3 = $time; + RCD_chk3 = $time; + RAS_chk3 = $time; + RAP_chk3 = $time; + end + // Record variable for checking violation + RRD_chk = $time; + Prev_bank = Ba; + read_precharge_truncation[Ba] = 1'b0; + end + end + + // Precharge Block - consider NOP if bank already precharged or in process of precharging + if (Prech_enable === 1'b1) begin + // Display DEBUG Message + if (DEBUG) begin + $display ("%m: At time %t PRE : Addr[10] = %b, Bank = %b", $time, Addr[10], Ba); + end + + // LMR/EMR to Precharge + if ($time - MRD_chk < tMRD) begin + $display ("%m: At time %t ERROR: tMRD violation during Precharge", $time); + if (!no_halt) $stop (0); + end + + // AutoRefresh to Precharge + if ($time - RFC_chk < tRFC) begin + $display ("%m: At time %t ERROR: tRFC violation during Precharge", $time); + if (!no_halt) $stop (0); + end + + // Precharge bank 0 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b00)) && Act_b0 === 1'b1) begin + Act_b0 = 1'b0; + Pc_b0 = 1'b1; + RP_chk0 = $time; + + // Activate to Precharge Bank + if ($time - RAS_chk0 < tRAS) begin + $display ("%m: At time %t ERROR: tRAS violation during Precharge", $time); + if (!no_halt) $stop (0); + end + + // tWR violation check for Write + if ($time - WR_chk0 < tWR) begin + $display ("%m: At time %t ERROR: tWR violation during Precharge", $time); + if (!no_halt) $stop (0); + end + end + + // Precharge bank 1 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b01)) && Act_b1 === 1'b1) begin + Act_b1 = 1'b0; + Pc_b1 = 1'b1; + RP_chk1 = $time; + + // Activate to Precharge Bank 1 + if ($time - RAS_chk1 < tRAS) begin + $display ("%m: At time %t ERROR: tRAS violation during Precharge", $time); + if (!no_halt) $stop (0); + end + + // tWR violation check for Write + if ($time - WR_chk1 < tWR) begin + $display ("%m: At time %t ERROR: tWR violation during Precharge", $time); + if (!no_halt) $stop (0); + end + end + + // Precharge bank 2 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b10)) && Act_b2 === 1'b1) begin + Act_b2 = 1'b0; + Pc_b2 = 1'b1; + RP_chk2 = $time; + + // Activate to Precharge Bank 2 + if ($time - RAS_chk2 < tRAS) begin + $display ("%m: At time %t ERROR: tRAS violation during Precharge", $time); + if (!no_halt) $stop (0); + end + + // tWR violation check for Write + if ($time - WR_chk2 < tWR) begin + $display ("%m: At time %t ERROR: tWR violation during Precharge", $time); + if (!no_halt) $stop (0); + end + end + + // Precharge bank 3 + if ((Addr[10] === 1'b1 || (Addr[10] === 1'b0 && Ba === 2'b11)) && Act_b3 === 1'b1) begin + Act_b3 = 1'b0; + Pc_b3 = 1'b1; + RP_chk3 = $time; + + // Activate to Precharge Bank 3 + if ($time - RAS_chk3 < tRAS) begin + $display ("%m: At time %t ERROR: tRAS violation during Precharge", $time); + if (!no_halt) $stop (0); + end + + // tWR violation check for Write + if ($time - WR_chk3 < tWR) begin + $display ("%m: At time %t ERROR: tWR violation during Precharge", $time); + if (!no_halt) $stop (0); + end + end + + // Prech_count is to make sure we have met part of the initialization sequence + Prech_count = Prech_count + 1; + + // Pipeline for READ + A10_precharge [cas_latency_x2] = Addr[10]; + Bank_precharge[cas_latency_x2] = Ba; + Cmnd_precharge[cas_latency_x2] = 1'b1; + end + + // Burst terminate + if (Burst_term === 1'b1) begin + // Display DEBUG Message + if (DEBUG) begin + $display ("%m: At time %t BST : Burst Terminate",$time); + end + + if (Data_in_enable === 1'b1) begin + // Illegal to burst terminate a Write + $display ("%m: At time %t ERROR: It's illegal to burst terminate a Write", $time); + if (!no_halt) $stop (0); + end else if (Read_precharge[0] === 1'b1 || Read_precharge[1] === 1'b1 || + // Illegal to burst terminate a Read with Auto Precharge + Read_precharge[2] === 1'b1 || Read_precharge[3] === 1'b1) begin + $display ("%m: At time %t ERROR: It's illegal to burst terminate a Read with Auto Precharge", $time); + if (!no_halt) $stop (0); + end else begin + // Burst Terminate Command Pipeline for Read + Cmnd_bst[cas_latency_x2] = 1'b1; + end + + end + + // Read Command + if (Read_enable === 1'b1) begin + if (!(power_up_done)) begin + $display ("%m: at time %t ERROR: Power Up and Initialization Sequence not completed before executing Read Command", $time); + end + // Check for DLL reset before Read + if (DLL_reset === 1 && DLL_done === 0) begin + $display ("%m: at time %t ERROR: You need to wait 200 tCK after DLL Reset Enable to Read, Not %0d clocks.", $time, DLL_count); + end + // Display DEBUG Message + if (DEBUG) begin + $display ("%m: At time %t READ : Bank = %h, Col = %h", $time, Ba, {Addr [11], Addr [9 : 0]}); + end + + // Terminate a Write + if (Data_in_enable === 1'b1) begin + Data_in_enable = 1'b0; + end + + // Activate to Read without Auto Precharge + if ((Addr [10] === 1'b0 && Ba === 2'b00 && $time - RCD_chk0 < tRCD) || + (Addr [10] === 1'b0 && Ba === 2'b01 && $time - RCD_chk1 < tRCD) || + (Addr [10] === 1'b0 && Ba === 2'b10 && $time - RCD_chk2 < tRCD) || + (Addr [10] === 1'b0 && Ba === 2'b11 && $time - RCD_chk3 < tRCD)) begin + $display("%m: At time %t ERROR: tRCD violation during Read", $time); + end + + // Activate to Read with Auto Precharge + if ((Addr [10] === 1'b1 && Ba === 2'b00 && $time - RAP_chk0 < tRAP) || + (Addr [10] === 1'b1 && Ba === 2'b01 && $time - RAP_chk1 < tRAP) || + (Addr [10] === 1'b1 && Ba === 2'b10 && $time - RAP_chk2 < tRAP) || + (Addr [10] === 1'b1 && Ba === 2'b11 && $time - RAP_chk3 < tRAP)) begin + $display ("%m: At time %t ERROR: tRAP violation during Read", $time); + end + + // Interrupt a Read with Auto Precharge (same bank only) + if (Read_precharge [Ba] === 1'b1) begin + $display ("%m: At time %t ERROR: It's illegal to interrupt a Read with Auto Precharge", $time); + if (!no_halt) $stop (0); + // Cancel Auto Precharge + if (Addr[10] === 1'b0) begin + Read_precharge [Ba]= 1'b0; + end + end + // Activate to Read + if ((Ba === 2'b00 && Pc_b0 === 1'b1) || (Ba === 2'b01 && Pc_b1 === 1'b1) || + (Ba === 2'b10 && Pc_b2 === 1'b1) || (Ba === 2'b11 && Pc_b3 === 1'b1)) begin + $display("%m: At time %t ERROR: Bank is not Activated for Read", $time); + if (!no_halt) $stop (0); + end else begin + // CAS Latency pipeline + Read_cmnd[cas_latency_x2] = 1'b1; + Read_bank[cas_latency_x2] = Ba; + Read_cols[cas_latency_x2] = {Addr [ADDR_BITS - 1 : 11], Addr [9 : 0]}; + // Auto Precharge + if (Addr[10] === 1'b1) begin + Read_precharge [Ba]= 1'b1; + Count_precharge [Ba]= 0; + end + end + end + + // Write Command + if (Write_enable === 1'b1) begin + if (!(power_up_done)) begin + $display ("%m: at time %t ERROR: Power Up and Initialization Sequence not completed before executing Write Command", $time); + if (!no_halt) $stop (0); + end + // display DEBUG message + if (DEBUG) begin + $display ("At time %t WRITE: Bank = %h, Col = %h", $time, Ba, {Addr [ADDR_BITS - 1 : 11], Addr [9 : 0]}); + end + + // Activate to Write + if ((Ba === 2'b00 && $time - RCD_chk0 < tRCD) || + (Ba === 2'b01 && $time - RCD_chk1 < tRCD) || + (Ba === 2'b10 && $time - RCD_chk2 < tRCD) || + (Ba === 2'b11 && $time - RCD_chk3 < tRCD)) begin + $display("%m: At time %t ERROR: tRCD violation during Write to Bank %h", $time, Ba); + end + + // Read to Write + if (Read_cmnd[0] || Read_cmnd[1] || Read_cmnd[2] || Read_cmnd[3] || + Read_cmnd[4] || Read_cmnd[5] || Read_cmnd[6] || (Burst_counter < burst_length)) begin + if (Data_out_enable || read_precharge_truncation[Ba]) begin + $display("%m: At time %t ERROR: Read to Write violation", $time); + end + end + + // Interrupt a Write with Auto Precharge (same bank only) + if (Write_precharge [Ba] === 1'b1) begin + $display ("At time %t ERROR: it's illegal to interrupt a Write with Auto Precharge", $time); + if (!no_halt) $stop (0); + // Cancel Auto Precharge + if (Addr[10] === 1'b0) begin + Write_precharge [Ba]= 1'b0; + end + end + // Activate to Write + if ((Ba === 2'b00 && Pc_b0 === 1'b1) || (Ba === 2'b01 && Pc_b1 === 1'b1) || + (Ba === 2'b10 && Pc_b2 === 1'b1) || (Ba === 2'b11 && Pc_b3 === 1'b1)) begin + $display("%m: At time %t ERROR: Bank is not Activated for Write", $time); + if (!no_halt) $stop (0); + end else begin + // Pipeline for Write + Write_cmnd [3] = 1'b1; + Write_bank [3] = Ba; + Write_cols [3] = {Addr [ADDR_BITS - 1 : 11], Addr [9 : 0]}; + // Auto Precharge + if (Addr[10] === 1'b1) begin + Write_precharge [Ba]= 1'b1; + Count_precharge [Ba]= 0; + end + end + end + end + endtask + + task check_neg_dqs; + begin + if (Write_cmnd[2] || Write_cmnd[1] || Data_in_enable) begin + for (i=0; i Q) = (100, 100); + if (C1) (C1 => Q) = (100, 100); + specparam PATHPULSE$ = 0; + + endspecify + +endmodule // ODDR2 + Index: hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc.v (revision 21) @@ -0,0 +1,298 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +module hpdmc #( + parameter csr_addr = 4'h0, + /* + * The depth of the SDRAM array, in bytes. + * Capacity (in bytes) is 2^sdram_depth. + */ + parameter sdram_depth = 26, + + /* + * The number of column address bits of the SDRAM. + */ + parameter sdram_columndepth = 9 +) ( + input sys_clk, + input sys_clk_n, + /* + * Clock used to generate DQS. + * Typically sys_clk phased out by 90 degrees, + * as data is sent synchronously to sys_clk. + */ + input dqs_clk, + input dqs_clk_n, + + input sys_rst, + + /* Control interface */ + input [13:0] csr_a, + input csr_we, + input [31:0] csr_di, + output [31:0] csr_do, + + /* Simple FML 4x64 interface to the memory contents */ + input [sdram_depth-1:0] fml_adr, + input fml_stb, + input fml_we, + output fml_ack, + input [7:0] fml_sel, + input [63:0] fml_di, + output [63:0] fml_do, + + /* SDRAM interface. + * The SDRAM clock should be driven synchronously to the system clock. + * It is not generated inside this core so you can take advantage of + * architecture-dependent clocking resources to generate a clean + * differential clock. + */ + output reg sdram_cke, + output reg sdram_cs_n, + output reg sdram_we_n, + output reg sdram_cas_n, + output reg sdram_ras_n, + output reg [12:0] sdram_adr, + output reg [1:0] sdram_ba, + + output [3:0] sdram_dm, + inout [31:0] sdram_dq, + inout [3:0] sdram_dqs, + + /* Interface to the DCM generating DQS */ + output dqs_psen, + output dqs_psincdec, + input dqs_psdone, + + input [1:0] pll_stat +); + +/* Register all control signals, leaving the possibility to use IOB registers */ +wire sdram_cke_r; +wire sdram_cs_n_r; +wire sdram_we_n_r; +wire sdram_cas_n_r; +wire sdram_ras_n_r; +wire [12:0] sdram_adr_r; +wire [1:0] sdram_ba_r; + +always @(posedge sys_clk) begin + sdram_cke <= sdram_cke_r; + sdram_cs_n <= sdram_cs_n_r; + sdram_we_n <= sdram_we_n_r; + sdram_cas_n <= sdram_cas_n_r; + sdram_ras_n <= sdram_ras_n_r; + sdram_ba <= sdram_ba_r; + sdram_adr <= sdram_adr_r; +end + +/* Mux the control signals according to the "bypass" selection. + * CKE always comes from the control interface. + */ +wire bypass; + +wire sdram_cs_n_bypass; +wire sdram_we_n_bypass; +wire sdram_cas_n_bypass; +wire sdram_ras_n_bypass; +wire [12:0] sdram_adr_bypass; +wire [1:0] sdram_ba_bypass; + +wire sdram_cs_n_mgmt; +wire sdram_we_n_mgmt; +wire sdram_cas_n_mgmt; +wire sdram_ras_n_mgmt; +wire [12:0] sdram_adr_mgmt; +wire [1:0] sdram_ba_mgmt; + +assign sdram_cs_n_r = bypass ? sdram_cs_n_bypass : sdram_cs_n_mgmt; +assign sdram_we_n_r = bypass ? sdram_we_n_bypass : sdram_we_n_mgmt; +assign sdram_cas_n_r = bypass ? sdram_cas_n_bypass : sdram_cas_n_mgmt; +assign sdram_ras_n_r = bypass ? sdram_ras_n_bypass : sdram_ras_n_mgmt; +assign sdram_adr_r = bypass ? sdram_adr_bypass : sdram_adr_mgmt; +assign sdram_ba_r = bypass ? sdram_ba_bypass : sdram_ba_mgmt; + +/* Control interface */ +wire sdram_rst; + +wire [2:0] tim_rp; +wire [2:0] tim_rcd; +wire tim_cas; +wire [10:0] tim_refi; +wire [3:0] tim_rfc; +wire [1:0] tim_wr; + +wire idelay_rst; +wire idelay_ce; +wire idelay_inc; + +hpdmc_ctlif #( + .csr_addr(csr_addr) +) ctlif ( + .sys_clk(sys_clk), + .sys_rst(sys_rst), + + .csr_a(csr_a), + .csr_we(csr_we), + .csr_di(csr_di), + .csr_do(csr_do), + + .bypass(bypass), + .sdram_rst(sdram_rst), + + .sdram_cke(sdram_cke_r), + .sdram_cs_n(sdram_cs_n_bypass), + .sdram_we_n(sdram_we_n_bypass), + .sdram_cas_n(sdram_cas_n_bypass), + .sdram_ras_n(sdram_ras_n_bypass), + .sdram_adr(sdram_adr_bypass), + .sdram_ba(sdram_ba_bypass), + + .tim_rp(tim_rp), + .tim_rcd(tim_rcd), + .tim_cas(tim_cas), + .tim_refi(tim_refi), + .tim_rfc(tim_rfc), + .tim_wr(tim_wr), + + .idelay_rst(idelay_rst), + .idelay_ce(idelay_ce), + .idelay_inc(idelay_inc), + + .dqs_psen(dqs_psen), + .dqs_psincdec(dqs_psincdec), + .dqs_psdone(dqs_psdone), + + .pll_stat(pll_stat) +); + +/* SDRAM management unit */ +wire mgmt_stb; +wire mgmt_we; +wire [sdram_depth-3-1:0] mgmt_address; +wire mgmt_ack; + +wire read; +wire write; +wire [3:0] concerned_bank; +wire read_safe; +wire write_safe; +wire [3:0] precharge_safe; + +hpdmc_mgmt #( + .sdram_depth(sdram_depth), + .sdram_columndepth(sdram_columndepth) +) mgmt ( + .sys_clk(sys_clk), + .sdram_rst(sdram_rst), + + .tim_rp(tim_rp), + .tim_rcd(tim_rcd), + .tim_refi(tim_refi), + .tim_rfc(tim_rfc), + + .stb(mgmt_stb), + .we(mgmt_we), + .address(mgmt_address), + .ack(mgmt_ack), + + .read(read), + .write(write), + .concerned_bank(concerned_bank), + .read_safe(read_safe), + .write_safe(write_safe), + .precharge_safe(precharge_safe), + + .sdram_cs_n(sdram_cs_n_mgmt), + .sdram_we_n(sdram_we_n_mgmt), + .sdram_cas_n(sdram_cas_n_mgmt), + .sdram_ras_n(sdram_ras_n_mgmt), + .sdram_adr(sdram_adr_mgmt), + .sdram_ba(sdram_ba_mgmt) +); + +/* Bus interface */ +wire data_ack; + +hpdmc_busif #( + .sdram_depth(sdram_depth) +) busif ( + .sys_clk(sys_clk), + .sdram_rst(sdram_rst), + + .fml_adr(fml_adr), + .fml_stb(fml_stb), + .fml_we(fml_we), + .fml_ack(fml_ack), + + .mgmt_stb(mgmt_stb), + .mgmt_we(mgmt_we), + .mgmt_address(mgmt_address), + .mgmt_ack(mgmt_ack), + + .data_ack(data_ack) +); + +/* Data path controller */ +wire direction; +wire direction_r; + +hpdmc_datactl datactl( + .sys_clk(sys_clk), + .sdram_rst(sdram_rst), + + .read(read), + .write(write), + .concerned_bank(concerned_bank), + .read_safe(read_safe), + .write_safe(write_safe), + .precharge_safe(precharge_safe), + + .ack(data_ack), + .direction(direction), + .direction_r(direction_r), + + .tim_cas(tim_cas), + .tim_wr(tim_wr) +); + +/* Data path */ +hpdmc_ddrio ddrio( + .sys_clk(sys_clk), + .sys_clk_n(sys_clk_n), + .dqs_clk(dqs_clk), + .dqs_clk_n(dqs_clk_n), + + .direction(direction), + .direction_r(direction_r), + /* Bit meaning is the opposite between + * the FML selection signal and SDRAM DM pins. + */ + .mo(~fml_sel), + .do(fml_di), + .di(fml_do), + + .sdram_dm(sdram_dm), + .sdram_dq(sdram_dq), + .sdram_dqs(sdram_dqs), + + .idelay_rst(idelay_rst), + .idelay_ce(idelay_ce), + .idelay_inc(idelay_inc) +); + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_ctlif.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_ctlif.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_ctlif.v (revision 21) @@ -0,0 +1,157 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +module hpdmc_ctlif #( + parameter csr_addr = 4'h0 +) ( + input sys_clk, + input sys_rst, + + input [13:0] csr_a, + input csr_we, + input [31:0] csr_di, + output reg [31:0] csr_do, + + output reg bypass, + output reg sdram_rst, + + output reg sdram_cke, + output reg sdram_cs_n, + output reg sdram_we_n, + output reg sdram_cas_n, + output reg sdram_ras_n, + output reg [12:0] sdram_adr, + output reg [1:0] sdram_ba, + + /* Clocks we must wait following a PRECHARGE command (usually tRP). */ + output reg [2:0] tim_rp, + /* Clocks we must wait following an ACTIVATE command (usually tRCD). */ + output reg [2:0] tim_rcd, + /* CAS latency, 0 = 2 */ + output reg tim_cas, + /* Auto-refresh period (usually tREFI). */ + output reg [10:0] tim_refi, + /* Clocks we must wait following an AUTO REFRESH command (usually tRFC). */ + output reg [3:0] tim_rfc, + /* Clocks we must wait following the last word written to the SDRAM (usually tWR). */ + output reg [1:0] tim_wr, + + output reg idelay_rst, + output reg idelay_ce, + output reg idelay_inc, + + output reg dqs_psen, + output reg dqs_psincdec, + input dqs_psdone, + + input [1:0] pll_stat +); + +reg psready; +always @(posedge sys_clk) begin + if(dqs_psdone) + psready <= 1'b1; + else if(dqs_psen) + psready <= 1'b0; +end + +wire csr_selected = csr_a[13:10] == csr_addr; + +/* Double-latching on pll_stat (asynchronous) */ +reg [1:0] pll_stat1; +reg [1:0] pll_stat2; +always @(posedge sys_clk) begin + pll_stat1 <= pll_stat; + pll_stat2 <= pll_stat1; +end + +always @(posedge sys_clk) begin + if(sys_rst) begin + csr_do <= 32'd0; + + bypass <= 1'b1; + sdram_rst <= 1'b1; + + sdram_cke <= 1'b0; + sdram_adr <= 13'd0; + sdram_ba <= 2'd0; + + tim_rp <= 3'd2; + tim_rcd <= 3'd2; + tim_cas <= 1'b0; + tim_refi <= 11'd740; + tim_rfc <= 4'd8; + tim_wr <= 2'd2; + end else begin + sdram_cs_n <= 1'b1; + sdram_we_n <= 1'b1; + sdram_cas_n <= 1'b1; + sdram_ras_n <= 1'b1; + + idelay_rst <= 1'b0; + idelay_ce <= 1'b0; + idelay_inc <= 1'b0; + + dqs_psen <= 1'b0; + dqs_psincdec <= 1'b0; + + csr_do <= 32'd0; + if(csr_selected) begin + if(csr_we) begin + case(csr_a[1:0]) + 2'b00: begin + bypass <= csr_di[0]; + sdram_rst <= csr_di[1]; + sdram_cke <= csr_di[2]; + end + 2'b01: begin + sdram_cs_n <= ~csr_di[0]; + sdram_we_n <= ~csr_di[1]; + sdram_cas_n <= ~csr_di[2]; + sdram_ras_n <= ~csr_di[3]; + sdram_adr <= csr_di[16:4]; + sdram_ba <= csr_di[18:17]; + end + 2'b10: begin + tim_rp <= csr_di[2:0]; + tim_rcd <= csr_di[5:3]; + tim_cas <= csr_di[6]; + tim_refi <= csr_di[17:7]; + tim_rfc <= csr_di[21:18]; + tim_wr <= csr_di[23:22]; + end + 2'b11: begin + idelay_rst <= csr_di[0]; + idelay_ce <= csr_di[1]; + idelay_inc <= csr_di[2]; + + dqs_psen <= csr_di[3]; + dqs_psincdec <= csr_di[4]; + end + endcase + end + case(csr_a[1:0]) + 2'b00: csr_do <= {sdram_cke, sdram_rst, bypass}; + 2'b01: csr_do <= {sdram_ba, sdram_adr, 4'h0}; + 2'b10: csr_do <= {tim_wr, tim_rfc, tim_refi, tim_cas, tim_rcd, tim_rp}; + 2'b11: csr_do <= {pll_stat2, psready, 5'd0}; + endcase + end + end +end + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_mgmt.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_mgmt.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_mgmt.v (revision 21) @@ -0,0 +1,371 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +module hpdmc_mgmt #( + parameter sdram_depth = 26, + parameter sdram_columndepth = 9 +) ( + input sys_clk, + input sdram_rst, + + input [2:0] tim_rp, + input [2:0] tim_rcd, + input [10:0] tim_refi, + input [3:0] tim_rfc, + + input stb, + input we, + input [sdram_depth-3-1:0] address, /* in 64-bit words */ + output reg ack, + + output reg read, + output reg write, + output [3:0] concerned_bank, + input read_safe, + input write_safe, + input [3:0] precharge_safe, + + output sdram_cs_n, + output sdram_we_n, + output sdram_cas_n, + output sdram_ras_n, + output [12:0] sdram_adr, + output [1:0] sdram_ba +); + +/* + * Address Mapping : + * | ROW ADDRESS | BANK NUMBER | COL ADDRESS | for 32-bit words + * |depth-1 coldepth+2|coldepth+1 coldepth|coldepth-1 0| + * (depth for 32-bit words, which is sdram_depth-2) + */ + +parameter rowdepth = sdram_depth-2-1-(sdram_columndepth+2)+1; + +wire [sdram_depth-2-1:0] address32 = {address, 1'b0}; + +wire [sdram_columndepth-1:0] col_address = address32[sdram_columndepth-1:0]; +wire [1:0] bank_address = address32[sdram_columndepth+1:sdram_columndepth]; +wire [rowdepth-1:0] row_address = address32[sdram_depth-2-1:sdram_columndepth+2]; + +reg [3:0] bank_address_onehot; +always @(*) begin + case(bank_address) + 2'b00: bank_address_onehot <= 4'b0001; + 2'b01: bank_address_onehot <= 4'b0010; + 2'b10: bank_address_onehot <= 4'b0100; + 2'b11: bank_address_onehot <= 4'b1000; + endcase +end + +/* Track open rows */ +reg [3:0] has_openrow; +reg [rowdepth-1:0] openrows[0:3]; +reg [3:0] track_close; +reg [3:0] track_open; + +always @(posedge sys_clk) begin + if(sdram_rst) begin + has_openrow = 4'h0; + end else begin + has_openrow = (has_openrow | track_open) & ~track_close; + + if(track_open[0]) openrows[0] <= row_address; + if(track_open[1]) openrows[1] <= row_address; + if(track_open[2]) openrows[2] <= row_address; + if(track_open[3]) openrows[3] <= row_address; + end +end + +/* Bank precharge safety */ +assign concerned_bank = bank_address_onehot; +wire current_precharge_safe = + (precharge_safe[0] | ~bank_address_onehot[0]) + &(precharge_safe[1] | ~bank_address_onehot[1]) + &(precharge_safe[2] | ~bank_address_onehot[2]) + &(precharge_safe[3] | ~bank_address_onehot[3]); + + +/* Check for page hits */ +wire bank_open = has_openrow[bank_address]; +wire page_hit = bank_open & (openrows[bank_address] == row_address); + +/* Address drivers */ +reg sdram_adr_loadrow; +reg sdram_adr_loadcol; +reg sdram_adr_loadA10; +assign sdram_adr = + ({13{sdram_adr_loadrow}} & row_address) + |({13{sdram_adr_loadcol}} & col_address) + |({13{sdram_adr_loadA10}} & 13'd1024); + +assign sdram_ba = bank_address; + +/* Command drivers */ +reg sdram_cs; +reg sdram_we; +reg sdram_cas; +reg sdram_ras; +assign sdram_cs_n = ~sdram_cs; +assign sdram_we_n = ~sdram_we; +assign sdram_cas_n = ~sdram_cas; +assign sdram_ras_n = ~sdram_ras; + +/* Timing counters */ + +/* The number of clocks we must wait following a PRECHARGE command (usually tRP). */ +reg [2:0] precharge_counter; +reg reload_precharge_counter; +wire precharge_done = (precharge_counter == 3'd0); +always @(posedge sys_clk) begin + if(reload_precharge_counter) + precharge_counter <= tim_rp; + else if(~precharge_done) + precharge_counter <= precharge_counter - 3'd1; +end + +/* The number of clocks we must wait following an ACTIVATE command (usually tRCD). */ +reg [2:0] activate_counter; +reg reload_activate_counter; +wire activate_done = (activate_counter == 3'd0); +always @(posedge sys_clk) begin + if(reload_activate_counter) + activate_counter <= tim_rcd; + else if(~activate_done) + activate_counter <= activate_counter - 3'd1; +end + +/* The number of clocks we have left before we must refresh one row in the SDRAM array (usually tREFI). */ +reg [10:0] refresh_counter; +reg reload_refresh_counter; +wire must_refresh = refresh_counter == 11'd0; +always @(posedge sys_clk) begin + if(sdram_rst) + refresh_counter <= 11'd0; + else begin + if(reload_refresh_counter) + refresh_counter <= tim_refi; + else if(~must_refresh) + refresh_counter <= refresh_counter - 11'd1; + end +end + +/* The number of clocks we must wait following an AUTO REFRESH command (usually tRFC). */ +reg [3:0] autorefresh_counter; +reg reload_autorefresh_counter; +wire autorefresh_done = (autorefresh_counter == 4'd0); +always @(posedge sys_clk) begin + if(reload_autorefresh_counter) + autorefresh_counter <= tim_rfc; + else if(~autorefresh_done) + autorefresh_counter <= autorefresh_counter - 4'd1; +end + +/* FSM that pushes commands into the SDRAM */ + +reg [3:0] state; +reg [3:0] next_state; + +parameter IDLE = 4'd0; +parameter ACTIVATE = 4'd1; +parameter READ = 4'd2; +parameter WRITE = 4'd3; +parameter PRECHARGEALL = 4'd4; +parameter AUTOREFRESH = 4'd5; +parameter AUTOREFRESH_WAIT = 4'd6; + +always @(posedge sys_clk) begin + if(sdram_rst) + state <= IDLE; + else begin + //$display("state: %d -> %d", state, next_state); + state <= next_state; + end +end + +always @(*) begin + next_state = state; + + reload_precharge_counter = 1'b0; + reload_activate_counter = 1'b0; + reload_refresh_counter = 1'b0; + reload_autorefresh_counter = 1'b0; + + sdram_cs = 1'b0; + sdram_we = 1'b0; + sdram_cas = 1'b0; + sdram_ras = 1'b0; + + sdram_adr_loadrow = 1'b0; + sdram_adr_loadcol = 1'b0; + sdram_adr_loadA10 = 1'b0; + + track_close = 4'b0000; + track_open = 4'b0000; + + read = 1'b0; + write = 1'b0; + + ack = 1'b0; + + case(state) + IDLE: begin + if(must_refresh) + next_state = PRECHARGEALL; + else begin + if(stb) begin + if(page_hit) begin + if(we) begin + if(write_safe) begin + /* Write */ + sdram_cs = 1'b1; + sdram_ras = 1'b0; + sdram_cas = 1'b1; + sdram_we = 1'b1; + sdram_adr_loadcol = 1'b1; + + write = 1'b1; + ack = 1'b1; + end + end else begin + if(read_safe) begin + /* Read */ + sdram_cs = 1'b1; + sdram_ras = 1'b0; + sdram_cas = 1'b1; + sdram_we = 1'b0; + sdram_adr_loadcol = 1'b1; + + read = 1'b1; + ack = 1'b1; + end + end + end else begin + if(bank_open) begin + if(current_precharge_safe) begin + /* Precharge Bank */ + sdram_cs = 1'b1; + sdram_ras = 1'b1; + sdram_cas = 1'b0; + sdram_we = 1'b1; + + track_close = bank_address_onehot; + reload_precharge_counter = 1'b1; + next_state = ACTIVATE; + end + end else begin + /* Activate */ + sdram_cs = 1'b1; + sdram_ras = 1'b1; + sdram_cas = 1'b0; + sdram_we = 1'b0; + sdram_adr_loadrow = 1'b1; + + track_open = bank_address_onehot; + reload_activate_counter = 1'b1; + if(we) + next_state = WRITE; + else + next_state = READ; + end + end + end + end + end + + ACTIVATE: begin + if(precharge_done) begin + sdram_cs = 1'b1; + sdram_ras = 1'b1; + sdram_cas = 1'b0; + sdram_we = 1'b0; + sdram_adr_loadrow = 1'b1; + + track_open = bank_address_onehot; + reload_activate_counter = 1'b1; + if(we) + next_state = WRITE; + else + next_state = READ; + end + end + READ: begin + if(activate_done) begin + if(read_safe) begin + sdram_cs = 1'b1; + sdram_ras = 1'b0; + sdram_cas = 1'b1; + sdram_we = 1'b0; + sdram_adr_loadcol = 1'b1; + + read = 1'b1; + ack = 1'b1; + next_state = IDLE; + end + end + end + WRITE: begin + if(activate_done) begin + if(write_safe) begin + sdram_cs = 1'b1; + sdram_ras = 1'b0; + sdram_cas = 1'b1; + sdram_we = 1'b1; + sdram_adr_loadcol = 1'b1; + + write = 1'b1; + ack = 1'b1; + next_state = IDLE; + end + end + end + + PRECHARGEALL: begin + if(precharge_safe == 4'b1111) begin + sdram_cs = 1'b1; + sdram_ras = 1'b1; + sdram_cas = 1'b0; + sdram_we = 1'b1; + sdram_adr_loadA10 = 1'b1; + + reload_precharge_counter = 1'b1; + + track_close = 4'b1111; + + next_state = AUTOREFRESH; + end + end + AUTOREFRESH: begin + if(precharge_done) begin + sdram_cs = 1'b1; + sdram_ras = 1'b1; + sdram_cas = 1'b1; + sdram_we = 1'b0; + reload_refresh_counter = 1'b1; + reload_autorefresh_counter = 1'b1; + next_state = AUTOREFRESH_WAIT; + end + end + AUTOREFRESH_WAIT: begin + if(autorefresh_done) + next_state = IDLE; + end + + endcase +end + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_busif.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_busif.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_busif.v (revision 21) @@ -0,0 +1,58 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* Simple FML interface for HPDMC */ + +module hpdmc_busif #( + parameter sdram_depth = 26 +) ( + input sys_clk, + input sdram_rst, + + input [sdram_depth-1:0] fml_adr, + input fml_stb, + input fml_we, + output fml_ack, + + output mgmt_stb, + output mgmt_we, + output [sdram_depth-3-1:0] mgmt_address, /* in 64-bit words */ + input mgmt_ack, + + input data_ack +); + +reg mgmt_stb_en; + +assign mgmt_stb = fml_stb & mgmt_stb_en; +assign mgmt_we = fml_we; +assign mgmt_address = fml_adr[sdram_depth-1:3]; + +assign fml_ack = data_ack; + +always @(posedge sys_clk) begin + if(sdram_rst) + mgmt_stb_en = 1'b1; + else begin + if(mgmt_ack) + mgmt_stb_en = 1'b0; + if(data_ack) + mgmt_stb_en = 1'b1; + end +end + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_datactl.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_datactl.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_datactl.v (revision 21) @@ -0,0 +1,216 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +module hpdmc_datactl( + input sys_clk, + input sdram_rst, + + input read, + input write, + input [3:0] concerned_bank, + output reg read_safe, + output reg write_safe, + output [3:0] precharge_safe, + + output reg ack, + output reg direction, + output direction_r, + + input tim_cas, + input [1:0] tim_wr +); + +/* + * read_safe: whether it is safe to register a Read command + * into the SDRAM at the next cycle. + */ + +reg [2:0] read_safe_counter; +always @(posedge sys_clk) begin + if(sdram_rst) begin + read_safe_counter <= 3'd0; + read_safe <= 1'b1; + end else begin + if(read) begin + read_safe_counter <= 3'd4; + read_safe <= 1'b0; + end else if(write) begin + /* after a write, read is unsafe for 5 cycles (4 transfers + tWTR=1) */ + read_safe_counter <= 3'd5; + read_safe <= 1'b0; + end else begin + if(read_safe_counter == 3'd1) + read_safe <= 1'b1; + if(~read_safe) + read_safe_counter <= read_safe_counter - 3'd1; + end + end +end + +/* + * write_safe: whether it is safe to register a Write command + * into the SDRAM at the next cycle. + */ + +reg [2:0] write_safe_counter; +always @(posedge sys_clk) begin + if(sdram_rst) begin + write_safe_counter <= 3'd0; + write_safe <= 1'b1; + end else begin + if(read) begin + write_safe_counter <= {1'b1, tim_cas, ~tim_cas}; + write_safe <= 1'b0; + end else if(write) begin + write_safe_counter <= 3'd3; + write_safe <= 1'b0; + end else begin + if(write_safe_counter == 3'd1) + write_safe <= 1'b1; + if(~write_safe) + write_safe_counter <= write_safe_counter - 3'd1; + end + end +end + +/* Generate ack signal. + * After write is asserted, it should pulse after 2 cycles. + * After read is asserted, it should pulse after CL+3 cycles, that is + * 5 cycles when tim_cas = 0 + * 6 cycles when tim_cas = 1 + */ + +reg ack_read3; +reg ack_read2; +reg ack_read1; +reg ack_read0; + +always @(posedge sys_clk) begin + if(sdram_rst) begin + ack_read3 <= 1'b0; + ack_read2 <= 1'b0; + ack_read1 <= 1'b0; + ack_read0 <= 1'b0; + end else begin + if(tim_cas) begin + ack_read3 <= read; + ack_read2 <= ack_read3; + ack_read1 <= ack_read2; + ack_read0 <= ack_read1; + end else begin + ack_read2 <= read; + ack_read1 <= ack_read2; + ack_read0 <= ack_read1; + end + end +end + +reg ack0; +always @(posedge sys_clk) begin + if(sdram_rst) begin + ack0 <= 1'b0; + ack <= 1'b0; + end else begin + ack0 <= ack_read0|write; + ack <= ack0; + end +end + +/* during a 4-word write, we drive the pins for 5 cycles + * and 1 cycle in advance (first word is invalid) + * so that we remove glitches on DQS without resorting + * to asynchronous logic. + */ + +/* direction must be glitch-free, as it directly drives the + * tri-state enable for DQ and DQS. + */ +reg write_d; +reg [2:0] counter_writedirection; +always @(posedge sys_clk) begin + if(sdram_rst) begin + counter_writedirection <= 3'd0; + direction <= 1'b0; + end else begin + if(write_d) begin + counter_writedirection <= 3'b101; + direction <= 1'b1; + end else begin + if(counter_writedirection == 3'b001) + direction <= 1'b0; + if(direction) + counter_writedirection <= counter_writedirection - 3'd1; + end + end +end + +assign direction_r = write_d|(|counter_writedirection); + +always @(posedge sys_clk) begin + if(sdram_rst) + write_d <= 1'b0; + else + write_d <= write; +end + +/* Counters that prevent a busy bank from being precharged */ +hpdmc_banktimer banktimer0( + .sys_clk(sys_clk), + .sdram_rst(sdram_rst), + + .tim_cas(tim_cas), + .tim_wr(tim_wr), + + .read(read & concerned_bank[0]), + .write(write & concerned_bank[0]), + .precharge_safe(precharge_safe[0]) +); +hpdmc_banktimer banktimer1( + .sys_clk(sys_clk), + .sdram_rst(sdram_rst), + + .tim_cas(tim_cas), + .tim_wr(tim_wr), + + .read(read & concerned_bank[1]), + .write(write & concerned_bank[1]), + .precharge_safe(precharge_safe[1]) +); +hpdmc_banktimer banktimer2( + .sys_clk(sys_clk), + .sdram_rst(sdram_rst), + + .tim_cas(tim_cas), + .tim_wr(tim_wr), + + .read(read & concerned_bank[2]), + .write(write & concerned_bank[2]), + .precharge_safe(precharge_safe[2]) +); +hpdmc_banktimer banktimer3( + .sys_clk(sys_clk), + .sdram_rst(sdram_rst), + + .tim_cas(tim_cas), + .tim_wr(tim_wr), + + .read(read & concerned_bank[3]), + .write(write & concerned_bank[3]), + .precharge_safe(precharge_safe[3]) +); + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_banktimer.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_banktimer.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/hpdmc_banktimer.v (revision 21) @@ -0,0 +1,57 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +module hpdmc_banktimer( + input sys_clk, + input sdram_rst, + + input tim_cas, + input [1:0] tim_wr, + + input read, + input write, + output reg precharge_safe +); + +reg [2:0] counter; +always @(posedge sys_clk) begin + if(sdram_rst) begin + counter <= 3'd0; + precharge_safe <= 1'b1; + end else begin + if(read) begin + /* see p.26 of datasheet : + * "A Read burst may be followed by, or truncated with, a Precharge command + * to the same bank. The Precharge command should be issued x cycles after + * the Read command, where x equals the number of desired data element + * pairs" + */ + counter <= 3'd4; + precharge_safe <= 1'b0; + end else if(write) begin + counter <= {1'b1, tim_wr}; + precharge_safe <= 1'b0; + end else begin + if(counter == 3'b1) + precharge_safe <= 1'b1; + if(~precharge_safe) + counter <= counter - 3'b1; + end + end +end + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_ddrio.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_ddrio.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_ddrio.v (revision 21) @@ -0,0 +1,137 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +module hpdmc_ddrio( + input sys_clk, + input sys_clk_n, + input dqs_clk, + input dqs_clk_n, + + input direction, + input direction_r, + input [7:0] mo, + input [63:0] do, + output [63:0] di, + + output [3:0] sdram_dm, + inout [31:0] sdram_dq, + inout [3:0] sdram_dqs, + + input idelay_rst, + input idelay_ce, + input idelay_inc +); + +/******/ +/* DQ */ +/******/ + +wire [31:0] sdram_dq_t; +wire [31:0] sdram_dq_out; +wire [31:0] sdram_dq_in; + +hpdmc_iobuf32 iobuf_dq( + .T(sdram_dq_t), + .I(sdram_dq_out), + .O(sdram_dq_in), + .IO(sdram_dq) +); + +hpdmc_oddr32 oddr_dq_t( + .Q(sdram_dq_t), + .C0(sys_clk), + .C1(sys_clk_n), + .CE(1'b1), + .D0({32{~direction_r}}), + .D1({32{~direction_r}}), + .R(1'b0), + .S(1'b0) +); + +hpdmc_oddr32 oddr_dq( + .Q(sdram_dq_out), + .C0(sys_clk), + .C1(sys_clk_n), + .CE(1'b1), + .D0(do[63:32]), + .D1(do[31:0]), + .R(1'b0), + .S(1'b0) +); + +hpdmc_iddr32 iddr_dq( + .Q0(di[31:0]), + .Q1(di[63:32]), + .C0(sys_clk), + .C1(sys_clk_n), + .CE(1'b1), + .D(sdram_dq_in), + .R(1'b0), + .S(1'b0) +); + +/*******/ +/* DM */ +/*******/ + +hpdmc_oddr4 oddr_dm( + .Q(sdram_dm), + .C0(sys_clk), + .C1(sys_clk_n), + .CE(1'b1), + .D0(mo[7:4]), + .D1(mo[3:0]), + .R(1'b0), + .S(1'b0) +); + +/*******/ +/* DQS */ +/*******/ + +wire [3:0] sdram_dqs_t; +wire [3:0] sdram_dqs_out; + +hpdmc_obuft4 obuft_dqs( + .T(sdram_dqs_t), + .I(sdram_dqs_out), + .O(sdram_dqs) +); + +hpdmc_oddr4 oddr_dqs_t( + .Q(sdram_dqs_t), + .C0(dqs_clk), + .C1(dqs_clk_n), + .CE(1'b1), + .D0({4{~direction_r}}), + .D1({4{~direction_r}}), + .R(1'b0), + .S(1'b0) +); + +hpdmc_oddr4 oddr_dqs( + .Q(sdram_dqs_out), + .C0(dqs_clk), + .C1(dqs_clk_n), + .CE(1'b1), + .D0(4'hf), + .D1(4'h0), + .R(1'b0), + .S(1'b0) +); + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_obuft4.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_obuft4.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_obuft4.v (revision 21) @@ -0,0 +1,52 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Verilog code that really should be replaced with a generate + * statement, but it does not work with some free simulators. + * So I put it in a module so as not to make other code unreadable, + * and keep compatibility with as many simulators as possible. + */ + +module hpdmc_obuft4( + input [3:0] T, + input [3:0] I, + output [3:0] O +); + +OBUFT obuft0( + .T(T[0]), + .I(I[0]), + .O(O[0]) +); +OBUFT obuft1( + .T(T[1]), + .I(I[1]), + .O(O[1]) +); +OBUFT obuft2( + .T(T[2]), + .I(I[2]), + .O(O[2]) +); +OBUFT obuft3( + .T(T[3]), + .I(I[3]), + .O(O[3]) +); + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_iddr32.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_iddr32.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_iddr32.v (revision 21) @@ -0,0 +1,522 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Verilog code that really should be replaced with a generate + * statement, but it does not work with some free simulators. + * So I put it in a module so as not to make other code unreadable, + * and keep compatibility with as many simulators as possible. + */ + +module hpdmc_iddr32 #( + parameter DDR_ALIGNMENT = "C0", + parameter INIT_Q0 = 1'b0, + parameter INIT_Q1 = 1'b0, + parameter SRTYPE = "ASYNC" +) ( + output [31:0] Q0, + output [31:0] Q1, + input C0, + input C1, + input CE, + input [31:0] D, + input R, + input S +); + +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr0 ( + .Q0(Q0[0]), + .Q1(Q1[0]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[0]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr1 ( + .Q0(Q0[1]), + .Q1(Q1[1]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[1]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr2 ( + .Q0(Q0[2]), + .Q1(Q1[2]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[2]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr3 ( + .Q0(Q0[3]), + .Q1(Q1[3]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[3]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr4 ( + .Q0(Q0[4]), + .Q1(Q1[4]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[4]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr5 ( + .Q0(Q0[5]), + .Q1(Q1[5]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[5]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr6 ( + .Q0(Q0[6]), + .Q1(Q1[6]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[6]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr7 ( + .Q0(Q0[7]), + .Q1(Q1[7]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[7]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr8 ( + .Q0(Q0[8]), + .Q1(Q1[8]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[8]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr9 ( + .Q0(Q0[9]), + .Q1(Q1[9]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[9]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr10 ( + .Q0(Q0[10]), + .Q1(Q1[10]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[10]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr11 ( + .Q0(Q0[11]), + .Q1(Q1[11]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[11]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr12 ( + .Q0(Q0[12]), + .Q1(Q1[12]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[12]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr13 ( + .Q0(Q0[13]), + .Q1(Q1[13]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[13]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr14 ( + .Q0(Q0[14]), + .Q1(Q1[14]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[14]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr15 ( + .Q0(Q0[15]), + .Q1(Q1[15]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[15]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr16 ( + .Q0(Q0[16]), + .Q1(Q1[16]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[16]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr17 ( + .Q0(Q0[17]), + .Q1(Q1[17]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[17]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr18 ( + .Q0(Q0[18]), + .Q1(Q1[18]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[18]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr19 ( + .Q0(Q0[19]), + .Q1(Q1[19]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[19]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr20 ( + .Q0(Q0[20]), + .Q1(Q1[20]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[20]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr21 ( + .Q0(Q0[21]), + .Q1(Q1[21]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[21]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr22 ( + .Q0(Q0[22]), + .Q1(Q1[22]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[22]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr23 ( + .Q0(Q0[23]), + .Q1(Q1[23]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[23]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr24 ( + .Q0(Q0[24]), + .Q1(Q1[24]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[24]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr25 ( + .Q0(Q0[25]), + .Q1(Q1[25]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[25]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr26 ( + .Q0(Q0[26]), + .Q1(Q1[26]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[26]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr27 ( + .Q0(Q0[27]), + .Q1(Q1[27]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[27]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr28 ( + .Q0(Q0[28]), + .Q1(Q1[28]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[28]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr29 ( + .Q0(Q0[29]), + .Q1(Q1[29]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[29]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr30 ( + .Q0(Q0[30]), + .Q1(Q1[30]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[30]), + .R(R), + .S(S) +); +IDDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT_Q0(INIT_Q0), + .INIT_Q1(INIT_Q1), + .SRTYPE(SRTYPE) +) iddr31 ( + .Q0(Q0[31]), + .Q1(Q1[31]), + .C0(C0), + .C1(C1), + .CE(CE), + .D(D[31]), + .R(R), + .S(S) +); + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_iobuf32.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_iobuf32.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_iobuf32.v (revision 21) @@ -0,0 +1,225 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Verilog code that really should be replaced with a generate + * statement, but it does not work with some free simulators. + * So I put it in a module so as not to make other code unreadable, + * and keep compatibility with as many simulators as possible. + */ + +module hpdmc_iobuf32( + input [31:0] T, + input [31:0] I, + output [31:0] O, + inout [31:0] IO +); + +IOBUF iobuf0( + .T(T[0]), + .I(I[0]), + .O(O[0]), + .IO(IO[0]) +); +IOBUF iobuf1( + .T(T[1]), + .I(I[1]), + .O(O[1]), + .IO(IO[1]) +); +IOBUF iobuf2( + .T(T[2]), + .I(I[2]), + .O(O[2]), + .IO(IO[2]) +); +IOBUF iobuf3( + .T(T[3]), + .I(I[3]), + .O(O[3]), + .IO(IO[3]) +); +IOBUF iobuf4( + .T(T[4]), + .I(I[4]), + .O(O[4]), + .IO(IO[4]) +); +IOBUF iobuf5( + .T(T[5]), + .I(I[5]), + .O(O[5]), + .IO(IO[5]) +); +IOBUF iobuf6( + .T(T[6]), + .I(I[6]), + .O(O[6]), + .IO(IO[6]) +); +IOBUF iobuf7( + .T(T[7]), + .I(I[7]), + .O(O[7]), + .IO(IO[7]) +); +IOBUF iobuf8( + .T(T[8]), + .I(I[8]), + .O(O[8]), + .IO(IO[8]) +); +IOBUF iobuf9( + .T(T[9]), + .I(I[9]), + .O(O[9]), + .IO(IO[9]) +); +IOBUF iobuf10( + .T(T[10]), + .I(I[10]), + .O(O[10]), + .IO(IO[10]) +); +IOBUF iobuf11( + .T(T[11]), + .I(I[11]), + .O(O[11]), + .IO(IO[11]) +); +IOBUF iobuf12( + .T(T[12]), + .I(I[12]), + .O(O[12]), + .IO(IO[12]) +); +IOBUF iobuf13( + .T(T[13]), + .I(I[13]), + .O(O[13]), + .IO(IO[13]) +); +IOBUF iobuf14( + .T(T[14]), + .I(I[14]), + .O(O[14]), + .IO(IO[14]) +); +IOBUF iobuf15( + .T(T[15]), + .I(I[15]), + .O(O[15]), + .IO(IO[15]) +); +IOBUF iobuf16( + .T(T[16]), + .I(I[16]), + .O(O[16]), + .IO(IO[16]) +); +IOBUF iobuf17( + .T(T[17]), + .I(I[17]), + .O(O[17]), + .IO(IO[17]) +); +IOBUF iobuf18( + .T(T[18]), + .I(I[18]), + .O(O[18]), + .IO(IO[18]) +); +IOBUF iobuf19( + .T(T[19]), + .I(I[19]), + .O(O[19]), + .IO(IO[19]) +); +IOBUF iobuf20( + .T(T[20]), + .I(I[20]), + .O(O[20]), + .IO(IO[20]) +); +IOBUF iobuf21( + .T(T[21]), + .I(I[21]), + .O(O[21]), + .IO(IO[21]) +); +IOBUF iobuf22( + .T(T[22]), + .I(I[22]), + .O(O[22]), + .IO(IO[22]) +); +IOBUF iobuf23( + .T(T[23]), + .I(I[23]), + .O(O[23]), + .IO(IO[23]) +); +IOBUF iobuf24( + .T(T[24]), + .I(I[24]), + .O(O[24]), + .IO(IO[24]) +); +IOBUF iobuf25( + .T(T[25]), + .I(I[25]), + .O(O[25]), + .IO(IO[25]) +); +IOBUF iobuf26( + .T(T[26]), + .I(I[26]), + .O(O[26]), + .IO(IO[26]) +); +IOBUF iobuf27( + .T(T[27]), + .I(I[27]), + .O(O[27]), + .IO(IO[27]) +); +IOBUF iobuf28( + .T(T[28]), + .I(I[28]), + .O(O[28]), + .IO(IO[28]) +); +IOBUF iobuf29( + .T(T[29]), + .I(I[29]), + .O(O[29]), + .IO(IO[29]) +); +IOBUF iobuf30( + .T(T[30]), + .I(I[30]), + .O(O[30]), + .IO(IO[30]) +); +IOBUF iobuf31( + .T(T[31]), + .I(I[31]), + .O(O[31]), + .IO(IO[31]) +); + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_oddr4.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_oddr4.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_oddr4.v (revision 21) @@ -0,0 +1,97 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Verilog code that really should be replaced with a generate + * statement, but it does not work with some free simulators. + * So I put it in a module so as not to make other code unreadable, + * and keep compatibility with as many simulators as possible. + */ + +module hpdmc_oddr4 #( + parameter DDR_ALIGNMENT = "C0", + parameter INIT = 1'b0, + parameter SRTYPE = "ASYNC" +) ( + output [3:0] Q, + input C0, + input C1, + input CE, + input [3:0] D0, + input [3:0] D1, + input R, + input S +); + +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr0 ( + .Q(Q[0]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[0]), + .D1(D1[0]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr1 ( + .Q(Q[1]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[1]), + .D1(D1[1]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr2 ( + .Q(Q[2]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[2]), + .D1(D1[2]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr3 ( + .Q(Q[3]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[3]), + .D1(D1[3]), + .R(R), + .S(S) +); + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_oddr32.v =================================================================== --- hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_oddr32.v (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/rtl/spartan6/hpdmc_oddr32.v (revision 21) @@ -0,0 +1,489 @@ +/* + * Milkymist VJ SoC + * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * Verilog code that really should be replaced with a generate + * statement, but it does not work with some free simulators. + * So I put it in a module so as not to make other code unreadable, + * and keep compatibility with as many simulators as possible. + */ + +module hpdmc_oddr32 #( + parameter DDR_ALIGNMENT = "C0", + parameter INIT = 1'b0, + parameter SRTYPE = "ASYNC" +) ( + output [31:0] Q, + input C0, + input C1, + input CE, + input [31:0] D0, + input [31:0] D1, + input R, + input S +); + +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr0 ( + .Q(Q[0]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[0]), + .D1(D1[0]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr1 ( + .Q(Q[1]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[1]), + .D1(D1[1]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr2 ( + .Q(Q[2]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[2]), + .D1(D1[2]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr3 ( + .Q(Q[3]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[3]), + .D1(D1[3]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr4 ( + .Q(Q[4]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[4]), + .D1(D1[4]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr5 ( + .Q(Q[5]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[5]), + .D1(D1[5]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr6 ( + .Q(Q[6]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[6]), + .D1(D1[6]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr7 ( + .Q(Q[7]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[7]), + .D1(D1[7]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr8 ( + .Q(Q[8]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[8]), + .D1(D1[8]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr9 ( + .Q(Q[9]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[9]), + .D1(D1[9]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr10 ( + .Q(Q[10]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[10]), + .D1(D1[10]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr11 ( + .Q(Q[11]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[11]), + .D1(D1[11]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr12 ( + .Q(Q[12]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[12]), + .D1(D1[12]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr13 ( + .Q(Q[13]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[13]), + .D1(D1[13]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr14 ( + .Q(Q[14]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[14]), + .D1(D1[14]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr15 ( + .Q(Q[15]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[15]), + .D1(D1[15]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr16 ( + .Q(Q[16]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[16]), + .D1(D1[16]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr17 ( + .Q(Q[17]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[17]), + .D1(D1[17]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr18 ( + .Q(Q[18]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[18]), + .D1(D1[18]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr19 ( + .Q(Q[19]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[19]), + .D1(D1[19]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr20 ( + .Q(Q[20]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[20]), + .D1(D1[20]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr21 ( + .Q(Q[21]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[21]), + .D1(D1[21]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr22 ( + .Q(Q[22]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[22]), + .D1(D1[22]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr23 ( + .Q(Q[23]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[23]), + .D1(D1[23]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr24 ( + .Q(Q[24]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[24]), + .D1(D1[24]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr25 ( + .Q(Q[25]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[25]), + .D1(D1[25]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr26 ( + .Q(Q[26]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[26]), + .D1(D1[26]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr27 ( + .Q(Q[27]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[27]), + .D1(D1[27]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr28 ( + .Q(Q[28]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[28]), + .D1(D1[28]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr29 ( + .Q(Q[29]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[29]), + .D1(D1[29]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr30 ( + .Q(Q[30]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[30]), + .D1(D1[30]), + .R(R), + .S(S) +); +ODDR2 #( + .DDR_ALIGNMENT(DDR_ALIGNMENT), + .INIT(INIT), + .SRTYPE(SRTYPE) +) oddr31 ( + .Q(Q[31]), + .C0(C0), + .C1(C1), + .CE(CE), + .D0(D0[31]), + .D1(D1[31]), + .R(R), + .S(S) +); + +endmodule Index: hpdmc/trunk/hpdmc_ddr32/doc/HYB25D256.pdf =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: hpdmc/trunk/hpdmc_ddr32/doc/HYB25D256.pdf =================================================================== --- hpdmc/trunk/hpdmc_ddr32/doc/HYB25D256.pdf (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/doc/HYB25D256.pdf (revision 21)
hpdmc/trunk/hpdmc_ddr32/doc/HYB25D256.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: hpdmc/trunk/hpdmc_ddr32/doc/blockdiagram.eps =================================================================== --- hpdmc/trunk/hpdmc_ddr32/doc/blockdiagram.eps (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/doc/blockdiagram.eps (revision 21) @@ -0,0 +1,5429 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/lekernel/Milkymist/milkymist/milkymist-core/cores/hpdmc_ddr32/doc/blockdiagram.dia +%%Creator: Dia v0.97 +%%CreationDate: Tue Aug 18 18:21:15 2009 +%%For: lekernel +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 1480 902 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-7.872500 -30.250000 translate +%%EndProlog + + +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 19.000000 3.000000 m 19.000000 7.000000 l 30.000000 7.000000 l 30.000000 3.000000 l f +0.000000 0.000000 0.000000 srgb +n 19.000000 3.000000 m 19.000000 7.000000 l 30.000000 7.000000 l 30.000000 3.000000 l cp s +gsave 20.943750 5.293750 translate 0.035278 -0.035278 scale +start_ol +4160 4352 moveto +4160 3712 lineto +3837 4002 3471 4145 conicto +3106 4288 2695 4288 conicto +1885 4288 1454 3794 conicto +1024 3300 1024 2366 conicto +1024 1436 1454 942 conicto +1885 448 2695 448 conicto +3106 448 3471 591 conicto +3837 734 4160 1024 conicto +4160 384 lineto +3828 160 3456 48 conicto +3084 -64 2670 -64 conicto +1607 -64 995 587 conicto +384 1239 384 2366 conicto +384 3497 995 4148 conicto +1607 4800 2670 4800 conicto +3091 4800 3462 4688 conicto +3834 4576 4160 4352 conicto +end_ol grestore +gsave 21.535689 5.293750 translate 0.035278 -0.035278 scale +start_ol +1986 3136 moveto +1541 3136 1282 2776 conicto +1024 2417 1024 1792 conicto +1024 1167 1281 807 conicto +1538 448 1986 448 conicto +2427 448 2685 809 conicto +2944 1170 2944 1792 conicto +2944 2411 2685 2773 conicto +2427 3136 1986 3136 conicto +1984 3648 moveto +2731 3648 3157 3155 conicto +3584 2663 3584 1792 conicto +3584 924 3157 430 conicto +2731 -64 1984 -64 conicto +1234 -64 809 430 conicto +384 924 384 1792 conicto +384 2663 809 3155 conicto +1234 3648 1984 3648 conicto +end_ol grestore +gsave 22.052701 5.293750 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 22.589698 5.293750 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 22.921882 5.293750 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 23.251570 5.293750 translate 0.035278 -0.035278 scale +start_ol +1986 3136 moveto +1541 3136 1282 2776 conicto +1024 2417 1024 1792 conicto +1024 1167 1281 807 conicto +1538 448 1986 448 conicto +2427 448 2685 809 conicto +2944 1170 2944 1792 conicto +2944 2411 2685 2773 conicto +2427 3136 1986 3136 conicto +1984 3648 moveto +2731 3648 3157 3155 conicto +3584 2663 3584 1792 conicto +3584 924 3157 430 conicto +2731 -64 1984 -64 conicto +1234 -64 809 430 conicto +384 924 384 1792 conicto +384 2663 809 3155 conicto +1234 3648 1984 3648 conicto +end_ol grestore +gsave 23.768582 5.293750 translate 0.035278 -0.035278 scale +start_ol +576 4864 moveto +1152 4864 lineto +1152 0 lineto +576 0 lineto +576 4864 lineto +end_ol grestore +gsave 24.003359 5.293750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 24.273101 5.293750 translate 0.035278 -0.035278 scale +start_ol +576 3520 moveto +1152 3520 lineto +1152 0 lineto +576 0 lineto +576 3520 lineto +576 4864 moveto +1152 4864 lineto +1152 4160 lineto +576 4160 lineto +576 4864 lineto +end_ol grestore +gsave 24.507878 5.293750 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 25.044874 5.293750 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 25.377059 5.293750 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 25.899065 5.293750 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 26.246240 5.293750 translate 0.035278 -0.035278 scale +start_ol +2368 4864 moveto +2368 4352 lineto +1838 4352 lineto +1524 4352 1402 4234 conicto +1280 4117 1280 3811 conicto +1280 3520 lineto +2240 3520 lineto +2240 3072 lineto +1280 3072 lineto +1280 0 lineto +704 0 lineto +704 3072 lineto +128 3072 lineto +128 3520 lineto +704 3520 lineto +704 3749 lineto +704 4331 977 4597 conicto +1250 4864 1844 4864 conicto +2368 4864 lineto +end_ol grestore +gsave 26.543458 5.293750 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 27.062967 5.293750 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 27.527526 5.293750 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0.100000 slw +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 36.000000 5.000000 m 41.333333 5.000000 l 44.000000 8.000000 l 41.333333 11.000000 l 36.000000 11.000000 l 38.666667 8.000000 l ef +0.000000 0.000000 0.000000 srgb +n 36.000000 5.000000 m 41.333333 5.000000 l 44.000000 8.000000 l 41.333333 11.000000 l 36.000000 11.000000 l 38.666667 8.000000 l cp s +0 slc +0 slj +[] 0 sd +n 36.000000 5.000000 m 41.333333 5.000000 l 44.000000 8.000000 l 41.333333 11.000000 l 36.000000 11.000000 l 38.666667 8.000000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0.100000 slw +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 44.000000 6.500000 m 48.500000 6.500000 l 48.500000 5.000000 l 53.000000 8.000000 l 48.500000 11.000000 l 48.500000 9.500000 l 44.000000 9.500000 l ef +0.000000 0.000000 0.000000 srgb +n 44.000000 6.500000 m 48.500000 6.500000 l 48.500000 5.000000 l 53.000000 8.000000 l 48.500000 11.000000 l 48.500000 9.500000 l 44.000000 9.500000 l cp s +0 slc +0 slj +[] 0 sd +n 44.000000 6.500000 m 48.500000 6.500000 l 48.500000 5.000000 l 53.000000 8.000000 l 48.500000 11.000000 l 48.500000 9.500000 l 44.000000 9.500000 l cp s +gsave 46.000096 7.752240 translate 0.035278 -0.035278 scale +start_ol +2208 4050 moveto +1349 1728 lineto +3070 1728 lineto +2208 4050 lineto +1851 4672 moveto +2568 4672 lineto +4352 0 lineto +3694 0 lineto +3267 1216 lineto +1158 1216 lineto +732 0 lineto +64 0 lineto +1851 4672 lineto +end_ol grestore +gsave 46.564568 7.752240 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 47.101565 7.752240 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 47.638562 7.752240 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 47.968249 7.752240 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 48.490255 7.752240 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 48.932341 7.752240 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 49.374427 7.752240 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 49.644169 7.752240 translate 0.035278 -0.035278 scale +start_ol +1563 2502 moveto +1284 2254 1154 2007 conicto +1024 1760 1024 1490 conicto +1024 1043 1346 745 conicto +1668 448 2155 448 conicto +2444 448 2696 544 conicto +2948 641 3170 837 conicto +1563 2502 lineto +1991 2857 moveto +3578 1251 lineto +3782 1524 3896 1835 conicto +4011 2146 4032 2496 conicto +4608 2496 lineto +4570 2091 4407 1695 conicto +4244 1300 3952 914 conicto +4800 0 lineto +4003 0 lineto +3550 491 lineto +3224 210 2866 73 conicto +2509 -64 2099 -64 conicto +1343 -64 863 361 conicto +384 787 384 1452 conicto +384 1848 601 2196 conicto +819 2545 1254 2851 conicto +1079 3053 987 3254 conicto +896 3455 896 3647 conicto +896 4167 1242 4483 conicto +1588 4800 2162 4800 conicto +2421 4800 2678 4736 conicto +2935 4672 3200 4544 conicto +3200 3968 lineto +2936 4125 2696 4206 conicto +2457 4288 2251 4288 conicto +1933 4288 1734 4110 conicto +1536 3933 1536 3651 conicto +1536 3488 1625 3323 conicto +1715 3158 1991 2857 conicto +end_ol grestore +gsave 45.060096 8.810573 translate 0.035278 -0.035278 scale +start_ol +4160 4352 moveto +4160 3712 lineto +3837 4002 3471 4145 conicto +3106 4288 2695 4288 conicto +1885 4288 1454 3794 conicto +1024 3300 1024 2366 conicto +1024 1436 1454 942 conicto +1885 448 2695 448 conicto +3106 448 3471 591 conicto +3837 734 4160 1024 conicto +4160 384 lineto +3828 160 3456 48 conicto +3084 -64 2670 -64 conicto +1607 -64 995 587 conicto +384 1239 384 2366 conicto +384 3497 995 4148 conicto +1607 4800 2670 4800 conicto +3091 4800 3462 4688 conicto +3834 4576 4160 4352 conicto +end_ol grestore +gsave 45.652035 8.810573 translate 0.035278 -0.035278 scale +start_ol +1986 3136 moveto +1541 3136 1282 2776 conicto +1024 2417 1024 1792 conicto +1024 1167 1281 807 conicto +1538 448 1986 448 conicto +2427 448 2685 809 conicto +2944 1170 2944 1792 conicto +2944 2411 2685 2773 conicto +2427 3136 1986 3136 conicto +1984 3648 moveto +2731 3648 3157 3155 conicto +3584 2663 3584 1792 conicto +3584 924 3157 430 conicto +2731 -64 1984 -64 conicto +1234 -64 809 430 conicto +384 924 384 1792 conicto +384 2663 809 3155 conicto +1234 3648 1984 3648 conicto +end_ol grestore +gsave 46.169048 8.810573 translate 0.035278 -0.035278 scale +start_ol +3295 2878 moveto +3508 3273 3805 3460 conicto +4102 3648 4504 3648 conicto +5045 3648 5338 3258 conicto +5632 2868 5632 2149 conicto +5632 0 lineto +5056 0 lineto +5056 2130 lineto +5056 2641 4880 2888 conicto +4705 3136 4344 3136 conicto +3904 3136 3648 2834 conicto +3392 2533 3392 2013 conicto +3392 0 lineto +2816 0 lineto +2816 2130 lineto +2816 2644 2640 2890 conicto +2465 3136 2098 3136 conicto +1664 3136 1408 2833 conicto +1152 2530 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1347 3336 1618 3492 conicto +1890 3648 2264 3648 conicto +2640 3648 2904 3450 conicto +3168 3253 3295 2878 conicto +end_ol grestore +gsave 46.993274 8.810573 translate 0.035278 -0.035278 scale +start_ol +3295 2878 moveto +3508 3273 3805 3460 conicto +4102 3648 4504 3648 conicto +5045 3648 5338 3258 conicto +5632 2868 5632 2149 conicto +5632 0 lineto +5056 0 lineto +5056 2130 lineto +5056 2641 4880 2888 conicto +4705 3136 4344 3136 conicto +3904 3136 3648 2834 conicto +3392 2533 3392 2013 conicto +3392 0 lineto +2816 0 lineto +2816 2130 lineto +2816 2644 2640 2890 conicto +2465 3136 2098 3136 conicto +1664 3136 1408 2833 conicto +1152 2530 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1347 3336 1618 3492 conicto +1890 3648 2264 3648 conicto +2640 3648 2904 3450 conicto +3168 3253 3295 2878 conicto +end_ol grestore +gsave 47.817501 8.810573 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 48.337010 8.810573 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 48.874007 8.810573 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 49.411004 8.810573 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 49.680746 8.810573 translate 0.035278 -0.035278 scale +start_ol +1216 2240 moveto +1216 512 lineto +2232 512 lineto +2758 512 3011 725 conicto +3264 938 3264 1378 conicto +3264 1820 3011 2030 conicto +2758 2240 2232 2240 conicto +1216 2240 lineto +1216 4160 moveto +1216 2752 lineto +2153 2752 lineto +2617 2752 2844 2925 conicto +3072 3099 3072 3456 conicto +3072 3810 2844 3985 conicto +2617 4160 2153 4160 conicto +1216 4160 lineto +576 4672 moveto +2200 4672 lineto +2926 4672 3319 4372 conicto +3712 4073 3712 3522 conicto +3712 3094 3510 2841 conicto +3309 2589 2918 2527 conicto +3386 2427 3645 2108 conicto +3904 1789 3904 1312 conicto +3904 684 3477 342 conicto +3051 0 2263 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 50.262697 8.810573 translate 0.035278 -0.035278 scale +start_ol +576 1414 moveto +576 3520 lineto +1152 3520 lineto +1152 1436 lineto +1152 942 1347 695 conicto +1542 448 1932 448 conicto +2400 448 2672 743 conicto +2944 1038 2944 1548 conicto +2944 3520 lineto +3520 3520 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2734 251 2456 93 conicto +2178 -64 1810 -64 conicto +1204 -64 890 312 conicto +576 689 576 1414 conicto +end_ol grestore +gsave 50.799694 8.810573 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 39.486250 7.752240 translate 0.035278 -0.035278 scale +start_ol +1216 2240 moveto +1216 512 lineto +2232 512 lineto +2758 512 3011 725 conicto +3264 938 3264 1378 conicto +3264 1820 3011 2030 conicto +2758 2240 2232 2240 conicto +1216 2240 lineto +1216 4160 moveto +1216 2752 lineto +2153 2752 lineto +2617 2752 2844 2925 conicto +3072 3099 3072 3456 conicto +3072 3810 2844 3985 conicto +2617 4160 2153 4160 conicto +1216 4160 lineto +576 4672 moveto +2200 4672 lineto +2926 4672 3319 4372 conicto +3712 4073 3712 3522 conicto +3712 3094 3510 2841 conicto +3309 2589 2918 2527 conicto +3386 2427 3645 2108 conicto +3904 1789 3904 1312 conicto +3904 684 3477 342 conicto +3051 0 2263 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 40.068201 7.752240 translate 0.035278 -0.035278 scale +start_ol +2056 -307 moveto +1814 -951 1584 -1147 conicto +1354 -1344 969 -1344 conicto +512 -1344 lineto +512 -832 lineto +847 -832 lineto +1083 -832 1213 -722 conicto +1344 -612 1503 -202 conicto +1605 62 lineto +192 3520 lineto +804 3520 lineto +1891 767 lineto +2978 3520 lineto +3584 3520 lineto +2056 -307 lineto +end_ol grestore +gsave 40.570231 7.752240 translate 0.035278 -0.035278 scale +start_ol +1152 576 moveto +1152 -1344 lineto +576 -1344 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1334 3333 1611 3490 conicto +1888 3648 2274 3648 conicto +2913 3648 3312 3136 conicto +3712 2625 3712 1792 conicto +3712 959 3312 447 conicto +2913 -64 2274 -64 conicto +1888 -64 1611 93 conicto +1334 251 1152 576 conicto +3072 1792 moveto +3072 2421 2816 2778 conicto +2560 3136 2112 3136 conicto +1664 3136 1408 2778 conicto +1152 2421 1152 1792 conicto +1152 1163 1408 805 conicto +1664 448 2112 448 conicto +2560 448 2816 805 conicto +3072 1163 3072 1792 conicto +end_ol grestore +gsave 41.107228 7.752240 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 41.626737 7.752240 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 42.068823 7.752240 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 40.035000 8.810573 translate 0.035278 -0.035278 scale +start_ol +576 4672 moveto +1541 4672 lineto +2718 1491 lineto +3902 4672 lineto +4864 4672 lineto +4864 0 lineto +4224 0 lineto +4224 4102 lineto +3034 896 lineto +2406 896 lineto +1216 4102 lineto +1216 0 lineto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 40.764316 8.810573 translate 0.035278 -0.035278 scale +start_ol +576 4672 moveto +1216 4672 lineto +1216 1851 lineto +1216 1104 1488 776 conicto +1760 448 2370 448 conicto +2976 448 3248 776 conicto +3520 1104 3520 1851 conicto +3520 4672 lineto +4160 4672 lineto +4160 1773 lineto +4160 864 3707 400 conicto +3254 -64 2370 -64 conicto +1482 -64 1029 400 conicto +576 864 576 1773 conicto +576 4672 lineto +end_ol grestore +gsave 41.383730 8.810573 translate 0.035278 -0.035278 scale +start_ol +384 4672 moveto +1056 4672 lineto +2205 2935 lineto +3360 4672 lineto +4032 4672 lineto +2546 2428 lineto +4160 0 lineto +3478 0 lineto +2158 1987 lineto +861 0 lineto +192 0 lineto +1824 2494 lineto +384 4672 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0.100000 slw +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 30.000000 4.500000 m 33.000000 4.500000 l 33.000000 4.000000 l 36.000000 5.000000 l 33.000000 6.000000 l 33.000000 5.500000 l 30.000000 5.500000 l ef +0.000000 0.000000 0.000000 srgb +n 30.000000 4.500000 m 33.000000 4.500000 l 33.000000 4.000000 l 36.000000 5.000000 l 33.000000 6.000000 l 33.000000 5.500000 l 30.000000 5.500000 l cp s +0 slc +0 slj +[] 0 sd +n 30.000000 4.500000 m 33.000000 4.500000 l 33.000000 4.000000 l 36.000000 5.000000 l 33.000000 6.000000 l 33.000000 5.500000 l 30.000000 5.500000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 53.000000 6.000000 m 53.000000 29.000000 l 60.000000 29.000000 l 60.000000 6.000000 l f +0.000000 0.000000 0.000000 srgb +n 53.000000 6.000000 m 53.000000 29.000000 l 60.000000 29.000000 l 60.000000 6.000000 l cp s +gsave 54.711250 17.055000 translate 0.035278 -0.035278 scale +start_ol +2368 7872 moveto +2368 960 lineto +3818 960 lineto +5654 960 6507 1793 conicto +7360 2627 7360 4425 conicto +7360 6211 6507 7041 conicto +5654 7872 3818 7872 conicto +2368 7872 lineto +1152 8832 moveto +3634 8832 lineto +6187 8832 7381 7764 conicto +8576 6696 8576 4425 conicto +8576 2141 7376 1070 conicto +6176 0 3634 0 conicto +1152 0 lineto +1152 8832 lineto +end_ol grestore +gsave 55.942596 17.055000 translate 0.035278 -0.035278 scale +start_ol +2368 7872 moveto +2368 960 lineto +3818 960 lineto +5654 960 6507 1793 conicto +7360 2627 7360 4425 conicto +7360 6211 6507 7041 conicto +5654 7872 3818 7872 conicto +2368 7872 lineto +1152 8832 moveto +3634 8832 lineto +6187 8832 7381 7764 conicto +8576 6696 8576 4425 conicto +8576 2141 7376 1070 conicto +6176 0 3634 0 conicto +1152 0 lineto +1152 8832 lineto +end_ol grestore +gsave 57.173942 17.055000 translate 0.035278 -0.035278 scale +start_ol +5376 4111 moveto +5750 3982 6103 3560 conicto +6457 3138 6814 2400 conicto +8000 0 lineto +6745 0 lineto +5655 2253 lineto +5215 3135 4802 3423 conicto +4389 3712 3676 3712 conicto +2368 3712 lineto +2368 0 lineto +1152 0 lineto +1152 8832 lineto +3878 8832 lineto +5375 8832 6111 8195 conicto +6848 7558 6848 6272 conicto +6848 5433 6471 4879 conicto +6095 4325 5376 4111 conicto +2368 7872 moveto +2368 4672 lineto +3878 4672 lineto +4746 4672 5189 5079 conicto +5632 5487 5632 6278 conicto +5632 7069 5189 7470 conicto +4746 7872 3878 7872 conicto +2368 7872 lineto +end_ol grestore +gsave 53.615000 19.055000 translate 0.035278 -0.035278 scale +start_ol +6464 8512 moveto +6464 7360 lineto +5784 7683 5181 7841 conicto +4579 8000 4017 8000 conicto +3042 8000 2513 7622 conicto +1984 7244 1984 6547 conicto +1984 5962 2336 5663 conicto +2689 5365 3673 5182 conicto +4397 5034 lineto +5719 4780 6347 4137 conicto +6976 3495 6976 2418 conicto +6976 1134 6120 471 conicto +5265 -192 3613 -192 conicto +2990 -192 2287 -46 conicto +1585 99 832 384 conicto +832 1600 lineto +1559 1187 2256 977 conicto +2953 768 3627 768 conicto +4649 768 5204 1171 conicto +5760 1575 5760 2324 conicto +5760 2977 5360 3345 conicto +4960 3713 4047 3897 conicto +3318 4039 lineto +1972 4305 1370 4871 conicto +768 5437 768 6446 conicto +768 7615 1595 8287 conicto +2422 8960 3874 8960 conicto +4496 8960 5142 8848 conicto +5788 8736 6464 8512 conicto +end_ol grestore +gsave 54.629049 19.055000 translate 0.035278 -0.035278 scale +start_ol +2368 7872 moveto +2368 960 lineto +3818 960 lineto +5654 960 6507 1793 conicto +7360 2627 7360 4425 conicto +7360 6211 6507 7041 conicto +5654 7872 3818 7872 conicto +2368 7872 lineto +1152 8832 moveto +3634 8832 lineto +6187 8832 7381 7764 conicto +8576 6696 8576 4425 conicto +8576 2141 7376 1070 conicto +6176 0 3634 0 conicto +1152 0 lineto +1152 8832 lineto +end_ol grestore +gsave 55.860395 19.055000 translate 0.035278 -0.035278 scale +start_ol +5376 4111 moveto +5750 3982 6103 3560 conicto +6457 3138 6814 2400 conicto +8000 0 lineto +6745 0 lineto +5655 2253 lineto +5215 3135 4802 3423 conicto +4389 3712 3676 3712 conicto +2368 3712 lineto +2368 0 lineto +1152 0 lineto +1152 8832 lineto +3878 8832 lineto +5375 8832 6111 8195 conicto +6848 7558 6848 6272 conicto +6848 5433 6471 4879 conicto +6095 4325 5376 4111 conicto +2368 7872 moveto +2368 4672 lineto +3878 4672 lineto +4746 4672 5189 5079 conicto +5632 5487 5632 6278 conicto +5632 7069 5189 7470 conicto +4746 7872 3878 7872 conicto +2368 7872 lineto +end_ol grestore +gsave 56.906913 19.055000 translate 0.035278 -0.035278 scale +start_ol +4096 7656 moveto +2481 3264 lineto +5717 3264 lineto +4096 7656 lineto +3424 8832 moveto +4774 8832 lineto +8128 0 lineto +6890 0 lineto +6088 2240 lineto +2121 2240 lineto +1320 0 lineto +64 0 lineto +3424 8832 lineto +end_ol grestore +gsave 58.000890 19.055000 translate 0.035278 -0.035278 scale +start_ol +1152 8832 moveto +2976 8832 lineto +5181 2793 lineto +7398 8832 lineto +9216 8832 lineto +9216 0 lineto +8000 0 lineto +8000 7750 lineto +5772 1664 lineto +4596 1664 lineto +2368 7750 lineto +2368 0 lineto +1152 0 lineto +1152 8832 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 19.000000 9.000000 m 19.000000 13.000000 l 30.000000 13.000000 l 30.000000 9.000000 l f +0.000000 0.000000 0.000000 srgb +n 19.000000 9.000000 m 19.000000 13.000000 l 30.000000 13.000000 l 30.000000 9.000000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0.100000 slw +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 30.000000 10.500000 m 33.000000 10.500000 l 33.000000 10.000000 l 36.000000 11.000000 l 33.000000 12.000000 l 33.000000 11.500000 l 30.000000 11.500000 l ef +0.000000 0.000000 0.000000 srgb +n 30.000000 10.500000 m 33.000000 10.500000 l 33.000000 10.000000 l 36.000000 11.000000 l 33.000000 12.000000 l 33.000000 11.500000 l 30.000000 11.500000 l cp s +0 slc +0 slj +[] 0 sd +n 30.000000 10.500000 m 33.000000 10.500000 l 33.000000 10.000000 l 36.000000 11.000000 l 33.000000 12.000000 l 33.000000 11.500000 l 30.000000 11.500000 l cp s +gsave 19.997500 10.752240 translate 0.035278 -0.035278 scale +start_ol +3456 4544 moveto +3456 3904 lineto +3097 4098 2778 4193 conicto +2459 4288 2163 4288 conicto +1647 4288 1367 4084 conicto +1088 3880 1088 3503 conicto +1088 3187 1273 3026 conicto +1459 2865 1976 2766 conicto +2356 2689 lineto +3051 2555 3381 2216 conicto +3712 1878 3712 1311 conicto +3712 634 3257 285 conicto +2803 -64 1925 -64 conicto +1594 -64 1221 17 conicto +848 98 448 256 conicto +448 896 lineto +835 674 1206 561 conicto +1578 448 1936 448 conicto +2481 448 2776 660 conicto +3072 873 3072 1267 conicto +3072 1611 2862 1804 conicto +2652 1998 2172 2095 conicto +1789 2170 lineto +1081 2312 764 2614 conicto +448 2917 448 3457 conicto +448 4081 884 4440 conicto +1321 4800 2088 4800 conicto +2417 4800 2758 4736 conicto +3099 4672 3456 4544 conicto +end_ol grestore +gsave 20.534497 10.752240 translate 0.035278 -0.035278 scale +start_ol +1216 4160 moveto +1216 512 lineto +1978 512 lineto +2943 512 3391 952 conicto +3840 1392 3840 2341 conicto +3840 3283 3391 3721 conicto +2943 4160 1978 4160 conicto +1216 4160 lineto +576 4672 moveto +1881 4672 lineto +3224 4672 3852 4107 conicto +4480 3542 4480 2341 conicto +4480 1133 3849 566 conicto +3218 0 1881 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 21.186380 10.752240 translate 0.035278 -0.035278 scale +start_ol +2809 2197 moveto +3006 2128 3192 1902 conicto +3378 1677 3566 1283 conicto +4224 0 lineto +3530 0 lineto +2956 1204 lineto +2723 1676 2504 1830 conicto +2286 1984 1908 1984 conicto +1216 1984 lineto +1216 0 lineto +576 0 lineto +576 4672 lineto +2015 4672 lineto +2806 4672 3195 4338 conicto +3584 4004 3584 3330 conicto +3584 2890 3385 2599 conicto +3187 2309 2809 2197 conicto +1216 4160 moveto +1216 2496 lineto +2015 2496 lineto +2475 2496 2709 2708 conicto +2944 2920 2944 3331 conicto +2944 3742 2709 3951 conicto +2475 4160 2015 4160 conicto +1216 4160 lineto +end_ol grestore +gsave 21.740856 10.752240 translate 0.035278 -0.035278 scale +start_ol +2208 4050 moveto +1349 1728 lineto +3070 1728 lineto +2208 4050 lineto +1851 4672 moveto +2568 4672 lineto +4352 0 lineto +3694 0 lineto +3267 1216 lineto +1158 1216 lineto +732 0 lineto +64 0 lineto +1851 4672 lineto +end_ol grestore +gsave 22.320310 10.752240 translate 0.035278 -0.035278 scale +start_ol +576 4672 moveto +1541 4672 lineto +2718 1491 lineto +3902 4672 lineto +4864 4672 lineto +4864 0 lineto +4224 0 lineto +4224 4102 lineto +3034 896 lineto +2406 896 lineto +1216 4102 lineto +1216 0 lineto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 23.049626 10.752240 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 23.319369 10.752240 translate 0.035278 -0.035278 scale +start_ol +3295 2878 moveto +3508 3273 3805 3460 conicto +4102 3648 4504 3648 conicto +5045 3648 5338 3258 conicto +5632 2868 5632 2149 conicto +5632 0 lineto +5056 0 lineto +5056 2130 lineto +5056 2641 4880 2888 conicto +4705 3136 4344 3136 conicto +3904 3136 3648 2834 conicto +3392 2533 3392 2013 conicto +3392 0 lineto +2816 0 lineto +2816 2130 lineto +2816 2644 2640 2890 conicto +2465 3136 2098 3136 conicto +1664 3136 1408 2833 conicto +1152 2530 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1347 3336 1618 3492 conicto +1890 3648 2264 3648 conicto +2640 3648 2904 3450 conicto +3168 3253 3295 2878 conicto +end_ol grestore +gsave 24.143595 10.752240 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 24.663105 10.752240 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 25.200101 10.752240 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 25.719611 10.752240 translate 0.035278 -0.035278 scale +start_ol +2944 1822 moveto +2944 2448 2691 2792 conicto +2439 3136 1982 3136 conicto +1529 3136 1276 2792 conicto +1024 2448 1024 1822 conicto +1024 1200 1276 856 conicto +1529 512 1982 512 conicto +2439 512 2691 856 conicto +2944 1200 2944 1822 conicto +3520 462 moveto +3520 -452 3126 -898 conicto +2732 -1344 1918 -1344 conicto +1617 -1344 1350 -1297 conicto +1083 -1250 832 -1152 conicto +832 -576 lineto +1083 -707 1327 -769 conicto +1572 -832 1826 -832 conicto +2387 -832 2665 -537 conicto +2944 -243 2944 352 conicto +2944 640 lineto +2765 318 2486 159 conicto +2208 0 1819 0 conicto +1174 0 779 499 conicto +384 999 384 1822 conicto +384 2649 779 3148 conicto +1174 3648 1819 3648 conicto +2208 3648 2486 3489 conicto +2765 3330 2944 3008 conicto +2944 3520 lineto +3520 3520 lineto +3520 462 lineto +end_ol grestore +gsave 26.256607 10.752240 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 26.778614 10.752240 translate 0.035278 -0.035278 scale +start_ol +3295 2878 moveto +3508 3273 3805 3460 conicto +4102 3648 4504 3648 conicto +5045 3648 5338 3258 conicto +5632 2868 5632 2149 conicto +5632 0 lineto +5056 0 lineto +5056 2130 lineto +5056 2641 4880 2888 conicto +4705 3136 4344 3136 conicto +3904 3136 3648 2834 conicto +3392 2533 3392 2013 conicto +3392 0 lineto +2816 0 lineto +2816 2130 lineto +2816 2644 2640 2890 conicto +2465 3136 2098 3136 conicto +1664 3136 1408 2833 conicto +1152 2530 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1347 3336 1618 3492 conicto +1890 3648 2264 3648 conicto +2640 3648 2904 3450 conicto +3168 3253 3295 2878 conicto +end_ol grestore +gsave 27.602840 10.752240 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 28.124847 10.752240 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 28.661843 10.752240 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 23.678750 11.810573 translate 0.035278 -0.035278 scale +start_ol +576 1414 moveto +576 3520 lineto +1152 3520 lineto +1152 1436 lineto +1152 942 1347 695 conicto +1542 448 1932 448 conicto +2400 448 2672 743 conicto +2944 1038 2944 1548 conicto +2944 3520 lineto +3520 3520 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2734 251 2456 93 conicto +2178 -64 1810 -64 conicto +1204 -64 890 312 conicto +576 689 576 1414 conicto +end_ol grestore +gsave 24.215747 11.810573 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 24.752743 11.810573 translate 0.035278 -0.035278 scale +start_ol +576 3520 moveto +1152 3520 lineto +1152 0 lineto +576 0 lineto +576 3520 lineto +576 4864 moveto +1152 4864 lineto +1152 4160 lineto +576 4160 lineto +576 4864 lineto +end_ol grestore +gsave 24.987520 11.810573 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 21.000000 18.000000 m 21.000000 13.550000 l s +0 slj +n 21.250000 13.550000 m 21.000000 13.050000 l 20.750000 13.550000 l ef +0.100000 slw +[] 0 sd +0 slj +n 21.250000 13.550000 m 21.000000 13.050000 l 20.750000 13.550000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0.100000 slw +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 51.000000 25.000000 m 47.000000 25.000000 l 47.000000 24.000000 l 45.000000 26.000000 l 47.000000 28.000000 l 47.000000 27.000000 l 51.000000 27.000000 l 51.000000 28.000000 l 53.000000 26.000000 l 51.000000 24.000000 l ef +0.000000 0.000000 0.000000 srgb +n 51.000000 25.000000 m 47.000000 25.000000 l 47.000000 24.000000 l 45.000000 26.000000 l 47.000000 28.000000 l 47.000000 27.000000 l 51.000000 27.000000 l 51.000000 28.000000 l 53.000000 26.000000 l 51.000000 24.000000 l cp s +0 slc +0 slj +[] 0 sd +n 51.000000 25.000000 m 47.000000 25.000000 l 47.000000 24.000000 l 45.000000 26.000000 l 47.000000 28.000000 l 47.000000 27.000000 l 51.000000 27.000000 l 51.000000 28.000000 l 53.000000 26.000000 l 51.000000 24.000000 l cp s +gsave 46.965950 26.372650 translate 0.035278 -0.035278 scale +start_ol +1216 4160 moveto +1216 512 lineto +1978 512 lineto +2943 512 3391 952 conicto +3840 1392 3840 2341 conicto +3840 3283 3391 3721 conicto +2943 4160 1978 4160 conicto +1216 4160 lineto +576 4672 moveto +1881 4672 lineto +3224 4672 3852 4107 conicto +4480 3542 4480 2341 conicto +4480 1133 3849 566 conicto +3218 0 1881 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 47.617834 26.372650 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 48.137343 26.372650 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 48.469527 26.372650 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 48.989037 26.372650 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 49.258780 26.372650 translate 0.035278 -0.035278 scale +start_ol +1216 2240 moveto +1216 512 lineto +2232 512 lineto +2758 512 3011 725 conicto +3264 938 3264 1378 conicto +3264 1820 3011 2030 conicto +2758 2240 2232 2240 conicto +1216 2240 lineto +1216 4160 moveto +1216 2752 lineto +2153 2752 lineto +2617 2752 2844 2925 conicto +3072 3099 3072 3456 conicto +3072 3810 2844 3985 conicto +2617 4160 2153 4160 conicto +1216 4160 lineto +576 4672 moveto +2200 4672 lineto +2926 4672 3319 4372 conicto +3712 4073 3712 3522 conicto +3712 3094 3510 2841 conicto +3309 2589 2918 2527 conicto +3386 2427 3645 2108 conicto +3904 1789 3904 1312 conicto +3904 684 3477 342 conicto +3051 0 2263 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 49.840731 26.372650 translate 0.035278 -0.035278 scale +start_ol +576 1414 moveto +576 3520 lineto +1152 3520 lineto +1152 1436 lineto +1152 942 1347 695 conicto +1542 448 1932 448 conicto +2400 448 2672 743 conicto +2944 1038 2944 1548 conicto +2944 3520 lineto +3520 3520 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2734 251 2456 93 conicto +2178 -64 1810 -64 conicto +1204 -64 890 312 conicto +576 689 576 1414 conicto +end_ol grestore +gsave 50.377727 26.372650 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 41.000000 23.000000 m 41.000000 29.000000 l 45.000000 29.000000 l 45.000000 23.000000 l f +0.000000 0.000000 0.000000 srgb +n 41.000000 23.000000 m 41.000000 29.000000 l 45.000000 29.000000 l 45.000000 23.000000 l cp s +gsave 41.316250 26.293750 translate 0.035278 -0.035278 scale +start_ol +1216 4160 moveto +1216 512 lineto +1978 512 lineto +2943 512 3391 952 conicto +3840 1392 3840 2341 conicto +3840 3283 3391 3721 conicto +2943 4160 1978 4160 conicto +1216 4160 lineto +576 4672 moveto +1881 4672 lineto +3224 4672 3852 4107 conicto +4480 3542 4480 2341 conicto +4480 1133 3849 566 conicto +3218 0 1881 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 41.968134 26.293750 translate 0.035278 -0.035278 scale +start_ol +1216 4160 moveto +1216 512 lineto +1978 512 lineto +2943 512 3391 952 conicto +3840 1392 3840 2341 conicto +3840 3283 3391 3721 conicto +2943 4160 1978 4160 conicto +1216 4160 lineto +576 4672 moveto +1881 4672 lineto +3224 4672 3852 4107 conicto +4480 3542 4480 2341 conicto +4480 1133 3849 566 conicto +3218 0 1881 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 42.620017 26.293750 translate 0.035278 -0.035278 scale +start_ol +2809 2197 moveto +3006 2128 3192 1902 conicto +3378 1677 3566 1283 conicto +4224 0 lineto +3530 0 lineto +2956 1204 lineto +2723 1676 2504 1830 conicto +2286 1984 1908 1984 conicto +1216 1984 lineto +1216 0 lineto +576 0 lineto +576 4672 lineto +2015 4672 lineto +2806 4672 3195 4338 conicto +3584 4004 3584 3330 conicto +3584 2890 3385 2599 conicto +3187 2309 2809 2197 conicto +1216 4160 moveto +1216 2496 lineto +2015 2496 lineto +2475 2496 2709 2708 conicto +2944 2920 2944 3331 conicto +2944 3742 2709 3951 conicto +2475 4160 2015 4160 conicto +1216 4160 lineto +end_ol grestore +gsave 43.209460 26.293750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 43.479202 26.293750 translate 0.035278 -0.035278 scale +start_ol +576 4672 moveto +1216 4672 lineto +1216 0 lineto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 43.728969 26.293750 translate 0.035278 -0.035278 scale +start_ol +1640 4672 moveto +2176 4672 lineto +536 -576 lineto +0 -576 lineto +1640 4672 lineto +end_ol grestore +gsave 44.013702 26.293750 translate 0.035278 -0.035278 scale +start_ol +2531 4288 moveto +1839 4288 1431 3772 conicto +1024 3256 1024 2366 conicto +1024 1480 1431 964 conicto +1839 448 2531 448 conicto +3223 448 3627 964 conicto +4032 1480 4032 2366 conicto +4032 3256 3627 3772 conicto +3223 4288 2531 4288 conicto +2531 4800 moveto +3505 4800 4088 4139 conicto +4672 3478 4672 2366 conicto +4672 1258 4088 597 conicto +3505 -64 2531 -64 conicto +1554 -64 969 595 conicto +384 1255 384 2366 conicto +384 3478 969 4139 conicto +1554 4800 2531 4800 conicto +end_ol grestore +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 14.000000 0.000000 m 14.000000 10.000000 l s +gsave 11.663750 -0.500000 translate 0.035278 -0.035278 scale +start_ol +5440 5760 moveto +5440 4864 lineto +5018 5250 4541 5441 conicto +4064 5632 3526 5632 conicto +2468 5632 1906 4982 conicto +1344 4332 1344 3102 conicto +1344 1876 1906 1226 conicto +2468 576 3526 576 conicto +4064 576 4541 767 conicto +5018 958 5440 1344 conicto +5440 448 lineto +5001 160 4509 16 conicto +4018 -128 3471 -128 conicto +2065 -128 1256 738 conicto +448 1604 448 3102 conicto +448 4604 1256 5470 conicto +2065 6336 3471 6336 conicto +4026 6336 4517 6192 conicto +5009 6048 5440 5760 conicto +end_ol grestore +gsave 12.453010 -0.500000 translate 0.035278 -0.035278 scale +start_ol +4544 6016 moveto +4544 5184 lineto +4078 5410 3664 5521 conicto +3251 5632 2866 5632 conicto +2197 5632 1834 5367 conicto +1472 5103 1472 4614 conicto +1472 4205 1711 3996 conicto +1950 3787 2617 3659 conicto +3108 3555 lineto +4041 3376 4484 2923 conicto +4928 2471 4928 1711 conicto +4928 806 4322 339 conicto +3716 -128 2546 -128 conicto +2104 -128 1606 -31 conicto +1109 66 576 256 conicto +576 1152 lineto +1086 866 1575 721 conicto +2064 576 2536 576 conicto +3253 576 3642 858 conicto +4032 1140 4032 1662 conicto +4032 2118 3761 2375 conicto +3490 2632 2871 2760 conicto +2376 2859 lineto +1426 3047 1001 3447 conicto +576 3847 576 4560 conicto +576 5385 1152 5860 conicto +1728 6336 2740 6336 conicto +3173 6336 3623 6256 conicto +4073 6176 4544 6016 conicto +end_ol grestore +gsave 13.169833 -0.500000 translate 0.035278 -0.035278 scale +start_ol +3788 2917 moveto +4061 2825 4319 2524 conicto +4578 2223 4839 1697 conicto +5696 0 lineto +4788 0 lineto +3985 1593 lineto +3674 2217 3382 2420 conicto +3091 2624 2587 2624 conicto +1664 2624 lineto +1664 0 lineto +832 0 lineto +832 6208 lineto +2730 6208 lineto +3805 6208 4334 5764 conicto +4864 5320 4864 4423 conicto +4864 3838 4588 3452 conicto +4313 3066 3788 2917 conicto +1664 5504 moveto +1664 3328 lineto +2730 3328 lineto +3343 3328 3655 3605 conicto +3968 3882 3968 4420 conicto +3968 4958 3655 5231 conicto +3343 5504 2730 5504 conicto +1664 5504 lineto +end_ol grestore +gsave 13.954099 -0.500000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 14.313759 -0.500000 translate 0.035278 -0.035278 scale +start_ol +4096 2336 moveto +4096 3189 3754 3674 conicto +3413 4160 2816 4160 conicto +2219 4160 1877 3674 conicto +1536 3189 1536 2336 conicto +1536 1483 1877 997 conicto +2219 512 2816 512 conicto +3413 512 3754 997 conicto +4096 1483 4096 2336 conicto +1536 3968 moveto +1777 4390 2144 4595 conicto +2512 4800 3022 4800 conicto +3869 4800 4398 4121 conicto +4928 3442 4928 2336 conicto +4928 1230 4398 551 conicto +3869 -128 3022 -128 conicto +2512 -128 2144 77 conicto +1777 282 1536 704 conicto +1536 0 lineto +768 0 lineto +768 6464 lineto +1536 6464 lineto +1536 3968 lineto +end_ol grestore +gsave 15.030581 -0.500000 translate 0.035278 -0.035278 scale +start_ol +768 1834 moveto +768 4672 lineto +1536 4672 lineto +1536 1863 lineto +1536 1188 1793 850 conicto +2051 512 2566 512 conicto +3185 512 3544 915 conicto +3904 1318 3904 2014 conicto +3904 4672 lineto +4672 4672 lineto +4672 0 lineto +3904 0 lineto +3904 704 lineto +3625 282 3257 77 conicto +2889 -128 2403 -128 conicto +1600 -128 1184 372 conicto +768 872 768 1834 conicto +end_ol grestore +gsave 15.744907 -0.500000 translate 0.035278 -0.035278 scale +start_ol +3712 4544 moveto +3712 3840 lineto +3393 4000 3049 4080 conicto +2705 4160 2337 4160 conicto +1777 4160 1496 3985 conicto +1216 3810 1216 3459 conicto +1216 3192 1418 3040 conicto +1620 2888 2231 2750 conicto +2491 2691 lineto +3293 2514 3630 2192 conicto +3968 1871 3968 1294 conicto +3968 638 3451 255 conicto +2934 -128 2029 -128 conicto +1653 -128 1244 -48 conicto +836 32 384 192 conicto +384 960 lineto +815 736 1233 624 conicto +1651 512 2060 512 conicto +2609 512 2904 700 conicto +3200 888 3200 1230 conicto +3200 1547 2991 1716 conicto +2783 1885 2078 2041 conicto +1814 2104 lineto +1091 2254 769 2565 conicto +448 2877 448 3421 conicto +448 4081 912 4440 conicto +1376 4800 2229 4800 conicto +2652 4800 3024 4736 conicto +3397 4672 3712 4544 conicto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 18.450000 5.000000 m 14.550000 5.000000 l s +0 slj +n 18.450000 5.250000 m 18.950000 5.000000 l 18.450000 4.750000 l ef +0.100000 slw +[] 0 sd +0 slj +n 18.450000 5.250000 m 18.950000 5.000000 l 18.450000 4.750000 l cp s +0 slj +n 14.550000 4.750000 m 14.050000 5.000000 l 14.550000 5.250000 l ef +0.100000 slw +[] 0 sd +0 slj +n 14.550000 4.750000 m 14.050000 5.000000 l 14.550000 5.250000 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 9.000000 0.000000 m 9.000000 30.000000 l s +gsave 7.872500 -0.500000 translate 0.035278 -0.035278 scale +start_ol +832 6208 moveto +4416 6208 lineto +4416 5504 lineto +1664 5504 lineto +1664 3648 lineto +4160 3648 lineto +4160 2944 lineto +1664 2944 lineto +1664 0 lineto +832 0 lineto +832 6208 lineto +end_ol grestore +gsave 8.521887 -0.500000 translate 0.035278 -0.035278 scale +start_ol +832 6208 moveto +2099 6208 lineto +3678 2002 lineto +5265 6208 lineto +6528 6208 lineto +6528 0 lineto +5696 0 lineto +5696 5455 lineto +4101 1216 lineto +3259 1216 lineto +1664 5455 lineto +1664 0 lineto +832 0 lineto +832 6208 lineto +end_ol grestore +gsave 9.495975 -0.500000 translate 0.035278 -0.035278 scale +start_ol +832 6208 moveto +1664 6208 lineto +1664 704 lineto +4672 704 lineto +4672 0 lineto +832 0 lineto +832 6208 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 9.000000 24.000000 m 40.450000 24.000000 l s +0 slj +n 40.450000 24.250000 m 40.950000 24.000000 l 40.450000 23.750000 l ef +0.100000 slw +[] 0 sd +0 slj +n 40.450000 24.250000 m 40.950000 24.000000 l 40.450000 23.750000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 41.000000 28.000000 m 9.550000 28.000000 l s +0 slj +n 9.550000 27.750000 m 9.050000 28.000000 l 9.550000 28.250000 l ef +0.100000 slw +[] 0 sd +0 slj +n 9.550000 27.750000 m 9.050000 28.000000 l 9.550000 28.250000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 36.000000 15.000000 m 36.000000 21.000000 l 50.000000 21.000000 l 50.000000 15.000000 l f +0.000000 0.000000 0.000000 srgb +n 36.000000 15.000000 m 36.000000 21.000000 l 50.000000 21.000000 l 50.000000 15.000000 l cp s +gsave 38.733750 18.293750 translate 0.035278 -0.035278 scale +start_ol +1216 4160 moveto +1216 512 lineto +1978 512 lineto +2943 512 3391 952 conicto +3840 1392 3840 2341 conicto +3840 3283 3391 3721 conicto +2943 4160 1978 4160 conicto +1216 4160 lineto +576 4672 moveto +1881 4672 lineto +3224 4672 3852 4107 conicto +4480 3542 4480 2341 conicto +4480 1133 3849 566 conicto +3218 0 1881 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 39.385634 18.293750 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 39.905143 18.293750 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 40.237327 18.293750 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 40.756837 18.293750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 41.026580 18.293750 translate 0.035278 -0.035278 scale +start_ol +1152 576 moveto +1152 -1344 lineto +576 -1344 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1334 3333 1611 3490 conicto +1888 3648 2274 3648 conicto +2913 3648 3312 3136 conicto +3712 2625 3712 1792 conicto +3712 959 3312 447 conicto +2913 -64 2274 -64 conicto +1888 -64 1611 93 conicto +1334 251 1152 576 conicto +3072 1792 moveto +3072 2421 2816 2778 conicto +2560 3136 2112 3136 conicto +1664 3136 1408 2778 conicto +1152 2421 1152 1792 conicto +1152 1163 1408 805 conicto +1664 448 2112 448 conicto +2560 448 2816 805 conicto +3072 1163 3072 1792 conicto +end_ol grestore +gsave 41.563576 18.293750 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 42.083086 18.293750 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 42.415270 18.293750 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 4864 lineto +1152 4864 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 42.952267 18.293750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 43.222009 18.293750 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 43.686568 18.293750 translate 0.035278 -0.035278 scale +start_ol +1986 3136 moveto +1541 3136 1282 2776 conicto +1024 2417 1024 1792 conicto +1024 1167 1281 807 conicto +1538 448 1986 448 conicto +2427 448 2685 809 conicto +2944 1170 2944 1792 conicto +2944 2411 2685 2773 conicto +2427 3136 1986 3136 conicto +1984 3648 moveto +2731 3648 3157 3155 conicto +3584 2663 3584 1792 conicto +3584 924 3157 430 conicto +2731 -64 1984 -64 conicto +1234 -64 809 430 conicto +384 924 384 1792 conicto +384 2663 809 3155 conicto +1234 3648 1984 3648 conicto +end_ol grestore +gsave 44.203580 18.293750 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 44.740577 18.293750 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 45.072762 18.293750 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 45.402449 18.293750 translate 0.035278 -0.035278 scale +start_ol +1986 3136 moveto +1541 3136 1282 2776 conicto +1024 2417 1024 1792 conicto +1024 1167 1281 807 conicto +1538 448 1986 448 conicto +2427 448 2685 809 conicto +2944 1170 2944 1792 conicto +2944 2411 2685 2773 conicto +2427 3136 1986 3136 conicto +1984 3648 moveto +2731 3648 3157 3155 conicto +3584 2663 3584 1792 conicto +3584 924 3157 430 conicto +2731 -64 1984 -64 conicto +1234 -64 809 430 conicto +384 924 384 1792 conicto +384 2663 809 3155 conicto +1234 3648 1984 3648 conicto +end_ol grestore +gsave 45.919461 18.293750 translate 0.035278 -0.035278 scale +start_ol +576 4864 moveto +1152 4864 lineto +1152 0 lineto +576 0 lineto +576 4864 lineto +end_ol grestore +gsave 46.154238 18.293750 translate 0.035278 -0.035278 scale +start_ol +576 4864 moveto +1152 4864 lineto +1152 0 lineto +576 0 lineto +576 4864 lineto +end_ol grestore +gsave 46.389014 18.293750 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 46.911020 18.293750 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 36.000000 18.000000 m 29.447553 13.319681 l s +0 slj +n 29.592863 13.116248 m 29.040687 13.029062 l 29.302244 13.523114 l ef +0.100000 slw +[] 0 sd +0 slj +n 29.592863 13.116248 m 29.040687 13.029062 l 29.302244 13.523114 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 28.000000 13.000000 m 35.560000 18.670000 l s +0 slj +n 35.410000 18.870000 m 35.960000 18.970000 l 35.710000 18.470000 l ef +0.100000 slw +[] 0 sd +0 slj +n 35.410000 18.870000 m 35.960000 18.970000 l 35.710000 18.470000 l cp s +gsave 32.000000 13.000000 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 32.329687 13.000000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 32.851694 13.000000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 33.371203 13.000000 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 33.908200 13.000000 translate 0.035278 -0.035278 scale +start_ol +3264 -1088 moveto +3264 -1536 lineto +-64 -1536 lineto +-64 -1088 lineto +3264 -1088 lineto +end_ol grestore +gsave 34.332798 13.000000 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 34.774884 13.000000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 35.294393 13.000000 translate 0.035278 -0.035278 scale +start_ol +2368 4864 moveto +2368 4352 lineto +1838 4352 lineto +1524 4352 1402 4234 conicto +1280 4117 1280 3811 conicto +1280 3520 lineto +2240 3520 lineto +2240 3072 lineto +1280 3072 lineto +1280 0 lineto +704 0 lineto +704 3072 lineto +128 3072 lineto +128 3520 lineto +704 3520 lineto +704 3749 lineto +704 4331 977 4597 conicto +1250 4864 1844 4864 conicto +2368 4864 lineto +end_ol grestore +gsave 35.591611 13.000000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 36.113618 13.000000 translate 0.035278 -0.035278 scale +start_ol +768 768 moveto +1408 768 lineto +1408 231 lineto +896 -768 lineto +512 -768 lineto +768 231 lineto +768 768 lineto +end_ol grestore +gsave 32.000000 14.058333 translate 0.035278 -0.035278 scale +start_ol +256 3520 moveto +828 3520 lineto +1543 773 lineto +2255 3520 lineto +2929 3520 lineto +3644 773 lineto +4356 3520 lineto +4928 3520 lineto +4017 0 lineto +3343 0 lineto +2594 2885 lineto +1841 0 lineto +1167 0 lineto +256 3520 lineto +end_ol grestore +gsave 32.691852 14.058333 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 33.039027 14.058333 translate 0.035278 -0.035278 scale +start_ol +576 3520 moveto +1152 3520 lineto +1152 0 lineto +576 0 lineto +576 3520 lineto +576 4864 moveto +1152 4864 lineto +1152 4160 lineto +576 4160 lineto +576 4864 lineto +end_ol grestore +gsave 33.273803 14.058333 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 33.605988 14.058333 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 34.127994 14.058333 translate 0.035278 -0.035278 scale +start_ol +3264 -1088 moveto +3264 -1536 lineto +-64 -1536 lineto +-64 -1088 lineto +3264 -1088 lineto +end_ol grestore +gsave 34.552593 14.058333 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 34.994678 14.058333 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 35.514188 14.058333 translate 0.035278 -0.035278 scale +start_ol +2368 4864 moveto +2368 4352 lineto +1838 4352 lineto +1524 4352 1402 4234 conicto +1280 4117 1280 3811 conicto +1280 3520 lineto +2240 3520 lineto +2240 3072 lineto +1280 3072 lineto +1280 0 lineto +704 0 lineto +704 3072 lineto +128 3072 lineto +128 3520 lineto +704 3520 lineto +704 3749 lineto +704 4331 977 4597 conicto +1250 4864 1844 4864 conicto +2368 4864 lineto +end_ol grestore +gsave 35.811406 14.058333 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 36.333412 14.058333 translate 0.035278 -0.035278 scale +start_ol +768 768 moveto +1408 768 lineto +1408 231 lineto +896 -768 lineto +512 -768 lineto +768 231 lineto +768 768 lineto +end_ol grestore +gsave 36.603155 14.058333 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 36.872897 14.058333 translate 0.035278 -0.035278 scale +start_ol +1152 576 moveto +1152 -1344 lineto +576 -1344 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1334 3333 1611 3490 conicto +1888 3648 2274 3648 conicto +2913 3648 3312 3136 conicto +3712 2625 3712 1792 conicto +3712 959 3312 447 conicto +2913 -64 2274 -64 conicto +1888 -64 1611 93 conicto +1334 251 1152 576 conicto +3072 1792 moveto +3072 2421 2816 2778 conicto +2560 3136 2112 3136 conicto +1664 3136 1408 2778 conicto +1152 2421 1152 1792 conicto +1152 1163 1408 805 conicto +1664 448 2112 448 conicto +2560 448 2816 805 conicto +3072 1163 3072 1792 conicto +end_ol grestore +gsave 37.409894 14.058333 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 37.739581 14.058333 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 38.261588 14.058333 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 38.726147 14.058333 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 4864 lineto +1152 4864 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 39.263143 14.058333 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 39.782653 14.058333 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 40.114837 14.058333 translate 0.035278 -0.035278 scale +start_ol +2944 1822 moveto +2944 2448 2691 2792 conicto +2439 3136 1982 3136 conicto +1529 3136 1276 2792 conicto +1024 2448 1024 1822 conicto +1024 1200 1276 856 conicto +1529 512 1982 512 conicto +2439 512 2691 856 conicto +2944 1200 2944 1822 conicto +3520 462 moveto +3520 -452 3126 -898 conicto +2732 -1344 1918 -1344 conicto +1617 -1344 1350 -1297 conicto +1083 -1250 832 -1152 conicto +832 -576 lineto +1083 -707 1327 -769 conicto +1572 -832 1826 -832 conicto +2387 -832 2665 -537 conicto +2944 -243 2944 352 conicto +2944 640 lineto +2765 318 2486 159 conicto +2208 0 1819 0 conicto +1174 0 779 499 conicto +384 999 384 1822 conicto +384 2649 779 3148 conicto +1174 3648 1819 3648 conicto +2208 3648 2486 3489 conicto +2765 3330 2944 3008 conicto +2944 3520 lineto +3520 3520 lineto +3520 462 lineto +end_ol grestore +gsave 40.651834 14.058333 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 41.173840 14.058333 translate 0.035278 -0.035278 scale +start_ol +3264 -1088 moveto +3264 -1536 lineto +-64 -1536 lineto +-64 -1088 lineto +3264 -1088 lineto +end_ol grestore +gsave 41.598438 14.058333 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 42.040524 14.058333 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 42.560033 14.058333 translate 0.035278 -0.035278 scale +start_ol +2368 4864 moveto +2368 4352 lineto +1838 4352 lineto +1524 4352 1402 4234 conicto +1280 4117 1280 3811 conicto +1280 3520 lineto +2240 3520 lineto +2240 3072 lineto +1280 3072 lineto +1280 0 lineto +704 0 lineto +704 3072 lineto +128 3072 lineto +128 3520 lineto +704 3520 lineto +704 3749 lineto +704 4331 977 4597 conicto +1250 4864 1844 4864 conicto +2368 4864 lineto +end_ol grestore +gsave 42.857251 14.058333 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 26.420000 16.000000 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 26.749687 16.000000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 27.271694 16.000000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 27.791203 16.000000 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 28.328200 16.000000 translate 0.035278 -0.035278 scale +start_ol +768 768 moveto +1408 768 lineto +1408 231 lineto +896 -768 lineto +512 -768 lineto +768 231 lineto +768 768 lineto +end_ol grestore +gsave 28.597943 16.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 28.867685 16.000000 translate 0.035278 -0.035278 scale +start_ol +256 3520 moveto +828 3520 lineto +1543 773 lineto +2255 3520 lineto +2929 3520 lineto +3644 773 lineto +4356 3520 lineto +4928 3520 lineto +4017 0 lineto +3343 0 lineto +2594 2885 lineto +1841 0 lineto +1167 0 lineto +256 3520 lineto +end_ol grestore +gsave 29.559538 16.000000 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 29.906712 16.000000 translate 0.035278 -0.035278 scale +start_ol +576 3520 moveto +1152 3520 lineto +1152 0 lineto +576 0 lineto +576 3520 lineto +576 4864 moveto +1152 4864 lineto +1152 4160 lineto +576 4160 lineto +576 4864 lineto +end_ol grestore +gsave 30.141489 16.000000 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 30.473673 16.000000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 24.052500 17.058333 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 24.517059 17.058333 translate 0.035278 -0.035278 scale +start_ol +1986 3136 moveto +1541 3136 1282 2776 conicto +1024 2417 1024 1792 conicto +1024 1167 1281 807 conicto +1538 448 1986 448 conicto +2427 448 2685 809 conicto +2944 1170 2944 1792 conicto +2944 2411 2685 2773 conicto +2427 3136 1986 3136 conicto +1984 3648 moveto +2731 3648 3157 3155 conicto +3584 2663 3584 1792 conicto +3584 924 3157 430 conicto +2731 -64 1984 -64 conicto +1234 -64 809 430 conicto +384 924 384 1792 conicto +384 2663 809 3155 conicto +1234 3648 1984 3648 conicto +end_ol grestore +gsave 25.034071 17.058333 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 25.571068 17.058333 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 26.035626 17.058333 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 26.557633 17.058333 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 26.889817 17.058333 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 27.426814 17.058333 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 27.948820 17.058333 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 28.485817 17.058333 translate 0.035278 -0.035278 scale +start_ol +3264 -1088 moveto +3264 -1536 lineto +-64 -1536 lineto +-64 -1088 lineto +3264 -1088 lineto +end_ol grestore +gsave 28.910415 17.058333 translate 0.035278 -0.035278 scale +start_ol +3072 1792 moveto +3072 2421 2816 2778 conicto +2560 3136 2112 3136 conicto +1664 3136 1408 2778 conicto +1152 2421 1152 1792 conicto +1152 1163 1408 805 conicto +1664 448 2112 448 conicto +2560 448 2816 805 conicto +3072 1163 3072 1792 conicto +1152 3008 moveto +1334 3333 1611 3490 conicto +1888 3648 2274 3648 conicto +2913 3648 3312 3136 conicto +3712 2625 3712 1792 conicto +3712 959 3312 447 conicto +2913 -64 2274 -64 conicto +1888 -64 1611 93 conicto +1334 251 1152 576 conicto +1152 0 lineto +576 0 lineto +576 4864 lineto +1152 4864 lineto +1152 3008 lineto +end_ol grestore +gsave 29.447412 17.058333 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 29.966921 17.058333 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 30.503918 17.058333 translate 0.035278 -0.035278 scale +start_ol +576 4864 moveto +1152 4864 lineto +1152 2002 lineto +2900 3520 lineto +3648 3520 lineto +1757 1873 lineto +3712 0 lineto +2953 0 lineto +1152 1719 lineto +1152 0 lineto +576 0 lineto +576 4864 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 17.000000 18.000000 m 17.000000 22.000000 l 27.000000 22.000000 l 27.000000 18.000000 l f +0.000000 0.000000 0.000000 srgb +n 17.000000 18.000000 m 17.000000 22.000000 l 27.000000 22.000000 l 27.000000 18.000000 l cp s +gsave 19.193750 20.000000 translate 0.035278 -0.035278 scale +start_ol +1216 2240 moveto +1216 512 lineto +2232 512 lineto +2758 512 3011 725 conicto +3264 938 3264 1378 conicto +3264 1820 3011 2030 conicto +2758 2240 2232 2240 conicto +1216 2240 lineto +1216 4160 moveto +1216 2752 lineto +2153 2752 lineto +2617 2752 2844 2925 conicto +3072 3099 3072 3456 conicto +3072 3810 2844 3985 conicto +2617 4160 2153 4160 conicto +1216 4160 lineto +576 4672 moveto +2200 4672 lineto +2926 4672 3319 4372 conicto +3712 4073 3712 3522 conicto +3712 3094 3510 2841 conicto +3309 2589 2918 2527 conicto +3386 2427 3645 2108 conicto +3904 1789 3904 1312 conicto +3904 684 3477 342 conicto +3051 0 2263 0 conicto +576 0 lineto +576 4672 lineto +end_ol grestore +gsave 19.775701 20.000000 translate 0.035278 -0.035278 scale +start_ol +576 1414 moveto +576 3520 lineto +1152 3520 lineto +1152 1436 lineto +1152 942 1347 695 conicto +1542 448 1932 448 conicto +2400 448 2672 743 conicto +2944 1038 2944 1548 conicto +2944 3520 lineto +3520 3520 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2734 251 2456 93 conicto +2178 -64 1810 -64 conicto +1204 -64 890 312 conicto +576 689 576 1414 conicto +end_ol grestore +gsave 20.312698 20.000000 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 20.754783 20.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 21.024526 20.000000 translate 0.035278 -0.035278 scale +start_ol +576 3520 moveto +1152 3520 lineto +1152 0 lineto +576 0 lineto +576 3520 lineto +576 4864 moveto +1152 4864 lineto +1152 4160 lineto +576 4160 lineto +576 4864 lineto +end_ol grestore +gsave 21.259302 20.000000 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 21.796299 20.000000 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 22.128484 20.000000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 22.650490 20.000000 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 22.997665 20.000000 translate 0.035278 -0.035278 scale +start_ol +2368 4864 moveto +2368 4352 lineto +1838 4352 lineto +1524 4352 1402 4234 conicto +1280 4117 1280 3811 conicto +1280 3520 lineto +2240 3520 lineto +2240 3072 lineto +1280 3072 lineto +1280 0 lineto +704 0 lineto +704 3072 lineto +128 3072 lineto +128 3520 lineto +704 3520 lineto +704 3749 lineto +704 4331 977 4597 conicto +1250 4864 1844 4864 conicto +2368 4864 lineto +end_ol grestore +gsave 23.294883 20.000000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 23.814392 20.000000 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 24.278951 20.000000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 16.450000 20.000000 m 9.550000 20.000000 l s +0 slj +n 16.450000 20.250000 m 16.950000 20.000000 l 16.450000 19.750000 l ef +0.100000 slw +[] 0 sd +0 slj +n 16.450000 20.250000 m 16.950000 20.000000 l 16.450000 19.750000 l cp s +0 slj +n 9.550000 19.750000 m 9.050000 20.000000 l 9.550000 20.250000 l ef +0.100000 slw +[] 0 sd +0 slj +n 9.550000 19.750000 m 9.050000 20.000000 l 9.550000 20.250000 l cp s +gsave 9.486250 19.800000 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 9.928336 19.800000 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 10.260520 19.800000 translate 0.035278 -0.035278 scale +start_ol +3072 1792 moveto +3072 2421 2816 2778 conicto +2560 3136 2112 3136 conicto +1664 3136 1408 2778 conicto +1152 2421 1152 1792 conicto +1152 1163 1408 805 conicto +1664 448 2112 448 conicto +2560 448 2816 805 conicto +3072 1163 3072 1792 conicto +1152 3008 moveto +1334 3333 1611 3490 conicto +1888 3648 2274 3648 conicto +2913 3648 3312 3136 conicto +3712 2625 3712 1792 conicto +3712 959 3312 447 conicto +2913 -64 2274 -64 conicto +1888 -64 1611 93 conicto +1334 251 1152 576 conicto +1152 0 lineto +576 0 lineto +576 4864 lineto +1152 4864 lineto +1152 3008 lineto +end_ol grestore +gsave 10.797517 19.800000 translate 0.035278 -0.035278 scale +start_ol +768 768 moveto +1408 768 lineto +1408 231 lineto +896 -768 lineto +512 -768 lineto +768 231 lineto +768 768 lineto +end_ol grestore +gsave 11.067259 19.800000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 11.337002 19.800000 translate 0.035278 -0.035278 scale +start_ol +256 3520 moveto +828 3520 lineto +1543 773 lineto +2255 3520 lineto +2929 3520 lineto +3644 773 lineto +4356 3520 lineto +4928 3520 lineto +4017 0 lineto +3343 0 lineto +2594 2885 lineto +1841 0 lineto +1167 0 lineto +256 3520 lineto +end_ol grestore +gsave 12.028854 19.800000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 12.550861 19.800000 translate 0.035278 -0.035278 scale +start_ol +768 768 moveto +1408 768 lineto +1408 231 lineto +896 -768 lineto +512 -768 lineto +768 231 lineto +768 768 lineto +end_ol grestore +gsave 12.820604 19.800000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 13.090346 19.800000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 13.609856 19.800000 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 14.146852 19.800000 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 14.494027 19.800000 translate 0.035278 -0.035278 scale +start_ol +768 768 moveto +1408 768 lineto +1408 231 lineto +896 -768 lineto +512 -768 lineto +768 231 lineto +768 768 lineto +end_ol grestore +gsave 14.763770 19.800000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 15.033512 19.800000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 15.553022 19.800000 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 16.017581 19.800000 translate 0.035278 -0.035278 scale +start_ol +576 4864 moveto +1152 4864 lineto +1152 2002 lineto +2900 3520 lineto +3648 3520 lineto +1757 1873 lineto +3712 0 lineto +2953 0 lineto +1152 1719 lineto +1152 0 lineto +576 0 lineto +576 4864 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 43.000000 21.000000 m 43.000000 22.450000 l s +0 slj +n 42.750000 22.450000 m 43.000000 22.950000 l 43.250000 22.450000 l ef +0.100000 slw +[] 0 sd +0 slj +n 42.750000 22.450000 m 43.000000 22.950000 l 43.250000 22.450000 l cp s +gsave 44.000000 22.000000 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 44.536997 22.000000 translate 0.035278 -0.035278 scale +start_ol +576 3520 moveto +1152 3520 lineto +1152 0 lineto +576 0 lineto +576 3520 lineto +576 4864 moveto +1152 4864 lineto +1152 4160 lineto +576 4160 lineto +576 4864 lineto +end_ol grestore +gsave 44.771773 22.000000 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +gsave 45.101460 22.000000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 45.623467 22.000000 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 46.088026 22.000000 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 46.420210 22.000000 translate 0.035278 -0.035278 scale +start_ol +576 3520 moveto +1152 3520 lineto +1152 0 lineto +576 0 lineto +576 3520 lineto +576 4864 moveto +1152 4864 lineto +1152 4160 lineto +576 4160 lineto +576 4864 lineto +end_ol grestore +gsave 46.654986 22.000000 translate 0.035278 -0.035278 scale +start_ol +1986 3136 moveto +1541 3136 1282 2776 conicto +1024 2417 1024 1792 conicto +1024 1167 1281 807 conicto +1538 448 1986 448 conicto +2427 448 2685 809 conicto +2944 1170 2944 1792 conicto +2944 2411 2685 2773 conicto +2427 3136 1986 3136 conicto +1984 3648 moveto +2731 3648 3157 3155 conicto +3584 2663 3584 1792 conicto +3584 924 3157 430 conicto +2731 -64 1984 -64 conicto +1234 -64 809 430 conicto +384 924 384 1792 conicto +384 2663 809 3155 conicto +1234 3648 1984 3648 conicto +end_ol grestore +gsave 47.171999 22.000000 translate 0.035278 -0.035278 scale +start_ol +3520 2149 moveto +3520 0 lineto +2944 0 lineto +2944 2130 lineto +2944 2635 2748 2885 conicto +2553 3136 2163 3136 conicto +1694 3136 1423 2834 conicto +1152 2533 1152 2013 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1360 3330 1641 3489 conicto +1922 3648 2290 3648 conicto +2897 3648 3208 3267 conicto +3520 2887 3520 2149 conicto +end_ol grestore +gsave 15.500000 14.500000 translate 0.035278 -0.035278 scale +start_ol +2816 3456 moveto +2816 2880 lineto +2579 3008 2323 3072 conicto +2068 3136 1794 3136 conicto +1377 3136 1168 3005 conicto +960 2874 960 2612 conicto +960 2412 1110 2298 conicto +1260 2184 1713 2081 conicto +1906 2038 lineto +2504 1906 2756 1666 conicto +3008 1426 3008 996 conicto +3008 507 2629 221 conicto +2251 -64 1589 -64 conicto +1313 -64 1014 0 conicto +715 64 384 192 conicto +384 768 lineto +697 608 1001 528 conicto +1305 448 1603 448 conicto +2002 448 2217 585 conicto +2432 722 2432 971 conicto +2432 1201 2277 1324 conicto +2123 1447 1600 1561 conicto +1404 1607 lineto +864 1721 624 1956 conicto +384 2192 384 2604 conicto +384 3104 729 3376 conicto +1075 3648 1711 3648 conicto +2026 3648 2303 3600 conicto +2581 3552 2816 3456 conicto +end_ol grestore +gsave 15.942086 14.500000 translate 0.035278 -0.035278 scale +start_ol +1152 4544 moveto +1152 3520 lineto +2368 3520 lineto +2368 3072 lineto +1152 3072 lineto +1152 1181 lineto +1152 755 1272 633 conicto +1393 512 1762 512 conicto +2368 512 lineto +2368 0 lineto +1762 0 lineto +1088 0 832 254 conicto +576 509 576 1181 conicto +576 3072 lineto +128 3072 lineto +128 3520 lineto +576 3520 lineto +576 4544 lineto +1152 4544 lineto +end_ol grestore +gsave 16.274270 14.500000 translate 0.035278 -0.035278 scale +start_ol +3072 1792 moveto +3072 2421 2816 2778 conicto +2560 3136 2112 3136 conicto +1664 3136 1408 2778 conicto +1152 2421 1152 1792 conicto +1152 1163 1408 805 conicto +1664 448 2112 448 conicto +2560 448 2816 805 conicto +3072 1163 3072 1792 conicto +1152 3008 moveto +1334 3333 1611 3490 conicto +1888 3648 2274 3648 conicto +2913 3648 3312 3136 conicto +3712 2625 3712 1792 conicto +3712 959 3312 447 conicto +2913 -64 2274 -64 conicto +1888 -64 1611 93 conicto +1334 251 1152 576 conicto +1152 0 lineto +576 0 lineto +576 4864 lineto +1152 4864 lineto +1152 3008 lineto +end_ol grestore +gsave 16.811267 14.500000 translate 0.035278 -0.035278 scale +start_ol +768 768 moveto +1408 768 lineto +1408 231 lineto +896 -768 lineto +512 -768 lineto +768 231 lineto +768 768 lineto +end_ol grestore +gsave 17.081009 14.500000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 17.350752 14.500000 translate 0.035278 -0.035278 scale +start_ol +256 3520 moveto +828 3520 lineto +1543 773 lineto +2255 3520 lineto +2929 3520 lineto +3644 773 lineto +4356 3520 lineto +4928 3520 lineto +4017 0 lineto +3343 0 lineto +2594 2885 lineto +1841 0 lineto +1167 0 lineto +256 3520 lineto +end_ol grestore +gsave 18.042604 14.500000 translate 0.035278 -0.035278 scale +start_ol +3648 1944 moveto +3648 1664 lineto +1024 1664 lineto +1061 1070 1380 759 conicto +1699 448 2267 448 conicto +2597 448 2906 528 conicto +3215 608 3520 768 conicto +3520 192 lineto +3208 67 2880 1 conicto +2552 -64 2215 -64 conicto +1371 -64 877 428 conicto +384 921 384 1760 conicto +384 2628 851 3138 conicto +1318 3648 2110 3648 conicto +2821 3648 3234 3189 conicto +3648 2731 3648 1944 conicto +3072 2112 moveto +3066 2579 2810 2857 conicto +2555 3136 2135 3136 conicto +1659 3136 1372 2867 conicto +1086 2598 1043 2108 conicto +3072 2112 lineto +end_ol grestore +gsave 18.564611 14.500000 translate 0.035278 -0.035278 scale +start_ol +768 768 moveto +1408 768 lineto +1408 231 lineto +896 -768 lineto +512 -768 lineto +768 231 lineto +768 768 lineto +end_ol grestore +gsave 18.834354 14.500000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 19.104096 14.500000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 19.623606 14.500000 translate 0.035278 -0.035278 scale +start_ol +2944 3008 moveto +2944 4864 lineto +3520 4864 lineto +3520 0 lineto +2944 0 lineto +2944 576 lineto +2762 251 2485 93 conicto +2208 -64 1819 -64 conicto +1183 -64 783 447 conicto +384 959 384 1792 conicto +384 2625 783 3136 conicto +1183 3648 1819 3648 conicto +2208 3648 2485 3490 conicto +2762 3333 2944 3008 conicto +1024 1792 moveto +1024 1163 1279 805 conicto +1535 448 1982 448 conicto +2430 448 2687 805 conicto +2944 1163 2944 1792 conicto +2944 2421 2687 2778 conicto +2430 3136 1982 3136 conicto +1535 3136 1279 2778 conicto +1024 2421 1024 1792 conicto +end_ol grestore +gsave 20.160602 14.500000 translate 0.035278 -0.035278 scale +start_ol +2624 3072 moveto +2527 3105 2413 3120 conicto +2299 3136 2161 3136 conicto +1674 3136 1413 2810 conicto +1152 2485 1152 1876 conicto +1152 0 lineto +576 0 lineto +576 3520 lineto +1152 3520 lineto +1152 3008 lineto +1333 3333 1624 3490 conicto +1915 3648 2330 3648 conicto +2390 3648 2461 3648 conicto +2533 3648 2621 3648 conicto +2624 3072 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 22.000000 17.450000 m 22.000000 13.000000 l s +0 slj +n 21.750000 17.450000 m 22.000000 17.950000 l 22.250000 17.450000 l ef +0.100000 slw +[] 0 sd +0 slj +n 21.750000 17.450000 m 22.000000 17.950000 l 22.250000 17.450000 l cp s +gsave 22.500000 15.000000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 23.019509 15.000000 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 23.484068 15.000000 translate 0.035278 -0.035278 scale +start_ol +576 4864 moveto +1152 4864 lineto +1152 2002 lineto +2900 3520 lineto +3648 3520 lineto +1757 1873 lineto +3712 0 lineto +2953 0 lineto +1152 1719 lineto +1152 0 lineto +576 0 lineto +576 4864 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 27.550000 20.000000 m 36.000000 20.000000 l s +0 slj +n 27.550000 19.750000 m 27.050000 20.000000 l 27.550000 20.250000 l ef +0.100000 slw +[] 0 sd +0 slj +n 27.550000 19.750000 m 27.050000 20.000000 l 27.550000 20.250000 l cp s +gsave 31.000000 21.000000 translate 0.035278 -0.035278 scale +start_ol +2185 1792 moveto +1493 1792 1226 1635 conicto +960 1479 960 1102 conicto +960 801 1160 624 conicto +1360 448 1704 448 conicto +2178 448 2465 780 conicto +2752 1113 2752 1665 conicto +2752 1792 lineto +2185 1792 lineto +3328 2028 moveto +3328 0 lineto +2752 0 lineto +2752 576 lineto +2556 248 2264 92 conicto +1972 -64 1549 -64 conicto +1015 -64 699 238 conicto +384 540 384 1047 conicto +384 1639 777 1939 conicto +1171 2240 1952 2240 conicto +2752 2240 lineto +2752 2294 lineto +2752 2696 2492 2916 conicto +2233 3136 1764 3136 conicto +1466 3136 1183 3056 conicto +901 2976 640 2816 conicto +640 3328 lineto +954 3488 1249 3568 conicto +1545 3648 1825 3648 conicto +2581 3648 2954 3246 conicto +3328 2844 3328 2028 conicto +end_ol grestore +gsave 31.519509 21.000000 translate 0.035278 -0.035278 scale +start_ol +3136 3392 moveto +3136 2880 lineto +2898 3008 2658 3072 conicto +2419 3136 2175 3136 conicto +1628 3136 1326 2783 conicto +1024 2430 1024 1792 conicto +1024 1154 1326 801 conicto +1628 448 2175 448 conicto +2419 448 2658 512 conicto +2898 576 3136 704 conicto +3136 192 lineto +2897 64 2640 0 conicto +2384 -64 2095 -64 conicto +1310 -64 847 438 conicto +384 940 384 1792 conicto +384 2657 851 3152 conicto +1319 3648 2133 3648 conicto +2397 3648 2648 3584 conicto +2900 3520 3136 3392 conicto +end_ol grestore +gsave 31.984068 21.000000 translate 0.035278 -0.035278 scale +start_ol +576 4864 moveto +1152 4864 lineto +1152 2002 lineto +2900 3520 lineto +3648 3520 lineto +1757 1873 lineto +3712 0 lineto +2953 0 lineto +1152 1719 lineto +1152 0 lineto +576 0 lineto +576 4864 lineto +end_ol grestore +showpage Index: hpdmc/trunk/hpdmc_ddr32/doc/hpdmc.tex =================================================================== --- hpdmc/trunk/hpdmc_ddr32/doc/hpdmc.tex (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/doc/hpdmc.tex (revision 21) @@ -0,0 +1,232 @@ +\documentclass[a4paper,11pt]{article} +\usepackage{fullpage} +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[normalem]{ulem} +\usepackage[english]{babel} +\usepackage{listings,babel} +\lstset{breaklines=true,basicstyle=\ttfamily} +\usepackage{graphicx} +\usepackage{moreverb} +\usepackage{url} +\usepackage{float} +\usepackage{tabularx} + +\title{High Performance Dynamic Memory Controller} +\author{S\'ebastien Bourdeauducq} +\date{December 2009} +\begin{document} +\setlength{\parindent}{0pt} +\setlength{\parskip}{5pt} +\maketitle{} +\section{Specifications} +This controller is targeted at high bandwidth applications such as live video processing. + +It is designed to drive 32-bit DDR SDRAM memory (which can be physically made up of two 16-bit chips). + +The memory contents are accessed through a 64-bit FML (Fast Memory Link) bus with a burst length of 4. FML is a burst-oriented bus designed to ease the design of DRAM controllers. Its signaling resembles WISHBONE, but basically removes all corner cases with burst modes to save on logic resources and aspirin. + +HPDMC provides high flexibility and savings on hardware by implementing a bypass mode which gives the CPU low-level access to the SDRAM command interface (address pins, bank address pins, and CKE, CS, WE, CAS and RAS). The SDRAM initialization sequence is assigned to the CPU, which should use this mode to implement it. Timing parameters are also configurable at runtime. These control interfaces are accessed on a 32-bit CSR bus, separate from the data bus. The CSR bus is a proprietary bus designed for Milkymist that helps reduce the FPGA resource usage and avoid failed timing paths on the system bus. + +Due to the use of \verb!IDDR!, \verb!ODDR! and \verb!IDELAY! primitives, HPDMC currently only supports the Virtex-4 FPGAs. + +\section{Architecture} + +\begin{figure}[H] +\centering +\includegraphics[height=100mm]{blockdiagram.eps} +\caption{Block diagram of the HPDMC architecture.}\label{fig:blockdiagram} +\end{figure} + +\subsection{Control interface} +The control interface provides a register bank on a low-speed dedicated CSR bus, which is used to control the operating mode of the core, set timings, and initialize the SDRAM. + +The interface can access directly the SDRAM address and command bus in the so-called \textit{bypass mode}. In this mode, the memory controller is disabled and the CPU can control each pin of the SDRAM control bus through the bypass register. + +This mode should be used at system boot-up to perform the SDRAM initialization sequence. HPDMC does not provide a hardware state machine that does such initialization. + +The mapped registers are the following (addresses are in bytes to match the addresses seen by the CPU when the CSR bus is bridged to Wishbone) : + +\subsubsection{System register, offset 0x00} +\begin{tabularx}{\textwidth}{|l|l|l|X|} +\hline +\bf Bits & \bf Access & \bf Default & \bf Description \\ +\hline +0 & RW & 1 & Bypass mode enable. Setting this bit transfers control of the SDRAM command and address bus from HPDMC to the system CPU. This bit should be set during the SDRAM initialization sequence and cleared during normal memory access. \\ +\hline +1 & RW & 1 & Reset. This bit should be cleared during normal operation and set while reconfiguring the memory subsystem. \\ +\hline +2 & RW & 0 & CKE control. This bit directly drives the CKE pin of the SDRAM and should be always set except during the first stage of the initialization sequence. The core does not support SDRAM power-down modes, so clearing this bit during normal operation results in undefined behaviour. \\ +\hline +31 -- 3 & --- & 0 & Reserved. \\ +\hline +\end{tabularx} + +\subsubsection{Bypass register, offset 0x04} +The bypass register gives the system CPU low-level access to the SDRAM. It must be used at system power-up to initialize the SDRAM, as the controller does not provide this initialization. Such software initialization of the SDRAM provides greater flexibility and saves valuable hardware resources. + +Writing once to this register issues \textbf{one} transaction to the SDRAM command bus, ie. the values written to the CS, WE, RAS and CAS bits are only taken into account for one clock cycle, and then the signals go back to their default inactive state. + +The values written to this register have an effect on the SDRAM only if the controller is put in bypass mode using the system register.\\ + +\begin{tabularx}{\textwidth}{|l|l|l|X|} +\hline +\bf Bits & \bf Access & \bf Default & \bf Description \\ +\hline +0 & W & 0 & CS control. Setting this bit activates the CS line of the SDRAM during the command transaction that results from writing to the bypass register. As the SDRAM control bus is active low, setting this bit actually puts a '0' logic level to the CS line. \\ +\hline +1 & W & 0 & WE control (same as above). \\ +\hline +2 & W & 0 & CAS control (same as above). \\ +\hline +3 & W & 0 & RAS control (same as above). \\ +\hline +16 -- 4 & RW & 0 & Address. Defines the current state of the address pins. \\ +\hline +18 -- 17 & RW & 0 & Bank address. Defines the current state of the bank address pins. \\ +\hline +31 -- 19 & --- & 0 & Reserved. \\ +\hline +\end{tabularx}\\ + +\textit{NB. When this register is written, the address pins change synchronously at the same time as the command pins, so there is no need to pre-position the address bits before issuing a command. Commands like loading the mode register can therefore be performed with a single write to this register.} + +\subsubsection{Timing register, offset 0x08} +This register allows the CPU to tune the behaviour of HPDMC so that it meets SDRAM timing requirements while avoiding unnecessary wait cycles. + +The controller must be held in reset using the system register when the timing register is modified.\\ + +\begin{tabularx}{\textwidth}{|l|l|l|X|} +\hline +\bf Bits & \bf Access & \bf Default & \bf Description \\ +\hline +2 -- 0 & RW & 2 & Number of clock cycles the scheduler must wait following a Precharge command. Usually referred to as $t_{RP}$ in SDRAM datasheets. \\ +\hline +5 -- 3 & RW & 2 & Number of clock cycles the scheduler must wait following an Activate command. Usually referred to as $t_{RCD}$ in SDRAM datasheets. \\ +\hline +6 & RW & 0 & CAS latency : 0 = CL2, 1 = CL3. CL2.5 is not supported. \\ +\hline +17 -- 7 & RW & 740 & Autorefresh period, in clock cycles. This is the time between \textbf{each} Auto Refresh command that is issued to the SDRAM, not the delay between two consecutive refreshes of a particular row. Usually referred to as $t_{REFI}$ in SDRAM datasheets, which is often 7.8$\mu$s (64ms is an improbable value for this field). \\ +\hline +21 -- 18 & RW & 8 & Number of clock cycles the controller must wait following an Auto Refresh command. Usually referred to as $t_{RFC}$ in SDRAM datasheets. \\ +\hline +23 -- 22 & RW & 1 & Number of clock cycles the controller must wait following the last data sent to the SDRAM during a write. Usually referred to as $t_{WR}$ in SDRAM datasheets. \\ +\hline +31 -- 24 & --- & 0 & Reserved. \\ +\hline +\end{tabularx}\\ + +\textit{NB. The default values are example only, and must be adapted to your particular setup.} + +\subsubsection{Delay register, offset 0x0C} +This register controls the amount of delay that is introduced on the data lines when reading from memory. It directly controls the \verb!IDELAY! elements that are inserted between the pins and the \verb!IDDR! registers. + +Writing once to the register toggles the \verb!IDELAY! control signals \textbf{once}, that is to say, the signals will be active for one clock cycle and then go back to their default zero state. + +This register also controls the amount of phase shift that is introduced between the system clock and DQS (typically 90 degrees). HPDMC provides three signals, \verb!dqs_psen!, \verb!dqs_psincdec! and \verb!dqs_psdone! that should be connected to the DCM used to generate the DQS clock which is controlled by this register. + +The enable and incrementation bits work the same as for \verb!IDELAY!. They should only be used when the ready bit (5) is set.\\ + +\begin{tabularx}{\textwidth}{|l|l|l|X|} +\hline +\bf Bits & \bf Access & \bf Default & \bf Description \\ +\hline +0 & W & 0 & Resets delay to 0. If this bit is set, the others are ignored. \\ +\hline +1 & W & 0 & Increments or decrements delay by one tap (typically 78ps). If the bit 2 is set at the same time this bit is written, the tap delay is incremented. Otherwise, it is decremented. \\ +\hline +2 & W & 0 & Selects between incrementation and decrementation of the input tap delay. \\ +\hline +3 & W & 0 & Increments or decrements the phase shift on DQS. If the bit 4 is set at the same time this bit is written, the phase shift is incremented. Otherwise, it is decremented. The phase shift is typically between -255 and 255 and is expressed in 1/256ths of the clock period. \\ +\hline +4 & W & 0 & Selects between incrementation and decrementation of the DQS phase shift. \\ +\hline +5 & R & 0 & When this bit is set, the DCM used to generate DQS is ready for phase shift. \\ +\hline +7--6 & R & 0 & Retreives the values of the pll\_stat inputs of the core. These inputs are internally double-latched so that they can directly accept asynchronous signals. They are intended to monitor the lock status of the DCMs used to generate the SDRAM and DQS clocks. \\ +\hline +31--8 & --- & 0 & Reserved. \\ +\hline +\end{tabularx} + +This register can be written to at any time. + + +\subsection{SDRAM management unit} +The SDRAM management unit is a state machine which controls sequentially the SDRAM address and command bus. Unless the core is in bypass mode, the management unit has full control over the SDRAM bus. + +This unit is responsible for precharging banks, activating rows, periodically refreshing the DRAM, and sending read and write commands to the SDRAM. + +It has inputs connected to the control interface registers to retreive the $t_{RP}$, $t_{RCD}$, $t_{REFI}$ and $t_{RFC}$ timing values, as well as the row idle time. + +It handles read and write requests through a port made up of four elements : +\begin{itemize} +\item a strobe input +\item a write enable input (which tells if the command to send to the SDRAM should be a read or a write) +\item an address input +\item an acknowledgement output +\end{itemize} + +The protocol used on these signals is close to the one employed in Wishbone. The strobe signal indicates when a new command should be completed, and remains asserted (with other signals kept constant) until the acknowledgement signal is asserted. At the next clock cycle, a new command should be presented, or the strobe signal should be de-asserted. + +In HPDMC, those signals are driven by the bus interface. + +The management unit also signals the data path when it has sent a read or a write command into the SDRAM. The signal is asserted exactly at the same time as the command is asserted. + +It receives \verb!read_safe!, \verb!write_safe! and \verb!precharge_safe! signals from the data path, whose meanings are explained below. + +\subsection{Data path controller} +The data path controller is responsible for : +\begin{itemize} +\item deciding the direction of the DQ and DQS pins +\item delaying read, write and precharge commands from the management unit that would create conflicts +\end{itemize} + +The delaying of the commands is acheived through the use of three signals : +\begin{itemize} +\item \verb!read_safe! : when this signal is asserted, it is safe to send a Read command to the SDRAM. This is used to prevent conflicts on the data bus : this signal is asserted when, taking into account the CAS latency and the burst length, the resulting burst would not overlap the currently running one. +\item \verb!write_safe! : same thing, for the Write command. +\item \verb!concerned_bank[3..0]! : when the management unit issues a Read or Write command, it must inform the data path controller about the bank which the transfer takes place in, using this one-hot encoded signal. +\item \verb!precharge_safe[3..0]! : when a bit in this signal is asserted, it is safe to precharge the corresponding bank. The management unit must use this signal so as not to precharge a bank interrupting a read burst or causing a write-to-precharge violation. +\end{itemize} + +The data path controller is also connected to the control interface, to retreive $t_{WR}$ and the CAS latency. + +\subsection{Data path} +Data is captured from or sent to the SDRAM using \verb!IDDR! and \verb!ODDR! primitives, in order to limit timing nightmares with ISE. + +When writing to the DDRAM, the \verb!ODDR! primitive puts out data synchronously to the rising and falling edges of the system clock. This was chosen to ease timing between the FML (which is clocked by the system clock) and the I/O elements without introducing additional latency cycles. The data should therefore be strobed by DQS after a short time following each system clock edge. A delay corresponding to a 90 degrees phase shift gives the best margins, and can be controlled using the delay register. + +When reading from the DDRAM, the \verb!IDDR! element is also clocked by the system clock for the same reason. The data must therefore be delayed by typically one quarter of the clock cycle so that it becomes center-aligned with the system clock edges. \verb!IDELAY! primitives are used for this purpose. DQS lines are not used for reading. + +\verb!ODDR!, \verb!IDDR! and \verb!IDELAY! are only supported on Virtex-4 FPGAs, but have equivalents in other families. + +\subsection{Bus interface} +The bus interface is responsible for sending commands to the SDRAM management unit according to the request coming from the FML, and acknowledging bus cycles at the appropriate time. + +\section{Using the core} +\subsection{Connecting} +The differential clock going to the SDRAM chips should be generated using a dedicated FPGA clocking resource, such as a DCM. It is bad practice to simply add an inverter on the negative clock line, as the inverter will also add a delay. + +This DCM can also introduce a 90 degree delay on the clock and the resulting signal be used to generate DQS by connecting it to the \verb!dqs_clk! input of the HPDMC top-level. + +HPDMC uses \verb!IDELAY! elements internally, but does not include the required \verb!IDELAYCTRL! primitive. You must instantiate an \verb!IDELAYCTRL! in your design, generate the 200MHz reference clock and connect it to the \verb!IDELAYCTRL! through a \verb!BUFG!. The other signals of \verb!IDELAYCTRL! can be left unused. + +\subsection{Programming} +When the system is powered up, HPDMC comes up in bypass mode and the SDRAM initialization sequence should be performed from then, by controlling the pins at a low level using the bypass register. + +The SDRAM must be programmed to use a fixed burst length of 8\footnote{It might seem surprising that the burst length of the SDRAM and FML are not the same. This is because DDR SDRAM counts the words on both clock edges. Here, a burst of 8 32-bit words sent at double data rate on the SDRAM side corresponds to a burst of 4 64-bit words at single data rate on the FML side.}, and a CAS latency of 2 (preferred) or 3. CAS latency 2.5 is not supported. + +HPDMC's timing registers may also have to be reprogrammed to match the memory chip's parameters. If a DIMM is used, it is possible to read those parameters from the serial presence detect (SPD) EEPROM and program HPDMC accordingly. + +Once the SDRAM is initialized and the timing registers are programmed, the controller can be brought up by clearing the bypass and reset bits from the system register. + +You may also need to tune the data capture delay. Reset the tap count to 0 by writing bit 0 to the delay register, then increment the delay to the desired value by repeatedly writing bits 1 and 2 simultaneously. + +The DQS phase shift may also be adjusted. The procedure is the same, except that the delay cannot be reset and that the ready bit should be set when writing the enable and incrementation bits. The memory is now ready to be accessed over the FML interface. + +\section*{Copyright notice} +Copyright \copyright 2007-2009 S\'ebastien Bourdeauducq. \\ +Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the LICENSE.FDL file at the root of the Milkymist source distribution. + +\end{document} Index: hpdmc/trunk/hpdmc_ddr32/doc/blockdiagram.dia =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: hpdmc/trunk/hpdmc_ddr32/doc/blockdiagram.dia =================================================================== --- hpdmc/trunk/hpdmc_ddr32/doc/blockdiagram.dia (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/doc/blockdiagram.dia (revision 21)
hpdmc/trunk/hpdmc_ddr32/doc/blockdiagram.dia Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: hpdmc/trunk/hpdmc_ddr32/doc/Makefile =================================================================== --- hpdmc/trunk/hpdmc_ddr32/doc/Makefile (nonexistent) +++ hpdmc/trunk/hpdmc_ddr32/doc/Makefile (revision 21) @@ -0,0 +1,23 @@ +TEX=hpdmc.tex + +DVI=$(TEX:.tex=.dvi) +PS=$(TEX:.tex=.ps) +PDF=$(TEX:.tex=.pdf) +AUX=$(TEX:.tex=.aux) +LOG=$(TEX:.tex=.log) + +all: $(PDF) + +%.dvi: %.tex + latex $< + +%.ps: %.dvi + dvips $< + +%.pdf: %.ps + ps2pdf $< + +clean: + rm -f $(DVI) $(PS) $(PDF) $(AUX) $(LOG) + +.PHONY: clean

powered by: WebSVN 2.1.0

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