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

Subversion Repositories zipcpu

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

/zipcpu/trunk/bench/asm/lodsto.S
0,0 → 1,48
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Filename: lodsto.S
;
; Project: Zip CPU -- a small, lightweight, RISC CPU soft core
;
; Purpose: A quick test of whether or not we can execute loads and
; stores. The test does not report success or failure, so
; you will need to observe it in a simulator to know if it
; worked or didn't.
;
; Creator: Dan Gisselquist, Ph.D.
; Gisselquist Tecnology, LLC
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Copyright (C) 2015, Gisselquist Technology, LLC
;
; This program is free software (firmware): you can redistribute it and/or
; modify it under the terms of the GNU General Public License as published
; by the Free Software Foundation, either version 3 of the License, or (at
; your option) any later version.
;
; This program is distributed in the hope that it will be useful, but WITHOUT
; ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
; for more details.
;
; License: GPL, v3, as defined and found on www.gnu.org,
; http://www.gnu.org/licenses/gpl.html
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
start:
LDI $2,R2
LOD $5(PC),R0
LOD $5(PC),R1
STO R1,(R0)
LDI $1(PC),R0
infloop:
MOV R0,PC
MOV R0,PC
MOV R0,PC
.DAT 0xc0000000
.DAT 0x8001ffff
 
/zipcpu/trunk/bench/asm/pcpc.S
0,0 → 1,60
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Filename: pcpc.S
;
; Project: Zip CPU -- a small, lightweight, RISC CPU soft core
;
; Purpose: A quick test of whether or not the busy command works.
; The test does not report success or failure, so you will need
; to observe it in a simulator to know if it worked or not.
;
; Creator: Dan Gisselquist, Ph.D.
; Gisselquist Tecnology, LLC
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Copyright (C) 2015, Gisselquist Technology, LLC
;
; This program is free software (firmware): you can redistribute it and/or
; modify it under the terms of the GNU General Public License as published
; by the Free Software Foundation, either version 3 of the License, or (at
; your option) any later version.
;
; This program is distributed in the hope that it will be useful, but WITHOUT
; ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
; for more details.
;
; License: GPL, v3, as defined and found on www.gnu.org,
; http://www.gnu.org/licenses/gpl.html
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
start:
LDI $1,R0
MOV $1(R0),R1
MOV $2(R0),R2
MOV $3(R0),R3
MOV $4(R0),R4
MOV $5(R0),R5
MOV $6(R0),R6
MOV $7(R0),R7
MOV $8(R0),R8
MOV $9(R0),R9
MOV $10(R0),R10
MOV $11(R0),R11
MOV $12(R0),R12
MOV $13(R0),R13 ; R14 is CC, R15 is PC
LDI $0,R0
BUSY ; This should create an endless loop here
; MOV R0,R0
; MOV R0,R0
; MOV R0,R0 ; By this point, the loop should've started
LDI $10,R0 ; If we ever get here, we've got problems
ADD $1(R0),R1
ADD $2(R0),R2
ADD $3(R0),R3
MOV R0,R0
MOV R0,R0 ; If we ever get here, we've got problems
HALT
/zipcpu/trunk/bench/asm/ivec.S
0,0 → 1,83
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Filename: ivec.S
;
; Project: Zip CPU -- a small, lightweight, RISC CPU soft core
;
; Purpose: Just to test whether or not a timer works as desired. This
; will set the timer to interrupt every millisecond, and then
; update a counter on every interrupt.
;
; On any failure, the processor will execute a BUSY command.
;
; Creator: Dan Gisselquist, Ph.D.
; Gisselquist Tecnology, LLC
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Copyright (C) 2015, Gisselquist Technology, LLC
;
; This program is free software (firmware): you can redistribute it and/or
; modify it under the terms of the GNU General Public License as published
; by the Free Software Foundation, either version 3 of the License, or (at
; your option) any later version.
;
; This program is distributed in the hope that it will be useful, but WITHOUT
; ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
; for more details.
;
; License: GPL, v3, as defined and found on www.gnu.org,
; http://www.gnu.org/licenses/gpl.html
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Registers:
; sR0 Peripheral address
; sR2 Interrupt controller command
; sR3 Timer peripheral command
; sR4 User program entry address (Could also be (re)entry address,
; but isn't in this implementation)
; sR5 Whether or not we've gotten the first interrupt
; sR6 Number of times we've been interrupted
; sR7 Number of times R6 has overflowed
reset:
CLR R0 ; Load the address of the interrupt controller
LDIHI $c000h,R0 ; into R0
LDI $-1,R2 ; Acknowledge and disable all interrupts
LDIHI $7fffh,R2 ;
STO R2,(R0) ;
; Set the timer for a programmaable interrupt, every 100k clocks,
; or roughly 1,000 times a second on a 100 MHz clock.
LDIHI $0xc001h,R3 ; R3 = 100k, save that the top two bits are
LDILO $0x86a0h,R3 ; also set (start timer, and auto reload)
STO R3,$6(C0)
; Now that timer-C is set, let's enable it's interrupts
LDIHI $8004h,R2 ; Leaving the bottom all ones acknowledges and
STO R2,(R0) ; clears any interrupts (again)
; Clear our counter variables
CLR R5
CLR R6
CLR R7
; Program our wait for interrupt routine
MOV $8(PC),R4
MOV R4,uPC
RTU
on_first_interrupt:
ADD $1,R5
setup_for_next_interrupt:
RTU
on_subsequent_interrupt:
ADD $1,R6
ADD.C $1,R7
BRA $-4
haltcpu:
BUSY ; We've failed if we ever get here
 
waitforinterrupt:
WAIT
BRA $-2
MOV $0,R0
MOV $0,R0
BUSY
/zipcpu/trunk/bench/cpp/zippy_tb.cpp
0,0 → 1,1028
///////////////////////////////////////////////////////////////////////////////
//
// Filename: zippy_tb.cpp
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: A bench simulator for the CPU. Eventually, you should be
// able to give this program the name of a piece of compiled
// code to load into memory. For now, we hand assemble with the
// computers help.
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////////
//
//
#include <signal.h>
#include <time.h>
 
#include <ctype.h>
#include <ncurses.h>
 
#include "verilated.h"
#include "Vzipsystem.h"
 
#include "testb.h"
// #include "twoc.h"
// #include "qspiflashsim.h"
#include "memsim.h"
#include "zopcodes.h"
#include "zparser.h"
 
#define CMD_REG 0
#define CMD_DATA 1
#define CMD_HALT (1<<10)
#define CMD_STALL (1<<9)
#define CMD_STEP (1<<8)
#define CMD_INT (1<<7)
#define CMD_RESET (1<<6)
 
 
// No particular "parameters" need definition or redefinition here.
class ZIPPY_TB : public TESTB<Vzipsystem> {
public:
unsigned long m_tx_busy_count;
MEMSIM m_mem;
// QSPIFLASHSIM m_flash;
FILE *dbg_fp;
bool dbg_flag, bomb;
 
ZIPPY_TB(void) : m_mem(1<<20) {
//dbg_fp = fopen("dbg.txt", "w");
dbg_fp = NULL;
dbg_flag = false;
bomb = false;
}
 
void reset(void) {
// m_flash.debug(false);
TESTB<Vzipsystem>::reset();
}
 
bool on_tick(void) {
tick();
return true;
}
 
void showval(int y, int x, const char *lbl, unsigned int v) {
mvprintw(y,x, "%s: 0x%08x", lbl, v);
}
 
void dispreg(int y, int x, const char *n, unsigned int v) {
// 4,4,8,1 = 17 of 20, +3 = 19
mvprintw(y, x, "%s: 0x%08x", n, v);
}
 
void showreg(int y, int x, const char *n, int r) {
// 4,4,8,1 = 17 of 20, +3 = 19
mvprintw(y, x, "%s: 0x%08x", n, m_core->v__DOT__thecpu__DOT__regset[r]);
addch( ((r == m_core->v__DOT__thecpu__DOT__dcdA)
&&(m_core->v__DOT__thecpu__DOT__dcdvalid)
&&(m_core->v__DOT__thecpu__DOT__dcdA_rd))
?'a':' ');
addch( ((r == m_core->v__DOT__thecpu__DOT__dcdB)
&&(m_core->v__DOT__thecpu__DOT__dcdvalid)
&&(m_core->v__DOT__thecpu__DOT__dcdB_rd))
?'b':' ');
addch( ((r == m_core->v__DOT__thecpu__DOT__wr_reg_id)
&&(m_core->v__DOT__thecpu__DOT__wr_reg_ce))
?'W':' ');
}
 
void showins(int y, const char *lbl, const int ce, const int valid,
const int gie, const int stall, const unsigned int pc) {
char line[80];
 
if (ce)
mvprintw(y, 0, "Ck ");
else
mvprintw(y, 0, " ");
if (stall)
printw("Stl ");
else
printw(" ");
printw("%s: 0x%08x", lbl, pc);
 
if (valid) {
if (gie) attroff(A_BOLD);
else attron(A_BOLD);
zipi_to_string(m_mem[pc], line);
printw(" %-20s", &line[1]);
} else {
attroff(A_BOLD);
printw(" (0x%08x)%28s", m_mem[pc],"");
}
attroff(A_BOLD);
}
 
void dbgins(const char *lbl, const int ce, const int valid,
const int gie, const int stall, const unsigned int pc) {
char line[80];
 
if (!dbg_fp)
return;
 
if (ce)
fprintf(dbg_fp, "%s Ck ", lbl);
else
fprintf(dbg_fp, "%s ", lbl);
if (stall)
fprintf(dbg_fp, "Stl ");
else
fprintf(dbg_fp, " ");
fprintf(dbg_fp, "0x%08x: ", pc);
 
if (valid) {
zipi_to_string(m_mem[pc], line);
fprintf(dbg_fp, " %-20s\n", &line[1]);
} else {
fprintf(dbg_fp, " (0x%08x)\n", m_mem[pc]);
}
}
 
void show_state(void) {
int ln= 0;
 
mvprintw(ln,0, "Peripherals-SS"); ln++;
/*
showval(ln, 1, "TRAP", m_core->v__DOT__trap_data);
mvprintw(ln, 17, "%s%s",
((m_core->v__DOT__sys_cyc)
&&(m_core->v__DOT__sys_we)
&&(m_core->v__DOT__sys_addr == 0))?"W":" ",
(m_core->v__DOT__trap_int)?"I":" ");
*/
showval(ln, 1, "PIC ", m_core->v__DOT__pic_data);
showval(ln,21, "WDT ", m_core->v__DOT__watchdog__DOT__r_value);
showval(ln,41, "CACH", m_core->v__DOT__manualcache__DOT__cache_base);
showval(ln,61, "PIC2", m_core->v__DOT__ctri__DOT__r_int_state);
 
ln++;
showval(ln, 1, "TMRA", m_core->v__DOT__timer_a__DOT__r_value);
showval(ln,21, "TMRB", m_core->v__DOT__timer_b__DOT__r_value);
showval(ln,41, "TMRB", m_core->v__DOT__timer_c__DOT__r_value);
showval(ln,61, "JIF ", m_core->v__DOT__jiffies__DOT__r_counter);
 
ln++;
showval(ln, 1, "UTSK", m_core->v__DOT__utc_data);
showval(ln,21, "UMST", m_core->v__DOT__umc_data);
showval(ln,41, "UPST", m_core->v__DOT__upc_data);
showval(ln,61, "UAST", m_core->v__DOT__uac_data);
 
ln++;
mvprintw(ln, 40, "%s %s",
(m_core->v__DOT__cpu_halt)? "CPU-HALT": " ",
(m_core->v__DOT__cpu_reset)?"CPU-RESET":" "); ln++;
mvprintw(ln, 40, "%s %s %s 0x%02x",
(m_core->v__DOT__cmd_halt)? "HALT": " ",
(m_core->v__DOT__cmd_reset)?"RESET":" ",
(m_core->v__DOT__cmd_step)? "STEP" :" ",
(m_core->v__DOT__cmd_addr)&0x3f);
if (m_core->v__DOT__thecpu__DOT__gie)
attroff(A_BOLD);
else
attron(A_BOLD);
mvprintw(ln, 0, "Supervisor Registers");
ln++;
 
showreg(ln, 1, "sR0 ", 0);
showreg(ln,21, "sR1 ", 1);
showreg(ln,41, "sR2 ", 2);
showreg(ln,61, "sR3 ", 3); ln++;
 
showreg(ln, 1, "sR4 ", 4);
showreg(ln,21, "sR5 ", 5);
showreg(ln,41, "sR6 ", 6);
showreg(ln,61, "sR7 ", 7); ln++;
 
showreg(ln, 1, "sR8 ", 8);
showreg(ln,21, "sR9 ", 9);
showreg(ln,41, "sR10", 10);
showreg(ln,61, "sR11", 11); ln++;
 
showreg(ln, 1, "sR12", 12);
showreg(ln,21, "sSP ", 13);
mvprintw(ln,41, "sCC :%s%s%s%s%s%s%s",
(m_core->v__DOT__thecpu__DOT__step)?"STP":" ",
(m_core->v__DOT__thecpu__DOT__sleep)?"SLP":" ",
(m_core->v__DOT__thecpu__DOT__gie)?"GIE":" ",
(m_core->v__DOT__thecpu__DOT__iflags&8)?"V":" ",
(m_core->v__DOT__thecpu__DOT__iflags&4)?"N":" ",
(m_core->v__DOT__thecpu__DOT__iflags&2)?"C":" ",
(m_core->v__DOT__thecpu__DOT__iflags&1)?"Z":" ");
mvprintw(ln,61, "sPC : 0x%08x", m_core->v__DOT__thecpu__DOT__ipc);
ln++;
 
if (m_core->v__DOT__thecpu__DOT__gie)
attron(A_BOLD);
else
attroff(A_BOLD);
mvprintw(ln, 0, "User Registers"); ln++;
showreg(ln, 1, "uR0 ", 16);
showreg(ln,21, "uR1 ", 17);
showreg(ln,41, "uR2 ", 18);
showreg(ln,61, "uR3 ", 19); ln++;
 
showreg(ln, 1, "uR4 ", 20);
showreg(ln,21, "uR5 ", 21);
showreg(ln,41, "uR6 ", 22);
showreg(ln,61, "uR7 ", 23); ln++;
 
showreg(ln, 1, "uR8 ", 24);
showreg(ln,21, "uR9 ", 25);
showreg(ln,41, "uR10", 26);
showreg(ln,61, "uR11", 27); ln++;
 
showreg(ln, 1, "uR12", 28);
showreg(ln,21, "uSP ", 29);
mvprintw(ln,41, "uCC :%s%s%s%s%s%s%s",
(m_core->v__DOT__thecpu__DOT__step)?"STP":" ",
(m_core->v__DOT__thecpu__DOT__sleep)?"SLP":" ",
(m_core->v__DOT__thecpu__DOT__gie)?"GIE":" ",
(m_core->v__DOT__thecpu__DOT__flags&8)?"V":" ",
(m_core->v__DOT__thecpu__DOT__flags&4)?"N":" ",
(m_core->v__DOT__thecpu__DOT__flags&2)?"C":" ",
(m_core->v__DOT__thecpu__DOT__flags&1)?"Z":" ");
mvprintw(ln,61, "uPC : 0x%08x", m_core->v__DOT__thecpu__DOT__upc);
 
attroff(A_BOLD);
ln+=1;
 
mvprintw(ln, 0, "PFPIPE: rda=%08x/%d, bas=%08x, off=%08x, nv=%08x",
m_core->v__DOT__thecpu__DOT__pf__DOT__r_addr,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_cv,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_cache_base,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_cache_offset,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_nvalid);
ln++;
mvprintw(ln, 0, "PF BUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
(m_core->v__DOT__thecpu__DOT__pf_cyc)?"CYC":" ",
(m_core->v__DOT__thecpu__DOT__pf_stb)?"STB":" ",
" ", // (m_core->v__DOT__thecpu__DOT__pf_we )?"WE":" ",
(m_core->v__DOT__thecpu__DOT__pf_addr),
0, // (m_core->v__DOT__thecpu__DOT__pf_data),
(m_core->v__DOT__thecpu__DOT__pf_ack)?"ACK":" ",
(m_core->v__DOT__cpu_stall)?"STL":" ",
(m_core->v__DOT__wb_data)); ln++;
 
mvprintw(ln, 0, "MEMBUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
(m_core->v__DOT__thecpu__DOT__mem_cyc)?"CYC":" ",
(m_core->v__DOT__thecpu__DOT__mem_stb)?"STB":" ",
(m_core->v__DOT__thecpu__DOT__mem_we )?"WE":" ",
(m_core->v__DOT__thecpu__DOT__mem_addr),
(m_core->v__DOT__thecpu__DOT__mem_data),
(m_core->v__DOT__thecpu__DOT__mem_ack)?"ACK":" ",
(m_core->v__DOT__cpu_stall)?"STL":" ",
(m_core->v__DOT__thecpu__DOT__mem_result)); ln++;
 
mvprintw(ln, 0, "SYSBUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
(m_core->o_wb_cyc)?"CYC":" ",
(m_core->o_wb_stb)?"STB":" ",
(m_core->o_wb_we )?"WE":" ",
(m_core->o_wb_addr),
(m_core->o_wb_data),
(m_core->i_wb_ack)?"ACK":" ",
(m_core->i_wb_stall)?"STL":" ",
(m_core->i_wb_data)); ln+=2;
 
showins(ln, "I ",
!m_core->v__DOT__thecpu__DOT__dcd_stalled,
m_core->v__DOT__thecpu__DOT__pf_valid,
//m_core->v__DOT__thecpu__DOT__instruction_gie,
m_core->v__DOT__thecpu__DOT__gie,
0,
// m_core->v__DOT__thecpu__DOT__instruction_pc); ln++;
m_core->v__DOT__thecpu__DOT__pf_pc); ln++;
 
showins(ln, "Dc",
m_core->v__DOT__thecpu__DOT__dcd_ce,
m_core->v__DOT__thecpu__DOT__dcdvalid,
m_core->v__DOT__thecpu__DOT__dcd_gie,
m_core->v__DOT__thecpu__DOT__dcd_stalled,
m_core->v__DOT__thecpu__DOT__dcd_pc-1); ln++;
 
showins(ln, "Op",
m_core->v__DOT__thecpu__DOT__op_ce,
m_core->v__DOT__thecpu__DOT__opvalid,
m_core->v__DOT__thecpu__DOT__op_gie,
m_core->v__DOT__thecpu__DOT__op_stall,
m_core->v__DOT__thecpu__DOT__op_pc-1); ln++;
 
showins(ln, "Al",
m_core->v__DOT__thecpu__DOT__alu_ce,
m_core->v__DOT__thecpu__DOT__alu_pc_valid,
m_core->v__DOT__thecpu__DOT__alu_gie,
m_core->v__DOT__thecpu__DOT__alu_stall,
m_core->v__DOT__thecpu__DOT__alu_pc-1); ln++;
 
mvprintw(ln-4, 48,
(m_core->v__DOT__thecpu__DOT__new_pc)?"new-pc":" ");
printw("(%s:%02x,%x)",
(m_core->v__DOT__thecpu__DOT__set_cond)?"SET":" ",
(m_core->v__DOT__thecpu__DOT__opF&0x0ff),
(m_core->v__DOT__thecpu__DOT__op_gie)
? (m_core->v__DOT__thecpu__DOT__w_uflags)
: (m_core->v__DOT__thecpu__DOT__w_iflags));
 
printw("(%s%s%s:%02x)",
(m_core->v__DOT__thecpu__DOT__opF_wr)?"OF":" ",
(m_core->v__DOT__thecpu__DOT__alF_wr)?"FL":" ",
(m_core->v__DOT__thecpu__DOT__wr_flags_ce)?"W":" ",
(m_core->v__DOT__thecpu__DOT__alu_flags));
/*
mvprintw(ln-3, 48, "dcdI : 0x%08x",
m_core->v__DOT__thecpu__DOT__dcdI);
mvprintw(ln-2, 48, "r_opB: 0x%08x",
m_core->v__DOT__thecpu__DOT__opB);
*/
mvprintw(ln-3, 48, "Op(%x)%8x %8x->%08x",
m_core->v__DOT__thecpu__DOT__opn,
m_core->v__DOT__thecpu__DOT__opA,
m_core->v__DOT__thecpu__DOT__opB,
m_core->v__DOT__thecpu__DOT__alu_result);
mvprintw(ln-1, 48, "MEM: %s%s %s%s %s %-5s",
(m_core->v__DOT__thecpu__DOT__opM)?"M":" ",
(m_core->v__DOT__thecpu__DOT__mem_ce)?"CE":" ",
(m_core->v__DOT__thecpu__DOT__mem_we)?"Wr ":"Rd ",
(m_core->v__DOT__thecpu__DOT__mem_stalled)?"PIPE":" ",
(m_core->v__DOT__thecpu__DOT__mem_valid)?"MEMV":" ",
zop_regstr[(m_core->v__DOT__thecpu__DOT__mem_wreg&0x1f)^0x10]);
}
 
unsigned int cmd_read(unsigned int a) {
if (dbg_fp) {
dbg_flag= true;
fprintf(dbg_fp, "CMD-READ(%d)\n", a);
}
wb_write(CMD_REG, CMD_HALT|(a&0x3f));
while((wb_read(CMD_REG) & CMD_STALL) == 0)
;
unsigned int v = wb_read(CMD_DATA);
 
if (dbg_flag)
fprintf(dbg_fp, "CMD-READ(%d) = 0x%08x\n", a,
v);
dbg_flag = false;
return v;
}
 
void read_state(void) {
int ln= 0;
 
mvprintw(ln,0, "Peripherals-RS"); ln++;
showval(ln, 1, "PIC ", cmd_read(32+ 0));
showval(ln,21, "WDT ", cmd_read(32+ 1));
showval(ln,41, "CACH", cmd_read(32+ 2));
showval(ln,61, "PIC2", cmd_read(32+ 3));
ln++;
showval(ln, 1, "TMRA", cmd_read(32+ 4));
showval(ln,21, "TMRB", cmd_read(32+ 5));
showval(ln,41, "TMRC", cmd_read(32+ 6));
showval(ln,61, "JIF ", cmd_read(32+ 7));
 
ln++;
showval(ln, 1, "UTSK", cmd_read(32+12));
showval(ln,21, "UMST", cmd_read(32+13));
showval(ln,41, "UPST", cmd_read(32+14));
showval(ln,61, "UAST", cmd_read(32+15));
 
ln++;
ln++;
unsigned int cc = cmd_read(14);
if (dbg_fp) fprintf(dbg_fp, "CC = %08x, gie = %d\n", cc,
m_core->v__DOT__thecpu__DOT__gie);
if (cc & 0x020)
attroff(A_BOLD);
else
attron(A_BOLD);
mvprintw(ln, 0, "Supervisor Registers");
ln++;
 
dispreg(ln, 1, "sR0 ", cmd_read(0));
dispreg(ln,21, "sR1 ", cmd_read(1));
dispreg(ln,41, "sR2 ", cmd_read(2));
dispreg(ln,61, "sR3 ", cmd_read(3)); ln++;
 
dispreg(ln, 1, "sR4 ", cmd_read(4));
dispreg(ln,21, "sR5 ", cmd_read(5));
dispreg(ln,41, "sR6 ", cmd_read(6));
dispreg(ln,61, "sR7 ", cmd_read(7)); ln++;
 
dispreg(ln, 1, "sR8 ", cmd_read( 8));
dispreg(ln,21, "sR9 ", cmd_read( 9));
dispreg(ln,41, "sR10", cmd_read(10));
dispreg(ln,61, "sR11", cmd_read(11)); ln++;
 
dispreg(ln, 1, "sR12", cmd_read(12));
dispreg(ln,21, "sSP ", cmd_read(13));
 
mvprintw(ln,41, "sCC :%s%s%s%s%s%s%s",
(cc & 0x040)?"STP":" ",
(cc & 0x020)?"GIE":" ",
(cc & 0x010)?"SLP":" ",
(cc&8)?"V":" ",
(cc&4)?"N":" ",
(cc&2)?"C":" ",
(cc&1)?"Z":" ");
mvprintw(ln,61, "sPC : 0x%08x", cmd_read(15));
ln++;
 
if (cc & 0x020)
attron(A_BOLD);
else
attroff(A_BOLD);
mvprintw(ln, 0, "User Registers"); ln++;
dispreg(ln, 1, "uR0 ", cmd_read(16));
dispreg(ln,21, "uR1 ", cmd_read(17));
dispreg(ln,41, "uR2 ", cmd_read(18));
dispreg(ln,61, "uR3 ", cmd_read(19)); ln++;
 
dispreg(ln, 1, "uR4 ", cmd_read(20));
dispreg(ln,21, "uR5 ", cmd_read(21));
dispreg(ln,41, "uR6 ", cmd_read(22));
dispreg(ln,61, "uR7 ", cmd_read(23)); ln++;
 
dispreg(ln, 1, "uR8 ", cmd_read(24));
dispreg(ln,21, "uR9 ", cmd_read(25));
dispreg(ln,41, "uR10", cmd_read(26));
dispreg(ln,61, "uR11", cmd_read(27)); ln++;
 
dispreg(ln, 1, "uR12", cmd_read(28));
dispreg(ln,21, "uSP ", cmd_read(29));
cc = cmd_read(30);
mvprintw(ln,41, "uCC :%s%s%s%s%s%s%s",
(cc&0x040)?"STP":" ",
(cc&0x020)?"GIE":" ",
(cc&0x010)?"SLP":" ",
(cc&8)?"V":" ",
(cc&4)?"N":" ",
(cc&2)?"C":" ",
(cc&1)?"Z":" ");
mvprintw(ln,61, "uPC : 0x%08x", cmd_read(31));
 
attroff(A_BOLD);
ln+=2;
 
ln+=3;
 
showins(ln, "I ",
!m_core->v__DOT__thecpu__DOT__dcd_stalled,
m_core->v__DOT__thecpu__DOT__pf_valid,
m_core->v__DOT__thecpu__DOT__gie,
0,
// m_core->v__DOT__thecpu__DOT__instruction_pc); ln++;
m_core->v__DOT__thecpu__DOT__pf_pc); ln++;
 
showins(ln, "Dc",
m_core->v__DOT__thecpu__DOT__dcd_ce,
m_core->v__DOT__thecpu__DOT__dcdvalid,
m_core->v__DOT__thecpu__DOT__dcd_gie,
m_core->v__DOT__thecpu__DOT__dcd_stalled,
m_core->v__DOT__thecpu__DOT__dcd_pc-1); ln++;
 
showins(ln, "Op",
m_core->v__DOT__thecpu__DOT__op_ce,
m_core->v__DOT__thecpu__DOT__opvalid,
m_core->v__DOT__thecpu__DOT__op_gie,
m_core->v__DOT__thecpu__DOT__op_stall,
m_core->v__DOT__thecpu__DOT__op_pc-1); ln++;
 
showins(ln, "Al",
m_core->v__DOT__thecpu__DOT__alu_ce,
m_core->v__DOT__thecpu__DOT__alu_pc_valid,
m_core->v__DOT__thecpu__DOT__alu_gie,
m_core->v__DOT__thecpu__DOT__alu_stall,
m_core->v__DOT__thecpu__DOT__alu_pc-1); ln++;
}
void tick(void) {
int gie = m_core->v__DOT__thecpu__DOT__gie;
/*
m_core->i_qspi_dat = m_flash(m_core->o_qspi_cs_n,
m_core->o_qspi_sck,
m_core->o_qspi_dat);
*/
 
m_mem(m_core->o_wb_cyc, m_core->o_wb_stb, m_core->o_wb_we,
m_core->o_wb_addr & ((1<<20)-1), m_core->o_wb_data,
m_core->i_wb_ack, m_core->i_wb_stall,m_core->i_wb_data);
 
if ((dbg_flag)&&(dbg_fp)) {
fprintf(dbg_fp, "DBG %s %s %s @0x%08x/%d[0x%08x] %s %s [0x%08x] %s %s %s%s%s%s%s%s%s%s\n",
(m_core->i_dbg_cyc)?"CYC":" ",
(m_core->i_dbg_stb)?"STB":
((m_core->v__DOT__dbg_stb)?"DBG":" "),
((m_core->i_dbg_we)?"WE":" "),
(m_core->i_dbg_addr),0,
m_core->i_dbg_data,
(m_core->o_dbg_ack)?"ACK":" ",
(m_core->o_dbg_stall)?"STALL":" ",
(m_core->o_dbg_data),
(m_core->v__DOT__cpu_halt)?"CPU-HALT ":"",
(m_core->v__DOT__cpu_dbg_stall)?"CPU-DBG_STALL":"",
(m_core->v__DOT__thecpu__DOT__dcdvalid)?"DCDV ":"",
(m_core->v__DOT__thecpu__DOT__opvalid)?"OPV ":"",
(m_core->v__DOT__thecpu__DOT__pf_cyc)?"PCYC ":"",
(m_core->v__DOT__thecpu__DOT__mem_cyc)?"MCYC ":"",
(m_core->v__DOT__thecpu__DOT__alu_wr)?"ALUW ":"",
(m_core->v__DOT__thecpu__DOT__alu_ce)?"ALCE ":"",
(m_core->v__DOT__thecpu__DOT__alu_valid)?"ALUV ":"",
(m_core->v__DOT__thecpu__DOT__mem_valid)?"MEMV ":"");
fprintf(dbg_fp, " SYS %s %s %s @0x%08x/%d[0x%08x] %s [0x%08x]\n",
(m_core->v__DOT__sys_cyc)?"CYC":" ",
(m_core->v__DOT__sys_stb)?"STB":" ",
(m_core->v__DOT__sys_we)?"WE":" ",
(m_core->v__DOT__sys_addr),
(m_core->v__DOT__dbg_addr),
(m_core->v__DOT__sys_data),
(m_core->v__DOT__dbg_ack)?"ACK":" ",
(m_core->v__DOT__wb_data));
}
 
if (dbg_fp)
fprintf(dbg_fp, "CEs %d/0x%08x,%d/0x%08x DCD: ->%02x, OP: ->%02x, ALU: halt=%d,%d ce=%d, valid=%d, wr=%d Reg=%02x, IPC=%08x, UPC=%08x\n",
m_core->v__DOT__thecpu__DOT__dcd_ce,
m_core->v__DOT__thecpu__DOT__dcd_pc,
m_core->v__DOT__thecpu__DOT__op_ce,
m_core->v__DOT__thecpu__DOT__op_pc,
m_core->v__DOT__thecpu__DOT__dcdA,
m_core->v__DOT__thecpu__DOT__opR,
m_core->v__DOT__cmd_halt,
m_core->v__DOT__cpu_halt,
m_core->v__DOT__thecpu__DOT__alu_ce,
m_core->v__DOT__thecpu__DOT__alu_valid,
m_core->v__DOT__thecpu__DOT__alu_wr,
m_core->v__DOT__thecpu__DOT__alu_reg,
m_core->v__DOT__thecpu__DOT__ipc,
m_core->v__DOT__thecpu__DOT__upc);
if ((dbg_fp)&&(!gie)&&(m_core->v__DOT__thecpu__DOT__w_release_from_interrupt)) {
fprintf(dbg_fp, "RELEASE: int=%d, %d/%02x[%08x] ?/%02x[0x%08x], ce=%d %d,%d,%d\n",
m_core->v__DOT__pic_interrupt,
m_core->v__DOT__thecpu__DOT__wr_reg_ce,
m_core->v__DOT__thecpu__DOT__wr_reg_id,
m_core->v__DOT__thecpu__DOT__wr_reg_vl,
m_core->v__DOT__cmd_addr,
m_core->v__DOT__dbg_idata,
m_core->v__DOT__thecpu__DOT__master_ce,
m_core->v__DOT__thecpu__DOT__alu_wr,
m_core->v__DOT__thecpu__DOT__alu_valid,
m_core->v__DOT__thecpu__DOT__mem_valid);
} else if ((dbg_fp)&&(gie)&&(m_core->v__DOT__thecpu__DOT__w_switch_to_interrupt)) {
fprintf(dbg_fp, "SWITCH: %d/%02x[%08x] ?/%02x[0x%08x], ce=%d %d,%d,%d, F%02x,%02x\n",
m_core->v__DOT__thecpu__DOT__wr_reg_ce,
m_core->v__DOT__thecpu__DOT__wr_reg_id,
m_core->v__DOT__thecpu__DOT__wr_reg_vl,
m_core->v__DOT__cmd_addr,
m_core->v__DOT__dbg_idata,
m_core->v__DOT__thecpu__DOT__master_ce,
m_core->v__DOT__thecpu__DOT__alu_wr,
m_core->v__DOT__thecpu__DOT__alu_valid,
m_core->v__DOT__thecpu__DOT__mem_valid,
m_core->v__DOT__thecpu__DOT__w_iflags,
m_core->v__DOT__thecpu__DOT__w_uflags);
fprintf(dbg_fp, "\tbrk=%d,%d\n",
m_core->v__DOT__thecpu__DOT__break_en,
m_core->v__DOT__thecpu__DOT__op_break);
}
 
TESTB<Vzipsystem>::tick();
if ((dbg_fp)&&(gie != m_core->v__DOT__thecpu__DOT__gie)) {
fprintf(dbg_fp, "SWITCH FROM %s to %s: sPC = 0x%08x uPC = 0x%08x pf_pc = 0x%08x\n",
(gie)?"User":"Supervisor",
(gie)?"Supervisor":"User",
m_core->v__DOT__thecpu__DOT__ipc,
m_core->v__DOT__thecpu__DOT__upc,
m_core->v__DOT__thecpu__DOT__pf_pc);
} if (dbg_fp) {
dbgins("Op - ", m_core->v__DOT__thecpu__DOT__op_ce,
m_core->v__DOT__thecpu__DOT__opvalid,
m_core->v__DOT__thecpu__DOT__op_gie,
m_core->v__DOT__thecpu__DOT__op_stall,
m_core->v__DOT__thecpu__DOT__op_pc-1);
dbgins("Al - ",
m_core->v__DOT__thecpu__DOT__alu_ce,
m_core->v__DOT__thecpu__DOT__alu_pc_valid,
m_core->v__DOT__thecpu__DOT__alu_gie,
m_core->v__DOT__thecpu__DOT__alu_stall,
m_core->v__DOT__thecpu__DOT__alu_pc-1);
 
}
 
if (m_core->v__DOT__cpu_dbg_we) {
printf("WRITE-ENABLE!!\n");
bomb = true;
}
}
 
bool test_success(void) {
return ((!m_core->v__DOT__thecpu__DOT__gie)
&&(m_core->v__DOT__thecpu__DOT__sleep));
}
 
bool test_failure(void) {
return ((m_core->v__DOT__thecpu__DOT__alu_pc_valid)
&&(!m_core->v__DOT__thecpu__DOT__alu_gie)
&&(m_mem[m_core->v__DOT__thecpu__DOT__alu_pc-1]
== 0x2f0f7fff));
}
 
void wb_write(unsigned a, unsigned int v) {
mvprintw(0,35, "%40s", "");
mvprintw(0,40, "wb_write(%d,%x)", a, v);
m_core->i_dbg_cyc = 1;
m_core->i_dbg_stb = 1;
m_core->i_dbg_we = 1;
m_core->i_dbg_addr = a & 1;
m_core->i_dbg_data = v;
 
tick();
while(m_core->o_dbg_stall)
tick();
 
m_core->i_dbg_stb = 0;
while(!m_core->o_dbg_ack)
tick();
 
// Release the bus
m_core->i_dbg_cyc = 0;
m_core->i_dbg_stb = 0;
tick();
mvprintw(0,35, "%40s", "");
mvprintw(0,40, "wb_write -- complete");
}
 
unsigned long wb_read(unsigned a) {
unsigned int v;
mvprintw(0,35, "%40s", "");
mvprintw(0,40, "wb_read(0x%08x)", a);
m_core->i_dbg_cyc = 1;
m_core->i_dbg_stb = 1;
m_core->i_dbg_we = 0;
m_core->i_dbg_addr = a & 1;
 
tick();
while(m_core->o_dbg_stall)
tick();
 
m_core->i_dbg_stb = 0;
while(!m_core->o_dbg_ack)
tick();
v = m_core->o_dbg_data;
 
// Release the bus
m_core->i_dbg_cyc = 0;
m_core->i_dbg_stb = 0;
tick();
 
mvprintw(0,35, "%40s", "");
mvprintw(0,40, "wb_read = 0x%08x", v);
 
return v;
}
 
};
 
 
int main(int argc, char **argv) {
Verilated::commandArgs(argc, argv);
ZIPPY_TB *tb = new ZIPPY_TB();
ZPARSER zp;
 
printf("uCC = %d\n", (int)zp.ZIP_uCC);
printf("MOV CC,R0 = 0x%08x\n", zp.op_mov(0,zp.ZIP_uCC, zp.ZIP_R0));
// = 0x200e8000
// Op = 0x2
// Result = 0x0, R0 (Supervisor/default)
// Cond = 0x0
// BReg = 0xe (CC)
// BMap = 1, BReg = uCC
//
 
initscr();
raw();
noecho();
keypad(stdscr, true);
 
// mem[0x00000] = 0xbe000010; // Halt instruction
unsigned int mptr = 0;
/*
tb->m_mem[mptr++] = 0x30000000; // 0: CLR R0
tb->m_mem[mptr++] = 0x21000000; // 1: MOV R0,R1
tb->m_mem[mptr++] = 0x22000001; // 2: MOV $1+R0,R2
tb->m_mem[mptr++] = 0x23000002; // 3: MOV $2+R0,R3
tb->m_mem[mptr++] = 0x24000022; // 4: MOV $22h+R0,R4
tb->m_mem[mptr++] = 0x25100377; // 5: MOV $377h+R0,uR5
tb->m_mem[mptr++] = 0x4e000000; // 6: NOOP
tb->m_mem[mptr++] = 0xa0120000; // 7: ADD R2,R0
tb->m_mem[mptr++] = 0xa0000020; // 8: ADD $32,R0
tb->m_mem[mptr++] = 0xa00fffdf; // 9: ADD -$33,R0
tb->m_mem[mptr++] = 0xc02fffff; // A: NOT.Z R0
tb->m_mem[mptr++] = 0xc0100000; // B: CLRF R0
tb->m_mem[mptr++] = 0x31000005; // C: LDI $5,R1
tb->m_mem[mptr++] = 0x00110000; // D: CMP R0,R1
tb->m_mem[mptr++] = 0xc0afffff; // E: NOT.LT R0
tb->m_mem[mptr++] = 0xc1cfffff; // F: NOT.GE R1
tb->m_mem[mptr++] = 0x621ffff9; // 10: LOD $-7(PC),R2
tb->m_mem[mptr++] = 0x4f13dead; // 11: LODIHI $deadh,R3
tb->m_mem[mptr++] = 0x4f03beef; // 12: LODILO $beefh,R3
tb->m_mem[mptr++] = 0x731f0002; // 13: STO R3,$2(PC)
*/
 
/*
tb->m_mem[mptr++] = zp.op_clr(zp::ZIP_R12);// 0: CLR R12
tb->m_mem[mptr++] = 0x4f1cc000; // 1: LODIHI $c000h,R12
tb->m_mem[mptr++] = 0x2c1c0000; // 2: MOV R12,uR12
tb->m_mem[mptr++] = 0x2f1f000a; // 3: MOV $12+PC,uPC
tb->m_mem[mptr++] = 0x4f108001; // 4: LODIHI $8001,R0 // Turn on trap
tb->m_mem[mptr++] = 0x4f00ffff; // 5: LODILO $ffff,R0 // interrupts
tb->m_mem[mptr++] = 0x701c0001; // 6: STO R0,$1(R12)
tb->m_mem[mptr++] = 0xbe000020; // 7: RTU // Switch to user mode
tb->m_mem[mptr++] = 0x601c0000; // 8: LOD (R12),R0 // Check the result
tb->m_mem[mptr++] = 0x00000000; // A: CMP $0,R0
tb->m_mem[mptr++] = 0x2f4f0001; // B: BNZ $1+PC
tb->m_mem[mptr++] = 0xbe000010; // C: HALT // On SUCCESS
tb->m_mem[mptr++] = 0x2f0f7fff; // D: BRA PC-1 // On FAILURE
*/
 
tb->m_mem[mptr++] = zp.op_clr(zp.ZIP_R0); // 0: CLR R0
tb->m_mem[mptr++] = zp.op_mov(zp.ZIP_R0,zp.ZIP_R1); // 1: MOV R0,R1
tb->m_mem[mptr++] = zp.op_mov(1,zp.ZIP_R0,zp.ZIP_R2); // 2: MOV $1+R0,R2
tb->m_mem[mptr++] = zp.op_mov(2,zp.ZIP_R0,zp.ZIP_R3); // 3: MOV $2+R0,R3
tb->m_mem[mptr++] = zp.op_mov(0x022, zp.ZIP_R0, zp.ZIP_R4); // 4: MOV $22h+R0,R4
tb->m_mem[mptr++] = zp.op_mov(0x377, zp.ZIP_R0, zp.ZIP_uR5); // 5: MOV $377h+R0,uR5
tb->m_mem[mptr++] = zp.op_noop(); // 6: NOOP
tb->m_mem[mptr++] = zp.op_add(0,zp.ZIP_R2,zp.ZIP_R0); // 7: ADD R2,R0
tb->m_mem[mptr++] = zp.op_add(32,zp.ZIP_R0); // 8: ADD $32,R0
tb->m_mem[mptr++] = zp.op_add(-33,zp.ZIP_R0); // 9: ADD -$33,R0
tb->m_mem[mptr++] = zp.op_not(zp.ZIPC_Z, zp.ZIP_R0); // A: NOT.Z R0
tb->m_mem[mptr++] = zp.op_clrf(zp.ZIP_R0); // B: CLRF R0
tb->m_mem[mptr++] = zp.op_ldi(5,zp.ZIP_R1); // C: LDI $5,R1
tb->m_mem[mptr++] = zp.op_cmp(0,zp.ZIP_R0,zp.ZIP_R1); // D: CMP R0,R1
tb->m_mem[mptr++] = zp.op_not(zp.ZIPC_LT, zp.ZIP_R0); // E: NOT.LT R0
tb->m_mem[mptr++] = zp.op_not(zp.ZIPC_GE, zp.ZIP_R1); // F: NOT.GE R1
tb->m_mem[mptr++] = zp.op_lod(-7,zp.ZIP_PC, zp.ZIP_R2); // 10: LOD $-7(PC),R2
tb->m_mem[mptr++] = zp.op_ldihi(0xdead, zp.ZIP_R3); // 11: LODIHI $deadh,R3
tb->m_mem[mptr++] = zp.op_ldilo(0xbeef, zp.ZIP_R3); // 12: LODILO $beefh,R3
 
// Let's build a software test bench.
tb->m_mem[mptr++] = zp.op_clr(zp.ZIP_R12);// 0: CLR R12
tb->m_mem[mptr++] = zp.op_ldihi(0xc000,zp.ZIP_R12);
tb->m_mem[mptr++] = zp.op_mov(zp.ZIP_R12,zp.ZIP_uR12);
tb->m_mem[mptr++] = zp.op_mov(10,zp.ZIP_PC,zp.ZIP_uPC);
tb->m_mem[mptr++] = zp.op_clr(zp.ZIP_R0); // Clear R0, and disable ints
tb->m_mem[mptr++] = zp.op_sto(zp.ZIP_R0,0,zp.ZIP_R12);
tb->m_mem[mptr++] = zp.op_rtu(); // 7: RTU // Switch to user mode
tb->m_mem[mptr++] = zp.op_mov(0,zp.ZIP_uCC, zp.ZIP_R0); // Check result
tb->m_mem[mptr++] = zp.op_tst(-256,zp.ZIP_R0);
tb->m_mem[mptr++] = zp.op_bnz(1);
tb->m_mem[mptr++] = zp.op_halt();// On SUCCESS
tb->m_mem[mptr++] = zp.op_busy(); // On FAILURE
 
 
// Now for a series of tests. If the test fails, call the trap
// interrupt with the test number that failed. Upon completion,
// call the trap with #0.
 
// Now for a series of tests. If the test fails, call the trap
// interrupt with the test number that failed. Upon completion,
// call the trap with #0.
 
// Test LDI to PC
// Some data registers
tb->m_mem[mptr] = mptr + 5 + 0x0100000; mptr++;
tb->m_mem[mptr++] = zp.op_ldi(0x020,zp.ZIP_CC); // LDI $GIE,CC
tb->m_mem[mptr++] = zp.op_ldi(0x0200,zp.ZIP_R11); // LDI $200h,R11
tb->m_mem[mptr++] = zp.op_lod(-4,zp.ZIP_PC,zp.ZIP_PC); // 1: LOD $-3(PC),PC
tb->m_mem[mptr++] = zp.op_clr(zp.ZIP_R11); // 2: CLR R11
tb->m_mem[mptr++] = zp.op_noop(); // 3: NOOP
tb->m_mem[mptr++] = zp.op_cmp(0,zp.ZIP_R11); // 4: CMP $0,R11
tb->m_mem[mptr++] = zp.op_mov(zp.ZIPC_Z, 0, zp.ZIP_R11,zp.ZIP_R10); // 5: STO.Z R11,(R12)
tb->m_mem[mptr++] = zp.op_mov(zp.ZIPC_Z, 0, zp.ZIP_R11,zp.ZIP_CC); // 5: STO.Z R11,(R12)
tb->m_mem[mptr++] = zp.op_add(1,zp.ZIP_R0); // 6: ADD $1,R0
tb->m_mem[mptr++] = zp.op_add(1,zp.ZIP_R0); // 7: ADD $1,R0
 
// Let's test whether overflow works
tb->m_mem[mptr++] = zp.op_ldi(0x0300,zp.ZIP_R11); // 0: LDI $3,R11
tb->m_mem[mptr++] = zp.op_ldi(-1,zp.ZIP_R0); // 1: LDI $-1,R0
tb->m_mem[mptr++] = zp.op_lsr(1,zp.ZIP_R0); // R0 // R0 = max int
tb->m_mem[mptr++] = zp.op_add(1,zp.ZIP_R0); // Should set ovfl
tb->m_mem[mptr++] = zp.op_bv(1); // 4: BV $1+PC
tb->m_mem[mptr++] = zp.op_mov(0,zp.ZIP_R11, zp.ZIP_CC); // FAIL! if here
// Overflow set from subtraction
tb->m_mem[mptr++] = zp.op_ldi(0x0400,zp.ZIP_R11); // 6: LDI $4,R11
tb->m_mem[mptr++] = zp.op_ldi(1,zp.ZIP_R0); // 7: LDI $1,R0
tb->m_mem[mptr++] = 0x5000001f; // 8: ROL $31,R0
tb->m_mem[mptr++] = zp.op_sub(1,zp.ZIP_R0); // Should set ovfl
tb->m_mem[mptr++] = zp.op_bv(1); // A: BV $1+PC
tb->m_mem[mptr++] = zp.op_mov(0,zp.ZIP_R11, zp.ZIP_CC); // FAIL! if here
// Overflow set from LSR
tb->m_mem[mptr++] = zp.op_ldi(0x0500,zp.ZIP_R11); // C: LDI $5,R11
tb->m_mem[mptr++] = zp.op_ldi(1,zp.ZIP_R0); // D: LDI $1,R0
tb->m_mem[mptr++] = 0x5000001f; // E: ROL $31,R0
tb->m_mem[mptr++] = zp.op_lsr(1,zp.ZIP_R0); // F: LSR $1,R0
tb->m_mem[mptr++] = zp.op_bv(1); // A: BV $1+PC
tb->m_mem[mptr++] = zp.op_mov(0,zp.ZIP_R11, zp.ZIP_CC); // FAIL! if here
// Overflow set from LSL
tb->m_mem[mptr++] = zp.op_ldi(0x0600,zp.ZIP_R11); // C: LDI $6,R11
tb->m_mem[mptr++] = zp.op_ldi(1,zp.ZIP_R0); // D: LDI $1,R0
tb->m_mem[mptr++] = 0x5000001e; // E: ROL $30,R0
tb->m_mem[mptr++] = zp.op_lsl(1,zp.ZIP_R0); // F: LSR $1,R0
tb->m_mem[mptr++] = zp.op_bv(1); // A: BV $1+PC
tb->m_mem[mptr++] = zp.op_mov(0,zp.ZIP_R11, zp.ZIP_CC); // FAIL! if here
// Overflow set from LSL, negative to positive
tb->m_mem[mptr++] = zp.op_ldi(0x0700,zp.ZIP_R11); // C: LDI $7,R11
tb->m_mem[mptr++] = zp.op_ldi(1,zp.ZIP_R0); // D: LDI $1,R0
tb->m_mem[mptr++] = 0x5000001f; // E: ROL $30,R0
tb->m_mem[mptr++] = zp.op_lsl(1,zp.ZIP_R0); // F: LSR $1,R0
tb->m_mem[mptr++] = zp.op_bv(1); // A: BV $1+PC
tb->m_mem[mptr++] = zp.op_mov(0,zp.ZIP_R11, zp.ZIP_CC); // FAIL! if here
 
 
// Test carry
tb->m_mem[mptr++] = zp.op_ldi(0x01000, zp.ZIP_R11); // 0: LDI $16,R11
tb->m_mem[mptr++] = zp.op_ldi(-1, zp.ZIP_R0); // 1: LDI $-1,R0
tb->m_mem[mptr++] = zp.op_add(1, zp.ZIP_R0); // 2: ADD $1,R0
tb->m_mem[mptr++] = zp.op_tst(2, zp.ZIP_CC); // 3: TST $2,CC // Is the carry set?
tb->m_mem[mptr++] = zp.op_mov(zp.ZIPC_Z,0,zp.ZIP_R11, zp.ZIP_CC); // FAIL! if here
// and carry from subtraction
tb->m_mem[mptr++] = zp.op_ldi(0x01100, zp.ZIP_R11); // 0: LDI $17,R11
tb->m_mem[mptr++] = zp.op_sub(1, zp.ZIP_R0); // 1: SUB $1,R0
tb->m_mem[mptr++] = zp.op_tst(2, zp.ZIP_CC); // 2: TST $2,CC // Is the carry set?
tb->m_mem[mptr++] = zp.op_mov(zp.ZIPC_Z,0,zp.ZIP_R11, zp.ZIP_CC); // FAIL! if here
 
 
// Let's try a loop: for i=0; i<5; i++)
// We'll use R0=i, Immediates for 5
tb->m_mem[mptr++] = zp.op_ldi(0x01200, zp.ZIP_R11); // 0: LDI $18,R11
tb->m_mem[mptr++] = zp.op_clr(zp.ZIP_R0); // 0: CLR R0
tb->m_mem[mptr++] = zp.op_noop();
tb->m_mem[mptr++] = zp.op_add(1, zp.ZIP_R0); // 2: R0 = R0 + 1
tb->m_mem[mptr++] = zp.op_cmp(5, zp.ZIP_R0); // 3: CMP $5,R0
tb->m_mem[mptr++] = zp.op_blt(-4); // 4: BLT PC-4
//
// Let's try a reverse loop. Such loops are usually cheaper to
// implement, and this one is no different: 2 loop instructions
// (minus setup instructions) vs 3 from before.
// R0 = 5; (from before)
// do {
// } while (R0 > 0);
tb->m_mem[mptr++] = zp.op_ldi(0x01300, zp.ZIP_R11); // 0: LDI $18,R11
tb->m_mem[mptr++] = zp.op_noop(); // 5: NOOP
tb->m_mem[mptr++] = zp.op_sub( 1, zp.ZIP_R0); // 6: R0 = R0 - 1
tb->m_mem[mptr++] = zp.op_bgt(-3); // 7: BGT PC-3
// How about the same thing with a >= comparison?
// R1 = 5; // Need to do this explicitly
// do {
// } while(R1 >= 0);
tb->m_mem[mptr++] = zp.op_ldi(0x01400, zp.ZIP_R11); // 0: LDI $18,R11
tb->m_mem[mptr++] = zp.op_ldi(5, zp.ZIP_R1);
tb->m_mem[mptr++] = zp.op_noop();
tb->m_mem[mptr++] = zp.op_sub(1, zp.ZIP_R1);
tb->m_mem[mptr++] = zp.op_bge(-3);
 
// Let's try the reverse loop again, only this time we'll store our
// loop variable in memory.
// R0 = 5; (from before)
// do {
// } while (R0 > 0);
tb->m_mem[mptr++] = zp.op_ldi(0x01500, zp.ZIP_R11); // 0: LDI $18,R11
tb->m_mem[mptr++] = zp.op_bra(1); // Give us a memory location
tb->m_mem[mptr++] = 5; // Loop five times
tb->m_mem[mptr++] = zp.op_mov(-2, zp.ZIP_PC, zp.ZIP_R1); // Get var adr
tb->m_mem[mptr++] = zp.op_clr(zp.ZIP_R2);
tb->m_mem[mptr++] = zp.op_ldi(5, zp.ZIP_R0);
tb->m_mem[mptr++] = zp.op_sto(zp.ZIP_R0,0,zp.ZIP_R1);
tb->m_mem[mptr++] = zp.op_add(1,zp.ZIP_R2);
tb->m_mem[mptr++] = zp.op_add(14,zp.ZIP_R0);
tb->m_mem[mptr++] = zp.op_lod(0,zp.ZIP_R1,zp.ZIP_R0);
tb->m_mem[mptr++] = zp.op_sub( 1, zp.ZIP_R0);
tb->m_mem[mptr++] = zp.op_bgt(-6);
tb->m_mem[mptr++] = zp.op_cmp( 5, zp.ZIP_R2);
tb->m_mem[mptr++] = zp.op_mov(zp.ZIPC_NZ, 0, zp.ZIP_R11, zp.ZIP_CC);
 
// Return success / Test the trap interrupt
tb->m_mem[mptr++] = zp.op_clr(zp.ZIP_R11); // 0: CLR R11
tb->m_mem[mptr++] = zp.op_mov(zp.ZIP_R11, zp.ZIP_CC);
tb->m_mem[mptr++] = zp.op_noop(); // 2: NOOP // Give it a chance to take
tb->m_mem[mptr++] = zp.op_noop(); // 3: NOOP // effect
 
// Go into an infinite loop if the trap fails
// Permanent loop instruction -- a busy halt if you will
tb->m_mem[mptr++] = zp.op_busy(); // 4: BRA PC-1
 
// And, in case we miss a halt ...
tb->m_mem[mptr++] = zp.op_halt(); // HALT
 
tb->reset();
int chv = 'q';
const bool live_debug_mode = true;
 
if (live_debug_mode) {
bool done = false, halted = true, manual = true;
 
halfdelay(1);
tb->wb_write(CMD_REG, CMD_HALT | CMD_RESET);
// while((tb->wb_read(CMD_REG) & (CMD_HALT|CMD_STALL))==(CMD_HALT|CMD_STALL))
// tb->show_state();
 
while(!done) {
chv = getch();
switch(chv) {
case 'h': case 'H':
tb->wb_write(CMD_REG, CMD_HALT);
if (!halted)
erase();
halted = true;
break;
case 'g': case 'G':
tb->wb_write(CMD_REG, 0);
if (halted)
erase();
halted = false;
manual = false;
break;
case 'q': case 'Q':
done = true;
break;
case 'r': case 'R':
tb->wb_write(CMD_REG, CMD_RESET|CMD_HALT);
halted = true;
erase();
break;
case 's': case 'S':
tb->wb_write(CMD_REG, CMD_STEP);
manual = false;
break;
case 't': case 'T':
manual = true;
tb->tick();
break;
case ERR:
default:
if (!manual)
tb->tick();
}
 
if (manual) {
tb->show_state();
} else if (halted) {
if (tb->dbg_fp)
fprintf(tb->dbg_fp, "\n\nREAD-STATE ******\n");
tb->read_state();
} else
tb->show_state();
 
if (tb->m_core->i_rst)
done =true;
if (tb->bomb)
done = true;
}
} else { // Manual stepping mode
tb->show_state();
 
while('q' != tolower(chv = getch())) {
tb->tick();
tb->show_state();
 
if (tb->test_success())
break;
else if (tb->test_failure())
break;
}
}
 
endwin();
 
if (tb->test_success())
printf("SUCCESS!\n");
else if (tb->test_failure())
printf("TEST FAILED!\n");
else if (chv == 'q')
printf("chv = %c\n", chv);
exit(0);
}
 
/zipcpu/trunk/bench/cpp/twoc.h
0,0 → 1,46
////////////////////////////////////////////////////////////////////////////
//
// Filename: twoc.h
//
// Project: A Doubletime Pipelined FFT
//
// Purpose: Some various two's complement related C++ helper routines.
// Specifically, these help extract signed numbers from
// packed bitfields, while guaranteeing that the upper bits
// are properly sign extended (or not) as desired.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
#ifndef TWOC_H
#define TWOC_H
 
extern long sbits(const long val, const int bits);
extern unsigned long ubits(const long val, const int bits);
 
#endif
 
/zipcpu/trunk/bench/cpp/testb.h
0,0 → 1,70
////////////////////////////////////////////////////////////////////////////////
//
// Filename: testb.h
//
// Project: Zip CPU -- a small, lightweight, RISC CPU core
//
// Purpose: A wrapper for a common interface to a clocked FPGA core
// begin exercised in Verilator.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
#ifndef TESTB_H
#define TESTB_H
 
template <class VA> class TESTB {
public:
VA *m_core;
unsigned long m_tickcount;
 
TESTB(void) { m_core = new VA; }
~TESTB(void) { delete m_core; m_core = NULL; }
 
virtual void eval(void) {
m_core->eval();
}
 
virtual void tick(void) {
m_core->i_clk = 0;
eval();
m_core->i_clk = 1;
eval();
 
m_tickcount++;
}
 
virtual void reset(void) {
m_core->i_rst = 1;
tick();
m_core->i_rst = 0;
m_tickcount = 0l;
printf("RESET\n");
}
};
 
#endif
/zipcpu/trunk/bench/cpp/memsim.cpp
0,0 → 1,104
////////////////////////////////////////////////////////////////////////////////
//
// Filename: memsim.cpp
//
// Project: Zip CPU -- a small, lightweight, RISC CPU core
//
// Purpose: This creates a memory like device to act on a WISHBONE bus.
// It doesn't exercise the bus thoroughly, but does give some
// exercise to the bus to see whether or not the bus master
// can control it.
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <assert.h>
#include "memsim.h"
 
MEMSIM::MEMSIM(const unsigned int nwords) {
unsigned int nxt;
for(nxt=1; nxt < nwords; nxt<<=1)
;
m_len = nxt; m_mask = nxt-1;
m_mem = new BUSW[m_len];
}
 
MEMSIM::~MEMSIM(void) {
delete[] m_mem;
}
 
void MEMSIM::load(const char *fname) {
FILE *fp;
unsigned int nr;
 
fp = fopen(fname, "r");
if (!fp) {
fprintf(stderr, "Could not open/load file \'%s\'\n",
fname);
perror("O/S Err:");
fprintf(stderr, "\tInitializing memory with zero instead.\n");
nr = 0;
} else {
nr = fread(m_mem, sizeof(BUSW), m_len, fp);
fclose(fp);
 
if (nr != m_len) {
fprintf(stderr, "Only read %d of %d words\n",
nr, m_len);
fprintf(stderr, "\tFilling the rest with zero.\n");
}
}
 
for(; nr<m_len; nr++)
m_mem[nr] = 0l;
}
 
void MEMSIM::apply(const unsigned char wb_cyc,
const unsigned char wb_stb, const unsigned char wb_we,
const BUSW wb_addr, const BUSW wb_data,
unsigned char &o_ack, unsigned char &o_stall, BUSW &o_data) {
if ((wb_cyc)&&(wb_stb)) {
if (wb_we)
m_mem[wb_addr & m_mask] = wb_data;
o_ack = 1;
o_stall= 0;
o_data = m_mem[wb_addr & m_mask];
 
/*
printf("MEMBUS -- ACK %s 0x%08x - 0x%08x\n",
(wb_we)?"WRITE":"READ",
wb_addr, o_data);
*/
} else {
o_ack = 0;
o_stall = 0;
}
}
 
 
/zipcpu/trunk/bench/cpp/twoc.cpp
0,0 → 1,55
////////////////////////////////////////////////////////////////////////////
//
// Filename: twoc.cpp
//
// Project: A Doubletime Pipelined FFT
//
// Purpose: Some various two's complement related C++ helper routines.
// Specifically, these help extract signed numbers from
// packed bitfields, while guaranteeing that the upper bits
// are properly sign extended (or not) as desired.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
#include "twoc.h"
 
long sbits(const long val, const int bits) {
long r;
 
r = val & ((1l<<bits)-1);
if (r & (1l << (bits-1)))
r |= (-1l << bits);
return r;
}
 
unsigned long ubits(const long val, const int bits) {
unsigned long r = val & ((1l<<bits)-1);
return r;
}
 
 
/zipcpu/trunk/bench/cpp/Makefile
0,0 → 1,49
################################################################################
#
# Filename: Makefile
#
# Project: Zip CPU -- a small, lightweight, RISC CPU soft core
#
# Purpose: This makefile builds the final verilator simulation of the
# zipsystem. Specifically, it builds the final C++ portion
# of the simulator, and thus the final simulator executable.
#
# This simulator depends upon the ncurses library.
#
#
# Creator: Dan Gisselquist, Ph.D.
# Gisselquist Tecnology, LLC
#
################################################################################
#
# Copyright (C) 2015, Gisselquist Technology, LLC
#
# This program is free software (firmware): you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# License: GPL, v3, as defined and found on www.gnu.org,
# http://www.gnu.org/licenses/gpl.html
#
#
################################################################################
#
all: zippy_tb
 
CXX := g++
FLAGS := -Wall -Og -g
ZASM := ../../sw/zasm
INCS := -I../../rtl/obj_dir/ -I/usr/share/verilator/include -I../../sw/zasm
SOURCES := zippy_tb.cpp memsim.cpp twoc.cpp $(ZASM)/zopcodes.cpp $(ZASM)/zparser.cpp
RAWLIB := /usr/share/verilator/include/verilated.cpp ../../rtl/obj_dir/Vzipsystem__ALL.a
LIBS := $(RAWLIB) -lncurses
 
zippy_tb: $(SOURCES) $(RAWLIB) $(ZASM)/zopcodes.h $(ZASM)/zparser.h
$(CXX) $(FLAGS) $(INCS) $(SOURCES) $(LIBS) -o $@
 
/zipcpu/trunk/bench/cpp/memsim.h
0,0 → 1,65
////////////////////////////////////////////////////////////////////////////////
//
// Filename: memsim.h
//
// Project: Zip CPU -- a small, lightweight, RISC CPU core
//
// Purpose: This creates a memory like device to act on a WISHBONE bus.
// It doesn't exercise the bus thoroughly, but does give some
// exercise to the bus to see whether or not the bus master
// can control it.
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
#ifndef MEMSIM_H
#define MEMSIM_H
 
class MEMSIM {
public:
typedef unsigned int BUSW;
typedef unsigned char uchar;
 
BUSW *m_mem, m_len, m_mask;
 
MEMSIM(const unsigned int nwords);
~MEMSIM(void);
void load(const char *fname);
void apply(const uchar wb_cyc, const uchar wb_stb, const uchar wb_we,
const BUSW wb_addr, const BUSW wb_data,
uchar &o_ack, uchar &o_stall, BUSW &o_data);
void operator()(const uchar wb_cyc, const uchar wb_stb, const uchar wb_we,
const BUSW wb_addr, const BUSW wb_data,
uchar &o_ack, uchar &o_stall, BUSW &o_data) {
apply(wb_cyc, wb_stb, wb_we, wb_addr, wb_data, o_ack, o_stall, o_data);
}
BUSW &operator[](const BUSW addr) { return m_mem[addr&m_mask]; }
};
 
#endif
/zipcpu/trunk/rtl/core/memops.v
0,0 → 1,53
module memops(i_clk, i_rst, i_stb,
i_op, i_addr, i_data, i_oreg,
o_busy, o_valid, o_wreg, o_result,
o_wb_cyc, o_wb_stb, o_wb_we, o_wb_addr, o_wb_data,
i_wb_ack, i_wb_stall, i_wb_data);
input i_clk, i_rst;
input i_stb;
// CPU interface
input i_op;
input [31:0] i_addr;
input [31:0] i_data;
input [4:0] i_oreg;
// CPU outputs
output wire o_busy;
output reg o_valid;
output reg [4:0] o_wreg;
output reg [31:0] o_result;
// Wishbone outputs
output reg o_wb_cyc, o_wb_stb, o_wb_we;
output reg [31:0] o_wb_addr, o_wb_data;
// Wishbone inputs
input i_wb_ack, i_wb_stall;
input [31:0] i_wb_data;
 
always @(posedge i_clk)
if (i_rst)
o_wb_cyc <= 1'b0;
else if (o_wb_cyc)
begin
o_wb_stb <= (o_wb_stb)&&(i_wb_stall);
o_wb_cyc <= (~i_wb_ack);
end else if (i_stb) // New memory operation
begin
// Grab the wishbone
o_wb_cyc <= 1'b1;
o_wb_stb <= 1'b1;
o_wb_we <= i_op;
o_wb_data <= i_data;
o_wb_addr <= i_addr;
end
 
initial o_valid = 1'b0;
always @(posedge i_clk)
o_valid <= (o_wb_cyc)&&(i_wb_ack)&&(~o_wb_we)&&(~i_rst);
assign o_busy = o_wb_cyc;
 
always @(posedge i_clk)
if ((i_stb)&&(~o_wb_cyc))
o_wreg <= i_oreg;
always @(posedge i_clk)
if ((o_wb_cyc)&&(i_wb_ack))
o_result <= i_wb_data;
endmodule
/zipcpu/trunk/rtl/core/prefetch.v
0,0 → 1,107
////////////////////////////////////////////////////////////////////////////////
//
// Filename: prefetch.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: This is a very simple instruction fetch approach. It gets
// one instruction at a time. Future versions should pipeline
// fetches and perhaps even cache results--this doesn't do that.
// It should, however, be simple enough to get things running.
//
// The interface is fascinating. The 'i_pc' input wire is just
// a suggestion of what to load. Other wires may be loaded
// instead. i_pc is what must be output, not necessarily input.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
// Flash requires a minimum of 4 clocks per byte to read, so that would be
// 4*(4bytes/32bit word) = 16 clocks per word read---and that's in pipeline
// mode which this prefetch does not support. In non--pipelined mode, the
// flash will require (16+6+6)*2 = 56 clocks plus 16 clocks per word read,
// or 72 clocks to fetch one instruction.
module prefetch(i_clk, i_rst, i_ce, i_pc, i_aux,
o_i, o_pc, o_aux, o_valid,
o_wb_cyc, o_wb_stb, o_wb_we, o_wb_addr, o_wb_data,
i_wb_ack, i_wb_stall, i_wb_data);
parameter AW = 1;
input i_clk, i_rst, i_ce;
input [31:0] i_pc;
input [(AW-1):0] i_aux;
output reg [31:0] o_i;
output reg [31:0] o_pc;
output reg [(AW-1):0] o_aux;
output wire o_valid;
// Wishbone outputs
output reg o_wb_cyc, o_wb_stb;
output wire o_wb_we;
output reg [31:0] o_wb_addr;
output wire [31:0] o_wb_data;
// And return inputs
input i_wb_ack, i_wb_stall;
input [31:0] i_wb_data;
 
assign o_wb_we = 1'b0;
assign o_wb_data = 32'h0000;
 
// Let's build it simple and upgrade later: For each instruction
// we do one bus cycle to get the instruction. Later we should
// pipeline this, but for now let's just do one at a time.
initial o_wb_cyc = 1'b0;
initial o_wb_stb = 1'b0;
initial o_wb_addr= 0;
always @(posedge i_clk)
if (i_rst)
begin
o_wb_cyc <= 1'b0;
if (o_wb_cyc)
o_wb_addr <= 0;
end else if ((i_ce)&&(~o_wb_cyc)&&(o_wb_addr == i_pc))
begin // Single value cache check
o_aux <= i_aux;
// o_i was already set during the last bus cycle
end else if ((i_ce)&&(~o_wb_cyc)) // Initiate a bus cycle
begin
o_wb_cyc <= 1'b1;
o_wb_stb <= 1'b1;
o_wb_addr <= i_pc;
o_aux <= i_aux;
end else if (o_wb_cyc) // Independent of ce
begin
if ((o_wb_cyc)&&(o_wb_stb)&&(~i_wb_stall))
o_wb_stb <= 1'b0;
if (i_wb_ack)
o_wb_cyc <= 1'b0;
end
 
always @(posedge i_clk)
if ((o_wb_cyc)&&(i_wb_ack))
o_i <= i_wb_data;
always @(posedge i_clk)
if ((o_wb_cyc)&&(i_wb_ack))
o_pc <= o_wb_addr;
 
assign o_valid = (i_pc == o_pc)&&(i_aux == o_aux)&&(~o_wb_cyc);
 
endmodule
/zipcpu/trunk/rtl/core/pipefetch.v
0,0 → 1,183
////////////////////////////////////////////////////////////////////////////////
//
// Filename: regset.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose:
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
module pipefetch(i_clk, i_rst, i_new_pc, i_stall_n, i_pc,
o_i, o_pc, o_v,
o_wb_cyc, o_wb_stb, o_wb_we, o_wb_addr, o_wb_data,
i_wb_ack, i_wb_stall, i_wb_data);
parameter LGCACHELEN = 6, CACHELEN=(1<<LGCACHELEN), BUSW=32;
input i_clk, i_rst, i_new_pc, i_stall_n;
input [(BUSW-1):0] i_pc;
output reg [(BUSW-1):0] o_i;
output reg [(BUSW-1):0] o_pc;
output wire o_v;
//
output reg o_wb_cyc, o_wb_stb;
output wire o_wb_we;
output reg [(BUSW-1):0] o_wb_addr;
output wire [(BUSW-1):0] o_wb_data;
//
input i_wb_ack, i_wb_stall;
input [(BUSW-1):0] i_wb_data;
 
// Fixed bus outputs: we read from the bus only, never write.
// Thus the output data is ... irrelevant and don't care. We set it
// to zero just to set it to something.
assign o_wb_we = 1'b0;
assign o_wb_data = 0;
 
reg [(BUSW-1):0] r_cache_base, r_cache_offset;
reg [(LGCACHELEN):0] r_nvalid, r_acks_waiting;
reg [(BUSW-1):0] cache[0:(CACHELEN-1)];
 
wire [(LGCACHELEN-1):0] c_cache_offset;
assign c_cache_offset = r_cache_offset[(LGCACHELEN-1):0];
 
reg r_addr_set;
reg [(BUSW-1):0] r_addr;
 
wire [(BUSW-1):0] bus_nvalid;
assign bus_nvalid = { {(BUSW-LGCACHELEN-1){1'b0}}, r_nvalid };
 
initial r_nvalid = 0;
initial r_cache_base = 0;
always @(posedge i_clk)
begin
if (i_rst)
o_wb_cyc <= 1'b0;
else if ((~o_wb_cyc)&&(i_new_pc)&&(r_nvalid != 0)
&&(i_pc > r_cache_base)
&&(i_pc < r_cache_base + bus_nvalid))
begin
// The new instruction is in our cache, do nothing
// with the bus here.
end else if ((o_wb_cyc)&&(i_new_pc)&&(r_nvalid != 0)
&&((i_pc < r_cache_base)
||(i_pc >= r_cache_base + CACHELEN)))
begin
// We need to abandon our bus action to start over in
// a new region, setting up a new cache. This may
// happen mid cycle while waiting for a result. By
// dropping o_wb_cyc, we state that we are no longer
// interested in that result--whatever it might be.
o_wb_cyc <= 1'b0;
o_wb_stb <= 1'b0;
end else if ((~o_wb_cyc)&&(
((i_new_pc)&&((r_nvalid == 0)
||(i_pc < r_cache_base)
||(i_pc >= r_cache_base + CACHELEN)))
||((r_addr_set)&&((r_addr < r_cache_base)
||(r_addr >= r_cache_base + CACHELEN)))
))
begin
// Start a bus transaction
o_wb_cyc <= 1'b1;
o_wb_stb <= 1'b1;
o_wb_addr <= (i_new_pc) ? i_pc : r_addr;
r_acks_waiting <= 0;
r_nvalid <= 0;
r_cache_base <= (i_new_pc) ? i_pc : r_addr;
r_cache_offset <= 0;
end else if ((~o_wb_cyc)&&(r_addr_set)
&&(r_addr >= r_cache_base
+ (1<<(LGCACHELEN-2))
+ (1<<(LGCACHELEN-1))))
begin
// If we're using the last quarter of the cache, then
// let's start a bus transaction to extend the cache.
o_wb_cyc <= 1'b1;
o_wb_stb <= 1'b1;
o_wb_addr <= r_cache_base + (1<<(LGCACHELEN));
r_acks_waiting <= 0;
r_nvalid <= r_nvalid - (1<<(LGCACHELEN-2));
r_cache_base <= r_cache_base + (1<<(LGCACHELEN-2));
r_cache_offset <= r_cache_offset + (1<<(LGCACHELEN-2));
end else if (o_wb_cyc)
begin
// This handles everything ... but the case where
// while reading we need to extend our cache.
if ((o_wb_stb)&&(~i_wb_stall))
begin
o_wb_addr <= o_wb_addr + 1;
if (o_wb_addr - r_cache_base >= CACHELEN-1)
o_wb_stb <= 1'b0;
end
 
if ((o_wb_stb)&&(~i_wb_stall)&&(~i_wb_ack))
r_acks_waiting <= r_acks_waiting
+ ((i_wb_ack)? 0:1);
else if ((i_wb_ack)&&((~o_wb_stb)||(i_wb_stall)))
r_acks_waiting <= r_acks_waiting - 1;
 
if (i_wb_ack)
begin
cache[r_nvalid[(LGCACHELEN-1):0]+c_cache_offset] <= i_wb_data;
r_nvalid <= r_nvalid + 1;
if ((r_acks_waiting == 1)&&(~o_wb_stb))
o_wb_cyc <= 1'b0;
end
end
end
 
initial r_addr_set = 1'b0;
always @(posedge i_clk)
if (i_rst)
r_addr_set <= 1'b0;
else if (i_new_pc)
r_addr_set <= 1'b1;
 
// Now, read from the cache
wire w_cv; // Cache valid, address is in the cache
reg r_cv;
assign w_cv = ((r_nvalid != 0)&&(r_addr>=r_cache_base)
&&(r_addr-r_cache_base < bus_nvalid));
always @(posedge i_clk)
r_cv <= (~i_new_pc)&&(w_cv);
assign o_v = (r_cv)&&(~i_new_pc);
 
always @(posedge i_clk)
if (i_new_pc)
r_addr <= i_pc;
else if ((i_stall_n)&&(w_cv))
r_addr <= r_addr + 1;
 
wire [(LGCACHELEN-1):0] c_rdaddr, c_cache_base;
assign c_cache_base = r_cache_base[(LGCACHELEN-1):0];
assign c_rdaddr = r_addr[(LGCACHELEN-1):0]-c_cache_base+c_cache_offset;
always @(posedge i_clk)
if (i_stall_n)
o_i <= cache[c_rdaddr];
always @(posedge i_clk)
if (i_stall_n)
o_pc <= r_addr;
 
endmodule
/zipcpu/trunk/rtl/core/cpuops.v
0,0 → 1,95
///////////////////////////////////////////////////////////////////////////
//
// Filename: cpuops.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose:
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
//
module cpuops(i_clk, i_rst, i_ce, i_valid, i_op, i_a, i_b, o_c, o_f, o_valid);
input i_clk, i_rst, i_ce;
input [3:0] i_op;
input [31:0] i_a, i_b;
input i_valid;
output reg [31:0] o_c;
output wire [3:0] o_f;
output reg o_valid;
 
wire [63:0] w_rol_tmp;
assign w_rol_tmp = { i_a, i_a } << i_b[4:0];
wire [31:0] w_rol_result;
assign w_rol_result = w_rol_tmp[63:32]; // Won't set flags
 
wire z, n, v;
reg c, pre_sign, set_ovfl;
always @(posedge i_clk)
if (i_ce)
set_ovfl =((((i_op==4'h0)||(i_op==4'h8)) // SUB&CMP
&&(i_a[31] != i_b[31]))
||((i_op==4'ha)&&(i_a[31] == i_b[31])) // ADD
||(i_op == 4'hd) // LSL
||(i_op == 4'hf)); // LSR
always @(posedge i_clk)
if (i_ce)
begin
pre_sign <= (i_a[31]);
c <= 1'b0;
case(i_op)
4'h0: { c, o_c } <= {(i_b>i_a),i_a - i_b};// CMP (SUB)
4'h1: o_c <= i_a & i_b; // BTST (And)
4'h2: o_c <= i_b; // MOV
// 4'h3: o_c <= { i_b[15:0],i_a[15:6],6'h20};//TRAP
// 4'h4: o_c <= i_a[15:0] * i_b[15:0];
4'h5: o_c <= w_rol_result; // ROL
4'h6: o_c <= { i_a[31:16], i_b[15:0] }; // LODILO
4'h7: o_c <= { i_b[15:0], i_a[15:0] }; // LODIHI
4'h8: { c, o_c } <= {(i_b>i_a), i_a - i_b }; // Sub
4'h9: o_c <= i_a & i_b; // And
4'ha: { c, o_c } <= i_a + i_b; // Add
4'hb: o_c <= i_a | i_b; // Or
4'hc: o_c <= i_a ^ i_b; // Xor
4'hd: { c, o_c } <= {1'b0, i_a } << i_b[4:0]; // LSL
4'he: { c, o_c } <= { i_a[31],i_a}>> (i_b[4:0]);// ASR
4'hf: { c, o_c } <= { 1'b0, i_a } >> (i_b[4:0]);// LSR
default: o_c <= i_b; // MOV, LDI
endcase
end
 
assign z = (o_c == 32'h0000);
assign n = (o_c[31]);
assign v = (set_ovfl)&&(pre_sign != o_c[31]);
 
assign o_f = { v, n, c, z };
 
initial o_valid = 1'b0;
always @(posedge i_clk)
if (i_rst)
o_valid <= 1'b0;
else if (i_ce)
o_valid <= i_valid;
else if (~i_ce)
o_valid <= 1'b0;
endmodule
/zipcpu/trunk/rtl/core/zipcpu.v
0,0 → 1,872
///////////////////////////////////////////////////////////////////////////////
//
// Filename: zipcpu.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: This is the top level module holding the core of the Zip CPU
// together. The Zip CPU is designed to be as simple as possible.
// The instruction set is about as RISC as you can get, there are
// only 16 instruction types supported (of which one isn't yet
// supported ...) Please see the accompanying iset.html file
// for a description of these instructions.
//
// All instructions are 32-bits wide. All bus accesses, both
// address and data, are 32-bits over a wishbone bus.
//
// The Zip CPU is fully pipelined with the following pipeline stages:
//
// 1. Prefetch, returns the instruction from memory. On the
// Basys board that I'm working on, one instruction may be
// issued every 20 clocks or so, unless and until I implement a
// cache or local memory.
//
// 2. Instruction Decode
//
// 3. Read Operands
//
// 4. Apply Instruction
//
// 4. Write-back Results
//
// A lot of difficult work has been placed into the pipeline stall
// handling. My original proposal was not to allow pipeline stalls at all.
// The idea would be that the CPU would just run every clock and whatever
// stalled answer took place would just get fixed a clock or two later,
// meaning that the compiler could just schedule everything out.
// This idea died at the memory interface, which can take a variable
// amount of time to read or write any value, thus the whole CPU needed
// to stall on a stalled memory access.
//
// My next idea was to just let things complete. I.e., once an instrution
// starts, it continues to completion no matter what and we go on. This
// failed at writing the PC. If the PC gets written in something such as
// a MOV PC,PC+5 instruction, 3 (or however long the pipeline is) clocks
// later, if whether or not something happens in those clocks depends
// upon the instruction fetch filling the pipeline, then the CPU has a
// non-deterministic behavior.
//
// This leads to two possibilities: either *everything* stalls upon a
// stall condition, or partial results need to be destroyed before
// they are written. This is made more difficult by the fact that
// once a command is written to the memory unit, whether it be a
// read or a write, there is no undoing it--since peripherals on the
// bus may act upon the answer with whatever side effects they might
// have. (For example, writing a '1' to the interrupt register will
// clear certain interrupts ...) Further, since the memory ops depend
// upon conditions, the we'll need to wait for the condition codes to
// be available before executing a memory op. Thus, memory ops can
// proceed without stalling whenever either the previous instruction
// doesn't write the flags register, or when the memory instruction doesn't
// depend upon the flags register.
//
// The other possibility is that we leave independent instruction
// execution behind, so that the pipeline is always full and stalls,
// or moves forward, together on every clock.
//
// For now, we pick the first approach: independent instruction execution.
// Thus, if stage 2 stalls, stages 3-5 may still complete the instructions
// in their pipeline. This leaves another problem: what happens on a
// MOV -1+PC,PC instruction? There will be four instructions behind this
// one (or is it five?) that will need to be 'cancelled'. So here's
// the plan: Anything can be cancelled before the ALU/MEM stage,
// since memory ops cannot be canceled after being issued. Thus, the
// ALU/MEM stage must stall if any prior instruction is going to write
// the PC register (i.e. JMP).
//
// Further, let's define a "STALL" as a reason to not execute a stage
// due to some condition at or beyond the stage, and let's define
// a VALID flag to mean that this stage has completed. Thus, the clock
// enable for a stage is (STG[n-1]VALID)&&((~STG[n]VALID)||(~STG[n]STALL)).
// The ALU/MEM stages will also depend upon a master clock enable
// (~SLEEP) condition as well.
//
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////////
//
`define CPU_PC_REG 4'hf
`define CPU_CC_REG 4'he
`define CPU_BREAK_BIT 7
`define CPU_STEP_BIT 6
`define CPU_GIE_BIT 5
`define CPU_SLEEP_BIT 4
module zipcpu(i_clk, i_rst, i_interrupt,
// Debug interface
i_halt, i_dbg_reg, i_dbg_we, i_dbg_data,
o_dbg_stall, o_dbg_reg,
o_break,
// CPU interface to the wishbone bus
o_wb_cyc, o_wb_stb, o_wb_we, o_wb_addr, o_wb_data,
i_wb_ack, i_wb_stall, i_wb_data,
// Accounting/CPU usage interface
o_mem_stall, o_pf_stall, o_alu_stall);
parameter RESET_ADDRESS=32'h0100000;
input i_clk, i_rst, i_interrupt;
// Debug interface -- inputs
input i_halt;
input [4:0] i_dbg_reg;
input i_dbg_we;
input [31:0] i_dbg_data;
// Debug interface -- outputs
output reg o_dbg_stall;
output reg [31:0] o_dbg_reg;
output wire o_break;
// Wishbone interface -- outputs
output wire o_wb_cyc, o_wb_stb, o_wb_we;
output wire [31:0] o_wb_addr, o_wb_data;
// Wishbone interface -- inputs
input i_wb_ack, i_wb_stall;
input [31:0] i_wb_data;
// Accounting outputs ... to help us count stalls and usage
output wire o_mem_stall;
output wire o_pf_stall;
output wire o_alu_stall;
 
// Registers
reg [31:0] regset [0:31];
reg [3:0] flags, iflags; // (BREAKEN,STEP,GIE,SLEEP ), V, N, C, Z
wire master_ce;
wire [7:0] w_uflags, w_iflags;
reg step, gie, sleep, break_en;
 
wire [4:0] mem_wreg;
wire mem_busy, mem_rdbusy;
 
reg [31:0] pf_pc;
reg new_pc;
 
//
//
// PIPELINE STAGE #1 :: Prefetch
// Variable declarations
//
wire pf_ce, dcd_stalled;
wire pf_cyc, pf_stb, pf_we, pf_busy, pf_ack, pf_stall;
wire [31:0] pf_addr, pf_data;
wire [31:0] instruction, instruction_pc;
wire pf_valid, instruction_gie;
 
//
//
// PIPELINE STAGE #2 :: Instruction Decode
// Variable declarations
//
//
reg opvalid, op_wr_pc, op_break;
wire op_stall, dcd_ce;
reg [3:0] dcdOp;
reg [4:0] dcdA, dcdB;
reg [3:0] dcdF;
reg dcdA_rd, dcdA_wr, dcdB_rd, dcdvalid,
dcdM, dcdF_wr, dcd_gie, dcd_break;
reg [31:0] dcd_pc;
reg [23:0] r_dcdI;
wire dcdA_stall, dcdB_stall, dcdF_stall;
 
 
 
//
//
// PIPELINE STAGE #3 :: Read Operands
// Variable declarations
//
//
//
// Now, let's read our operands
reg [4:0] alu_reg;
reg [3:0] opn;
reg [4:0] opR;
reg [1:0] opA_cc, opB_cc;
reg [31:0] r_opA, r_opB, op_pc;
wire [31:0] opA_nowait, opB_nowait, opA, opB;
reg opR_wr, opM, opF_wr, op_gie,
opA_rd, opB_rd;
reg [7:0] opFl;
// reg [6:0] r_opF;
wire [8:0] opF;
wire op_ce;
 
 
 
//
//
// PIPELINE STAGE #4 :: ALU / Memory
// Variable declarations
//
//
reg [31:0] alu_pc;
reg alu_pc_valid;;
wire alu_ce, alu_stall;
wire [31:0] alu_result;
wire [3:0] alu_flags;
wire alu_valid;
wire set_cond;
reg alu_wr, alF_wr, alu_gie;
 
 
 
wire mem_ce, mem_stalled;
wire mem_valid, mem_ack, mem_stall,
mem_cyc, mem_stb, mem_we;
wire [31:0] mem_addr, mem_data, mem_result;
 
 
 
//
//
// PIPELINE STAGE #5 :: Write-back
// Variable declarations
//
wire wr_reg_ce, wr_flags_ce, wr_write_pc;
wire [4:0] wr_reg_id;
wire [31:0] wr_reg_vl;
wire w_switch_to_interrupt, w_release_from_interrupt;
reg [31:0] upc, ipc;
 
 
 
//
// MASTER: clock enable.
//
assign master_ce = (~i_halt)&&(~o_break)&&(~sleep)&&(~mem_rdbusy);
 
 
//
// PIPELINE STAGE #1 :: Prefetch
// Calculate stall conditions
assign pf_ce = (~dcd_stalled);
 
//
// PIPELINE STAGE #2 :: Instruction Decode
// Calculate stall conditions
assign dcd_ce = (pf_valid)&&(~dcd_stalled);
assign dcd_stalled = (dcdvalid)&&(
(op_stall)
||((dcdA_stall)||(dcdB_stall)||(dcdF_stall))
||((opvalid)&&(op_wr_pc)));
//
// PIPELINE STAGE #3 :: Read Operands
// Calculate stall conditions
assign op_stall = (opvalid)&&(
((mem_stalled)&&(opM))
||((alu_stall)&&(~opM)));
assign op_ce = (dcdvalid)&&((~opvalid)||(~op_stall));
 
//
// PIPELINE STAGE #4 :: ALU / Memory
// Calculate stall conditions
assign alu_stall = (((~master_ce)||(mem_rdbusy))&&(opvalid)&&(~opM))
||((opvalid)&&(wr_reg_ce)&&(wr_reg_id == { op_gie, `CPU_PC_REG }));
assign alu_ce = (master_ce)&&(opvalid)&&(~opM)&&(~alu_stall)&&(~new_pc);
//
assign mem_ce = (master_ce)&&(opvalid)&&(opM)&&(~mem_stalled)&&(~new_pc)&&(set_cond);
assign mem_stalled = (mem_busy)||((opvalid)&&(opM)&&(
(~master_ce)
// Stall waiting for flags to be valid
||((~opF[8])&&(
((wr_reg_ce)&&(wr_reg_id[4:0] == {op_gie,`CPU_CC_REG}))))
// Do I need this last condition?
//||((wr_flags_ce)&&(alu_gie==op_gie))))
// Or waiting for a write to the PC register
||((wr_reg_ce)&&(wr_reg_id[4] == op_gie)&&(wr_write_pc))));
 
 
//
//
// PIPELINE STAGE #1 :: Prefetch
//
//
`ifdef SINGLE_FETCH
prefetch pf(i_clk, i_rst, (pf_ce), pf_pc, gie,
instruction, instruction_pc, instruction_gie,
pf_valid,
pf_cyc, pf_stb, pf_we, pf_addr,
pf_data,
pf_ack, pf_stall, i_wb_data);
`else // Pipe fetch
pipefetch pf(i_clk, i_rst, new_pc, ~dcd_stalled, pf_pc,
instruction, instruction_pc, pf_valid,
pf_cyc, pf_stb, pf_we, pf_addr, pf_data,
pf_ack, pf_stall, i_wb_data);
assign instruction_gie = gie;
`endif
 
always @(posedge i_clk)
if (i_rst)
dcdvalid <= 1'b0;
else if (dcd_ce)
dcdvalid <= (~new_pc);
else if ((~dcd_stalled)||(new_pc))
dcdvalid <= 1'b0;
 
always @(posedge i_clk)
if (dcd_ce)
begin
dcd_pc <= instruction_pc+1;
 
// Record what operation we are doing
dcdOp <= instruction[31:28];
 
// Default values
dcdA[4:0] <= { instruction_gie, instruction[27:24] };
dcdB[4:0] <= { instruction_gie, instruction[19:16] };
dcdM <= 1'b0;
dcdF_wr <= 1'b1;
dcd_break <= 1'b0;
 
// Set the condition under which we do this operation
// The top four bits are a mask, the bottom four the
// value the flags must equal once anded with the mask
dcdF <= { (instruction[23:21]==3'h0), instruction[23:21] };
casez(instruction[31:28])
4'h2: begin // Move instruction
if (~instruction_gie)
begin
dcdA[4] <= instruction[20];
dcdB[4] <= instruction[15];
end
dcdA_wr <= 1'b1;
dcdA_rd <= 1'b0;
dcdB_rd <= 1'b1;
r_dcdI <= { {(9){instruction[14]}}, instruction[14:0] };
dcdF_wr <= 1'b0; // Don't write flags
end
4'h3: begin // Load immediate
dcdA_wr <= 1'b1;
dcdA_rd <= 1'b0;
dcdB_rd <= 1'b0;
r_dcdI <= { instruction[23:0] };
dcdF_wr <= 1'b0; // Don't write flags
dcdF <= 4'h8; // This is unconditional
dcdOp <= 4'h2;
end
4'h4: begin // Load immediate special
dcdF_wr <= 1'b0; // Don't write flags
r_dcdI <= { 8'h00, instruction[15:0] };
if (instruction[27:24] == 4'he)
begin
// NOOP instruction
dcdA_wr <= 1'b0;
dcdA_rd <= 1'b0;
dcdB_rd <= 1'b0;
dcdOp <= 4'h2;
dcd_break <= 1'b1;//Could be a break ins
end else if (instruction[27:24] == 4'hf)
begin // Load partial immediate(s)
dcdA_wr <= 1'b1;
dcdA_rd <= 1'b1;
dcdB_rd <= 1'b0;
dcdA[4:0] <= { instruction_gie, instruction[19:16] };
dcdOp <= { 3'h3, instruction[20] };
end else begin
; // Multiply instruction place holder
end end
4'b011?: begin // Load/Store
dcdF_wr <= 1'b0; // Don't write flags
dcdA_wr <= (~instruction[28]); // Write on loads
dcdA_rd <= (instruction[28]); // Read on stores
dcdB_rd <= instruction[20];
if (instruction[20])
r_dcdI <= { {(8){instruction[15]}}, instruction[15:0] };
else
r_dcdI <= { {(4){instruction[19]}}, instruction[19:0] };
dcdM <= 1'b1; // Memory operation
end
default: begin
dcdA <= { instruction_gie, instruction[27:24] };
dcdB <= { instruction_gie, instruction[19:16] };
dcdA_wr <= (instruction[31])||(instruction[31:28]==4'h5);
dcdA_rd <= 1'b1;
dcdB_rd <= instruction[20];
if (instruction[20])
r_dcdI <= { {(8){instruction[15]}}, instruction[15:0] };
else
r_dcdI <= { {(4){instruction[19]}}, instruction[19:0] };
end
endcase
 
 
dcd_gie <= instruction_gie;
end
 
 
//
//
// PIPELINE STAGE #3 :: Read Operands (Registers)
//
//
 
always @(posedge i_clk)
if (op_ce) // &&(dcdvalid))
begin
if ((wr_reg_ce)&&(wr_reg_id == dcdA))
r_opA <= wr_reg_vl;
else if (dcdA == { dcd_gie, `CPU_PC_REG })
r_opA <= dcd_pc;
else if (dcdA[3:0] == `CPU_PC_REG)
r_opA <= (dcdA[4])?upc:ipc;
else
r_opA <= regset[dcdA];
end
wire [31:0] dcdI;
assign dcdI = { {(8){r_dcdI[23]}}, r_dcdI };
always @(posedge i_clk)
if (op_ce) // &&(dcdvalid))
begin
if (~dcdB_rd)
r_opB <= dcdI;
else if ((wr_reg_ce)&&(wr_reg_id == dcdB))
r_opB <= wr_reg_vl + dcdI;
else if (dcdB == { dcd_gie, `CPU_PC_REG })
r_opB <= dcd_pc + dcdI;
else if (dcdB[3:0] == `CPU_PC_REG)
r_opB <= ((dcdB[4])?upc:ipc) + dcdI;
else
r_opB <= regset[dcdB] + dcdI;
end
 
// The logic here has become more complex than it should be, no thanks
// to Xilinx's Vivado trying to help. The conditions are supposed to
// be two sets of four bits: the top bits specify what bits matter, the
// bottom specify what those top bits must equal. However, two of
// conditions check whether bits are on, and those are the only two
// conditions checking those bits. Therefore, Vivado complains that
// these two bits are redundant. Hence the convoluted expression
// below, arriving at what we finally want in the (now wire net)
// opF.
`ifdef NEWCODE
always @(posedge i_clk)
if (op_ce)
begin // Set the flag condition codes
case(dcdF[2:0])
3'h0: r_opF <= 7'h80; // Always
3'h1: r_opF <= 7'h11; // Z
3'h2: r_opF <= 7'h10; // NE
3'h3: r_opF <= 7'h20; // GE (!N)
3'h4: r_opF <= 7'h30; // GT (!N&!Z)
3'h5: r_opF <= 7'h24; // LT
3'h6: r_opF <= 7'h02; // C
3'h7: r_opF <= 7'h08; // V
endcase
end
assign opF = { r_opF[6], r_opF[3], r_opF[5], r_opF[1], r_opF[4:0] };
`else
always @(posedge i_clk)
if (op_ce)
begin // Set the flag condition codes
case(dcdF[2:0])
3'h0: opF <= 9'h100; // Always
3'h1: opF <= 9'h011; // Z
3'h2: opF <= 9'h010; // NE
3'h3: opF <= 9'h040; // GE (!N)
3'h4: opF <= 9'h050; // GT (!N&!Z)
3'h5: opF <= 9'h044; // LT
3'h6: opF <= 9'h022; // C
3'h7: opF <= 9'h088; // V
endcase
end
`endif
 
always @(posedge i_clk)
if (i_rst)
opvalid <= 1'b0;
else if (op_ce)
// Do we have a valid instruction?
// The decoder may vote to stall one of its
// instructions based upon something we currently
// have in our queue. This instruction must then
// move forward, and get a stall cycle inserted.
// Hence, the test on dcd_stalled here. If we must
// wait until our operands are valid, then we aren't
// valid yet until then.
opvalid<= (~new_pc)&&(dcdvalid)&&(~dcd_stalled);
else if ((~op_stall)||(new_pc))
opvalid <= 1'b0;
 
// Here's part of our debug interface. When we recognize a break
// instruction, we set the op_break flag. That'll prevent this
// instruction from entering the ALU, and cause an interrupt before
// this instruction. Thus, returning to this code will cause the
// break to repeat and continue upon return. To get out of this
// condition, replace the break instruction with what it is supposed
// to be, step through it, and then replace it back. In this fashion,
// a debugger can step through code.
always @(posedge i_clk)
if (i_rst)
op_break <= 1'b0;
else if (op_ce)
op_break <= (dcd_break)&&(r_dcdI[15:0] == 16'h0001);
else if ((~op_stall)||(new_pc))
op_break <= 1'b0;
 
always @(posedge i_clk)
if (op_ce)
begin
opn <= dcdOp; // Which ALU operation?
opM <= dcdM; // Is this a memory operation?
// Will we write the flags/CC Register with our result?
opF_wr <= dcdF_wr;
// Will we be writing our results into a register?
opR_wr <= dcdA_wr;
// What register will these results be written into?
opR <= dcdA;
// User level (1), vs supervisor (0)/interrupts disabled
op_gie <= dcd_gie;
 
// We're not done with these yet--we still need them
// for the unclocked assign. We need the unclocked
// assign so that there's no wait state between an
// ALU or memory result and the next register that may
// use that value.
opA_cc <= {dcdA[4], (dcdA[3:0] == `CPU_CC_REG) };
opA_rd <= dcdA_rd;
opB_cc <= {dcdB[4], (dcdB[3:0] == `CPU_CC_REG) };
opB_rd <= dcdB_rd;
op_pc <= dcd_pc;
//
op_wr_pc <= ((dcdA_wr)&&(dcdA[3:0] == `CPU_PC_REG));
end
assign opFl = (op_gie)?(w_uflags):(w_iflags);
 
// This is tricky. First, the PC and Flags registers aren't kept in
// register set but in special registers of their own. So step one
// is to select the right register. Step to is to replace that
// register with the results of an ALU or memory operation, if such
// results are now available. Otherwise, we'd need to insert a wait
// state of some type.
//
// The alternative approach would be to define some sort of
// op_stall wire, which would stall any upstream stage.
// We'll create a flag here to start our coordination. Once we
// define this flag to something other than just plain zero, then
// the stalls will already be in place.
assign dcdA_stall = (dcdvalid)&&(dcdA_rd)&&
(((opvalid)&&(opR_wr)&&(opR == dcdA))
||((mem_busy)&&(~mem_we)&&(mem_wreg == dcdA))
||((mem_valid)&&(mem_wreg == dcdA)));
assign dcdB_stall = (dcdvalid)&&(dcdB_rd)
&&(((opvalid)&&(opR_wr)&&(opR == dcdB))
||((mem_busy)&&(~mem_we)&&(mem_wreg == dcdB))
||((mem_valid)&&(mem_wreg == dcdB)));
assign dcdF_stall = (dcdvalid)&&(((dcdF[3])
||(dcdA[3:0]==`CPU_CC_REG)
||(dcdB[3:0]==`CPU_CC_REG))
&&((opvalid)&&(opR[3:0] == `CPU_CC_REG))
||((dcdF[3])&&(dcdM)&&(opvalid)&&(opF_wr)));
assign opA = { r_opA[31:8], ((opA_cc[0]) ?
((opA_cc[1])?w_uflags:w_iflags) : r_opA[7:0]) };
assign opB = { r_opB[31:8], ((opB_cc[0]) ?
((opA_cc[1])?w_uflags:w_iflags) : r_opB[7:0]) };
 
//
//
// PIPELINE STAGE #4 :: Apply Instruction
//
//
cpuops doalu(i_clk, i_rst, alu_ce,
(opvalid)&&(~opM), opn, opA, opB,
alu_result, alu_flags, alu_valid);
 
assign set_cond = ((opF[7:4]&opFl[3:0])==opF[3:0]);
initial alF_wr = 1'b0;
initial alu_wr = 1'b0;
always @(posedge i_clk)
if (i_rst)
begin
alu_wr <= 1'b0;
alF_wr <= 1'b0;
end else if (alu_ce)
begin
alu_reg <= opR;
alu_wr <= (opR_wr)&&(set_cond);
alF_wr <= (opF_wr)&&(set_cond);
end else begin
// These are strobe signals, so clear them if not
// set for any particular clock
alu_wr <= 1'b0;
alF_wr <= 1'b0;
end
always @(posedge i_clk)
if ((alu_ce)||(mem_ce))
alu_gie <= op_gie;
always @(posedge i_clk)
if ((alu_ce)||(mem_ce))
alu_pc <= op_pc;
initial alu_pc_valid = 1'b0;
always @(posedge i_clk)
alu_pc_valid <= (~i_rst)&&(master_ce)&&(opvalid)&&(~new_pc)
&&((~opM)
||(~mem_stalled));
 
memops domem(i_clk, i_rst, mem_ce,
(opn[0]), opB, opA, opR,
mem_busy, mem_valid, mem_wreg, mem_result,
mem_cyc, mem_stb, mem_we, mem_addr, mem_data,
mem_ack, mem_stall, i_wb_data);
assign mem_rdbusy = ((mem_cyc)&&(~mem_we));
 
// Either the prefetch or the instruction gets the memory bus, but
// never both.
wbarbiter #(32,32) pformem(i_clk, i_rst,
// Prefetch access to the arbiter
pf_addr, pf_data, pf_we, pf_stb, pf_cyc, pf_ack, pf_stall,
// Memory access to the arbiter
mem_addr, mem_data, mem_we, mem_stb, mem_cyc, mem_ack, mem_stall,
// Common wires, in and out, of the arbiter
o_wb_addr, o_wb_data, o_wb_we, o_wb_stb, o_wb_cyc, i_wb_ack,
i_wb_stall);
 
//
//
// PIPELINE STAGE #5 :: Write-back results
//
//
// This stage is not allowed to stall. If results are ready to be
// written back, they are written back at all cost. Sleepy CPU's
// won't prevent write back, nor debug modes, halting the CPU, nor
// anything else. Indeed, the (master_ce) bit is only as relevant
// as knowinig something is available for writeback.
 
//
// Write back to our generic register set ...
// When shall we write back? On one of two conditions
// Note that the flags needed to be checked before issuing the
// bus instruction, so they don't need to be checked here.
// Further, alu_wr includes (set_cond), so we don't need to
// check for that here either.
assign wr_reg_ce = ((alu_wr)&&(alu_valid))||(mem_valid);
// Which register shall be written?
assign wr_reg_id = (alu_wr)?alu_reg:mem_wreg;
// Are we writing to the PC?
assign wr_write_pc = (wr_reg_id[3:0] == `CPU_PC_REG);
// What value to write?
assign wr_reg_vl = (alu_wr)?alu_result:mem_result;
always @(posedge i_clk)
if (wr_reg_ce)
regset[wr_reg_id] <= wr_reg_vl;
 
//
// Write back to the condition codes/flags register ...
// When shall we write to our flags register? alF_wr already
// includes the set condition ...
assign wr_flags_ce = (alF_wr)&&(alu_valid);
assign w_uflags = { 1'b0, step, 1'b1, sleep, ((wr_flags_ce)&&(alu_gie))?alu_flags:flags };
assign w_iflags = { break_en, 1'b0, 1'b0, sleep, ((wr_flags_ce)&&(~alu_gie))?alu_flags:iflags };
// What value to write?
always @(posedge i_clk)
// If explicitly writing the register itself
if ((wr_reg_ce)&&(wr_reg_id[4:0] == { 1'b1, `CPU_CC_REG }))
flags <= wr_reg_vl[3:0];
// Otherwise if we're setting the flags from an ALU operation
else if ((wr_flags_ce)&&(alu_gie))
flags <= alu_flags;
else if ((i_halt)&&(i_dbg_we)
&&(i_dbg_reg == { 1'b1, `CPU_CC_REG }))
flags <= i_dbg_data[3:0];
 
always @(posedge i_clk)
if ((wr_reg_ce)&&(wr_reg_id[4:0] == { 1'b0, `CPU_CC_REG }))
iflags <= wr_reg_vl[3:0];
else if ((wr_flags_ce)&&(~alu_gie))
iflags <= alu_flags;
else if ((i_halt)&&(i_dbg_we)
&&(i_dbg_reg == { 1'b0, `CPU_CC_REG }))
iflags <= i_dbg_data[3:0];
 
// The 'break' enable bit. This bit can only be set from supervisor
// mode. It control what the CPU does upon encountering a break
// instruction.
//
// The goal, upon encountering a break is that the CPU should stop and
// not execute the break instruction, choosing instead to enter into
// either interrupt mode or halt first.
// if ((break_en) AND (break_instruction)) // user mode or not
// HALT CPU
// else if (break_instruction) // only in user mode
// set an interrupt flag, go to supervisor mode
// allow supervisor to step the CPU.
// Upon a CPU halt, any break condition will be reset. The
// external debugger will then need to deal with whatever
// condition has taken place.
initial break_en = 1'b0;
always @(posedge i_clk)
if ((i_rst)||(i_halt))
break_en <= 1'b0;
else if ((wr_reg_ce)&&(wr_reg_id[4:0] == {1'b0, `CPU_CC_REG}))
break_en <= wr_reg_vl[`CPU_BREAK_BIT];
assign o_break = (break_en)&&(op_break);
 
 
// The sleep register. Setting the sleep register causes the CPU to
// sleep until the next interrupt. Setting the sleep register within
// interrupt mode causes the processor to halt until a reset. This is
// a panic/fault halt.
always @(posedge i_clk)
if ((i_rst)||((i_interrupt)&&(gie)))
sleep <= 1'b0;
else if ((wr_reg_ce)&&(wr_reg_id[3:0] == `CPU_CC_REG))
sleep <= wr_reg_vl[`CPU_SLEEP_BIT];
else if ((i_halt)&&(i_dbg_we)
&&(i_dbg_reg == { 1'b1, `CPU_CC_REG }))
sleep <= i_dbg_data[`CPU_SLEEP_BIT];
 
always @(posedge i_clk)
if ((i_rst)||(w_switch_to_interrupt))
step <= 1'b0;
else if ((wr_reg_ce)&&(~alu_gie)&&(wr_reg_id[4:0] == {1'b1,`CPU_CC_REG}))
step <= wr_reg_vl[`CPU_STEP_BIT];
else if ((i_halt)&&(i_dbg_we)
&&(i_dbg_reg == { 1'b1, `CPU_CC_REG }))
step <= i_dbg_data[`CPU_STEP_BIT];
else if ((master_ce)&&(alu_pc_valid)&&(step)&&(gie))
step <= 1'b0;
 
// The GIE register. Only interrupts can disable the interrupt register
assign w_switch_to_interrupt = (gie)&&(
// On interrupt (obviously)
(i_interrupt)
// If we are stepping the CPU
||((master_ce)&&(alu_pc_valid)&&(step))
// If we encounter a break instruction, if the break
// enable isn't not set.
||((master_ce)&&(op_break))
// If we write to the CC register
||((wr_reg_ce)&&(~wr_reg_vl[`CPU_GIE_BIT])
&&(wr_reg_id[4:0] == { 1'b1, `CPU_CC_REG }))
// Or if, in debug mode, we write to the CC register
||((i_halt)&&(i_dbg_we)&&(~i_dbg_data[`CPU_GIE_BIT])
&&(i_dbg_reg == { 1'b1, `CPU_CC_REG}))
);
assign w_release_from_interrupt = (~gie)&&(~i_interrupt)
// Then if we write the CC register
&&(((wr_reg_ce)&&(wr_reg_vl[`CPU_GIE_BIT])
&&(wr_reg_id[4:0] == { 1'b0, `CPU_CC_REG }))
// Or if, in debug mode, we write the CC register
||((i_halt)&&(i_dbg_we)&&(i_dbg_data[`CPU_GIE_BIT])
&&(i_dbg_reg == { 1'b0, `CPU_CC_REG}))
);
always @(posedge i_clk)
if (i_rst)
gie <= 1'b0;
else if (w_switch_to_interrupt)
gie <= 1'b0;
else if (w_release_from_interrupt)
gie <= 1'b1;
 
//
// Write backs to the PC register, and general increments of it
// We support two: upc and ipc. If the instruction is normal,
// we increment upc, if interrupt level we increment ipc. If
// the instruction writes the PC, we write whichever PC is appropriate.
//
// Do we need to all our partial results from the pipeline?
// What happens when the pipeline has gie and ~gie instructions within
// it? Do we clear both? What if a gie instruction tries to clear
// a non-gie instruction?
always @(posedge i_clk)
if (i_rst)
upc <= RESET_ADDRESS;
else if ((wr_reg_ce)&&(wr_reg_id[4])&&(wr_write_pc))
upc <= wr_reg_vl;
else if ((alu_gie)&&(alu_pc_valid))
upc <= alu_pc;
else if ((i_halt)&&(i_dbg_we)
&&(i_dbg_reg == { 1'b1, `CPU_PC_REG }))
upc <= i_dbg_data;
 
always @(posedge i_clk)
if (i_rst)
ipc <= RESET_ADDRESS;
else if ((wr_reg_ce)&&(~wr_reg_id[4])&&(wr_write_pc))
ipc <= wr_reg_vl;
else if ((~alu_gie)&&(alu_pc_valid))
ipc <= alu_pc;
else if ((i_halt)&&(i_dbg_we)
&&(i_dbg_reg == { 1'b0, `CPU_PC_REG }))
ipc <= i_dbg_data;
 
always @(posedge i_clk)
if (i_rst)
pf_pc <= RESET_ADDRESS;
else if (w_switch_to_interrupt)
pf_pc <= ipc;
else if (w_release_from_interrupt)
pf_pc <= upc;
else if ((wr_reg_ce)&&(wr_reg_id[4] == gie)&&(wr_write_pc))
pf_pc <= wr_reg_vl;
else if ((i_halt)&&(i_dbg_we)
&&(wr_reg_id[4:0] == { gie, `CPU_PC_REG}))
pf_pc <= i_dbg_data;
// else if (pf_ce)
else if (dcd_ce)
pf_pc <= pf_pc + 1;
 
initial new_pc = 1'b1;
always @(posedge i_clk)
if (i_rst)
new_pc <= 1'b1;
else if (w_switch_to_interrupt)
new_pc <= 1'b1;
else if (w_release_from_interrupt)
new_pc <= 1'b1;
else if ((wr_reg_ce)&&(wr_reg_id[4] == gie)&&(wr_write_pc))
new_pc <= 1'b1;
else if ((i_halt)&&(i_dbg_we)
&&(wr_reg_id[4:0] == { gie, `CPU_PC_REG}))
new_pc <= 1'b1;
else
new_pc <= 1'b0;
 
//
// The debug interface
always @(posedge i_clk)
begin
o_dbg_reg <= regset[i_dbg_reg];
if (i_dbg_reg[3:0] == `CPU_PC_REG)
o_dbg_reg <= (i_dbg_reg[4])?upc:ipc;
else if (i_dbg_reg[3:0] == `CPU_CC_REG)
o_dbg_reg <= { 25'h00, step, gie, sleep,
((i_dbg_reg[4])?flags:iflags) };
end
always @(posedge i_clk)
o_dbg_stall <= (~i_halt)||(pf_cyc)||(mem_cyc)||(mem_busy)
||((~opvalid)&&(~i_rst))
||((~dcdvalid)&&(~i_rst));
 
//
//
// Produce accounting outputs: Account for any CPU stalls, so we can
// later evaluate how well we are doing.
//
//
assign o_mem_stall = (~i_halt)&&(~sleep)&&(opvalid)&&(mem_busy)
&&(~pf_cyc);
assign o_pf_stall = (~i_halt)&&(~sleep)&&(((pf_ce)&&(~pf_valid))
||((opvalid)&&(mem_busy)&&(pf_cyc)));
// assign o_alu_stall = (~i_halt)&&(~sleep)&&(~mem_busy)&&
// ((alu_stall)||(~alu_valid));
assign o_alu_stall = alu_pc_valid;
endmodule
/zipcpu/trunk/rtl/zipsystem.v
0,0 → 1,503
///////////////////////////////////////////////////////////////////////////
//
// Filename: zipsystem.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: This portion of the ZIP CPU implements a number of soft
// peripherals to the CPU nearby its CORE. The functionality
// sits on the data bus, and does not include any true
// external hardware peripherals. The peripherals included here
// include:
//
//
// Local interrupt controller--for any/all of the interrupts generated
// here. This would include a pin for interrupts generated
// elsewhere, so this interrupt controller could be a master
// handling all interrupts. My interrupt controller would work
// for this purpose.
//
// The ZIP-CPU supports only one interrupt because, as I understand
// modern systems (Linux), they tend to send all interrupts to the
// same interrupt vector anyway. Hence, that's what we do here.
//
// Bus Error interrupts -- generates an interrupt any time the wishbone
// bus produces an error on a given access, for whatever purpose
// also records the address on the bus at the time of the error.
//
// Trap instructions
// Writing to this "register" will always create an interrupt.
// After the interrupt, this register may be read to see what
// value had been written to it.
//
// Bit reverse register ... ?
//
// (Potentially an eventual floating point co-processor ...)
//
// Real-time clock
//
// Interval timer(s) (Count down from fixed value, and either stop on
// zero, or issue an interrupt and restart automatically on zero)
// These can be implemented as watchdog timers if desired--the
// only difference is that a watchdog timer's interrupt feeds the
// reset line instead of the processor interrupt line.
//
// Watch-dog timer: this is the same as an interval timer, only it's
// interrupt/time-out line is wired to the reset line instead of
// the interrupt line of the CPU.
//
// ROM Memory map
// Set a register to control this map, and a DMA will begin to
// fill this memory from a slower FLASH. Once filled, accesses
// will be from this memory instead of
//
//
// Doing some market comparison, let's look at what peripherals a TI
// MSP430 might offer: MSP's may have I2C ports, SPI, UART, DMA, ADC,
// Comparators, 16,32-bit timers, 16x16 or 32x32 timers, AES, BSL,
// brown-out-reset(s), real-time-clocks, temperature sensors, USB ports,
// Spi-Bi-Wire, UART Boot-strap Loader (BSL), programmable digital I/O,
// watchdog-timers,
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
//
`define PERIPHBASE 32'hc0000000
`define INTCTRL 4'h0 //
`define WATCHDOG 4'h1 // Interrupt generates reset signal
`define CACHECTRL 4'h2 // Sets IVEC[0]
`define CTRINT 4'h3 // Sets IVEC[5]
`define TIMER_A 4'h4 // Sets IVEC[4]
`define TIMER_B 4'h5 // Sets IVEC[3]
`define TIMER_C 4'h6 // Sets IVEC[2]
`define JIFFIES 4'h7 // Sets IVEC[1]
 
`define MSTR_TASK_CTR 4'h8
`define MSTR_MSTL_CTR 4'h9
`define MSTR_PSTL_CTR 4'ha
`define MSTR_ASTL_CTR 4'hb
`define USER_TASK_CTR 4'hc
`define USER_MSTL_CTR 4'hd
`define USER_PSTL_CTR 4'he
`define USER_ASTL_CTR 4'hf
 
`define CACHEBASE 16'hc010 //
// `define RTC_CLOCK 32'hc0000008 // A global something
// `define BITREV 32'hc0000003
//
// DBGCTRL
// 10 HALT
// 9 HALT(ED)
// 8 STEP (W=1 steps, and returns to halted)
// 7 INTERRUPT-FLAG
// 6 RESET_FLAG
// ADDRESS:
// 5 PERIPHERAL-BIT
// [4:0] REGISTER-ADDR
// DBGDATA
// read/writes internal registers
module zipsystem(i_clk, i_rst,
// Wishbone master interface from the CPU
o_wb_cyc, o_wb_stb, o_wb_we, o_wb_addr, o_wb_data,
i_wb_ack, i_wb_stall, i_wb_data,
// Incoming interrupts
i_ext_int,
// Wishbone slave interface for debugging purposes
i_dbg_cyc, i_dbg_stb, i_dbg_we, i_dbg_addr, i_dbg_data,
o_dbg_ack, o_dbg_stall, o_dbg_data);
parameter RESET_ADDRESS=32'h0100000;
input i_clk, i_rst;
// Wishbone master
output wire o_wb_cyc, o_wb_stb, o_wb_we;
output wire [31:0] o_wb_addr;
output wire [31:0] o_wb_data;
input i_wb_ack, i_wb_stall;
input [31:0] i_wb_data;
// Incoming interrupts
input i_ext_int;
// Wishbone slave
input i_dbg_cyc, i_dbg_stb, i_dbg_we, i_dbg_addr;
input [31:0] i_dbg_data;
output wire o_dbg_ack;
output wire o_dbg_stall;
output wire [31:0] o_dbg_data;
 
wire [31:0] ext_idata;
 
// Delay the debug port by one clock, to meet timing requirements
wire dbg_cyc, dbg_stb, dbg_we, dbg_addr, dbg_stall;
wire [31:0] dbg_idata, dbg_odata;
reg dbg_ack;
busdelay #(1,32) wbdelay(i_clk,
i_dbg_cyc, i_dbg_stb, i_dbg_we, i_dbg_addr, i_dbg_data,
o_dbg_ack, o_dbg_stall, o_dbg_data,
dbg_cyc, dbg_stb, dbg_we, dbg_addr, dbg_idata,
dbg_ack, dbg_stall, dbg_odata);
 
//
//
//
wire sys_cyc, sys_stb, sys_we;
wire [3:0] sys_addr;
wire [31:0] cpu_addr;
wire [31:0] sys_data;
// wire sys_ack, sys_stall;
 
//
// The external debug interface
//
// We offer only a limited interface here, requiring a pre-register
// write to set the local address. This interface allows access to
// the Zip System on a debug basis only, and not to the rest of the
// wishbone bus. Further, to access these registers, the control
// register must first be accessed to both stop the CPU and to
// set the following address in question. Hence all accesses require
// two accesses: write the address to the control register (and halt
// the CPU if not halted), then read/write the data from the data
// register.
//
wire cpu_break;
reg cmd_reset, cmd_halt, cmd_step;
reg [5:0] cmd_addr;
initial cmd_reset = 1'b1;
initial cmd_halt = 1'b1;
initial cmd_step = 1'b0;
always @(posedge i_clk)
if (i_rst)
begin
cmd_halt <= 1'b0;
cmd_step <= 1'b0;
cmd_reset<= 1'b0;
cmd_addr <= 6'h00;
end else if ((dbg_cyc)&&(dbg_stb)
&&(dbg_we)&&(~dbg_addr))
begin
cmd_halt <= dbg_idata[10];
cmd_step <= dbg_idata[ 8];
cmd_reset<= dbg_idata[ 6];
cmd_addr <= dbg_idata[5:0];
end else if (cmd_step)
begin
cmd_halt <= 1'b1;
cmd_step <= 1'b0;
end else if (cpu_break)
cmd_halt <= 1'b1;
wire cpu_reset;
assign cpu_reset = (i_rst)||(cmd_reset)||(wdt_reset);
 
wire cpu_halt, cpu_dbg_stall;
assign cpu_halt = (cmd_halt)&&(~cmd_step);
wire [31:0] pic_data;
wire [31:0] cmd_data;
assign cmd_data = { 21'h00, cmd_halt, (~cpu_dbg_stall), 1'b0, pic_data[15],
cpu_reset, cmd_addr };
 
`ifdef USE_TRAP
//
// The TRAP peripheral
//
wire trap_ack, trap_stall, trap_int;
wire [31:0] trap_data;
ziptrap trapp(i_clk,
sys_cyc, (sys_stb)&&(sys_addr == `TRAP_ADDR), sys_we,
sys_data,
trap_ack, trap_stall, trap_data, trap_int);
`endif
 
//
// The WATCHDOG Timer
//
wire wdt_ack, wdt_stall, wdt_reset;
wire [31:0] wdt_data;
ziptimer watchdog(i_clk, cpu_reset, ~cmd_halt,
sys_cyc, ((sys_stb)&&(sys_addr == `WATCHDOG)), sys_we,
sys_data,
wdt_ack, wdt_stall, wdt_data, wdt_reset);
 
//
// The Flash Cache, a pre-read cache to memory that can be used to
// create a fast memory access area
//
wire cache_int;
wire [31:0] cache_data;
wire cache_stb, cache_ack, cache_stall;
wire fc_cyc, fc_stb, fc_we, fc_ack, fc_stall;
wire [31:0] fc_data, fc_addr;
flashcache #(10) manualcache(i_clk,
sys_cyc, cache_stb,
((sys_stb)&&(sys_addr == `CACHECTRL)),
sys_we, cpu_addr[9:0], sys_data,
cache_ack, cache_stall, cache_data,
// Need the outgoing CACHE wishbone bus
fc_cyc, fc_stb, fc_we, fc_addr, fc_data,
fc_ack, fc_stall, ext_idata,
// Cache interrupt, for upon completion
cache_int);
 
 
// Counters -- for performance measurement and accounting
//
// Here's the stuff we'll be counting ....
//
wire cpu_mem_stall, cpu_pf_stall, cpu_alu_stall;
 
//
// The master counters will, in general, not be reset. They'll be used
// for an overall counter.
//
// Master task counter
wire mtc_ack, mtc_stall, mtc_int;
wire [31:0] mtc_data;
zipcounter mtask_ctr(i_clk, (~cmd_halt), sys_cyc,
(sys_stb)&&(sys_addr == `MSTR_TASK_CTR),
sys_we, sys_data,
mtc_ack, mtc_stall, mtc_data, mtc_int);
 
// Master Memory-Stall counter
wire mmc_ack, mmc_stall, mmc_int;
wire [31:0] mmc_data;
zipcounter mmstall_ctr(i_clk,(~cmd_halt)&&(cpu_mem_stall), sys_cyc,
(sys_stb)&&(sys_addr == `MSTR_MSTL_CTR),
sys_we, sys_data,
mmc_ack, mmc_stall, mmc_data, mmc_int);
 
// Master PreFetch-Stall counter
wire mpc_ack, mpc_stall, mpc_int;
wire [31:0] mpc_data;
zipcounter mpstall_ctr(i_clk,(~cmd_halt)&&(cpu_pf_stall), sys_cyc,
(sys_stb)&&(sys_addr == `MSTR_PSTL_CTR),
sys_we, sys_data,
mpc_ack, mpc_stall, mpc_data, mpc_int);
 
// Master ALU-Stall counter
wire mac_ack, mac_stall, mac_int;
wire [31:0] mac_data;
zipcounter mastall_ctr(i_clk,(~cmd_halt)&&(cpu_alu_stall), sys_cyc,
(sys_stb)&&(sys_addr == `MSTR_ASTL_CTR),
sys_we, sys_data,
mac_ack, mac_stall, mac_data, mac_int);
 
//
// The user counters are different from those of the master. They will
// be reset any time a task is given control of the CPU.
//
// User task counter
wire utc_ack, utc_stall, utc_int;
wire [31:0] utc_data;
zipcounter utask_ctr(i_clk,(~cmd_halt), sys_cyc,
(sys_stb)&&(sys_addr == `USER_TASK_CTR),
sys_we, sys_data,
utc_ack, utc_stall, utc_data, utc_int);
 
// User Memory-Stall counter
wire umc_ack, umc_stall, umc_int;
wire [31:0] umc_data;
zipcounter umstall_ctr(i_clk,(~cmd_halt)&&(cpu_mem_stall), sys_cyc,
(sys_stb)&&(sys_addr == `USER_MSTL_CTR),
sys_we, sys_data,
umc_ack, umc_stall, umc_data, umc_int);
 
// User PreFetch-Stall counter
wire upc_ack, upc_stall, upc_int;
wire [31:0] upc_data;
zipcounter upstall_ctr(i_clk,(~cmd_halt)&&(cpu_pf_stall), sys_cyc,
(sys_stb)&&(sys_addr == `USER_PSTL_CTR),
sys_we, sys_data,
upc_ack, upc_stall, upc_data, upc_int);
 
// User ALU-Stall counter
wire uac_ack, uac_stall, uac_int;
wire [31:0] uac_data;
zipcounter uastall_ctr(i_clk,(~cmd_halt)&&(cpu_alu_stall), sys_cyc,
(sys_stb)&&(sys_addr == `USER_ASTL_CTR),
sys_we, sys_data,
uac_ack, uac_stall, uac_data, uac_int);
 
// A little bit of pre-cleanup (actr = accounting counters)
wire actr_ack, actr_stall;
wire [31:0] actr_data;
assign actr_ack = ((mtc_ack | mmc_ack | mpc_ack | mac_ack)
|(utc_ack | umc_ack | upc_ack | uac_ack));
assign actr_stall = ((mtc_stall | mmc_stall | mpc_stall | mac_stall)
|(utc_stall | umc_stall | upc_stall|uac_stall));
assign actr_data = ((mtc_ack) ? mtc_data
: ((mmc_ack) ? mmc_data
: ((mpc_ack) ? mpc_data
: ((mac_ack) ? mac_data
: ((utc_ack) ? utc_data
: ((umc_ack) ? umc_data
: ((upc_ack) ? upc_data
: uac_data)))))));
 
 
//
// Counter Interrupt controller
//
reg ctri_ack;
wire ctri_stall, ctri_int, ctri_sel;
wire [7:0] ctri_vector;
wire [31:0] ctri_data;
assign ctri_sel = (sys_cyc)&&(sys_stb)&&(sys_addr == `CTRINT);
assign ctri_vector = { mtc_int, mmc_int, mpc_int, mac_int,
utc_int, umc_int, upc_int, uac_int };
icontrol #(8) ctri(i_clk, cpu_reset, (ctri_sel)&&(sys_addr==`CTRINT),
sys_data, ctri_data, ctri_vector, ctri_int);
always @(posedge i_clk)
ctri_ack <= ctri_sel;
 
 
//
// Timer A
//
wire tma_ack, tma_stall, tma_int;
wire [31:0] tma_data;
ziptimer timer_a(i_clk, cpu_reset, ~cmd_halt,
sys_cyc, (sys_stb)&&(sys_addr == `TIMER_A), sys_we,
sys_data,
tma_ack, tma_stall, tma_data, tma_int);
 
//
// Timer B
//
wire tmb_ack, tmb_stall, tmb_int;
wire [31:0] tmb_data;
ziptimer timer_b(i_clk, cpu_reset, ~cmd_halt,
sys_cyc, (sys_stb)&&(sys_addr == `TIMER_B), sys_we,
sys_data,
tmb_ack, tmb_stall, tmb_data, tmb_int);
 
//
// Timer C
//
wire tmc_ack, tmc_stall, tmc_int;
wire [31:0] tmc_data;
ziptimer timer_c(i_clk, cpu_reset, ~cmd_halt,
sys_cyc, (sys_stb)&&(sys_addr == `TIMER_C), sys_we,
sys_data,
tmc_ack, tmc_stall, tmc_data, tmc_int);
 
//
// JIFFIES
//
wire jif_ack, jif_stall, jif_int;
wire [31:0] jif_data;
zipjiffies jiffies(i_clk, ~cmd_halt,
sys_cyc, (sys_stb)&&(sys_addr == `JIFFIES), sys_we,
sys_data,
jif_ack, jif_stall, jif_data, jif_int);
 
//
// The programmable interrupt controller peripheral
//
wire pic_interrupt;
wire [6:0] int_vector;
assign int_vector = { i_ext_int, ctri_int, tma_int, tmb_int, tmc_int,
jif_int, cache_int };
icontrol #(7) pic(i_clk, cpu_reset,
(sys_cyc)&&(sys_stb)&&(sys_we)
&&(sys_addr==`INTCTRL),
sys_data, pic_data,
int_vector, pic_interrupt);
reg pic_ack;
always @(posedge i_clk)
pic_ack <= (sys_cyc)&&(sys_stb)&&(sys_addr == `INTCTRL);
 
//
// The CPU itself
//
wire cpu_cyc, cpu_stb, cpu_we, cpu_dbg_we;
wire [31:0] cpu_data, wb_data;
wire cpu_ack, cpu_stall;
wire [31:0] cpu_dbg_data;
assign cpu_dbg_we = ((dbg_cyc)&&(dbg_stb)&&(~cmd_addr[5])
&&(dbg_we)&&(dbg_addr));
zipcpu #(RESET_ADDRESS) thecpu(i_clk, cpu_reset, pic_interrupt,
cpu_halt, cmd_addr[4:0], cpu_dbg_we,
dbg_idata, cpu_dbg_stall, cpu_dbg_data,
cpu_break,
cpu_cyc, cpu_stb, cpu_we, cpu_addr, cpu_data,
cpu_ack, cpu_stall, wb_data,
cpu_mem_stall, cpu_pf_stall, cpu_alu_stall);
 
// Now, arbitrate the bus ... first for the local peripherals
assign sys_cyc = (cpu_cyc)||((cpu_halt)&&(~cpu_dbg_stall)&&(dbg_cyc));
assign sys_stb = (cpu_cyc)
? ((cpu_stb)&&(cpu_addr[31:4] == 28'hc000000))
: ((dbg_stb)&&(dbg_addr)&&(cmd_addr[5]));
 
assign sys_we = (cpu_cyc) ? cpu_we : dbg_we;
assign sys_addr= (cpu_cyc) ? cpu_addr[3:0] : cmd_addr[3:0];
assign sys_data= (cpu_cyc) ? cpu_data : dbg_idata;
assign cache_stb=((cpu_cyc)&&(cpu_stb)&&(cpu_addr[31:16]==`CACHEBASE));
 
// Return debug response values
assign dbg_odata = (~dbg_addr)?cmd_data
:((~cmd_addr[5])?cpu_dbg_data : wb_data);
initial dbg_ack = 1'b0;
always @(posedge i_clk)
dbg_ack <= (dbg_cyc)&&(dbg_stb)&&
((~dbg_addr)||((cpu_halt)&&(~cpu_dbg_stall)));
assign dbg_stall=(dbg_addr)&&(dbg_cyc)
&&((cpu_cyc)||(~cpu_halt)||(cpu_dbg_stall));
 
// Now for the external wishbone bus
// Need to arbitrate between the flash cache and the CPU
// The way this works, though, the CPU will stall once the flash
// cache gets access to the bus--the CPU will be stuck until the
// flash cache is finished with the bus.
wire ext_cyc, ext_stb, ext_we;
wire cpu_ext_ack, cpu_ext_stall, ext_ack, ext_stall;
wire [31:0] ext_addr, ext_odata;
wbarbiter #(32,32) flashvcpu(i_clk, i_rst,
fc_addr, fc_data, fc_we, fc_stb, fc_cyc,
fc_ack, fc_stall,
cpu_addr, cpu_data, cpu_we,
((cpu_stb)&&(~sys_stb)&&(~cache_stb)),
cpu_cyc, cpu_ext_ack, cpu_ext_stall,
ext_addr, ext_odata, ext_we, ext_stb,
ext_cyc, ext_ack, ext_stall);
 
busdelay #(32,32) extbus(i_clk,
ext_cyc, ext_stb, ext_we, ext_addr, ext_odata,
ext_ack, ext_stall, ext_idata,
o_wb_cyc, o_wb_stb, o_wb_we, o_wb_addr, o_wb_data,
i_wb_ack, i_wb_stall, i_wb_data);
 
wire tmr_ack;
assign tmr_ack = (tma_ack|tmb_ack|tmc_ack|jif_ack);
wire [31:0] tmr_data;
assign tmr_data = (tma_ack)?tma_data
:(tmb_ack ? tmb_data
:(tmc_ack ? tmc_data
:jif_data));
assign wb_data = (tmr_ack|wdt_ack)?((tmr_ack)?tmr_data:wdt_data)
:((actr_ack|cache_ack)?((actr_ack)?actr_data:cache_data)
:((pic_ack|ctri_ack)?((pic_ack)?pic_data:ctri_data)
:(ext_idata)));
 
assign cpu_stall = (tma_stall | tmb_stall | tmc_stall | jif_stall
| wdt_stall | cache_stall
| cpu_ext_stall);
assign cpu_ack = (tmr_ack|wdt_ack|cache_ack|cpu_ext_ack|ctri_ack|actr_ack|pic_ack);
endmodule
/zipcpu/trunk/rtl/aux/wbarbiter.v
0,0 → 1,178
///////////////////////////////////////////////////////////////////////////
//
// Filename: wbarbiter.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: At some point in time, I might wish to have two masters connect
// to the same wishbone bus. As an example, I might wish to have
// both the instruction fetch and the load/store operators
// of my Zip CPU access the the same bus. How shall they both
// get access to the same resource? This module allows the
// wishbone interfaces from two sources to drive the bus, while
// guaranteeing that only one drives the bus at a time.
//
// The core logic works like this:
//
// 1. If 'A' or 'B' asserts the o_cyc line, a bus cycle will begin,
// with acccess granted to whomever requested it.
// 2. If both 'A' and 'B' assert o_cyc at the same time, only 'A'
// will be granted the bus. (If the alternating parameter
// is set, A and B will alternate who gets the bus in
// this case.)
// 3. The bus will remain owned by whomever the bus was granted to
// until they deassert the o_cyc line.
// 4. At the end of a bus cycle, o_cyc is guaranteed to be
// deasserted (low) for one clock.
// 5. On the next clock, bus arbitration takes place again. If
// 'A' requests the bus, no matter how long 'B' was
// waiting, 'A' will then be granted the bus. (Unless
// again the alternating parameter is set, then the
// access is guaranteed to switch to B.)
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
//
`define WBA_ALTERNATING
module wbarbiter(i_clk, i_rst,
// Bus A
i_a_adr, i_a_dat, i_a_we, i_a_stb, i_a_cyc, o_a_ack, o_a_stall,
// Bus B
i_b_adr, i_b_dat, i_b_we, i_b_stb, i_b_cyc, o_b_ack, o_b_stall,
// Both buses
o_adr, o_dat, o_we, o_stb, o_cyc, i_ack, i_stall);
// 18 bits will address one GB, 4 bytes at a time.
// 19 bits will allow the ability to address things other than just
// the 1GB of memory we are expecting.
parameter DW=32, AW=19;
// Wishbone doesn't use an i_ce signal. While it could, they dislike
// what it would (might) do to the synchronous reset signal, i_rst.
input i_clk, i_rst;
input [(AW-1):0] i_a_adr, i_b_adr;
input [(DW-1):0] i_a_dat, i_b_dat;
input i_a_we, i_a_stb, i_a_cyc;
input i_b_we, i_b_stb, i_b_cyc;
output wire o_a_ack, o_b_ack, o_a_stall, o_b_stall;
output wire [(AW-1):0] o_adr;
output wire [(DW-1):0] o_dat;
output wire o_we, o_stb, o_cyc;
input i_ack, i_stall;
 
// All the fancy stuff here is done with the three primary signals:
// o_cyc
// w_a_owner
// w_b_owner
// These signals are helped by r_cyc, r_a_owner, and r_b_owner.
// If you understand these signals, all else will fall into place.
 
// r_cyc just keeps track of the last o_cyc value. That way, on
// the next clock we can tell if we've had one non-cycle before
// starting another cycle. Specifically, no new cycles will be
// allowed to begin unless r_cyc=0.
reg r_cyc;
always @(posedge i_clk)
if (i_rst)
r_cyc <= 1'b0;
else
r_cyc <= o_cyc;
 
// Go high immediately (new cycle) if ...
// Previous cycle was low and *someone* is requesting a bus cycle
// Go low immadiately if ...
// We were just high and the owner no longer wants the bus
// WISHBONE Spec recommends no logic between a FF and the o_cyc
// This violates that spec. (Rec 3.15, p35)
assign o_cyc = ((~r_cyc)&&((i_a_cyc)||(i_b_cyc))) || ((r_cyc)&&((w_a_owner)||(w_b_owner)));
 
 
// Register keeping track of the last owner, wire keeping track of the
// current owner allowing us to not lose a clock in arbitrating the
// first clock of the bus cycle
reg r_a_owner, r_b_owner;
wire w_a_owner, w_b_owner;
`ifdef WBA_ALTERNATING
reg r_a_last_owner;
`endif
always @(posedge i_clk)
if (i_rst)
begin
r_a_owner <= 1'b0;
r_b_owner <= 1'b0;
end else begin
r_a_owner <= w_a_owner;
r_b_owner <= w_b_owner;
`ifdef WBA_ALTERNATING
if (w_a_owner)
r_a_last_owner <= 1'b1;
else if (w_b_owner)
r_a_last_owner <= 1'b0;
`endif
end
//
// If you are the owner, retain ownership until i_x_cyc is no
// longer asserted. Likewise, you cannot become owner until o_cyc
// is de-asserted for one cycle.
//
// 'A' is given arbitrary priority over 'B'
// 'A' may own the bus only if he wants it. When 'A' drops i_a_cyc,
// o_cyc must drop and so must w_a_owner on the same cycle.
// However, when 'A' asserts i_a_cyc, he can only capture the bus if
// it's had an idle cycle.
// The same is true for 'B' with one exception: if both contend for the
// bus on the same cycle, 'A' arbitrarily wins.
`ifdef WBA_ALTERNATING
assign w_a_owner = (i_a_cyc) // if A requests ownership, and either
&& ((r_a_owner) // A has already been recognized or
|| ((~r_cyc) // the bus is free and
&&((~i_b_cyc) // B has not requested, or if he
||(~r_a_last_owner)) )); // has, it's A's turn
assign w_b_owner = (i_b_cyc)&& ((r_b_owner) || ((~r_cyc)&&((~i_a_cyc)||(r_a_last_owner)) ));
`else
assign w_a_owner = (i_a_cyc)&& ((r_a_owner) || (~r_cyc) );
assign w_b_owner = (i_b_cyc)&& ((r_b_owner) || ((~r_cyc)&&(~i_a_cyc)) );
`endif
 
// Realistically, if neither master owns the bus, the output is a
// don't care. Thus we trigger off whether or not 'A' owns the bus.
// If 'B' owns it all we care is that 'A' does not. Likewise, if
// neither owns the bus than the values on the various lines are
// irrelevant.
assign o_adr = (w_a_owner) ? i_a_adr : i_b_adr;
assign o_dat = (w_a_owner) ? i_a_dat : i_b_dat;
assign o_we = (w_a_owner) ? i_a_we : i_b_we;
assign o_stb = (o_cyc) && ((w_a_owner) ? i_a_stb : i_b_stb);
 
// We cannot allow the return acknowledgement to ever go high if
// the master in question does not own the bus. Hence we force it
// low if the particular master doesn't own the bus.
assign o_a_ack = (w_a_owner) ? i_ack : 1'b0;
assign o_b_ack = (w_b_owner) ? i_ack : 1'b0;
 
// Stall must be asserted on the same cycle the input master asserts
// the bus, if the bus isn't granted to him.
assign o_a_stall = (w_a_owner) ? i_stall : 1'b1;
assign o_b_stall = (w_b_owner) ? i_stall : 1'b1;
 
endmodule
 
/zipcpu/trunk/rtl/aux/busdelay.v
0,0 → 1,93
///////////////////////////////////////////////////////////////////////////
//
// Filename: busdelay.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: Delay any access to the wishbone bus by a single clock.
//
// When the first Zip System would not meet the timing requirements of
// the board it was placed upon, this bus delay was added to help out.
// It may no longer be necessary, having cleaned some other problems up
// first, but it will remain here as a means of alleviating timing
// problems.
//
// The specific problem takes place on the stall line: a wishbone master
// *must* know on the first clock whether or not the bus will stall.
//
//
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
//
module busdelay(i_clk,
// The input bus
i_wb_cyc, i_wb_stb, i_wb_we, i_wb_addr, i_wb_data,
o_wb_ack, o_wb_stall, o_wb_data,
// The delayed bus
o_dly_cyc, o_dly_stb, o_dly_we, o_dly_addr, o_dly_data,
i_dly_ack, i_dly_stall, i_dly_data);
parameter AW=32, DW=32;
input i_clk;
// Input/master bus
input i_wb_cyc, i_wb_stb, i_wb_we;
input [(AW-1):0] i_wb_addr;
input [(DW-1):0] i_wb_data;
output reg o_wb_ack;
output wire o_wb_stall;
output reg [(DW-1):0] o_wb_data;
// Delayed bus
output reg o_dly_cyc, o_dly_stb, o_dly_we;
output reg [(AW-1):0] o_dly_addr;
output reg [(DW-1):0] o_dly_data;
input i_dly_ack;
input i_dly_stall;
input [(DW-1):0] i_dly_data;
 
initial o_dly_cyc = 1'b0;
initial o_dly_stb = 1'b0;
 
always @(posedge i_clk)
o_dly_cyc <= i_wb_cyc;
always @(posedge i_clk)
if (~o_wb_stall)
o_dly_stb <= i_wb_stb;
always @(posedge i_clk)
if (~o_wb_stall)
o_dly_we <= i_wb_we;
always @(posedge i_clk)
if (~o_wb_stall)
o_dly_addr<= i_wb_addr;
always @(posedge i_clk)
if (~o_wb_stall)
o_dly_data <= i_wb_data;
always @(posedge i_clk)
o_wb_ack <= (i_dly_ack)&&(o_dly_cyc)&&(i_wb_cyc);
always @(posedge i_clk)
o_wb_data <= i_dly_data;
 
// Our only non-delayed line, yet still really delayed.
assign o_wb_stall = ((i_wb_cyc)&&(o_dly_cyc)&&(i_dly_stall));
 
endmodule
/zipcpu/trunk/rtl/Makefile
0,0 → 1,62
################################################################################
#
# Filename: Makefile
#
# Project: Zip CPU -- a small, lightweight, RISC CPU soft core
#
# Purpose: This makefile builds a verilator simulation of the zipsystem.
# It does not make the system within Vivado or Quartus.
#
#
# Creator: Dan Gisselquist, Ph.D.
# Gisselquist Tecnology, LLC
#
################################################################################
#
# Copyright (C) 2015, Gisselquist Technology, LLC
#
# This program is free software (firmware): you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# License: GPL, v3, as defined and found on www.gnu.org,
# http://www.gnu.org/licenses/gpl.html
#
#
################################################################################
#
.PHONY: all
all: zipsystem
 
CORED:= core
PRPHD:= peripherals
AUXD := aux
VSRC := zipsystem.v \
$(PRPHD)/flashcache.v $(PRPHD)/icontrol.v \
$(PRPHD)/zipcounter.v $(PRPHD)/zipjiffies.v \
$(PRPHD)/ziptimer.v $(PRPHD)/ziptrap.v \
$(CORED)/zipcpu.v $(CORED)/cpuops.v \
$(CORED)/pipefetch.v $(CORED)/prefetch.v \
$(CORED)/memops.v \
$(AUXD)/busdelay.v $(AUXD)/wbarbiter.v
 
VOBJ := obj_dir
 
$(VOBJ)/Vzipsystem.cpp: $(VSRC)
verilator -cc -y $(CORED)/ -y $(PRPHD) -y $(AUXD) zipsystem.v
 
$(VOBJ)/Vzipsystem__ALL.a: $(VOBJ)/Vzipsystem.cpp $(VOBJ)/Vzipsystem.h
cd $(VOBJ); make -f Vzipsystem.mk
 
.PHONY: zipsystem
zipsystem: $(VOBJ)/Vzipsystem__ALL.a
 
.PHONY: clean
clean:
rm -rf $(VOBJ)
/zipcpu/trunk/rtl/peripherals/flashcache.v
0,0 → 1,200
///////////////////////////////////////////////////////////////////////////
//
// Filename: flashcache.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: Since my Zip CPU has primary access to a flash, which requires
// nearly 24 clock cycles per read, this 'cache' module
// is offered to minimize the effect. The CPU may now request
// some amount of flash to be copied into this on-chip RAM,
// and then access it with nearly zero latency.
//
// Interface:
// FlashCache sits on the Wishbone bus as both a slave and a master.
// Slave requests for memory will get mapped to a local RAM, from which
// reads and writes may take place.
//
// This cache supports a single control register: the base wishbone address
// of the device to copy memory from. The bottom bit if this address must
// be zero (or it will be silently rendered as zero). When read, this
// bottom bit will indicate 1) that the controller is still loading memory
// into the cache, or 0) that the cache is ready to be used.
//
// Writing to this register will initiate a memory copy from the (new)
// address. Once done, the loading bit will be cleared and an interrupt
// generated.
//
// Where this memory is placed on the wishbone bus is entirely up to the
// wishbone bus control logic. Setting the memory base to an
// address controlled by this flashcache will produce unusable
// results, and may well hang the bus.
// Reads from the memory before complete will return immediately with
// the value if read address is less than the current copy
// address, or else they will stall until the read address is
// less than the copy address.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
//
module flashcache(i_clk,
// Wishbone contrl interface
i_wb_cyc, i_wb_stb,i_wb_ctrl_stb, i_wb_we, i_wb_addr, i_wb_data,
o_wb_ack, o_wb_stall, o_wb_data,
// Wishbone copy interface
o_cp_cyc, o_cp_stb, o_cp_we, o_cp_addr, o_cp_data,
i_cp_ack, i_cp_stall, i_cp_data,
o_int);
parameter LGCACHELEN=10; // 4 kB
input i_clk;
// Control interface, CPU interface to cache
input i_wb_cyc, i_wb_stb,i_wb_ctrl_stb, i_wb_we;
input [(LGCACHELEN-1):0] i_wb_addr;
input [31:0] i_wb_data;
output reg o_wb_ack;
output wire o_wb_stall;
output wire [31:0] o_wb_data;
// Interface to peripheral bus, including flash
output reg o_cp_cyc, o_cp_stb;
output wire o_cp_we;
output reg [31:0] o_cp_addr;
output wire [31:0] o_cp_data;
input i_cp_ack, i_cp_stall;
input [31:0] i_cp_data;
// And an interrupt to send once we complete
output reg o_int;
 
reg loading;
reg [31:0] cache_base;
reg [31:0] cache [0:((1<<LGCACHELEN)-1)];
 
// Decouple writing the cache base from the highly delayed bus lines
reg wr_cache_base_flag;
reg [31:0] wr_cache_base_value;
always @(posedge i_clk)
wr_cache_base_flag <= ((i_wb_cyc)&&(i_wb_ctrl_stb)&&(i_wb_we));
always @(posedge i_clk)
wr_cache_base_value<= { i_wb_data[31:1], 1'b0 };
 
initial cache_base = 32'hffffffff;
always @(posedge i_clk)
if (wr_cache_base_flag)
cache_base <= wr_cache_base_value;
 
reg new_cache_base;
initial new_cache_base = 1'b0;
always @(posedge i_clk)
if ((wr_cache_base_flag)&&(cache_base != wr_cache_base_value))
new_cache_base <= 1'b1;
else
new_cache_base <= 1'b0;
 
reg [(LGCACHELEN-1):0] rdaddr;
initial loading = 1'b0;
always @(posedge i_clk)
if (new_cache_base)
begin
loading <= 1'b1;
o_cp_cyc <= 1'b0;
end else if ((~o_cp_cyc)&&(loading))
begin
o_cp_cyc <= 1'b1;
end else if (o_cp_cyc)
begin
// Handle the ack/read line
if (i_cp_ack)
begin
if (&rdaddr)
begin
o_cp_cyc <= 1'b0;
loading <= 1'b0;
end
end
end
always @(posedge i_clk)
if (~o_cp_cyc)
o_cp_addr <= cache_base;
else if ((o_cp_cyc)&&(o_cp_stb)&&(~i_cp_stall))
o_cp_addr <= o_cp_addr + 1;;
always @(posedge i_clk)
if ((~o_cp_cyc)&&(loading))
o_cp_stb <= 1'b1;
else if ((o_cp_cyc)&&(o_cp_stb)&&(~i_cp_stall))
begin
// We've made our last request
if (o_cp_addr >= cache_base + { {(32-LGCACHELEN-1){1'b0}}, 1'b1, {(LGCACHELEN){1'b0}}})
o_cp_stb <= 1'b0;
end
always @(posedge i_clk)
if (~loading)
rdaddr <= 0;
else if ((o_cp_cyc)&&(i_cp_ack))
rdaddr <= rdaddr + 1;
 
initial o_int = 1'b0;
always @(posedge i_clk)
if ((o_cp_cyc)&&(i_cp_ack)&&(&rdaddr))
o_int <= 1'b1;
else
o_int <= 1'b0;
 
assign o_cp_we = 1'b0;
assign o_cp_data = 32'h00;
 
 
//
// Writes to our cache ... always delayed by a clock.
// Clock 0 : Write request
// Clock 1 : Write takes place
// Clock 2 : Available for reading
//
reg we;
reg [(LGCACHELEN-1):0] waddr;
reg [31:0] wval;
always @(posedge i_clk)
we <= (loading)?((o_cp_cyc)&&(i_cp_ack)):(i_wb_cyc)&&(i_wb_stb)&&(i_wb_we);
always @(posedge i_clk)
waddr <= (loading)?rdaddr:i_wb_addr;
always @(posedge i_clk)
wval <= (loading)?i_cp_data:i_wb_data;
 
always @(posedge i_clk)
if (we)
cache[waddr] <= wval;
 
reg [31:0] cache_data;
always @(posedge i_clk)
if ((i_wb_cyc)&&(i_wb_stb))
cache_data <= cache[i_wb_addr];
 
always @(posedge i_clk)
o_wb_ack <= (i_wb_cyc)&&(
((i_wb_stb)&&(~loading))
||(i_wb_ctrl_stb));
reg ctrl;
always @(posedge i_clk)
ctrl <= i_wb_ctrl_stb;
assign o_wb_data = (ctrl)?({cache_base[31:1],loading}):cache_data;
assign o_wb_stall = (loading)&&(~o_wb_ack);
 
endmodule
/zipcpu/trunk/rtl/peripherals/zipcounter.v
0,0 → 1,82
///////////////////////////////////////////////////////////////////////////
//
// Filename: zipcounter.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose:
// A very, _very_ simple counter. It's purpose doesn't really
// include rollover, but it will interrupt on rollover. It can be set,
// although my design concept is that it can be reset. It cannot be
// halted. It will always produce interrupts--whether or not they are
// handled interrupts is another question--that's up to the interrupt
// controller.
//
// My intention is to use this counter for process accounting: I should
// be able to use this to count clock ticks of processor time assigned to
// each task by resetting the counter at the beginning of every task
// interval, and reading the result at the end of the interval. As long
// as the interval is less than 2^32 clocks, there should be no problem.
// Similarly, this can be used to measure CPU wishbone bus stalls,
// prefetch stalls, or other CPU stalls (i.e. stalling as part of a JMP
// instruction, or a read from the condition codes following a write).
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
//
module zipcounter(i_clk, i_ce,
i_wb_cyc, i_wb_stb, i_wb_we, i_wb_data,
o_wb_ack, o_wb_stall, o_wb_data,
o_int);
parameter BW = 32;
input i_clk, i_ce;
// Wishbone inputs
input i_wb_cyc, i_wb_stb, i_wb_we;
input [(BW-1):0] i_wb_data;
// Wishbone outputs
output reg o_wb_ack;
output wire o_wb_stall;
output reg [(BW-1):0] o_wb_data;
// Interrupt line
output reg o_int;
 
initial o_wb_data = 32'h00;
always @(posedge i_clk)
if ((i_wb_cyc)&&(i_wb_stb)&&(i_wb_we))
o_wb_data <= i_wb_data;
else if (i_ce)
o_wb_data <= o_wb_data + 1;
 
initial o_int = 0;
always @(posedge i_clk)
if (i_ce)
o_int <= &o_wb_data;
else
o_int <= 1'b0;
 
initial o_wb_ack = 1'b0;
always @(posedge i_clk)
o_wb_ack <= (i_wb_cyc)&&(i_wb_stb);
assign o_wb_stall = 1'b0;
endmodule
/zipcpu/trunk/rtl/peripherals/zipjiffies.v
0,0 → 1,140
////////////////////////////////////////////////////////////////////////////////
//
// Filename: zipjiffies.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: This peripheral is motivated by the Linux use of 'jiffies'.
// A process, in Linux, can request to be put to sleep until a certain
// number of 'jiffies' have elapsed. Using this interface, the CPU can
// read the number of 'jiffies' from this peripheral (it only has the
// one location in address space), add the sleep length to it, and
// write the result back to the peripheral. The zipjiffies peripheral
// will record the value written to it only if it is nearer the current
// counter value than the last current waiting interrupt time. If no
// other interrupts are waiting, and this time is in the future, it will
// be enabled. (There is currrently no way to disable a jiffie interrupt
// once set.) The processor may then place this sleep request into a
// list among other sleep requests. Once the timer expires, it would
// write the next jiffy request to the peripheral and wake up the process
// whose timer had expired.
//
// Quite elementary, really.
//
// Interface:
// This peripheral contains one register: a counter. Reads from the
// register return the current value of the counter. Writes within
// the (N-1) bit space following the current time set an interrupt.
// Writes of values that occurred in the last 2^(N-1) ticks will be
// ignored. The timer then interrupts when it's value equals that time.
// Multiple writes cause the jiffies timer to select the nearest possible
// interrupt. Upon an interrupt, the next interrupt time/value is cleared
// and will need to be reset if the CPU wants to get notified again. With
// only the single interface, there is no way of knowing when the next
// interrupt is scheduled for, neither is there any way to slow down the
// interrupt timer in case you don't want it overflowing as often and you
// wish to wait more jiffies than it supports. Thus, currently, if you
// have a timer you wish to wait upon that is more than 2^31 into the
// future, you would need to set timers along the way, wake up on those
// timers, and set further timer's until you finally get to your
// destination.
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
module zipjiffies(i_clk, i_ce,
i_wb_cyc, i_wb_stb, i_wb_we, i_wb_data,
o_wb_ack, o_wb_stall, o_wb_data,
o_int);
parameter BW = 32, VW = (BW-2);
input i_clk, i_ce;
// Wishbone inputs
input i_wb_cyc, i_wb_stb, i_wb_we;
input [(BW-1):0] i_wb_data;
// Wishbone outputs
output reg o_wb_ack;
output wire o_wb_stall;
output wire [(BW-1):0] o_wb_data;
// Interrupt line
output reg o_int;
 
//
// Our counter logic: The counter is always counting up--it cannot
// be stopped or altered. It's really quite simple. Okay, not quite.
// We still support the clock enable line. We do this in order to
// support debugging, so that if we get everything running inside a
// debugger, the timer's all slow down so that everything can be stepped
// together, one clock at a time.
//
reg [(BW-1):0] r_counter;
always @(posedge i_clk)
if (i_ce)
r_counter <= r_counter+1;
 
//
// Writes to the counter set an interrupt--but only if they are in the
// future as determined by the signed result of an unsigned subtract.
//
reg int_set, new_set;
reg [(BW-1):0] int_when, new_when;
wire signed [(BW-1):0] till_when, till_wb;
assign till_when = int_when-r_counter;
assign till_wb = new_when-r_counter;
initial o_int = 1'b0;
initial int_set = 1'b0;
initial new_set = 1'b0;
always @(posedge i_clk)
begin
o_int <= 1'b0;
if ((i_ce)&&(int_set)&&(r_counter == int_when))
begin // Interrupts are self-clearing
o_int <= 1'b1; // Set the interrupt flag
int_set <= 1'b0;// Clear the interrupt
end
 
new_set <= 1'b0;
if ((new_set)&&(till_wb > 0)&&((till_wb<till_when)||(~int_set)))
begin
int_when <= new_when;
int_set <= ((int_set)||(till_wb>0));
end
// Delay things by a clock to simplify our logic
if ((i_wb_cyc)&&(i_wb_stb)&&(i_wb_we))
begin
new_set <= 1'b1;
new_when<= i_wb_data;
end
end
 
//
// Acknowledge any wishbone accesses -- everything we did took only
// one clock anyway.
//
always @(posedge i_clk)
o_wb_ack <= (i_wb_cyc)&&(i_wb_stb);
assign o_wb_data = r_counter;
assign o_wb_stall = 1'b0;
 
endmodule
/zipcpu/trunk/rtl/peripherals/ziptimer.v
0,0 → 1,133
///////////////////////////////////////////////////////////////////////////
//
// Filename: ziptimer.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose:
//
// Interface:
// Two options:
// 1. One combined register for both control and value, and ...
// The reload value is set any time the timer data value is "set".
// Reading the register returns the timer value. Controls are
// set so that writing a value to the timer automatically starts
// it counting down.
// 2. Two registers, one for control one for value.
// The control register would have the reload value in it.
// On the clock when the interface is set to zero the interrupt is set.
// Hence setting the timer to zero will disable the timer without
// setting any interrupts. Thus setting it to five will count
// 5 clocks: 5, 4, 3, 2, 1, Interrupt.
//
//
// Control bits:
// Start_n/Stop. Writing a '0' starts the timer, '1' stops it.
// Thus, ignoring this bit sets it to start.
// AutoReload. If set, then on reset the timer automatically
// loads the last set value and starts over. This is
// useful for distinguishing between a one-time interrupt
// timer, and a repetitive interval timer.
// (COUNT: If set, the timer only ticks whenever an external
// line goes high. What this external line is ... is
// not specified here. This, however, breaks my
// interface ideal of having our peripheral set not depend
// upon anything. Hence, this is an advanced option
// enabled at compile time only.)
// (INTEN. Interrupt enable--reaching zero always creates an
// interrupt, so this control bit isn't needed. The
// interrupt controller can be used to mask the interrupt.)
// (COUNT-DOWN/UP: This timer is *only* a count-down timer.
// There is no means of setting it to count up.)
// WatchDog
// This timer can be implemented as a watchdog timer simply by
// connecting the interrupt line to the reset line of the CPU.
// When the timer then expires, it will trigger a CPU reset.
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
//
module ziptimer(i_clk, i_rst, i_ce,
i_wb_cyc, i_wb_stb, i_wb_we, i_wb_data,
o_wb_ack, o_wb_stall, o_wb_data,
o_int);
parameter BW = 32, VW = (BW-2);
input i_clk, i_rst, i_ce;
// Wishbone inputs
input i_wb_cyc, i_wb_stb, i_wb_we;
input [(BW-1):0] i_wb_data;
// Wishbone outputs
output reg o_wb_ack;
output wire o_wb_stall;
output wire [(BW-1):0] o_wb_data;
// Interrupt line
output reg o_int;
 
reg r_auto_reload, r_running;
reg [(VW-1):0] r_reload_value;
initial r_running = 1'b0;
initial r_auto_reload = 1'b0;
always @(posedge i_clk)
if (i_rst)
begin
r_running <= 1'b0;
r_auto_reload <= 1'b0;
end else if ((i_wb_cyc)&&(i_wb_stb)&&(i_wb_we))
begin
r_running <= (~i_wb_data[(BW-1)])&&(|i_wb_data[(BW-2):0]);
r_auto_reload <= (i_wb_data[(BW-2)]);
 
// If setting auto-reload mode, and the value to other
// than zero, set the auto-reload value
if ((i_wb_data[(BW-2)])&&(|i_wb_data[(BW-3):0]))
r_reload_value <= i_wb_data[(BW-3):0];
end
 
reg [(VW-1):0] r_value;
initial r_value = 0;
always @(posedge i_clk)
if ((r_running)&&(|r_value)&&(i_ce))
begin
r_value <= r_value - 1;
end else if ((r_running)&&(r_auto_reload))
r_value <= r_reload_value;
else if ((~r_running)&&(i_wb_cyc)&&(i_wb_stb)&&(i_wb_we))
r_value <= i_wb_data[(VW-1):0];
 
// Set the interrupt on our last tick.
initial o_int = 1'b0;
always @(posedge i_clk)
if (i_ce)
o_int <= (r_running)&&(r_value == { {(VW-1){1'b0}}, 1'b1 });
else
o_int <= 1'b0;
 
initial o_wb_ack = 1'b0;
always @(posedge i_clk)
o_wb_ack <= (i_wb_cyc)&&(i_wb_stb);
assign o_wb_stall = 1'b0;
 
assign o_wb_data = { ~r_running, r_auto_reload, r_value };
 
endmodule
/zipcpu/trunk/rtl/peripherals/ziptrap.v
0,0 → 1,109
///////////////////////////////////////////////////////////////////////////
//
// Filename: ziptrap.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: On any write, generate an interrupt. On any read, return
// the value from the last write.
//
// This peripheral was added to the Zip System to compensate for the lack
// of any trap instruction within the Zip instruction set. Such an
// instruction is used heavily by modern operating systems to switch
// from a user process to a system process. Since there was no way
// to build such an interface without a trap instruction, this was added
// to accomplish that purpose.
//
// However, in early simulation testing it was discovered that this
// approach would not be very suitable: the interrupt was not generated
// the next clock as one would expect. Hence, executing a trap became:
//
// TRAP $5 MOV $TrapAddr, R0
// LDI $5,R1
// STO R1,(R0)
// NOOP
// NOOP -- here the trap would take effect
// ADD $5,R6 ADD $5,R6
//
// This was too cumbersome, necessitating NOOPS and such. Therefore,
// the CC register was extended to hold a trap value. This leads to
//
// TRAP $5 LDI $500h,CC
// ; Trap executes immediately, user sees no
// ; delay's, no extra wait instructions.
// ADD $5,R6 ADD $5,R6
//
// (BTW: The add is just the "next instruction", whatever that may be.)
// Note the difference: there's no longer any need to load the trap
// address into a register (something that usually could not be done with
// a move, but rather a LDIHI/LDILO pair). There's no longer any wait
// for the Wishbone bus, which could've introduced a variable delay.
// Neither are there any wait states while waiting for the system process
// to take over and respond. Oh, and another difference, the new approach
// no longer requires the system to activate an interrupt line--the user
// process can always initiate such an interrupt. Hence, the new
// solution is better rendering this peripheral obsolete.
//
// It is maintained here to document this part of the learning process.
//
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
///////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
///////////////////////////////////////////////////////////////////////////
//
module ziptrap(i_clk,
i_wb_cyc, i_wb_stb, i_wb_we, i_wb_data,
o_wb_ack, o_wb_stall, o_wb_data,
o_int);
parameter BW = 32; // Bus width
input i_clk;
// Wishbone inputs
input i_wb_cyc, i_wb_stb, i_wb_we;
input [(BW-1):0] i_wb_data;
// Wishbone outputs
output reg o_wb_ack;
output wire o_wb_stall;
output reg [(BW-1):0] o_wb_data;
// Interrupt output
output reg o_int;
 
initial o_wb_ack = 1'b0;
always @(posedge i_clk)
o_wb_ack <= ((i_wb_cyc)&&(i_wb_stb));
assign o_wb_stall = 1'b0;
 
// Initially set to some of bounds value, such as all ones.
initial o_wb_data = {(BW){1'b1}};
always @(posedge i_clk)
if ((i_wb_cyc)&&(i_wb_stb)&&(i_wb_we))
o_wb_data <= i_wb_data;
 
// Set the interrupt bit on any write.
initial o_int = 1'b0;
always @(posedge i_clk)
if ((i_wb_cyc)&&(i_wb_stb)&&(i_wb_we))
o_int <= 1'b1;
else
o_int <= 1'b0;
 
endmodule
/zipcpu/trunk/rtl/peripherals/icontrol.v
0,0 → 1,149
////////////////////////////////////////////////////////////////////////////////
//
// Filename: icontrol.v
//
// Project: Zip CPU -- a small, lightweight, RISC CPU soft core
//
// Purpose: An interrupt controller, for managing many interrupt sources.
//
// This interrupt controller started from the question of how best to
// design a simple interrupt controller. As such, it has a few nice
// qualities to it:
// 1. This is wishbone compliant
// 2. It sits on a 32-bit wishbone data bus
// 3. It only consumes one address on that wishbone bus.
// 4. There is no extra delays associated with reading this
// device.
// 5. Common operations can all be done in one clock.
//
// So, how shall this be used? First, the 32-bit word is broken down as
// follows:
//
// Bit 31 - This is the global interrupt enable bit. If set, interrupts
// will be generated and passed on as they come in.
// Bits 16-30 - These are specific interrupt enable lines. If set,
// interrupts from source (bit#-16) will be enabled.
// To set this line and enable interrupts from this source, write
// to the register with this bit set and the global enable set.
// To disable this line, write to this register with global enable
// bit not set, but this bit set. (Writing a zero to any of these
// bits has no effect, either setting or unsetting them.)
// Bit 15 - This is the any interrupt pin. If any interrupt is pending,
// this bit will be set.
// Bits 0-14 - These are interrupt bits. When set, an interrupt is
// pending from the corresponding source--regardless of whether
// it was enabled. (If not enabled, it won't generate an
// interrupt, but it will still register here.) To clear any
// of these bits, write a '1' to the corresponding bit. Writing
// a zero to any of these bits has no effect.
//
// The peripheral also sports a parameter, IUSED, which can be set
// to any value between 1 and (buswidth/2-1, or) 15 inclusive. This will
// be the number of interrupts handled by this routine. (Without the
// parameter, Vivado was complaining about unused bits. With it, we can
// keep the complaints down and still use the routine).
//
// To get access to more than 15 interrupts, chain these together, so
// that one interrupt controller device feeds another.
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Tecnology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
module icontrol(i_clk, i_reset, i_wr, i_proc_bus, o_proc_bus,
i_brd_ints, o_interrupt_strobe);
parameter IUSED = 15;
input i_clk, i_reset;
input i_wr;
input [31:0] i_proc_bus;
output wire [31:0] o_proc_bus;
input [(IUSED-1):0] i_brd_ints;
output reg o_interrupt_strobe;
 
reg [(IUSED-1):0] r_int_state;
reg [(IUSED-1):0] r_int_enable;
wire [(IUSED-1):0] nxt_int_state;
reg r_any, r_interrupt, r_gie;
 
assign nxt_int_state = (r_int_state|i_brd_ints);
initial r_int_state = 0;
always @(posedge i_clk)
if (i_reset)
r_int_state <= 0;
else if (i_wr)
r_int_state <= nxt_int_state & (~i_proc_bus[(IUSED-1):0]);
else
r_int_state <= nxt_int_state;
initial r_int_enable = 0;
always @(posedge i_clk)
if (i_reset)
r_int_enable <= 0;
else if ((i_wr)&&(i_proc_bus[31]))
r_int_enable <= r_int_enable | i_proc_bus[(16+IUSED-1):16];
else if ((i_wr)&&(~i_proc_bus[31]))
r_int_enable <= r_int_enable & (~ i_proc_bus[(16+IUSED-1):16]);
 
initial r_gie = 1'b0;
always @(posedge i_clk)
if (i_reset)
r_gie <= 1'b0;
else if (i_wr)
r_gie <= i_proc_bus[31];
 
initial r_any = 1'b0;
always @(posedge i_clk)
r_any <= ((r_int_state & r_int_enable) != 0);
initial r_interrupt = 1'b0;
always @(posedge i_clk)
r_interrupt <= r_gie & r_any;
 
generate
if (IUSED < 15)
begin
assign o_proc_bus = {
r_gie, { {(15-IUSED){1'b0}}, r_int_enable },
r_any, { {(15-IUSED){1'b0}}, r_int_state } };
end else begin
assign o_proc_bus = { r_gie, r_int_enable, r_any, r_int_state };
end endgenerate
 
reg int_condition;
initial int_condition = 1'b0;
initial o_interrupt_strobe = 1'b0;
always @(posedge i_clk)
if (i_reset)
begin
int_condition <= 1'b0;
o_interrupt_strobe <= 1'b0;
end else if (~r_interrupt) // This might end up generating
begin // many, many, (wild many) interrupts
int_condition <= 1'b0;
o_interrupt_strobe <= 1'b0;
end else if ((~int_condition)&&(r_interrupt))
begin
int_condition <= 1'b1;
o_interrupt_strobe <= 1'b1;
end else
o_interrupt_strobe <= 1'b0;
 
endmodule
/zipcpu/trunk/doc/gfx/system.dia Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
zipcpu/trunk/doc/gfx/system.dia Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: zipcpu/trunk/doc/gfx/topng.sh =================================================================== --- zipcpu/trunk/doc/gfx/topng.sh (nonexistent) +++ zipcpu/trunk/doc/gfx/topng.sh (revision 2) @@ -0,0 +1,7 @@ +#!/bin/bash + +export GSFLAGS="-q -dNOPAUSE -sDEVICE=png16m -dGraphicsAlphaBits=4 -dTextAlphaBits=4" +gs $GSFLAGS -g640x480 -sOutputFile=cpu.png -r60 -- cpu.eps +convert cpu.png -trim cpu.png +gs $GSFLAGS -g640x480 -sOutputFile=system.png -r60 -- system.eps +convert system.png -trim system.png Index: zipcpu/trunk/doc/gfx/cpu.dia =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: zipcpu/trunk/doc/gfx/cpu.dia =================================================================== --- zipcpu/trunk/doc/gfx/cpu.dia (nonexistent) +++ zipcpu/trunk/doc/gfx/cpu.dia (revision 2)
zipcpu/trunk/doc/gfx/cpu.dia Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: zipcpu/trunk/doc/gfx/system.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: zipcpu/trunk/doc/gfx/system.png =================================================================== --- zipcpu/trunk/doc/gfx/system.png (nonexistent) +++ zipcpu/trunk/doc/gfx/system.png (revision 2)
zipcpu/trunk/doc/gfx/system.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: zipcpu/trunk/doc/gfx/iset.html =================================================================== --- zipcpu/trunk/doc/gfx/iset.html (nonexistent) +++ zipcpu/trunk/doc/gfx/iset.html (revision 2) @@ -0,0 +1,689 @@ +Zip CPU Instruction Set +

Zip CPU Goals

+

The original goal of the ZIP CPU was a simple CPU. For this reason, + all instructions have been designed to be as simple as possible, and + are all designed to be executed in one instruction cycle per + instruction, barring pipeline stalls. This has resulted in the choice + to drop push and pop instructions, pre-increment and post-decrement + addressing modes, and more. +

For those who like buzz words, the Zip CPU is: +

    +
  • A 32-bit CPU: All registers are 32-bits, addresses are 32-bits, + instructions are 32-bits wide, etc. +
  • A RISC CPU. There is no microcode for executing instructions. +
  • A Load/Store architecture. (Only load and store instructions + can access memory.) +
  • Wishbone compliant. All peripherals are accessed just like + memory across this bus. +
  • A Von-Neumann architecture. (The instructions and data share a + common bus.) +
  • A pipelined architecture, having stages for Prefetch, + Decode, Read-Operand, the ALU/Memory + unit, and Write-back +
+ +

Now, however, that I've worked on the Zip CPU for a while, it is not nearly +as simple as I originally hoped. Worse, I've had to adjust to create +capabilities that I was never expecting to need. These include: +

    +
  • Extenal Debug: Once placed upon an FPGA, I'm going to need + a means of debugging this CPU. That means that there needs to be an + external register that can control the CPU: reset it, halt it, step + it, and tell + whether it is running or not. Another register is placed similar to + this register, to allow the external controller to examine registers + internal to the CPU.

    +
  • Internal Debug: Being able to run a debugger from within + a user process requires an ability to step a user process from + within a debugger. It also requires a break instruction that can + be substituted for any other instruction, and substituted back. + The break is actually difficult: the break instruction cannot be + allowed to execute. That way, upon a break, the debugger should + be able to jump back into the user process to step the instruction + that would've been at the break point initially, and then to + replace the break after passing it.

    + +
  • Prefetch CacheMy original implementation had a very + simple prefetch stage. Any time the PC changed the prefetch would go + and fetch the new instruction. While this was perhaps this simplest + approach, it cost roughly five clocks for every instruction. This + was deemed unacceptable, as I wanted a CPU that could execute + instructions in one cycle. I therefore have a prefetch cache that + issues pipelined wishbone accesses to memory and then pushes + instructions at the CPU. Sadly, this accounts for about 20% of the + logic in the entire CPU, or 15% of the logic in the entire system. +

    + +
  • Operating System:In order to support an operating system, + interrupts and so forth, the CPU needs to support supervisor and + user modes, as well as a means of switching between them. For example, + the user needs a means of executing a system call. This is the + purpose of the 'trap' instruction. This instruction needs to + place the CPU into supervisor mode (here equivalent to disabling + interrupts), as well as handing it a parameter such as identifying + which O/S function was called. + +

    My initial approach to building a trap instruction was to create + an external peripheral which, when written to, would generate an + interrupt and could return the last value written to it. This failed + timing requirements, however: the CPU executed two instructions while + waiting for the trap interrupt to take place. Since then, I've + decided to keep the rest of the CC register for that purpose so that a + write to the CC register, with the GIE bit cleared, could be used to + execute a trap. + +

    Modern timesharing systems also depend upon a Timer interrupt + to handle task swapping. For the Zip CPU, this interrupt is handled + external to the CPU as part of the CPU System, found in + zipsystem.v. The timer module itself is found in + ziptimer.v. + +

  • Pipeline Stalls: My original plan was to not support pipeline + stalls at all, but rather to require the compiler to properly schedule + instructions so that stalls would never be necessary. After trying + to build such an architecture, I gave up, having learned some things: + +

    For example, in order to facilitate interrupt handling and debug + stepping, the CPU needs to know what instructions have finished, and + which have not. In other words, it needs to know where it can restart + the pipeline from. Once restarted, it must act as though it had + never stopped. This killed my idea of delayed branching, since + what would be the appropriate program counter to restart at? + The one the CPU was going to branch to, or the ones in the + delay slots? + +

    So I switched to a model of discrete execution: Once an instruction + enters into either the ALU or memory unit, the instruction is + guaranteed to complete. If the logic recognizes a branch or a + condition that would render the instruction entering into this stage + possibly inappropriate (i.e. a conditional branch preceeding a store + instruction for example), then the pipeline stalls for one cycle + until the conditional branch completes. Then, if it generates a new + PC address, the stages preceeding are all wiped clean. + +

    The discrete execution model allows such things as sleeping: if the + CPU is put to "sleep", the ALU and memory stages stall and back up + everything before them. Likewise, anything that has entered the ALU + or memory stage when the CPU is placed to sleep continues to completion. +

    To handle this logic, each pipeline stage has three control signals: + a valid signal, a stall signal, and a clock enable signal. In + general, a stage stalls if it's contents are valid and the next step + is stalled. This allows the pipeline to fill any time a later stage + stalls. + +

  • Verilog Modules: When examining how other processors worked + here on open cores, many of them had one separate module per pipeline + stage. While this appeared to me to be a fascinating and commendable + idea, my own implementation didn't work out quite so nicely. + +

    As an example, the decode module produces a lot of + control wires and registers. Creating a module out of this, with + only the simplest of logic within it, seemed to be more a lesson + in passing wires around, rather than encapsulating logic. + +

    Another example was the register writeback section. I would love + this section to be a module in its own right, and many have made them + such. However, other modules depend upon writeback results other + than just what's placed in the register (i.e., the control wires). + For these reasons, I didn't manage to fit this section into it's + own module. + +

    The result is that the majority of the CPU code can be found in + the zipcpu.v file. +

+ +With that introduction out of the way, let's move on to the instruction +set. + +

Zip CPU Instruction Set

+The Zip CPU supports a set of two operand instructions, where the first operand +(always a register) is the result. The only exception is the store instruction, +where the first operand (always a register) is the source of the data to be +stored. +

Register Set

+The Zip CPU supports two sets of sixteen 32-bit registers, a supervisor +and a user set. The supervisor set is used in interrupt mode, whereas +the user set is used otherwise. Of this register set, the Program Counter (PC) +is register 15, whereas the status register (SR) or condition code register +(CC) is register 14. By convention, the stack pointer will be register 13 and +noted as (SP)--although the instruction set allows it to be anything. +The CPU can access both register sets via move instructions from the +supervisor state, whereas the user state can only access the user registers. + +

The status register is special, and bears further mention. The lower +8 bits of the status register form a set of condition codes. Writes to other +bits are preserved, and can be used as part of the trap architecture--examined +by the O/S upon any interrupt, cleared before returning. +

Of the eight condition codes, the bottom four are the current flags: + Zero (Z), + Carry (C), + Negative (N), + and Overflow (V). + +

The next bit is a clock enable (0 to enable) or sleep bit (1 to put + the CPU to sleep). Setting this bit will cause the CPU to + wait for an interrupt (if interrupts are enabled), or to + completely halt (if interrupts are disabled). +

The sixth bit is a global interrupt enable bit (GIE). When this + sixth bit is a '1' interrupts will be enabled, else disabled. When + interrupts are disabled, the CPU will be in supervisor mode, otherwise + it is in user mode. Thus, to execute a context switch, one only + need enable or disable interrupts. (When an interrupt line goes + high, interrupts will automatically be disabled, as the CPU goes + and deals with its context switch.) +

Experimental: The seventh bit is a step bit. This bit can be + set from supervisor mode only. After setting this bit, should + the supervisor mode process switch to user mode, it would then + accomplish one instruction in user mode before returning to supervisor + mode. Then, upon return to supervisor mode, this bit will + be automatically cleared. This bit has no effect on the CPU while in + supervisor mode. +

This functionality was added to enable a userspace debugger + functionality on a user process, working through supervisor mode + of course. +

Experimental: The eighth bit is a break enable bit. This + controls whether a break instruction will halt the processor for an + external debuggerr (break enabled), or whether the break instruction + will simply set the STEP bit and send the CPU into interrupt mode. + This bit can only be set within supervisor mode. +

This functionality was added to enable an external debugger to + set and manage breakpoints. +

The status register bits are shown below: +

+ + +
7654 3 2 1 0
BREAKENSTEPGIESLEEPVNC Z
+

Conditions

+Most, although not quite all, instructions are conditional. From the four +condition code flags, eight conditions are defined. These are: + + + + + + + + + + +
CodeMneumonicCondition
3'h0(None)Always
3'h1.ZEqual (Zero set)
3'h2.NENot equal to (!Z)
3'h3.GEGreater than or equal (N not set, Z irrelevant)
3'h4.GTGreater than (N not set, Z not set)
3'h5.LTLess than (N set)
3'h6.CCarry set
3'h7.VOverflow set
+There is no condition code for less than or equal, not C or not V. Using +these conditions will take an extra instruction. +(Ex: TST $4,CC; STO.NZ R0,(R1)) +

Operand B

+Many instruction forms have a 21-bit source "Operand B" associated with them. +This Operand B is either equal to a register plus a signed immediate offset, +or an immediate offset by itself. This value is encoded as, + + + + + + + + +
20191817161514131211109876543210
1'b0Signed Immediate Value
1'b1RegisterSigned immediate offset
+

Address Mode(s)

+The ZIP CPU supports two addressing modes: register plus immediate, and +immediate address. Addresses are therefore encoded in the same fashion as +Operand B's, shown above. + +

A lot of long hard thought was put into whether to allow pre/post increment +and decrement addressing modes. Finding no way to use these operators without +taking two or more clocks per instruction, these addressing modes have been +removed from the realm of possibilities. This means that the Zip CPU has no +native way of executing push, pop, return, or jump to subroutine operations. + +

Move Operands

+

The previous set of operands would be perfect and complete, save only that + the CPU needs access to non--supervisory registers while in supervisory + mode. Therefore, the MOV instruction is special and offers access + to these registers ... when in supervisory mode. To keep the compiler + simple, the extra bits are ignored in non-supervisory mode (as though + they didn't exist), rather than being mapped to new instructions or + additional capabilities. The bits indicating which register set each + register lies within are the A-map and B-map bits. Further, because + a load immediate instruction exists, there is no move capability between + an immediate and a register: all moves come from either a register or + a register plus an offset. +

This actually leads to a bit of a problem: since the MOV instruction + encodes which register set each register is coming from or moving to, + how shall a compiler or assembler know how to compile a MOV instruction + without knowing the mode of the CPU at the time? For this reason, + the compiler will assume all MOV registers are supervisor registers, + and display them as normal. Anything with the user bit set will + be treated as a user register. The CPU will quietly ignore the + supervisor bits while in user mode, and anything marked as a user + register will always be valid. +

Native Instructions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Op Code31..2423..1615..87..0Sets CC? (Y/N)
                                
CMP(Sub)4'h0Data RegConditionsOperand BY
BTST(And)4'h1Data RegConditionsOperand B
MOV4'h2Data RegConditionsA-MapB-RegB-Map+ImmediateN
LODI4'h3Result Reg24'bit Signed Immediate
NOOP4'h44'he24'h00N
BREAK4'h44'he24'h01N
LODIHI4'h44'hfConditions1'b1Result Reg16-bit ImmediateN
LODILO4'h44'hfConditions1'b0Result Reg16-bit ImmediateN
16-b MPY4'h4Result RegConditionsOperand + B (Reserved for)N
ROL4'h5Result RegConditions2'b11Operand Reg6'h00, Unused/Reserved1'b0ImmediateN
1'b0Rotate amount6'h00, Unused/Reserved1'b0ImmediateN
LOD4'h6Resulting RegConditionsAddress: Register+Immediate, or ImmediateN
STO4'h7Data RegConditionsAddress: Register+Immediate, or Immediate
SUB4'h8Result RegConditionsOperand BY
AND4'h9Result RegConditionsOperand B
ADD4'haResult RegConditionsOperand B
OR4'hbResult RegConditionsOperand B
XOR4'hcResult RegConditionsOperand B
LSL/ASL4'hdResult RegConditionsOperand B
ASR4'heResult RegConditionsOperand B
LSR4'hfResult RegConditionsOperand B
+

Derived Instructions

+ + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +
MappedActualNotes
ADD Ra,Rx
+ ADDC Rb,Ry
ADD Ra,Rx
ADD.C $1,Ry
ADD Rb,Ry
Add with carry
BRA.cond +/-$Addr + MOV.cond $Addr+PC,PCBranch/jump on condition. Works for 14 bit address offsets.
LDI $Addr,Rx
+ ADD.cond Rx,PC
Branch/jump on condition. Works for + 23 bit address offsets, but costs a register, an extra instruction, + and setsthe flags.
BNC PC+$Addr + TEST $Carry,CC
+ MOV.Z PC+$addr,PC
Example of a branch on an unsupported + condition, in this case a branch on not carry
CLRF.NZ RxXOR.NZ Rx,RxClear Rx, and flags, if the Z-bit is not set
CLR RxLDI $0,RxClears Rx, leaves flags untouched. This instruction cannot be conditional.
EXCH.W RxROL $16,RxExchanges the top and bottom 16'bit words of Rx
HALTOr $SLEEP,CCExecuted while in interrupt mode. In user mode this is simply a wait until interrupt instructioon.
INTAND $!GIE,CCWithout setting an + interrupt flag or trap vector, the O/S might not know what to do with + this instruction. Therefore the trap version is recommended
IRETOR $GIE,CC
JMP R6+$AddrMOV $Addr(R6),PC 
JSR PC+$Addr + SUB $1,SP
+ MOV $3+PC,R0
+ STO R0,1(SP)
+ MOV $Addr+PC,PC
+ ADD $1,SP
Jump to Subroutine.
MOV $3+PC,R12
MOV $addr+PC,PC
This is the high speed + version of the call, necessitating a register to hold the last + PC address. In its favor, this method doesn't suffer the mandatory + memory access of the other approach.
JTUOR $GIE,CCAlso known as a JUMP-To-USER + space command, also known as IRET.
LDI.l $val,Rx + LDIHI HIBITS($val),Rx
+ LDILO LOBITS($val),Rx
Sadly, there's not enough instruction + space to load a complete immediate value into any register. + Therefore, fully loading any register takes two cycles. + The LDIHI (load immediate high) and LDILO (load immediate low) + instructions have been created to facilitate this.
LOD.b $addr,Rx + LDI $addr,Ra
+ LDI $addr,Rb
+ LSR $2,Ra
+ AND $3,Rb
+ LOD (Ra),Rx
+ LSL $3,Rb
+ SUB $32,Rb
+ ROL Rb,Rx
+ AND $0ffh,Rx
This CPU is designed for 32'bit word + length instructions. Byte addressing is not supported by the CPU or + the bus, so it therefore takes more work to do.

Note that in + this example, $Addr is a byte-wise address, where all other addresses + are 32-bit wordlength addresses. For this reason, we needed to + drop the bottom two bits.

LSL $1,Rx
LSLC $1,Ry
LSL $1,Ry
+ LSL $1,Rx
+ OR.C $1,Ry
Logical shift left with carry. Note that the + instruction order is now backwards, to keep the conditions valid. + That is, LSL sets the carry flag, so if we did this the othe way + with Rx before Ry, then the condition flag wouldn't have been right + for an OR correction at the end.
LSR $1,Rx
LSRC $1,Ry
+ CLR Rz
+ LSR $1,Ry
+ LDIHI.C $8000h,Rz
+ LSR $1,Rx
+ OR Rz,Rx
Logical shift right with carry
NEG RxXOR $-1,Rx
ADD $1,Rx
 
NOOPNOOPWhile there are many + operations that do nothing, such as MOV Rx,Rx, or OR $0,Rx, these + operations have consequences in that they might stall the bus if + Rx isn't ready yet. For this reason, we have a dedicated NOOP + instruction.
NOT RxXOR $-1,Rx 
POP RxLOD $-1(SP),Rx
ADD $1,SP
Note + that for interrupt purposes, one can never depend upon the value at + (SP). Hence you read from it, then increment it, lest having + incremented it firost something then comes along and writes to that + value before you can read the result.
PUSH Rx + SUB $1,SP
+ STO Rx,$1(SP)
 
RESETSTO $1,$watchdog(R12)
NOOP
NOOP
+ This depends upon the peripheral base address being in R12. +

Another opportunity might be to jump to the reset address from within + supervisor mode. +

RETLOD $-1(SP),R0
+ MOV $-1+SP,SP
+ MOV R0,PC
An alternative might be to LOD $-1(SP),PC, followed + by depending upon the calling program to ADD $1,SP.
MOV R12,PCThis is the high(er) speed version, that doesn't + touch the stack. As such, it doesn't suffer a stall on memory + read/write to the stack.
STEP Rr,RtLSR $1,Rr
XOR.C Rt,Rr
Step a + Galois implementation of a Linear Feedback Shift Register, Rr, using + taps Rt
STO.b Rx,$addr + LDI $addr,Ra
+ LDI $addr,Rb
+ LSR $2,Ra
+ AND $3,Rb
+ SUB $32,Rb
+ LOD (Ra),Ry
+ AND $0ffh,Rx
+ AND $-0ffh,Ry
+ ROL Rb,Rx
+ OR Rx,Ry
+ STO Ry,(Ra)
This CPU and it's bus are not optimized + for byte-wise operations.

Note that in this example, $addr is a + byte-wise address, whereas in all of our other examples it is a + 32-bit word address. Further, this instruction implies a byte ordering, + such as big or little endian.

SWAP Rx,Ry + XOR Ry,Rx
+ XOR Rx,Ry
+ XOR Ry,Rx
While no extra registers are needed, this example + does take 3-clocks.
TRAP #XLDILO $x,CC + This approach uses the unused bits of the CC register as a TRAP + address. If these bits are zero, no trap has occurred. Unlike my + previous approach, which was to use a trap peripheral, this approach + has no delay associated with it. To work, the supervisor will need + to clear this register following any trap, and the user will need to + be careful to only set this register prior to a trap condition. + Likewise, when setting this value, the user will need to make certain + that the SLEEP and GIE bits are not set in $x. LDI would also work, + however using LDILO permits the use of conditional traps. (i.e., + trap if the zero flag is set.) Should you wish to trap off of a + register value, you could equivalently load $x into the register and + then MOV it into the CC register. +
TST RxTST $-1,RxSet the + condition codes based upon Rx. Could also do a CMP $0,Rx, + ADD $0,Rx, SUB $0,Rx, etc, AND $-1,Rx, etc. The TST and CMP + approaches won't stall future pipeline stages looking for the value + of Rx.
WAITOr $SLEEP,CCWait + 'til interrupt. In an interrupts disabled context, this becomes a + HALT instruction.
+

Pipeline Stages

+
    +
  1. PREFETCH: Read instruction from memory (cache if possible) +
      +
    • A lack of an instruction, or a waiting memory operation, stalls the + pipeline. +
    +
  2. DECODE: Decode instruction into op code, register(s) to read, and + immediate offset. +
    • INPUT: Instruction +
    • OUTPUT: 5-bit register address of result, + 5-bit register address of an input and usage flag (this + register is used), 5-bit register address of second input and + usage flag, 32-bit immediate offset. +

      decode(i_clk, (i_ce)&(~stall), i_instr, i_gie, i_pc, + o_opcode, o_ccode, + o_wr_back, o_wr_reg, o_ra_read, o_ra_reg, + o_rb_read, o_rb_reg, + o_immediate, + o_memop, o_wr, o_iodec); +

    • Move instruction gets one decoder, produces two registers addresses, + use flag set to one on register B, address A is unused. +
    • Load/Store instructions produce two registers, an immediate, and + two flags +
    • Operand B type instructions produce two registers, an immediate, + and a use flag +
    • LDI produces one register, a (longer) immediate, and sets the use + flag to zero (second register isn't used) +
    • This section never stalls. On an external stall it simply doesn't update + it's outputs. Outputs are available one clock after + the instruction is valid. +
    +
  3. READ OPERANDS: Read registers and apply any immediate values to them. +
      +
    • This should stall if a source operand is pending. +
    +
  4. Split into two tracks: A) ALU accomplish simple instruction, B) MEMOPS memory read/write. +
      +
    • Loads stall instructions that access the register until it is + written to the register set. +
    • Condition codes are available upon completion +
    • Issuing an instruction to the memory while the memory is busy will + stall the bus. If the bus deadlocks, only a reset will + release the CPU. (Watchdog timer, anyone?) +
    +
  5. WRITE-BACK: Conditionally write back the result to register set, applying the + condition. This routine is bi-re-entrant. Either the memory or the + simple instruction may request a register write. Memory writes take + priority, stalling the other track. +
      +
    • This stage will stall the pipeline if both memory and op + try to write to the registers at the same time. +
    • +
+

Pipeline Logic

+How the CPU handles some instruction combinations can be telling when +determining what happens in the pipeline. For example: + + + + + + + + + + +
Instruction(s)IssueChoice
Delayed BrnachingWhat happens in debug mode? + That is, what happens when a debugger tries to single step an + instruction? While I can easily single step the computer in either + user or supervisor mode from externally, this processor does not appear + able to step the CPU in user mode from within user mode--gosh, not even + from within supervisor mode--such as if a process had a debugger + attached. As the processor exists, I would have one result stepping + the CPU from a debugger, and another stepping it externally. +

This is unacceptable. +

MOV R0,R1
MOV R1,R2
What value does + R2 get, the value of R1 before the first move or the value of R0? + Placing the value of R0 into R1 requires a pipeline stall, and possibly + two, as I have the pipeline designed.R2 must + equal R0 at the end of this operation. This may stall the pipeline + 1-2 cycles.
CMP R0,R1
MOV.EQ $x,PC
At issue is + the same item as above, save that the CMP instruction updates the + flags that the MOV instruction depends + upon.Condition codes must be updated and available + immediately for the next instruction without stalling the + pipeline.
CMP R0,R1
MOV CC,R2
At issue is the + fact that the logic supporting the CC register is more complicated than + the logic supporting any other register.This will + create a stall, of 1-2 clock cycles
ADD $5,R0
BTST $8,CC
Test for + overflow (or not). At issue is the load of the condition codes for + the BTST instruction, which takes place two clocks before the prior + instruction writes it back.Negotiable for + simplified logic. Let's stall here, 1-2 clocks.
ADD $x,PC
MOV R0,R1
Will the + instruction following the jump take place before the jump? In + other words, is the MOV to the PC register handled differently from + an ADD to the PC register? + MOV'es and ADD's use the same logic (simplifies the logic).
MOV $x,PC
MOV R0,R1
Will the + instruction following the jump take place before the jump? Or must the + pipeline "turn off" any outputs associated with a jump once it + recognizes that the jump has taken place? Alternatively, the pipeline + could stall until the result of the MOV was + available. + Negotiable for simplified logic
MOV $x,PC
MOV R0,R1
Will the + instruction following the jump take place before the jump sometimes + but not all times? Might the pipeline not be full when the jump + takes place, and thus the MOV instruction never gets loaded due to a + stalled pre-fetch? Or is the MOV a dependable instruction, guaranteed + to be executed (or not) no matter what the JMP does? Perhaps the + compiler is required to insert 2-3 NOOP's following a jump, just + to keep the pipeline doing something reliably? + + Negotiable (at present). Highly desired that the behavior + is the same regardless of the prefetch speed.
MOV.EQ $x,PC
MOV $y,PC
Where will + instructions take place next? On a delayed jump instruction, this + means that instruction $x will be executed followed by $y, and + execution will not continue at $x as + desiredNegotiable. +
+

As I've studied this, I find several approaches to handling pipeline + issues. These approaches (and their consequences) are listed below. +

+ + + + + +
Condition/CaseDiscussion
All issued instructions complete +
Stages stall individually
What about a + slow pre-fetch?

Nominally, this works well: any issued instruction + just runs to completion. If there are four issued instructions in the + pipeline, with the writeback instruction being a write-to-PC + instruction, the other three instructions naturally finish. +

This approach fails when reading instructions from the flash, + since such reads require N clocks to clocks to complete. Thus + there may be only one instruction in the pipeline if reading from flash, + or a full pipeline if reading from cache. Each of these approaches + would produce a different response. +

This is unacceptable.

Issued instructions may be canceled +
Stages stall individually
First problem: + Memory operations cannot be canceled, even reads may have side effects + on peripherals that cannot be canceled later. Further, in the case of + an interrupt, it's difficult to know what to cancel. What happens in + a MOV.C $x,PC followed by a MOV $y,PC instruction? Which get + canceled?

Because it isn't clear what would need to be canceled, + this is not doable.

All issued instructions complete. +
All stages are filled, or the entire pipeline + stalls.
What about debug control? What about + register writes taking an extra clock stage? MOV R0,R1; MOV R1,R2 + should place the value of R0 into R2. How do you restart the pipeline + after an interrupt? What address do you use? The last issued + instruction? But the branch delay slots may make that invalid! +

Reading from the CPU debug port in this case yields inconsistent + results: the CPU will halt or step with instructions stuck in the + pipeline. Reading registers will give no indication of what is going + on in the pipeline, just the results of completed operations, not of + operations that have been started and not yet completed. + Perhaps we should just report the state of the CPU based upon what + instructions (PC values) have successfully completed? Thus the + debug instruction is the one that will write registers on the next + clock. +

    Suggestion: Suppose we load extra information in the two + CC register(s) for debugging intermediate pipeline stages?
+

The next problem, though, is how to deal with the read operand + pipeline stage needing the result from the register pipeline.

All instructions that enter into the memory module *must* + complete. Issued instructions from the prefetch, decode, or operand + read stages may or may not complete. Jumps into code must be valid, + so that interrupt returns may be valid. All instructions entering the + ALU complete.This looks to be the simplest approach. + While the logic may be difficult, this appears to be the only + re-entrant approach. + +

A new_pc flag will be high anytime the PC changes in an + unpredictable way (i.e., it doesn't increment). This includes jumps + as well as interrupts and interrupt returns. Whenever this flag may + go high, memory operations and ALU operations will stall until the + result is known. When the flag does go high, anything in the prefetch, + decode, and read-op stage will be invalidated. +

+ Index: zipcpu/trunk/doc/gfx/cpu.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: zipcpu/trunk/doc/gfx/cpu.png =================================================================== --- zipcpu/trunk/doc/gfx/cpu.png (nonexistent) +++ zipcpu/trunk/doc/gfx/cpu.png (revision 2)
zipcpu/trunk/doc/gfx/cpu.png Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: zipcpu/trunk/doc/gfx/system.eps =================================================================== --- zipcpu/trunk/doc/gfx/system.eps (nonexistent) +++ zipcpu/trunk/doc/gfx/system.eps (revision 2) @@ -0,0 +1,6086 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/dan/work/rnd/zipcpu/system.dia +%%Creator: Dia v0.97.2 +%%CreationDate: Sat Jul 25 15:50:32 2015 +%%For: dan +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 609 469 +%%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 +5.410491 -5.410491 scale +0.200000 -86.447214 translate +%%EndProlog + + +0.400000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 0.792157 srgb +n 4.000000 0.000000 m 4.000000 74.000000 l 108.000000 74.000000 l 108.000000 0.000000 l f +n 4.000000 4.000000 m 4.000000 4.000000 4.000000 4.000000 180.000000 270.000000 ellipse f +n 108.000000 4.000000 m 108.000000 4.000000 4.000000 4.000000 270.000000 360.000000 ellipse f +n 0.000000 4.000000 m 0.000000 70.000000 l 112.000000 70.000000 l 112.000000 4.000000 l f +n 4.000000 70.000000 m 4.000000 70.000000 4.000000 4.000000 90.000000 180.000000 ellipse f +n 108.000000 70.000000 m 108.000000 70.000000 4.000000 4.000000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 4.000000 0.000000 m 108.000000 0.000000 l s +n 4.000000 74.000000 m 108.000000 74.000000 l s +n 4.000000 4.000000 4.000000 4.000000 180.000000 270.000000 ellipse s +n 108.000000 4.000000 4.000000 4.000000 270.000000 360.000000 ellipse s +n 0.000000 4.000000 m 0.000000 70.000000 l s +n 112.000000 4.000000 m 112.000000 70.000000 l s +n 4.000000 70.000000 4.000000 4.000000 90.000000 180.000000 ellipse s +n 108.000000 70.000000 4.000000 4.000000 0.000000 90.000000 ellipse s +gsave 4.000000 6.000000 translate 0.035278 -0.035278 scale +start_ol +27295 29568 moveto +6711 29568 lineto +3397 19779 lineto +5074 19328 lineto +5197 19533 5361 19820 5524 20148 curveto +7939 24246 8348 24820 9862 25927 curveto +11417 27115 13709 27648 17105 27648 curveto +21034 27648 lineto +-778 1556 lineto +-1023 0 lineto +21648 0 lineto +25003 10481 lineto +23285 10972 lineto +21525 7490 20747 6303 19356 4910 curveto +17228 2780 14732 1920 10722 1920 curveto +5197 1920 lineto +27049 27971 lineto +27295 29568 lineto +end_ol grestore +gsave 7.611620 6.000000 translate 0.035278 -0.035278 scale +start_ol +9472 19210 moveto +1579 18597 lineto +1415 17125 lineto +2398 17125 lineto +4078 17125 4733 16757 4733 15858 curveto +4733 15490 4610 14959 4364 14060 curveto +1989 6090 lineto +1252 3515 1088 2861 1088 1962 curveto +1088 529 2316 -576 3912 -576 curveto +5680 -576 7365 365 9009 2246 curveto +9749 3064 10407 3963 11558 5722 curveto +10290 6417 lineto +8235 3270 6427 1472 5318 1472 curveto +4900 1472 4608 1840 4608 2330 curveto +4608 2739 4773 3474 5103 4619 curveto +9472 19210 lineto +8736 29184 moveto +7509 29184 6528 28203 6528 26976 curveto +6528 25790 7509 24768 8695 24768 curveto +9963 24768 10944 25749 10944 26976 curveto +10944 28203 9963 29184 8736 29184 curveto +end_ol grestore +gsave 9.414929 6.000000 translate 0.035278 -0.035278 scale +start_ol +9548 19264 moveto +2100 18648 lineto +1936 17170 lineto +2918 17170 lineto +4596 17170 5251 16801 5251 15898 curveto +5251 15488 5128 14874 4883 14096 curveto +-355 -3678 lineto +-1173 -6626 -1214 -6667 -3997 -6790 curveto +-4161 -8256 lineto +5660 -8256 lineto +5824 -6790 lineto +5333 -6790 lineto +3369 -6790 2714 -6546 2714 -5731 curveto +2714 -5404 2878 -4710 3164 -3689 curveto +5169 2968 lineto +6274 139 7338 -640 10039 -640 curveto +12902 -640 15437 632 17400 3176 curveto +19486 5802 20672 9208 20672 12573 curveto +20672 14584 20263 15939 19323 17129 curveto +18260 18443 16625 19264 15031 19264 curveto +12944 19264 10775 18032 8934 15774 curveto +9548 19264 lineto +13763 17088 moveto +15604 17088 16832 15651 16832 13476 curveto +16832 11218 16136 8427 14909 5882 curveto +13477 2804 11840 1408 9671 1408 curveto +7666 1408 6233 3009 6233 5184 curveto +6233 7565 7502 11505 9057 13886 curveto +10407 15939 12126 17088 13763 17088 curveto +end_ol grestore +gsave 12.522022 6.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 14.028113 6.000000 translate 0.035278 -0.035278 scale +start_ol +25810 29291 moveto +24255 29291 lineto +22053 27147 lineto +19928 29257 17599 30208 14616 30208 curveto +9094 30208 4800 26182 4800 21006 curveto +4800 19164 5496 17363 6723 16012 curveto +7542 15111 8688 14415 10816 13515 curveto +14335 12041 lineto +16545 11141 17036 10895 17527 10567 curveto +18714 9708 19328 8521 19328 7006 curveto +19328 3526 16419 1152 12199 1152 curveto +9542 1152 7579 1971 5985 3772 curveto +4472 5491 3818 7497 3818 10240 curveto +3818 10404 3818 10936 3859 11386 curveto +2222 11673 lineto +-29 -15 lineto +1403 -15 lineto +3818 2585 lineto +6107 435 8928 -640 12240 -640 curveto +18615 -640 23232 3344 23232 8766 curveto +23232 12778 21515 14866 16649 16790 curveto +13173 18182 lineto +9943 19451 8512 20965 8512 23053 curveto +8512 26082 11257 28416 14903 28416 curveto +19234 28416 21931 25100 21931 19696 curveto +21931 19574 21931 19247 21890 18878 curveto +23605 18592 lineto +25810 29291 lineto +end_ol grestore +gsave 17.639734 6.000000 translate 0.035278 -0.035278 scale +start_ol +8984 12918 moveto +8042 17381 6897 19264 5137 19264 curveto +3336 19264 1495 17012 -183 12591 curveto +1086 12018 lineto +2600 15293 3050 15948 3746 15948 curveto +4319 15948 4851 15088 5301 13328 curveto +6569 8661 7306 5222 8206 63 curveto +6856 -2066 6569 -2475 5874 -3376 curveto +4237 -5382 2641 -6528 1536 -6528 curveto +1045 -6528 758 -6282 758 -5873 curveto +758 -4604 758 -4604 636 -4276 curveto +349 -3498 -346 -3007 -1124 -3007 curveto +-2311 -3007 -3252 -3990 -3252 -5218 curveto +-3252 -6901 -1615 -8256 513 -8256 curveto +2887 -8256 5096 -6864 7511 -3833 curveto +9434 -1376 12667 4030 15736 10009 curveto +18069 14514 18560 15784 18560 17135 curveto +18560 18404 17823 19264 16718 19264 curveto +15613 19264 14713 18322 14713 17217 curveto +14713 17012 14754 16767 14795 16521 curveto +15040 15129 15040 15006 15040 14392 curveto +15040 12345 13444 8497 10784 4280 curveto +8984 12918 lineto +end_ol grestore +gsave 20.347199 6.000000 translate 0.035278 -0.035278 scale +start_ol +9991 19200 moveto +5680 19200 2560 16585 2560 13031 curveto +2560 11309 3588 9792 5396 8849 curveto +6054 8522 6917 8112 8602 7456 curveto +10945 6513 11520 5898 11520 4504 curveto +11520 2331 9660 896 6808 896 curveto +4730 896 3264 1470 3264 2290 curveto +3264 2495 3385 2782 3547 2905 curveto +4275 3725 4396 3930 4396 4668 curveto +4396 5816 3498 6718 2314 6718 curveto +961 6718 -64 5570 -64 3971 curveto +-64 1115 2512 -640 6601 -640 curveto +11338 -640 14592 1934 14592 5652 curveto +14592 7251 13850 8686 12532 9588 curveto +11625 10161 11213 10366 8947 11186 curveto +6268 12129 5568 12785 5568 14384 curveto +5568 16270 7387 17664 9784 17664 curveto +11360 17664 12480 17213 12480 16557 curveto +12480 16393 12396 16188 12271 15983 curveto +11687 15163 11603 14958 11603 14343 curveto +11603 13236 12507 12457 13739 12457 curveto +15126 12457 16064 13482 16064 14958 curveto +16064 17446 13520 19200 9991 19200 curveto +end_ol grestore +gsave 22.749946 6.000000 translate 0.035278 -0.035278 scale +start_ol +11004 25417 moveto +7444 25417 lineto +5439 18624 lineto +1596 18624 lineto +1024 16704 lineto +4866 16704 lineto +1801 6373 lineto +1228 4324 1024 3381 1024 2479 curveto +1024 755 2332 -640 3966 -640 curveto +5889 -640 8181 631 9613 2559 curveto +10186 3338 10595 3994 11659 5717 curveto +10432 6537 lineto +7894 2684 6708 1536 5357 1536 curveto +4784 1536 4416 1987 4416 2684 curveto +4416 3012 4457 3299 4539 3627 curveto +8426 16704 lineto +12887 16704 lineto +13460 18624 lineto +8999 18624 lineto +11004 25417 lineto +end_ol grestore +gsave 24.655665 6.000000 translate 0.035278 -0.035278 scale +start_ol +13861 4724 moveto +11439 2223 9633 1280 7499 1280 curveto +5038 1280 3520 2920 3520 5545 curveto +3520 5832 3561 6406 3602 6939 curveto +8405 8087 9226 8333 11074 9153 curveto +14235 10547 16000 12639 16000 15017 curveto +16000 17532 13986 19264 11108 19264 curveto +5140 19264 -256 13143 -256 6447 curveto +-256 2023 2395 -640 6801 -640 curveto +9962 -640 12631 752 14848 3617 curveto +13861 4724 lineto +3807 8538 moveto +4750 14074 7253 17600 10288 17600 curveto +11642 17600 12544 16657 12544 15263 curveto +12544 13008 10944 11080 7991 9768 curveto +6801 9235 6104 9030 3807 8538 curveto +end_ol grestore +gsave 27.058413 6.000000 translate 0.035278 -0.035278 scale +start_ol +9399 19200 moveto +1951 18592 lineto +1828 17133 lineto +2810 17133 lineto +4447 17133 5102 16766 5102 15827 curveto +5102 15458 4979 14803 4775 14066 curveto +601 -19 lineto +4161 -19 lineto +5839 5754 lineto +7680 12019 11404 16768 14473 16768 curveto +15537 16768 16192 16195 16192 15173 curveto +16192 14354 15865 12634 15374 11078 curveto +12100 -19 lineto +15660 -19 lineto +17417 5918 lineto +18439 9316 19461 11609 20769 13370 curveto +22240 15376 24325 16768 25878 16768 curveto +26931 16768 27520 16196 27520 15255 curveto +27520 14682 27313 13783 26940 12637 curveto +25033 6830 lineto +23913 3640 23872 3394 23872 2249 curveto +23872 516 25182 -640 27065 -640 curveto +28420 -640 29734 17 31130 1332 curveto +31951 2153 32526 2851 34250 5357 curveto +32981 6216 lineto +30820 2985 29353 1472 28293 1472 curveto +27821 1472 27392 1963 27392 2494 curveto +27392 2862 27516 3312 27886 4498 curveto +30482 12433 lineto +30770 13332 30976 14641 30976 15500 curveto +30976 17655 29370 19200 27146 19200 curveto +24250 19200 21639 17285 19273 13455 curveto +19438 14232 19520 14927 19520 15418 curveto +19520 17573 17795 19200 15537 19200 curveto +12959 19200 11077 17774 8212 13701 curveto +9399 19200 lineto +end_ol grestore +0.500000 slw +[] 0 sd +[] 0 sd +1 slj +0.847059 0.898039 0.898039 srgb +n 7.000000 10.000000 m 7.000000 51.121320 l 57.121320 51.121320 l 57.121320 10.000000 l f +n 7.000000 13.000000 m 7.000000 13.000000 3.000000 3.000000 180.000000 270.000000 ellipse f +n 57.121320 13.000000 m 57.121320 13.000000 3.000000 3.000000 270.000000 360.000000 ellipse f +n 4.000000 13.000000 m 4.000000 48.121320 l 60.121320 48.121320 l 60.121320 13.000000 l f +n 7.000000 48.121320 m 7.000000 48.121320 3.000000 3.000000 90.000000 180.000000 ellipse f +n 57.121320 48.121320 m 57.121320 48.121320 3.000000 3.000000 0.000000 90.000000 ellipse f +0.501961 0.501961 0.501961 srgb +n 7.000000 10.000000 m 57.121320 10.000000 l s +n 7.000000 51.121320 m 57.121320 51.121320 l s +n 7.000000 13.000000 3.000000 3.000000 180.000000 270.000000 ellipse s +n 57.121320 13.000000 3.000000 3.000000 270.000000 360.000000 ellipse s +n 4.000000 13.000000 m 4.000000 48.121320 l s +n 60.121320 13.000000 m 60.121320 48.121320 l s +n 7.000000 48.121320 3.000000 3.000000 90.000000 180.000000 ellipse s +n 57.121320 48.121320 3.000000 3.000000 0.000000 90.000000 ellipse s +0.010000 slw +[] 0 sd +0 slj +1 slc +0.000000 0.000000 0.000000 srgb +n 14.015501 39.261623 m 14.010790 39.993986 l 14.075104 39.997733 l 14.087556 39.979478 l 14.078851 39.933419 14.073048 39.902712 14.100853 39.881556 c 14.116207 39.878654 14.116207 39.878654 14.180521 39.882402 c 14.673881 39.884576 l 14.738195 39.888323 14.738195 39.888323 14.753548 39.885422 c 14.756450 39.900775 14.762253 39.931481 14.770957 39.977541 c 14.758505 39.995796 l 14.822820 39.999543 l 14.836600 39.567597 l 14.772285 39.563849 l 14.759833 39.582104 l 14.768538 39.628164 14.758987 39.661772 14.743634 39.664673 c 14.731182 39.682928 14.731182 39.682928 14.666868 39.679181 c 14.427865 39.676643 l 14.424963 39.661290 l 14.425809 39.581622 14.496773 39.536408 14.588892 39.518999 c 14.592639 39.454685 l 14.227909 39.460006 l 14.224162 39.524320 l 14.337437 39.534716 14.379750 39.590326 14.378904 39.669994 c 14.381805 39.685347 l 14.173509 39.677007 l 14.127449 39.685711 14.109194 39.673259 14.090939 39.660808 c 14.072685 39.648356 14.085137 39.630101 14.076432 39.584041 c 14.088884 39.565787 l 14.074377 39.489020 14.108830 39.418903 14.164440 39.376591 c 14.192245 39.355434 14.250757 39.328475 14.327523 39.313968 c 14.315917 39.252555 l 14.015501 39.261623 l ef +n 13.996792 38.931226 m 14.015410 39.198034 l 14.079725 39.201781 l 14.089275 39.168173 l 14.077669 39.106761 14.077669 39.106761 14.172690 39.104705 c 14.666050 39.106879 l 14.715011 39.113528 l 14.761071 39.104823 14.763972 39.120177 14.760225 39.184491 c 14.763126 39.199844 l 14.827441 39.203592 l 14.822120 38.838861 l 14.757805 38.835114 l 14.760707 38.850467 l 14.763608 38.865820 14.769411 38.896527 14.769411 38.896527 c 14.756959 38.914782 14.744508 38.933036 14.713801 38.938839 c 14.664840 38.932190 l 13.996792 38.931226 l ef +n 14.465184 38.254351 m 14.385517 38.253505 14.370163 38.256406 14.329907 38.295817 c 14.307905 38.347680 14.285902 38.399543 14.287958 38.494564 c 14.286266 38.653899 14.349735 38.737314 14.414049 38.741061 c 14.463010 38.747710 14.503267 38.708299 14.509916 38.659338 c 14.513663 38.595024 14.477154 38.570120 14.428193 38.563471 c 14.412840 38.566373 14.397486 38.569274 14.385034 38.587529 c 14.366780 38.575077 14.345624 38.547272 14.352272 38.498311 c 14.340667 38.436898 14.365570 38.400389 14.429885 38.404136 c 14.494199 38.407883 l 14.497100 38.423237 14.500002 38.438590 14.502903 38.453943 c 14.523214 38.561416 14.547271 38.604574 14.558877 38.665987 c 14.588738 38.739852 14.643502 38.777207 14.723170 38.778053 c 14.802837 38.778899 14.837291 38.708782 14.847687 38.595506 c 14.845632 38.500485 14.818673 38.441974 14.761007 38.389265 c 14.807067 38.380561 14.847324 38.341150 14.835718 38.279737 c 14.839465 38.215422 14.797153 38.159812 14.748192 38.153163 c 14.732838 38.156065 14.732838 38.156065 14.735740 38.171418 c 14.738641 38.186771 14.738641 38.186771 14.726190 38.205026 c 14.741543 38.202125 14.741543 38.202125 14.744444 38.217478 c 14.747346 38.232831 14.734894 38.251086 14.670579 38.247338 c 14.465184 38.254351 l ef +1.000000 1.000000 1.000000 srgb +n 14.558513 38.411631 m 14.622828 38.415378 l 14.717849 38.413323 14.757260 38.453579 14.768866 38.514992 c 14.762217 38.563954 14.734412 38.585110 14.685451 38.578461 c 14.624038 38.590067 14.584627 38.549810 14.570119 38.473044 c ef +0.000000 0.000000 0.000000 srgb +n 14.723982 37.835732 m 14.720234 37.900046 14.723136 37.915400 14.689528 37.905849 c 14.658821 37.911652 14.653018 37.880946 14.656766 37.816631 c 14.653864 37.801278 l 14.654710 37.721610 14.633554 37.693805 14.627751 37.663099 c 14.582537 37.592135 14.524872 37.539427 14.463459 37.551033 c 14.399144 37.547285 14.386693 37.565540 14.349337 37.620304 c 14.315729 37.610754 14.312828 37.595401 14.325280 37.577146 c 14.325280 37.577146 14.322378 37.561793 14.322378 37.561793 c 14.353085 37.555990 14.383791 37.550187 14.377988 37.519480 c 14.384637 37.470519 14.345226 37.430262 14.299166 37.438967 c 14.250205 37.432318 14.225302 37.468827 14.218653 37.517789 c 14.230259 37.579202 14.254316 37.622360 14.327335 37.672167 c 14.299530 37.693323 14.280429 37.760539 14.289134 37.806599 c 14.287442 37.965934 14.369165 38.061801 14.467088 38.075099 c 14.546755 38.075945 14.602365 38.033632 14.618565 37.951063 c 14.635973 38.043183 14.690737 38.080538 14.739699 38.087187 c 14.804013 38.090934 14.826015 38.039071 14.845116 37.971855 c 14.859623 38.048622 14.886582 38.107133 14.932642 38.098429 c 15.012310 38.099275 15.059215 38.010903 15.070458 37.817959 c 15.066346 37.627917 14.994173 37.498443 14.883799 37.503400 c 14.819485 37.499652 14.748522 37.544866 14.726519 37.596729 c 14.719871 37.645690 14.713222 37.694651 14.709474 37.758966 c 14.723982 37.835732 l ef +1.000000 1.000000 1.000000 srgb +n 14.350547 37.794993 m 14.341842 37.748933 14.385001 37.724875 14.464668 37.725721 c 14.544336 37.726567 14.580846 37.751471 14.589550 37.797531 c 14.595353 37.828237 14.570449 37.864747 14.557998 37.883001 c 14.524390 37.873451 14.496585 37.894607 14.465878 37.900410 c 14.386210 37.899564 14.346799 37.859307 14.350547 37.794993 c ef +n 14.868810 37.760657 m 14.872557 37.696343 14.872557 37.696343 14.900362 37.675187 c 14.897461 37.659834 14.912814 37.656932 14.928167 37.654031 c 14.977128 37.660679 14.998285 37.688485 15.006143 37.814212 c 15.005297 37.893880 14.967942 37.948644 14.934334 37.939093 c 14.903627 37.944896 14.888274 37.947798 14.882471 37.917091 c ef +0.000000 0.000000 0.000000 srgb +n 14.307355 36.956397 m 14.300706 37.005358 l 14.321862 37.033163 l 14.299860 37.085026 14.293211 37.133987 14.286562 37.182948 c 14.294421 37.308676 14.373243 37.389189 14.471165 37.402487 c 14.501871 37.396684 14.547931 37.387980 14.572835 37.351470 c 14.597738 37.314961 14.625543 37.293805 14.641743 37.211235 c 14.657942 37.128666 l 14.661689 37.064352 14.689494 37.043196 14.723102 37.052746 c 14.769162 37.044042 14.774965 37.074748 14.786571 37.136161 c 14.785725 37.215829 14.738819 37.304201 14.621796 37.358119 c 14.630500 37.404179 l 14.835895 37.397166 l 14.818487 37.305047 l 14.825136 37.256086 14.847138 37.204223 14.850885 37.139908 c 14.840125 36.998828 14.761303 36.918314 14.650929 36.923271 c 14.601968 36.916622 14.561711 36.956033 14.533906 36.977189 c 14.506101 36.998346 14.493649 37.016600 14.477450 37.099169 c 14.451701 37.215347 l 14.426797 37.251856 14.429699 37.267209 14.398992 37.273012 c 14.365384 37.263462 14.344228 37.235657 14.347975 37.171342 c 14.348821 37.091675 14.389078 37.052264 14.460041 37.007050 c 14.466690 36.958089 l 14.307355 36.956397 l ef +1.000000 1.000000 1.000000 srgb +n 14.015501 39.261623 m 14.010790 39.993986 l 14.075104 39.997733 l 14.087556 39.979478 l 14.078851 39.933419 14.073048 39.902712 14.100853 39.881556 c 14.116207 39.878654 14.116207 39.878654 14.180521 39.882402 c 14.673881 39.884576 l 14.738195 39.888323 14.738195 39.888323 14.753548 39.885422 c 14.756450 39.900775 14.762253 39.931481 14.770957 39.977541 c 14.758505 39.995796 l 14.822820 39.999543 l 14.836600 39.567597 l 14.772285 39.563849 l 14.759833 39.582104 l 14.768538 39.628164 14.758987 39.661772 14.743634 39.664673 c 14.731182 39.682928 14.731182 39.682928 14.666868 39.679181 c 14.427865 39.676643 l 14.424963 39.661290 l 14.425809 39.581622 14.496773 39.536408 14.588892 39.518999 c 14.592639 39.454685 l 14.227909 39.460006 l 14.224162 39.524320 l 14.337437 39.534716 14.379750 39.590326 14.378904 39.669994 c 14.381805 39.685347 l 14.173509 39.677007 l 14.127449 39.685711 14.109194 39.673259 14.090939 39.660808 c 14.072685 39.648356 14.085137 39.630101 14.076432 39.584041 c 14.088884 39.565787 l 14.074377 39.489020 14.108830 39.418903 14.164440 39.376591 c 14.192245 39.355434 14.250757 39.328475 14.327523 39.313968 c 14.315917 39.252555 l 14.015501 39.261623 l s +n 13.996792 38.931226 m 14.015410 39.198034 l 14.079725 39.201781 l 14.089275 39.168173 l 14.077669 39.106761 14.077669 39.106761 14.172690 39.104705 c 14.666050 39.106879 l 14.715011 39.113528 l 14.761071 39.104823 14.763972 39.120177 14.760225 39.184491 c 14.763126 39.199844 l 14.827441 39.203592 l 14.822120 38.838861 l 14.757805 38.835114 l 14.760707 38.850467 l 14.763608 38.865820 14.769411 38.896527 14.769411 38.896527 c 14.756959 38.914782 14.744508 38.933036 14.713801 38.938839 c 14.664840 38.932190 l 13.996792 38.931226 l s +n 14.465184 38.254351 m 14.385517 38.253505 14.370163 38.256406 14.329907 38.295817 c 14.307905 38.347680 14.285902 38.399543 14.287958 38.494564 c 14.286266 38.653899 14.349735 38.737314 14.414049 38.741061 c 14.463010 38.747710 14.503267 38.708299 14.509916 38.659338 c 14.513663 38.595024 14.477154 38.570120 14.428193 38.563471 c 14.412840 38.566373 14.397486 38.569274 14.385034 38.587529 c 14.366780 38.575077 14.345624 38.547272 14.352272 38.498311 c 14.340667 38.436898 14.365570 38.400389 14.429885 38.404136 c 14.494199 38.407883 l 14.497100 38.423237 14.500002 38.438590 14.502903 38.453943 c 14.523214 38.561416 14.547271 38.604574 14.558877 38.665987 c 14.588738 38.739852 14.643502 38.777207 14.723170 38.778053 c 14.802837 38.778899 14.837291 38.708782 14.847687 38.595506 c 14.845632 38.500485 14.818673 38.441974 14.761007 38.389265 c 14.807067 38.380561 14.847324 38.341150 14.835718 38.279737 c 14.839465 38.215422 14.797153 38.159812 14.748192 38.153163 c 14.732838 38.156065 14.732838 38.156065 14.735740 38.171418 c 14.738641 38.186771 14.738641 38.186771 14.726190 38.205026 c 14.741543 38.202125 14.741543 38.202125 14.744444 38.217478 c 14.747346 38.232831 14.734894 38.251086 14.670579 38.247338 c 14.465184 38.254351 l s +n 14.558513 38.411631 m 14.622828 38.415378 l 14.717849 38.413323 14.757260 38.453579 14.768866 38.514992 c 14.762217 38.563954 14.734412 38.585110 14.685451 38.578461 c 14.624038 38.590067 14.584627 38.549810 14.570119 38.473044 c 14.558513 38.411631 l s +n 14.723982 37.835732 m 14.720234 37.900046 14.723136 37.915400 14.689528 37.905849 c 14.658821 37.911652 14.653018 37.880946 14.656766 37.816631 c 14.653864 37.801278 l 14.654710 37.721610 14.633554 37.693805 14.627751 37.663099 c 14.582537 37.592135 14.524872 37.539427 14.463459 37.551033 c 14.399144 37.547285 14.386693 37.565540 14.349337 37.620304 c 14.315729 37.610754 14.312828 37.595401 14.325280 37.577146 c 14.325280 37.577146 14.322378 37.561793 14.322378 37.561793 c 14.353085 37.555990 14.383791 37.550187 14.377988 37.519480 c 14.384637 37.470519 14.345226 37.430262 14.299166 37.438967 c 14.250205 37.432318 14.225302 37.468827 14.218653 37.517789 c 14.230259 37.579202 14.254316 37.622360 14.327335 37.672167 c 14.299530 37.693323 14.280429 37.760539 14.289134 37.806599 c 14.287442 37.965934 14.369165 38.061801 14.467088 38.075099 c 14.546755 38.075945 14.602365 38.033632 14.618565 37.951063 c 14.635973 38.043183 14.690737 38.080538 14.739699 38.087187 c 14.804013 38.090934 14.826015 38.039071 14.845116 37.971855 c 14.859623 38.048622 14.886582 38.107133 14.932642 38.098429 c 15.012310 38.099275 15.059215 38.010903 15.070458 37.817959 c 15.066346 37.627917 14.994173 37.498443 14.883799 37.503400 c 14.819485 37.499652 14.748522 37.544866 14.726519 37.596729 c 14.719871 37.645690 14.713222 37.694651 14.709474 37.758966 c 14.723982 37.835732 l s +n 14.350547 37.794993 m 14.341842 37.748933 14.385001 37.724875 14.464668 37.725721 c 14.544336 37.726567 14.580846 37.751471 14.589550 37.797531 c 14.595353 37.828237 14.570449 37.864747 14.557998 37.883001 c 14.524390 37.873451 14.496585 37.894607 14.465878 37.900410 c 14.386210 37.899564 14.346799 37.859307 14.350547 37.794993 c 14.350547 37.794993 l s +n 14.868810 37.760657 m 14.872557 37.696343 14.872557 37.696343 14.900362 37.675187 c 14.897461 37.659834 14.912814 37.656932 14.928167 37.654031 c 14.977128 37.660679 14.998285 37.688485 15.006143 37.814212 c 15.005297 37.893880 14.967942 37.948644 14.934334 37.939093 c 14.903627 37.944896 14.888274 37.947798 14.882471 37.917091 c 14.868810 37.760657 l s +n 14.307355 36.956397 m 14.300706 37.005358 l 14.321862 37.033163 l 14.299860 37.085026 14.293211 37.133987 14.286562 37.182948 c 14.294421 37.308676 14.373243 37.389189 14.471165 37.402487 c 14.501871 37.396684 14.547931 37.387980 14.572835 37.351470 c 14.597738 37.314961 14.625543 37.293805 14.641743 37.211235 c 14.657942 37.128666 l 14.661689 37.064352 14.689494 37.043196 14.723102 37.052746 c 14.769162 37.044042 14.774965 37.074748 14.786571 37.136161 c 14.785725 37.215829 14.738819 37.304201 14.621796 37.358119 c 14.630500 37.404179 l 14.835895 37.397166 l 14.818487 37.305047 l 14.825136 37.256086 14.847138 37.204223 14.850885 37.139908 c 14.840125 36.998828 14.761303 36.918314 14.650929 36.923271 c 14.601968 36.916622 14.561711 36.956033 14.533906 36.977189 c 14.506101 36.998346 14.493649 37.016600 14.477450 37.099169 c 14.451701 37.215347 l 14.426797 37.251856 14.429699 37.267209 14.398992 37.273012 c 14.365384 37.263462 14.344228 37.235657 14.347975 37.171342 c 14.348821 37.091675 14.389078 37.052264 14.460041 37.007050 c 14.466690 36.958089 l 14.307355 36.956397 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.000000 0.000000 0.000000 srgb +n 19.000000 40.000000 m 19.000000 41.000000 l 15.000000 41.000000 l 15.000000 35.000000 l 19.000000 35.000000 l 19.000000 35.513197 l s +[] 0 sd +0 slj +0 slc +n 19.000000 35.888197 m 18.750000 35.388197 l 19.000000 35.513197 l 19.250000 35.388197 l ef +n 19.000000 35.888197 m 18.750000 35.388197 l 19.000000 35.513197 l 19.250000 35.388197 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 19.000000 35.000000 m 35.000000 35.000000 l 35.000000 35.513197 l s +[] 0 sd +0 slj +0 slc +n 35.000000 35.888197 m 34.750000 35.388197 l 35.000000 35.513197 l 35.250000 35.388197 l ef +n 35.000000 35.888197 m 34.750000 35.388197 l 35.000000 35.513197 l 35.250000 35.388197 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 32.000000 18.000000 m 32.000000 20.065983 l s +[] 0 sd +0 slj +0 slc +n 32.000000 20.440983 m 31.750000 19.940983 l 32.000000 20.065983 l 32.250000 19.940983 l ef +n 32.000000 20.440983 m 31.750000 19.940983 l 32.000000 20.065983 l 32.250000 19.940983 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 32.000000 25.000000 m 32.000000 27.065983 l s +[] 0 sd +0 slj +0 slc +n 32.000000 27.440983 m 31.750000 26.940983 l 32.000000 27.065983 l 32.250000 26.940983 l ef +n 32.000000 27.440983 m 31.750000 26.940983 l 32.000000 27.065983 l 32.250000 26.940983 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 32.000000 32.000000 m 32.000000 34.000000 l 24.000000 34.000000 l 24.000000 35.177786 l s +[] 0 sd +0 slj +0 slc +n 24.000000 35.552786 m 23.750000 35.052786 l 24.000000 35.177786 l 24.250000 35.052786 l ef +n 24.000000 35.552786 m 23.750000 35.052786 l 24.000000 35.177786 l 24.250000 35.052786 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 32.000000 34.000000 m 32.000000 34.000000 l 39.750000 34.000000 l 39.750000 35.177786 l s +[] 0 sd +0 slj +0 slc +n 39.750000 35.552786 m 39.500000 35.052786 l 39.750000 35.177786 l 40.000000 35.052786 l ef +n 39.750000 35.552786 m 39.500000 35.052786 l 39.750000 35.177786 l 40.000000 35.052786 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 24.000000 40.000000 m 24.000000 42.000000 l 32.000000 42.000000 l 32.000000 43.177786 l s +[] 0 sd +0 slj +0 slc +n 32.000000 43.552786 m 31.750000 43.052786 l 32.000000 43.177786 l 32.250000 43.052786 l ef +n 32.000000 43.552786 m 31.750000 43.052786 l 32.000000 43.177786 l 32.250000 43.052786 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 40.000000 40.000000 m 40.000000 42.000000 l 32.000000 42.000000 l 32.000000 42.000000 l s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 25.000000 46.000000 m 12.934017 46.000000 l s +[] 0 sd +0 slj +0 slc +n 12.559017 46.000000 m 13.059017 45.750000 l 12.934017 46.000000 l 13.059017 46.250000 l ef +n 12.559017 46.000000 m 13.059017 45.750000 l 12.934017 46.000000 l 13.059017 46.250000 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 12.000000 30.000000 m 24.065983 30.000000 l s +[] 0 sd +0 slj +0 slc +n 24.440983 30.000000 m 23.940983 30.250000 l 24.065983 30.000000 l 23.940983 29.750000 l ef +n 24.440983 30.000000 m 23.940983 30.250000 l 24.065983 30.000000 l 23.940983 29.750000 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 53.000000 16.000000 m 39.934017 16.000000 l s +[] 0 sd +0 slj +0 slc +n 39.559017 16.000000 m 40.059017 15.750000 l 39.934017 16.000000 l 40.059017 16.250000 l ef +n 39.559017 16.000000 m 40.059017 15.750000 l 39.934017 16.000000 l 40.059017 16.250000 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 52.065983 38.000000 m 47.434017 38.000000 l s +[] 0 sd +0 slj +0 slc +n 52.440983 38.000000 m 51.940983 38.250000 l 52.065983 38.000000 l 51.940983 37.750000 l ef +n 52.440983 38.000000 m 51.940983 38.250000 l 52.065983 38.000000 l 51.940983 37.750000 l cp s +[] 0 sd +0 slj +0 slc +n 47.059017 38.000000 m 47.559017 37.750000 l 47.434017 38.000000 l 47.559017 38.250000 l ef +n 47.059017 38.000000 m 47.559017 37.750000 l 47.434017 38.000000 l 47.559017 38.250000 l cp s +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 33.000000 36.000000 m 33.000000 40.000000 l 46.500000 40.000000 l 46.500000 36.000000 l f +0.117647 0.564706 1.000000 srgb +n 33.000000 36.000000 m 33.000000 40.000000 l 46.500000 40.000000 l 46.500000 36.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 34.341250 38.468750 translate 0.035278 -0.035278 scale +start_ol +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +512 6976 lineto +512 7488 lineto +2737 7488 lineto +5313 2148 lineto +7906 7488 lineto +9984 7488 lineto +9984 6976 lineto +8960 6976 lineto +8960 512 lineto +9920 512 lineto +9920 0 lineto +6976 0 lineto +6976 512 lineto +7936 512 lineto +7936 6340 lineto +5401 1083 lineto +4711 1083 lineto +2176 6340 lineto +2176 512 lineto +3136 512 lineto +3136 0 lineto +576 0 lineto +end_ol grestore +gsave 35.727452 38.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 36.529197 38.468750 translate 0.035278 -0.035278 scale +start_ol +5362 4239 moveto +5631 4834 6049 5137 conicto +6468 5440 7025 5440 conicto +7872 5440 8288 4919 conicto +8704 4398 8704 3345 conicto +8704 512 lineto +9536 512 lineto +9536 0 lineto +6976 0 lineto +6976 512 lineto +7808 512 lineto +7808 3240 lineto +7808 4050 7560 4393 conicto +7313 4736 6740 4736 conicto +6106 4736 5773 4274 conicto +5440 3812 5440 2927 conicto +5440 512 lineto +6272 512 lineto +6272 0 lineto +3712 0 lineto +3712 512 lineto +4544 512 lineto +4544 3275 lineto +4544 4065 4296 4400 conicto +4049 4736 3476 4736 conicto +2842 4736 2509 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4329 lineto +2435 4869 2836 5154 conicto +3238 5440 3746 5440 conicto +4376 5440 4798 5127 conicto +5220 4814 5362 4239 conicto +end_ol grestore +gsave 37.812997 38.468750 translate 0.035278 -0.035278 scale +start_ol +3072 384 moveto +3801 384 4172 960 conicto +4544 1536 4544 2658 conicto +4544 3781 4172 4354 conicto +3801 4928 3072 4928 conicto +2343 4928 1971 4354 conicto +1600 3781 1600 2658 conicto +1600 1536 1974 960 conicto +2348 384 3072 384 conicto +3072 -128 moveto +1917 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3920 1212 4680 conicto +1912 5440 3072 5440 conicto +4232 5440 4932 4680 conicto +5632 3920 5632 2658 conicto +5632 1397 4932 634 conicto +4232 -128 3072 -128 conicto +end_ol grestore +gsave 38.627235 38.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 39.274125 38.468750 translate 0.035278 -0.035278 scale +start_ol +2234 -1021 moveto +2582 -126 lineto +618 4800 lineto +0 4800 lineto +0 5312 lineto +2438 5312 lineto +2438 4800 lineto +1593 4800 lineto +3080 1130 lineto +4567 4800 lineto +3776 4800 lineto +3776 5312 lineto +5760 5312 lineto +5760 4800 lineto +5168 4800 lineto +2747 -1248 lineto +2500 -1857 2199 -2080 conicto +1898 -2304 1351 -2304 conicto +1119 -2304 875 -2271 conicto +631 -2238 384 -2176 conicto +384 -1152 lineto +832 -1152 lineto +862 -1495 1003 -1643 conicto +1145 -1792 1444 -1792 conicto +1717 -1792 1883 -1638 conicto +2050 -1485 2234 -1021 conicto +end_ol grestore +gsave 40.038407 38.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 40.468000 38.468750 translate 0.035278 -0.035278 scale +start_ol +2048 2688 moveto +4786 2688 lineto +3417 6268 lineto +2048 2688 lineto +-64 0 moveto +-64 512 lineto +594 512 lineto +3252 7488 lineto +4091 7488 lineto +6754 512 lineto +7488 512 lineto +7488 0 lineto +4776 0 lineto +4776 512 lineto +5605 512 lineto +4980 2176 lineto +1843 2176 lineto +1219 512 lineto +2038 512 lineto +2038 0 lineto +-64 0 lineto +end_ol grestore +gsave 41.444585 38.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 42.201376 38.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 42.958167 38.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 43.759912 38.468750 translate 0.035278 -0.035278 scale +start_ol +576 320 moveto +576 1536 lineto +1088 1536 lineto +1108 958 1469 671 conicto +1831 384 2538 384 conicto +3174 384 3507 611 conicto +3840 839 3840 1274 conicto +3840 1616 3599 1826 conicto +3358 2036 2582 2276 conicto +1908 2498 lineto +1206 2717 891 3046 conicto +576 3376 576 3884 conicto +576 4612 1117 5026 conicto +1658 5440 2614 5440 conicto +3039 5440 3509 5325 conicto +3979 5211 4480 4992 conicto +4480 3840 lineto +3968 3840 lineto +3948 4352 3603 4640 conicto +3258 4928 2664 4928 conicto +2076 4928 1774 4725 conicto +1472 4522 1472 4115 conicto +1472 3783 1700 3582 conicto +1928 3382 2613 3174 conicto +3353 2952 lineto +4088 2720 4412 2371 conicto +4736 2023 4736 1474 conicto +4736 727 4158 299 conicto +3580 -128 2563 -128 conicto +2048 -128 1557 -16 conicto +1067 96 576 320 conicto +end_ol grestore +gsave 44.454262 38.468750 translate 0.035278 -0.035278 scale +start_ol +576 320 moveto +576 1536 lineto +1088 1536 lineto +1108 958 1469 671 conicto +1831 384 2538 384 conicto +3174 384 3507 611 conicto +3840 839 3840 1274 conicto +3840 1616 3599 1826 conicto +3358 2036 2582 2276 conicto +1908 2498 lineto +1206 2717 891 3046 conicto +576 3376 576 3884 conicto +576 4612 1117 5026 conicto +1658 5440 2614 5440 conicto +3039 5440 3509 5325 conicto +3979 5211 4480 4992 conicto +4480 3840 lineto +3968 3840 lineto +3948 4352 3603 4640 conicto +3258 4928 2664 4928 conicto +2076 4928 1774 4725 conicto +1472 4522 1472 4115 conicto +1472 3783 1700 3582 conicto +1928 3382 2613 3174 conicto +3353 2952 lineto +4088 2720 4412 2371 conicto +4736 2023 4736 1474 conicto +4736 727 4158 299 conicto +3580 -128 2563 -128 conicto +2048 -128 1557 -16 conicto +1067 96 576 320 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 17.000000 36.000000 m 17.000000 40.000000 l 31.000000 40.000000 l 31.000000 36.000000 l f +0.000000 0.000000 0.600000 srgb +n 17.000000 36.000000 m 17.000000 40.000000 l 31.000000 40.000000 l 31.000000 36.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 18.250000 38.468750 translate 0.035278 -0.035278 scale +start_ol +2048 2688 moveto +4786 2688 lineto +3417 6268 lineto +2048 2688 lineto +-64 0 moveto +-64 512 lineto +594 512 lineto +3252 7488 lineto +4091 7488 lineto +6754 512 lineto +7488 512 lineto +7488 0 lineto +4776 0 lineto +4776 512 lineto +5605 512 lineto +4980 2176 lineto +1843 2176 lineto +1219 512 lineto +2038 512 lineto +2038 0 lineto +-64 0 lineto +end_ol grestore +gsave 19.226585 38.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 19.873475 38.468750 translate 0.035278 -0.035278 scale +start_ol +960 6973 moveto +960 7207 1130 7379 conicto +1300 7552 1539 7552 conicto +1772 7552 1942 7379 conicto +2112 7207 2112 6973 conicto +2112 6735 1944 6567 conicto +1777 6400 1539 6400 conicto +1300 6400 1130 6567 conicto +960 6735 960 6973 conicto +2176 512 moveto +3072 512 lineto +3072 0 lineto +384 0 lineto +384 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 512 lineto +end_ol grestore +gsave 20.305564 38.468750 translate 0.035278 -0.035278 scale +start_ol +1088 4800 moveto +256 4800 lineto +256 5312 lineto +1088 5312 lineto +1088 6976 lineto +1984 6976 lineto +1984 5312 lineto +3753 5312 lineto +3753 4800 lineto +1984 4800 lineto +1984 1435 lineto +1984 763 2117 573 conicto +2251 384 2610 384 conicto +2979 384 3148 595 conicto +3318 807 3328 1280 conicto +4032 1280 lineto +3992 548 3635 210 conicto +3278 -128 2550 -128 conicto +1751 -128 1419 227 conicto +1088 583 1088 1435 conicto +1088 4800 lineto +end_ol grestore +gsave 20.850052 38.468750 translate 0.035278 -0.035278 scale +start_ol +448 0 moveto +448 512 lineto +1280 512 lineto +1280 7296 lineto +384 7296 lineto +384 7808 lineto +2176 7808 lineto +2176 4329 lineto +2432 4879 2840 5159 conicto +3249 5440 3790 5440 conicto +4672 5440 5088 4931 conicto +5504 4423 5504 3345 conicto +5504 512 lineto +6336 512 lineto +6336 0 lineto +3840 0 lineto +3840 512 lineto +4608 512 lineto +4608 3056 lineto +4608 4025 4367 4380 conicto +4126 4736 3506 4736 conicto +2856 4736 2516 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +end_ol grestore +gsave 21.721730 38.468750 translate 0.035278 -0.035278 scale +start_ol +5362 4239 moveto +5631 4834 6049 5137 conicto +6468 5440 7025 5440 conicto +7872 5440 8288 4919 conicto +8704 4398 8704 3345 conicto +8704 512 lineto +9536 512 lineto +9536 0 lineto +6976 0 lineto +6976 512 lineto +7808 512 lineto +7808 3240 lineto +7808 4050 7560 4393 conicto +7313 4736 6740 4736 conicto +6106 4736 5773 4274 conicto +5440 3812 5440 2927 conicto +5440 512 lineto +6272 512 lineto +6272 0 lineto +3712 0 lineto +3712 512 lineto +4544 512 lineto +4544 3275 lineto +4544 4065 4296 4400 conicto +4049 4736 3476 4736 conicto +2842 4736 2509 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4329 lineto +2435 4869 2836 5154 conicto +3238 5440 3746 5440 conicto +4376 5440 4798 5127 conicto +5220 4814 5362 4239 conicto +end_ol grestore +gsave 23.005530 38.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 23.807275 38.468750 translate 0.035278 -0.035278 scale +start_ol +1088 4800 moveto +256 4800 lineto +256 5312 lineto +1088 5312 lineto +1088 6976 lineto +1984 6976 lineto +1984 5312 lineto +3753 5312 lineto +3753 4800 lineto +1984 4800 lineto +1984 1435 lineto +1984 763 2117 573 conicto +2251 384 2610 384 conicto +2979 384 3148 595 conicto +3318 807 3328 1280 conicto +4032 1280 lineto +3992 548 3635 210 conicto +3278 -128 2550 -128 conicto +1751 -128 1419 227 conicto +1088 583 1088 1435 conicto +1088 4800 lineto +end_ol grestore +gsave 24.351763 38.468750 translate 0.035278 -0.035278 scale +start_ol +960 6973 moveto +960 7207 1130 7379 conicto +1300 7552 1539 7552 conicto +1772 7552 1942 7379 conicto +2112 7207 2112 6973 conicto +2112 6735 1944 6567 conicto +1777 6400 1539 6400 conicto +1300 6400 1130 6567 conicto +960 6735 960 6973 conicto +2176 512 moveto +3072 512 lineto +3072 0 lineto +384 0 lineto +384 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 512 lineto +end_ol grestore +gsave 24.783852 38.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 25.540643 38.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 25.970236 38.468750 translate 0.035278 -0.035278 scale +start_ol +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +3520 7488 lineto +3520 6976 lineto +2560 6976 lineto +2560 640 lineto +5952 640 lineto +5952 1920 lineto +6592 1920 lineto +6592 0 lineto +576 0 lineto +end_ol grestore +gsave 26.869389 38.468750 translate 0.035278 -0.035278 scale +start_ol +3072 384 moveto +3801 384 4172 960 conicto +4544 1536 4544 2658 conicto +4544 3781 4172 4354 conicto +3801 4928 3072 4928 conicto +2343 4928 1971 4354 conicto +1600 3781 1600 2658 conicto +1600 1536 1974 960 conicto +2348 384 3072 384 conicto +3072 -128 moveto +1917 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3920 1212 4680 conicto +1912 5440 3072 5440 conicto +4232 5440 4932 4680 conicto +5632 3920 5632 2658 conicto +5632 1397 4932 634 conicto +4232 -128 3072 -128 conicto +end_ol grestore +gsave 27.683628 38.468750 translate 0.035278 -0.035278 scale +start_ol +5376 4800 moveto +5376 132 lineto +5376 -1035 4745 -1669 conicto +4115 -2304 2950 -2304 conicto +2425 -2304 1944 -2208 conicto +1464 -2112 1024 -1920 conicto +1024 -832 lineto +1536 -832 lineto +1626 -1331 1960 -1561 conicto +2294 -1792 2918 -1792 conicto +3727 -1792 4103 -1327 conicto +4480 -863 4480 132 conicto +4480 848 lineto +4208 347 3788 109 conicto +3369 -128 2750 -128 conicto +1764 -128 1138 644 conicto +512 1417 512 2658 conicto +512 3900 1135 4670 conicto +1759 5440 2750 5440 conicto +3369 5440 3788 5212 conicto +4208 4984 4480 4505 conicto +4480 5312 lineto +6272 5312 lineto +6272 4800 lineto +5376 4800 lineto +4480 2939 moveto +4480 3875 4111 4369 conicto +3742 4864 3040 4864 conicto +2328 4864 1964 4309 conicto +1600 3754 1600 2658 conicto +1600 1568 1964 1008 conicto +2328 448 3040 448 conicto +3742 448 4111 951 conicto +4480 1454 4480 2414 conicto +4480 2939 lineto +end_ol grestore +gsave 28.550312 38.468750 translate 0.035278 -0.035278 scale +start_ol +960 6973 moveto +960 7207 1130 7379 conicto +1300 7552 1539 7552 conicto +1772 7552 1942 7379 conicto +2112 7207 2112 6973 conicto +2112 6735 1944 6567 conicto +1777 6400 1539 6400 conicto +1300 6400 1130 6567 conicto +960 6735 960 6973 conicto +2176 512 moveto +3072 512 lineto +3072 0 lineto +384 0 lineto +384 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 512 lineto +end_ol grestore +gsave 28.982401 38.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 25.000000 44.000000 m 25.000000 48.000000 l 39.000000 48.000000 l 39.000000 44.000000 l f +1.000000 0.329412 0.329412 srgb +n 25.000000 44.000000 m 25.000000 48.000000 l 39.000000 48.000000 l 39.000000 44.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 28.197500 46.468750 translate 0.035278 -0.035278 scale +start_ol +7809 0 moveto +6990 0 lineto +5282 6110 lineto +3575 0 lineto +2756 0 lineto +803 6976 lineto +64 6976 lineto +64 7488 lineto +2786 7488 lineto +2786 6976 lineto +1857 6976 lineto +3410 1424 lineto +5108 7488 lineto +5917 7488 lineto +7645 1359 lineto +9208 6976 lineto +8349 6976 lineto +8349 7488 lineto +10496 7488 lineto +10496 6976 lineto +9762 6976 lineto +7809 0 lineto +end_ol grestore +gsave 29.528751 46.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 30.175641 46.468750 translate 0.035278 -0.035278 scale +start_ol +960 6973 moveto +960 7207 1130 7379 conicto +1300 7552 1539 7552 conicto +1772 7552 1942 7379 conicto +2112 7207 2112 6973 conicto +2112 6735 1944 6567 conicto +1777 6400 1539 6400 conicto +1300 6400 1130 6567 conicto +960 6735 960 6973 conicto +2176 512 moveto +3072 512 lineto +3072 0 lineto +384 0 lineto +384 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 512 lineto +end_ol grestore +gsave 30.607730 46.468750 translate 0.035278 -0.035278 scale +start_ol +1088 4800 moveto +256 4800 lineto +256 5312 lineto +1088 5312 lineto +1088 6976 lineto +1984 6976 lineto +1984 5312 lineto +3753 5312 lineto +3753 4800 lineto +1984 4800 lineto +1984 1435 lineto +1984 763 2117 573 conicto +2251 384 2610 384 conicto +2979 384 3148 595 conicto +3318 807 3328 1280 conicto +4032 1280 lineto +3992 548 3635 210 conicto +3278 -128 2550 -128 conicto +1751 -128 1419 227 conicto +1088 583 1088 1435 conicto +1088 4800 lineto +end_ol grestore +gsave 31.152218 46.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 31.953963 46.468750 translate 0.035278 -0.035278 scale +start_ol +448 3136 moveto +3008 3136 lineto +3008 2368 lineto +448 2368 lineto +448 3136 lineto +end_ol grestore +gsave 32.411031 46.468750 translate 0.035278 -0.035278 scale +start_ol +2560 512 moveto +4040 512 lineto +4935 512 5347 903 conicto +5760 1295 5760 2149 conicto +5760 2998 5350 3387 conicto +4940 3776 4040 3776 conicto +2560 3776 lineto +2560 512 lineto +2560 4288 moveto +3817 4288 lineto +4629 4288 5002 4611 conicto +5376 4934 5376 5632 conicto +5376 6335 5002 6655 conicto +4629 6976 3817 6976 conicto +2560 6976 lineto +2560 4288 lineto +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +4262 7488 lineto +5388 7488 5958 7020 conicto +6528 6553 6528 5623 conicto +6528 4951 6131 4551 conicto +5734 4152 4970 4061 conicto +5923 3941 6417 3455 conicto +6912 2970 6912 2153 conicto +6912 1046 6212 523 conicto +5513 0 4030 0 conicto +576 0 lineto +end_ol grestore +gsave 33.405095 46.468750 translate 0.035278 -0.035278 scale +start_ol +4096 1672 moveto +4096 2816 lineto +2902 2816 lineto +2211 2816 1873 2517 conicto +1536 2219 1536 1603 conicto +1536 1041 1878 712 conicto +2221 384 2806 384 conicto +3385 384 3740 741 conicto +4096 1098 4096 1672 conicto +4992 3318 moveto +4992 512 lineto +5824 512 lineto +5824 0 lineto +4096 0 lineto +4096 558 lineto +3789 205 3387 38 conicto +2985 -128 2447 -128 conicto +1558 -128 1035 339 conicto +512 807 512 1602 conicto +512 2423 1109 2875 conicto +1707 3328 2796 3328 conicto +4096 3328 lineto +4096 3690 lineto +4096 4280 3718 4604 conicto +3341 4928 2658 4928 conicto +2094 4928 1760 4685 conicto +1426 4443 1344 3968 conicto +896 3968 lineto +896 5056 lineto +1378 5248 1833 5344 conicto +2288 5440 2720 5440 conicto +3831 5440 4411 4897 conicto +4992 4354 4992 3318 conicto +end_ol grestore +gsave 34.211835 46.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 34.968626 46.468750 translate 0.035278 -0.035278 scale +start_ol +2880 0 moveto +312 0 lineto +312 512 lineto +1152 512 lineto +1152 7296 lineto +256 7296 lineto +256 7808 lineto +2048 7808 lineto +2048 2717 lineto +4290 4800 lineto +3525 4800 lineto +3525 5312 lineto +5930 5312 lineto +5930 4800 lineto +5020 4800 lineto +3440 3327 lineto +5460 512 lineto +6225 512 lineto +6225 0 lineto +3605 0 lineto +3605 512 lineto +4365 512 lineto +2775 2717 lineto +2048 2036 lineto +2048 512 lineto +2880 512 lineto +2880 0 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 25.000000 28.000000 m 25.000000 32.000000 l 39.000000 32.000000 l 39.000000 28.000000 l f +1.000000 0.749020 0.000000 srgb +n 25.000000 28.000000 m 25.000000 32.000000 l 39.000000 32.000000 l 39.000000 28.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 26.701250 30.468750 translate 0.035278 -0.035278 scale +start_ol +4921 3745 moveto +5275 3649 5530 3420 conicto +5785 3191 5987 2778 conicto +7076 512 lineto +7986 512 lineto +7986 0 lineto +6223 0 lineto +5048 2400 lineto +4709 3106 4425 3313 conicto +4141 3520 3645 3520 conicto +2560 3520 lineto +2560 512 lineto +3584 512 lineto +3584 0 lineto +576 0 lineto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +4359 7488 lineto +5460 7488 6058 6970 conicto +6656 6453 6656 5502 conicto +6656 4735 6219 4295 conicto +5783 3855 4921 3745 conicto +2560 4032 moveto +4010 4032 lineto +4775 4032 5139 4392 conicto +5504 4752 5504 5507 conicto +5504 6261 5139 6618 conicto +4775 6976 4010 6976 conicto +2560 6976 lineto +2560 4032 lineto +end_ol grestore +gsave 27.720293 30.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 28.522038 30.468750 translate 0.035278 -0.035278 scale +start_ol +4096 1672 moveto +4096 2816 lineto +2902 2816 lineto +2211 2816 1873 2517 conicto +1536 2219 1536 1603 conicto +1536 1041 1878 712 conicto +2221 384 2806 384 conicto +3385 384 3740 741 conicto +4096 1098 4096 1672 conicto +4992 3318 moveto +4992 512 lineto +5824 512 lineto +5824 0 lineto +4096 0 lineto +4096 558 lineto +3789 205 3387 38 conicto +2985 -128 2447 -128 conicto +1558 -128 1035 339 conicto +512 807 512 1602 conicto +512 2423 1109 2875 conicto +1707 3328 2796 3328 conicto +4096 3328 lineto +4096 3690 lineto +4096 4280 3718 4604 conicto +3341 4928 2658 4928 conicto +2094 4928 1760 4685 conicto +1426 4443 1344 3968 conicto +896 3968 lineto +896 5056 lineto +1378 5248 1833 5344 conicto +2288 5440 2720 5440 conicto +3831 5440 4411 4897 conicto +4992 4354 4992 3318 conicto +end_ol grestore +gsave 29.328777 30.468750 translate 0.035278 -0.035278 scale +start_ol +5376 512 moveto +6272 512 lineto +6272 0 lineto +4480 0 lineto +4480 812 lineto +4208 330 3788 101 conicto +3369 -128 2750 -128 conicto +1764 -128 1138 644 conicto +512 1417 512 2658 conicto +512 3900 1135 4670 conicto +1759 5440 2750 5440 conicto +3369 5440 3788 5202 conicto +4208 4965 4480 4464 conicto +4480 7296 lineto +3584 7296 lineto +3584 7808 lineto +5376 7808 lineto +5376 512 lineto +4480 2376 moveto +4480 2900 lineto +4480 3855 4111 4359 conicto +3742 4864 3040 4864 conicto +2328 4864 1964 4309 conicto +1600 3754 1600 2658 conicto +1600 1568 1964 1008 conicto +2328 448 3040 448 conicto +3742 448 4111 941 conicto +4480 1434 4480 2376 conicto +end_ol grestore +gsave 30.195462 30.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 30.625054 30.468750 translate 0.035278 -0.035278 scale +start_ol +4194 384 moveto +5413 384 6034 1232 conicto +6656 2080 6656 3741 conicto +6656 5408 6034 6256 conicto +5413 7104 4194 7104 conicto +2971 7104 2349 6256 conicto +1728 5408 1728 3741 conicto +1728 2080 2349 1232 conicto +2971 384 4194 384 conicto +4192 -128 moveto +3434 -128 2798 122 conicto +2162 372 1678 857 conicto +1120 1417 848 2127 conicto +576 2837 576 3742 conicto +576 4646 848 5358 conicto +1120 6071 1678 6631 conicto +2167 7121 2795 7368 conicto +3424 7616 4192 7616 conicto +5813 7616 6810 6551 conicto +7808 5486 7808 3742 conicto +7808 2847 7533 2129 conicto +7259 1412 6701 857 conicto +6212 367 5583 119 conicto +4955 -128 4192 -128 conicto +end_ol grestore +gsave 31.734014 30.468750 translate 0.035278 -0.035278 scale +start_ol +2048 2939 moveto +2048 2414 lineto +2048 1454 2417 951 conicto +2787 448 3491 448 conicto +4199 448 4563 1008 conicto +4928 1568 4928 2658 conicto +4928 3754 4563 4309 conicto +4199 4864 3491 4864 conicto +2787 4864 2417 4369 conicto +2048 3875 2048 2939 conicto +1152 4800 moveto +256 4800 lineto +256 5312 lineto +2048 5312 lineto +2048 4505 lineto +2320 4984 2740 5212 conicto +3161 5440 3780 5440 conicto +4767 5440 5391 4670 conicto +6016 3900 6016 2658 conicto +6016 1417 5391 644 conicto +4767 -128 3780 -128 conicto +3161 -128 2740 109 conicto +2320 347 2048 848 conicto +2048 -1600 lineto +2944 -1600 lineto +2944 -2112 lineto +256 -2112 lineto +256 -1600 lineto +1152 -1600 lineto +1152 4800 lineto +end_ol grestore +gsave 32.600698 30.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 33.402443 30.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 34.049333 30.468750 translate 0.035278 -0.035278 scale +start_ol +4096 1672 moveto +4096 2816 lineto +2902 2816 lineto +2211 2816 1873 2517 conicto +1536 2219 1536 1603 conicto +1536 1041 1878 712 conicto +2221 384 2806 384 conicto +3385 384 3740 741 conicto +4096 1098 4096 1672 conicto +4992 3318 moveto +4992 512 lineto +5824 512 lineto +5824 0 lineto +4096 0 lineto +4096 558 lineto +3789 205 3387 38 conicto +2985 -128 2447 -128 conicto +1558 -128 1035 339 conicto +512 807 512 1602 conicto +512 2423 1109 2875 conicto +1707 3328 2796 3328 conicto +4096 3328 lineto +4096 3690 lineto +4096 4280 3718 4604 conicto +3341 4928 2658 4928 conicto +2094 4928 1760 4685 conicto +1426 4443 1344 3968 conicto +896 3968 lineto +896 5056 lineto +1378 5248 1833 5344 conicto +2288 5440 2720 5440 conicto +3831 5440 4411 4897 conicto +4992 4354 4992 3318 conicto +end_ol grestore +gsave 34.856072 30.468750 translate 0.035278 -0.035278 scale +start_ol +448 0 moveto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4386 lineto +2432 4908 2840 5174 conicto +3249 5440 3790 5440 conicto +4672 5440 5088 4941 conicto +5504 4443 5504 3387 conicto +5504 512 lineto +6336 512 lineto +6336 0 lineto +3840 0 lineto +3840 512 lineto +4608 512 lineto +4608 3095 lineto +4608 4073 4364 4436 conicto +4121 4800 3506 4800 conicto +2856 4800 2516 4331 conicto +2176 3862 2176 2964 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +end_ol grestore +gsave 35.727750 30.468750 translate 0.035278 -0.035278 scale +start_ol +5376 512 moveto +6272 512 lineto +6272 0 lineto +4480 0 lineto +4480 812 lineto +4208 330 3788 101 conicto +3369 -128 2750 -128 conicto +1764 -128 1138 644 conicto +512 1417 512 2658 conicto +512 3900 1135 4670 conicto +1759 5440 2750 5440 conicto +3369 5440 3788 5202 conicto +4208 4965 4480 4464 conicto +4480 7296 lineto +3584 7296 lineto +3584 7808 lineto +5376 7808 lineto +5376 512 lineto +4480 2376 moveto +4480 2900 lineto +4480 3855 4111 4359 conicto +3742 4864 3040 4864 conicto +2328 4864 1964 4309 conicto +1600 3754 1600 2658 conicto +1600 1568 1964 1008 conicto +2328 448 3040 448 conicto +3742 448 4111 941 conicto +4480 1434 4480 2376 conicto +end_ol grestore +gsave 36.594434 30.468750 translate 0.035278 -0.035278 scale +start_ol +576 320 moveto +576 1536 lineto +1088 1536 lineto +1108 958 1469 671 conicto +1831 384 2538 384 conicto +3174 384 3507 611 conicto +3840 839 3840 1274 conicto +3840 1616 3599 1826 conicto +3358 2036 2582 2276 conicto +1908 2498 lineto +1206 2717 891 3046 conicto +576 3376 576 3884 conicto +576 4612 1117 5026 conicto +1658 5440 2614 5440 conicto +3039 5440 3509 5325 conicto +3979 5211 4480 4992 conicto +4480 3840 lineto +3968 3840 lineto +3948 4352 3603 4640 conicto +3258 4928 2664 4928 conicto +2076 4928 1774 4725 conicto +1472 4522 1472 4115 conicto +1472 3783 1700 3582 conicto +1928 3382 2613 3174 conicto +3353 2952 lineto +4088 2720 4412 2371 conicto +4736 2023 4736 1474 conicto +4736 727 4158 299 conicto +3580 -128 2563 -128 conicto +2048 -128 1557 -16 conicto +1067 96 576 320 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 25.000000 21.000000 m 25.000000 25.000000 l 39.000000 25.000000 l 39.000000 21.000000 l f +0.345098 1.000000 0.345098 srgb +n 25.000000 21.000000 m 25.000000 25.000000 l 39.000000 25.000000 l 39.000000 21.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 29.435000 23.468750 translate 0.035278 -0.035278 scale +start_ol +2560 512 moveto +3482 512 lineto +4923 512 5693 1350 conicto +6464 2189 6464 3754 conicto +6464 5320 5696 6148 conicto +4928 6976 3482 6976 conicto +2560 6976 lineto +2560 512 lineto +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +3556 7488 lineto +5474 7488 6545 6500 conicto +7616 5512 7616 3752 conicto +7616 1986 6542 993 conicto +5469 0 3556 0 conicto +576 0 lineto +end_ol grestore +gsave 30.518981 23.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 31.320727 23.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 32.077518 23.468750 translate 0.035278 -0.035278 scale +start_ol +3072 384 moveto +3801 384 4172 960 conicto +4544 1536 4544 2658 conicto +4544 3781 4172 4354 conicto +3801 4928 3072 4928 conicto +2343 4928 1971 4354 conicto +1600 3781 1600 2658 conicto +1600 1536 1974 960 conicto +2348 384 3072 384 conicto +3072 -128 moveto +1917 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3920 1212 4680 conicto +1912 5440 3072 5440 conicto +4232 5440 4932 4680 conicto +5632 3920 5632 2658 conicto +5632 1397 4932 634 conicto +4232 -128 3072 -128 conicto +end_ol grestore +gsave 32.891756 23.468750 translate 0.035278 -0.035278 scale +start_ol +5376 512 moveto +6272 512 lineto +6272 0 lineto +4480 0 lineto +4480 812 lineto +4208 330 3788 101 conicto +3369 -128 2750 -128 conicto +1764 -128 1138 644 conicto +512 1417 512 2658 conicto +512 3900 1135 4670 conicto +1759 5440 2750 5440 conicto +3369 5440 3788 5202 conicto +4208 4965 4480 4464 conicto +4480 7296 lineto +3584 7296 lineto +3584 7808 lineto +5376 7808 lineto +5376 512 lineto +4480 2376 moveto +4480 2900 lineto +4480 3855 4111 4359 conicto +3742 4864 3040 4864 conicto +2328 4864 1964 4309 conicto +1600 3754 1600 2658 conicto +1600 1568 1964 1008 conicto +2328 448 3040 448 conicto +3742 448 4111 941 conicto +4480 1434 4480 2376 conicto +end_ol grestore +gsave 33.758440 23.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 25.000000 14.000000 m 25.000000 18.000000 l 39.000000 18.000000 l 39.000000 14.000000 l f +0.784314 0.784314 1.000000 srgb +n 25.000000 14.000000 m 25.000000 18.000000 l 39.000000 18.000000 l 39.000000 14.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 25.497500 16.468750 translate 0.035278 -0.035278 scale +start_ol +2560 3776 moveto +3874 3776 lineto +4608 3776 4992 4187 conicto +5376 4599 5376 5376 conicto +5376 6158 4992 6567 conicto +4608 6976 3874 6976 conicto +2560 6976 lineto +2560 3776 lineto +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +4116 7488 lineto +5228 7488 5878 6917 conicto +6528 6347 6528 5376 conicto +6528 4411 5878 3837 conicto +5228 3264 4116 3264 conicto +2560 3264 lineto +2560 512 lineto +3712 512 lineto +3712 0 lineto +576 0 lineto +end_ol grestore +gsave 26.409147 16.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 27.056036 16.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 27.857782 16.468750 translate 0.035278 -0.035278 scale +start_ol +448 3136 moveto +3008 3136 lineto +3008 2368 lineto +448 2368 lineto +448 3136 lineto +end_ol grestore +gsave 28.314849 16.468750 translate 0.035278 -0.035278 scale +start_ol +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +6720 7488 lineto +6720 5824 lineto +6080 5824 lineto +6080 6848 lineto +2560 6848 lineto +2560 4352 lineto +5120 4352 lineto +5120 5312 lineto +5760 5312 lineto +5760 2752 lineto +5120 2752 lineto +5120 3712 lineto +2560 3712 lineto +2560 512 lineto +3776 512 lineto +3776 0 lineto +576 0 lineto +end_ol grestore +gsave 29.179037 16.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 29.980782 16.468750 translate 0.035278 -0.035278 scale +start_ol +1088 4800 moveto +256 4800 lineto +256 5312 lineto +1088 5312 lineto +1088 6976 lineto +1984 6976 lineto +1984 5312 lineto +3753 5312 lineto +3753 4800 lineto +1984 4800 lineto +1984 1435 lineto +1984 763 2117 573 conicto +2251 384 2610 384 conicto +2979 384 3148 595 conicto +3318 807 3328 1280 conicto +4032 1280 lineto +3992 548 3635 210 conicto +3278 -128 2550 -128 conicto +1751 -128 1419 227 conicto +1088 583 1088 1435 conicto +1088 4800 lineto +end_ol grestore +gsave 30.525270 16.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 31.282061 16.468750 translate 0.035278 -0.035278 scale +start_ol +448 0 moveto +448 512 lineto +1280 512 lineto +1280 7296 lineto +384 7296 lineto +384 7808 lineto +2176 7808 lineto +2176 4329 lineto +2432 4879 2840 5159 conicto +3249 5440 3790 5440 conicto +4672 5440 5088 4931 conicto +5504 4423 5504 3345 conicto +5504 512 lineto +6336 512 lineto +6336 0 lineto +3840 0 lineto +3840 512 lineto +4608 512 lineto +4608 3056 lineto +4608 4025 4367 4380 conicto +4126 4736 3506 4736 conicto +2856 4736 2516 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +end_ol grestore +gsave 32.153739 16.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 32.583331 16.468750 translate 0.035278 -0.035278 scale +start_ol +5443 1155 moveto +2572 4269 lineto +2214 3873 2035 3413 conicto +1856 2953 1856 2435 conicto +1856 1591 2401 1019 conicto +2947 448 3763 448 conicto +4247 448 4676 628 conicto +5106 809 5443 1155 conicto +8592 0 moveto +6563 0 lineto +5870 712 lineto +5349 287 4758 79 conicto +4168 -128 3483 -128 conicto +2203 -128 1453 536 conicto +704 1201 704 2338 conicto +704 3007 1082 3588 conicto +1460 4170 2226 4678 conicto +1969 4980 1848 5279 conicto +1728 5578 1728 5905 conicto +1728 6691 2296 7153 conicto +2864 7616 3841 7616 conicto +4174 7616 4618 7536 conicto +5062 7456 5632 7296 conicto +5632 6016 lineto +5056 6016 lineto +4987 6548 4673 6826 conicto +4360 7104 3821 7104 conicto +3316 7104 3002 6822 conicto +2688 6541 2688 6093 conicto +2688 5789 2854 5487 conicto +3021 5186 3551 4623 conicto +6140 1874 lineto +6505 2285 6714 2760 conicto +6923 3236 6976 3776 conicto +6024 3776 lineto +6024 4288 lineto +8412 4288 lineto +8412 3776 lineto +7552 3776 lineto +7468 3108 7221 2527 conicto +6975 1946 6563 1453 conicto +7420 512 lineto +8592 512 lineto +8592 0 lineto +end_ol grestore +gsave 33.787202 16.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 34.216794 16.468750 translate 0.035278 -0.035278 scale +start_ol +7232 1984 moveto +6901 943 6122 407 conicto +5344 -128 4152 -128 conicto +3421 -128 2795 122 conicto +2169 372 1683 857 conicto +1122 1417 849 2129 conicto +576 2842 576 3742 conicto +576 5481 1584 6548 conicto +2593 7616 4245 7616 conicto +4857 7616 5549 7457 conicto +6242 7298 7040 6976 conicto +7040 5248 lineto +6464 5248 lineto +6279 6201 5720 6652 conicto +5162 7104 4156 7104 conicto +2960 7104 2344 6251 conicto +1728 5398 1728 3741 conicto +1728 2090 2347 1237 conicto +2966 384 4168 384 conicto +5008 384 5551 785 conicto +6095 1187 6336 1984 conicto +7232 1984 lineto +end_ol grestore +gsave 35.253324 16.468750 translate 0.035278 -0.035278 scale +start_ol +4096 1672 moveto +4096 2816 lineto +2902 2816 lineto +2211 2816 1873 2517 conicto +1536 2219 1536 1603 conicto +1536 1041 1878 712 conicto +2221 384 2806 384 conicto +3385 384 3740 741 conicto +4096 1098 4096 1672 conicto +4992 3318 moveto +4992 512 lineto +5824 512 lineto +5824 0 lineto +4096 0 lineto +4096 558 lineto +3789 205 3387 38 conicto +2985 -128 2447 -128 conicto +1558 -128 1035 339 conicto +512 807 512 1602 conicto +512 2423 1109 2875 conicto +1707 3328 2796 3328 conicto +4096 3328 lineto +4096 3690 lineto +4096 4280 3718 4604 conicto +3341 4928 2658 4928 conicto +2094 4928 1760 4685 conicto +1426 4443 1344 3968 conicto +896 3968 lineto +896 5056 lineto +1378 5248 1833 5344 conicto +2288 5440 2720 5440 conicto +3831 5440 4411 4897 conicto +4992 4354 4992 3318 conicto +end_ol grestore +gsave 36.060064 16.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 36.816855 16.468750 translate 0.035278 -0.035278 scale +start_ol +448 0 moveto +448 512 lineto +1280 512 lineto +1280 7296 lineto +384 7296 lineto +384 7808 lineto +2176 7808 lineto +2176 4329 lineto +2432 4879 2840 5159 conicto +3249 5440 3790 5440 conicto +4672 5440 5088 4931 conicto +5504 4423 5504 3345 conicto +5504 512 lineto +6336 512 lineto +6336 0 lineto +3840 0 lineto +3840 512 lineto +4608 512 lineto +4608 3056 lineto +4608 4025 4367 4380 conicto +4126 4736 3506 4736 conicto +2856 4736 2516 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +end_ol grestore +gsave 37.688533 16.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 8.000000 15.000000 translate 0.035278 -0.035278 scale +start_ol +18196 19712 moveto +4474 19712 lineto +2264 13226 lineto +3383 12928 lineto +3465 13064 3574 13253 3683 13470 curveto +5293 16180 5565 16560 6575 17292 curveto +7611 18078 9139 18430 11403 18430 curveto +14022 18430 lineto +-518 1038 lineto +-682 0 lineto +14432 0 lineto +16669 7008 lineto +15523 7337 lineto +14350 5007 13831 4213 12904 3281 curveto +11485 1856 9821 1280 7148 1280 curveto +3465 1280 lineto +18033 18647 lineto +18196 19712 lineto +end_ol grestore +gsave 10.407750 15.000000 translate 0.035278 -0.035278 scale +start_ol +6315 12796 moveto +1098 12386 lineto +988 11404 lineto +1648 11404 lineto +2775 11404 3215 11159 3215 10559 curveto +3215 10314 3133 9959 2968 9359 curveto +1373 4041 lineto +878 2323 768 1887 768 1287 curveto +768 344 1594 -384 2668 -384 curveto +3832 -384 4943 240 6026 1489 curveto +6513 2032 6947 2629 7705 3796 curveto +6860 4260 lineto +5507 2160 4316 960 3585 960 curveto +3321 960 3136 1206 3136 1533 curveto +3136 1806 3244 2297 3459 3060 curveto +6315 12796 lineto +5824 19456 moveto +5006 19456 4352 18802 4352 17984 curveto +4352 17193 5006 16512 5797 16512 curveto +6642 16512 7296 17166 7296 17984 curveto +7296 18802 6642 19456 5824 19456 curveto +end_ol grestore +gsave 11.609123 15.000000 translate 0.035278 -0.035278 scale +start_ol +6408 12864 moveto +1443 12386 lineto +1334 11444 lineto +1989 11444 lineto +3107 11444 3543 11199 3543 10600 curveto +3543 10327 3461 9918 3297 9399 curveto +-194 -2444 lineto +-740 -4409 -767 -4436 -2622 -4518 curveto +-2731 -5504 lineto +3816 -5504 lineto +3925 -4518 lineto +3598 -4518 lineto +2288 -4518 1852 -4354 1852 -3806 curveto +1852 -3588 1961 -3125 2152 -2444 curveto +3489 1998 lineto +4225 130 4935 -384 6735 -384 curveto +8644 -384 10334 461 11643 2150 curveto +13033 3893 13824 6154 13824 8388 curveto +13824 9734 13552 10640 12925 11436 curveto +12216 12315 11127 12864 10064 12864 curveto +8673 12864 7227 12036 5999 10518 curveto +6408 12864 lineto +9218 11392 moveto +10446 11392 11264 10436 11264 8989 curveto +11264 7487 10800 5630 9982 3937 curveto +9027 1889 7936 960 6490 960 curveto +5153 960 4198 2025 4198 3472 curveto +4198 5056 5044 7678 6080 9262 curveto +6981 10627 8127 11392 9218 11392 curveto +end_ol grestore +gsave 13.679686 15.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 14.683747 15.000000 translate 0.035278 -0.035278 scale +start_ol +16811 17936 moveto +15502 19475 14110 20096 12037 20096 curveto +9041 20096 6317 18681 4138 15961 curveto +2123 13512 1088 10683 1088 7663 curveto +1088 2808 4245 -384 9090 -384 curveto +11491 -384 13537 462 15092 2072 curveto +15938 2945 16566 3955 17275 5619 curveto +16156 6110 lineto +15474 4666 15092 4012 14601 3440 curveto +13237 1750 11600 960 9554 960 curveto +7863 960 6553 1505 5735 2568 curveto +4916 3576 4480 5020 4480 6573 curveto +4480 9679 5571 13276 7290 15919 curveto +8545 17854 10373 18944 12255 18944 curveto +14056 18944 15338 18018 16075 16192 curveto +16511 15184 16702 13985 16784 11887 curveto +17902 11887 lineto +19430 19507 lineto +18448 19507 lineto +16811 17936 lineto +end_ol grestore +gsave 17.288810 15.000000 translate 0.035278 -0.035278 scale +start_ol +6747 8704 moveto +7239 8704 lineto +12320 8704 13276 8840 15134 9821 curveto +17047 10856 18112 12628 18112 14780 curveto +18112 16469 17401 17832 16088 18731 curveto +15076 19412 13627 19712 11357 19712 curveto +3309 19712 lineto +3145 18431 lineto +3854 18431 lineto +5628 18431 6010 18295 6010 17696 curveto +6010 17478 5901 16904 5764 16358 curveto +2272 3361 lineto +1890 1887 1863 1887 1645 1668 curveto +1345 1395 717 1286 -620 1286 curveto +-756 1286 lineto +-892 0 lineto +7783 0 lineto +7920 1286 lineto +7211 1286 lineto +5437 1286 5055 1423 5055 2025 curveto +5055 2244 5055 2244 5328 3366 curveto +6747 8704 lineto +7101 9984 moveto +9011 17123 lineto +9284 18159 9638 18431 10757 18431 curveto +11084 18431 lineto +13949 18431 15040 17505 15040 15080 curveto +15040 13745 14604 12464 13867 11537 curveto +13158 10665 12176 10175 10675 10039 curveto +10293 9984 10293 9984 7620 9984 curveto +7101 9984 lineto +end_ol grestore +gsave 19.696559 15.000000 translate 0.035278 -0.035278 scale +start_ol +2751 18429 moveto +3435 18429 lineto +5212 18429 5595 18293 5595 17692 curveto +5595 17474 5486 16900 5349 16354 curveto +3107 8029 lineto +2669 6446 2560 5736 2560 4808 curveto +2560 1437 4936 -384 9387 -384 curveto +10778 -384 12142 -166 13206 243 curveto +14980 925 16044 2097 16889 4306 curveto +17271 5260 17271 5260 18008 8041 curveto +19536 13794 lineto +20709 18020 20954 18320 23355 18429 curveto +23492 19712 lineto +16317 19712 lineto +16153 18429 lineto +17899 18456 18690 17965 18690 16928 curveto +18690 16327 18663 16218 18063 13789 curveto +16480 7920 lineto +15689 4890 15362 3989 14707 3061 curveto +13643 1532 12061 768 9960 768 curveto +7177 768 5568 2133 5568 4453 curveto +5568 5163 5759 6500 5950 7265 curveto +8405 16354 lineto +8787 17828 8787 17828 9033 18047 curveto +9305 18320 9960 18429 11297 18429 curveto +11406 18429 lineto +11570 19712 lineto +2888 19712 lineto +2751 18429 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 53.000000 14.000000 m 53.000000 40.000000 l 57.000000 40.000000 l 57.000000 14.000000 l f +0.501961 0.501961 0.501961 srgb +n 53.000000 14.000000 m 53.000000 40.000000 l 57.000000 40.000000 l 57.000000 14.000000 l cp s +0.010000 slw +[] 0 sd +0 slj +1 slc +0.000000 0.000000 0.000000 srgb +n 54.800964 29.811056 m 54.216694 30.000980 l 54.183086 29.991429 54.167733 29.994331 54.167733 29.994331 c 54.137027 30.000134 54.118772 29.987682 54.119618 29.908014 c 54.024597 29.910070 l 54.025324 30.418782 l 54.120345 30.416727 l 54.124093 30.352412 54.136545 30.334158 54.225763 30.301396 c 54.404199 30.235872 l 54.828650 30.378280 l 54.213674 30.574007 l 54.180067 30.564456 54.164713 30.567358 54.164713 30.567358 c 54.134007 30.573161 54.118654 30.576062 54.119499 30.496395 c 54.024479 30.498450 l 54.025206 31.007163 l 54.120227 31.005107 l 54.121073 30.925439 54.133525 30.907185 54.222743 30.874423 c 55.286710 30.530239 l 55.278851 30.404512 l 54.600889 30.182799 l 55.274376 29.960114 l 55.281871 29.831485 l 54.340848 29.564076 l 54.185260 29.498070 54.133398 29.476068 54.115989 29.383948 c 54.020968 29.386004 l 54.019640 29.799696 l 54.114661 29.797640 l 54.121310 29.748679 54.115507 29.717972 54.143312 29.696816 c 54.152862 29.663208 54.180667 29.642052 54.229628 29.648701 c 54.244982 29.645799 54.263236 29.658251 54.327551 29.661999 c 54.800964 29.811056 l ef +n 54.454152 28.922503 m 54.480629 29.315039 l 54.560296 29.315884 l 54.554493 29.285178 l 54.552438 29.190157 54.567791 29.187256 54.711773 29.191849 c 54.996836 29.185682 l 55.076504 29.186528 l 55.156171 29.187374 55.159073 29.202727 55.164030 29.313101 c 55.259051 29.311046 l 55.255422 28.786980 l 55.160401 28.789036 l 55.163302 28.804389 l 55.165358 28.899410 55.152906 28.917664 55.088592 28.913917 c 54.993571 28.915973 l 54.454152 28.922503 l ef +n 53.999357 29.040254 m 54.001413 29.135274 54.077333 29.200435 54.157001 29.201281 c 54.236668 29.202127 54.320084 29.138658 54.320929 29.058990 c 54.318874 28.963969 54.230502 28.917064 54.150834 28.916218 c 54.071166 28.915372 54.000203 28.960586 53.999357 29.040254 c 53.999357 29.040254 l ef +n 54.442512 27.998437 m 54.438765 28.062751 l 54.483978 28.133714 l 54.431270 28.191380 54.427522 28.255694 54.426677 28.335362 c 54.415434 28.528305 54.551922 28.661527 54.711257 28.663219 c 54.772670 28.651613 54.818730 28.642909 54.856085 28.588145 c 54.911695 28.545833 54.933697 28.493970 54.962348 28.393146 c 54.988098 28.276969 l 55.016749 28.176145 55.026299 28.142537 55.090613 28.146284 c 55.154928 28.150032 55.181887 28.208543 55.181041 28.288211 c 55.188900 28.413938 55.111287 28.508114 54.951106 28.586089 c 54.950260 28.665757 l 55.250676 28.656689 l 55.254424 28.592374 l 55.212111 28.536764 l 55.246565 28.466647 55.275216 28.365823 55.276062 28.286156 c 55.287304 28.093212 55.150817 27.959990 54.976128 27.961200 c 54.911814 27.957452 54.850401 27.969058 54.813045 28.023822 c 54.788142 28.060332 54.778592 28.093940 54.740390 28.228371 c 54.686836 28.365705 l 54.670637 28.448274 54.661086 28.481882 54.612125 28.475233 c 54.566065 28.483937 54.520852 28.412974 54.521697 28.333306 c 54.519642 28.238285 54.584802 28.162365 54.711376 28.074839 c 54.712222 27.995171 l 54.442512 27.998437 l ef +n 53.987957 27.444301 m 54.020236 27.867543 l 54.115257 27.865487 l 54.124808 27.831879 l 54.122752 27.736858 54.119851 27.721505 54.276285 27.707844 c 54.993294 27.715457 l 55.088315 27.713401 l 55.152629 27.717149 55.155531 27.732502 55.148036 27.861131 c 55.243057 27.859075 l 55.242329 27.350363 l 55.147308 27.352418 l 55.149364 27.447439 55.149364 27.447439 55.069696 27.446593 c 54.830693 27.444055 l 54.766379 27.440308 54.720319 27.449012 54.686711 27.439462 c 54.634848 27.417460 54.574281 27.349398 54.578029 27.285084 c 54.578875 27.205416 54.652739 27.175555 54.763114 27.170598 c 55.002117 27.173136 l 55.097138 27.171081 l 55.161452 27.174828 55.149000 27.193083 55.151056 27.288104 c 55.246077 27.286048 l 55.242448 26.761982 l 55.147427 26.764038 l 55.150328 26.779391 l 55.152384 26.874412 55.158187 26.905118 55.078519 26.904273 c 54.998851 26.903427 l 54.729142 26.906692 l 54.634121 26.908747 54.572708 26.920353 54.501745 26.965567 c 54.449036 27.023233 54.427034 27.075095 54.429090 27.170116 c 54.421595 27.298745 54.472612 27.400415 54.576337 27.444419 c 53.987957 27.444301 l ef +n 53.993785 26.318163 m 54.026065 26.741405 l 54.121086 26.739350 l 54.115283 26.708643 l 54.125679 26.595368 54.125679 26.595368 54.282113 26.581706 c 54.904101 26.591375 l 55.063437 26.593067 55.189164 26.585208 55.274635 26.616761 c 55.272579 26.521740 l 55.141895 26.419224 l 55.237761 26.337501 55.287569 26.264482 55.279710 26.138755 c 55.276445 25.869045 55.085193 25.698468 54.830837 25.698831 c 54.591834 25.696294 54.415454 25.856839 54.422466 26.062234 c 54.414971 26.190863 54.478440 26.274278 54.551459 26.324085 c 53.993785 26.318163 l ef +1.000000 1.000000 1.000000 srgb +n 54.553151 26.164749 m 54.548194 26.054375 54.665217 26.000457 54.855258 25.996346 c 55.078908 26.001785 55.182634 26.045789 55.187591 26.156164 c 55.192548 26.266538 55.075525 26.320456 54.885483 26.324567 c 54.677186 26.316226 54.558108 26.275124 54.553151 26.164749 c ef +0.000000 0.000000 0.000000 srgb +n 54.420891 25.128315 m 54.421254 25.382671 54.618309 25.583955 54.857312 25.586493 c 55.096315 25.589030 55.279344 25.379524 55.278981 25.125168 c 55.275715 24.855458 55.094014 24.651273 54.855011 24.648735 c 54.616008 24.646197 54.417626 24.858605 54.420891 25.128315 c 54.420891 25.128315 l ef +1.000000 1.000000 1.000000 srgb +n 54.515912 25.126259 m 54.519659 25.061945 54.559916 25.022534 54.615526 24.980221 c 54.676939 24.968615 54.769058 24.951207 54.848726 24.952053 c 55.057023 24.960393 55.179003 25.016849 55.183960 25.127223 c 55.186015 25.222244 55.071894 25.291516 54.848244 25.286077 c 54.627495 25.295991 54.517967 25.221280 54.515912 25.126259 c ef +0.000000 0.000000 0.000000 srgb +n 54.453860 24.187867 m 54.464984 24.583304 l 54.544651 24.584150 l 54.554202 24.550542 l 54.552146 24.455521 54.564598 24.437266 54.723933 24.438958 c 54.993643 24.435693 l 55.073311 24.436539 l 55.152978 24.437385 55.155880 24.452738 55.160837 24.563112 c 55.148385 24.581367 l 55.243406 24.579311 l 55.242678 24.070599 l 55.147658 24.072654 l 55.149713 24.167675 55.149713 24.167675 55.085399 24.163928 c 54.990378 24.165983 l 54.831042 24.164292 l 54.766728 24.160544 54.720668 24.169249 54.687060 24.159698 c 54.635198 24.137696 54.574630 24.069634 54.578378 24.005320 c 54.579224 23.925652 54.650187 23.880438 54.760561 23.875481 c 54.999564 23.878019 l 55.094585 23.875964 l 55.158900 23.879711 55.161801 23.895064 55.151405 24.008340 c 55.246426 24.006284 l 55.242797 23.482218 l 55.147776 23.484274 l 55.152733 23.594648 55.155634 23.610001 55.075967 23.609155 c 54.996299 23.608310 l 54.726590 23.611575 l 54.631569 23.613630 54.573057 23.640589 54.499192 23.670450 c 54.461837 23.725214 54.427383 23.795331 54.429439 23.890352 c 54.421944 24.018981 54.472961 24.120651 54.594941 24.177107 c 54.453860 24.187867 l ef +n 54.854398 22.541893 m 54.839045 22.544795 l 54.600042 22.542257 54.423661 22.702802 54.421123 22.941805 c 54.413629 23.070434 54.467547 23.187457 54.564623 23.280423 c 54.643445 23.360936 54.762524 23.402039 54.857545 23.399983 c 54.986174 23.407478 55.084942 23.341108 55.165455 23.262286 c 55.230616 23.186366 55.271719 23.067287 55.279213 22.938659 c 55.275102 22.748617 55.184675 22.606690 54.998380 22.546487 c 54.966828 22.631957 l 55.104161 22.685512 55.152276 22.771828 55.157233 22.882203 c 55.156387 22.961870 55.119032 23.016634 55.063422 23.058947 c 55.004910 23.085906 54.961752 23.109964 54.848477 23.099567 c 54.854398 22.541893 l ef +1.000000 1.000000 1.000000 srgb +n 54.768809 23.098721 m 54.609473 23.097030 54.518200 23.034771 54.516144 22.939750 c 54.516990 22.860082 54.587954 22.814868 54.731936 22.819462 c 54.777995 22.810757 54.777995 22.810757 54.771347 22.859718 c ef +n 54.800964 29.811056 m 54.216694 30.000980 l 54.183086 29.991429 54.167733 29.994331 54.167733 29.994331 c 54.137027 30.000134 54.118772 29.987682 54.119618 29.908014 c 54.024597 29.910070 l 54.025324 30.418782 l 54.120345 30.416727 l 54.124093 30.352412 54.136545 30.334158 54.225763 30.301396 c 54.404199 30.235872 l 54.828650 30.378280 l 54.213674 30.574007 l 54.180067 30.564456 54.164713 30.567358 54.164713 30.567358 c 54.134007 30.573161 54.118654 30.576062 54.119499 30.496395 c 54.024479 30.498450 l 54.025206 31.007163 l 54.120227 31.005107 l 54.121073 30.925439 54.133525 30.907185 54.222743 30.874423 c 55.286710 30.530239 l 55.278851 30.404512 l 54.600889 30.182799 l 55.274376 29.960114 l 55.281871 29.831485 l 54.340848 29.564076 l 54.185260 29.498070 54.133398 29.476068 54.115989 29.383948 c 54.020968 29.386004 l 54.019640 29.799696 l 54.114661 29.797640 l 54.121310 29.748679 54.115507 29.717972 54.143312 29.696816 c 54.152862 29.663208 54.180667 29.642052 54.229628 29.648701 c 54.244982 29.645799 54.263236 29.658251 54.327551 29.661999 c 54.800964 29.811056 l s +n 54.454152 28.922503 m 54.480629 29.315039 l 54.560296 29.315884 l 54.554493 29.285178 l 54.552438 29.190157 54.567791 29.187256 54.711773 29.191849 c 54.996836 29.185682 l 55.076504 29.186528 l 55.156171 29.187374 55.159073 29.202727 55.164030 29.313101 c 55.259051 29.311046 l 55.255422 28.786980 l 55.160401 28.789036 l 55.163302 28.804389 l 55.165358 28.899410 55.152906 28.917664 55.088592 28.913917 c 54.993571 28.915973 l 54.454152 28.922503 l s +n 53.999357 29.040254 m 54.001413 29.135274 54.077333 29.200435 54.157001 29.201281 c 54.236668 29.202127 54.320084 29.138658 54.320929 29.058990 c 54.318874 28.963969 54.230502 28.917064 54.150834 28.916218 c 54.071166 28.915372 54.000203 28.960586 53.999357 29.040254 c 53.999357 29.040254 l s +n 54.442512 27.998437 m 54.438765 28.062751 l 54.483978 28.133714 l 54.431270 28.191380 54.427522 28.255694 54.426677 28.335362 c 54.415434 28.528305 54.551922 28.661527 54.711257 28.663219 c 54.772670 28.651613 54.818730 28.642909 54.856085 28.588145 c 54.911695 28.545833 54.933697 28.493970 54.962348 28.393146 c 54.988098 28.276969 l 55.016749 28.176145 55.026299 28.142537 55.090613 28.146284 c 55.154928 28.150032 55.181887 28.208543 55.181041 28.288211 c 55.188900 28.413938 55.111287 28.508114 54.951106 28.586089 c 54.950260 28.665757 l 55.250676 28.656689 l 55.254424 28.592374 l 55.212111 28.536764 l 55.246565 28.466647 55.275216 28.365823 55.276062 28.286156 c 55.287304 28.093212 55.150817 27.959990 54.976128 27.961200 c 54.911814 27.957452 54.850401 27.969058 54.813045 28.023822 c 54.788142 28.060332 54.778592 28.093940 54.740390 28.228371 c 54.686836 28.365705 l 54.670637 28.448274 54.661086 28.481882 54.612125 28.475233 c 54.566065 28.483937 54.520852 28.412974 54.521697 28.333306 c 54.519642 28.238285 54.584802 28.162365 54.711376 28.074839 c 54.712222 27.995171 l 54.442512 27.998437 l s +n 53.987957 27.444301 m 54.020236 27.867543 l 54.115257 27.865487 l 54.124808 27.831879 l 54.122752 27.736858 54.119851 27.721505 54.276285 27.707844 c 54.993294 27.715457 l 55.088315 27.713401 l 55.152629 27.717149 55.155531 27.732502 55.148036 27.861131 c 55.243057 27.859075 l 55.242329 27.350363 l 55.147308 27.352418 l 55.149364 27.447439 55.149364 27.447439 55.069696 27.446593 c 54.830693 27.444055 l 54.766379 27.440308 54.720319 27.449012 54.686711 27.439462 c 54.634848 27.417460 54.574281 27.349398 54.578029 27.285084 c 54.578875 27.205416 54.652739 27.175555 54.763114 27.170598 c 55.002117 27.173136 l 55.097138 27.171081 l 55.161452 27.174828 55.149000 27.193083 55.151056 27.288104 c 55.246077 27.286048 l 55.242448 26.761982 l 55.147427 26.764038 l 55.150328 26.779391 l 55.152384 26.874412 55.158187 26.905118 55.078519 26.904273 c 54.998851 26.903427 l 54.729142 26.906692 l 54.634121 26.908747 54.572708 26.920353 54.501745 26.965567 c 54.449036 27.023233 54.427034 27.075095 54.429090 27.170116 c 54.421595 27.298745 54.472612 27.400415 54.576337 27.444419 c 53.987957 27.444301 l s +n 53.993785 26.318163 m 54.026065 26.741405 l 54.121086 26.739350 l 54.115283 26.708643 l 54.125679 26.595368 54.125679 26.595368 54.282113 26.581706 c 54.904101 26.591375 l 55.063437 26.593067 55.189164 26.585208 55.274635 26.616761 c 55.272579 26.521740 l 55.141895 26.419224 l 55.237761 26.337501 55.287569 26.264482 55.279710 26.138755 c 55.276445 25.869045 55.085193 25.698468 54.830837 25.698831 c 54.591834 25.696294 54.415454 25.856839 54.422466 26.062234 c 54.414971 26.190863 54.478440 26.274278 54.551459 26.324085 c 53.993785 26.318163 l s +n 54.553151 26.164749 m 54.548194 26.054375 54.665217 26.000457 54.855258 25.996346 c 55.078908 26.001785 55.182634 26.045789 55.187591 26.156164 c 55.192548 26.266538 55.075525 26.320456 54.885483 26.324567 c 54.677186 26.316226 54.558108 26.275124 54.553151 26.164749 c 54.553151 26.164749 l s +n 54.420891 25.128315 m 54.421254 25.382671 54.618309 25.583955 54.857312 25.586493 c 55.096315 25.589030 55.279344 25.379524 55.278981 25.125168 c 55.275715 24.855458 55.094014 24.651273 54.855011 24.648735 c 54.616008 24.646197 54.417626 24.858605 54.420891 25.128315 c 54.420891 25.128315 l s +n 54.515912 25.126259 m 54.519659 25.061945 54.559916 25.022534 54.615526 24.980221 c 54.676939 24.968615 54.769058 24.951207 54.848726 24.952053 c 55.057023 24.960393 55.179003 25.016849 55.183960 25.127223 c 55.186015 25.222244 55.071894 25.291516 54.848244 25.286077 c 54.627495 25.295991 54.517967 25.221280 54.515912 25.126259 c 54.515912 25.126259 l s +n 54.453860 24.187867 m 54.464984 24.583304 l 54.544651 24.584150 l 54.554202 24.550542 l 54.552146 24.455521 54.564598 24.437266 54.723933 24.438958 c 54.993643 24.435693 l 55.073311 24.436539 l 55.152978 24.437385 55.155880 24.452738 55.160837 24.563112 c 55.148385 24.581367 l 55.243406 24.579311 l 55.242678 24.070599 l 55.147658 24.072654 l 55.149713 24.167675 55.149713 24.167675 55.085399 24.163928 c 54.990378 24.165983 l 54.831042 24.164292 l 54.766728 24.160544 54.720668 24.169249 54.687060 24.159698 c 54.635198 24.137696 54.574630 24.069634 54.578378 24.005320 c 54.579224 23.925652 54.650187 23.880438 54.760561 23.875481 c 54.999564 23.878019 l 55.094585 23.875964 l 55.158900 23.879711 55.161801 23.895064 55.151405 24.008340 c 55.246426 24.006284 l 55.242797 23.482218 l 55.147776 23.484274 l 55.152733 23.594648 55.155634 23.610001 55.075967 23.609155 c 54.996299 23.608310 l 54.726590 23.611575 l 54.631569 23.613630 54.573057 23.640589 54.499192 23.670450 c 54.461837 23.725214 54.427383 23.795331 54.429439 23.890352 c 54.421944 24.018981 54.472961 24.120651 54.594941 24.177107 c 54.453860 24.187867 l s +n 54.854398 22.541893 m 54.839045 22.544795 l 54.600042 22.542257 54.423661 22.702802 54.421123 22.941805 c 54.413629 23.070434 54.467547 23.187457 54.564623 23.280423 c 54.643445 23.360936 54.762524 23.402039 54.857545 23.399983 c 54.986174 23.407478 55.084942 23.341108 55.165455 23.262286 c 55.230616 23.186366 55.271719 23.067287 55.279213 22.938659 c 55.275102 22.748617 55.184675 22.606690 54.998380 22.546487 c 54.966828 22.631957 l 55.104161 22.685512 55.152276 22.771828 55.157233 22.882203 c 55.156387 22.961870 55.119032 23.016634 55.063422 23.058947 c 55.004910 23.085906 54.961752 23.109964 54.848477 23.099567 c 54.854398 22.541893 l s +n 54.768809 23.098721 m 54.609473 23.097030 54.518200 23.034771 54.516144 22.939750 c 54.516990 22.860082 54.587954 22.814868 54.731936 22.819462 c 54.777995 22.810757 54.777995 22.810757 54.771347 22.859718 c 54.768809 23.098721 l s +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +n 8.000000 28.000000 m 8.000000 48.000000 l 12.000000 48.000000 l 12.000000 28.000000 l f +0.749020 0.749020 0.749020 srgb +n 8.000000 28.000000 m 8.000000 48.000000 l 12.000000 48.000000 l 12.000000 28.000000 l cp s +0.010000 slw +[] 0 sd +0 slj +1 slc +0.000000 0.000000 0.000000 srgb +n 9.676236 42.518395 m 9.674181 42.423374 l 9.675027 42.343706 9.697029 42.291843 9.727735 42.286040 c 9.752639 42.249531 9.765091 42.231276 9.844758 42.232122 c 9.985839 42.221362 10.050154 42.225110 10.077959 42.203953 c 10.200784 42.180742 10.278397 42.086567 10.280088 41.927231 c 10.275977 41.737189 10.166449 41.662479 9.991760 41.663688 c 9.961054 41.669491 l 9.960208 41.749159 l 10.070582 41.744202 10.137798 41.763303 10.134051 41.827617 c 10.136952 41.842970 10.124500 41.861225 10.109147 41.864126 c 10.093794 41.867028 10.078441 41.869929 10.032381 41.878634 c 10.017028 41.881535 10.001674 41.884437 9.986321 41.887338 c 9.909555 41.901845 l 9.771376 41.927959 9.687961 41.991427 9.652661 42.141212 c 9.638154 42.064446 9.611195 42.005935 9.602490 41.959875 c 9.551473 41.858205 9.447748 41.814201 9.334472 41.803805 c 9.224098 41.808762 9.153135 41.853975 9.087975 41.929896 c 9.041069 42.018268 9.030673 42.131544 9.028981 42.290879 c 9.021368 43.007888 l 9.116389 43.005833 l 9.125939 42.972225 l 9.126785 42.892557 9.118080 42.846497 9.130532 42.828242 c 9.145885 42.825341 9.161239 42.822440 9.271613 42.817483 c 9.988622 42.825096 l 10.098996 42.820139 10.117251 42.832590 10.132604 42.829689 c 10.150859 42.842141 10.159563 42.888201 10.158717 42.967868 c 10.149167 43.001476 l 10.244188 42.999421 l 10.245152 42.331373 l 10.150131 42.333428 l 10.155934 42.364135 l 10.157990 42.459156 10.148440 42.492764 10.135988 42.511018 c 10.123536 42.529273 10.105281 42.516821 9.994907 42.521778 c 9.676236 42.518395 l ef +1.000000 1.000000 1.000000 srgb +n 9.581215 42.520450 m 9.231838 42.522869 l 9.136817 42.524925 9.118563 42.512473 9.128959 42.399198 c 9.123156 42.368491 l 9.124848 42.209156 9.187107 42.117882 9.346442 42.119574 c 9.521131 42.118364 9.584599 42.201779 9.579160 42.425429 c ef +0.000000 0.000000 0.000000 srgb +n 9.853668 40.743642 m 9.838315 40.746543 l 9.599312 40.744006 9.422931 40.904551 9.420394 41.143554 c 9.412899 41.272183 9.466817 41.389206 9.563893 41.482171 c 9.642715 41.562685 9.761794 41.603787 9.856815 41.601732 c 9.985444 41.609227 10.084212 41.542857 10.164726 41.464035 c 10.229886 41.388115 10.270989 41.269036 10.278483 41.140407 c 10.274372 40.950365 10.183945 40.808439 9.997650 40.748235 c 9.966098 40.833706 l 10.103431 40.887260 10.151546 40.973577 10.156503 41.083951 c 10.155657 41.163619 10.118302 41.218383 10.062692 41.260695 c 10.004181 41.287654 9.961022 41.311712 9.847747 41.301316 c 9.853668 40.743642 l ef +1.000000 1.000000 1.000000 srgb +n 9.768079 41.300470 m 9.608744 41.298778 9.517470 41.236519 9.515414 41.141498 c 9.516260 41.061831 9.587224 41.016617 9.731206 41.021210 c 9.777266 41.012506 9.777266 41.012506 9.770617 41.061467 c ef +0.000000 0.000000 0.000000 srgb +n 10.084267 40.238918 m 10.083421 40.318586 10.073871 40.352193 10.024910 40.345545 c 9.994203 40.351348 9.973047 40.323543 9.986345 40.225620 c 9.980542 40.194914 l 9.975585 40.084539 9.963979 40.023127 9.934118 39.949262 c 9.886003 39.862945 9.810083 39.797785 9.715062 39.799840 c 9.635394 39.798994 9.576882 39.825954 9.511722 39.901874 c 9.490566 39.874069 9.472311 39.861617 9.469410 39.846264 c 9.466508 39.830911 9.466508 39.830911 9.481862 39.828009 c 9.512568 39.822206 9.568178 39.779894 9.559474 39.733834 c 9.566123 39.684873 9.508457 39.632164 9.447044 39.643770 c 9.382730 39.640023 9.342473 39.679434 9.341627 39.759101 c 9.340781 39.838769 9.370641 39.912634 9.464816 39.990246 c 9.442814 40.042109 9.423714 40.109325 9.425769 40.204346 c 9.420330 40.427995 9.547267 40.594825 9.721956 40.593616 c 9.816977 40.591560 9.900392 40.528092 9.941495 40.409013 c 9.982961 40.544291 10.025273 40.599901 10.123196 40.613199 c 10.184609 40.601593 10.240219 40.559280 10.281321 40.440202 c 10.292081 40.581283 10.349747 40.633991 10.429415 40.634837 c 10.539789 40.629880 10.593343 40.492547 10.605431 40.219936 c 10.593462 39.904166 10.481878 39.734435 10.307189 39.735644 c 10.212168 39.737700 10.144107 39.798267 10.109653 39.868384 c 10.090552 39.935600 10.086805 39.999915 10.094663 40.125642 c 10.084267 40.238918 l ef +1.000000 1.000000 1.000000 srgb +n 9.520790 40.202290 m 9.518735 40.107269 9.577246 40.080310 9.705875 40.087805 c 9.816249 40.082848 9.904621 40.129753 9.903775 40.209421 c 9.894225 40.243029 9.869322 40.279538 9.838615 40.285341 c 9.795457 40.309399 9.749397 40.318103 9.703337 40.326808 c 9.574708 40.319313 9.517043 40.266604 9.520790 40.202290 c ef +n 10.321215 40.146435 m 10.331611 40.033159 10.328709 40.017806 10.338260 39.984198 c 10.366065 39.963042 10.378516 39.944787 10.412124 39.954337 c 10.476439 39.958085 10.509201 40.047303 10.510410 40.221991 c 10.500014 40.335267 10.468462 40.420737 10.404147 40.416990 c 10.370539 40.407440 10.349383 40.379635 10.328227 40.351830 c ef +0.000000 0.000000 0.000000 srgb +n 9.450034 39.217838 m 9.476511 39.610374 l 9.556179 39.611220 l 9.550376 39.580513 l 9.548320 39.485492 9.563674 39.482591 9.707656 39.487184 c 9.992719 39.481017 l 10.072386 39.481863 l 10.152054 39.482709 10.154955 39.498062 10.159912 39.608437 c 10.254933 39.606381 l 10.251304 39.082315 l 10.156284 39.084371 l 10.159185 39.099724 l 10.161241 39.194745 10.148789 39.213000 10.084474 39.209252 c 9.989453 39.211308 l 9.450034 39.217838 l ef +n 8.995240 39.335589 m 8.997295 39.430610 9.073216 39.495770 9.152883 39.496616 c 9.232551 39.497462 9.315966 39.433993 9.316812 39.354326 c 9.314757 39.259305 9.226384 39.212399 9.146717 39.211553 c 9.067049 39.210707 8.996086 39.255921 8.995240 39.335589 c 8.995240 39.335589 l ef +n 9.442233 38.293046 m 9.438486 38.357361 l 9.483699 38.428324 l 9.430991 38.485990 9.427243 38.550304 9.426397 38.629972 c 9.415155 38.822915 9.551643 38.956137 9.710978 38.957829 c 9.772391 38.946223 9.818451 38.937519 9.855806 38.882755 c 9.911416 38.840442 9.933418 38.788580 9.962069 38.687756 c 9.987819 38.571579 l 10.016470 38.470755 10.026020 38.437147 10.090334 38.440894 c 10.154649 38.444642 10.181608 38.503153 10.180762 38.582821 c 10.188621 38.708548 10.111008 38.802723 9.950827 38.880699 c 9.949981 38.960367 l 10.250397 38.951299 l 10.254145 38.886984 l 10.211832 38.831374 l 10.246286 38.761257 10.274937 38.660433 10.275783 38.580765 c 10.287025 38.387822 10.150538 38.254600 9.975849 38.255809 c 9.911535 38.252062 9.850122 38.263668 9.812766 38.318432 c 9.787863 38.354942 9.778312 38.388549 9.740111 38.522981 c 9.686557 38.660315 l 9.670358 38.742884 9.660807 38.776492 9.611846 38.769843 c 9.565786 38.778547 9.520573 38.707584 9.521418 38.627916 c 9.519363 38.532895 9.584523 38.456975 9.711097 38.369449 c 9.711942 38.289781 l 9.442233 38.293046 l ef +n 9.462298 37.557782 m 9.453957 37.766079 l 9.119933 37.765597 l 9.124890 37.875971 l 9.333187 37.884312 9.448518 37.989729 9.465081 38.161516 c 9.544749 38.162362 l 9.552243 38.033733 l 9.947680 38.022609 l 10.091662 38.027203 10.137722 38.018498 10.180880 37.994441 c 10.236491 37.952128 10.286298 37.879109 10.284242 37.784088 c 10.282187 37.689068 10.252326 37.615203 10.182209 37.580749 c 10.127444 37.543394 10.041974 37.511841 9.962306 37.510995 c 9.962306 37.510995 9.944051 37.498543 9.928698 37.501445 c 9.930754 37.596466 l 10.059383 37.603961 10.129500 37.638414 10.128654 37.718082 c 10.119104 37.751690 10.088397 37.757493 9.978023 37.762450 c 9.548978 37.764023 l 9.557319 37.555727 l 9.462298 37.557782 l ef +n 9.853681 36.557552 m 9.838328 36.560454 l 9.599325 36.557916 9.422944 36.718461 9.420406 36.957464 c 9.412912 37.086093 9.466830 37.203116 9.563906 37.296082 c 9.642728 37.376595 9.761807 37.417698 9.856828 37.415642 c 9.985457 37.423137 10.084225 37.356767 10.164738 37.277945 c 10.229899 37.202025 10.271002 37.082946 10.278496 36.954317 c 10.274385 36.764276 10.183958 36.622349 9.997663 36.562146 c 9.966111 36.647616 l 10.103444 36.701171 10.151559 36.787487 10.156516 36.897862 c 10.155670 36.977529 10.118315 37.032293 10.062705 37.074606 c 10.004193 37.101565 9.961035 37.125622 9.847760 37.115226 c 9.853681 36.557552 l ef +1.000000 1.000000 1.000000 srgb +n 9.768092 37.114380 m 9.608756 37.112689 9.517483 37.050430 9.515427 36.955409 c 9.516273 36.875741 9.587237 36.830527 9.731219 36.835120 c 9.777278 36.826416 9.777278 36.826416 9.770630 36.875377 c ef +0.000000 0.000000 0.000000 srgb +n 9.455643 36.092121 m 9.463865 36.472204 l 9.543533 36.473050 l 9.553083 36.439442 l 9.551027 36.344421 9.566381 36.341520 9.725716 36.343212 c 9.995426 36.339947 l 10.075093 36.340793 l 10.154761 36.341638 10.157662 36.356992 10.147266 36.470267 c 10.242287 36.468212 l 10.248209 35.910538 l 10.153188 35.912594 l 10.158991 35.943300 l 10.148594 36.056576 10.148594 36.056576 10.068927 36.055730 c 9.989259 36.054884 l 9.958552 36.060687 l 9.845277 36.050291 9.719549 36.058149 9.646531 36.008342 c 9.576413 35.973888 9.567709 35.927828 9.525396 35.872218 c 9.561906 35.897122 9.595514 35.906672 9.610867 35.903771 c 9.690535 35.904617 9.743243 35.846951 9.744089 35.767283 c 9.744935 35.687616 9.669015 35.622455 9.589347 35.621609 c 9.494326 35.623665 9.413813 35.702487 9.418770 35.812861 c 9.426628 35.938588 9.508351 36.034455 9.661038 36.085108 c 9.455643 36.092121 l ef +n 9.029823 33.986127 m 9.020882 35.116828 l 9.115903 35.114772 l 9.125453 35.081165 l 9.123397 34.986144 9.117594 34.955437 9.130046 34.937182 c 9.157851 34.916026 9.173205 34.913125 9.283579 34.908168 c 10.000588 34.915781 l 10.110962 34.910824 10.129217 34.923276 10.132118 34.938629 c 10.150373 34.951081 10.156176 34.981787 10.158231 35.076808 c 10.148681 35.110416 l 10.243702 35.108361 l 10.257118 34.422058 l 10.162097 34.424113 l 10.155448 34.473075 l 10.157504 34.568096 10.147954 34.601703 10.135502 34.619958 c 10.123050 34.638213 10.104795 34.625761 9.994421 34.630718 c 9.675750 34.627334 l 9.669948 34.596628 l 9.677442 34.467999 9.755054 34.373824 9.896135 34.363064 c 9.894080 34.268043 l 9.321052 34.265023 l 9.323108 34.360044 l 9.485345 34.377089 9.582421 34.470055 9.574927 34.598684 c 9.580730 34.629390 l 9.262059 34.626006 l 9.200646 34.637612 9.182391 34.625160 9.148783 34.615610 c 9.130528 34.603158 9.121824 34.557099 9.125571 34.492784 c 9.119768 34.462078 l 9.127263 34.333449 9.168366 34.214370 9.251781 34.150902 c 9.294939 34.126844 9.368804 34.096983 9.473375 34.061320 c 9.471320 33.966299 l 9.029823 33.986127 l ef +n 9.451915 33.484968 m 9.478392 33.877504 l 9.558059 33.878350 l 9.552256 33.847643 l 9.550201 33.752623 9.565554 33.749721 9.709536 33.754314 c 9.994599 33.748148 l 10.074267 33.748994 l 10.153934 33.749839 10.156836 33.765193 10.161793 33.875567 c 10.256814 33.873511 l 10.253185 33.349445 l 10.158164 33.351501 l 10.161065 33.366854 l 10.163121 33.461875 10.150669 33.480130 10.086355 33.476383 c 9.991334 33.478438 l 9.451915 33.484968 l ef +n 8.997120 33.602719 m 8.999176 33.697740 9.075096 33.762900 9.154764 33.763746 c 9.234431 33.764592 9.317847 33.701124 9.318692 33.621456 c 9.316637 33.526435 9.228265 33.479529 9.148597 33.478683 c 9.068929 33.477837 8.997966 33.523051 8.997120 33.602719 c 8.997120 33.602719 l ef +n 8.990529 32.852616 m 9.022808 33.275858 l 9.117829 33.273802 l 9.127380 33.240194 l 9.125324 33.145173 9.122423 33.129820 9.278856 33.116159 c 9.995866 33.123772 l 10.090887 33.121716 l 10.155201 33.125464 10.158103 33.140817 10.150608 33.269446 c 10.245629 33.267390 l 10.257353 32.740423 l 10.162332 32.742478 l 10.149880 32.760733 l 10.155683 32.791440 10.164388 32.837499 10.151936 32.855754 c 10.136583 32.858656 10.121229 32.861557 10.087621 32.852007 c 9.992601 32.854062 l 8.990529 32.852616 l ef +n 9.855263 31.790759 m 9.839910 31.793661 l 9.600907 31.791123 9.424526 31.951668 9.421989 32.190671 c 9.414494 32.319300 9.468412 32.436323 9.565488 32.529288 c 9.644310 32.609802 9.763389 32.650905 9.858410 32.648849 c 9.987039 32.656344 10.085807 32.589974 10.166321 32.511152 c 10.231481 32.435232 10.272584 32.316153 10.280078 32.187524 c 10.275967 31.997482 10.185540 31.855556 9.999245 31.795352 c 9.967693 31.880823 l 10.105026 31.934378 10.153141 32.020694 10.158098 32.131068 c 10.157252 32.210736 10.119897 32.265500 10.064287 32.307812 c 10.005776 32.334772 9.962617 32.358829 9.849342 32.348433 c 9.855263 31.790759 l ef +1.000000 1.000000 1.000000 srgb +n 9.769674 32.347587 m 9.610339 32.345895 9.519065 32.283636 9.517009 32.188615 c 9.517855 32.108948 9.588819 32.063734 9.732801 32.068327 c 9.778861 32.059623 9.778861 32.059623 9.772212 32.108584 c ef +n 9.676236 42.518395 m 9.674181 42.423374 l 9.675027 42.343706 9.697029 42.291843 9.727735 42.286040 c 9.752639 42.249531 9.765091 42.231276 9.844758 42.232122 c 9.985839 42.221362 10.050154 42.225110 10.077959 42.203953 c 10.200784 42.180742 10.278397 42.086567 10.280088 41.927231 c 10.275977 41.737189 10.166449 41.662479 9.991760 41.663688 c 9.961054 41.669491 l 9.960208 41.749159 l 10.070582 41.744202 10.137798 41.763303 10.134051 41.827617 c 10.136952 41.842970 10.124500 41.861225 10.109147 41.864126 c 10.093794 41.867028 10.078441 41.869929 10.032381 41.878634 c 10.017028 41.881535 10.001674 41.884437 9.986321 41.887338 c 9.909555 41.901845 l 9.771376 41.927959 9.687961 41.991427 9.652661 42.141212 c 9.638154 42.064446 9.611195 42.005935 9.602490 41.959875 c 9.551473 41.858205 9.447748 41.814201 9.334472 41.803805 c 9.224098 41.808762 9.153135 41.853975 9.087975 41.929896 c 9.041069 42.018268 9.030673 42.131544 9.028981 42.290879 c 9.021368 43.007888 l 9.116389 43.005833 l 9.125939 42.972225 l 9.126785 42.892557 9.118080 42.846497 9.130532 42.828242 c 9.145885 42.825341 9.161239 42.822440 9.271613 42.817483 c 9.988622 42.825096 l 10.098996 42.820139 10.117251 42.832590 10.132604 42.829689 c 10.150859 42.842141 10.159563 42.888201 10.158717 42.967868 c 10.149167 43.001476 l 10.244188 42.999421 l 10.245152 42.331373 l 10.150131 42.333428 l 10.155934 42.364135 l 10.157990 42.459156 10.148440 42.492764 10.135988 42.511018 c 10.123536 42.529273 10.105281 42.516821 9.994907 42.521778 c 9.676236 42.518395 l s +n 9.581215 42.520450 m 9.231838 42.522869 l 9.136817 42.524925 9.118563 42.512473 9.128959 42.399198 c 9.123156 42.368491 l 9.124848 42.209156 9.187107 42.117882 9.346442 42.119574 c 9.521131 42.118364 9.584599 42.201779 9.579160 42.425429 c 9.581215 42.520450 l s +n 9.853668 40.743642 m 9.838315 40.746543 l 9.599312 40.744006 9.422931 40.904551 9.420394 41.143554 c 9.412899 41.272183 9.466817 41.389206 9.563893 41.482171 c 9.642715 41.562685 9.761794 41.603787 9.856815 41.601732 c 9.985444 41.609227 10.084212 41.542857 10.164726 41.464035 c 10.229886 41.388115 10.270989 41.269036 10.278483 41.140407 c 10.274372 40.950365 10.183945 40.808439 9.997650 40.748235 c 9.966098 40.833706 l 10.103431 40.887260 10.151546 40.973577 10.156503 41.083951 c 10.155657 41.163619 10.118302 41.218383 10.062692 41.260695 c 10.004181 41.287654 9.961022 41.311712 9.847747 41.301316 c 9.853668 40.743642 l s +n 9.768079 41.300470 m 9.608744 41.298778 9.517470 41.236519 9.515414 41.141498 c 9.516260 41.061831 9.587224 41.016617 9.731206 41.021210 c 9.777266 41.012506 9.777266 41.012506 9.770617 41.061467 c 9.768079 41.300470 l s +n 10.084267 40.238918 m 10.083421 40.318586 10.073871 40.352193 10.024910 40.345545 c 9.994203 40.351348 9.973047 40.323543 9.986345 40.225620 c 9.980542 40.194914 l 9.975585 40.084539 9.963979 40.023127 9.934118 39.949262 c 9.886003 39.862945 9.810083 39.797785 9.715062 39.799840 c 9.635394 39.798994 9.576882 39.825954 9.511722 39.901874 c 9.490566 39.874069 9.472311 39.861617 9.469410 39.846264 c 9.466508 39.830911 9.466508 39.830911 9.481862 39.828009 c 9.512568 39.822206 9.568178 39.779894 9.559474 39.733834 c 9.566123 39.684873 9.508457 39.632164 9.447044 39.643770 c 9.382730 39.640023 9.342473 39.679434 9.341627 39.759101 c 9.340781 39.838769 9.370641 39.912634 9.464816 39.990246 c 9.442814 40.042109 9.423714 40.109325 9.425769 40.204346 c 9.420330 40.427995 9.547267 40.594825 9.721956 40.593616 c 9.816977 40.591560 9.900392 40.528092 9.941495 40.409013 c 9.982961 40.544291 10.025273 40.599901 10.123196 40.613199 c 10.184609 40.601593 10.240219 40.559280 10.281321 40.440202 c 10.292081 40.581283 10.349747 40.633991 10.429415 40.634837 c 10.539789 40.629880 10.593343 40.492547 10.605431 40.219936 c 10.593462 39.904166 10.481878 39.734435 10.307189 39.735644 c 10.212168 39.737700 10.144107 39.798267 10.109653 39.868384 c 10.090552 39.935600 10.086805 39.999915 10.094663 40.125642 c 10.084267 40.238918 l s +n 9.520790 40.202290 m 9.518735 40.107269 9.577246 40.080310 9.705875 40.087805 c 9.816249 40.082848 9.904621 40.129753 9.903775 40.209421 c 9.894225 40.243029 9.869322 40.279538 9.838615 40.285341 c 9.795457 40.309399 9.749397 40.318103 9.703337 40.326808 c 9.574708 40.319313 9.517043 40.266604 9.520790 40.202290 c 9.520790 40.202290 l s +n 10.321215 40.146435 m 10.331611 40.033159 10.328709 40.017806 10.338260 39.984198 c 10.366065 39.963042 10.378516 39.944787 10.412124 39.954337 c 10.476439 39.958085 10.509201 40.047303 10.510410 40.221991 c 10.500014 40.335267 10.468462 40.420737 10.404147 40.416990 c 10.370539 40.407440 10.349383 40.379635 10.328227 40.351830 c 10.321215 40.146435 l s +n 9.450034 39.217838 m 9.476511 39.610374 l 9.556179 39.611220 l 9.550376 39.580513 l 9.548320 39.485492 9.563674 39.482591 9.707656 39.487184 c 9.992719 39.481017 l 10.072386 39.481863 l 10.152054 39.482709 10.154955 39.498062 10.159912 39.608437 c 10.254933 39.606381 l 10.251304 39.082315 l 10.156284 39.084371 l 10.159185 39.099724 l 10.161241 39.194745 10.148789 39.213000 10.084474 39.209252 c 9.989453 39.211308 l 9.450034 39.217838 l s +n 8.995240 39.335589 m 8.997295 39.430610 9.073216 39.495770 9.152883 39.496616 c 9.232551 39.497462 9.315966 39.433993 9.316812 39.354326 c 9.314757 39.259305 9.226384 39.212399 9.146717 39.211553 c 9.067049 39.210707 8.996086 39.255921 8.995240 39.335589 c 8.995240 39.335589 l s +n 9.442233 38.293046 m 9.438486 38.357361 l 9.483699 38.428324 l 9.430991 38.485990 9.427243 38.550304 9.426397 38.629972 c 9.415155 38.822915 9.551643 38.956137 9.710978 38.957829 c 9.772391 38.946223 9.818451 38.937519 9.855806 38.882755 c 9.911416 38.840442 9.933418 38.788580 9.962069 38.687756 c 9.987819 38.571579 l 10.016470 38.470755 10.026020 38.437147 10.090334 38.440894 c 10.154649 38.444642 10.181608 38.503153 10.180762 38.582821 c 10.188621 38.708548 10.111008 38.802723 9.950827 38.880699 c 9.949981 38.960367 l 10.250397 38.951299 l 10.254145 38.886984 l 10.211832 38.831374 l 10.246286 38.761257 10.274937 38.660433 10.275783 38.580765 c 10.287025 38.387822 10.150538 38.254600 9.975849 38.255809 c 9.911535 38.252062 9.850122 38.263668 9.812766 38.318432 c 9.787863 38.354942 9.778312 38.388549 9.740111 38.522981 c 9.686557 38.660315 l 9.670358 38.742884 9.660807 38.776492 9.611846 38.769843 c 9.565786 38.778547 9.520573 38.707584 9.521418 38.627916 c 9.519363 38.532895 9.584523 38.456975 9.711097 38.369449 c 9.711942 38.289781 l 9.442233 38.293046 l s +n 9.462298 37.557782 m 9.453957 37.766079 l 9.119933 37.765597 l 9.124890 37.875971 l 9.333187 37.884312 9.448518 37.989729 9.465081 38.161516 c 9.544749 38.162362 l 9.552243 38.033733 l 9.947680 38.022609 l 10.091662 38.027203 10.137722 38.018498 10.180880 37.994441 c 10.236491 37.952128 10.286298 37.879109 10.284242 37.784088 c 10.282187 37.689068 10.252326 37.615203 10.182209 37.580749 c 10.127444 37.543394 10.041974 37.511841 9.962306 37.510995 c 9.962306 37.510995 9.944051 37.498543 9.928698 37.501445 c 9.930754 37.596466 l 10.059383 37.603961 10.129500 37.638414 10.128654 37.718082 c 10.119104 37.751690 10.088397 37.757493 9.978023 37.762450 c 9.548978 37.764023 l 9.557319 37.555727 l 9.462298 37.557782 l s +n 9.853681 36.557552 m 9.838328 36.560454 l 9.599325 36.557916 9.422944 36.718461 9.420406 36.957464 c 9.412912 37.086093 9.466830 37.203116 9.563906 37.296082 c 9.642728 37.376595 9.761807 37.417698 9.856828 37.415642 c 9.985457 37.423137 10.084225 37.356767 10.164738 37.277945 c 10.229899 37.202025 10.271002 37.082946 10.278496 36.954317 c 10.274385 36.764276 10.183958 36.622349 9.997663 36.562146 c 9.966111 36.647616 l 10.103444 36.701171 10.151559 36.787487 10.156516 36.897862 c 10.155670 36.977529 10.118315 37.032293 10.062705 37.074606 c 10.004193 37.101565 9.961035 37.125622 9.847760 37.115226 c 9.853681 36.557552 l s +n 9.768092 37.114380 m 9.608756 37.112689 9.517483 37.050430 9.515427 36.955409 c 9.516273 36.875741 9.587237 36.830527 9.731219 36.835120 c 9.777278 36.826416 9.777278 36.826416 9.770630 36.875377 c 9.768092 37.114380 l s +n 9.455643 36.092121 m 9.463865 36.472204 l 9.543533 36.473050 l 9.553083 36.439442 l 9.551027 36.344421 9.566381 36.341520 9.725716 36.343212 c 9.995426 36.339947 l 10.075093 36.340793 l 10.154761 36.341638 10.157662 36.356992 10.147266 36.470267 c 10.242287 36.468212 l 10.248209 35.910538 l 10.153188 35.912594 l 10.158991 35.943300 l 10.148594 36.056576 10.148594 36.056576 10.068927 36.055730 c 9.989259 36.054884 l 9.958552 36.060687 l 9.845277 36.050291 9.719549 36.058149 9.646531 36.008342 c 9.576413 35.973888 9.567709 35.927828 9.525396 35.872218 c 9.561906 35.897122 9.595514 35.906672 9.610867 35.903771 c 9.690535 35.904617 9.743243 35.846951 9.744089 35.767283 c 9.744935 35.687616 9.669015 35.622455 9.589347 35.621609 c 9.494326 35.623665 9.413813 35.702487 9.418770 35.812861 c 9.426628 35.938588 9.508351 36.034455 9.661038 36.085108 c 9.455643 36.092121 l s +n 9.029823 33.986127 m 9.020882 35.116828 l 9.115903 35.114772 l 9.125453 35.081165 l 9.123397 34.986144 9.117594 34.955437 9.130046 34.937182 c 9.157851 34.916026 9.173205 34.913125 9.283579 34.908168 c 10.000588 34.915781 l 10.110962 34.910824 10.129217 34.923276 10.132118 34.938629 c 10.150373 34.951081 10.156176 34.981787 10.158231 35.076808 c 10.148681 35.110416 l 10.243702 35.108361 l 10.257118 34.422058 l 10.162097 34.424113 l 10.155448 34.473075 l 10.157504 34.568096 10.147954 34.601703 10.135502 34.619958 c 10.123050 34.638213 10.104795 34.625761 9.994421 34.630718 c 9.675750 34.627334 l 9.669948 34.596628 l 9.677442 34.467999 9.755054 34.373824 9.896135 34.363064 c 9.894080 34.268043 l 9.321052 34.265023 l 9.323108 34.360044 l 9.485345 34.377089 9.582421 34.470055 9.574927 34.598684 c 9.580730 34.629390 l 9.262059 34.626006 l 9.200646 34.637612 9.182391 34.625160 9.148783 34.615610 c 9.130528 34.603158 9.121824 34.557099 9.125571 34.492784 c 9.119768 34.462078 l 9.127263 34.333449 9.168366 34.214370 9.251781 34.150902 c 9.294939 34.126844 9.368804 34.096983 9.473375 34.061320 c 9.471320 33.966299 l 9.029823 33.986127 l s +n 9.451915 33.484968 m 9.478392 33.877504 l 9.558059 33.878350 l 9.552256 33.847643 l 9.550201 33.752623 9.565554 33.749721 9.709536 33.754314 c 9.994599 33.748148 l 10.074267 33.748994 l 10.153934 33.749839 10.156836 33.765193 10.161793 33.875567 c 10.256814 33.873511 l 10.253185 33.349445 l 10.158164 33.351501 l 10.161065 33.366854 l 10.163121 33.461875 10.150669 33.480130 10.086355 33.476383 c 9.991334 33.478438 l 9.451915 33.484968 l s +n 8.997120 33.602719 m 8.999176 33.697740 9.075096 33.762900 9.154764 33.763746 c 9.234431 33.764592 9.317847 33.701124 9.318692 33.621456 c 9.316637 33.526435 9.228265 33.479529 9.148597 33.478683 c 9.068929 33.477837 8.997966 33.523051 8.997120 33.602719 c 8.997120 33.602719 l s +n 8.990529 32.852616 m 9.022808 33.275858 l 9.117829 33.273802 l 9.127380 33.240194 l 9.125324 33.145173 9.122423 33.129820 9.278856 33.116159 c 9.995866 33.123772 l 10.090887 33.121716 l 10.155201 33.125464 10.158103 33.140817 10.150608 33.269446 c 10.245629 33.267390 l 10.257353 32.740423 l 10.162332 32.742478 l 10.149880 32.760733 l 10.155683 32.791440 10.164388 32.837499 10.151936 32.855754 c 10.136583 32.858656 10.121229 32.861557 10.087621 32.852007 c 9.992601 32.854062 l 8.990529 32.852616 l s +n 9.855263 31.790759 m 9.839910 31.793661 l 9.600907 31.791123 9.424526 31.951668 9.421989 32.190671 c 9.414494 32.319300 9.468412 32.436323 9.565488 32.529288 c 9.644310 32.609802 9.763389 32.650905 9.858410 32.648849 c 9.987039 32.656344 10.085807 32.589974 10.166321 32.511152 c 10.231481 32.435232 10.272584 32.316153 10.280078 32.187524 c 10.275967 31.997482 10.185540 31.855556 9.999245 31.795352 c 9.967693 31.880823 l 10.105026 31.934378 10.153141 32.020694 10.158098 32.131068 c 10.157252 32.210736 10.119897 32.265500 10.064287 32.307812 c 10.005776 32.334772 9.962617 32.358829 9.849342 32.348433 c 9.855263 31.790759 l s +n 9.769674 32.347587 m 9.610339 32.345895 9.519065 32.283636 9.517009 32.188615 c 9.517855 32.108948 9.588819 32.063734 9.732801 32.068327 c 9.778861 32.059623 9.778861 32.059623 9.772212 32.108584 c 9.769674 32.347587 l s +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +n 73.500000 4.000000 m 73.500000 12.000000 l 106.500000 12.000000 l 106.500000 4.000000 l f +n 73.500000 5.500000 m 73.500000 5.500000 1.500000 1.500000 180.000000 270.000000 ellipse f +n 106.500000 5.500000 m 106.500000 5.500000 1.500000 1.500000 270.000000 360.000000 ellipse f +n 72.000000 5.500000 m 72.000000 10.500000 l 108.000000 10.500000 l 108.000000 5.500000 l f +n 73.500000 10.500000 m 73.500000 10.500000 1.500000 1.500000 90.000000 180.000000 ellipse f +n 106.500000 10.500000 m 106.500000 10.500000 1.500000 1.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 73.500000 4.000000 m 106.500000 4.000000 l s +n 73.500000 12.000000 m 106.500000 12.000000 l s +n 73.500000 5.500000 1.500000 1.500000 180.000000 270.000000 ellipse s +n 106.500000 5.500000 1.500000 1.500000 270.000000 360.000000 ellipse s +n 72.000000 5.500000 m 72.000000 10.500000 l s +n 108.000000 5.500000 m 108.000000 10.500000 l s +n 73.500000 10.500000 1.500000 1.500000 90.000000 180.000000 ellipse s +n 106.500000 10.500000 1.500000 1.500000 0.000000 90.000000 ellipse s +gsave 73.788750 8.937500 translate 0.035278 -0.035278 scale +start_ol +1984 14912 moveto +4032 14912 lineto +4032 0 lineto +1984 0 lineto +1984 14912 lineto +end_ol grestore +gsave 74.587998 8.937500 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 76.303887 8.937500 translate 0.035278 -0.035278 scale +start_ol +3776 14400 moveto +3776 11200 lineto +7552 11200 lineto +7552 9792 lineto +3776 9792 lineto +3776 3693 lineto +3776 2319 4149 1927 conicto +4523 1536 5669 1536 conicto +7552 1536 lineto +7552 0 lineto +5669 0 lineto +3540 0 2730 795 conicto +1920 1591 1920 3693 conicto +1920 9792 lineto +576 9792 lineto +576 11200 lineto +1920 11200 lineto +1920 14400 lineto +3776 14400 lineto +end_ol grestore +gsave 77.365396 8.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 79.031336 8.937500 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 80.097839 8.937500 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 81.211793 8.937500 translate 0.035278 -0.035278 scale +start_ol +1728 4380 moveto +1728 11200 lineto +3584 11200 lineto +3584 4450 lineto +3584 2865 4203 2072 conicto +4823 1280 6062 1280 conicto +7551 1280 8415 2228 conicto +9280 3176 9280 4812 conicto +9280 11200 lineto +11136 11200 lineto +11136 0 lineto +9280 0 lineto +9280 1664 lineto +8609 657 7722 168 conicto +6836 -320 5664 -320 conicto +3731 -320 2729 877 conicto +1728 2075 1728 4380 conicto +6372 11456 moveto +6372 11456 lineto +end_ol grestore +gsave 82.927682 8.937500 translate 0.035278 -0.035278 scale +start_ol +3712 1664 moveto +3712 -4288 lineto +1856 -4288 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4294 10479 5181 10967 conicto +6068 11456 7302 11456 conicto +9347 11456 10625 9834 conicto +11904 8212 11904 5568 conicto +11904 2924 10625 1302 conicto +9347 -320 7302 -320 conicto +6068 -320 5181 168 conicto +4294 657 3712 1664 conicto +9984 5568 moveto +9984 7604 9147 8762 conicto +8311 9920 6848 9920 conicto +5385 9920 4548 8762 conicto +3712 7604 3712 5568 conicto +3712 3532 4548 2374 conicto +5385 1216 6848 1216 conicto +8311 1216 9147 2374 conicto +9984 3532 9984 5568 conicto +end_ol grestore +gsave 84.646076 8.937500 translate 0.035278 -0.035278 scale +start_ol +3776 14400 moveto +3776 11200 lineto +7552 11200 lineto +7552 9792 lineto +3776 9792 lineto +3776 3693 lineto +3776 2319 4149 1927 conicto +4523 1536 5669 1536 conicto +7552 1536 lineto +7552 0 lineto +5669 0 lineto +3540 0 2730 795 conicto +1920 1591 1920 3693 conicto +1920 9792 lineto +576 9792 lineto +576 11200 lineto +1920 11200 lineto +1920 14400 lineto +3776 14400 lineto +end_ol grestore +gsave 85.707584 8.937500 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 86.566777 8.937500 translate 0.035278 -0.035278 scale +start_ol +13184 13824 moveto +13184 11712 lineto +12163 12645 11007 13106 conicto +9851 13568 8549 13568 conicto +5987 13568 4625 11996 conicto +3264 10424 3264 7451 conicto +3264 4488 4625 2916 conicto +5987 1344 8549 1344 conicto +9851 1344 11007 1821 conicto +12163 2299 13184 3264 conicto +13184 1152 lineto +12125 416 10940 48 conicto +9756 -320 8437 -320 conicto +5049 -320 3100 1763 conicto +1152 3847 1152 7451 conicto +1152 11065 3100 13148 conicto +5049 15232 8437 15232 conicto +9776 15232 10960 14880 conicto +12145 14528 13184 13824 conicto +end_ol grestore +gsave 88.457506 8.937500 translate 0.035278 -0.035278 scale +start_ol +6309 9920 moveto +4812 9920 3942 8756 conicto +3072 7593 3072 5568 conicto +3072 3543 3937 2379 conicto +4802 1216 6309 1216 conicto +7796 1216 8666 2384 conicto +9536 3553 9536 5568 conicto +9536 7573 8666 8746 conicto +7796 9920 6309 9920 conicto +6304 11456 moveto +8710 11456 10083 9894 conicto +11456 8332 11456 5568 conicto +11456 2814 10083 1247 conicto +8710 -320 6304 -320 conicto +3888 -320 2520 1247 conicto +1152 2814 1152 5568 conicto +1152 8332 2520 9894 conicto +3888 11456 6304 11456 conicto +end_ol grestore +gsave 90.113459 8.937500 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 91.829348 8.937500 translate 0.035278 -0.035278 scale +start_ol +3776 14400 moveto +3776 11200 lineto +7552 11200 lineto +7552 9792 lineto +3776 9792 lineto +3776 3693 lineto +3776 2319 4149 1927 conicto +4523 1536 5669 1536 conicto +7552 1536 lineto +7552 0 lineto +5669 0 lineto +3540 0 2730 795 conicto +1920 1591 1920 3693 conicto +1920 9792 lineto +576 9792 lineto +576 11200 lineto +1920 11200 lineto +1920 14400 lineto +3776 14400 lineto +end_ol grestore +gsave 92.890856 8.937500 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 93.944865 8.937500 translate 0.035278 -0.035278 scale +start_ol +6309 9920 moveto +4812 9920 3942 8756 conicto +3072 7593 3072 5568 conicto +3072 3543 3937 2379 conicto +4802 1216 6309 1216 conicto +7796 1216 8666 2384 conicto +9536 3553 9536 5568 conicto +9536 7573 8666 8746 conicto +7796 9920 6309 9920 conicto +6304 11456 moveto +8710 11456 10083 9894 conicto +11456 8332 11456 5568 conicto +11456 2814 10083 1247 conicto +8710 -320 6304 -320 conicto +3888 -320 2520 1247 conicto +1152 2814 1152 5568 conicto +1152 8332 2520 9894 conicto +3888 11456 6304 11456 conicto +end_ol grestore +gsave 95.600818 8.937500 translate 0.035278 -0.035278 scale +start_ol +1920 15552 moveto +3776 15552 lineto +3776 0 lineto +1920 0 lineto +1920 15552 lineto +end_ol grestore +gsave 96.352615 8.937500 translate 0.035278 -0.035278 scale +start_ol +1920 15552 moveto +3776 15552 lineto +3776 0 lineto +1920 0 lineto +1920 15552 lineto +end_ol grestore +gsave 97.104412 8.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 98.770353 8.937500 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 99.884307 8.937500 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 100.743500 8.937500 translate 0.035278 -0.035278 scale +start_ol +6400 15552 moveto +5036 13252 4374 11002 conicto +3712 8752 3712 6442 conicto +3712 4132 4379 1867 conicto +5046 -398 6400 -2688 conicto +4771 -2688 lineto +3277 -338 2534 1932 conicto +1792 4202 1792 6442 conicto +1792 8672 2529 10932 conicto +3267 13192 4771 15552 conicto +6400 15552 lineto +end_ol grestore +gsave 101.800006 8.937500 translate 0.035278 -0.035278 scale +start_ol +11264 11200 moveto +7205 5750 lineto +11456 0 lineto +9288 0 lineto +6032 4400 lineto +2756 0 lineto +576 0 lineto +4949 5860 lineto +960 11200 lineto +3135 11200 lineto +6112 7210 lineto +9089 11200 lineto +11264 11200 lineto +end_ol grestore +gsave 103.401008 8.937500 translate 0.035278 -0.035278 scale +start_ol +3918 1728 moveto +10960 1728 lineto +10960 0 lineto +1472 0 lineto +1472 1728 lineto +2620 2916 4602 4916 conicto +6585 6917 7094 7496 conicto +8063 8584 8447 9337 conicto +8832 10091 8832 10819 conicto +8832 12007 8001 12755 conicto +7171 13504 5838 13504 conicto +4893 13504 3843 13186 conicto +2794 12869 1600 12224 conicto +1600 14272 lineto +2817 14747 3875 14989 conicto +4933 15232 5811 15232 conicto +8126 15232 9503 14071 conicto +10880 12911 10880 10971 conicto +10880 10050 10535 9225 conicto +10191 8400 9282 7280 conicto +9032 6990 7693 5604 conicto +6355 4219 3918 1728 conicto +end_ol grestore +gsave 105.124396 8.937500 translate 0.035278 -0.035278 scale +start_ol +1664 15552 moveto +3293 15552 lineto +4787 13192 5529 10932 conicto +6272 8672 6272 6442 conicto +6272 4202 5529 1932 conicto +4787 -338 3293 -2688 conicto +1664 -2688 lineto +3018 -398 3685 1867 conicto +4352 4132 4352 6442 conicto +4352 8752 3685 11002 conicto +3018 13252 1664 15552 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 1.000000 srgb +n 73.500000 14.000000 m 73.500000 22.000000 l 106.500000 22.000000 l 106.500000 14.000000 l f +n 73.500000 15.500000 m 73.500000 15.500000 1.500000 1.500000 180.000000 270.000000 ellipse f +n 106.500000 15.500000 m 106.500000 15.500000 1.500000 1.500000 270.000000 360.000000 ellipse f +n 72.000000 15.500000 m 72.000000 20.500000 l 108.000000 20.500000 l 108.000000 15.500000 l f +n 73.500000 20.500000 m 73.500000 20.500000 1.500000 1.500000 90.000000 180.000000 ellipse f +n 106.500000 20.500000 m 106.500000 20.500000 1.500000 1.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 73.500000 14.000000 m 106.500000 14.000000 l s +n 73.500000 22.000000 m 106.500000 22.000000 l s +n 73.500000 15.500000 1.500000 1.500000 180.000000 270.000000 ellipse s +n 106.500000 15.500000 1.500000 1.500000 270.000000 360.000000 ellipse s +n 72.000000 15.500000 m 72.000000 20.500000 l s +n 108.000000 15.500000 m 108.000000 20.500000 l s +n 73.500000 20.500000 1.500000 1.500000 90.000000 180.000000 ellipse s +n 106.500000 20.500000 1.500000 1.500000 0.000000 90.000000 ellipse s +gsave 78.928750 18.937500 translate 0.035278 -0.035278 scale +start_ol +704 14912 moveto +2742 14912 lineto +5879 2307 lineto +9005 14912 lineto +11273 14912 lineto +14409 2307 lineto +17536 14912 lineto +19584 14912 lineto +15838 0 lineto +13301 0 lineto +10154 12944 lineto +6977 0 lineto +4440 0 lineto +704 14912 lineto +end_ol grestore +gsave 81.433908 18.937500 translate 0.035278 -0.035278 scale +start_ol +7008 5568 moveto +4786 5568 3929 5061 conicto +3072 4555 3072 3332 conicto +3072 2359 3715 1787 conicto +4358 1216 5464 1216 conicto +6988 1216 7910 2294 conicto +8832 3372 8832 5161 conicto +8832 5568 lineto +7008 5568 lineto +10688 6345 moveto +10688 0 lineto +8832 0 lineto +8832 1664 lineto +8202 647 7262 163 conicto +6323 -320 4964 -320 conicto +3245 -320 2230 645 conicto +1216 1610 1216 3230 conicto +1216 5120 2482 6080 conicto +3749 7040 6261 7040 conicto +8832 7040 lineto +8832 7226 lineto +8832 8512 7999 9216 conicto +7166 9920 5659 9920 conicto +4702 9920 3794 9696 conicto +2886 9472 2048 9024 conicto +2048 10752 lineto +3058 11104 4008 11280 conicto +4958 11456 5858 11456 conicto +8288 11456 9488 10188 conicto +10688 8921 10688 6345 conicto +end_ol grestore +gsave 83.092357 18.937500 translate 0.035278 -0.035278 scale +start_ol +3776 14400 moveto +3776 11200 lineto +7552 11200 lineto +7552 9792 lineto +3776 9792 lineto +3776 3693 lineto +3776 2319 4149 1927 conicto +4523 1536 5669 1536 conicto +7552 1536 lineto +7552 0 lineto +5669 0 lineto +3540 0 2730 795 conicto +1920 1591 1920 3693 conicto +1920 9792 lineto +576 9792 lineto +576 11200 lineto +1920 11200 lineto +1920 14400 lineto +3776 14400 lineto +end_ol grestore +gsave 84.153866 18.937500 translate 0.035278 -0.035278 scale +start_ol +9984 10816 moveto +9984 9088 lineto +9205 9504 8421 9712 conicto +7637 9920 6838 9920 conicto +5050 9920 4061 8776 conicto +3072 7633 3072 5568 conicto +3072 3503 4061 2359 conicto +5050 1216 6838 1216 conicto +7637 1216 8421 1424 conicto +9205 1632 9984 2048 conicto +9984 320 lineto +9216 0 8394 -160 conicto +7572 -320 6645 -320 conicto +4123 -320 2637 1272 conicto +1152 2864 1152 5568 conicto +1152 8312 2652 9884 conicto +4152 11456 6764 11456 conicto +7612 11456 8419 11296 conicto +9226 11136 9984 10816 conicto +end_ol grestore +gsave 85.642469 18.937500 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 15552 lineto +3712 15552 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 87.358358 18.937500 translate 0.035278 -0.035278 scale +start_ol +9280 9472 moveto +9280 15552 lineto +11136 15552 lineto +11136 0 lineto +9280 0 lineto +9280 1664 lineto +8703 657 7822 168 conicto +6942 -320 5708 -320 conicto +3689 -320 2420 1302 conicto +1152 2924 1152 5568 conicto +1152 8212 2420 9834 conicto +3689 11456 5708 11456 conicto +6942 11456 7822 10967 conicto +8703 10479 9280 9472 conicto +3072 5568 moveto +3072 3532 3898 2374 conicto +4725 1216 6171 1216 conicto +7617 1216 8448 2374 conicto +9280 3532 9280 5568 conicto +9280 7604 8448 8762 conicto +7617 9920 6171 9920 conicto +4725 9920 3898 8762 conicto +3072 7604 3072 5568 conicto +end_ol grestore +gsave 89.076753 18.937500 translate 0.035278 -0.035278 scale +start_ol +6309 9920 moveto +4812 9920 3942 8756 conicto +3072 7593 3072 5568 conicto +3072 3543 3937 2379 conicto +4802 1216 6309 1216 conicto +7796 1216 8666 2384 conicto +9536 3553 9536 5568 conicto +9536 7573 8666 8746 conicto +7796 9920 6309 9920 conicto +6304 11456 moveto +8710 11456 10083 9894 conicto +11456 8332 11456 5568 conicto +11456 2814 10083 1247 conicto +8710 -320 6304 -320 conicto +3888 -320 2520 1247 conicto +1152 2814 1152 5568 conicto +1152 8332 2520 9894 conicto +3888 11456 6304 11456 conicto +end_ol grestore +gsave 90.732705 18.937500 translate 0.035278 -0.035278 scale +start_ol +9280 5723 moveto +9280 7722 8463 8821 conicto +7646 9920 6171 9920 conicto +4706 9920 3889 8821 conicto +3072 7722 3072 5723 conicto +3072 3734 3889 2635 conicto +4706 1536 6171 1536 conicto +7646 1536 8463 2635 conicto +9280 3734 9280 5723 conicto +11136 1386 moveto +11136 -1486 9869 -2887 conicto +8602 -4288 5988 -4288 conicto +5020 -4288 4162 -4146 conicto +3304 -4005 2496 -3712 conicto +2496 -1920 lineto +3302 -2346 4087 -2549 conicto +4873 -2752 5689 -2752 conicto +7490 -2752 8385 -1805 conicto +9280 -858 9280 1057 conicto +9280 1984 lineto +8713 987 7827 493 conicto +6942 0 5708 0 conicto +3659 0 2405 1568 conicto +1152 3136 1152 5723 conicto +1152 8320 2405 9888 conicto +3659 11456 5708 11456 conicto +6942 11456 7827 10962 conicto +8713 10469 9280 9472 conicto +9280 11200 lineto +11136 11200 lineto +11136 1386 lineto +end_ol grestore +gsave 92.451100 18.937500 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 93.310293 18.937500 translate 0.035278 -0.035278 scale +start_ol +-64 14912 moveto +12608 14912 lineto +12608 13184 lineto +7296 13184 lineto +7296 0 lineto +5248 0 lineto +5248 13184 lineto +-64 13184 lineto +-64 14912 lineto +end_ol grestore +gsave 94.881323 18.937500 translate 0.035278 -0.035278 scale +start_ol +1920 11200 moveto +3776 11200 lineto +3776 0 lineto +1920 0 lineto +1920 11200 lineto +1920 15552 moveto +3776 15552 lineto +3776 13248 lineto +1920 13248 lineto +1920 15552 lineto +end_ol grestore +gsave 95.633120 18.937500 translate 0.035278 -0.035278 scale +start_ol +10633 9061 moveto +11321 10288 12279 10872 conicto +13237 11456 14534 11456 conicto +16280 11456 17228 10237 conicto +18176 9018 18176 6769 conicto +18176 0 lineto +16320 0 lineto +16320 6708 lineto +16320 8307 15752 9081 conicto +15185 9856 14020 9856 conicto +12597 9856 11770 8912 conicto +10944 7968 10944 6338 conicto +10944 0 lineto +9088 0 lineto +9088 6708 lineto +9088 8317 8520 9086 conicto +7953 9856 6768 9856 conicto +5365 9856 4538 8907 conicto +3712 7958 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4340 10489 5217 10972 conicto +6095 11456 7302 11456 conicto +8519 11456 9371 10842 conicto +10224 10229 10633 9061 conicto +end_ol grestore +gsave 98.270652 18.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 99.936592 18.937500 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 1.000000 srgb +n 73.500000 24.000000 m 73.500000 32.000000 l 106.500000 32.000000 l 106.500000 24.000000 l f +n 73.500000 25.500000 m 73.500000 25.500000 1.500000 1.500000 180.000000 270.000000 ellipse f +n 106.500000 25.500000 m 106.500000 25.500000 1.500000 1.500000 270.000000 360.000000 ellipse f +n 72.000000 25.500000 m 72.000000 30.500000 l 108.000000 30.500000 l 108.000000 25.500000 l f +n 73.500000 30.500000 m 73.500000 30.500000 1.500000 1.500000 90.000000 180.000000 ellipse f +n 106.500000 30.500000 m 106.500000 30.500000 1.500000 1.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 73.500000 24.000000 m 106.500000 24.000000 l s +n 73.500000 32.000000 m 106.500000 32.000000 l s +n 73.500000 25.500000 1.500000 1.500000 180.000000 270.000000 ellipse s +n 106.500000 25.500000 1.500000 1.500000 270.000000 360.000000 ellipse s +n 72.000000 25.500000 m 72.000000 30.500000 l s +n 108.000000 25.500000 m 108.000000 30.500000 l s +n 73.500000 30.500000 1.500000 1.500000 90.000000 180.000000 ellipse s +n 106.500000 30.500000 1.500000 1.500000 0.000000 90.000000 ellipse s +gsave 76.583750 28.937500 translate 0.035278 -0.035278 scale +start_ol +12224 2099 moveto +12224 6080 lineto +8896 6080 lineto +8896 7744 lineto +14208 7744 lineto +14208 1364 lineto +13037 532 11625 106 conicto +10213 -320 8611 -320 conicto +5107 -320 3129 1733 conicto +1152 3786 1152 7451 conicto +1152 11126 3130 13179 conicto +5109 15232 8615 15232 conicto +10077 15232 11394 14875 conicto +12712 14518 13824 13824 conicto +13824 11648 lineto +12700 12603 11435 13085 conicto +10170 13568 8775 13568 conicto +6024 13568 4644 12031 conicto +3264 10494 3264 7451 conicto +3264 4418 4646 2881 conicto +6029 1344 8785 1344 conicto +9861 1344 10705 1528 conicto +11550 1712 12224 2099 conicto +end_ol grestore +gsave 78.681788 28.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 80.347729 28.937500 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 82.063618 28.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 83.729559 28.937500 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 84.843512 28.937500 translate 0.035278 -0.035278 scale +start_ol +1920 11200 moveto +3776 11200 lineto +3776 0 lineto +1920 0 lineto +1920 11200 lineto +1920 15552 moveto +3776 15552 lineto +3776 13248 lineto +1920 13248 lineto +1920 15552 lineto +end_ol grestore +gsave 85.595310 28.937500 translate 0.035278 -0.035278 scale +start_ol +9984 10816 moveto +9984 9088 lineto +9205 9504 8421 9712 conicto +7637 9920 6838 9920 conicto +5050 9920 4061 8776 conicto +3072 7633 3072 5568 conicto +3072 3503 4061 2359 conicto +5050 1216 6838 1216 conicto +7637 1216 8421 1424 conicto +9205 1632 9984 2048 conicto +9984 320 lineto +9216 0 8394 -160 conicto +7572 -320 6645 -320 conicto +4123 -320 2637 1272 conicto +1152 2864 1152 5568 conicto +1152 8312 2652 9884 conicto +4152 11456 6764 11456 conicto +7612 11456 8419 11296 conicto +9226 11136 9984 10816 conicto +end_ol grestore +gsave 87.083913 28.937500 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 87.943106 28.937500 translate 0.035278 -0.035278 scale +start_ol +-64 14912 moveto +12608 14912 lineto +12608 13184 lineto +7296 13184 lineto +7296 0 lineto +5248 0 lineto +5248 13184 lineto +-64 13184 lineto +-64 14912 lineto +end_ol grestore +gsave 89.514136 28.937500 translate 0.035278 -0.035278 scale +start_ol +1920 11200 moveto +3776 11200 lineto +3776 0 lineto +1920 0 lineto +1920 11200 lineto +1920 15552 moveto +3776 15552 lineto +3776 13248 lineto +1920 13248 lineto +1920 15552 lineto +end_ol grestore +gsave 90.265933 28.937500 translate 0.035278 -0.035278 scale +start_ol +10633 9061 moveto +11321 10288 12279 10872 conicto +13237 11456 14534 11456 conicto +16280 11456 17228 10237 conicto +18176 9018 18176 6769 conicto +18176 0 lineto +16320 0 lineto +16320 6708 lineto +16320 8307 15752 9081 conicto +15185 9856 14020 9856 conicto +12597 9856 11770 8912 conicto +10944 7968 10944 6338 conicto +10944 0 lineto +9088 0 lineto +9088 6708 lineto +9088 8317 8520 9086 conicto +7953 9856 6768 9856 conicto +5365 9856 4538 8907 conicto +3712 7958 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4340 10489 5217 10972 conicto +6095 11456 7302 11456 conicto +8519 11456 9371 10842 conicto +10224 10229 10633 9061 conicto +end_ol grestore +gsave 92.903465 28.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 94.569406 28.937500 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 95.683359 28.937500 translate 0.035278 -0.035278 scale +start_ol +9152 10816 moveto +9152 9088 lineto +8366 9504 7520 9712 conicto +6674 9920 5768 9920 conicto +4388 9920 3698 9498 conicto +3008 9076 3008 8231 conicto +3008 7588 3497 7221 conicto +3986 6854 5463 6522 conicto +6092 6382 lineto +8066 5962 8897 5196 conicto +9728 4431 9728 3061 conicto +9728 1501 8490 590 conicto +7253 -320 5089 -320 conicto +4188 -320 3211 -144 conicto +2234 32 1152 384 conicto +1152 2304 lineto +2170 1760 3158 1488 conicto +4146 1216 5114 1216 conicto +6411 1216 7109 1662 conicto +7808 2109 7808 2923 conicto +7808 3675 7304 4077 conicto +6800 4479 5094 4850 conicto +4455 5000 lineto +2740 5360 1978 6106 conicto +1216 6852 1216 8153 conicto +1216 9734 2344 10595 conicto +3472 11456 5547 11456 conicto +6574 11456 7480 11296 conicto +8387 11136 9152 10816 conicto +end_ol grestore +gsave 97.094539 28.937500 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 97.953732 28.937500 translate 0.035278 -0.035278 scale +start_ol +6400 15552 moveto +5036 13252 4374 11002 conicto +3712 8752 3712 6442 conicto +3712 4132 4379 1867 conicto +5046 -398 6400 -2688 conicto +4771 -2688 lineto +3277 -338 2534 1932 conicto +1792 4202 1792 6442 conicto +1792 8672 2529 10932 conicto +3267 13192 4771 15552 conicto +6400 15552 lineto +end_ol grestore +gsave 99.010238 28.937500 translate 0.035278 -0.035278 scale +start_ol +11264 11200 moveto +7205 5750 lineto +11456 0 lineto +9288 0 lineto +6032 4400 lineto +2756 0 lineto +576 0 lineto +4949 5860 lineto +960 11200 lineto +3135 11200 lineto +6112 7210 lineto +9089 11200 lineto +11264 11200 lineto +end_ol grestore +gsave 100.611240 28.937500 translate 0.035278 -0.035278 scale +start_ol +8353 8070 moveto +9784 7758 10588 6772 conicto +11392 5786 11392 4338 conicto +11392 2115 9868 897 conicto +8344 -320 5537 -320 conicto +4594 -320 3596 -128 conicto +2599 64 1536 448 conicto +1536 2368 lineto +2382 1893 3388 1650 conicto +4395 1408 5492 1408 conicto +7405 1408 8406 2160 conicto +9408 2913 9408 4348 conicto +9408 5673 8473 6420 conicto +7539 7168 5872 7168 conicto +4096 7168 lineto +4096 8832 lineto +5954 8832 lineto +7475 8832 8281 9424 conicto +9088 10017 9088 11133 conicto +9088 12279 8256 12891 conicto +7424 13504 5872 13504 conicto +5038 13504 4083 13333 conicto +3129 13162 1984 12800 conicto +1984 14592 lineto +3141 14912 4152 15072 conicto +5164 15232 6060 15232 conicto +8375 15232 9723 14185 conicto +11072 13138 11072 11356 conicto +11072 10113 10365 9257 conicto +9658 8401 8353 8070 conicto +end_ol grestore +gsave 102.334629 28.937500 translate 0.035278 -0.035278 scale +start_ol +1664 15552 moveto +3293 15552 lineto +4787 13192 5529 10932 conicto +6272 8672 6272 6442 conicto +6272 4202 5529 1932 conicto +4787 -338 3293 -2688 conicto +1664 -2688 lineto +3018 -398 3685 1867 conicto +4352 4132 4352 6442 conicto +4352 8752 3685 11002 conicto +3018 13252 1664 15552 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 1.000000 srgb +n 73.500000 34.000000 m 73.500000 42.000000 l 106.500000 42.000000 l 106.500000 34.000000 l f +n 73.500000 35.500000 m 73.500000 35.500000 1.500000 1.500000 180.000000 270.000000 ellipse f +n 106.500000 35.500000 m 106.500000 35.500000 1.500000 1.500000 270.000000 360.000000 ellipse f +n 72.000000 35.500000 m 72.000000 40.500000 l 108.000000 40.500000 l 108.000000 35.500000 l f +n 73.500000 40.500000 m 73.500000 40.500000 1.500000 1.500000 90.000000 180.000000 ellipse f +n 106.500000 40.500000 m 106.500000 40.500000 1.500000 1.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 73.500000 34.000000 m 106.500000 34.000000 l s +n 73.500000 42.000000 m 106.500000 42.000000 l s +n 73.500000 35.500000 1.500000 1.500000 180.000000 270.000000 ellipse s +n 106.500000 35.500000 1.500000 1.500000 270.000000 360.000000 ellipse s +n 72.000000 35.500000 m 72.000000 40.500000 l s +n 108.000000 35.500000 m 108.000000 40.500000 l s +n 73.500000 40.500000 1.500000 1.500000 90.000000 180.000000 ellipse s +n 106.500000 40.500000 1.500000 1.500000 0.000000 90.000000 ellipse s +gsave 86.368750 38.937500 translate 0.035278 -0.035278 scale +start_ol +1984 14912 moveto +4032 14912 lineto +4032 1062 lineto +4032 -1647 3000 -2871 conicto +1968 -4096 -317 -4096 conicto +-1088 -4096 lineto +-1088 -2368 lineto +-458 -2368 lineto +883 -2368 1433 -1620 conicto +1984 -872 1984 1062 conicto +1984 14912 lineto +end_ol grestore +gsave 87.167998 38.937500 translate 0.035278 -0.035278 scale +start_ol +1920 11200 moveto +3776 11200 lineto +3776 0 lineto +1920 0 lineto +1920 11200 lineto +1920 15552 moveto +3776 15552 lineto +3776 13248 lineto +1920 13248 lineto +1920 15552 lineto +end_ol grestore +gsave 87.919795 38.937500 translate 0.035278 -0.035278 scale +start_ol +7616 15552 moveto +7616 14016 lineto +5856 14016 lineto +4866 14016 4476 13618 conicto +4096 13220 4096 12185 conicto +4096 11200 lineto +9152 11200 lineto +9152 11979 lineto +9152 13845 10023 14694 conicto +10303 14973 10694 15163 conicto +11475 15552 12786 15552 conicto +14528 15552 lineto +14528 14016 lineto +12768 14016 lineto +11778 14016 11393 13618 conicto +11008 13220 11008 12185 conicto +11008 11200 lineto +17920 11200 lineto +17920 0 lineto +16064 0 lineto +16064 9792 lineto +11008 9792 lineto +11008 0 lineto +9152 0 lineto +9152 9792 lineto +4096 9792 lineto +4096 0 lineto +2240 0 lineto +2240 9792 lineto +448 9792 lineto +448 11200 lineto +2240 11200 lineto +2240 11979 lineto +2240 13845 3111 14698 conicto +3982 15552 5874 15552 conicto +7616 15552 lineto +16064 15552 moveto +17920 15552 lineto +17920 13248 lineto +16064 13248 lineto +16064 15552 lineto +end_ol grestore +gsave 90.537343 38.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 92.203284 38.937500 translate 0.035278 -0.035278 scale +start_ol +9152 10816 moveto +9152 9088 lineto +8366 9504 7520 9712 conicto +6674 9920 5768 9920 conicto +4388 9920 3698 9498 conicto +3008 9076 3008 8231 conicto +3008 7588 3497 7221 conicto +3986 6854 5463 6522 conicto +6092 6382 lineto +8066 5962 8897 5196 conicto +9728 4431 9728 3061 conicto +9728 1501 8490 590 conicto +7253 -320 5089 -320 conicto +4188 -320 3211 -144 conicto +2234 32 1152 384 conicto +1152 2304 lineto +2170 1760 3158 1488 conicto +4146 1216 5114 1216 conicto +6411 1216 7109 1662 conicto +7808 2109 7808 2923 conicto +7808 3675 7304 4077 conicto +6800 4479 5094 4850 conicto +4455 5000 lineto +2740 5360 1978 6106 conicto +1216 6852 1216 8153 conicto +1216 9734 2344 10595 conicto +3472 11456 5547 11456 conicto +6574 11456 7480 11296 conicto +8387 11136 9152 10816 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 1.000000 srgb +n 73.500000 44.000000 m 73.500000 52.000000 l 106.500000 52.000000 l 106.500000 44.000000 l f +n 73.500000 45.500000 m 73.500000 45.500000 1.500000 1.500000 180.000000 270.000000 ellipse f +n 106.500000 45.500000 m 106.500000 45.500000 1.500000 1.500000 270.000000 360.000000 ellipse f +n 72.000000 45.500000 m 72.000000 50.500000 l 108.000000 50.500000 l 108.000000 45.500000 l f +n 73.500000 50.500000 m 73.500000 50.500000 1.500000 1.500000 90.000000 180.000000 ellipse f +n 106.500000 50.500000 m 106.500000 50.500000 1.500000 1.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 73.500000 44.000000 m 106.500000 44.000000 l s +n 73.500000 52.000000 m 106.500000 52.000000 l s +n 73.500000 45.500000 1.500000 1.500000 180.000000 270.000000 ellipse s +n 106.500000 45.500000 1.500000 1.500000 270.000000 360.000000 ellipse s +n 72.000000 45.500000 m 72.000000 50.500000 l s +n 108.000000 45.500000 m 108.000000 50.500000 l s +n 73.500000 50.500000 1.500000 1.500000 90.000000 180.000000 ellipse s +n 106.500000 50.500000 1.500000 1.500000 0.000000 90.000000 ellipse s +gsave 77.508750 48.937500 translate 0.035278 -0.035278 scale +start_ol +1984 14912 moveto +5011 14912 lineto +8795 4776 lineto +12599 14912 lineto +15616 14912 lineto +15616 0 lineto +13632 0 lineto +13632 13096 lineto +9808 2880 lineto +7792 2880 lineto +3968 13096 lineto +3968 0 lineto +1984 0 lineto +1984 14912 lineto +end_ol grestore +gsave 79.844062 48.937500 translate 0.035278 -0.035278 scale +start_ol +7008 5568 moveto +4786 5568 3929 5061 conicto +3072 4555 3072 3332 conicto +3072 2359 3715 1787 conicto +4358 1216 5464 1216 conicto +6988 1216 7910 2294 conicto +8832 3372 8832 5161 conicto +8832 5568 lineto +7008 5568 lineto +10688 6345 moveto +10688 0 lineto +8832 0 lineto +8832 1664 lineto +8202 647 7262 163 conicto +6323 -320 4964 -320 conicto +3245 -320 2230 645 conicto +1216 1610 1216 3230 conicto +1216 5120 2482 6080 conicto +3749 7040 6261 7040 conicto +8832 7040 lineto +8832 7226 lineto +8832 8512 7999 9216 conicto +7166 9920 5659 9920 conicto +4702 9920 3794 9696 conicto +2886 9472 2048 9024 conicto +2048 10752 lineto +3058 11104 4008 11280 conicto +4958 11456 5858 11456 conicto +8288 11456 9488 10188 conicto +10688 8921 10688 6345 conicto +end_ol grestore +gsave 81.502511 48.937500 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 83.218400 48.937500 translate 0.035278 -0.035278 scale +start_ol +1728 4380 moveto +1728 11200 lineto +3584 11200 lineto +3584 4450 lineto +3584 2865 4203 2072 conicto +4823 1280 6062 1280 conicto +7551 1280 8415 2228 conicto +9280 3176 9280 4812 conicto +9280 11200 lineto +11136 11200 lineto +11136 0 lineto +9280 0 lineto +9280 1664 lineto +8609 657 7722 168 conicto +6836 -320 5664 -320 conicto +3731 -320 2729 877 conicto +1728 2075 1728 4380 conicto +6372 11456 moveto +6372 11456 lineto +end_ol grestore +gsave 84.934290 48.937500 translate 0.035278 -0.035278 scale +start_ol +7008 5568 moveto +4786 5568 3929 5061 conicto +3072 4555 3072 3332 conicto +3072 2359 3715 1787 conicto +4358 1216 5464 1216 conicto +6988 1216 7910 2294 conicto +8832 3372 8832 5161 conicto +8832 5568 lineto +7008 5568 lineto +10688 6345 moveto +10688 0 lineto +8832 0 lineto +8832 1664 lineto +8202 647 7262 163 conicto +6323 -320 4964 -320 conicto +3245 -320 2230 645 conicto +1216 1610 1216 3230 conicto +1216 5120 2482 6080 conicto +3749 7040 6261 7040 conicto +8832 7040 lineto +8832 7226 lineto +8832 8512 7999 9216 conicto +7166 9920 5659 9920 conicto +4702 9920 3794 9696 conicto +2886 9472 2048 9024 conicto +2048 10752 lineto +3058 11104 4008 11280 conicto +4958 11456 5858 11456 conicto +8288 11456 9488 10188 conicto +10688 8921 10688 6345 conicto +end_ol grestore +gsave 86.592739 48.937500 translate 0.035278 -0.035278 scale +start_ol +1920 15552 moveto +3776 15552 lineto +3776 0 lineto +1920 0 lineto +1920 15552 lineto +end_ol grestore +gsave 87.344536 48.937500 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 88.203729 48.937500 translate 0.035278 -0.035278 scale +start_ol +13184 13824 moveto +13184 11712 lineto +12163 12645 11007 13106 conicto +9851 13568 8549 13568 conicto +5987 13568 4625 11996 conicto +3264 10424 3264 7451 conicto +3264 4488 4625 2916 conicto +5987 1344 8549 1344 conicto +9851 1344 11007 1821 conicto +12163 2299 13184 3264 conicto +13184 1152 lineto +12125 416 10940 48 conicto +9756 -320 8437 -320 conicto +5049 -320 3100 1763 conicto +1152 3847 1152 7451 conicto +1152 11065 3100 13148 conicto +5049 15232 8437 15232 conicto +9776 15232 10960 14880 conicto +12145 14528 13184 13824 conicto +end_ol grestore +gsave 90.094458 48.937500 translate 0.035278 -0.035278 scale +start_ol +7008 5568 moveto +4786 5568 3929 5061 conicto +3072 4555 3072 3332 conicto +3072 2359 3715 1787 conicto +4358 1216 5464 1216 conicto +6988 1216 7910 2294 conicto +8832 3372 8832 5161 conicto +8832 5568 lineto +7008 5568 lineto +10688 6345 moveto +10688 0 lineto +8832 0 lineto +8832 1664 lineto +8202 647 7262 163 conicto +6323 -320 4964 -320 conicto +3245 -320 2230 645 conicto +1216 1610 1216 3230 conicto +1216 5120 2482 6080 conicto +3749 7040 6261 7040 conicto +8832 7040 lineto +8832 7226 lineto +8832 8512 7999 9216 conicto +7166 9920 5659 9920 conicto +4702 9920 3794 9696 conicto +2886 9472 2048 9024 conicto +2048 10752 lineto +3058 11104 4008 11280 conicto +4958 11456 5858 11456 conicto +8288 11456 9488 10188 conicto +10688 8921 10688 6345 conicto +end_ol grestore +gsave 91.752908 48.937500 translate 0.035278 -0.035278 scale +start_ol +9984 10816 moveto +9984 9088 lineto +9205 9504 8421 9712 conicto +7637 9920 6838 9920 conicto +5050 9920 4061 8776 conicto +3072 7633 3072 5568 conicto +3072 3503 4061 2359 conicto +5050 1216 6838 1216 conicto +7637 1216 8421 1424 conicto +9205 1632 9984 2048 conicto +9984 320 lineto +9216 0 8394 -160 conicto +7572 -320 6645 -320 conicto +4123 -320 2637 1272 conicto +1152 2864 1152 5568 conicto +1152 8312 2652 9884 conicto +4152 11456 6764 11456 conicto +7612 11456 8419 11296 conicto +9226 11136 9984 10816 conicto +end_ol grestore +gsave 93.241512 48.937500 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 15552 lineto +3712 15552 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 94.957401 48.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 96.623341 48.937500 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 97.482534 48.937500 translate 0.035278 -0.035278 scale +start_ol +6400 15552 moveto +5036 13252 4374 11002 conicto +3712 8752 3712 6442 conicto +3712 4132 4379 1867 conicto +5046 -398 6400 -2688 conicto +4771 -2688 lineto +3277 -338 2534 1932 conicto +1792 4202 1792 6442 conicto +1792 8672 2529 10932 conicto +3267 13192 4771 15552 conicto +6400 15552 lineto +end_ol grestore +gsave 98.539040 48.937500 translate 0.035278 -0.035278 scale +start_ol +3904 2560 moveto +5952 2560 lineto +5952 0 lineto +3904 0 lineto +3904 2560 lineto +5888 4032 moveto +3968 4032 lineto +3968 5574 lineto +3968 6586 4249 7237 conicto +4531 7888 5436 8749 conicto +6343 9640 lineto +6914 10167 7169 10634 conicto +7424 11102 7424 11589 conicto +7424 12474 6767 13021 conicto +6111 13568 5029 13568 conicto +4238 13568 3341 13224 conicto +2444 12881 1472 12224 conicto +1472 14080 lineto +2416 14661 3384 14946 conicto +4353 15232 5387 15232 conicto +7234 15232 8353 14261 conicto +9472 13291 9472 11700 conicto +9472 10940 9109 10254 conicto +8746 9569 7838 8709 conicto +6953 7848 lineto +6481 7377 6285 7111 conicto +6089 6846 6009 6596 conicto +5948 6386 5918 6085 conicto +5888 5785 5888 5264 conicto +5888 4032 lineto +end_ol grestore +gsave 99.975199 48.937500 translate 0.035278 -0.035278 scale +start_ol +3904 2560 moveto +5952 2560 lineto +5952 0 lineto +3904 0 lineto +3904 2560 lineto +5888 4032 moveto +3968 4032 lineto +3968 5574 lineto +3968 6586 4249 7237 conicto +4531 7888 5436 8749 conicto +6343 9640 lineto +6914 10167 7169 10634 conicto +7424 11102 7424 11589 conicto +7424 12474 6767 13021 conicto +6111 13568 5029 13568 conicto +4238 13568 3341 13224 conicto +2444 12881 1472 12224 conicto +1472 14080 lineto +2416 14661 3384 14946 conicto +4353 15232 5387 15232 conicto +7234 15232 8353 14261 conicto +9472 13291 9472 11700 conicto +9472 10940 9109 10254 conicto +8746 9569 7838 8709 conicto +6953 7848 lineto +6481 7377 6285 7111 conicto +6089 6846 6009 6596 conicto +5948 6386 5918 6085 conicto +5888 5785 5888 5264 conicto +5888 4032 lineto +end_ol grestore +gsave 101.411357 48.937500 translate 0.035278 -0.035278 scale +start_ol +1664 15552 moveto +3293 15552 lineto +4787 13192 5529 10932 conicto +6272 8672 6272 6442 conicto +6272 4202 5529 1932 conicto +4787 -338 3293 -2688 conicto +1664 -2688 lineto +3018 -398 3685 1867 conicto +4352 4132 4352 6442 conicto +4352 8752 3685 11002 conicto +3018 13252 1664 15552 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 1.000000 srgb +n 73.500000 54.000000 m 73.500000 70.000000 l 106.500000 70.000000 l 106.500000 54.000000 l f +n 73.500000 55.500000 m 73.500000 55.500000 1.500000 1.500000 180.000000 270.000000 ellipse f +n 106.500000 55.500000 m 106.500000 55.500000 1.500000 1.500000 270.000000 360.000000 ellipse f +n 72.000000 55.500000 m 72.000000 68.500000 l 108.000000 68.500000 l 108.000000 55.500000 l f +n 73.500000 68.500000 m 73.500000 68.500000 1.500000 1.500000 90.000000 180.000000 ellipse f +n 106.500000 68.500000 m 106.500000 68.500000 1.500000 1.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 73.500000 54.000000 m 106.500000 54.000000 l s +n 73.500000 70.000000 m 106.500000 70.000000 l s +n 73.500000 55.500000 1.500000 1.500000 180.000000 270.000000 ellipse s +n 106.500000 55.500000 1.500000 1.500000 270.000000 360.000000 ellipse s +n 72.000000 55.500000 m 72.000000 68.500000 l s +n 108.000000 55.500000 m 108.000000 68.500000 l s +n 73.500000 68.500000 1.500000 1.500000 90.000000 180.000000 ellipse s +n 106.500000 68.500000 1.500000 1.500000 0.000000 90.000000 ellipse s +gsave 78.433750 61.244167 translate 0.035278 -0.035278 scale +start_ol +4032 13248 moveto +4032 7616 lineto +6578 7616 lineto +7992 7616 8764 8349 conicto +9536 9082 9536 10437 conicto +9536 11782 8764 12515 conicto +7992 13248 6578 13248 conicto +4032 13248 lineto +1984 14912 moveto +6578 14912 lineto +9083 14912 10365 13773 conicto +11648 12634 11648 10437 conicto +11648 8220 10365 7086 conicto +9083 5952 6578 5952 conicto +4032 5952 lineto +4032 0 lineto +1984 0 lineto +1984 14912 lineto +end_ol grestore +gsave 79.969813 61.244167 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 81.635754 61.244167 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 82.749708 61.244167 translate 0.035278 -0.035278 scale +start_ol +7616 15552 moveto +7616 14016 lineto +5843 14016 lineto +4860 14016 4478 13618 conicto +4096 13220 4096 12185 conicto +4096 11200 lineto +7104 11200 lineto +7104 9792 lineto +4096 9792 lineto +4096 0 lineto +2240 0 lineto +2240 9792 lineto +448 9792 lineto +448 11200 lineto +2240 11200 lineto +2240 11976 lineto +2240 13844 3108 14698 conicto +3977 15552 5863 15552 conicto +7616 15552 lineto +end_ol grestore +gsave 83.703812 61.244167 translate 0.035278 -0.035278 scale +start_ol +6309 9920 moveto +4812 9920 3942 8756 conicto +3072 7593 3072 5568 conicto +3072 3543 3937 2379 conicto +4802 1216 6309 1216 conicto +7796 1216 8666 2384 conicto +9536 3553 9536 5568 conicto +9536 7573 8666 8746 conicto +7796 9920 6309 9920 conicto +6304 11456 moveto +8710 11456 10083 9894 conicto +11456 8332 11456 5568 conicto +11456 2814 10083 1247 conicto +8710 -320 6304 -320 conicto +3888 -320 2520 1247 conicto +1152 2814 1152 5568 conicto +1152 8332 2520 9894 conicto +3888 11456 6304 11456 conicto +end_ol grestore +gsave 85.359764 61.244167 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 86.426267 61.244167 translate 0.035278 -0.035278 scale +start_ol +10633 9061 moveto +11321 10288 12279 10872 conicto +13237 11456 14534 11456 conicto +16280 11456 17228 10237 conicto +18176 9018 18176 6769 conicto +18176 0 lineto +16320 0 lineto +16320 6708 lineto +16320 8307 15752 9081 conicto +15185 9856 14020 9856 conicto +12597 9856 11770 8912 conicto +10944 7968 10944 6338 conicto +10944 0 lineto +9088 0 lineto +9088 6708 lineto +9088 8317 8520 9086 conicto +7953 9856 6768 9856 conicto +5365 9856 4538 8907 conicto +3712 7958 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4340 10489 5217 10972 conicto +6095 11456 7302 11456 conicto +8519 11456 9371 10842 conicto +10224 10229 10633 9061 conicto +end_ol grestore +gsave 89.063799 61.244167 translate 0.035278 -0.035278 scale +start_ol +7008 5568 moveto +4786 5568 3929 5061 conicto +3072 4555 3072 3332 conicto +3072 2359 3715 1787 conicto +4358 1216 5464 1216 conicto +6988 1216 7910 2294 conicto +8832 3372 8832 5161 conicto +8832 5568 lineto +7008 5568 lineto +10688 6345 moveto +10688 0 lineto +8832 0 lineto +8832 1664 lineto +8202 647 7262 163 conicto +6323 -320 4964 -320 conicto +3245 -320 2230 645 conicto +1216 1610 1216 3230 conicto +1216 5120 2482 6080 conicto +3749 7040 6261 7040 conicto +8832 7040 lineto +8832 7226 lineto +8832 8512 7999 9216 conicto +7166 9920 5659 9920 conicto +4702 9920 3794 9696 conicto +2886 9472 2048 9024 conicto +2048 10752 lineto +3058 11104 4008 11280 conicto +4958 11456 5858 11456 conicto +8288 11456 9488 10188 conicto +10688 8921 10688 6345 conicto +end_ol grestore +gsave 90.722249 61.244167 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 92.438138 61.244167 translate 0.035278 -0.035278 scale +start_ol +9984 10816 moveto +9984 9088 lineto +9205 9504 8421 9712 conicto +7637 9920 6838 9920 conicto +5050 9920 4061 8776 conicto +3072 7633 3072 5568 conicto +3072 3503 4061 2359 conicto +5050 1216 6838 1216 conicto +7637 1216 8421 1424 conicto +9205 1632 9984 2048 conicto +9984 320 lineto +9216 0 8394 -160 conicto +7572 -320 6645 -320 conicto +4123 -320 2637 1272 conicto +1152 2864 1152 5568 conicto +1152 8312 2652 9884 conicto +4152 11456 6764 11456 conicto +7612 11456 8419 11296 conicto +9226 11136 9984 10816 conicto +end_ol grestore +gsave 93.926741 61.244167 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 95.592682 61.244167 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 96.451875 61.244167 translate 0.035278 -0.035278 scale +start_ol +7008 5568 moveto +4786 5568 3929 5061 conicto +3072 4555 3072 3332 conicto +3072 2359 3715 1787 conicto +4358 1216 5464 1216 conicto +6988 1216 7910 2294 conicto +8832 3372 8832 5161 conicto +8832 5568 lineto +7008 5568 lineto +10688 6345 moveto +10688 0 lineto +8832 0 lineto +8832 1664 lineto +8202 647 7262 163 conicto +6323 -320 4964 -320 conicto +3245 -320 2230 645 conicto +1216 1610 1216 3230 conicto +1216 5120 2482 6080 conicto +3749 7040 6261 7040 conicto +8832 7040 lineto +8832 7226 lineto +8832 8512 7999 9216 conicto +7166 9920 5659 9920 conicto +4702 9920 3794 9696 conicto +2886 9472 2048 9024 conicto +2048 10752 lineto +3058 11104 4008 11280 conicto +4958 11456 5858 11456 conicto +8288 11456 9488 10188 conicto +10688 8921 10688 6345 conicto +end_ol grestore +gsave 98.110325 61.244167 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 99.826214 61.244167 translate 0.035278 -0.035278 scale +start_ol +9280 9472 moveto +9280 15552 lineto +11136 15552 lineto +11136 0 lineto +9280 0 lineto +9280 1664 lineto +8703 657 7822 168 conicto +6942 -320 5708 -320 conicto +3689 -320 2420 1302 conicto +1152 2924 1152 5568 conicto +1152 8212 2420 9834 conicto +3689 11456 5708 11456 conicto +6942 11456 7822 10967 conicto +8703 10479 9280 9472 conicto +3072 5568 moveto +3072 3532 3898 2374 conicto +4725 1216 6171 1216 conicto +7617 1216 8448 2374 conicto +9280 3532 9280 5568 conicto +9280 7604 8448 8762 conicto +7617 9920 6171 9920 conicto +4725 9920 3898 8762 conicto +3072 7604 3072 5568 conicto +end_ol grestore +gsave 74.273750 64.630833 translate 0.035278 -0.035278 scale +start_ol +7040 12925 moveto +4297 5504 lineto +9793 5504 lineto +7040 12925 lineto +5899 14912 moveto +8191 14912 lineto +13888 0 lineto +11786 0 lineto +10424 3840 lineto +3686 3840 lineto +2324 0 lineto +192 0 lineto +5899 14912 lineto +end_ol grestore +gsave 76.077059 64.630833 translate 0.035278 -0.035278 scale +start_ol +9984 10816 moveto +9984 9088 lineto +9205 9504 8421 9712 conicto +7637 9920 6838 9920 conicto +5050 9920 4061 8776 conicto +3072 7633 3072 5568 conicto +3072 3503 4061 2359 conicto +5050 1216 6838 1216 conicto +7637 1216 8421 1424 conicto +9205 1632 9984 2048 conicto +9984 320 lineto +9216 0 8394 -160 conicto +7572 -320 6645 -320 conicto +4123 -320 2637 1272 conicto +1152 2864 1152 5568 conicto +1152 8312 2652 9884 conicto +4152 11456 6764 11456 conicto +7612 11456 8419 11296 conicto +9226 11136 9984 10816 conicto +end_ol grestore +gsave 77.565663 64.630833 translate 0.035278 -0.035278 scale +start_ol +9984 10816 moveto +9984 9088 lineto +9205 9504 8421 9712 conicto +7637 9920 6838 9920 conicto +5050 9920 4061 8776 conicto +3072 7633 3072 5568 conicto +3072 3503 4061 2359 conicto +5050 1216 6838 1216 conicto +7637 1216 8421 1424 conicto +9205 1632 9984 2048 conicto +9984 320 lineto +9216 0 8394 -160 conicto +7572 -320 6645 -320 conicto +4123 -320 2637 1272 conicto +1152 2864 1152 5568 conicto +1152 8312 2652 9884 conicto +4152 11456 6764 11456 conicto +7612 11456 8419 11296 conicto +9226 11136 9984 10816 conicto +end_ol grestore +gsave 79.054266 64.630833 translate 0.035278 -0.035278 scale +start_ol +6309 9920 moveto +4812 9920 3942 8756 conicto +3072 7593 3072 5568 conicto +3072 3543 3937 2379 conicto +4802 1216 6309 1216 conicto +7796 1216 8666 2384 conicto +9536 3553 9536 5568 conicto +9536 7573 8666 8746 conicto +7796 9920 6309 9920 conicto +6304 11456 moveto +8710 11456 10083 9894 conicto +11456 8332 11456 5568 conicto +11456 2814 10083 1247 conicto +8710 -320 6304 -320 conicto +3888 -320 2520 1247 conicto +1152 2814 1152 5568 conicto +1152 8332 2520 9894 conicto +3888 11456 6304 11456 conicto +end_ol grestore +gsave 80.710219 64.630833 translate 0.035278 -0.035278 scale +start_ol +1728 4380 moveto +1728 11200 lineto +3584 11200 lineto +3584 4450 lineto +3584 2865 4203 2072 conicto +4823 1280 6062 1280 conicto +7551 1280 8415 2228 conicto +9280 3176 9280 4812 conicto +9280 11200 lineto +11136 11200 lineto +11136 0 lineto +9280 0 lineto +9280 1664 lineto +8609 657 7722 168 conicto +6836 -320 5664 -320 conicto +3731 -320 2729 877 conicto +1728 2075 1728 4380 conicto +6372 11456 moveto +6372 11456 lineto +end_ol grestore +gsave 82.426108 64.630833 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 84.141997 64.630833 translate 0.035278 -0.035278 scale +start_ol +3776 14400 moveto +3776 11200 lineto +7552 11200 lineto +7552 9792 lineto +3776 9792 lineto +3776 3693 lineto +3776 2319 4149 1927 conicto +4523 1536 5669 1536 conicto +7552 1536 lineto +7552 0 lineto +5669 0 lineto +3540 0 2730 795 conicto +1920 1591 1920 3693 conicto +1920 9792 lineto +576 9792 lineto +576 11200 lineto +1920 11200 lineto +1920 14400 lineto +3776 14400 lineto +end_ol grestore +gsave 85.203506 64.630833 translate 0.035278 -0.035278 scale +start_ol +1920 11200 moveto +3776 11200 lineto +3776 0 lineto +1920 0 lineto +1920 11200 lineto +1920 15552 moveto +3776 15552 lineto +3776 13248 lineto +1920 13248 lineto +1920 15552 lineto +end_ol grestore +gsave 85.955303 64.630833 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 87.671192 64.630833 translate 0.035278 -0.035278 scale +start_ol +9280 5723 moveto +9280 7722 8463 8821 conicto +7646 9920 6171 9920 conicto +4706 9920 3889 8821 conicto +3072 7722 3072 5723 conicto +3072 3734 3889 2635 conicto +4706 1536 6171 1536 conicto +7646 1536 8463 2635 conicto +9280 3734 9280 5723 conicto +11136 1386 moveto +11136 -1486 9869 -2887 conicto +8602 -4288 5988 -4288 conicto +5020 -4288 4162 -4146 conicto +3304 -4005 2496 -3712 conicto +2496 -1920 lineto +3302 -2346 4087 -2549 conicto +4873 -2752 5689 -2752 conicto +7490 -2752 8385 -1805 conicto +9280 -858 9280 1057 conicto +9280 1984 lineto +8713 987 7827 493 conicto +6942 0 5708 0 conicto +3659 0 2405 1568 conicto +1152 3136 1152 5723 conicto +1152 8320 2405 9888 conicto +3659 11456 5708 11456 conicto +6942 11456 7827 10962 conicto +8713 10469 9280 9472 conicto +9280 11200 lineto +11136 11200 lineto +11136 1386 lineto +end_ol grestore +gsave 89.389586 64.630833 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 90.248779 64.630833 translate 0.035278 -0.035278 scale +start_ol +-64 14912 moveto +12608 14912 lineto +12608 13184 lineto +7296 13184 lineto +7296 0 lineto +5248 0 lineto +5248 13184 lineto +-64 13184 lineto +-64 14912 lineto +end_ol grestore +gsave 91.819809 64.630833 translate 0.035278 -0.035278 scale +start_ol +1920 11200 moveto +3776 11200 lineto +3776 0 lineto +1920 0 lineto +1920 11200 lineto +1920 15552 moveto +3776 15552 lineto +3776 13248 lineto +1920 13248 lineto +1920 15552 lineto +end_ol grestore +gsave 92.571606 64.630833 translate 0.035278 -0.035278 scale +start_ol +10633 9061 moveto +11321 10288 12279 10872 conicto +13237 11456 14534 11456 conicto +16280 11456 17228 10237 conicto +18176 9018 18176 6769 conicto +18176 0 lineto +16320 0 lineto +16320 6708 lineto +16320 8307 15752 9081 conicto +15185 9856 14020 9856 conicto +12597 9856 11770 8912 conicto +10944 7968 10944 6338 conicto +10944 0 lineto +9088 0 lineto +9088 6708 lineto +9088 8317 8520 9086 conicto +7953 9856 6768 9856 conicto +5365 9856 4538 8907 conicto +3712 7958 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4340 10489 5217 10972 conicto +6095 11456 7302 11456 conicto +8519 11456 9371 10842 conicto +10224 10229 10633 9061 conicto +end_ol grestore +gsave 95.209138 64.630833 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 96.875078 64.630833 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 97.989032 64.630833 translate 0.035278 -0.035278 scale +start_ol +9152 10816 moveto +9152 9088 lineto +8366 9504 7520 9712 conicto +6674 9920 5768 9920 conicto +4388 9920 3698 9498 conicto +3008 9076 3008 8231 conicto +3008 7588 3497 7221 conicto +3986 6854 5463 6522 conicto +6092 6382 lineto +8066 5962 8897 5196 conicto +9728 4431 9728 3061 conicto +9728 1501 8490 590 conicto +7253 -320 5089 -320 conicto +4188 -320 3211 -144 conicto +2234 32 1152 384 conicto +1152 2304 lineto +2170 1760 3158 1488 conicto +4146 1216 5114 1216 conicto +6411 1216 7109 1662 conicto +7808 2109 7808 2923 conicto +7808 3675 7304 4077 conicto +6800 4479 5094 4850 conicto +4455 5000 lineto +2740 5360 1978 6106 conicto +1216 6852 1216 8153 conicto +1216 9734 2344 10595 conicto +3472 11456 5547 11456 conicto +6574 11456 7480 11296 conicto +8387 11136 9152 10816 conicto +end_ol grestore +gsave 99.400212 64.630833 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 100.259405 64.630833 translate 0.035278 -0.035278 scale +start_ol +6400 15552 moveto +5036 13252 4374 11002 conicto +3712 8752 3712 6442 conicto +3712 4132 4379 1867 conicto +5046 -398 6400 -2688 conicto +4771 -2688 lineto +3277 -338 2534 1932 conicto +1792 4202 1792 6442 conicto +1792 8672 2529 10932 conicto +3267 13192 4771 15552 conicto +6400 15552 lineto +end_ol grestore +gsave 101.315911 64.630833 translate 0.035278 -0.035278 scale +start_ol +11264 11200 moveto +7205 5750 lineto +11456 0 lineto +9288 0 lineto +6032 4400 lineto +2756 0 lineto +576 0 lineto +4949 5860 lineto +960 11200 lineto +3135 11200 lineto +6112 7210 lineto +9089 11200 lineto +11264 11200 lineto +end_ol grestore +gsave 102.916913 64.630833 translate 0.035278 -0.035278 scale +start_ol +6523 7104 moveto +5094 7104 4275 6328 conicto +3456 5552 3456 4192 conicto +3456 2832 4275 2056 conicto +5094 1280 6523 1280 conicto +7952 1280 8776 2061 conicto +9600 2842 9600 4192 conicto +9600 5552 8781 6328 conicto +7962 7104 6523 7104 conicto +4466 7969 moveto +3172 8290 2450 9181 conicto +1728 10073 1728 11355 conicto +1728 13148 3011 14190 conicto +4294 15232 6528 15232 conicto +8772 15232 10050 14190 conicto +11328 13148 11328 11355 conicto +11328 10073 10603 9181 conicto +9879 8290 8590 7969 conicto +10035 7627 10841 6631 conicto +11648 5635 11648 4197 conicto +11648 2014 10323 847 conicto +8998 -320 6528 -320 conicto +4058 -320 2733 847 conicto +1408 2014 1408 4197 conicto +1408 5635 2217 6631 conicto +3026 7627 4466 7969 conicto +3712 11168 moveto +3712 10006 4450 9355 conicto +5189 8704 6523 8704 conicto +7847 8704 8595 9355 conicto +9344 10006 9344 11168 conicto +9344 12330 8595 12981 conicto +7847 13632 6523 13632 conicto +5189 13632 4450 12981 conicto +3712 12330 3712 11168 conicto +end_ol grestore +gsave 104.640302 64.630833 translate 0.035278 -0.035278 scale +start_ol +1664 15552 moveto +3293 15552 lineto +4787 13192 5529 10932 conicto +6272 8672 6272 6442 conicto +6272 4202 5529 1932 conicto +4787 -338 3293 -2688 conicto +1664 -2688 lineto +3018 -398 3685 1867 conicto +4352 4132 4352 6442 conicto +4352 8752 3685 11002 conicto +3018 13252 1664 15552 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 1.000000 srgb +n 39.500000 62.000000 m 39.500000 70.000000 l 66.500000 70.000000 l 66.500000 62.000000 l f +n 39.500000 63.500000 m 39.500000 63.500000 1.500000 1.500000 180.000000 270.000000 ellipse f +n 66.500000 63.500000 m 66.500000 63.500000 1.500000 1.500000 270.000000 360.000000 ellipse f +n 38.000000 63.500000 m 38.000000 68.500000 l 68.000000 68.500000 l 68.000000 63.500000 l f +n 39.500000 68.500000 m 39.500000 68.500000 1.500000 1.500000 90.000000 180.000000 ellipse f +n 66.500000 68.500000 m 66.500000 68.500000 1.500000 1.500000 0.000000 90.000000 ellipse f +0.501961 0.501961 0.501961 srgb +n 39.500000 62.000000 m 66.500000 62.000000 l s +n 39.500000 70.000000 m 66.500000 70.000000 l s +n 39.500000 63.500000 1.500000 1.500000 180.000000 270.000000 ellipse s +n 66.500000 63.500000 1.500000 1.500000 270.000000 360.000000 ellipse s +n 38.000000 63.500000 m 38.000000 68.500000 l s +n 68.000000 63.500000 m 68.000000 68.500000 l s +n 39.500000 68.500000 1.500000 1.500000 90.000000 180.000000 ellipse s +n 66.500000 68.500000 1.500000 1.500000 0.000000 90.000000 ellipse s +0.000000 0.000000 0.000000 srgb +gsave 41.310000 66.937500 translate 0.035278 -0.035278 scale +start_ol +1984 14912 moveto +5011 14912 lineto +8795 4776 lineto +12599 14912 lineto +15616 14912 lineto +15616 0 lineto +13632 0 lineto +13632 13096 lineto +9808 2880 lineto +7792 2880 lineto +3968 13096 lineto +3968 0 lineto +1984 0 lineto +1984 14912 lineto +end_ol grestore +gsave 43.645312 66.937500 translate 0.035278 -0.035278 scale +start_ol +7008 5568 moveto +4786 5568 3929 5061 conicto +3072 4555 3072 3332 conicto +3072 2359 3715 1787 conicto +4358 1216 5464 1216 conicto +6988 1216 7910 2294 conicto +8832 3372 8832 5161 conicto +8832 5568 lineto +7008 5568 lineto +10688 6345 moveto +10688 0 lineto +8832 0 lineto +8832 1664 lineto +8202 647 7262 163 conicto +6323 -320 4964 -320 conicto +3245 -320 2230 645 conicto +1216 1610 1216 3230 conicto +1216 5120 2482 6080 conicto +3749 7040 6261 7040 conicto +8832 7040 lineto +8832 7226 lineto +8832 8512 7999 9216 conicto +7166 9920 5659 9920 conicto +4702 9920 3794 9696 conicto +2886 9472 2048 9024 conicto +2048 10752 lineto +3058 11104 4008 11280 conicto +4958 11456 5858 11456 conicto +8288 11456 9488 10188 conicto +10688 8921 10688 6345 conicto +end_ol grestore +gsave 45.303761 66.937500 translate 0.035278 -0.035278 scale +start_ol +9152 10816 moveto +9152 9088 lineto +8366 9504 7520 9712 conicto +6674 9920 5768 9920 conicto +4388 9920 3698 9498 conicto +3008 9076 3008 8231 conicto +3008 7588 3497 7221 conicto +3986 6854 5463 6522 conicto +6092 6382 lineto +8066 5962 8897 5196 conicto +9728 4431 9728 3061 conicto +9728 1501 8490 590 conicto +7253 -320 5089 -320 conicto +4188 -320 3211 -144 conicto +2234 32 1152 384 conicto +1152 2304 lineto +2170 1760 3158 1488 conicto +4146 1216 5114 1216 conicto +6411 1216 7109 1662 conicto +7808 2109 7808 2923 conicto +7808 3675 7304 4077 conicto +6800 4479 5094 4850 conicto +4455 5000 lineto +2740 5360 1978 6106 conicto +1216 6852 1216 8153 conicto +1216 9734 2344 10595 conicto +3472 11456 5547 11456 conicto +6574 11456 7480 11296 conicto +8387 11136 9152 10816 conicto +end_ol grestore +gsave 46.714941 66.937500 translate 0.035278 -0.035278 scale +start_ol +3776 14400 moveto +3776 11200 lineto +7552 11200 lineto +7552 9792 lineto +3776 9792 lineto +3776 3693 lineto +3776 2319 4149 1927 conicto +4523 1536 5669 1536 conicto +7552 1536 lineto +7552 0 lineto +5669 0 lineto +3540 0 2730 795 conicto +1920 1591 1920 3693 conicto +1920 9792 lineto +576 9792 lineto +576 11200 lineto +1920 11200 lineto +1920 14400 lineto +3776 14400 lineto +end_ol grestore +gsave 47.776450 66.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 49.442390 66.937500 translate 0.035278 -0.035278 scale +start_ol +8448 9408 moveto +8136 9605 7769 9698 conicto +7402 9792 6960 9792 conicto +5391 9792 4551 8788 conicto +3712 7785 3712 5907 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4295 10479 5230 10967 conicto +6165 11456 7503 11456 conicto +7694 11456 7925 11424 conicto +8156 11392 8438 11328 conicto +8448 9408 lineto +end_ol grestore +gsave 50.556344 66.937500 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 51.415537 66.937500 translate 0.035278 -0.035278 scale +start_ol +704 14912 moveto +2742 14912 lineto +5879 2307 lineto +9005 14912 lineto +11273 14912 lineto +14409 2307 lineto +17536 14912 lineto +19584 14912 lineto +15838 0 lineto +13301 0 lineto +10154 12944 lineto +6977 0 lineto +4440 0 lineto +704 14912 lineto +end_ol grestore +gsave 54.033085 66.937500 translate 0.035278 -0.035278 scale +start_ol +1920 11200 moveto +3776 11200 lineto +3776 0 lineto +1920 0 lineto +1920 11200 lineto +1920 15552 moveto +3776 15552 lineto +3776 13248 lineto +1920 13248 lineto +1920 15552 lineto +end_ol grestore +gsave 54.784882 66.937500 translate 0.035278 -0.035278 scale +start_ol +9152 10816 moveto +9152 9088 lineto +8366 9504 7520 9712 conicto +6674 9920 5768 9920 conicto +4388 9920 3698 9498 conicto +3008 9076 3008 8231 conicto +3008 7588 3497 7221 conicto +3986 6854 5463 6522 conicto +6092 6382 lineto +8066 5962 8897 5196 conicto +9728 4431 9728 3061 conicto +9728 1501 8490 590 conicto +7253 -320 5089 -320 conicto +4188 -320 3211 -144 conicto +2234 32 1152 384 conicto +1152 2304 lineto +2170 1760 3158 1488 conicto +4146 1216 5114 1216 conicto +6411 1216 7109 1662 conicto +7808 2109 7808 2923 conicto +7808 3675 7304 4077 conicto +6800 4479 5094 4850 conicto +4455 5000 lineto +2740 5360 1978 6106 conicto +1216 6852 1216 8153 conicto +1216 9734 2344 10595 conicto +3472 11456 5547 11456 conicto +6574 11456 7480 11296 conicto +8387 11136 9152 10816 conicto +end_ol grestore +gsave 56.196062 66.937500 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 15552 lineto +3712 15552 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 57.911951 66.937500 translate 0.035278 -0.035278 scale +start_ol +9984 5568 moveto +9984 7604 9147 8762 conicto +8311 9920 6848 9920 conicto +5385 9920 4548 8762 conicto +3712 7604 3712 5568 conicto +3712 3532 4548 2374 conicto +5385 1216 6848 1216 conicto +8311 1216 9147 2374 conicto +9984 3532 9984 5568 conicto +3712 9472 moveto +4294 10479 5181 10967 conicto +6068 11456 7302 11456 conicto +9347 11456 10625 9834 conicto +11904 8212 11904 5568 conicto +11904 2924 10625 1302 conicto +9347 -320 7302 -320 conicto +6068 -320 5181 168 conicto +4294 657 3712 1664 conicto +3712 0 lineto +1856 0 lineto +1856 15552 lineto +3712 15552 lineto +3712 9472 lineto +end_ol grestore +gsave 59.630345 66.937500 translate 0.035278 -0.035278 scale +start_ol +6309 9920 moveto +4812 9920 3942 8756 conicto +3072 7593 3072 5568 conicto +3072 3543 3937 2379 conicto +4802 1216 6309 1216 conicto +7796 1216 8666 2384 conicto +9536 3553 9536 5568 conicto +9536 7573 8666 8746 conicto +7796 9920 6309 9920 conicto +6304 11456 moveto +8710 11456 10083 9894 conicto +11456 8332 11456 5568 conicto +11456 2814 10083 1247 conicto +8710 -320 6304 -320 conicto +3888 -320 2520 1247 conicto +1152 2814 1152 5568 conicto +1152 8332 2520 9894 conicto +3888 11456 6304 11456 conicto +end_ol grestore +gsave 61.286298 66.937500 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 63.002187 66.937500 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 1.000000 srgb +n 5.500000 62.000000 m 5.500000 70.000000 l 30.500000 70.000000 l 30.500000 62.000000 l f +n 5.500000 63.500000 m 5.500000 63.500000 1.500000 1.500000 180.000000 270.000000 ellipse f +n 30.500000 63.500000 m 30.500000 63.500000 1.500000 1.500000 270.000000 360.000000 ellipse f +n 4.000000 63.500000 m 4.000000 68.500000 l 32.000000 68.500000 l 32.000000 63.500000 l f +n 5.500000 68.500000 m 5.500000 68.500000 1.500000 1.500000 90.000000 180.000000 ellipse f +n 30.500000 68.500000 m 30.500000 68.500000 1.500000 1.500000 0.000000 90.000000 ellipse f +0.749020 0.749020 0.749020 srgb +n 5.500000 62.000000 m 30.500000 62.000000 l s +n 5.500000 70.000000 m 30.500000 70.000000 l s +n 5.500000 63.500000 1.500000 1.500000 180.000000 270.000000 ellipse s +n 30.500000 63.500000 1.500000 1.500000 270.000000 360.000000 ellipse s +n 4.000000 63.500000 m 4.000000 68.500000 l s +n 32.000000 63.500000 m 32.000000 68.500000 l s +n 5.500000 68.500000 1.500000 1.500000 90.000000 180.000000 ellipse s +n 30.500000 68.500000 1.500000 1.500000 0.000000 90.000000 ellipse s +0.000000 0.000000 0.000000 srgb +gsave 9.387500 65.244167 translate 0.035278 -0.035278 scale +start_ol +10944 14464 moveto +10944 12480 lineto +9798 13029 8782 13298 conicto +7766 13568 6819 13568 conicto +5175 13568 4283 12928 conicto +3392 12289 3392 11110 conicto +3392 10120 3984 9615 conicto +4576 9111 6227 8801 conicto +7440 8551 lineto +9695 8119 10767 7029 conicto +11840 5939 11840 4110 conicto +11840 1930 10387 805 conicto +8935 -320 6130 -320 conicto +5072 -320 3879 -77 conicto +2686 165 1408 640 conicto +1408 2752 lineto +2635 2053 3812 1698 conicto +4989 1344 6127 1344 conicto +7853 1344 8790 2026 conicto +9728 2708 9728 3972 conicto +9728 5076 9056 5698 conicto +8385 6320 6853 6631 conicto +5630 6871 lineto +3367 7322 2355 8284 conicto +1344 9247 1344 10961 conicto +1344 12946 2737 14089 conicto +4131 15232 6579 15232 conicto +7627 15232 8716 15040 conicto +9805 14848 10944 14464 conicto +end_ol grestore +gsave 11.105894 65.244167 translate 0.035278 -0.035278 scale +start_ol +1920 15552 moveto +3776 15552 lineto +3776 0 lineto +1920 0 lineto +1920 15552 lineto +end_ol grestore +gsave 11.857691 65.244167 translate 0.035278 -0.035278 scale +start_ol +7008 5568 moveto +4786 5568 3929 5061 conicto +3072 4555 3072 3332 conicto +3072 2359 3715 1787 conicto +4358 1216 5464 1216 conicto +6988 1216 7910 2294 conicto +8832 3372 8832 5161 conicto +8832 5568 lineto +7008 5568 lineto +10688 6345 moveto +10688 0 lineto +8832 0 lineto +8832 1664 lineto +8202 647 7262 163 conicto +6323 -320 4964 -320 conicto +3245 -320 2230 645 conicto +1216 1610 1216 3230 conicto +1216 5120 2482 6080 conicto +3749 7040 6261 7040 conicto +8832 7040 lineto +8832 7226 lineto +8832 8512 7999 9216 conicto +7166 9920 5659 9920 conicto +4702 9920 3794 9696 conicto +2886 9472 2048 9024 conicto +2048 10752 lineto +3058 11104 4008 11280 conicto +4958 11456 5858 11456 conicto +8288 11456 9488 10188 conicto +10688 8921 10688 6345 conicto +end_ol grestore +gsave 13.516141 65.244167 translate 0.035278 -0.035278 scale +start_ol +640 11200 moveto +2586 11200 lineto +6080 1800 lineto +9574 11200 lineto +11520 11200 lineto +7328 0 lineto +4832 0 lineto +640 11200 lineto +end_ol grestore +gsave 15.117143 65.244167 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 16.783084 65.244167 translate 0.035278 -0.035278 scale +start_ol +5209 14912 moveto +6912 14912 lineto +1703 -1920 lineto +0 -1920 lineto +5209 14912 lineto +end_ol grestore +gsave 17.694730 65.244167 translate 0.035278 -0.035278 scale +start_ol +4032 13248 moveto +4032 1664 lineto +6467 1664 lineto +9551 1664 10983 3061 conicto +12416 4458 12416 7471 conicto +12416 10464 10983 11856 conicto +9551 13248 6467 13248 conicto +4032 13248 lineto +1984 14912 moveto +6158 14912 lineto +10482 14912 12505 13109 conicto +14528 11306 14528 7471 conicto +14528 3616 12495 1808 conicto +10463 0 6158 0 conicto +1984 0 lineto +1984 14912 lineto +end_ol grestore +gsave 19.777778 65.244167 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +gsave 21.443719 65.244167 translate 0.035278 -0.035278 scale +start_ol +9984 5568 moveto +9984 7604 9147 8762 conicto +8311 9920 6848 9920 conicto +5385 9920 4548 8762 conicto +3712 7604 3712 5568 conicto +3712 3532 4548 2374 conicto +5385 1216 6848 1216 conicto +8311 1216 9147 2374 conicto +9984 3532 9984 5568 conicto +3712 9472 moveto +4294 10479 5181 10967 conicto +6068 11456 7302 11456 conicto +9347 11456 10625 9834 conicto +11904 8212 11904 5568 conicto +11904 2924 10625 1302 conicto +9347 -320 7302 -320 conicto +6068 -320 5181 168 conicto +4294 657 3712 1664 conicto +3712 0 lineto +1856 0 lineto +1856 15552 lineto +3712 15552 lineto +3712 9472 lineto +end_ol grestore +gsave 23.162113 65.244167 translate 0.035278 -0.035278 scale +start_ol +1728 4380 moveto +1728 11200 lineto +3584 11200 lineto +3584 4450 lineto +3584 2865 4203 2072 conicto +4823 1280 6062 1280 conicto +7551 1280 8415 2228 conicto +9280 3176 9280 4812 conicto +9280 11200 lineto +11136 11200 lineto +11136 0 lineto +9280 0 lineto +9280 1664 lineto +8609 657 7722 168 conicto +6836 -320 5664 -320 conicto +3731 -320 2729 877 conicto +1728 2075 1728 4380 conicto +6372 11456 moveto +6372 11456 lineto +end_ol grestore +gsave 24.878003 65.244167 translate 0.035278 -0.035278 scale +start_ol +9280 5723 moveto +9280 7722 8463 8821 conicto +7646 9920 6171 9920 conicto +4706 9920 3889 8821 conicto +3072 7722 3072 5723 conicto +3072 3734 3889 2635 conicto +4706 1536 6171 1536 conicto +7646 1536 8463 2635 conicto +9280 3734 9280 5723 conicto +11136 1386 moveto +11136 -1486 9869 -2887 conicto +8602 -4288 5988 -4288 conicto +5020 -4288 4162 -4146 conicto +3304 -4005 2496 -3712 conicto +2496 -1920 lineto +3302 -2346 4087 -2549 conicto +4873 -2752 5689 -2752 conicto +7490 -2752 8385 -1805 conicto +9280 -858 9280 1057 conicto +9280 1984 lineto +8713 987 7827 493 conicto +6942 0 5708 0 conicto +3659 0 2405 1568 conicto +1152 3136 1152 5723 conicto +1152 8320 2405 9888 conicto +3659 11456 5708 11456 conicto +6942 11456 7827 10962 conicto +8713 10469 9280 9472 conicto +9280 11200 lineto +11136 11200 lineto +11136 1386 lineto +end_ol grestore +gsave 11.367500 68.630833 translate 0.035278 -0.035278 scale +start_ol +704 14912 moveto +2742 14912 lineto +5879 2307 lineto +9005 14912 lineto +11273 14912 lineto +14409 2307 lineto +17536 14912 lineto +19584 14912 lineto +15838 0 lineto +13301 0 lineto +10154 12944 lineto +6977 0 lineto +4440 0 lineto +704 14912 lineto +end_ol grestore +gsave 13.985048 68.630833 translate 0.035278 -0.035278 scale +start_ol +1920 11200 moveto +3776 11200 lineto +3776 0 lineto +1920 0 lineto +1920 11200 lineto +1920 15552 moveto +3776 15552 lineto +3776 13248 lineto +1920 13248 lineto +1920 15552 lineto +end_ol grestore +gsave 14.736845 68.630833 translate 0.035278 -0.035278 scale +start_ol +9152 10816 moveto +9152 9088 lineto +8366 9504 7520 9712 conicto +6674 9920 5768 9920 conicto +4388 9920 3698 9498 conicto +3008 9076 3008 8231 conicto +3008 7588 3497 7221 conicto +3986 6854 5463 6522 conicto +6092 6382 lineto +8066 5962 8897 5196 conicto +9728 4431 9728 3061 conicto +9728 1501 8490 590 conicto +7253 -320 5089 -320 conicto +4188 -320 3211 -144 conicto +2234 32 1152 384 conicto +1152 2304 lineto +2170 1760 3158 1488 conicto +4146 1216 5114 1216 conicto +6411 1216 7109 1662 conicto +7808 2109 7808 2923 conicto +7808 3675 7304 4077 conicto +6800 4479 5094 4850 conicto +4455 5000 lineto +2740 5360 1978 6106 conicto +1216 6852 1216 8153 conicto +1216 9734 2344 10595 conicto +3472 11456 5547 11456 conicto +6574 11456 7480 11296 conicto +8387 11136 9152 10816 conicto +end_ol grestore +gsave 16.148025 68.630833 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 15552 lineto +3712 15552 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 17.863914 68.630833 translate 0.035278 -0.035278 scale +start_ol +9984 5568 moveto +9984 7604 9147 8762 conicto +8311 9920 6848 9920 conicto +5385 9920 4548 8762 conicto +3712 7604 3712 5568 conicto +3712 3532 4548 2374 conicto +5385 1216 6848 1216 conicto +8311 1216 9147 2374 conicto +9984 3532 9984 5568 conicto +3712 9472 moveto +4294 10479 5181 10967 conicto +6068 11456 7302 11456 conicto +9347 11456 10625 9834 conicto +11904 8212 11904 5568 conicto +11904 2924 10625 1302 conicto +9347 -320 7302 -320 conicto +6068 -320 5181 168 conicto +4294 657 3712 1664 conicto +3712 0 lineto +1856 0 lineto +1856 15552 lineto +3712 15552 lineto +3712 9472 lineto +end_ol grestore +gsave 19.582308 68.630833 translate 0.035278 -0.035278 scale +start_ol +6309 9920 moveto +4812 9920 3942 8756 conicto +3072 7593 3072 5568 conicto +3072 3543 3937 2379 conicto +4802 1216 6309 1216 conicto +7796 1216 8666 2384 conicto +9536 3553 9536 5568 conicto +9536 7573 8666 8746 conicto +7796 9920 6309 9920 conicto +6304 11456 moveto +8710 11456 10083 9894 conicto +11456 8332 11456 5568 conicto +11456 2814 10083 1247 conicto +8710 -320 6304 -320 conicto +3888 -320 2520 1247 conicto +1152 2814 1152 5568 conicto +1152 8332 2520 9894 conicto +3888 11456 6304 11456 conicto +end_ol grestore +gsave 21.238261 68.630833 translate 0.035278 -0.035278 scale +start_ol +11264 6769 moveto +11264 0 lineto +9408 0 lineto +9408 6708 lineto +9408 8287 8787 9071 conicto +8167 9856 6925 9856 conicto +5434 9856 4573 8912 conicto +3712 7968 3712 6338 conicto +3712 0 lineto +1856 0 lineto +1856 11200 lineto +3712 11200 lineto +3712 9472 lineto +4374 10469 5271 10962 conicto +6169 11456 7343 11456 conicto +9278 11456 10271 10267 conicto +11264 9078 11264 6769 conicto +end_ol grestore +gsave 22.954150 68.630833 translate 0.035278 -0.035278 scale +start_ol +11520 6040 moveto +11520 5120 lineto +3072 5120 lineto +3192 3213 4213 2214 conicto +5234 1216 7057 1216 conicto +8113 1216 9104 1472 conicto +10096 1728 11072 2240 conicto +11072 512 lineto +10085 106 9048 -107 conicto +8011 -320 6944 -320 conicto +4273 -320 2712 1242 conicto +1152 2804 1152 5468 conicto +1152 8222 2635 9839 conicto +4119 11456 6636 11456 conicto +8893 11456 10206 9999 conicto +11520 8543 11520 6040 conicto +9664 6592 moveto +9644 8110 8822 9015 conicto +8001 9920 6647 9920 conicto +5114 9920 4192 9045 conicto +3271 8171 3132 6582 conicto +9664 6592 lineto +end_ol grestore +0.400000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0.400000 slw +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 16.000000 86.000000 m 16.000000 78.000000 l 14.000000 78.000000 l 18.000000 70.000000 l 22.000000 78.000000 l 20.000000 78.000000 l 20.000000 86.000000 l ef +0.000000 0.000000 0.000000 srgb +n 16.000000 86.000000 m 16.000000 78.000000 l 14.000000 78.000000 l 18.000000 70.000000 l 22.000000 78.000000 l 20.000000 78.000000 l 20.000000 86.000000 l cp s +0 slc +0 slj +[] 0 sd +n 16.000000 86.000000 m 16.000000 78.000000 l 14.000000 78.000000 l 18.000000 70.000000 l 22.000000 78.000000 l 20.000000 78.000000 l 20.000000 86.000000 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0.400000 slw +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 51.000000 70.000000 m 51.000000 78.000000 l 49.000000 78.000000 l 53.000000 86.000000 l 57.000000 78.000000 l 55.000000 78.000000 l 55.000000 70.000000 l ef +0.000000 0.000000 0.000000 srgb +n 51.000000 70.000000 m 51.000000 78.000000 l 49.000000 78.000000 l 53.000000 86.000000 l 57.000000 78.000000 l 55.000000 78.000000 l 55.000000 70.000000 l cp s +0 slc +0 slj +[] 0 sd +n 51.000000 70.000000 m 51.000000 78.000000 l 49.000000 78.000000 l 53.000000 86.000000 l 57.000000 78.000000 l 55.000000 78.000000 l 55.000000 70.000000 l cp s +showpage Index: zipcpu/trunk/doc/gfx/cpu.eps =================================================================== --- zipcpu/trunk/doc/gfx/cpu.eps (nonexistent) +++ zipcpu/trunk/doc/gfx/cpu.eps (revision 2) @@ -0,0 +1,2535 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/dan/jericho/work/rnd/zipcpu/cpu.dia +%%Creator: Dia v0.97.2 +%%CreationDate: Sat Jul 25 17:24:08 2015 +%%For: dan +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 634 468 +%%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 +11.063651 -11.063651 scale +0.150000 -42.150000 translate +%%EndProlog + + +0.300000 slw +[] 0 sd +[] 0 sd +1 slj +1.000000 1.000000 0.792157 srgb +n 3.000000 0.000000 m 3.000000 42.000000 l 54.000000 42.000000 l 54.000000 0.000000 l f +n 3.000000 3.000000 m 3.000000 3.000000 3.000000 3.000000 180.000000 270.000000 ellipse f +n 54.000000 3.000000 m 54.000000 3.000000 3.000000 3.000000 270.000000 360.000000 ellipse f +n 0.000000 3.000000 m 0.000000 39.000000 l 57.000000 39.000000 l 57.000000 3.000000 l f +n 3.000000 39.000000 m 3.000000 39.000000 3.000000 3.000000 90.000000 180.000000 ellipse f +n 54.000000 39.000000 m 54.000000 39.000000 3.000000 3.000000 0.000000 90.000000 ellipse f +0.501961 0.501961 0.501961 srgb +n 3.000000 0.000000 m 54.000000 0.000000 l s +n 3.000000 42.000000 m 54.000000 42.000000 l s +n 3.000000 3.000000 3.000000 3.000000 180.000000 270.000000 ellipse s +n 54.000000 3.000000 3.000000 3.000000 270.000000 360.000000 ellipse s +n 0.000000 3.000000 m 0.000000 39.000000 l s +n 57.000000 3.000000 m 57.000000 39.000000 l s +n 3.000000 39.000000 3.000000 3.000000 90.000000 180.000000 ellipse s +n 54.000000 39.000000 3.000000 3.000000 0.000000 90.000000 ellipse s +0.010000 slw +[] 0 sd +0 slj +1 slc +0.000000 0.000000 0.000000 srgb +n 10.015501 29.261623 m 10.010790 29.993986 l 10.075104 29.997733 l 10.087556 29.979478 l 10.078851 29.933419 10.073048 29.902712 10.100853 29.881556 c 10.116207 29.878654 10.116207 29.878654 10.180521 29.882402 c 10.673881 29.884576 l 10.738195 29.888323 10.738195 29.888323 10.753548 29.885422 c 10.756450 29.900775 10.762253 29.931481 10.770957 29.977541 c 10.758505 29.995796 l 10.822820 29.999543 l 10.836600 29.567597 l 10.772285 29.563849 l 10.759833 29.582104 l 10.768538 29.628164 10.758987 29.661772 10.743634 29.664673 c 10.731182 29.682928 10.731182 29.682928 10.666868 29.679181 c 10.427865 29.676643 l 10.424963 29.661290 l 10.425809 29.581622 10.496773 29.536408 10.588892 29.518999 c 10.592639 29.454685 l 10.227909 29.460006 l 10.224162 29.524320 l 10.337437 29.534716 10.379750 29.590326 10.378904 29.669994 c 10.381805 29.685347 l 10.173509 29.677007 l 10.127449 29.685711 10.109194 29.673259 10.090939 29.660808 c 10.072685 29.648356 10.085137 29.630101 10.076432 29.584041 c 10.088884 29.565787 l 10.074377 29.489020 10.108830 29.418903 10.164440 29.376591 c 10.192245 29.355434 10.250757 29.328475 10.327523 29.313968 c 10.315917 29.252555 l 10.015501 29.261623 l ef +n 9.996792 28.931226 m 10.015410 29.198034 l 10.079725 29.201781 l 10.089275 29.168173 l 10.077669 29.106761 10.077669 29.106761 10.172690 29.104705 c 10.666050 29.106879 l 10.715011 29.113528 l 10.761071 29.104823 10.763972 29.120177 10.760225 29.184491 c 10.763126 29.199844 l 10.827441 29.203592 l 10.822120 28.838861 l 10.757805 28.835114 l 10.760707 28.850467 l 10.763608 28.865820 10.769411 28.896527 10.769411 28.896527 c 10.756959 28.914782 10.744508 28.933036 10.713801 28.938839 c 10.664840 28.932190 l 9.996792 28.931226 l ef +n 10.465184 28.254351 m 10.385517 28.253505 10.370163 28.256406 10.329907 28.295817 c 10.307905 28.347680 10.285902 28.399543 10.287958 28.494564 c 10.286266 28.653899 10.349735 28.737314 10.414049 28.741061 c 10.463010 28.747710 10.503267 28.708299 10.509916 28.659338 c 10.513663 28.595024 10.477154 28.570120 10.428193 28.563471 c 10.412840 28.566373 10.397486 28.569274 10.385034 28.587529 c 10.366780 28.575077 10.345624 28.547272 10.352272 28.498311 c 10.340667 28.436898 10.365570 28.400389 10.429885 28.404136 c 10.494199 28.407883 l 10.497100 28.423237 10.500002 28.438590 10.502903 28.453943 c 10.523214 28.561416 10.547271 28.604574 10.558877 28.665987 c 10.588738 28.739852 10.643502 28.777207 10.723170 28.778053 c 10.802837 28.778899 10.837291 28.708782 10.847687 28.595506 c 10.845632 28.500485 10.818673 28.441974 10.761007 28.389265 c 10.807067 28.380561 10.847324 28.341150 10.835718 28.279737 c 10.839465 28.215422 10.797153 28.159812 10.748192 28.153163 c 10.732838 28.156065 10.732838 28.156065 10.735740 28.171418 c 10.738641 28.186771 10.738641 28.186771 10.726190 28.205026 c 10.741543 28.202125 10.741543 28.202125 10.744444 28.217478 c 10.747346 28.232831 10.734894 28.251086 10.670579 28.247338 c 10.465184 28.254351 l ef +1.000000 1.000000 1.000000 srgb +n 10.558513 28.411631 m 10.622828 28.415378 l 10.717849 28.413323 10.757260 28.453579 10.768866 28.514992 c 10.762217 28.563954 10.734412 28.585110 10.685451 28.578461 c 10.624038 28.590067 10.584627 28.549810 10.570119 28.473044 c ef +0.000000 0.000000 0.000000 srgb +n 10.723982 27.835732 m 10.720234 27.900046 10.723136 27.915400 10.689528 27.905849 c 10.658821 27.911652 10.653018 27.880946 10.656766 27.816631 c 10.653864 27.801278 l 10.654710 27.721610 10.633554 27.693805 10.627751 27.663099 c 10.582537 27.592135 10.524872 27.539427 10.463459 27.551033 c 10.399144 27.547285 10.386693 27.565540 10.349337 27.620304 c 10.315729 27.610754 10.312828 27.595401 10.325280 27.577146 c 10.325280 27.577146 10.322378 27.561793 10.322378 27.561793 c 10.353085 27.555990 10.383791 27.550187 10.377988 27.519480 c 10.384637 27.470519 10.345226 27.430262 10.299166 27.438967 c 10.250205 27.432318 10.225302 27.468827 10.218653 27.517789 c 10.230259 27.579202 10.254316 27.622360 10.327335 27.672167 c 10.299530 27.693323 10.280429 27.760539 10.289134 27.806599 c 10.287442 27.965934 10.369165 28.061801 10.467088 28.075099 c 10.546755 28.075945 10.602365 28.033632 10.618565 27.951063 c 10.635973 28.043183 10.690737 28.080538 10.739699 28.087187 c 10.804013 28.090934 10.826015 28.039071 10.845116 27.971855 c 10.859623 28.048622 10.886582 28.107133 10.932642 28.098429 c 11.012310 28.099275 11.059215 28.010903 11.070458 27.817959 c 11.066346 27.627917 10.994173 27.498443 10.883799 27.503400 c 10.819485 27.499652 10.748522 27.544866 10.726519 27.596729 c 10.719871 27.645690 10.713222 27.694651 10.709474 27.758966 c 10.723982 27.835732 l ef +1.000000 1.000000 1.000000 srgb +n 10.350547 27.794993 m 10.341842 27.748933 10.385001 27.724875 10.464668 27.725721 c 10.544336 27.726567 10.580846 27.751471 10.589550 27.797531 c 10.595353 27.828237 10.570449 27.864747 10.557998 27.883001 c 10.524390 27.873451 10.496585 27.894607 10.465878 27.900410 c 10.386210 27.899564 10.346799 27.859307 10.350547 27.794993 c ef +n 10.868810 27.760657 m 10.872557 27.696343 10.872557 27.696343 10.900362 27.675187 c 10.897461 27.659834 10.912814 27.656932 10.928167 27.654031 c 10.977128 27.660679 10.998285 27.688485 11.006143 27.814212 c 11.005297 27.893880 10.967942 27.948644 10.934334 27.939093 c 10.903627 27.944896 10.888274 27.947798 10.882471 27.917091 c ef +0.000000 0.000000 0.000000 srgb +n 10.307355 26.956397 m 10.300706 27.005358 l 10.321862 27.033163 l 10.299860 27.085026 10.293211 27.133987 10.286562 27.182948 c 10.294421 27.308676 10.373243 27.389189 10.471165 27.402487 c 10.501871 27.396684 10.547931 27.387980 10.572835 27.351470 c 10.597738 27.314961 10.625543 27.293805 10.641743 27.211235 c 10.657942 27.128666 l 10.661689 27.064352 10.689494 27.043196 10.723102 27.052746 c 10.769162 27.044042 10.774965 27.074748 10.786571 27.136161 c 10.785725 27.215829 10.738819 27.304201 10.621796 27.358119 c 10.630500 27.404179 l 10.835895 27.397166 l 10.818487 27.305047 l 10.825136 27.256086 10.847138 27.204223 10.850885 27.139908 c 10.840125 26.998828 10.761303 26.918314 10.650929 26.923271 c 10.601968 26.916622 10.561711 26.956033 10.533906 26.977189 c 10.506101 26.998346 10.493649 27.016600 10.477450 27.099169 c 10.451701 27.215347 l 10.426797 27.251856 10.429699 27.267209 10.398992 27.273012 c 10.365384 27.263462 10.344228 27.235657 10.347975 27.171342 c 10.348821 27.091675 10.389078 27.052264 10.460041 27.007050 c 10.466690 26.958089 l 10.307355 26.956397 l ef +1.000000 1.000000 1.000000 srgb +n 10.015501 29.261623 m 10.010790 29.993986 l 10.075104 29.997733 l 10.087556 29.979478 l 10.078851 29.933419 10.073048 29.902712 10.100853 29.881556 c 10.116207 29.878654 10.116207 29.878654 10.180521 29.882402 c 10.673881 29.884576 l 10.738195 29.888323 10.738195 29.888323 10.753548 29.885422 c 10.756450 29.900775 10.762253 29.931481 10.770957 29.977541 c 10.758505 29.995796 l 10.822820 29.999543 l 10.836600 29.567597 l 10.772285 29.563849 l 10.759833 29.582104 l 10.768538 29.628164 10.758987 29.661772 10.743634 29.664673 c 10.731182 29.682928 10.731182 29.682928 10.666868 29.679181 c 10.427865 29.676643 l 10.424963 29.661290 l 10.425809 29.581622 10.496773 29.536408 10.588892 29.518999 c 10.592639 29.454685 l 10.227909 29.460006 l 10.224162 29.524320 l 10.337437 29.534716 10.379750 29.590326 10.378904 29.669994 c 10.381805 29.685347 l 10.173509 29.677007 l 10.127449 29.685711 10.109194 29.673259 10.090939 29.660808 c 10.072685 29.648356 10.085137 29.630101 10.076432 29.584041 c 10.088884 29.565787 l 10.074377 29.489020 10.108830 29.418903 10.164440 29.376591 c 10.192245 29.355434 10.250757 29.328475 10.327523 29.313968 c 10.315917 29.252555 l 10.015501 29.261623 l s +n 9.996792 28.931226 m 10.015410 29.198034 l 10.079725 29.201781 l 10.089275 29.168173 l 10.077669 29.106761 10.077669 29.106761 10.172690 29.104705 c 10.666050 29.106879 l 10.715011 29.113528 l 10.761071 29.104823 10.763972 29.120177 10.760225 29.184491 c 10.763126 29.199844 l 10.827441 29.203592 l 10.822120 28.838861 l 10.757805 28.835114 l 10.760707 28.850467 l 10.763608 28.865820 10.769411 28.896527 10.769411 28.896527 c 10.756959 28.914782 10.744508 28.933036 10.713801 28.938839 c 10.664840 28.932190 l 9.996792 28.931226 l s +n 10.465184 28.254351 m 10.385517 28.253505 10.370163 28.256406 10.329907 28.295817 c 10.307905 28.347680 10.285902 28.399543 10.287958 28.494564 c 10.286266 28.653899 10.349735 28.737314 10.414049 28.741061 c 10.463010 28.747710 10.503267 28.708299 10.509916 28.659338 c 10.513663 28.595024 10.477154 28.570120 10.428193 28.563471 c 10.412840 28.566373 10.397486 28.569274 10.385034 28.587529 c 10.366780 28.575077 10.345624 28.547272 10.352272 28.498311 c 10.340667 28.436898 10.365570 28.400389 10.429885 28.404136 c 10.494199 28.407883 l 10.497100 28.423237 10.500002 28.438590 10.502903 28.453943 c 10.523214 28.561416 10.547271 28.604574 10.558877 28.665987 c 10.588738 28.739852 10.643502 28.777207 10.723170 28.778053 c 10.802837 28.778899 10.837291 28.708782 10.847687 28.595506 c 10.845632 28.500485 10.818673 28.441974 10.761007 28.389265 c 10.807067 28.380561 10.847324 28.341150 10.835718 28.279737 c 10.839465 28.215422 10.797153 28.159812 10.748192 28.153163 c 10.732838 28.156065 10.732838 28.156065 10.735740 28.171418 c 10.738641 28.186771 10.738641 28.186771 10.726190 28.205026 c 10.741543 28.202125 10.741543 28.202125 10.744444 28.217478 c 10.747346 28.232831 10.734894 28.251086 10.670579 28.247338 c 10.465184 28.254351 l s +n 10.558513 28.411631 m 10.622828 28.415378 l 10.717849 28.413323 10.757260 28.453579 10.768866 28.514992 c 10.762217 28.563954 10.734412 28.585110 10.685451 28.578461 c 10.624038 28.590067 10.584627 28.549810 10.570119 28.473044 c 10.558513 28.411631 l s +n 10.723982 27.835732 m 10.720234 27.900046 10.723136 27.915400 10.689528 27.905849 c 10.658821 27.911652 10.653018 27.880946 10.656766 27.816631 c 10.653864 27.801278 l 10.654710 27.721610 10.633554 27.693805 10.627751 27.663099 c 10.582537 27.592135 10.524872 27.539427 10.463459 27.551033 c 10.399144 27.547285 10.386693 27.565540 10.349337 27.620304 c 10.315729 27.610754 10.312828 27.595401 10.325280 27.577146 c 10.325280 27.577146 10.322378 27.561793 10.322378 27.561793 c 10.353085 27.555990 10.383791 27.550187 10.377988 27.519480 c 10.384637 27.470519 10.345226 27.430262 10.299166 27.438967 c 10.250205 27.432318 10.225302 27.468827 10.218653 27.517789 c 10.230259 27.579202 10.254316 27.622360 10.327335 27.672167 c 10.299530 27.693323 10.280429 27.760539 10.289134 27.806599 c 10.287442 27.965934 10.369165 28.061801 10.467088 28.075099 c 10.546755 28.075945 10.602365 28.033632 10.618565 27.951063 c 10.635973 28.043183 10.690737 28.080538 10.739699 28.087187 c 10.804013 28.090934 10.826015 28.039071 10.845116 27.971855 c 10.859623 28.048622 10.886582 28.107133 10.932642 28.098429 c 11.012310 28.099275 11.059215 28.010903 11.070458 27.817959 c 11.066346 27.627917 10.994173 27.498443 10.883799 27.503400 c 10.819485 27.499652 10.748522 27.544866 10.726519 27.596729 c 10.719871 27.645690 10.713222 27.694651 10.709474 27.758966 c 10.723982 27.835732 l s +n 10.350547 27.794993 m 10.341842 27.748933 10.385001 27.724875 10.464668 27.725721 c 10.544336 27.726567 10.580846 27.751471 10.589550 27.797531 c 10.595353 27.828237 10.570449 27.864747 10.557998 27.883001 c 10.524390 27.873451 10.496585 27.894607 10.465878 27.900410 c 10.386210 27.899564 10.346799 27.859307 10.350547 27.794993 c 10.350547 27.794993 l s +n 10.868810 27.760657 m 10.872557 27.696343 10.872557 27.696343 10.900362 27.675187 c 10.897461 27.659834 10.912814 27.656932 10.928167 27.654031 c 10.977128 27.660679 10.998285 27.688485 11.006143 27.814212 c 11.005297 27.893880 10.967942 27.948644 10.934334 27.939093 c 10.903627 27.944896 10.888274 27.947798 10.882471 27.917091 c 10.868810 27.760657 l s +n 10.307355 26.956397 m 10.300706 27.005358 l 10.321862 27.033163 l 10.299860 27.085026 10.293211 27.133987 10.286562 27.182948 c 10.294421 27.308676 10.373243 27.389189 10.471165 27.402487 c 10.501871 27.396684 10.547931 27.387980 10.572835 27.351470 c 10.597738 27.314961 10.625543 27.293805 10.641743 27.211235 c 10.657942 27.128666 l 10.661689 27.064352 10.689494 27.043196 10.723102 27.052746 c 10.769162 27.044042 10.774965 27.074748 10.786571 27.136161 c 10.785725 27.215829 10.738819 27.304201 10.621796 27.358119 c 10.630500 27.404179 l 10.835895 27.397166 l 10.818487 27.305047 l 10.825136 27.256086 10.847138 27.204223 10.850885 27.139908 c 10.840125 26.998828 10.761303 26.918314 10.650929 26.923271 c 10.601968 26.916622 10.561711 26.956033 10.533906 26.977189 c 10.506101 26.998346 10.493649 27.016600 10.477450 27.099169 c 10.451701 27.215347 l 10.426797 27.251856 10.429699 27.267209 10.398992 27.273012 c 10.365384 27.263462 10.344228 27.235657 10.347975 27.171342 c 10.348821 27.091675 10.389078 27.052264 10.460041 27.007050 c 10.466690 26.958089 l 10.307355 26.956397 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +0.000000 0.000000 0.000000 srgb +n 15.000000 30.000000 m 15.000000 31.000000 l 11.000000 31.000000 l 11.000000 25.000000 l 15.000000 25.000000 l 15.000000 25.513197 l s +[] 0 sd +0 slj +0 slc +n 15.000000 25.888197 m 14.750000 25.388197 l 15.000000 25.513197 l 15.250000 25.388197 l ef +n 15.000000 25.888197 m 14.750000 25.388197 l 15.000000 25.513197 l 15.250000 25.388197 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.000000 25.000000 m 31.000000 25.000000 l 31.000000 25.513197 l s +[] 0 sd +0 slj +0 slc +n 31.000000 25.888197 m 30.750000 25.388197 l 31.000000 25.513197 l 31.250000 25.388197 l ef +n 31.000000 25.888197 m 30.750000 25.388197 l 31.000000 25.513197 l 31.250000 25.388197 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 28.000000 8.000000 m 28.000000 10.065983 l s +[] 0 sd +0 slj +0 slc +n 28.000000 10.440983 m 27.750000 9.940983 l 28.000000 10.065983 l 28.250000 9.940983 l ef +n 28.000000 10.440983 m 27.750000 9.940983 l 28.000000 10.065983 l 28.250000 9.940983 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 28.000000 15.000000 m 28.000000 17.065983 l s +[] 0 sd +0 slj +0 slc +n 28.000000 17.440983 m 27.750000 16.940983 l 28.000000 17.065983 l 28.250000 16.940983 l ef +n 28.000000 17.440983 m 27.750000 16.940983 l 28.000000 17.065983 l 28.250000 16.940983 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 28.000000 22.000000 m 28.000000 24.000000 l 20.000000 24.000000 l 20.000000 25.177786 l s +[] 0 sd +0 slj +0 slc +n 20.000000 25.552786 m 19.750000 25.052786 l 20.000000 25.177786 l 20.250000 25.052786 l ef +n 20.000000 25.552786 m 19.750000 25.052786 l 20.000000 25.177786 l 20.250000 25.052786 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 28.000000 24.000000 m 28.000000 24.000000 l 35.750000 24.000000 l 35.750000 25.177786 l s +[] 0 sd +0 slj +0 slc +n 35.750000 25.552786 m 35.500000 25.052786 l 35.750000 25.177786 l 36.000000 25.052786 l ef +n 35.750000 25.552786 m 35.500000 25.052786 l 35.750000 25.177786 l 36.000000 25.052786 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 20.000000 30.000000 m 20.000000 32.000000 l 28.000000 32.000000 l 28.000000 33.177786 l s +[] 0 sd +0 slj +0 slc +n 28.000000 33.552786 m 27.750000 33.052786 l 28.000000 33.177786 l 28.250000 33.052786 l ef +n 28.000000 33.552786 m 27.750000 33.052786 l 28.000000 33.177786 l 28.250000 33.052786 l cp s +0.400000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 36.000000 30.000000 m 36.000000 32.000000 l 28.000000 32.000000 l 28.000000 32.000000 l s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 21.000000 36.000000 m 8.934017 36.000000 l s +[] 0 sd +0 slj +0 slc +n 8.559017 36.000000 m 9.059017 35.750000 l 8.934017 36.000000 l 9.059017 36.250000 l ef +n 8.559017 36.000000 m 9.059017 35.750000 l 8.934017 36.000000 l 9.059017 36.250000 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 8.000000 20.000000 m 20.065983 20.000000 l s +[] 0 sd +0 slj +0 slc +n 20.440983 20.000000 m 19.940983 20.250000 l 20.065983 20.000000 l 19.940983 19.750000 l ef +n 20.440983 20.000000 m 19.940983 20.250000 l 20.065983 20.000000 l 19.940983 19.750000 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 49.000000 6.000000 m 35.934017 6.000000 l s +[] 0 sd +0 slj +0 slc +n 35.559017 6.000000 m 36.059017 5.750000 l 35.934017 6.000000 l 36.059017 6.250000 l ef +n 35.559017 6.000000 m 36.059017 5.750000 l 35.934017 6.000000 l 36.059017 6.250000 l cp s +0.500000 slw +[] 0 sd +[] 0 sd +0 slc +n 48.065983 28.000000 m 43.434017 28.000000 l s +[] 0 sd +0 slj +0 slc +n 48.440983 28.000000 m 47.940983 28.250000 l 48.065983 28.000000 l 47.940983 27.750000 l ef +n 48.440983 28.000000 m 47.940983 28.250000 l 48.065983 28.000000 l 47.940983 27.750000 l cp s +[] 0 sd +0 slj +0 slc +n 43.059017 28.000000 m 43.559017 27.750000 l 43.434017 28.000000 l 43.559017 28.250000 l ef +n 43.059017 28.000000 m 43.559017 27.750000 l 43.434017 28.000000 l 43.559017 28.250000 l cp s +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 29.000000 26.000000 m 29.000000 30.000000 l 42.500000 30.000000 l 42.500000 26.000000 l f +0.117647 0.564706 1.000000 srgb +n 29.000000 26.000000 m 29.000000 30.000000 l 42.500000 30.000000 l 42.500000 26.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 30.341250 28.468750 translate 0.035278 -0.035278 scale +start_ol +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +512 6976 lineto +512 7488 lineto +2737 7488 lineto +5313 2148 lineto +7906 7488 lineto +9984 7488 lineto +9984 6976 lineto +8960 6976 lineto +8960 512 lineto +9920 512 lineto +9920 0 lineto +6976 0 lineto +6976 512 lineto +7936 512 lineto +7936 6340 lineto +5401 1083 lineto +4711 1083 lineto +2176 6340 lineto +2176 512 lineto +3136 512 lineto +3136 0 lineto +576 0 lineto +end_ol grestore +gsave 31.727452 28.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 32.529197 28.468750 translate 0.035278 -0.035278 scale +start_ol +5362 4239 moveto +5631 4834 6049 5137 conicto +6468 5440 7025 5440 conicto +7872 5440 8288 4919 conicto +8704 4398 8704 3345 conicto +8704 512 lineto +9536 512 lineto +9536 0 lineto +6976 0 lineto +6976 512 lineto +7808 512 lineto +7808 3240 lineto +7808 4050 7560 4393 conicto +7313 4736 6740 4736 conicto +6106 4736 5773 4274 conicto +5440 3812 5440 2927 conicto +5440 512 lineto +6272 512 lineto +6272 0 lineto +3712 0 lineto +3712 512 lineto +4544 512 lineto +4544 3275 lineto +4544 4065 4296 4400 conicto +4049 4736 3476 4736 conicto +2842 4736 2509 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4329 lineto +2435 4869 2836 5154 conicto +3238 5440 3746 5440 conicto +4376 5440 4798 5127 conicto +5220 4814 5362 4239 conicto +end_ol grestore +gsave 33.812997 28.468750 translate 0.035278 -0.035278 scale +start_ol +3072 384 moveto +3801 384 4172 960 conicto +4544 1536 4544 2658 conicto +4544 3781 4172 4354 conicto +3801 4928 3072 4928 conicto +2343 4928 1971 4354 conicto +1600 3781 1600 2658 conicto +1600 1536 1974 960 conicto +2348 384 3072 384 conicto +3072 -128 moveto +1917 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3920 1212 4680 conicto +1912 5440 3072 5440 conicto +4232 5440 4932 4680 conicto +5632 3920 5632 2658 conicto +5632 1397 4932 634 conicto +4232 -128 3072 -128 conicto +end_ol grestore +gsave 34.627235 28.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 35.274125 28.468750 translate 0.035278 -0.035278 scale +start_ol +2234 -1021 moveto +2582 -126 lineto +618 4800 lineto +0 4800 lineto +0 5312 lineto +2438 5312 lineto +2438 4800 lineto +1593 4800 lineto +3080 1130 lineto +4567 4800 lineto +3776 4800 lineto +3776 5312 lineto +5760 5312 lineto +5760 4800 lineto +5168 4800 lineto +2747 -1248 lineto +2500 -1857 2199 -2080 conicto +1898 -2304 1351 -2304 conicto +1119 -2304 875 -2271 conicto +631 -2238 384 -2176 conicto +384 -1152 lineto +832 -1152 lineto +862 -1495 1003 -1643 conicto +1145 -1792 1444 -1792 conicto +1717 -1792 1883 -1638 conicto +2050 -1485 2234 -1021 conicto +end_ol grestore +gsave 36.038407 28.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 36.468000 28.468750 translate 0.035278 -0.035278 scale +start_ol +2048 2688 moveto +4786 2688 lineto +3417 6268 lineto +2048 2688 lineto +-64 0 moveto +-64 512 lineto +594 512 lineto +3252 7488 lineto +4091 7488 lineto +6754 512 lineto +7488 512 lineto +7488 0 lineto +4776 0 lineto +4776 512 lineto +5605 512 lineto +4980 2176 lineto +1843 2176 lineto +1219 512 lineto +2038 512 lineto +2038 0 lineto +-64 0 lineto +end_ol grestore +gsave 37.444585 28.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 38.201376 28.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 38.958167 28.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 39.759912 28.468750 translate 0.035278 -0.035278 scale +start_ol +576 320 moveto +576 1536 lineto +1088 1536 lineto +1108 958 1469 671 conicto +1831 384 2538 384 conicto +3174 384 3507 611 conicto +3840 839 3840 1274 conicto +3840 1616 3599 1826 conicto +3358 2036 2582 2276 conicto +1908 2498 lineto +1206 2717 891 3046 conicto +576 3376 576 3884 conicto +576 4612 1117 5026 conicto +1658 5440 2614 5440 conicto +3039 5440 3509 5325 conicto +3979 5211 4480 4992 conicto +4480 3840 lineto +3968 3840 lineto +3948 4352 3603 4640 conicto +3258 4928 2664 4928 conicto +2076 4928 1774 4725 conicto +1472 4522 1472 4115 conicto +1472 3783 1700 3582 conicto +1928 3382 2613 3174 conicto +3353 2952 lineto +4088 2720 4412 2371 conicto +4736 2023 4736 1474 conicto +4736 727 4158 299 conicto +3580 -128 2563 -128 conicto +2048 -128 1557 -16 conicto +1067 96 576 320 conicto +end_ol grestore +gsave 40.454262 28.468750 translate 0.035278 -0.035278 scale +start_ol +576 320 moveto +576 1536 lineto +1088 1536 lineto +1108 958 1469 671 conicto +1831 384 2538 384 conicto +3174 384 3507 611 conicto +3840 839 3840 1274 conicto +3840 1616 3599 1826 conicto +3358 2036 2582 2276 conicto +1908 2498 lineto +1206 2717 891 3046 conicto +576 3376 576 3884 conicto +576 4612 1117 5026 conicto +1658 5440 2614 5440 conicto +3039 5440 3509 5325 conicto +3979 5211 4480 4992 conicto +4480 3840 lineto +3968 3840 lineto +3948 4352 3603 4640 conicto +3258 4928 2664 4928 conicto +2076 4928 1774 4725 conicto +1472 4522 1472 4115 conicto +1472 3783 1700 3582 conicto +1928 3382 2613 3174 conicto +3353 2952 lineto +4088 2720 4412 2371 conicto +4736 2023 4736 1474 conicto +4736 727 4158 299 conicto +3580 -128 2563 -128 conicto +2048 -128 1557 -16 conicto +1067 96 576 320 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 13.000000 26.000000 m 13.000000 30.000000 l 27.000000 30.000000 l 27.000000 26.000000 l f +0.000000 0.000000 0.600000 srgb +n 13.000000 26.000000 m 13.000000 30.000000 l 27.000000 30.000000 l 27.000000 26.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 14.250000 28.468750 translate 0.035278 -0.035278 scale +start_ol +2048 2688 moveto +4786 2688 lineto +3417 6268 lineto +2048 2688 lineto +-64 0 moveto +-64 512 lineto +594 512 lineto +3252 7488 lineto +4091 7488 lineto +6754 512 lineto +7488 512 lineto +7488 0 lineto +4776 0 lineto +4776 512 lineto +5605 512 lineto +4980 2176 lineto +1843 2176 lineto +1219 512 lineto +2038 512 lineto +2038 0 lineto +-64 0 lineto +end_ol grestore +gsave 15.226585 28.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 15.873475 28.468750 translate 0.035278 -0.035278 scale +start_ol +960 6973 moveto +960 7207 1130 7379 conicto +1300 7552 1539 7552 conicto +1772 7552 1942 7379 conicto +2112 7207 2112 6973 conicto +2112 6735 1944 6567 conicto +1777 6400 1539 6400 conicto +1300 6400 1130 6567 conicto +960 6735 960 6973 conicto +2176 512 moveto +3072 512 lineto +3072 0 lineto +384 0 lineto +384 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 512 lineto +end_ol grestore +gsave 16.305564 28.468750 translate 0.035278 -0.035278 scale +start_ol +1088 4800 moveto +256 4800 lineto +256 5312 lineto +1088 5312 lineto +1088 6976 lineto +1984 6976 lineto +1984 5312 lineto +3753 5312 lineto +3753 4800 lineto +1984 4800 lineto +1984 1435 lineto +1984 763 2117 573 conicto +2251 384 2610 384 conicto +2979 384 3148 595 conicto +3318 807 3328 1280 conicto +4032 1280 lineto +3992 548 3635 210 conicto +3278 -128 2550 -128 conicto +1751 -128 1419 227 conicto +1088 583 1088 1435 conicto +1088 4800 lineto +end_ol grestore +gsave 16.850052 28.468750 translate 0.035278 -0.035278 scale +start_ol +448 0 moveto +448 512 lineto +1280 512 lineto +1280 7296 lineto +384 7296 lineto +384 7808 lineto +2176 7808 lineto +2176 4329 lineto +2432 4879 2840 5159 conicto +3249 5440 3790 5440 conicto +4672 5440 5088 4931 conicto +5504 4423 5504 3345 conicto +5504 512 lineto +6336 512 lineto +6336 0 lineto +3840 0 lineto +3840 512 lineto +4608 512 lineto +4608 3056 lineto +4608 4025 4367 4380 conicto +4126 4736 3506 4736 conicto +2856 4736 2516 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +end_ol grestore +gsave 17.721730 28.468750 translate 0.035278 -0.035278 scale +start_ol +5362 4239 moveto +5631 4834 6049 5137 conicto +6468 5440 7025 5440 conicto +7872 5440 8288 4919 conicto +8704 4398 8704 3345 conicto +8704 512 lineto +9536 512 lineto +9536 0 lineto +6976 0 lineto +6976 512 lineto +7808 512 lineto +7808 3240 lineto +7808 4050 7560 4393 conicto +7313 4736 6740 4736 conicto +6106 4736 5773 4274 conicto +5440 3812 5440 2927 conicto +5440 512 lineto +6272 512 lineto +6272 0 lineto +3712 0 lineto +3712 512 lineto +4544 512 lineto +4544 3275 lineto +4544 4065 4296 4400 conicto +4049 4736 3476 4736 conicto +2842 4736 2509 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4329 lineto +2435 4869 2836 5154 conicto +3238 5440 3746 5440 conicto +4376 5440 4798 5127 conicto +5220 4814 5362 4239 conicto +end_ol grestore +gsave 19.005530 28.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 19.807275 28.468750 translate 0.035278 -0.035278 scale +start_ol +1088 4800 moveto +256 4800 lineto +256 5312 lineto +1088 5312 lineto +1088 6976 lineto +1984 6976 lineto +1984 5312 lineto +3753 5312 lineto +3753 4800 lineto +1984 4800 lineto +1984 1435 lineto +1984 763 2117 573 conicto +2251 384 2610 384 conicto +2979 384 3148 595 conicto +3318 807 3328 1280 conicto +4032 1280 lineto +3992 548 3635 210 conicto +3278 -128 2550 -128 conicto +1751 -128 1419 227 conicto +1088 583 1088 1435 conicto +1088 4800 lineto +end_ol grestore +gsave 20.351763 28.468750 translate 0.035278 -0.035278 scale +start_ol +960 6973 moveto +960 7207 1130 7379 conicto +1300 7552 1539 7552 conicto +1772 7552 1942 7379 conicto +2112 7207 2112 6973 conicto +2112 6735 1944 6567 conicto +1777 6400 1539 6400 conicto +1300 6400 1130 6567 conicto +960 6735 960 6973 conicto +2176 512 moveto +3072 512 lineto +3072 0 lineto +384 0 lineto +384 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 512 lineto +end_ol grestore +gsave 20.783852 28.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 21.540643 28.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 21.970236 28.468750 translate 0.035278 -0.035278 scale +start_ol +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +3520 7488 lineto +3520 6976 lineto +2560 6976 lineto +2560 640 lineto +5952 640 lineto +5952 1920 lineto +6592 1920 lineto +6592 0 lineto +576 0 lineto +end_ol grestore +gsave 22.869389 28.468750 translate 0.035278 -0.035278 scale +start_ol +3072 384 moveto +3801 384 4172 960 conicto +4544 1536 4544 2658 conicto +4544 3781 4172 4354 conicto +3801 4928 3072 4928 conicto +2343 4928 1971 4354 conicto +1600 3781 1600 2658 conicto +1600 1536 1974 960 conicto +2348 384 3072 384 conicto +3072 -128 moveto +1917 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3920 1212 4680 conicto +1912 5440 3072 5440 conicto +4232 5440 4932 4680 conicto +5632 3920 5632 2658 conicto +5632 1397 4932 634 conicto +4232 -128 3072 -128 conicto +end_ol grestore +gsave 23.683628 28.468750 translate 0.035278 -0.035278 scale +start_ol +5376 4800 moveto +5376 132 lineto +5376 -1035 4745 -1669 conicto +4115 -2304 2950 -2304 conicto +2425 -2304 1944 -2208 conicto +1464 -2112 1024 -1920 conicto +1024 -832 lineto +1536 -832 lineto +1626 -1331 1960 -1561 conicto +2294 -1792 2918 -1792 conicto +3727 -1792 4103 -1327 conicto +4480 -863 4480 132 conicto +4480 848 lineto +4208 347 3788 109 conicto +3369 -128 2750 -128 conicto +1764 -128 1138 644 conicto +512 1417 512 2658 conicto +512 3900 1135 4670 conicto +1759 5440 2750 5440 conicto +3369 5440 3788 5212 conicto +4208 4984 4480 4505 conicto +4480 5312 lineto +6272 5312 lineto +6272 4800 lineto +5376 4800 lineto +4480 2939 moveto +4480 3875 4111 4369 conicto +3742 4864 3040 4864 conicto +2328 4864 1964 4309 conicto +1600 3754 1600 2658 conicto +1600 1568 1964 1008 conicto +2328 448 3040 448 conicto +3742 448 4111 951 conicto +4480 1454 4480 2414 conicto +4480 2939 lineto +end_ol grestore +gsave 24.550312 28.468750 translate 0.035278 -0.035278 scale +start_ol +960 6973 moveto +960 7207 1130 7379 conicto +1300 7552 1539 7552 conicto +1772 7552 1942 7379 conicto +2112 7207 2112 6973 conicto +2112 6735 1944 6567 conicto +1777 6400 1539 6400 conicto +1300 6400 1130 6567 conicto +960 6735 960 6973 conicto +2176 512 moveto +3072 512 lineto +3072 0 lineto +384 0 lineto +384 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 512 lineto +end_ol grestore +gsave 24.982401 28.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 21.000000 34.000000 m 21.000000 38.000000 l 35.000000 38.000000 l 35.000000 34.000000 l f +1.000000 0.329412 0.329412 srgb +n 21.000000 34.000000 m 21.000000 38.000000 l 35.000000 38.000000 l 35.000000 34.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 24.197500 36.468750 translate 0.035278 -0.035278 scale +start_ol +7809 0 moveto +6990 0 lineto +5282 6110 lineto +3575 0 lineto +2756 0 lineto +803 6976 lineto +64 6976 lineto +64 7488 lineto +2786 7488 lineto +2786 6976 lineto +1857 6976 lineto +3410 1424 lineto +5108 7488 lineto +5917 7488 lineto +7645 1359 lineto +9208 6976 lineto +8349 6976 lineto +8349 7488 lineto +10496 7488 lineto +10496 6976 lineto +9762 6976 lineto +7809 0 lineto +end_ol grestore +gsave 25.528751 36.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 26.175641 36.468750 translate 0.035278 -0.035278 scale +start_ol +960 6973 moveto +960 7207 1130 7379 conicto +1300 7552 1539 7552 conicto +1772 7552 1942 7379 conicto +2112 7207 2112 6973 conicto +2112 6735 1944 6567 conicto +1777 6400 1539 6400 conicto +1300 6400 1130 6567 conicto +960 6735 960 6973 conicto +2176 512 moveto +3072 512 lineto +3072 0 lineto +384 0 lineto +384 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 512 lineto +end_ol grestore +gsave 26.607730 36.468750 translate 0.035278 -0.035278 scale +start_ol +1088 4800 moveto +256 4800 lineto +256 5312 lineto +1088 5312 lineto +1088 6976 lineto +1984 6976 lineto +1984 5312 lineto +3753 5312 lineto +3753 4800 lineto +1984 4800 lineto +1984 1435 lineto +1984 763 2117 573 conicto +2251 384 2610 384 conicto +2979 384 3148 595 conicto +3318 807 3328 1280 conicto +4032 1280 lineto +3992 548 3635 210 conicto +3278 -128 2550 -128 conicto +1751 -128 1419 227 conicto +1088 583 1088 1435 conicto +1088 4800 lineto +end_ol grestore +gsave 27.152218 36.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 27.953963 36.468750 translate 0.035278 -0.035278 scale +start_ol +448 3136 moveto +3008 3136 lineto +3008 2368 lineto +448 2368 lineto +448 3136 lineto +end_ol grestore +gsave 28.411031 36.468750 translate 0.035278 -0.035278 scale +start_ol +2560 512 moveto +4040 512 lineto +4935 512 5347 903 conicto +5760 1295 5760 2149 conicto +5760 2998 5350 3387 conicto +4940 3776 4040 3776 conicto +2560 3776 lineto +2560 512 lineto +2560 4288 moveto +3817 4288 lineto +4629 4288 5002 4611 conicto +5376 4934 5376 5632 conicto +5376 6335 5002 6655 conicto +4629 6976 3817 6976 conicto +2560 6976 lineto +2560 4288 lineto +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +4262 7488 lineto +5388 7488 5958 7020 conicto +6528 6553 6528 5623 conicto +6528 4951 6131 4551 conicto +5734 4152 4970 4061 conicto +5923 3941 6417 3455 conicto +6912 2970 6912 2153 conicto +6912 1046 6212 523 conicto +5513 0 4030 0 conicto +576 0 lineto +end_ol grestore +gsave 29.405095 36.468750 translate 0.035278 -0.035278 scale +start_ol +4096 1672 moveto +4096 2816 lineto +2902 2816 lineto +2211 2816 1873 2517 conicto +1536 2219 1536 1603 conicto +1536 1041 1878 712 conicto +2221 384 2806 384 conicto +3385 384 3740 741 conicto +4096 1098 4096 1672 conicto +4992 3318 moveto +4992 512 lineto +5824 512 lineto +5824 0 lineto +4096 0 lineto +4096 558 lineto +3789 205 3387 38 conicto +2985 -128 2447 -128 conicto +1558 -128 1035 339 conicto +512 807 512 1602 conicto +512 2423 1109 2875 conicto +1707 3328 2796 3328 conicto +4096 3328 lineto +4096 3690 lineto +4096 4280 3718 4604 conicto +3341 4928 2658 4928 conicto +2094 4928 1760 4685 conicto +1426 4443 1344 3968 conicto +896 3968 lineto +896 5056 lineto +1378 5248 1833 5344 conicto +2288 5440 2720 5440 conicto +3831 5440 4411 4897 conicto +4992 4354 4992 3318 conicto +end_ol grestore +gsave 30.211835 36.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 30.968626 36.468750 translate 0.035278 -0.035278 scale +start_ol +2880 0 moveto +312 0 lineto +312 512 lineto +1152 512 lineto +1152 7296 lineto +256 7296 lineto +256 7808 lineto +2048 7808 lineto +2048 2717 lineto +4290 4800 lineto +3525 4800 lineto +3525 5312 lineto +5930 5312 lineto +5930 4800 lineto +5020 4800 lineto +3440 3327 lineto +5460 512 lineto +6225 512 lineto +6225 0 lineto +3605 0 lineto +3605 512 lineto +4365 512 lineto +2775 2717 lineto +2048 2036 lineto +2048 512 lineto +2880 512 lineto +2880 0 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 21.000000 18.000000 m 21.000000 22.000000 l 35.000000 22.000000 l 35.000000 18.000000 l f +1.000000 0.749020 0.000000 srgb +n 21.000000 18.000000 m 21.000000 22.000000 l 35.000000 22.000000 l 35.000000 18.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 22.701250 20.468750 translate 0.035278 -0.035278 scale +start_ol +4921 3745 moveto +5275 3649 5530 3420 conicto +5785 3191 5987 2778 conicto +7076 512 lineto +7986 512 lineto +7986 0 lineto +6223 0 lineto +5048 2400 lineto +4709 3106 4425 3313 conicto +4141 3520 3645 3520 conicto +2560 3520 lineto +2560 512 lineto +3584 512 lineto +3584 0 lineto +576 0 lineto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +4359 7488 lineto +5460 7488 6058 6970 conicto +6656 6453 6656 5502 conicto +6656 4735 6219 4295 conicto +5783 3855 4921 3745 conicto +2560 4032 moveto +4010 4032 lineto +4775 4032 5139 4392 conicto +5504 4752 5504 5507 conicto +5504 6261 5139 6618 conicto +4775 6976 4010 6976 conicto +2560 6976 lineto +2560 4032 lineto +end_ol grestore +gsave 23.720293 20.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 24.522038 20.468750 translate 0.035278 -0.035278 scale +start_ol +4096 1672 moveto +4096 2816 lineto +2902 2816 lineto +2211 2816 1873 2517 conicto +1536 2219 1536 1603 conicto +1536 1041 1878 712 conicto +2221 384 2806 384 conicto +3385 384 3740 741 conicto +4096 1098 4096 1672 conicto +4992 3318 moveto +4992 512 lineto +5824 512 lineto +5824 0 lineto +4096 0 lineto +4096 558 lineto +3789 205 3387 38 conicto +2985 -128 2447 -128 conicto +1558 -128 1035 339 conicto +512 807 512 1602 conicto +512 2423 1109 2875 conicto +1707 3328 2796 3328 conicto +4096 3328 lineto +4096 3690 lineto +4096 4280 3718 4604 conicto +3341 4928 2658 4928 conicto +2094 4928 1760 4685 conicto +1426 4443 1344 3968 conicto +896 3968 lineto +896 5056 lineto +1378 5248 1833 5344 conicto +2288 5440 2720 5440 conicto +3831 5440 4411 4897 conicto +4992 4354 4992 3318 conicto +end_ol grestore +gsave 25.328777 20.468750 translate 0.035278 -0.035278 scale +start_ol +5376 512 moveto +6272 512 lineto +6272 0 lineto +4480 0 lineto +4480 812 lineto +4208 330 3788 101 conicto +3369 -128 2750 -128 conicto +1764 -128 1138 644 conicto +512 1417 512 2658 conicto +512 3900 1135 4670 conicto +1759 5440 2750 5440 conicto +3369 5440 3788 5202 conicto +4208 4965 4480 4464 conicto +4480 7296 lineto +3584 7296 lineto +3584 7808 lineto +5376 7808 lineto +5376 512 lineto +4480 2376 moveto +4480 2900 lineto +4480 3855 4111 4359 conicto +3742 4864 3040 4864 conicto +2328 4864 1964 4309 conicto +1600 3754 1600 2658 conicto +1600 1568 1964 1008 conicto +2328 448 3040 448 conicto +3742 448 4111 941 conicto +4480 1434 4480 2376 conicto +end_ol grestore +gsave 26.195462 20.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 26.625054 20.468750 translate 0.035278 -0.035278 scale +start_ol +4194 384 moveto +5413 384 6034 1232 conicto +6656 2080 6656 3741 conicto +6656 5408 6034 6256 conicto +5413 7104 4194 7104 conicto +2971 7104 2349 6256 conicto +1728 5408 1728 3741 conicto +1728 2080 2349 1232 conicto +2971 384 4194 384 conicto +4192 -128 moveto +3434 -128 2798 122 conicto +2162 372 1678 857 conicto +1120 1417 848 2127 conicto +576 2837 576 3742 conicto +576 4646 848 5358 conicto +1120 6071 1678 6631 conicto +2167 7121 2795 7368 conicto +3424 7616 4192 7616 conicto +5813 7616 6810 6551 conicto +7808 5486 7808 3742 conicto +7808 2847 7533 2129 conicto +7259 1412 6701 857 conicto +6212 367 5583 119 conicto +4955 -128 4192 -128 conicto +end_ol grestore +gsave 27.734014 20.468750 translate 0.035278 -0.035278 scale +start_ol +2048 2939 moveto +2048 2414 lineto +2048 1454 2417 951 conicto +2787 448 3491 448 conicto +4199 448 4563 1008 conicto +4928 1568 4928 2658 conicto +4928 3754 4563 4309 conicto +4199 4864 3491 4864 conicto +2787 4864 2417 4369 conicto +2048 3875 2048 2939 conicto +1152 4800 moveto +256 4800 lineto +256 5312 lineto +2048 5312 lineto +2048 4505 lineto +2320 4984 2740 5212 conicto +3161 5440 3780 5440 conicto +4767 5440 5391 4670 conicto +6016 3900 6016 2658 conicto +6016 1417 5391 644 conicto +4767 -128 3780 -128 conicto +3161 -128 2740 109 conicto +2320 347 2048 848 conicto +2048 -1600 lineto +2944 -1600 lineto +2944 -2112 lineto +256 -2112 lineto +256 -1600 lineto +1152 -1600 lineto +1152 4800 lineto +end_ol grestore +gsave 28.600698 20.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 29.402443 20.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 30.049333 20.468750 translate 0.035278 -0.035278 scale +start_ol +4096 1672 moveto +4096 2816 lineto +2902 2816 lineto +2211 2816 1873 2517 conicto +1536 2219 1536 1603 conicto +1536 1041 1878 712 conicto +2221 384 2806 384 conicto +3385 384 3740 741 conicto +4096 1098 4096 1672 conicto +4992 3318 moveto +4992 512 lineto +5824 512 lineto +5824 0 lineto +4096 0 lineto +4096 558 lineto +3789 205 3387 38 conicto +2985 -128 2447 -128 conicto +1558 -128 1035 339 conicto +512 807 512 1602 conicto +512 2423 1109 2875 conicto +1707 3328 2796 3328 conicto +4096 3328 lineto +4096 3690 lineto +4096 4280 3718 4604 conicto +3341 4928 2658 4928 conicto +2094 4928 1760 4685 conicto +1426 4443 1344 3968 conicto +896 3968 lineto +896 5056 lineto +1378 5248 1833 5344 conicto +2288 5440 2720 5440 conicto +3831 5440 4411 4897 conicto +4992 4354 4992 3318 conicto +end_ol grestore +gsave 30.856072 20.468750 translate 0.035278 -0.035278 scale +start_ol +448 0 moveto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4386 lineto +2432 4908 2840 5174 conicto +3249 5440 3790 5440 conicto +4672 5440 5088 4941 conicto +5504 4443 5504 3387 conicto +5504 512 lineto +6336 512 lineto +6336 0 lineto +3840 0 lineto +3840 512 lineto +4608 512 lineto +4608 3095 lineto +4608 4073 4364 4436 conicto +4121 4800 3506 4800 conicto +2856 4800 2516 4331 conicto +2176 3862 2176 2964 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +end_ol grestore +gsave 31.727750 20.468750 translate 0.035278 -0.035278 scale +start_ol +5376 512 moveto +6272 512 lineto +6272 0 lineto +4480 0 lineto +4480 812 lineto +4208 330 3788 101 conicto +3369 -128 2750 -128 conicto +1764 -128 1138 644 conicto +512 1417 512 2658 conicto +512 3900 1135 4670 conicto +1759 5440 2750 5440 conicto +3369 5440 3788 5202 conicto +4208 4965 4480 4464 conicto +4480 7296 lineto +3584 7296 lineto +3584 7808 lineto +5376 7808 lineto +5376 512 lineto +4480 2376 moveto +4480 2900 lineto +4480 3855 4111 4359 conicto +3742 4864 3040 4864 conicto +2328 4864 1964 4309 conicto +1600 3754 1600 2658 conicto +1600 1568 1964 1008 conicto +2328 448 3040 448 conicto +3742 448 4111 941 conicto +4480 1434 4480 2376 conicto +end_ol grestore +gsave 32.594434 20.468750 translate 0.035278 -0.035278 scale +start_ol +576 320 moveto +576 1536 lineto +1088 1536 lineto +1108 958 1469 671 conicto +1831 384 2538 384 conicto +3174 384 3507 611 conicto +3840 839 3840 1274 conicto +3840 1616 3599 1826 conicto +3358 2036 2582 2276 conicto +1908 2498 lineto +1206 2717 891 3046 conicto +576 3376 576 3884 conicto +576 4612 1117 5026 conicto +1658 5440 2614 5440 conicto +3039 5440 3509 5325 conicto +3979 5211 4480 4992 conicto +4480 3840 lineto +3968 3840 lineto +3948 4352 3603 4640 conicto +3258 4928 2664 4928 conicto +2076 4928 1774 4725 conicto +1472 4522 1472 4115 conicto +1472 3783 1700 3582 conicto +1928 3382 2613 3174 conicto +3353 2952 lineto +4088 2720 4412 2371 conicto +4736 2023 4736 1474 conicto +4736 727 4158 299 conicto +3580 -128 2563 -128 conicto +2048 -128 1557 -16 conicto +1067 96 576 320 conicto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 21.000000 11.000000 m 21.000000 15.000000 l 35.000000 15.000000 l 35.000000 11.000000 l f +0.345098 1.000000 0.345098 srgb +n 21.000000 11.000000 m 21.000000 15.000000 l 35.000000 15.000000 l 35.000000 11.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 25.435000 13.468750 translate 0.035278 -0.035278 scale +start_ol +2560 512 moveto +3482 512 lineto +4923 512 5693 1350 conicto +6464 2189 6464 3754 conicto +6464 5320 5696 6148 conicto +4928 6976 3482 6976 conicto +2560 6976 lineto +2560 512 lineto +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +3556 7488 lineto +5474 7488 6545 6500 conicto +7616 5512 7616 3752 conicto +7616 1986 6542 993 conicto +5469 0 3556 0 conicto +576 0 lineto +end_ol grestore +gsave 26.518981 13.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 27.320727 13.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 28.077518 13.468750 translate 0.035278 -0.035278 scale +start_ol +3072 384 moveto +3801 384 4172 960 conicto +4544 1536 4544 2658 conicto +4544 3781 4172 4354 conicto +3801 4928 3072 4928 conicto +2343 4928 1971 4354 conicto +1600 3781 1600 2658 conicto +1600 1536 1974 960 conicto +2348 384 3072 384 conicto +3072 -128 moveto +1917 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3920 1212 4680 conicto +1912 5440 3072 5440 conicto +4232 5440 4932 4680 conicto +5632 3920 5632 2658 conicto +5632 1397 4932 634 conicto +4232 -128 3072 -128 conicto +end_ol grestore +gsave 28.891756 13.468750 translate 0.035278 -0.035278 scale +start_ol +5376 512 moveto +6272 512 lineto +6272 0 lineto +4480 0 lineto +4480 812 lineto +4208 330 3788 101 conicto +3369 -128 2750 -128 conicto +1764 -128 1138 644 conicto +512 1417 512 2658 conicto +512 3900 1135 4670 conicto +1759 5440 2750 5440 conicto +3369 5440 3788 5202 conicto +4208 4965 4480 4464 conicto +4480 7296 lineto +3584 7296 lineto +3584 7808 lineto +5376 7808 lineto +5376 512 lineto +4480 2376 moveto +4480 2900 lineto +4480 3855 4111 4359 conicto +3742 4864 3040 4864 conicto +2328 4864 1964 4309 conicto +1600 3754 1600 2658 conicto +1600 1568 1964 1008 conicto +2328 448 3040 448 conicto +3742 448 4111 941 conicto +4480 1434 4480 2376 conicto +end_ol grestore +gsave 29.758440 13.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 21.000000 4.000000 m 21.000000 8.000000 l 35.000000 8.000000 l 35.000000 4.000000 l f +0.784314 0.784314 1.000000 srgb +n 21.000000 4.000000 m 21.000000 8.000000 l 35.000000 8.000000 l 35.000000 4.000000 l cp s +0.000000 0.000000 0.000000 srgb +gsave 21.497500 6.468750 translate 0.035278 -0.035278 scale +start_ol +2560 3776 moveto +3874 3776 lineto +4608 3776 4992 4187 conicto +5376 4599 5376 5376 conicto +5376 6158 4992 6567 conicto +4608 6976 3874 6976 conicto +2560 6976 lineto +2560 3776 lineto +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +4116 7488 lineto +5228 7488 5878 6917 conicto +6528 6347 6528 5376 conicto +6528 4411 5878 3837 conicto +5228 3264 4116 3264 conicto +2560 3264 lineto +2560 512 lineto +3712 512 lineto +3712 0 lineto +576 0 lineto +end_ol grestore +gsave 22.409147 6.468750 translate 0.035278 -0.035278 scale +start_ol +4928 5312 moveto +4928 3968 lineto +4416 3968 lineto +4390 4354 4191 4545 conicto +3992 4736 3610 4736 conicto +2916 4736 2546 4271 conicto +2176 3806 2176 2936 conicto +2176 512 lineto +3264 512 lineto +3264 0 lineto +448 0 lineto +448 512 lineto +1280 512 lineto +1280 4800 lineto +384 4800 lineto +384 5312 lineto +2176 5312 lineto +2176 4335 lineto +2449 4898 2878 5169 conicto +3307 5440 3923 5440 conicto +4150 5440 4400 5407 conicto +4650 5374 4928 5312 conicto +end_ol grestore +gsave 23.056036 6.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 23.857782 6.468750 translate 0.035278 -0.035278 scale +start_ol +448 3136 moveto +3008 3136 lineto +3008 2368 lineto +448 2368 lineto +448 3136 lineto +end_ol grestore +gsave 24.314849 6.468750 translate 0.035278 -0.035278 scale +start_ol +576 0 moveto +576 512 lineto +1536 512 lineto +1536 6976 lineto +576 6976 lineto +576 7488 lineto +6720 7488 lineto +6720 5824 lineto +6080 5824 lineto +6080 6848 lineto +2560 6848 lineto +2560 4352 lineto +5120 4352 lineto +5120 5312 lineto +5760 5312 lineto +5760 2752 lineto +5120 2752 lineto +5120 3712 lineto +2560 3712 lineto +2560 512 lineto +3776 512 lineto +3776 0 lineto +576 0 lineto +end_ol grestore +gsave 25.179037 6.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 25.980782 6.468750 translate 0.035278 -0.035278 scale +start_ol +1088 4800 moveto +256 4800 lineto +256 5312 lineto +1088 5312 lineto +1088 6976 lineto +1984 6976 lineto +1984 5312 lineto +3753 5312 lineto +3753 4800 lineto +1984 4800 lineto +1984 1435 lineto +1984 763 2117 573 conicto +2251 384 2610 384 conicto +2979 384 3148 595 conicto +3318 807 3328 1280 conicto +4032 1280 lineto +3992 548 3635 210 conicto +3278 -128 2550 -128 conicto +1751 -128 1419 227 conicto +1088 583 1088 1435 conicto +1088 4800 lineto +end_ol grestore +gsave 26.525270 6.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 27.282061 6.468750 translate 0.035278 -0.035278 scale +start_ol +448 0 moveto +448 512 lineto +1280 512 lineto +1280 7296 lineto +384 7296 lineto +384 7808 lineto +2176 7808 lineto +2176 4329 lineto +2432 4879 2840 5159 conicto +3249 5440 3790 5440 conicto +4672 5440 5088 4931 conicto +5504 4423 5504 3345 conicto +5504 512 lineto +6336 512 lineto +6336 0 lineto +3840 0 lineto +3840 512 lineto +4608 512 lineto +4608 3056 lineto +4608 4025 4367 4380 conicto +4126 4736 3506 4736 conicto +2856 4736 2516 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +end_ol grestore +gsave 28.153739 6.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 28.583331 6.468750 translate 0.035278 -0.035278 scale +start_ol +5443 1155 moveto +2572 4269 lineto +2214 3873 2035 3413 conicto +1856 2953 1856 2435 conicto +1856 1591 2401 1019 conicto +2947 448 3763 448 conicto +4247 448 4676 628 conicto +5106 809 5443 1155 conicto +8592 0 moveto +6563 0 lineto +5870 712 lineto +5349 287 4758 79 conicto +4168 -128 3483 -128 conicto +2203 -128 1453 536 conicto +704 1201 704 2338 conicto +704 3007 1082 3588 conicto +1460 4170 2226 4678 conicto +1969 4980 1848 5279 conicto +1728 5578 1728 5905 conicto +1728 6691 2296 7153 conicto +2864 7616 3841 7616 conicto +4174 7616 4618 7536 conicto +5062 7456 5632 7296 conicto +5632 6016 lineto +5056 6016 lineto +4987 6548 4673 6826 conicto +4360 7104 3821 7104 conicto +3316 7104 3002 6822 conicto +2688 6541 2688 6093 conicto +2688 5789 2854 5487 conicto +3021 5186 3551 4623 conicto +6140 1874 lineto +6505 2285 6714 2760 conicto +6923 3236 6976 3776 conicto +6024 3776 lineto +6024 4288 lineto +8412 4288 lineto +8412 3776 lineto +7552 3776 lineto +7468 3108 7221 2527 conicto +6975 1946 6563 1453 conicto +7420 512 lineto +8592 512 lineto +8592 0 lineto +end_ol grestore +gsave 29.787202 6.468750 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 30.216794 6.468750 translate 0.035278 -0.035278 scale +start_ol +7232 1984 moveto +6901 943 6122 407 conicto +5344 -128 4152 -128 conicto +3421 -128 2795 122 conicto +2169 372 1683 857 conicto +1122 1417 849 2129 conicto +576 2842 576 3742 conicto +576 5481 1584 6548 conicto +2593 7616 4245 7616 conicto +4857 7616 5549 7457 conicto +6242 7298 7040 6976 conicto +7040 5248 lineto +6464 5248 lineto +6279 6201 5720 6652 conicto +5162 7104 4156 7104 conicto +2960 7104 2344 6251 conicto +1728 5398 1728 3741 conicto +1728 2090 2347 1237 conicto +2966 384 4168 384 conicto +5008 384 5551 785 conicto +6095 1187 6336 1984 conicto +7232 1984 lineto +end_ol grestore +gsave 31.253324 6.468750 translate 0.035278 -0.035278 scale +start_ol +4096 1672 moveto +4096 2816 lineto +2902 2816 lineto +2211 2816 1873 2517 conicto +1536 2219 1536 1603 conicto +1536 1041 1878 712 conicto +2221 384 2806 384 conicto +3385 384 3740 741 conicto +4096 1098 4096 1672 conicto +4992 3318 moveto +4992 512 lineto +5824 512 lineto +5824 0 lineto +4096 0 lineto +4096 558 lineto +3789 205 3387 38 conicto +2985 -128 2447 -128 conicto +1558 -128 1035 339 conicto +512 807 512 1602 conicto +512 2423 1109 2875 conicto +1707 3328 2796 3328 conicto +4096 3328 lineto +4096 3690 lineto +4096 4280 3718 4604 conicto +3341 4928 2658 4928 conicto +2094 4928 1760 4685 conicto +1426 4443 1344 3968 conicto +896 3968 lineto +896 5056 lineto +1378 5248 1833 5344 conicto +2288 5440 2720 5440 conicto +3831 5440 4411 4897 conicto +4992 4354 4992 3318 conicto +end_ol grestore +gsave 32.060064 6.468750 translate 0.035278 -0.035278 scale +start_ol +5248 1600 moveto +5054 756 4501 314 conicto +3948 -128 3072 -128 conicto +1916 -128 1214 634 conicto +512 1397 512 2658 conicto +512 3925 1211 4682 conicto +1911 5440 3062 5440 conicto +3563 5440 4059 5329 conicto +4555 5218 5056 4992 conicto +5056 3648 lineto +4544 3648 lineto +4440 4317 4090 4622 conicto +3741 4928 3092 4928 conicto +2353 4928 1976 4359 conicto +1600 3791 1600 2658 conicto +1600 1526 1970 955 conicto +2340 384 3074 384 conicto +3657 384 4005 687 conicto +4353 990 4480 1600 conicto +5248 1600 lineto +end_ol grestore +gsave 32.816855 6.468750 translate 0.035278 -0.035278 scale +start_ol +448 0 moveto +448 512 lineto +1280 512 lineto +1280 7296 lineto +384 7296 lineto +384 7808 lineto +2176 7808 lineto +2176 4329 lineto +2432 4879 2840 5159 conicto +3249 5440 3790 5440 conicto +4672 5440 5088 4931 conicto +5504 4423 5504 3345 conicto +5504 512 lineto +6336 512 lineto +6336 0 lineto +3840 0 lineto +3840 512 lineto +4608 512 lineto +4608 3056 lineto +4608 4025 4367 4380 conicto +4126 4736 3506 4736 conicto +2856 4736 2516 4274 conicto +2176 3812 2176 2927 conicto +2176 512 lineto +3008 512 lineto +3008 0 lineto +448 0 lineto +end_ol grestore +gsave 33.688533 6.468750 translate 0.035278 -0.035278 scale +start_ol +5568 2560 moveto +1600 2560 lineto +1600 2522 lineto +1600 1463 2005 923 conicto +2410 384 3201 384 conicto +3806 384 4193 706 conicto +4581 1029 4736 1664 conicto +5504 1664 lineto +5282 771 4684 321 conicto +4087 -128 3114 -128 conicto +1939 -128 1225 634 conicto +512 1397 512 2658 conicto +512 3910 1209 4675 conicto +1906 5440 3040 5440 conicto +4249 5440 4896 4702 conicto +5543 3965 5568 2560 conicto +4480 3072 moveto +4450 3993 4087 4460 conicto +3725 4928 3045 4928 conicto +2410 4928 2045 4458 conicto +1680 3988 1600 3072 conicto +4480 3072 lineto +end_ol grestore +gsave 4.000000 5.000000 translate 0.035278 -0.035278 scale +start_ol +18196 19712 moveto +4474 19712 lineto +2264 13226 lineto +3383 12928 lineto +3465 13064 3574 13253 3683 13470 curveto +5293 16180 5565 16560 6575 17292 curveto +7611 18078 9139 18430 11403 18430 curveto +14022 18430 lineto +-518 1038 lineto +-682 0 lineto +14432 0 lineto +16669 7008 lineto +15523 7337 lineto +14350 5007 13831 4213 12904 3281 curveto +11485 1856 9821 1280 7148 1280 curveto +3465 1280 lineto +18033 18647 lineto +18196 19712 lineto +end_ol grestore +gsave 6.407750 5.000000 translate 0.035278 -0.035278 scale +start_ol +6315 12796 moveto +1098 12386 lineto +988 11404 lineto +1648 11404 lineto +2775 11404 3215 11159 3215 10559 curveto +3215 10314 3133 9959 2968 9359 curveto +1373 4041 lineto +878 2323 768 1887 768 1287 curveto +768 344 1594 -384 2668 -384 curveto +3832 -384 4943 240 6026 1489 curveto +6513 2032 6947 2629 7705 3796 curveto +6860 4260 lineto +5507 2160 4316 960 3585 960 curveto +3321 960 3136 1206 3136 1533 curveto +3136 1806 3244 2297 3459 3060 curveto +6315 12796 lineto +5824 19456 moveto +5006 19456 4352 18802 4352 17984 curveto +4352 17193 5006 16512 5797 16512 curveto +6642 16512 7296 17166 7296 17984 curveto +7296 18802 6642 19456 5824 19456 curveto +end_ol grestore +gsave 7.609123 5.000000 translate 0.035278 -0.035278 scale +start_ol +6408 12864 moveto +1443 12386 lineto +1334 11444 lineto +1989 11444 lineto +3107 11444 3543 11199 3543 10600 curveto +3543 10327 3461 9918 3297 9399 curveto +-194 -2444 lineto +-740 -4409 -767 -4436 -2622 -4518 curveto +-2731 -5504 lineto +3816 -5504 lineto +3925 -4518 lineto +3598 -4518 lineto +2288 -4518 1852 -4354 1852 -3806 curveto +1852 -3588 1961 -3125 2152 -2444 curveto +3489 1998 lineto +4225 130 4935 -384 6735 -384 curveto +8644 -384 10334 461 11643 2150 curveto +13033 3893 13824 6154 13824 8388 curveto +13824 9734 13552 10640 12925 11436 curveto +12216 12315 11127 12864 10064 12864 curveto +8673 12864 7227 12036 5999 10518 curveto +6408 12864 lineto +9218 11392 moveto +10446 11392 11264 10436 11264 8989 curveto +11264 7487 10800 5630 9982 3937 curveto +9027 1889 7936 960 6490 960 curveto +5153 960 4198 2025 4198 3472 curveto +4198 5056 5044 7678 6080 9262 curveto +6981 10627 8127 11392 9218 11392 curveto +end_ol grestore +gsave 9.679686 5.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 10.683747 5.000000 translate 0.035278 -0.035278 scale +start_ol +16811 17936 moveto +15502 19475 14110 20096 12037 20096 curveto +9041 20096 6317 18681 4138 15961 curveto +2123 13512 1088 10683 1088 7663 curveto +1088 2808 4245 -384 9090 -384 curveto +11491 -384 13537 462 15092 2072 curveto +15938 2945 16566 3955 17275 5619 curveto +16156 6110 lineto +15474 4666 15092 4012 14601 3440 curveto +13237 1750 11600 960 9554 960 curveto +7863 960 6553 1505 5735 2568 curveto +4916 3576 4480 5020 4480 6573 curveto +4480 9679 5571 13276 7290 15919 curveto +8545 17854 10373 18944 12255 18944 curveto +14056 18944 15338 18018 16075 16192 curveto +16511 15184 16702 13985 16784 11887 curveto +17902 11887 lineto +19430 19507 lineto +18448 19507 lineto +16811 17936 lineto +end_ol grestore +gsave 13.288810 5.000000 translate 0.035278 -0.035278 scale +start_ol +6747 8704 moveto +7239 8704 lineto +12320 8704 13276 8840 15134 9821 curveto +17047 10856 18112 12628 18112 14780 curveto +18112 16469 17401 17832 16088 18731 curveto +15076 19412 13627 19712 11357 19712 curveto +3309 19712 lineto +3145 18431 lineto +3854 18431 lineto +5628 18431 6010 18295 6010 17696 curveto +6010 17478 5901 16904 5764 16358 curveto +2272 3361 lineto +1890 1887 1863 1887 1645 1668 curveto +1345 1395 717 1286 -620 1286 curveto +-756 1286 lineto +-892 0 lineto +7783 0 lineto +7920 1286 lineto +7211 1286 lineto +5437 1286 5055 1423 5055 2025 curveto +5055 2244 5055 2244 5328 3366 curveto +6747 8704 lineto +7101 9984 moveto +9011 17123 lineto +9284 18159 9638 18431 10757 18431 curveto +11084 18431 lineto +13949 18431 15040 17505 15040 15080 curveto +15040 13745 14604 12464 13867 11537 curveto +13158 10665 12176 10175 10675 10039 curveto +10293 9984 10293 9984 7620 9984 curveto +7101 9984 lineto +end_ol grestore +gsave 15.696559 5.000000 translate 0.035278 -0.035278 scale +start_ol +2751 18429 moveto +3435 18429 lineto +5212 18429 5595 18293 5595 17692 curveto +5595 17474 5486 16900 5349 16354 curveto +3107 8029 lineto +2669 6446 2560 5736 2560 4808 curveto +2560 1437 4936 -384 9387 -384 curveto +10778 -384 12142 -166 13206 243 curveto +14980 925 16044 2097 16889 4306 curveto +17271 5260 17271 5260 18008 8041 curveto +19536 13794 lineto +20709 18020 20954 18320 23355 18429 curveto +23492 19712 lineto +16317 19712 lineto +16153 18429 lineto +17899 18456 18690 17965 18690 16928 curveto +18690 16327 18663 16218 18063 13789 curveto +16480 7920 lineto +15689 4890 15362 3989 14707 3061 curveto +13643 1532 12061 768 9960 768 curveto +7177 768 5568 2133 5568 4453 curveto +5568 5163 5759 6500 5950 7265 curveto +8405 16354 lineto +8787 17828 8787 17828 9033 18047 curveto +9305 18320 9960 18429 11297 18429 curveto +11406 18429 lineto +11570 19712 lineto +2888 19712 lineto +2751 18429 lineto +end_ol grestore +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +1.000000 1.000000 1.000000 srgb +n 49.000000 4.000000 m 49.000000 30.000000 l 53.000000 30.000000 l 53.000000 4.000000 l f +0.501961 0.501961 0.501961 srgb +n 49.000000 4.000000 m 49.000000 30.000000 l 53.000000 30.000000 l 53.000000 4.000000 l cp s +0.010000 slw +[] 0 sd +0 slj +1 slc +0.000000 0.000000 0.000000 srgb +n 50.800964 19.811056 m 50.216694 20.000980 l 50.183086 19.991429 50.167733 19.994331 50.167733 19.994331 c 50.137027 20.000134 50.118772 19.987682 50.119618 19.908014 c 50.024597 19.910070 l 50.025324 20.418782 l 50.120345 20.416727 l 50.124093 20.352412 50.136545 20.334158 50.225763 20.301396 c 50.404199 20.235872 l 50.828650 20.378280 l 50.213674 20.574007 l 50.180067 20.564456 50.164713 20.567358 50.164713 20.567358 c 50.134007 20.573161 50.118654 20.576062 50.119499 20.496395 c 50.024479 20.498450 l 50.025206 21.007163 l 50.120227 21.005107 l 50.121073 20.925439 50.133525 20.907185 50.222743 20.874423 c 51.286710 20.530239 l 51.278851 20.404512 l 50.600889 20.182799 l 51.274376 19.960114 l 51.281871 19.831485 l 50.340848 19.564076 l 50.185260 19.498070 50.133398 19.476068 50.115989 19.383948 c 50.020968 19.386004 l 50.019640 19.799696 l 50.114661 19.797640 l 50.121310 19.748679 50.115507 19.717972 50.143312 19.696816 c 50.152862 19.663208 50.180667 19.642052 50.229628 19.648701 c 50.244982 19.645799 50.263236 19.658251 50.327551 19.661999 c 50.800964 19.811056 l ef +n 50.454152 18.922503 m 50.480629 19.315039 l 50.560296 19.315884 l 50.554493 19.285178 l 50.552438 19.190157 50.567791 19.187256 50.711773 19.191849 c 50.996836 19.185682 l 51.076504 19.186528 l 51.156171 19.187374 51.159073 19.202727 51.164030 19.313101 c 51.259051 19.311046 l 51.255422 18.786980 l 51.160401 18.789036 l 51.163302 18.804389 l 51.165358 18.899410 51.152906 18.917664 51.088592 18.913917 c 50.993571 18.915973 l 50.454152 18.922503 l ef +n 49.999357 19.040254 m 50.001413 19.135274 50.077333 19.200435 50.157001 19.201281 c 50.236668 19.202127 50.320084 19.138658 50.320929 19.058990 c 50.318874 18.963969 50.230502 18.917064 50.150834 18.916218 c 50.071166 18.915372 50.000203 18.960586 49.999357 19.040254 c 49.999357 19.040254 l ef +n 50.442512 17.998437 m 50.438765 18.062751 l 50.483978 18.133714 l 50.431270 18.191380 50.427522 18.255694 50.426677 18.335362 c 50.415434 18.528305 50.551922 18.661527 50.711257 18.663219 c 50.772670 18.651613 50.818730 18.642909 50.856085 18.588145 c 50.911695 18.545833 50.933697 18.493970 50.962348 18.393146 c 50.988098 18.276969 l 51.016749 18.176145 51.026299 18.142537 51.090613 18.146284 c 51.154928 18.150032 51.181887 18.208543 51.181041 18.288211 c 51.188900 18.413938 51.111287 18.508114 50.951106 18.586089 c 50.950260 18.665757 l 51.250676 18.656689 l 51.254424 18.592374 l 51.212111 18.536764 l 51.246565 18.466647 51.275216 18.365823 51.276062 18.286156 c 51.287304 18.093212 51.150817 17.959990 50.976128 17.961200 c 50.911814 17.957452 50.850401 17.969058 50.813045 18.023822 c 50.788142 18.060332 50.778592 18.093940 50.740390 18.228371 c 50.686836 18.365705 l 50.670637 18.448274 50.661086 18.481882 50.612125 18.475233 c 50.566065 18.483937 50.520852 18.412974 50.521697 18.333306 c 50.519642 18.238285 50.584802 18.162365 50.711376 18.074839 c 50.712222 17.995171 l 50.442512 17.998437 l ef +n 49.987957 17.444301 m 50.020236 17.867543 l 50.115257 17.865487 l 50.124808 17.831879 l 50.122752 17.736858 50.119851 17.721505 50.276285 17.707844 c 50.993294 17.715457 l 51.088315 17.713401 l 51.152629 17.717149 51.155531 17.732502 51.148036 17.861131 c 51.243057 17.859075 l 51.242329 17.350363 l 51.147308 17.352418 l 51.149364 17.447439 51.149364 17.447439 51.069696 17.446593 c 50.830693 17.444055 l 50.766379 17.440308 50.720319 17.449012 50.686711 17.439462 c 50.634848 17.417460 50.574281 17.349398 50.578029 17.285084 c 50.578875 17.205416 50.652739 17.175555 50.763114 17.170598 c 51.002117 17.173136 l 51.097138 17.171081 l 51.161452 17.174828 51.149000 17.193083 51.151056 17.288104 c 51.246077 17.286048 l 51.242448 16.761982 l 51.147427 16.764038 l 51.150328 16.779391 l 51.152384 16.874412 51.158187 16.905118 51.078519 16.904273 c 50.998851 16.903427 l 50.729142 16.906692 l 50.634121 16.908747 50.572708 16.920353 50.501745 16.965567 c 50.449036 17.023233 50.427034 17.075095 50.429090 17.170116 c 50.421595 17.298745 50.472612 17.400415 50.576337 17.444419 c 49.987957 17.444301 l ef +n 49.993785 16.318163 m 50.026065 16.741405 l 50.121086 16.739350 l 50.115283 16.708643 l 50.125679 16.595368 50.125679 16.595368 50.282113 16.581706 c 50.904101 16.591375 l 51.063437 16.593067 51.189164 16.585208 51.274635 16.616761 c 51.272579 16.521740 l 51.141895 16.419224 l 51.237761 16.337501 51.287569 16.264482 51.279710 16.138755 c 51.276445 15.869045 51.085193 15.698468 50.830837 15.698831 c 50.591834 15.696294 50.415454 15.856839 50.422466 16.062234 c 50.414971 16.190863 50.478440 16.274278 50.551459 16.324085 c 49.993785 16.318163 l ef +1.000000 1.000000 1.000000 srgb +n 50.553151 16.164749 m 50.548194 16.054375 50.665217 16.000457 50.855258 15.996346 c 51.078908 16.001785 51.182634 16.045789 51.187591 16.156164 c 51.192548 16.266538 51.075525 16.320456 50.885483 16.324567 c 50.677186 16.316226 50.558108 16.275124 50.553151 16.164749 c ef +0.000000 0.000000 0.000000 srgb +n 50.420891 15.128315 m 50.421254 15.382671 50.618309 15.583955 50.857312 15.586493 c 51.096315 15.589030 51.279344 15.379524 51.278981 15.125168 c 51.275715 14.855458 51.094014 14.651273 50.855011 14.648735 c 50.616008 14.646197 50.417626 14.858605 50.420891 15.128315 c 50.420891 15.128315 l ef +1.000000 1.000000 1.000000 srgb +n 50.515912 15.126259 m 50.519659 15.061945 50.559916 15.022534 50.615526 14.980221 c 50.676939 14.968615 50.769058 14.951207 50.848726 14.952053 c 51.057023 14.960393 51.179003 15.016849 51.183960 15.127223 c 51.186015 15.222244 51.071894 15.291516 50.848244 15.286077 c 50.627495 15.295991 50.517967 15.221280 50.515912 15.126259 c ef +0.000000 0.000000 0.000000 srgb +n 50.453860 14.187867 m 50.464984 14.583304 l 50.544651 14.584150 l 50.554202 14.550542 l 50.552146 14.455521 50.564598 14.437266 50.723933 14.438958 c 50.993643 14.435693 l 51.073311 14.436539 l 51.152978 14.437385 51.155880 14.452738 51.160837 14.563112 c 51.148385 14.581367 l 51.243406 14.579311 l 51.242678 14.070599 l 51.147658 14.072654 l 51.149713 14.167675 51.149713 14.167675 51.085399 14.163928 c 50.990378 14.165983 l 50.831042 14.164292 l 50.766728 14.160544 50.720668 14.169249 50.687060 14.159698 c 50.635198 14.137696 50.574630 14.069634 50.578378 14.005320 c 50.579224 13.925652 50.650187 13.880438 50.760561 13.875481 c 50.999564 13.878019 l 51.094585 13.875964 l 51.158900 13.879711 51.161801 13.895064 51.151405 14.008340 c 51.246426 14.006284 l 51.242797 13.482218 l 51.147776 13.484274 l 51.152733 13.594648 51.155634 13.610001 51.075967 13.609155 c 50.996299 13.608310 l 50.726590 13.611575 l 50.631569 13.613630 50.573057 13.640589 50.499192 13.670450 c 50.461837 13.725214 50.427383 13.795331 50.429439 13.890352 c 50.421944 14.018981 50.472961 14.120651 50.594941 14.177107 c 50.453860 14.187867 l ef +n 50.854398 12.541893 m 50.839045 12.544795 l 50.600042 12.542257 50.423661 12.702802 50.421123 12.941805 c 50.413629 13.070434 50.467547 13.187457 50.564623 13.280423 c 50.643445 13.360936 50.762524 13.402039 50.857545 13.399983 c 50.986174 13.407478 51.084942 13.341108 51.165455 13.262286 c 51.230616 13.186366 51.271719 13.067287 51.279213 12.938659 c 51.275102 12.748617 51.184675 12.606690 50.998380 12.546487 c 50.966828 12.631957 l 51.104161 12.685512 51.152276 12.771828 51.157233 12.882203 c 51.156387 12.961870 51.119032 13.016634 51.063422 13.058947 c 51.004910 13.085906 50.961752 13.109964 50.848477 13.099567 c 50.854398 12.541893 l ef +1.000000 1.000000 1.000000 srgb +n 50.768809 13.098721 m 50.609473 13.097030 50.518200 13.034771 50.516144 12.939750 c 50.516990 12.860082 50.587954 12.814868 50.731936 12.819462 c 50.777995 12.810757 50.777995 12.810757 50.771347 12.859718 c ef +n 50.800964 19.811056 m 50.216694 20.000980 l 50.183086 19.991429 50.167733 19.994331 50.167733 19.994331 c 50.137027 20.000134 50.118772 19.987682 50.119618 19.908014 c 50.024597 19.910070 l 50.025324 20.418782 l 50.120345 20.416727 l 50.124093 20.352412 50.136545 20.334158 50.225763 20.301396 c 50.404199 20.235872 l 50.828650 20.378280 l 50.213674 20.574007 l 50.180067 20.564456 50.164713 20.567358 50.164713 20.567358 c 50.134007 20.573161 50.118654 20.576062 50.119499 20.496395 c 50.024479 20.498450 l 50.025206 21.007163 l 50.120227 21.005107 l 50.121073 20.925439 50.133525 20.907185 50.222743 20.874423 c 51.286710 20.530239 l 51.278851 20.404512 l 50.600889 20.182799 l 51.274376 19.960114 l 51.281871 19.831485 l 50.340848 19.564076 l 50.185260 19.498070 50.133398 19.476068 50.115989 19.383948 c 50.020968 19.386004 l 50.019640 19.799696 l 50.114661 19.797640 l 50.121310 19.748679 50.115507 19.717972 50.143312 19.696816 c 50.152862 19.663208 50.180667 19.642052 50.229628 19.648701 c 50.244982 19.645799 50.263236 19.658251 50.327551 19.661999 c 50.800964 19.811056 l s +n 50.454152 18.922503 m 50.480629 19.315039 l 50.560296 19.315884 l 50.554493 19.285178 l 50.552438 19.190157 50.567791 19.187256 50.711773 19.191849 c 50.996836 19.185682 l 51.076504 19.186528 l 51.156171 19.187374 51.159073 19.202727 51.164030 19.313101 c 51.259051 19.311046 l 51.255422 18.786980 l 51.160401 18.789036 l 51.163302 18.804389 l 51.165358 18.899410 51.152906 18.917664 51.088592 18.913917 c 50.993571 18.915973 l 50.454152 18.922503 l s +n 49.999357 19.040254 m 50.001413 19.135274 50.077333 19.200435 50.157001 19.201281 c 50.236668 19.202127 50.320084 19.138658 50.320929 19.058990 c 50.318874 18.963969 50.230502 18.917064 50.150834 18.916218 c 50.071166 18.915372 50.000203 18.960586 49.999357 19.040254 c 49.999357 19.040254 l s +n 50.442512 17.998437 m 50.438765 18.062751 l 50.483978 18.133714 l 50.431270 18.191380 50.427522 18.255694 50.426677 18.335362 c 50.415434 18.528305 50.551922 18.661527 50.711257 18.663219 c 50.772670 18.651613 50.818730 18.642909 50.856085 18.588145 c 50.911695 18.545833 50.933697 18.493970 50.962348 18.393146 c 50.988098 18.276969 l 51.016749 18.176145 51.026299 18.142537 51.090613 18.146284 c 51.154928 18.150032 51.181887 18.208543 51.181041 18.288211 c 51.188900 18.413938 51.111287 18.508114 50.951106 18.586089 c 50.950260 18.665757 l 51.250676 18.656689 l 51.254424 18.592374 l 51.212111 18.536764 l 51.246565 18.466647 51.275216 18.365823 51.276062 18.286156 c 51.287304 18.093212 51.150817 17.959990 50.976128 17.961200 c 50.911814 17.957452 50.850401 17.969058 50.813045 18.023822 c 50.788142 18.060332 50.778592 18.093940 50.740390 18.228371 c 50.686836 18.365705 l 50.670637 18.448274 50.661086 18.481882 50.612125 18.475233 c 50.566065 18.483937 50.520852 18.412974 50.521697 18.333306 c 50.519642 18.238285 50.584802 18.162365 50.711376 18.074839 c 50.712222 17.995171 l 50.442512 17.998437 l s +n 49.987957 17.444301 m 50.020236 17.867543 l 50.115257 17.865487 l 50.124808 17.831879 l 50.122752 17.736858 50.119851 17.721505 50.276285 17.707844 c 50.993294 17.715457 l 51.088315 17.713401 l 51.152629 17.717149 51.155531 17.732502 51.148036 17.861131 c 51.243057 17.859075 l 51.242329 17.350363 l 51.147308 17.352418 l 51.149364 17.447439 51.149364 17.447439 51.069696 17.446593 c 50.830693 17.444055 l 50.766379 17.440308 50.720319 17.449012 50.686711 17.439462 c 50.634848 17.417460 50.574281 17.349398 50.578029 17.285084 c 50.578875 17.205416 50.652739 17.175555 50.763114 17.170598 c 51.002117 17.173136 l 51.097138 17.171081 l 51.161452 17.174828 51.149000 17.193083 51.151056 17.288104 c 51.246077 17.286048 l 51.242448 16.761982 l 51.147427 16.764038 l 51.150328 16.779391 l 51.152384 16.874412 51.158187 16.905118 51.078519 16.904273 c 50.998851 16.903427 l 50.729142 16.906692 l 50.634121 16.908747 50.572708 16.920353 50.501745 16.965567 c 50.449036 17.023233 50.427034 17.075095 50.429090 17.170116 c 50.421595 17.298745 50.472612 17.400415 50.576337 17.444419 c 49.987957 17.444301 l s +n 49.993785 16.318163 m 50.026065 16.741405 l 50.121086 16.739350 l 50.115283 16.708643 l 50.125679 16.595368 50.125679 16.595368 50.282113 16.581706 c 50.904101 16.591375 l 51.063437 16.593067 51.189164 16.585208 51.274635 16.616761 c 51.272579 16.521740 l 51.141895 16.419224 l 51.237761 16.337501 51.287569 16.264482 51.279710 16.138755 c 51.276445 15.869045 51.085193 15.698468 50.830837 15.698831 c 50.591834 15.696294 50.415454 15.856839 50.422466 16.062234 c 50.414971 16.190863 50.478440 16.274278 50.551459 16.324085 c 49.993785 16.318163 l s +n 50.553151 16.164749 m 50.548194 16.054375 50.665217 16.000457 50.855258 15.996346 c 51.078908 16.001785 51.182634 16.045789 51.187591 16.156164 c 51.192548 16.266538 51.075525 16.320456 50.885483 16.324567 c 50.677186 16.316226 50.558108 16.275124 50.553151 16.164749 c 50.553151 16.164749 l s +n 50.420891 15.128315 m 50.421254 15.382671 50.618309 15.583955 50.857312 15.586493 c 51.096315 15.589030 51.279344 15.379524 51.278981 15.125168 c 51.275715 14.855458 51.094014 14.651273 50.855011 14.648735 c 50.616008 14.646197 50.417626 14.858605 50.420891 15.128315 c 50.420891 15.128315 l s +n 50.515912 15.126259 m 50.519659 15.061945 50.559916 15.022534 50.615526 14.980221 c 50.676939 14.968615 50.769058 14.951207 50.848726 14.952053 c 51.057023 14.960393 51.179003 15.016849 51.183960 15.127223 c 51.186015 15.222244 51.071894 15.291516 50.848244 15.286077 c 50.627495 15.295991 50.517967 15.221280 50.515912 15.126259 c 50.515912 15.126259 l s +n 50.453860 14.187867 m 50.464984 14.583304 l 50.544651 14.584150 l 50.554202 14.550542 l 50.552146 14.455521 50.564598 14.437266 50.723933 14.438958 c 50.993643 14.435693 l 51.073311 14.436539 l 51.152978 14.437385 51.155880 14.452738 51.160837 14.563112 c 51.148385 14.581367 l 51.243406 14.579311 l 51.242678 14.070599 l 51.147658 14.072654 l 51.149713 14.167675 51.149713 14.167675 51.085399 14.163928 c 50.990378 14.165983 l 50.831042 14.164292 l 50.766728 14.160544 50.720668 14.169249 50.687060 14.159698 c 50.635198 14.137696 50.574630 14.069634 50.578378 14.005320 c 50.579224 13.925652 50.650187 13.880438 50.760561 13.875481 c 50.999564 13.878019 l 51.094585 13.875964 l 51.158900 13.879711 51.161801 13.895064 51.151405 14.008340 c 51.246426 14.006284 l 51.242797 13.482218 l 51.147776 13.484274 l 51.152733 13.594648 51.155634 13.610001 51.075967 13.609155 c 50.996299 13.608310 l 50.726590 13.611575 l 50.631569 13.613630 50.573057 13.640589 50.499192 13.670450 c 50.461837 13.725214 50.427383 13.795331 50.429439 13.890352 c 50.421944 14.018981 50.472961 14.120651 50.594941 14.177107 c 50.453860 14.187867 l s +n 50.854398 12.541893 m 50.839045 12.544795 l 50.600042 12.542257 50.423661 12.702802 50.421123 12.941805 c 50.413629 13.070434 50.467547 13.187457 50.564623 13.280423 c 50.643445 13.360936 50.762524 13.402039 50.857545 13.399983 c 50.986174 13.407478 51.084942 13.341108 51.165455 13.262286 c 51.230616 13.186366 51.271719 13.067287 51.279213 12.938659 c 51.275102 12.748617 51.184675 12.606690 50.998380 12.546487 c 50.966828 12.631957 l 51.104161 12.685512 51.152276 12.771828 51.157233 12.882203 c 51.156387 12.961870 51.119032 13.016634 51.063422 13.058947 c 51.004910 13.085906 50.961752 13.109964 50.848477 13.099567 c 50.854398 12.541893 l s +n 50.768809 13.098721 m 50.609473 13.097030 50.518200 13.034771 50.516144 12.939750 c 50.516990 12.860082 50.587954 12.814868 50.731936 12.819462 c 50.777995 12.810757 50.777995 12.810757 50.771347 12.859718 c 50.768809 13.098721 l s +0.300000 slw +[] 0 sd +[] 0 sd +0 slj +n 4.000000 18.000000 m 4.000000 38.000000 l 8.000000 38.000000 l 8.000000 18.000000 l f +0.749020 0.749020 0.749020 srgb +n 4.000000 18.000000 m 4.000000 38.000000 l 8.000000 38.000000 l 8.000000 18.000000 l cp s +0.010000 slw +[] 0 sd +0 slj +1 slc +0.000000 0.000000 0.000000 srgb +n 5.676236 32.518395 m 5.674181 32.423374 l 5.675027 32.343706 5.697029 32.291843 5.727735 32.286040 c 5.752639 32.249531 5.765091 32.231276 5.844758 32.232122 c 5.985839 32.221362 6.050154 32.225110 6.077959 32.203953 c 6.200784 32.180742 6.278397 32.086567 6.280088 31.927231 c 6.275977 31.737189 6.166449 31.662479 5.991760 31.663688 c 5.961054 31.669491 l 5.960208 31.749159 l 6.070582 31.744202 6.137798 31.763303 6.134051 31.827617 c 6.136952 31.842970 6.124500 31.861225 6.109147 31.864126 c 6.093794 31.867028 6.078441 31.869929 6.032381 31.878634 c 6.017028 31.881535 6.001674 31.884437 5.986321 31.887338 c 5.909555 31.901845 l 5.771376 31.927959 5.687961 31.991427 5.652661 32.141212 c 5.638154 32.064446 5.611195 32.005935 5.602490 31.959875 c 5.551473 31.858205 5.447748 31.814201 5.334472 31.803805 c 5.224098 31.808762 5.153135 31.853975 5.087975 31.929896 c 5.041069 32.018268 5.030673 32.131544 5.028981 32.290879 c 5.021368 33.007888 l 5.116389 33.005833 l 5.125939 32.972225 l 5.126785 32.892557 5.118080 32.846497 5.130532 32.828242 c 5.145885 32.825341 5.161239 32.822440 5.271613 32.817483 c 5.988622 32.825096 l 6.098996 32.820139 6.117251 32.832590 6.132604 32.829689 c 6.150859 32.842141 6.159563 32.888201 6.158717 32.967868 c 6.149167 33.001476 l 6.244188 32.999421 l 6.245152 32.331373 l 6.150131 32.333428 l 6.155934 32.364135 l 6.157990 32.459156 6.148440 32.492764 6.135988 32.511018 c 6.123536 32.529273 6.105281 32.516821 5.994907 32.521778 c 5.676236 32.518395 l ef +1.000000 1.000000 1.000000 srgb +n 5.581215 32.520450 m 5.231838 32.522869 l 5.136817 32.524925 5.118563 32.512473 5.128959 32.399198 c 5.123156 32.368491 l 5.124848 32.209156 5.187107 32.117882 5.346442 32.119574 c 5.521131 32.118364 5.584599 32.201779 5.579160 32.425429 c ef +0.000000 0.000000 0.000000 srgb +n 5.853668 30.743642 m 5.838315 30.746543 l 5.599312 30.744006 5.422931 30.904551 5.420394 31.143554 c 5.412899 31.272183 5.466817 31.389206 5.563893 31.482171 c 5.642715 31.562685 5.761794 31.603787 5.856815 31.601732 c 5.985444 31.609227 6.084212 31.542857 6.164726 31.464035 c 6.229886 31.388115 6.270989 31.269036 6.278483 31.140407 c 6.274372 30.950365 6.183945 30.808439 5.997650 30.748235 c 5.966098 30.833706 l 6.103431 30.887260 6.151546 30.973577 6.156503 31.083951 c 6.155657 31.163619 6.118302 31.218383 6.062692 31.260695 c 6.004181 31.287654 5.961022 31.311712 5.847747 31.301316 c 5.853668 30.743642 l ef +1.000000 1.000000 1.000000 srgb +n 5.768079 31.300470 m 5.608744 31.298778 5.517470 31.236519 5.515414 31.141498 c 5.516260 31.061831 5.587224 31.016617 5.731206 31.021210 c 5.777266 31.012506 5.777266 31.012506 5.770617 31.061467 c ef +0.000000 0.000000 0.000000 srgb +n 6.084267 30.238918 m 6.083421 30.318586 6.073871 30.352193 6.024910 30.345545 c 5.994203 30.351348 5.973047 30.323543 5.986345 30.225620 c 5.980542 30.194914 l 5.975585 30.084539 5.963979 30.023127 5.934118 29.949262 c 5.886003 29.862945 5.810083 29.797785 5.715062 29.799840 c 5.635394 29.798994 5.576882 29.825954 5.511722 29.901874 c 5.490566 29.874069 5.472311 29.861617 5.469410 29.846264 c 5.466508 29.830911 5.466508 29.830911 5.481862 29.828009 c 5.512568 29.822206 5.568178 29.779894 5.559474 29.733834 c 5.566123 29.684873 5.508457 29.632164 5.447044 29.643770 c 5.382730 29.640023 5.342473 29.679434 5.341627 29.759101 c 5.340781 29.838769 5.370641 29.912634 5.464816 29.990246 c 5.442814 30.042109 5.423714 30.109325 5.425769 30.204346 c 5.420330 30.427995 5.547267 30.594825 5.721956 30.593616 c 5.816977 30.591560 5.900392 30.528092 5.941495 30.409013 c 5.982961 30.544291 6.025273 30.599901 6.123196 30.613199 c 6.184609 30.601593 6.240219 30.559280 6.281321 30.440202 c 6.292081 30.581283 6.349747 30.633991 6.429415 30.634837 c 6.539789 30.629880 6.593343 30.492547 6.605431 30.219936 c 6.593462 29.904166 6.481878 29.734435 6.307189 29.735644 c 6.212168 29.737700 6.144107 29.798267 6.109653 29.868384 c 6.090552 29.935600 6.086805 29.999915 6.094663 30.125642 c 6.084267 30.238918 l ef +1.000000 1.000000 1.000000 srgb +n 5.520790 30.202290 m 5.518735 30.107269 5.577246 30.080310 5.705875 30.087805 c 5.816249 30.082848 5.904621 30.129753 5.903775 30.209421 c 5.894225 30.243029 5.869322 30.279538 5.838615 30.285341 c 5.795457 30.309399 5.749397 30.318103 5.703337 30.326808 c 5.574708 30.319313 5.517043 30.266604 5.520790 30.202290 c ef +n 6.321215 30.146435 m 6.331611 30.033159 6.328709 30.017806 6.338260 29.984198 c 6.366065 29.963042 6.378516 29.944787 6.412124 29.954337 c 6.476439 29.958085 6.509201 30.047303 6.510410 30.221991 c 6.500014 30.335267 6.468462 30.420737 6.404147 30.416990 c 6.370539 30.407440 6.349383 30.379635 6.328227 30.351830 c ef +0.000000 0.000000 0.000000 srgb +n 5.450034 29.217838 m 5.476511 29.610374 l 5.556179 29.611220 l 5.550376 29.580513 l 5.548320 29.485492 5.563674 29.482591 5.707656 29.487184 c 5.992719 29.481017 l 6.072386 29.481863 l 6.152054 29.482709 6.154955 29.498062 6.159912 29.608437 c 6.254933 29.606381 l 6.251304 29.082315 l 6.156284 29.084371 l 6.159185 29.099724 l 6.161241 29.194745 6.148789 29.213000 6.084474 29.209252 c 5.989453 29.211308 l 5.450034 29.217838 l ef +n 4.995240 29.335589 m 4.997295 29.430610 5.073216 29.495770 5.152883 29.496616 c 5.232551 29.497462 5.315966 29.433993 5.316812 29.354326 c 5.314757 29.259305 5.226384 29.212399 5.146717 29.211553 c 5.067049 29.210707 4.996086 29.255921 4.995240 29.335589 c 4.995240 29.335589 l ef +n 5.442233 28.293046 m 5.438486 28.357361 l 5.483699 28.428324 l 5.430991 28.485990 5.427243 28.550304 5.426397 28.629972 c 5.415155 28.822915 5.551643 28.956137 5.710978 28.957829 c 5.772391 28.946223 5.818451 28.937519 5.855806 28.882755 c 5.911416 28.840442 5.933418 28.788580 5.962069 28.687756 c 5.987819 28.571579 l 6.016470 28.470755 6.026020 28.437147 6.090334 28.440894 c 6.154649 28.444642 6.181608 28.503153 6.180762 28.582821 c 6.188621 28.708548 6.111008 28.802723 5.950827 28.880699 c 5.949981 28.960367 l 6.250397 28.951299 l 6.254145 28.886984 l 6.211832 28.831374 l 6.246286 28.761257 6.274937 28.660433 6.275783 28.580765 c 6.287025 28.387822 6.150538 28.254600 5.975849 28.255809 c 5.911535 28.252062 5.850122 28.263668 5.812766 28.318432 c 5.787863 28.354942 5.778312 28.388549 5.740111 28.522981 c 5.686557 28.660315 l 5.670358 28.742884 5.660807 28.776492 5.611846 28.769843 c 5.565786 28.778547 5.520573 28.707584 5.521418 28.627916 c 5.519363 28.532895 5.584523 28.456975 5.711097 28.369449 c 5.711942 28.289781 l 5.442233 28.293046 l ef +n 5.462298 27.557782 m 5.453957 27.766079 l 5.119933 27.765597 l 5.124890 27.875971 l 5.333187 27.884312 5.448518 27.989729 5.465081 28.161516 c 5.544749 28.162362 l 5.552243 28.033733 l 5.947680 28.022609 l 6.091662 28.027203 6.137722 28.018498 6.180880 27.994441 c 6.236491 27.952128 6.286298 27.879109 6.284242 27.784088 c 6.282187 27.689068 6.252326 27.615203 6.182209 27.580749 c 6.127444 27.543394 6.041974 27.511841 5.962306 27.510995 c 5.962306 27.510995 5.944051 27.498543 5.928698 27.501445 c 5.930754 27.596466 l 6.059383 27.603961 6.129500 27.638414 6.128654 27.718082 c 6.119104 27.751690 6.088397 27.757493 5.978023 27.762450 c 5.548978 27.764023 l 5.557319 27.555727 l 5.462298 27.557782 l ef +n 5.853681 26.557552 m 5.838328 26.560454 l 5.599325 26.557916 5.422944 26.718461 5.420406 26.957464 c 5.412912 27.086093 5.466830 27.203116 5.563906 27.296082 c 5.642728 27.376595 5.761807 27.417698 5.856828 27.415642 c 5.985457 27.423137 6.084225 27.356767 6.164738 27.277945 c 6.229899 27.202025 6.271002 27.082946 6.278496 26.954317 c 6.274385 26.764276 6.183958 26.622349 5.997663 26.562146 c 5.966111 26.647616 l 6.103444 26.701171 6.151559 26.787487 6.156516 26.897862 c 6.155670 26.977529 6.118315 27.032293 6.062705 27.074606 c 6.004193 27.101565 5.961035 27.125622 5.847760 27.115226 c 5.853681 26.557552 l ef +1.000000 1.000000 1.000000 srgb +n 5.768092 27.114380 m 5.608756 27.112689 5.517483 27.050430 5.515427 26.955409 c 5.516273 26.875741 5.587237 26.830527 5.731219 26.835120 c 5.777278 26.826416 5.777278 26.826416 5.770630 26.875377 c ef +0.000000 0.000000 0.000000 srgb +n 5.455643 26.092121 m 5.463865 26.472204 l 5.543533 26.473050 l 5.553083 26.439442 l 5.551027 26.344421 5.566381 26.341520 5.725716 26.343212 c 5.995426 26.339947 l 6.075093 26.340793 l 6.154761 26.341638 6.157662 26.356992 6.147266 26.470267 c 6.242287 26.468212 l 6.248209 25.910538 l 6.153188 25.912594 l 6.158991 25.943300 l 6.148594 26.056576 6.148594 26.056576 6.068927 26.055730 c 5.989259 26.054884 l 5.958552 26.060687 l 5.845277 26.050291 5.719549 26.058149 5.646531 26.008342 c 5.576413 25.973888 5.567709 25.927828 5.525396 25.872218 c 5.561906 25.897122 5.595514 25.906672 5.610867 25.903771 c 5.690535 25.904617 5.743243 25.846951 5.744089 25.767283 c 5.744935 25.687616 5.669015 25.622455 5.589347 25.621609 c 5.494326 25.623665 5.413813 25.702487 5.418770 25.812861 c 5.426628 25.938588 5.508351 26.034455 5.661038 26.085108 c 5.455643 26.092121 l ef +n 5.029823 23.986127 m 5.020882 25.116828 l 5.115903 25.114772 l 5.125453 25.081165 l 5.123397 24.986144 5.117594 24.955437 5.130046 24.937182 c 5.157851 24.916026 5.173205 24.913125 5.283579 24.908168 c 6.000588 24.915781 l 6.110962 24.910824 6.129217 24.923276 6.132118 24.938629 c 6.150373 24.951081 6.156176 24.981787 6.158231 25.076808 c 6.148681 25.110416 l 6.243702 25.108361 l 6.257118 24.422058 l 6.162097 24.424113 l 6.155448 24.473075 l 6.157504 24.568096 6.147954 24.601703 6.135502 24.619958 c 6.123050 24.638213 6.104795 24.625761 5.994421 24.630718 c 5.675750 24.627334 l 5.669948 24.596628 l 5.677442 24.467999 5.755054 24.373824 5.896135 24.363064 c 5.894080 24.268043 l 5.321052 24.265023 l 5.323108 24.360044 l 5.485345 24.377089 5.582421 24.470055 5.574927 24.598684 c 5.580730 24.629390 l 5.262059 24.626006 l 5.200646 24.637612 5.182391 24.625160 5.148783 24.615610 c 5.130528 24.603158 5.121824 24.557099 5.125571 24.492784 c 5.119768 24.462078 l 5.127263 24.333449 5.168366 24.214370 5.251781 24.150902 c 5.294939 24.126844 5.368804 24.096983 5.473375 24.061320 c 5.471320 23.966299 l 5.029823 23.986127 l ef +n 5.451915 23.484968 m 5.478392 23.877504 l 5.558059 23.878350 l 5.552256 23.847643 l 5.550201 23.752623 5.565554 23.749721 5.709536 23.754314 c 5.994599 23.748148 l 6.074267 23.748994 l 6.153934 23.749839 6.156836 23.765193 6.161793 23.875567 c 6.256814 23.873511 l 6.253185 23.349445 l 6.158164 23.351501 l 6.161065 23.366854 l 6.163121 23.461875 6.150669 23.480130 6.086355 23.476383 c 5.991334 23.478438 l 5.451915 23.484968 l ef +n 4.997120 23.602719 m 4.999176 23.697740 5.075096 23.762900 5.154764 23.763746 c 5.234431 23.764592 5.317847 23.701124 5.318692 23.621456 c 5.316637 23.526435 5.228265 23.479529 5.148597 23.478683 c 5.068929 23.477837 4.997966 23.523051 4.997120 23.602719 c 4.997120 23.602719 l ef +n 4.990529 22.852616 m 5.022808 23.275858 l 5.117829 23.273802 l 5.127380 23.240194 l 5.125324 23.145173 5.122423 23.129820 5.278856 23.116159 c 5.995866 23.123772 l 6.090887 23.121716 l 6.155201 23.125464 6.158103 23.140817 6.150608 23.269446 c 6.245629 23.267390 l 6.257353 22.740423 l 6.162332 22.742478 l 6.149880 22.760733 l 6.155683 22.791440 6.164388 22.837499 6.151936 22.855754 c 6.136583 22.858656 6.121229 22.861557 6.087621 22.852007 c 5.992601 22.854062 l 4.990529 22.852616 l ef +n 5.855263 21.790759 m 5.839910 21.793661 l 5.600907 21.791123 5.424526 21.951668 5.421989 22.190671 c 5.414494 22.319300 5.468412 22.436323 5.565488 22.529288 c 5.644310 22.609802 5.763389 22.650905 5.858410 22.648849 c 5.987039 22.656344 6.085807 22.589974 6.166321 22.511152 c 6.231481 22.435232 6.272584 22.316153 6.280078 22.187524 c 6.275967 21.997482 6.185540 21.855556 5.999245 21.795352 c 5.967693 21.880823 l 6.105026 21.934378 6.153141 22.020694 6.158098 22.131068 c 6.157252 22.210736 6.119897 22.265500 6.064287 22.307812 c 6.005776 22.334772 5.962617 22.358829 5.849342 22.348433 c 5.855263 21.790759 l ef +1.000000 1.000000 1.000000 srgb +n 5.769674 22.347587 m 5.610339 22.345895 5.519065 22.283636 5.517009 22.188615 c 5.517855 22.108948 5.588819 22.063734 5.732801 22.068327 c 5.778861 22.059623 5.778861 22.059623 5.772212 22.108584 c ef +n 5.676236 32.518395 m 5.674181 32.423374 l 5.675027 32.343706 5.697029 32.291843 5.727735 32.286040 c 5.752639 32.249531 5.765091 32.231276 5.844758 32.232122 c 5.985839 32.221362 6.050154 32.225110 6.077959 32.203953 c 6.200784 32.180742 6.278397 32.086567 6.280088 31.927231 c 6.275977 31.737189 6.166449 31.662479 5.991760 31.663688 c 5.961054 31.669491 l 5.960208 31.749159 l 6.070582 31.744202 6.137798 31.763303 6.134051 31.827617 c 6.136952 31.842970 6.124500 31.861225 6.109147 31.864126 c 6.093794 31.867028 6.078441 31.869929 6.032381 31.878634 c 6.017028 31.881535 6.001674 31.884437 5.986321 31.887338 c 5.909555 31.901845 l 5.771376 31.927959 5.687961 31.991427 5.652661 32.141212 c 5.638154 32.064446 5.611195 32.005935 5.602490 31.959875 c 5.551473 31.858205 5.447748 31.814201 5.334472 31.803805 c 5.224098 31.808762 5.153135 31.853975 5.087975 31.929896 c 5.041069 32.018268 5.030673 32.131544 5.028981 32.290879 c 5.021368 33.007888 l 5.116389 33.005833 l 5.125939 32.972225 l 5.126785 32.892557 5.118080 32.846497 5.130532 32.828242 c 5.145885 32.825341 5.161239 32.822440 5.271613 32.817483 c 5.988622 32.825096 l 6.098996 32.820139 6.117251 32.832590 6.132604 32.829689 c 6.150859 32.842141 6.159563 32.888201 6.158717 32.967868 c 6.149167 33.001476 l 6.244188 32.999421 l 6.245152 32.331373 l 6.150131 32.333428 l 6.155934 32.364135 l 6.157990 32.459156 6.148440 32.492764 6.135988 32.511018 c 6.123536 32.529273 6.105281 32.516821 5.994907 32.521778 c 5.676236 32.518395 l s +n 5.581215 32.520450 m 5.231838 32.522869 l 5.136817 32.524925 5.118563 32.512473 5.128959 32.399198 c 5.123156 32.368491 l 5.124848 32.209156 5.187107 32.117882 5.346442 32.119574 c 5.521131 32.118364 5.584599 32.201779 5.579160 32.425429 c 5.581215 32.520450 l s +n 5.853668 30.743642 m 5.838315 30.746543 l 5.599312 30.744006 5.422931 30.904551 5.420394 31.143554 c 5.412899 31.272183 5.466817 31.389206 5.563893 31.482171 c 5.642715 31.562685 5.761794 31.603787 5.856815 31.601732 c 5.985444 31.609227 6.084212 31.542857 6.164726 31.464035 c 6.229886 31.388115 6.270989 31.269036 6.278483 31.140407 c 6.274372 30.950365 6.183945 30.808439 5.997650 30.748235 c 5.966098 30.833706 l 6.103431 30.887260 6.151546 30.973577 6.156503 31.083951 c 6.155657 31.163619 6.118302 31.218383 6.062692 31.260695 c 6.004181 31.287654 5.961022 31.311712 5.847747 31.301316 c 5.853668 30.743642 l s +n 5.768079 31.300470 m 5.608744 31.298778 5.517470 31.236519 5.515414 31.141498 c 5.516260 31.061831 5.587224 31.016617 5.731206 31.021210 c 5.777266 31.012506 5.777266 31.012506 5.770617 31.061467 c 5.768079 31.300470 l s +n 6.084267 30.238918 m 6.083421 30.318586 6.073871 30.352193 6.024910 30.345545 c 5.994203 30.351348 5.973047 30.323543 5.986345 30.225620 c 5.980542 30.194914 l 5.975585 30.084539 5.963979 30.023127 5.934118 29.949262 c 5.886003 29.862945 5.810083 29.797785 5.715062 29.799840 c 5.635394 29.798994 5.576882 29.825954 5.511722 29.901874 c 5.490566 29.874069 5.472311 29.861617 5.469410 29.846264 c 5.466508 29.830911 5.466508 29.830911 5.481862 29.828009 c 5.512568 29.822206 5.568178 29.779894 5.559474 29.733834 c 5.566123 29.684873 5.508457 29.632164 5.447044 29.643770 c 5.382730 29.640023 5.342473 29.679434 5.341627 29.759101 c 5.340781 29.838769 5.370641 29.912634 5.464816 29.990246 c 5.442814 30.042109 5.423714 30.109325 5.425769 30.204346 c 5.420330 30.427995 5.547267 30.594825 5.721956 30.593616 c 5.816977 30.591560 5.900392 30.528092 5.941495 30.409013 c 5.982961 30.544291 6.025273 30.599901 6.123196 30.613199 c 6.184609 30.601593 6.240219 30.559280 6.281321 30.440202 c 6.292081 30.581283 6.349747 30.633991 6.429415 30.634837 c 6.539789 30.629880 6.593343 30.492547 6.605431 30.219936 c 6.593462 29.904166 6.481878 29.734435 6.307189 29.735644 c 6.212168 29.737700 6.144107 29.798267 6.109653 29.868384 c 6.090552 29.935600 6.086805 29.999915 6.094663 30.125642 c 6.084267 30.238918 l s +n 5.520790 30.202290 m 5.518735 30.107269 5.577246 30.080310 5.705875 30.087805 c 5.816249 30.082848 5.904621 30.129753 5.903775 30.209421 c 5.894225 30.243029 5.869322 30.279538 5.838615 30.285341 c 5.795457 30.309399 5.749397 30.318103 5.703337 30.326808 c 5.574708 30.319313 5.517043 30.266604 5.520790 30.202290 c 5.520790 30.202290 l s +n 6.321215 30.146435 m 6.331611 30.033159 6.328709 30.017806 6.338260 29.984198 c 6.366065 29.963042 6.378516 29.944787 6.412124 29.954337 c 6.476439 29.958085 6.509201 30.047303 6.510410 30.221991 c 6.500014 30.335267 6.468462 30.420737 6.404147 30.416990 c 6.370539 30.407440 6.349383 30.379635 6.328227 30.351830 c 6.321215 30.146435 l s +n 5.450034 29.217838 m 5.476511 29.610374 l 5.556179 29.611220 l 5.550376 29.580513 l 5.548320 29.485492 5.563674 29.482591 5.707656 29.487184 c 5.992719 29.481017 l 6.072386 29.481863 l 6.152054 29.482709 6.154955 29.498062 6.159912 29.608437 c 6.254933 29.606381 l 6.251304 29.082315 l 6.156284 29.084371 l 6.159185 29.099724 l 6.161241 29.194745 6.148789 29.213000 6.084474 29.209252 c 5.989453 29.211308 l 5.450034 29.217838 l s +n 4.995240 29.335589 m 4.997295 29.430610 5.073216 29.495770 5.152883 29.496616 c 5.232551 29.497462 5.315966 29.433993 5.316812 29.354326 c 5.314757 29.259305 5.226384 29.212399 5.146717 29.211553 c 5.067049 29.210707 4.996086 29.255921 4.995240 29.335589 c 4.995240 29.335589 l s +n 5.442233 28.293046 m 5.438486 28.357361 l 5.483699 28.428324 l 5.430991 28.485990 5.427243 28.550304 5.426397 28.629972 c 5.415155 28.822915 5.551643 28.956137 5.710978 28.957829 c 5.772391 28.946223 5.818451 28.937519 5.855806 28.882755 c 5.911416 28.840442 5.933418 28.788580 5.962069 28.687756 c 5.987819 28.571579 l 6.016470 28.470755 6.026020 28.437147 6.090334 28.440894 c 6.154649 28.444642 6.181608 28.503153 6.180762 28.582821 c 6.188621 28.708548 6.111008 28.802723 5.950827 28.880699 c 5.949981 28.960367 l 6.250397 28.951299 l 6.254145 28.886984 l 6.211832 28.831374 l 6.246286 28.761257 6.274937 28.660433 6.275783 28.580765 c 6.287025 28.387822 6.150538 28.254600 5.975849 28.255809 c 5.911535 28.252062 5.850122 28.263668 5.812766 28.318432 c 5.787863 28.354942 5.778312 28.388549 5.740111 28.522981 c 5.686557 28.660315 l 5.670358 28.742884 5.660807 28.776492 5.611846 28.769843 c 5.565786 28.778547 5.520573 28.707584 5.521418 28.627916 c 5.519363 28.532895 5.584523 28.456975 5.711097 28.369449 c 5.711942 28.289781 l 5.442233 28.293046 l s +n 5.462298 27.557782 m 5.453957 27.766079 l 5.119933 27.765597 l 5.124890 27.875971 l 5.333187 27.884312 5.448518 27.989729 5.465081 28.161516 c 5.544749 28.162362 l 5.552243 28.033733 l 5.947680 28.022609 l 6.091662 28.027203 6.137722 28.018498 6.180880 27.994441 c 6.236491 27.952128 6.286298 27.879109 6.284242 27.784088 c 6.282187 27.689068 6.252326 27.615203 6.182209 27.580749 c 6.127444 27.543394 6.041974 27.511841 5.962306 27.510995 c 5.962306 27.510995 5.944051 27.498543 5.928698 27.501445 c 5.930754 27.596466 l 6.059383 27.603961 6.129500 27.638414 6.128654 27.718082 c 6.119104 27.751690 6.088397 27.757493 5.978023 27.762450 c 5.548978 27.764023 l 5.557319 27.555727 l 5.462298 27.557782 l s +n 5.853681 26.557552 m 5.838328 26.560454 l 5.599325 26.557916 5.422944 26.718461 5.420406 26.957464 c 5.412912 27.086093 5.466830 27.203116 5.563906 27.296082 c 5.642728 27.376595 5.761807 27.417698 5.856828 27.415642 c 5.985457 27.423137 6.084225 27.356767 6.164738 27.277945 c 6.229899 27.202025 6.271002 27.082946 6.278496 26.954317 c 6.274385 26.764276 6.183958 26.622349 5.997663 26.562146 c 5.966111 26.647616 l 6.103444 26.701171 6.151559 26.787487 6.156516 26.897862 c 6.155670 26.977529 6.118315 27.032293 6.062705 27.074606 c 6.004193 27.101565 5.961035 27.125622 5.847760 27.115226 c 5.853681 26.557552 l s +n 5.768092 27.114380 m 5.608756 27.112689 5.517483 27.050430 5.515427 26.955409 c 5.516273 26.875741 5.587237 26.830527 5.731219 26.835120 c 5.777278 26.826416 5.777278 26.826416 5.770630 26.875377 c 5.768092 27.114380 l s +n 5.455643 26.092121 m 5.463865 26.472204 l 5.543533 26.473050 l 5.553083 26.439442 l 5.551027 26.344421 5.566381 26.341520 5.725716 26.343212 c 5.995426 26.339947 l 6.075093 26.340793 l 6.154761 26.341638 6.157662 26.356992 6.147266 26.470267 c 6.242287 26.468212 l 6.248209 25.910538 l 6.153188 25.912594 l 6.158991 25.943300 l 6.148594 26.056576 6.148594 26.056576 6.068927 26.055730 c 5.989259 26.054884 l 5.958552 26.060687 l 5.845277 26.050291 5.719549 26.058149 5.646531 26.008342 c 5.576413 25.973888 5.567709 25.927828 5.525396 25.872218 c 5.561906 25.897122 5.595514 25.906672 5.610867 25.903771 c 5.690535 25.904617 5.743243 25.846951 5.744089 25.767283 c 5.744935 25.687616 5.669015 25.622455 5.589347 25.621609 c 5.494326 25.623665 5.413813 25.702487 5.418770 25.812861 c 5.426628 25.938588 5.508351 26.034455 5.661038 26.085108 c 5.455643 26.092121 l s +n 5.029823 23.986127 m 5.020882 25.116828 l 5.115903 25.114772 l 5.125453 25.081165 l 5.123397 24.986144 5.117594 24.955437 5.130046 24.937182 c 5.157851 24.916026 5.173205 24.913125 5.283579 24.908168 c 6.000588 24.915781 l 6.110962 24.910824 6.129217 24.923276 6.132118 24.938629 c 6.150373 24.951081 6.156176 24.981787 6.158231 25.076808 c 6.148681 25.110416 l 6.243702 25.108361 l 6.257118 24.422058 l 6.162097 24.424113 l 6.155448 24.473075 l 6.157504 24.568096 6.147954 24.601703 6.135502 24.619958 c 6.123050 24.638213 6.104795 24.625761 5.994421 24.630718 c 5.675750 24.627334 l 5.669948 24.596628 l 5.677442 24.467999 5.755054 24.373824 5.896135 24.363064 c 5.894080 24.268043 l 5.321052 24.265023 l 5.323108 24.360044 l 5.485345 24.377089 5.582421 24.470055 5.574927 24.598684 c 5.580730 24.629390 l 5.262059 24.626006 l 5.200646 24.637612 5.182391 24.625160 5.148783 24.615610 c 5.130528 24.603158 5.121824 24.557099 5.125571 24.492784 c 5.119768 24.462078 l 5.127263 24.333449 5.168366 24.214370 5.251781 24.150902 c 5.294939 24.126844 5.368804 24.096983 5.473375 24.061320 c 5.471320 23.966299 l 5.029823 23.986127 l s +n 5.451915 23.484968 m 5.478392 23.877504 l 5.558059 23.878350 l 5.552256 23.847643 l 5.550201 23.752623 5.565554 23.749721 5.709536 23.754314 c 5.994599 23.748148 l 6.074267 23.748994 l 6.153934 23.749839 6.156836 23.765193 6.161793 23.875567 c 6.256814 23.873511 l 6.253185 23.349445 l 6.158164 23.351501 l 6.161065 23.366854 l 6.163121 23.461875 6.150669 23.480130 6.086355 23.476383 c 5.991334 23.478438 l 5.451915 23.484968 l s +n 4.997120 23.602719 m 4.999176 23.697740 5.075096 23.762900 5.154764 23.763746 c 5.234431 23.764592 5.317847 23.701124 5.318692 23.621456 c 5.316637 23.526435 5.228265 23.479529 5.148597 23.478683 c 5.068929 23.477837 4.997966 23.523051 4.997120 23.602719 c 4.997120 23.602719 l s +n 4.990529 22.852616 m 5.022808 23.275858 l 5.117829 23.273802 l 5.127380 23.240194 l 5.125324 23.145173 5.122423 23.129820 5.278856 23.116159 c 5.995866 23.123772 l 6.090887 23.121716 l 6.155201 23.125464 6.158103 23.140817 6.150608 23.269446 c 6.245629 23.267390 l 6.257353 22.740423 l 6.162332 22.742478 l 6.149880 22.760733 l 6.155683 22.791440 6.164388 22.837499 6.151936 22.855754 c 6.136583 22.858656 6.121229 22.861557 6.087621 22.852007 c 5.992601 22.854062 l 4.990529 22.852616 l s +n 5.855263 21.790759 m 5.839910 21.793661 l 5.600907 21.791123 5.424526 21.951668 5.421989 22.190671 c 5.414494 22.319300 5.468412 22.436323 5.565488 22.529288 c 5.644310 22.609802 5.763389 22.650905 5.858410 22.648849 c 5.987039 22.656344 6.085807 22.589974 6.166321 22.511152 c 6.231481 22.435232 6.272584 22.316153 6.280078 22.187524 c 6.275967 21.997482 6.185540 21.855556 5.999245 21.795352 c 5.967693 21.880823 l 6.105026 21.934378 6.153141 22.020694 6.158098 22.131068 c 6.157252 22.210736 6.119897 22.265500 6.064287 22.307812 c 6.005776 22.334772 5.962617 22.358829 5.849342 22.348433 c 5.855263 21.790759 l s +n 5.769674 22.347587 m 5.610339 22.345895 5.519065 22.283636 5.517009 22.188615 c 5.517855 22.108948 5.588819 22.063734 5.732801 22.068327 c 5.778861 22.059623 5.778861 22.059623 5.772212 22.108584 c 5.769674 22.347587 l s +showpage Index: zipcpu/trunk/sw/zasm/optest.cpp =================================================================== --- zipcpu/trunk/sw/zasm/optest.cpp (nonexistent) +++ zipcpu/trunk/sw/zasm/optest.cpp (revision 2) @@ -0,0 +1,93 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Filename: optest.cpp +// +// Project: Zip CPU -- a small, lightweight, RISC CPU core +// +// Purpose: A quick test of whether we can decode opcodes properly. +// +// Creator: Dan Gisselquist, Ph.D. +// Gisselquist Tecnology, LLC +// +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015, Gisselquist Technology, LLC +// +// This program is free software (firmware): you can redistribute it and/or +// modify it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or (at +// your option) any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no +// target there if the PDF file isn't present.) If not, see +// for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +//////////////////////////////////////////////////////////////////////////////// +#include + +#include "zopcodes.h" + + +void optest(const ZIPI ins) { + char line[512]; + + zipi_to_string(ins, line); + printf("0x%08x ->\t%s\n", ins, line); +} + +int main(int argc, char **argv) { + char line[512]; + + optest(0x00000000); // CMP $0,R0 + optest(0x0f000000); // CMP $0,PC + optest(0x0e0fffff); // CMP $-1,CC + optest(0x2f007fff); // MOV $-1+R0,PC -> JMP $-1+R0 + optest(0x2f0f7fff); // MOV $-1+PC,PC -> BRA $-1 + optest(0x2f2f7fff); // BRZ $-1+R0 + optest(0x2f4fffff); // MOV.NE $-1+uPC,PC + optest(0xbe000010); // HALT + optest(0xbe000020); // RTU + optest(0x9e00005f); // INT + optest(0xc6160000); // CLR R6 + optest(0xcf1f0000); // CLR R6 + optest(0xce1e0000); // CLR CC + optest(0xcd1d0000); // CLR SP + optest(0xc71e0000); // XOR CC,R7 + optest(0x2f0f7fff); // BRA $-1 + optest(0x2f2f7fff); // BRZ $-1 + optest(0x2f4f7fff); // BNE $-1 + optest(0xa0000000); // ADD $0,R0 + optest(0xaf030350); // ADD $0x197456,PC -> LJMP $197456+PC + optest(0xaf230350); // ADD.Z $0x197456,PC -> LJMP.Z $197456+PC + optest(0x4e000000); // NOOP + optest(0x4f000000); // LODILO $0,R0 + optest(0x4f00ffff); // LODILO $0,R0 + optest(0x4f057fff); // LODILO $0,R5 + optest(0x4f0c0001); // LODILO $0,R12 + optest(0x4f1d0001); // LODIHI $0,SP + optest(0x601f0007); // LOD ($7+PC),R0 + optest(0x60df000f); // LOD.C $15(PC),R0 + optest(0x6cff003f); // LOD.V $63(PC),R12 + optest(0x701f0007); // STO R0,($7+PC) + optest(0x70000007); // STO R0,($7) + optest(0x701f0000); // STO R0,(PC) + + optest(0xc0100000); // CLR R0 + optest(0x21000000); // MOV R0,R1 + optest(0x22000001); // MOV $1+$0,R2 + optest(0x23000002); // MOV $2+$0,R3 + optest(0x24000022); // MOV $22h+$0,R4 + optest(0x25100377); // MOV $337h+$0,uR5 + +} + Index: zipcpu/trunk/sw/zasm/test.S =================================================================== --- zipcpu/trunk/sw/zasm/test.S (nonexistent) +++ zipcpu/trunk/sw/zasm/test.S (revision 2) @@ -0,0 +1,211 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Filename: test.S +; +; Project: Zip CPU -- a small, lightweight, RISC CPU soft core +; +; Purpose: A disorganized test, just showing some initial operation of +; the CPU. As a disorganized test, it doesn't prove anything +; beyond the generic operation of the CPU. +; +; Status: As of July, 2015, the assembler isn't sophisticated enough +; to handle the address resolution needed to assemble this file. +; +; Creator: Dan Gisselquist, Ph.D. +; Gisselquist Tecnology, LLC +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Copyright (C) 2015, Gisselquist Technology, LLC +; +; This program is free software (firmware): you can redistribute it and/or +; modify it under the terms of the GNU General Public License as published +; by the Free Software Foundation, either version 3 of the License, or (at +; your option) any later version. +; +; This program is distributed in the hope that it will be useful, but WITHOUT +; ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or +; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +; for more details. +; +; License: GPL, v3, as defined and found on www.gnu.org, +; http://www.gnu.org/licenses/gpl.html +; +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +test: + clr r0 + mov r0,r1 + mov $1+r0,r2 + mov $2+r0,r3 + mov $22h+r0,r4 + mov $377h+r0,ur5 + noop + nop + add r2,r0 + add $32,r0 + add $-33,r0 + not.z r0 + clrf r0 + ldi $5,r1 + cmp $0+r0,r1 + not.lt r0 + not.ge r1 + lod $-7+pc,r2 + ldihi $deadh,r3 + ldihi $beefh,r3 + +testbench: + // Let's build a software test bench. + clr r12 ; R12 will point to our peripherals + ldihi $c000h,r12 + mov r12,ur12 + mov test_start,upc + ldihi $8001,r0 + ldilo $-1,r0 + sto r0,$1+r12 + rtu + lod r12,r0 + cmp $0,r0 + bnz $1 + halt + busy + +; Now for a series of tests. If the test fails, call the trap +; interrupt with the test number that failed. Upon completion, +; call the trap with #0. + +; Now for a series of tests. If the test fails, call the trap +; interrupt with the test number that failed. Upon completion, +; call the trap with #0. + +; Test LDI to PC +; Some data registers + .dat __here__+5 +test_start: + ldi $2,r11 + lod $-3+pc,pc + clr r11 + noop + cmp $0,r11 + sto.z r11,(r12) + add $1,r0 + add $1,r0 + +// Let's test whether overflow works + ldi $3,r11 + ldi $-1,r0 + lsr $1,r0 + add $1,r0 + bv $1 + sto r11,(r12) +// Overflow set from subtraction + ldi $4,r11 + ldi $1,r0 + .dat 0x5000001f ; rol $31,r0 + sub $1,r0 + bv $1 + sto r11,(r12) +// Overflow set from LSR + ldi $5,r11 + ldi $1,r0 + .dat 0x5000001f ; rol $31,r0 + lsr $1,r0 + bv $1 + sto r11,(r12) +// Overflow set from LSL + ldi $6,r11 + ldi $1,r0 + .dat 0x5000001e + lsl $1,r0 + bv $1 + sto r11,(r12) + +// Overflow set from LSL, negative to positive + ldi $7,r11 + ldi $1,r0 + .dat 0x5000001f; // E: ROL $30,R0 + lsl $1,r0 + bv $1 + sto r11,(r12) + +// Test carry + ldi $0x010,r11 + ldi $-1,r0 + add $1,r0 + tst $2,cc + sto.z r11,(r12) +// and carry from subtraction + ldi $17,r11 + sub $1,r0 + tst $2,cc + sto.z r11,(r12) + +// Let's try a loop: for i=0; i<5; i++) +// We'll use R0=i, Immediates for 5 +for_loop: + ldi $18,r11 + clr r0 + noop + add $1,r0 + cmp $5,r0 + blt for_loop +// +// Let's try a reverse loop. Such loops are usually cheaper to +// implement, and this one is no different: 2 loop instructions +// (minus setup instructions) vs 3 from before. +// R0 = 5; (from before) +// do { +// } while (R0 > 0); +bgt_loop: + ldi $19,r11 + noop + sub $1,r0 + bgt bgt_loop + +// How about the same thing with a >= comparison? +// R1 = 5; // Need to do this explicitly +// do { +// } while(R1 >= 0); + ldi $20,r00 + ldi $5,r1 +bge_loop: + noop + sub $1,r1 + bge bge_loop + +// Let's try the reverse loop again, only this time we'll store our +// loop variable in memory. +// R0 = 5; (from before) +// do { +// } while (R0 > 0); + ldi $21,r11 + bra $1 +loop_var: + .dat 0 +mem_loop: + mov $-2+pc,r1 + clr r2 + ldi $5,r0 + sto r1,(r0) + add $1,r2 + add $14,r0 + lod (r1),r0 + sub $1,r0 + bgt $-6 + cmp $5,r2 + sto.ne r11,(r12) + +// Return success / Test the trap interrupt + clr r11 + sto r11,(r12) + noop + noop + +// Go into an infinite loop if the trap fails +// Permanent loop instruction -- a busy halt if you will + busy + +// And, in case we miss a halt ... + halt Index: zipcpu/trunk/sw/zasm/zdump.cpp =================================================================== --- zipcpu/trunk/sw/zasm/zdump.cpp (nonexistent) +++ zipcpu/trunk/sw/zasm/zdump.cpp (revision 2) @@ -0,0 +1,70 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Filename: zdump.cpp +// +// Project: Zip CPU -- a small, lightweight, RISC CPU core +// +// Purpose: Disassemble machine code files onto the stdout file. +// +// Creator: Dan Gisselquist, Ph.D. +// Gisselquist Tecnology, LLC +// +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015, Gisselquist Technology, LLC +// +// This program is free software (firmware): you can redistribute it and/or +// modify it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or (at +// your option) any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no +// target there if the PDF file isn't present.) If not, see +// for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +//////////////////////////////////////////////////////////////////////////////// +#include +#include + +#include "zopcodes.h" + +void dump_file(const char *fn) { + const int NZIP = 4096; + char ln[NZIP]; + ZIPI ibuf[NZIP]; + FILE *fp; + int nr; + int lineno=0; + + fp = fopen(fn, "r"); + if (!fp) + return; + printf("%s:\n", fn); + while((nr=fread(ibuf, sizeof(ZIPI), NZIP, fp))>0) { + for(int i=0; i for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +/////////////////////////////////////////////////////////////////////////// +#ifndef TWOC_H +#define TWOC_H + +extern long sbits(const long val, const int bits); +extern bool sfits(const long val, const int bits); +extern unsigned long ubits(const long val, const int bits); +extern unsigned long rndbits(const long val, const int bi, const int bo); + +#endif + Index: zipcpu/trunk/sw/zasm/zopcodes.cpp =================================================================== --- zipcpu/trunk/sw/zasm/zopcodes.cpp (nonexistent) +++ zipcpu/trunk/sw/zasm/zopcodes.cpp (revision 2) @@ -0,0 +1,246 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Filename: zopcodes.cpp +// +// Project: Zip CPU -- a small, lightweight, RISC CPU core +// +// Purpose: +// +// Creator: Dan Gisselquist, Ph.D. +// Gisselquist Tecnology, LLC +// +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015, Gisselquist Technology, LLC +// +// This program is free software (firmware): you can redistribute it and/or +// modify it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or (at +// your option) any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no +// target there if the PDF file isn't present.) If not, see +// for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include + +#include "twoc.h" +#include "zopcodes.h" + +const char *zop_regstr[] = { + "R0", "R1", "R2", "R3", + "R4", "R5", "R6", "R7", + "R8", "R9", "R10","R11", + "R12","SP", "CC", "PC", + "uR0", "uR1", "uR2", "uR3", + "uR4", "uR5", "uR6", "uR7", + "uR8", "uR9", "uR10", "uR11", + "uR12", "uSP", "uCC", "uPC", + "sR0", "sR1", "sR2", "sR3", + "sR4", "sR5", "sR6", "sR7", + "sR8", "sR9", "sR10","sR11", + "sR12","sSP", "sCC", "sPC" +}; + +const char *zop_ccstr[] = { + "", ".Z", ".NE", ".GE", ".GT", ".LT", ".C", ".V" +}; + +const ZOPCODE zoplist[] = { + // Special case instructions. These are general instructions, but with + // special opcodes + // Conditional branches + "BRA", 0xffff8000, 0x2f0f0000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(15,0), OPUNUSED, + "BRZ", 0xffff8000, 0x2f2f0000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(15,0), OPUNUSED, + "BNZ", 0xffff8000, 0x2f4f0000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(15,0), OPUNUSED, + "BGE", 0xffff8000, 0x2f6f0000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(15,0), OPUNUSED, + "BGT", 0xffff8000, 0x2f8f0000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(15,0), OPUNUSED, + "BLT", 0xffff8000, 0x2faf0000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(15,0), OPUNUSED, + "BRC", 0xffff8000, 0x2fcf0000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(15,0), OPUNUSED, + "BRV", 0xffff8000, 0x2fef0000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(15,0), OPUNUSED, + // CLR + "CLRF", 0xff1f0000, 0xc0100000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc1110000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc2120000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc3130000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc4140000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc5150000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc6160000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc7170000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc8180000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xc9190000, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xca1a0000, REGFIELD(24),OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xcb1b0000, REGFIELD(24),OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xcc1c0000, REGFIELD(24),OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xcd1d0000, REGFIELD(24),OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xce1e0000, REGFIELD(24),OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + "CLRF", 0xff1f0000, 0xcf1f0000, REGFIELD(24),OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + // + "CLR", 0xf0ffffff, 0x30000000, REGFIELD(24),OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, + // + "HALT", 0xff10007f, 0xbe000010, OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + // The "wait" instruction is identical, with the only difference being + // the interrrupt context of the processor. Hence we allow both + // instructions here. + "WAIT", 0xff10007f, 0xbe000010, OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + // + "INT", 0xff10007f, 0x9e00005f, OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + // Return to user space + "RTU", 0xff10007f, 0xbe000020, OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + // JMP (possibly a conditional jump, if not covered by branches above) + "JMP", 0xff108000, 0x2f000000, OPUNUSED,OPUNUSED, REGFIELD(16), IMMFIELD(15,0), BITFIELD(3,21), + "JMP", 0xff108000, 0x2f008000, OPUNUSED,OPUNUSED, URGFIELD(16), IMMFIELD(15,0), BITFIELD(3,21), + "LJMP", 0xff100000, 0xaf000000, OPUNUSED,OPUNUSED, OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + // NOT + "NOT", 0xf01fffff, 0xc00fffff, REGFIELD(24), OPUNUSED, OPUNUSED, OPUNUSED, BITFIELD(3,21), + // General instructions + "CMP", 0xf0100000, 0x00000000, OPUNUSED, REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "CMP", 0xf0100000, 0x00100000, OPUNUSED, REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + "TST", 0xf0100000, 0x10000000, OPUNUSED, REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "TST", 0xf0100000, 0x10100000, OPUNUSED, REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // map bit = 1 (interrupts enabled) specifies user reg + "MOV", 0xf0108000, 0x20000000, REGFIELD(24),OPUNUSED, REGFIELD(16), IMMFIELD(15,0), BITFIELD(3,21), + "MOV", 0xf0108000, 0x20100000, URGFIELD(24),OPUNUSED, REGFIELD(16), IMMFIELD(15,0), BITFIELD(3,21), + "MOV", 0xf0108000, 0x20008000, REGFIELD(24),OPUNUSED, URGFIELD(16), IMMFIELD(15,0), BITFIELD(3,21), + "MOV", 0xf0108000, 0x20108000, URGFIELD(24),OPUNUSED, URGFIELD(16), IMMFIELD(15,0), BITFIELD(3,21), + // + "LDI", 0xf0000000, 0x30000000, REGFIELD(24),OPUNUSED, OPUNUSED, IMMFIELD(24,0), OPUNUSED, + // + "NOOP", 0xffffffff, 0x4e000000, OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, + "BRK", 0xffffffff, 0x4e000001, OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, OPUNUSED, + // + "LDILO",0xff100000, 0x4f000000, REGFIELD(16),OPUNUSED, OPUNUSED, IMMFIELD(16,0), BITFIELD(3,21), + "LDIHI",0xff100000, 0x4f100000, REGFIELD(16),OPUNUSED, OPUNUSED, IMMFIELD(16,0), BITFIELD(3,21), + // + "LOD", 0xf0100000, 0x60000000, REGFIELD(24), OPUNUSED, OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "LOD", 0xf0100000, 0x60100000, REGFIELD(24), OPUNUSED, REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "STO", 0xf0100000, 0x70000000, OPUNUSED, REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "STO", 0xf0100000, 0x70100000, OPUNUSED, REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "SUB", 0xf0100000, 0x80000000, REGFIELD(24), REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "SUB", 0xf0100000, 0x80100000, REGFIELD(24), REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "AND", 0xf0100000, 0x90000000, REGFIELD(24), REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "AND", 0xf0100000, 0x90100000, REGFIELD(24), REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "ADD", 0xf0100000, 0xa0000000, REGFIELD(24), REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "ADD", 0xf0100000, 0xa0100000, REGFIELD(24), REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "OR", 0xf0100000, 0xb0000000, REGFIELD(24), REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "OR", 0xf0100000, 0xb0100000, REGFIELD(24), REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "XOR", 0xf0100000, 0xc0000000, REGFIELD(24), REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "XOR", 0xf0100000, 0xc0100000, REGFIELD(24), REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "LSL", 0xf0100000, 0xd0000000, REGFIELD(24), REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "LSL", 0xf0100000, 0xd0100000, REGFIELD(24), REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "ASR", 0xf0100000, 0xe0000000, REGFIELD(24), REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "ASR", 0xf0100000, 0xe0100000, REGFIELD(24), REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // + "LSR", 0xf0100000, 0xf0000000, REGFIELD(24), REGFIELD(24), OPUNUSED, IMMFIELD(19,0), BITFIELD(3,21), + "LSR", 0xf0100000, 0xf0100000, REGFIELD(24), REGFIELD(24), REGFIELD(16), IMMFIELD(16,0), BITFIELD(3,21), + // Illegal instruction !! + "ILL", 0x00000000, 0x00000000, OPUNUSED, OPUNUSED, OPUNUSED, IMMFIELD(32,0), OPUNUSED +}; + +const int nzoplist = (sizeof(zoplist)/sizeof(ZOPCODE)); + +static int getbits(const ZIPI ins, const int which) { + if (which & 0x40000000) { + // printf("SBITS: %08x, %08x = %08lx\n", ins, which, + // sbits(ins>>(which & 0x03f), (which>>8)&0x03f)); + return sbits(ins>>(which & 0x03f), (which>>8)&0x03f); + } else if (which &0x03f) { + return ubits(ins>>(which & 0x03f), (which>>8)&0x03f) + + ((which>>16)&0x0ff); + } else + return which; +} + +void zipi_to_string(const ZIPI ins, char *line) { + for(int i=0; i for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include + +#include "zparser.h" +#include "zopcodes.h" + +typedef ZPARSER::ZIPI ZIPI; // A Zip Instruction (i.e. uint32) + +bool ZPARSER::iscomment(const char *line) const { + const char *sp = line; + do { + if (*sp == '\0') + return true; + else if (*sp == ';') + return true; + else if (*sp == '#') + return true; + else if (*sp == '\n') + return true; + else if (*sp == '\r') + return true; + else if ((*sp == '/')&&(sp[1] == '/')) + return true; + else if (!isspace(*sp)) + return false; + } while(*sp++); + + return true; +} + +bool ZPARSER::islabel(const char *line) const { + const char *sp = line; + if (isspace(*line)) + return false; + if (!isalpha(*line)) + return false; + while((isalpha(*sp))||(isdigit(*sp))||(*sp=='_')) + sp++; + if (*sp != ':') + return false; + sp++; + return iscomment(sp); +} + +bool ZPARSER::parse_op(const char *line, ZPARSER::ZIPA pc, + ZPARSER::ZIPI &ins, const unsigned lineno) const { + const char *sp = line; + char cpy[128], *cp = cpy, *point, *dollar, *plus, *comma, + *opc, *opb; + ZPARSER::ZIPREG ra = ZPARSER::ZIP_Rnone, rb = ZPARSER::ZIP_Rnone; + ZIPCOND cnd = ZIPC_ALWAYS; + ZIPIMM imm = 0; + bool valid = true; + + if (!isspace(*sp)) + return false; + + while(isspace(*sp)) + sp++; + // Remove comments from our local copy + for(unsigned int i=0; i= (int)sizeof(cpy)) + return false; + *cp = '\0'; + point = strchr(cpy, '.'); + comma = strchr(cpy, ','); + plus = strchr(cpy, '+'); + dollar= strchr(cpy, '$'); + // paren = strchr(cpy, '('); + if (point) *point++ = '\0'; + if (comma) *comma++ = '\0'; + if (plus) *plus++ = '\0'; + if (dollar) *dollar++ = '\0'; + // if (paren) *paren++ = '\0'; + cp = cpy; + while(isalpha(*cp)) + cp++; + opc = cpy; + if ((*cp == '\0')&&(point == NULL)) + cp[1] = '\0'; + *cp = '\0'; + + if ((point)&&(strncasecmp("DAT",point,3)!=0)) { + cp = point; + while(isalpha(*cp)) + cp++; + if (*cp == '\0') + cp[1] = '\0'; + *cp = '\0'; + + for(int i=1; i<8; i++) { + if (strcasecmp(&zop_ccstr[i][1], point)==0) { + cnd = (ZIPCOND)i; + break; + } + } if (cnd == ZIPC_ALWAYS) { + printf("ERR: Unrecognized condition, %s\n", point); + valid = false; + } + } + + cp++; + while(isspace(*cp)) + cp++; + opb = cp; + + if (dollar) { + // Figure out the base + { + char *ip = dollar, mxd = 0; + if ((*ip == '0')&&(toupper(ip[1])=='X')) + imm = strtoul(dollar, NULL, 16); + else { + bool neg = false; + if (*ip == '-') { + neg = true; + ip++; + dollar++; + } + while(isdigit(*ip)||((toupper(*ip)>='A')&&(toupper(*ip)<='F'))) { + if (isalpha(*ip)) + mxd = (*ip-'a')+10; + else + mxd = (*ip-'0'); + ip++; + } + + if ((mxd <= 1)&&(*ip=='d')) + imm = strtoul(dollar, NULL, 2); + else if ((mxd <= 7)&&((*dollar == '0')||(toupper(*ip)=='O'))) + imm = strtoul(dollar, NULL, 8); + else if ((mxd <= 15)&&(toupper(*ip)=='H')) + imm = strtoul(dollar, NULL, 16); + else if ((toupper(*ip)=='D')||(*ip == '+')||(isspace(*ip))||(*ip == '(')||(*ip == '\0')) + imm = atoi(dollar); + else { + printf("Cannot parse immediate, %s\n", dollar); + printf("Assuming you meant %d\n", atoi(dollar)); + imm = atoi(dollar); + } + + if (neg) + imm = -imm; + } + } + opb = dollar; + if (plus) + opb = plus; + } else + imm = 0; + if (*opb) for(int i=31; i>=0; i--) { + // printf("Checking for match: \'%s\' to %s", opb, zop_regstr[i]); + if (NULL != strcasestr(opb, zop_regstr[i])) { + // printf(" --- Match\n"); + rb = (ZIPREG)i; + break; + } // else printf(" -- nope\n"); + } if (comma) for(int i=31; i>=0; i--) { + // printf("Checking for match: ,%s to %s", comma, zop_regstr[i]); + if (NULL != strcasestr(comma, zop_regstr[i])) { + ra = (ZIPREG)i; + // printf(" --- Match\n"); + break; + } // else printf(" -- nope\n"); + } + + if (strcasecmp("MOV",opc)!=0) { + // Only move instructions can reference user regs + if ((ra != ZIP_Rnone)&&(ra >= ZIP_uR0)) + valid = false; + if ((rb != ZIP_Rnone)&&(rb >= ZIP_uR0)) + valid = false; + if (!valid) + printf("ERR: Only Mov can specify user regs\n"); + } + + if ((!*opc)&&(strncasecmp("DAT",point,3)==0)) { + ins = strtoul(opb, NULL, 0); + valid = true; + } else if (strcasecmp("CMP",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_cmp(cnd, imm, rb, ra); + else ins = op_cmp(cnd, imm, ra); + } else if (strcasecmp("TST",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_tst(cnd, imm, rb, ra); + else if (!dollar) + ins = op_tst(cnd, ra); + else + ins = op_tst(cnd, imm, ra); + } else if (strcasecmp("MOV",opc)==0) { + if ((rb != ZIP_Rnone)&&(ra != ZIP_Rnone)) + ins = op_mov(cnd, imm, rb, ra); + else { printf("ERR MOV, ra = %d, rb = %d, imm = %d, cnd = %d\nLine was: %s", (int)ra, (int)rb, (int)imm, (int)cnd, line); valid = false; } + } else if (strcasecmp("LDI",opc)==0) { + if ((rb == ZIP_Rnone)&&(cnd == ZIPC_ALWAYS)) + ins = op_ldi(imm, ra); + else valid = false; + } else if (strcasecmp("trap",opc)==0) { + if ((rb == ZIP_Rnone)&&(rb == ZIP_Rnone)) + ins = op_trap(cnd, imm); + else + valid = false; + } else if (strcasecmp("CLR",opc)==0) { + if ((ra == ZIP_Rnone)&&(!dollar)&&(cnd == ZIPC_ALWAYS)) + ins = op_clr(rb); // Good + else valid = false; + } else if ((strcasecmp("NOOP",opc)==0)||(strcasecmp("NOP",opc)==0)) { + if ((rb == ZIP_Rnone)&&(ra == ZIP_Rnone)&&(!dollar)&&(cnd == ZIPC_ALWAYS)) + ins = op_noop(); + else { printf("ERR: NOP, ra=%d, rb=%d, dollar = %s\n", + (int)ra, (int)rb, (dollar)?"true":"false"); valid = false; } + } else if ((strcasecmp("BREAK",opc)==0)||(strcasecmp("BRK",opc)==0)) { + if ((rb == ZIP_Rnone)&&(ra == ZIP_Rnone)&&(!dollar)&&(cnd == ZIPC_ALWAYS)) + ins = op_break(); + else { printf("ERR: BRK, ra=%d, rb=%d, dollar = %s\n", + (int)ra, (int)rb, (dollar)?"true":"false"); valid = false; } + } else if ((strcasecmp("LDIHI",opc)==0)||(strcasecmp("LODIHI",opc)==0)) { + if ((dollar)&&(ra != ZIP_Rnone)) + ins = op_ldihi(cnd, imm, ra); + else valid = false; + } else if ((strcasecmp("LDILO",opc)==0)||(strcasecmp("LODILO",opc)==0)){ + if ((dollar)&&(ra != ZIP_Rnone)) + ins = op_ldilo(cnd, imm, ra); + else valid = false; + } else if ((strcasecmp("LOD",opc)==0)||(strcasecmp("LOAD",opc)==0)) { + if (rb != ZIP_Rnone) + ins = op_lod(cnd,imm,rb,ra); + else ins = op_lod(cnd,imm,ra); + } else if ((strcasecmp("STO",opc)==0)||(strcasecmp("STOR",opc)==0)) { + if (rb != ZIP_Rnone) + ins = op_sto(cnd,rb,imm,ra); + else ins = op_sto(cnd,rb,imm); + } else if (strcasecmp("SUB",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_sub(cnd,imm,rb,ra); + else ins = op_sub(cnd,imm,ra); + } else if (strcasecmp("AND",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_and(cnd,imm,rb,ra); + else ins = op_and(cnd,imm,ra); + } else if (strcasecmp("ADD",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_add(cnd,imm,rb,ra); + else ins = op_add(cnd,imm,ra); + } else if (strcasecmp("OR",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_or(cnd,imm,rb,ra); + else ins = op_or(cnd,imm,ra); + } else if (strcasecmp("XOR",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_xor(cnd,imm,rb,ra); + else ins = op_xor(cnd,imm,ra); + } else if ((strcasecmp("LSL",opc)==0)||(strcasecmp("ASL",opc)==0)) { + if (rb != ZIP_Rnone) + ins = op_lsl(cnd,imm,rb,ra); + else ins = op_lsl(cnd,imm,ra); + } else if (strcasecmp("ASR",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_asr(cnd,imm,rb,ra); + else ins = op_asr(cnd,imm,ra); + } else if (strcasecmp("LSR",opc)==0) { + if (rb != ZIP_Rnone) + ins = op_lsr(cnd,imm,rb,ra); + else ins = op_lsr(cnd,imm,ra); + } else if (strcasecmp("BR",opc)==0) { + if ((dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)) + valid = false; + else ins = op_bra(cnd, imm); + } else if (strcasecmp("BRA",opc)==0) { + if ((!dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)||(cnd != ZIPC_ALWAYS)) + valid = false; + else ins = op_bra(imm); + } else if (strcasecmp("BRZ",opc)==0) { + if ((!dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)||(cnd != ZIPC_ALWAYS)) + valid = false; + else ins = op_brz(imm); + } else if ((strcasecmp("BRNZ",opc)==0)||(strcasecmp("BNZ",opc)==0)) { + if ((!dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)||(cnd != ZIPC_ALWAYS)) + valid = false; + else ins = op_bnz(imm); + } else if ((strcasecmp("BRGE",opc)==0)||(strcasecmp("BGE",opc)==0)) { + if ((!dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)||(cnd != ZIPC_ALWAYS)) + valid = false; + else ins = op_bge(imm); + } else if ((strcasecmp("BRGT",opc)==0)||(strcasecmp("BGT",opc)==0)) { + if ((!dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)||(cnd != ZIPC_ALWAYS)) + valid = false; + else ins = op_bgt(imm); + } else if (strcasecmp("BRZ",opc)==0) { + } else if ((strcasecmp("BRLT",opc)==0)||(strcasecmp("BLT",opc)==0)) { + if ((!dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)||(cnd != ZIPC_ALWAYS)) + valid = false; + else ins = op_blt(imm); + } else if ((strcasecmp("BRC",opc)==0)||(strcasecmp("BC",opc)==0)) { + if ((!dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)||(cnd != ZIPC_ALWAYS)) + valid = false; + else ins = op_brc(imm); + } else if ((strcasecmp("BRV",opc)==0)||(strcasecmp("BV",opc)==0)) { + if ((!dollar)||(ra != ZIP_Rnone)||(rb != ZIP_Rnone)||(cnd != ZIPC_ALWAYS)) + valid = false; + else ins = op_brv(imm); + } else if (strcasecmp("CLRF",opc)==0) { + if ((ra == ZIP_Rnone)&&(!dollar)&&(imm==0)) + ins = op_clrf(cnd, rb); + else valid = false; + } else if((strcasecmp("HALT",opc)==0)||(strcasecmp("WAIT",opc)==0)) { + if ((rb == ZIP_Rnone)&&(ra==ZIP_Rnone)&&(!comma)&&(!dollar)) + ins = op_halt(cnd); + else valid = false; + } else if (strcasecmp("BUSY",opc)==0) { + if ((rb == ZIP_Rnone)&&(ra==ZIP_Rnone)&&(!comma)&&(!dollar)) + ins = op_busy(cnd); + else valid = false; + } else if (strcasecmp("RTU",opc)==0) { + if ((rb == ZIP_Rnone)&&(ra==ZIP_Rnone)&&(imm==0)&&(!comma)&&(!dollar)) + ins = op_rtu(cnd); + else { printf("ERRR,RTU, ra=%d,rb=%d,imm=%08x,comma=%s,dollar=%s\n", + (int)ra, (int)rb, imm, (comma)?"true":"false", + (dollar)?"true":"false"); + valid = false; + } + } else if (strcasecmp("JMP",opc)==0) { + if ((rb != ZIP_Rnone)&&(!comma)) + ins = op_not(cnd, rb); + else valid = false; + } else if (strcasecmp("NOT",opc)==0) { + if ((rb != ZIP_Rnone)&&(ra==ZIP_Rnone)&&(!comma)&&(!dollar)) + ins = op_not(cnd, rb); + else valid = false; + } else valid = false; + + return valid; +} + +bool ZPARSER::parse(const char *line, ZPARSER::ZIPA &pc, ZPARSER::ZIPI &instruction, const unsigned int lineno) { + bool v = parse_op(line, pc, instruction, lineno); + pc = pc + 1; + return v; +} + +#define IMMOP(OP,CND,IMM,A) (((OP&0x0f)<<28)|((A&0x0f)<<24)|((CND&0x07)<<21) \ + | (IMM & 0x0fffff)) + +#define DBLREGOP(OP,CND,IMM,B,A) (((OP&0x0f)<<28)|((A&0x0f)<<24) \ + |((CND&0x07)<<21)|(1<<20)|((B&0x0f)<<16) \ + | (IMM & 0x0ffff)) + +ZIPI ZPARSER::op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0x0, cnd, imm, b, a); +} + +ZIPI ZPARSER::op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0x0, cnd, imm, a); +} + + +ZIPI ZPARSER::op_tst(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0x1, cnd, imm, b, a); +} ZIPI ZPARSER::op_tst(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0x1, cnd, imm, a); +} + +ZIPI ZPARSER::op_mov(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + ZIPI in; + in = (0x02 << 28)|((a&0x0f)<<24)|((cnd&0x07)<<21); + in |= (a&0x10)<<16; + in |= (b&0x0f)<<16; + in |= (b&0x10)<<11; + in |= imm & 0x07fff; + return in; +} + + +ZIPI ZPARSER::op_ldi(ZIPIMM imm, ZIPREG a) const { + ZIPI in; + in = ((0x03)<<28) | ((a&0x0f)<<24) | (imm & ((1<<24)-1)); + return in; +} + +ZIPI ZPARSER::op_trap(ZIPCOND cnd, ZIPIMM imm) const { + ZIPI in; + in = ((0x4f)<<24)|((cnd&0x07)<<21)|(1<<20)|((0x0e)<<16); + in |= (imm & 0x0ffff); + return in; +} + +ZIPI ZPARSER::op_noop(void) const { + return 0x4e000000; +} +ZIPI ZPARSER::op_break(void) const { + return 0x4e000001; +} + +ZIPI ZPARSER::op_ldihi(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + ZIPI in; + in = ((0x4f)<<24)|((cnd&0x07)<<21)|(1<<20)|((a&0x0f)<<16); + in |= (imm & 0x0ffff); + return in; +} +ZIPI ZPARSER::op_ldilo(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + ZIPI in; + in = ((0x4f)<<24)|((cnd&0x07)<<21)|(0<<20)|((a&0x0f)<<16); + in |= (imm & 0x0ffff); + return in; +} + +ZIPI ZPARSER::op_lod(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0x6, cnd, imm, b, a); +} + +ZIPI ZPARSER::op_lod(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0x6, cnd, imm, a); +} + + +ZIPI ZPARSER::op_sto(ZIPCOND cnd, ZIPREG v, ZIPIMM imm, ZIPREG b) const { + return DBLREGOP(0x7, cnd, imm, b, v); +} ZIPI ZPARSER::op_sto(ZIPCOND cnd, ZIPREG v, ZIPIMM imm) const { + return IMMOP(0x7, cnd, imm, v); +} + + +ZIPI ZPARSER::op_sub(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0x8, cnd, imm, b, a); +} ZIPI ZPARSER::op_sub(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0x8, cnd, imm, a); +} + + +ZIPI ZPARSER::op_and(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0x9, cnd, imm, b, a); +} ZIPI ZPARSER::op_and(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0x9, cnd, imm, a); +} + + +ZIPI ZPARSER::op_add(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0xa, cnd, imm, b, a); +} ZIPI ZPARSER::op_add(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0xa, cnd, imm, a); +} + + +ZIPI ZPARSER::op_or(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0xb, cnd, imm, b, a); +} ZIPI ZPARSER::op_or(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0xb, cnd, imm, a); +} + +ZIPI ZPARSER::op_xor(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0xc, cnd, imm, b, a); +} ZIPI ZPARSER::op_xor(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0xc, cnd, imm, a); +} + +ZIPI ZPARSER::op_lsl(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0xd, cnd, imm, b, a); +} ZIPI ZPARSER::op_lsl(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0xd, cnd, imm, a); +} + +ZIPI ZPARSER::op_asr(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0xe, cnd, imm, b, a); +} ZIPI ZPARSER::op_asr(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0xe, cnd, imm, a); +} + +ZIPI ZPARSER::op_lsr(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const { + return DBLREGOP(0xf, cnd, imm, b, a); +} ZIPI ZPARSER::op_lsr(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const { + return IMMOP(0xf, cnd, imm, a); +} + Index: zipcpu/trunk/sw/zasm/obj-pc/depends.txt =================================================================== --- zipcpu/trunk/sw/zasm/obj-pc/depends.txt (nonexistent) +++ zipcpu/trunk/sw/zasm/obj-pc/depends.txt (revision 2) @@ -0,0 +1,6 @@ +obj-pc/optest.o: optest.cpp zopcodes.h +obj-pc/twoc.o: twoc.cpp twoc.h +obj-pc/zasm.o: zasm.cpp zopcodes.h zparser.h +obj-pc/zdump.o: zdump.cpp zopcodes.h +obj-pc/zopcodes.o: zopcodes.cpp twoc.h zopcodes.h +obj-pc/zparser.o: zparser.cpp zparser.h zopcodes.h Index: zipcpu/trunk/sw/zasm/zasm.cpp =================================================================== --- zipcpu/trunk/sw/zasm/zasm.cpp (nonexistent) +++ zipcpu/trunk/sw/zasm/zasm.cpp (revision 2) @@ -0,0 +1,108 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Filename: zasm.cpp +// +// Project: Zip CPU -- a small, lightweight, RISC CPU core +// +// Purpose: This is a placeholder assembler, kept until I can get a working +// port of the binutils assembler et. al. +// +// Creator: Dan Gisselquist, Ph.D. +// Gisselquist Tecnology, LLC +// +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015, Gisselquist Technology, LLC +// +// This program is free software (firmware): you can redistribute it and/or +// modify it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or (at +// your option) any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no +// target there if the PDF file isn't present.) If not, see +// for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include + +#include "zopcodes.h" +#include "zparser.h" + +void as_file(FILE *fout, FILE *fp) { + const int NZIP = 4096; + char ln[NZIP]; + ZIPI ibuf[NZIP]; + int nr; + ZPARSER zp; + ZPARSER::ZIPA za = 0x01c0000, bfa = 0; + int lineno = 0; + + while(NULL != fgets(ln, NZIP, fp)) { + ZPARSER::ZIPI zi; + + lineno++; + if (zp.iscomment(ln)) + ; + else if (zp.islabel(ln)) + ; + else if (zp.parse_op(ln, za, zi, lineno)) + ibuf[bfa++] = zi; + else printf("ERROR, line %d: %s", lineno, ln); + if (bfa >= NZIP) { + fwrite(ibuf, sizeof(ZIPI), bfa, fout); + bfa = 0; + } + + for(int i=0; i 0) { + fwrite(ibuf, sizeof(ZIPI), bfa, fout); + bfa = 0; + } +} + +void as_file(FILE *fout, const char *fn) { + FILE *fp = fopen(fn, "r"); + if (!fp) { + fprintf(stderr, "ERR: Cannot open %s\n", fn); + perror("O/S Err:"); + return; + } as_file(fout, fp); + fclose(fp); +} + +int main(int argc, char **argv) { + FILE *fp = fopen("z.out","w"); + + if (!fp) { + fprintf(stderr, "Could not open z.out\n"); + perror("O/S Err:"); + exit(-1); + } + if (argc == 1) { + as_file(fp, stdin); + } else for(int argn=1; argn for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +//////////////////////////////////////////////////////////////////////////////// +#ifndef ZOPCODES_H +#define ZOPCODES_H + +#define OPUNUSED -1 +#define ISUSEROP(A) ((a&(~0x0f))==0x000) +#define ISSUPROP(A) ((a&(~0x0f))==0x010) +#define ISLCLROP(A) ((a&(~0x0f))==0x020) +#define BITFIELD(LN,MN) (((LN&0x0ff)<<8)+(MN&0x0ff)) +#define REGFIELD(MN) (0x00000400 +(MN&0x0ff)) +#define URGFIELD(MN) (0x0100400 +(MN&0x0ff)) +#define SRGFIELD(MN) (0x0200400 +(MN&0x0ff)) +#define IMMFIELD(LN,MN) (0x40000000 + (((LN&0x0ff)<<8)+(MN&0x0ff))) // Sgn extnd +// #define REGVAL(V) ((V & 0x0f)+0x020) + +typedef unsigned int ZIPI; + +typedef struct { + char s_opstr[8]; + ZIPI s_mask, s_val; + int s_result, s_ra, s_rb, s_i, s_cf; +} ZOPCODE; + +extern const ZOPCODE zoplist[]; +extern const int nzoplist; + +// Disassemble an opcode +extern void zipi_to_string(const ZIPI ins, char *line); +extern const char *zop_regstr[]; +extern const char *zop_ccstr[]; + +#endif Index: zipcpu/trunk/sw/zasm/zparser.h =================================================================== --- zipcpu/trunk/sw/zasm/zparser.h (nonexistent) +++ zipcpu/trunk/sw/zasm/zparser.h (revision 2) @@ -0,0 +1,234 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Filename: zparser.h +// +// Project: Zip CPU -- a small, lightweight, RISC CPU core +// +// Purpose: The beginnings of a parser for Zip CPU assembly. +// +// Creator: Dan Gisselquist, Ph.D. +// Gisselquist Tecnology, LLC +// +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015, Gisselquist Technology, LLC +// +// This program is free software (firmware): you can redistribute it and/or +// modify it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or (at +// your option) any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no +// target there if the PDF file isn't present.) If not, see +// for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef ZPARSER_H +#define ZPARSER_H + +class ZPARSER { +public: + typedef unsigned int ZIPI, ZIPA; + typedef int ZIPIMM; + typedef enum { + ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7, + ZIP_R8, ZIP_R9, ZIP_R10, ZIP_R11, ZIP_R12, + ZIP_SP, ZIP_CC, ZIP_PC, + ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7, + ZIP_uR8, ZIP_uR9, ZIP_uR10, ZIP_uR11, ZIP_uR12, + ZIP_uSP, ZIP_uCC, ZIP_uPC, + ZIP_Rnone + } ZIPREG; + + typedef enum { + ZIPC_ALWAYS, ZIPC_Z, ZIPC_NZ, ZIPC_GE, ZIPC_GT, ZIPC_LT, + ZIPC_C, ZIPC_V + } ZIPCOND; + + bool iscomment(const char *line) const; + bool islabel(const char *line) const; + bool parse_op(const char *line, ZIPA pc, ZIPI &instruction, const unsigned lineno) const; + bool parse(const char *line, ZIPA &pc, ZIPI &instruction, const unsigned lineno); + + ZIPI op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_cmp(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_cmp(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_cmp(ZIPIMM imm, ZIPREG a) const + { return op_cmp(ZIPC_ALWAYS, imm, a); } + + ZIPI op_tst(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_tst(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_tst(ZIPIMM imm, ZIPREG a) const + { return op_tst(ZIPC_ALWAYS, imm, a); } + ZIPI op_tst(ZIPCOND cnd, ZIPREG a) const + { return op_tst(cnd, -1, a); } + + ZIPI op_mov(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_mov(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_mov(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_mov(ZIPREG b, ZIPREG a) const + { return op_mov(ZIPC_ALWAYS, 0, b, a); } + + ZIPI op_ldi(ZIPIMM imm, ZIPREG a) const; + ZIPI op_trap(ZIPCOND cnd, ZIPIMM imm) const; + ZIPI op_trap(ZIPIMM imm) const + { return op_trap(ZIPC_ALWAYS, imm); } + ZIPI op_clr(ZIPREG a) const { return op_ldi(0, a); } + + ZIPI op_noop(void) const; + ZIPI op_break(void) const; + + ZIPI op_ldihi(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_ldilo(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_ldihi(ZIPIMM imm, ZIPREG a) const + { return op_ldihi(ZIPC_ALWAYS, imm, a); } + ZIPI op_ldilo(ZIPIMM imm, ZIPREG a) const + { return op_ldilo(ZIPC_ALWAYS, imm, a); } + + ZIPI op_lod(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_lod(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_lod(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_lod(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_lod(ZIPIMM imm, ZIPREG a) const + { return op_lod(ZIPC_ALWAYS, imm, a); } + + ZIPI op_sto(ZIPCOND cnd, ZIPREG v, ZIPIMM imm, ZIPREG b) const; + ZIPI op_sto(ZIPCOND cnd, ZIPREG v, ZIPIMM imm) const; + ZIPI op_sto(ZIPREG v, ZIPIMM imm, ZIPREG b) const + { return op_sto(ZIPC_ALWAYS, v, imm, b); } + ZIPI op_sto(ZIPREG v, ZIPIMM imm) const + { return op_sto(ZIPC_ALWAYS, v, imm); } + + ZIPI op_sub(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_sub(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_sub(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_sub(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_sub(ZIPIMM imm, ZIPREG a) const + { return op_sub(ZIPC_ALWAYS, imm, a); } + + ZIPI op_and(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_and(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_and(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_and(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_and(ZIPIMM imm, ZIPREG a) const + { return op_and(ZIPC_ALWAYS, imm, a); } + + ZIPI op_add(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_add(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_add(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_add(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_add(ZIPIMM imm, ZIPREG a) const // GOOD + { return op_add(ZIPC_ALWAYS, imm, a); } + + ZIPI op_or(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_or(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_or(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_or(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_or(ZIPIMM imm, ZIPREG a) const + { return op_or(ZIPC_ALWAYS, imm, a); } + + ZIPI op_xor(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_xor(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_xor(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_xor(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_xor(ZIPIMM imm, ZIPREG a) const + { return op_xor(ZIPC_ALWAYS, imm, a); } + + ZIPI op_lsl(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_lsl(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_lsl(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_lsl(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_lsl(ZIPIMM imm, ZIPREG a) const + { return op_lsl(ZIPC_ALWAYS, imm, a); } + ZIPI op_asl(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_lsl(cnd, imm, b, a); } + ZIPI op_asl(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const + { return op_lsl(cnd, imm, a); } + ZIPI op_asl(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_lsl(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_asl(ZIPIMM imm, ZIPREG a) const + { return op_lsl(ZIPC_ALWAYS, imm, a); } + + ZIPI op_asr(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_asr(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_asr(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_asr(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_asr(ZIPIMM imm, ZIPREG a) const + { return op_asr(ZIPC_ALWAYS, imm, a); } + + ZIPI op_lsr(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const; + ZIPI op_lsr(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const; + ZIPI op_lsr(ZIPIMM imm, ZIPREG b, ZIPREG a) const + { return op_lsr(ZIPC_ALWAYS, imm, b, a); } + ZIPI op_lsr(ZIPIMM imm, ZIPREG a) const + { return op_lsr(ZIPC_ALWAYS, imm, a); } + + ZIPI op_bra(ZIPCOND cnd, ZIPIMM imm) const + { return op_mov(cnd, imm, ZIP_PC, ZIP_PC); } + ZIPI op_bra(ZIPIMM imm) const + { return op_mov(ZIPC_ALWAYS, imm, ZIP_PC, ZIP_PC); } + ZIPI op_brz(ZIPIMM imm) const + { return op_mov(ZIPC_Z, imm, ZIP_PC, ZIP_PC); } + ZIPI op_bnz(ZIPIMM imm) const + { return op_mov(ZIPC_NZ, imm, ZIP_PC, ZIP_PC); } + ZIPI op_bge(ZIPIMM imm) const + { return op_mov(ZIPC_GE, imm, ZIP_PC, ZIP_PC); } + ZIPI op_bgt(ZIPIMM imm) const + { return op_mov(ZIPC_GT, imm, ZIP_PC, ZIP_PC); } + ZIPI op_blt(ZIPIMM imm) const + { return op_mov(ZIPC_LT, imm, ZIP_PC, ZIP_PC); } + ZIPI op_brc(ZIPIMM imm) const + { return op_mov(ZIPC_C, imm, ZIP_PC, ZIP_PC); } + ZIPI op_brv(ZIPIMM imm) const + { return op_mov(ZIPC_V, imm, ZIP_PC, ZIP_PC); } + ZIPI op_bv(ZIPIMM imm) const + { return op_brv(imm); } + + ZIPI op_clrf(ZIPCOND cnd, ZIPREG a) const + { return op_xor(cnd, 0, a, a); } + ZIPI op_clrf(ZIPREG a) const + { return op_xor(ZIPC_ALWAYS, 0, a, a); } + ZIPI op_halt(ZIPCOND c) const { + return op_or(c, 0x10, ZIP_CC); } + ZIPI op_wait(ZIPCOND c) const { + return op_or(c, 0x10, ZIP_CC); } + ZIPI op_halt(void) const { + return op_or(ZIPC_ALWAYS, 0x10, ZIP_CC); } + ZIPI op_wait(void) const { + return op_or(ZIPC_ALWAYS, 0x10, ZIP_CC); } + ZIPI op_busy(ZIPCOND c) const { + return op_mov(c, -1, ZIP_PC, ZIP_PC); } + ZIPI op_busy(void) const { + return op_mov(ZIPC_ALWAYS, -1, ZIP_PC, ZIP_PC); } + + ZIPI op_rtu(void) const { + return op_or(ZIPC_ALWAYS, 0x20, ZIP_CC); } + ZIPI op_rtu(ZIPCOND cnd) const { + return op_or(cnd, 0x20, ZIP_CC); } + + ZIPI op_jmp(ZIPCOND c, ZIPIMM imm, ZIPREG r) const + { return op_mov(ZIPC_ALWAYS, imm, r, ZIP_PC); } + + ZIPI op_ljmp(ZIPCOND c, ZIPIMM imm) const { + return op_add(ZIPC_ALWAYS, imm, ZIP_PC); } + + ZIPI op_not(ZIPCOND c, ZIPREG r) const + { return op_xor(c, -1, r); } + ZIPI op_not(ZIPREG r) const + { return op_xor(ZIPC_ALWAYS, -1, r); } + +}; + +#endif Index: zipcpu/trunk/sw/zasm/twoc.cpp =================================================================== --- zipcpu/trunk/sw/zasm/twoc.cpp (nonexistent) +++ zipcpu/trunk/sw/zasm/twoc.cpp (revision 2) @@ -0,0 +1,105 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Filename: twoc.cpp +// +// Project: Zip CPU -- a small, lightweight, RISC CPU soft core +// +// Purpose: Some various two's complement related C++ helper routines. +// Specifically, these help extract signed numbers from +// packed bitfields, while guaranteeing that the upper bits +// are properly sign extended (or not) as desired. +// +// Creator: Dan Gisselquist, Ph.D. +// Gisselquist Tecnology, LLC +// +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015, Gisselquist Technology, LLC +// +// This program is free software (firmware): you can redistribute it and/or +// modify it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or (at +// your option) any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no +// target there if the PDF file isn't present.) If not, see +// for a copy. +// +// License: GPL, v3, as defined and found on www.gnu.org, +// http://www.gnu.org/licenses/gpl.html +// +// +/////////////////////////////////////////////////////////////////////////// +#include +#include +#include "twoc.h" + +long sbits(const long val, const int bits) { + long r; + + r = val & ((1l< bits_out); + if (bits_in == bits_out) + r = s; + else if (bits_in-1 == bits_out) { + t = sbits(val>>1, bits_out); + // printf("TEST! S = %ld, T = %ld\n", s, t); + if (3 == (s&3)) + t = t+1; + r = t; + } else { + // A. 0XXXX.0xxxxx -> 0XXXX + // B. 0XXX0.100000 -> 0XXX0; + // C. 0XXX1.100000 -> 0XXX1+1; + // D. 0XXXX.1zzzzz -> 0XXXX+1; + // E. 1XXXX.0xxxxx -> 1XXXX + // F. 1XXX0.100000 -> ??? XXX0; + // G. 1XXX1.100000 -> ??? XXX1+1; + // H. 1XXXX.1zzzzz -> 1XXXX+1; + t = sbits(val>>(bits_in-bits_out), bits_out); // Truncated value + if (0 == ((s >> (bits_in-bits_out-1))&1)) { + // printf("A\n"); + r = t; + } else if (0 != (s & ((1<<(bits_in-bits_out-1))-1))) { + // printf("D\n"); + r = t+1; + } else if (t&1) { + // printf("C\n"); + r = t+1; + } else { // 3 ..?11 + // printf("B\n"); + r = t; + } + } return r; +} + + Index: zipcpu/trunk/sw/zasm/Makefile =================================================================== --- zipcpu/trunk/sw/zasm/Makefile (nonexistent) +++ zipcpu/trunk/sw/zasm/Makefile (revision 2) @@ -0,0 +1,98 @@ +################################################################################ +# +# Filename: Makefile +# +# Project: Zip CPU -- a small, lightweight, RISC CPU soft core +# +# Purpose: This makefile builds an assembler and disassembler. +# +# +# Creator: Dan Gisselquist, Ph.D. +# Gisselquist Tecnology, LLC +# +################################################################################ +# +# Copyright (C) 2015, Gisselquist Technology, LLC +# +# This program is free software (firmware): you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# License: GPL, v3, as defined and found on www.gnu.org, +# http://www.gnu.org/licenses/gpl.html +# +# +################################################################################ +# +.PHONY: all +all: zasm optest zdump +OBJDIR= obj-pc +CXX= g++ +CC= gcc +YYMMDD=`date +%Y%m%d` +DBGFLAGS= -g -O0 +OPTFLAGS= -O3 +CCFLAGS= $(DBGFLAGS) +PROGRAMS= zasm optest zdump + +.PHONY: programs +all: $(OBJDIR)/ programs + +programs: $(PROGRAMS) + +ZASMSRC= zasm.cpp zopcodes.cpp zparser.cpp twoc.cpp +ZASMOBJ= $(addprefix $(OBJDIR)/,$(subst .cpp,.o,$(ZASMSRC))) +zasm: $(ZASMOBJ) + $(CXX) $(CCFLAGS) $(ZASMOBJ) -o $@ + +optest: optest.cpp zopcodes.cpp twoc.cpp twoc.h zopcodes.h + $(CXX) $(CCFLAGS) optest.cpp zopcodes.cpp twoc.cpp -o optest + +ZDMPSRC= zdump.cpp zopcodes.cpp twoc.cpp +ZDMPOBJ= $(addprefix $(OBJDIR)/,$(subst .cpp,.o,$(ZDMPSRC))) +zdump: $(ZDMPOBJ) + $(CXX) $(CCFLAGS) $(ZDMPOBJ) -o $@ + +$(OBJDIR)/%.o: %.cpp + $(CXX) -c $(CCFLAGS) $< -o $@ + +$(OBJDIR)/: + @bash -c "if [ ! -e $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi" + +define build-depends + @echo "Building dependency file(s)" + @$(CXX) $(CCFLAGS) -MM *.cpp > xd.txt + @sed -e 's/^.*.o: /$(OBJDIR)\/&/' < xd.txt > $(OBJDIR)/depends.txt + @rm xd.txt +endef + +tags: $(SOURCES) $(HEADERS) + @echo "Generating tags" + @ctags *.cpp *.h # $(SOURCES) $(HEADERS) + +.PHONY: depends +depends: tags + $(build-depends) + +$(OBJDIR)/depends.txt: $(OBJDIR)/ $(SOURCES) $(HEADERS) + $(build-depends) + +.PHONY: clean +clean: + rm -rf $(OBJDIR) $(PROGRAMS) + +-include $(OBJDIR)/depends.txt + + + + + + + + Index: zipcpu/trunk/sw/zasm/tags =================================================================== --- zipcpu/trunk/sw/zasm/tags (nonexistent) +++ zipcpu/trunk/sw/zasm/tags (revision 2) @@ -0,0 +1,188 @@ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ +!_TAG_PROGRAM_NAME Exuberant Ctags // +!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ +!_TAG_PROGRAM_VERSION 5.9~svn20110310 // +BITFIELD zopcodes.h 8;" d +DBLREGOP zparser.cpp 361;" d file: +IMMFIELD zopcodes.h 12;" d +IMMOP zparser.cpp 358;" d file: +ISLCLROP zopcodes.h 7;" d +ISSUPROP zopcodes.h 6;" d +ISUSEROP zopcodes.h 5;" d +OPUNUSED zopcodes.h 4;" d +REGFIELD zopcodes.h 9;" d +SRGFIELD zopcodes.h 11;" d +TWOC_H twoc.h 40;" d +URGFIELD zopcodes.h 10;" d +ZIPA zparser.h /^ typedef unsigned int ZIPI, ZIPA;$/;" t class:ZPARSER +ZIPCOND zparser.h /^ } ZIPCOND;$/;" t class:ZPARSER typeref:enum:ZPARSER::__anon3 +ZIPC_ALWAYS zparser.h /^ ZIPC_ALWAYS, ZIPC_Z, ZIPC_NZ, ZIPC_GE, ZIPC_GT, ZIPC_LT,$/;" e enum:ZPARSER::__anon3 +ZIPC_C zparser.h /^ ZIPC_C, ZIPC_V$/;" e enum:ZPARSER::__anon3 +ZIPC_GE zparser.h /^ ZIPC_ALWAYS, ZIPC_Z, ZIPC_NZ, ZIPC_GE, ZIPC_GT, ZIPC_LT,$/;" e enum:ZPARSER::__anon3 +ZIPC_GT zparser.h /^ ZIPC_ALWAYS, ZIPC_Z, ZIPC_NZ, ZIPC_GE, ZIPC_GT, ZIPC_LT,$/;" e enum:ZPARSER::__anon3 +ZIPC_LT zparser.h /^ ZIPC_ALWAYS, ZIPC_Z, ZIPC_NZ, ZIPC_GE, ZIPC_GT, ZIPC_LT,$/;" e enum:ZPARSER::__anon3 +ZIPC_NZ zparser.h /^ ZIPC_ALWAYS, ZIPC_Z, ZIPC_NZ, ZIPC_GE, ZIPC_GT, ZIPC_LT,$/;" e enum:ZPARSER::__anon3 +ZIPC_V zparser.h /^ ZIPC_C, ZIPC_V$/;" e enum:ZPARSER::__anon3 +ZIPC_Z zparser.h /^ ZIPC_ALWAYS, ZIPC_Z, ZIPC_NZ, ZIPC_GE, ZIPC_GT, ZIPC_LT,$/;" e enum:ZPARSER::__anon3 +ZIPI zopcodes.h /^typedef unsigned int ZIPI;$/;" t +ZIPI zparser.cpp /^typedef ZPARSER::ZIPI ZIPI; \/\/ A Zip Instruction (i.e. uint32)$/;" t file: +ZIPI zparser.h /^ typedef unsigned int ZIPI, ZIPA;$/;" t class:ZPARSER +ZIPIMM zparser.h /^ typedef int ZIPIMM;$/;" t class:ZPARSER +ZIPREG zparser.h /^ } ZIPREG;$/;" t class:ZPARSER typeref:enum:ZPARSER::__anon2 +ZIP_CC zparser.h /^ ZIP_SP, ZIP_CC, ZIP_PC,$/;" e enum:ZPARSER::__anon2 +ZIP_PC zparser.h /^ ZIP_SP, ZIP_CC, ZIP_PC,$/;" e enum:ZPARSER::__anon2 +ZIP_R0 zparser.h /^ ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7,$/;" e enum:ZPARSER::__anon2 +ZIP_R1 zparser.h /^ ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7,$/;" e enum:ZPARSER::__anon2 +ZIP_R10 zparser.h /^ ZIP_R8, ZIP_R9, ZIP_R10, ZIP_R11, ZIP_R12,$/;" e enum:ZPARSER::__anon2 +ZIP_R11 zparser.h /^ ZIP_R8, ZIP_R9, ZIP_R10, ZIP_R11, ZIP_R12,$/;" e enum:ZPARSER::__anon2 +ZIP_R12 zparser.h /^ ZIP_R8, ZIP_R9, ZIP_R10, ZIP_R11, ZIP_R12,$/;" e enum:ZPARSER::__anon2 +ZIP_R2 zparser.h /^ ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7,$/;" e enum:ZPARSER::__anon2 +ZIP_R3 zparser.h /^ ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7,$/;" e enum:ZPARSER::__anon2 +ZIP_R4 zparser.h /^ ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7,$/;" e enum:ZPARSER::__anon2 +ZIP_R5 zparser.h /^ ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7,$/;" e enum:ZPARSER::__anon2 +ZIP_R6 zparser.h /^ ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7,$/;" e enum:ZPARSER::__anon2 +ZIP_R7 zparser.h /^ ZIP_R0, ZIP_R1, ZIP_R2, ZIP_R3, ZIP_R4, ZIP_R5, ZIP_R6, ZIP_R7,$/;" e enum:ZPARSER::__anon2 +ZIP_R8 zparser.h /^ ZIP_R8, ZIP_R9, ZIP_R10, ZIP_R11, ZIP_R12,$/;" e enum:ZPARSER::__anon2 +ZIP_R9 zparser.h /^ ZIP_R8, ZIP_R9, ZIP_R10, ZIP_R11, ZIP_R12,$/;" e enum:ZPARSER::__anon2 +ZIP_Rnone zparser.h /^ ZIP_Rnone$/;" e enum:ZPARSER::__anon2 +ZIP_SP zparser.h /^ ZIP_SP, ZIP_CC, ZIP_PC,$/;" e enum:ZPARSER::__anon2 +ZIP_uCC zparser.h /^ ZIP_uSP, ZIP_uCC, ZIP_uPC,$/;" e enum:ZPARSER::__anon2 +ZIP_uPC zparser.h /^ ZIP_uSP, ZIP_uCC, ZIP_uPC,$/;" e enum:ZPARSER::__anon2 +ZIP_uR0 zparser.h /^ ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7,$/;" e enum:ZPARSER::__anon2 +ZIP_uR1 zparser.h /^ ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7,$/;" e enum:ZPARSER::__anon2 +ZIP_uR10 zparser.h /^ ZIP_uR8, ZIP_uR9, ZIP_uR10, ZIP_uR11, ZIP_uR12,$/;" e enum:ZPARSER::__anon2 +ZIP_uR11 zparser.h /^ ZIP_uR8, ZIP_uR9, ZIP_uR10, ZIP_uR11, ZIP_uR12,$/;" e enum:ZPARSER::__anon2 +ZIP_uR12 zparser.h /^ ZIP_uR8, ZIP_uR9, ZIP_uR10, ZIP_uR11, ZIP_uR12,$/;" e enum:ZPARSER::__anon2 +ZIP_uR2 zparser.h /^ ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7,$/;" e enum:ZPARSER::__anon2 +ZIP_uR3 zparser.h /^ ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7,$/;" e enum:ZPARSER::__anon2 +ZIP_uR4 zparser.h /^ ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7,$/;" e enum:ZPARSER::__anon2 +ZIP_uR5 zparser.h /^ ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7,$/;" e enum:ZPARSER::__anon2 +ZIP_uR6 zparser.h /^ ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7,$/;" e enum:ZPARSER::__anon2 +ZIP_uR7 zparser.h /^ ZIP_uR0, ZIP_uR1, ZIP_uR2, ZIP_uR3, ZIP_uR4, ZIP_uR5, ZIP_uR6, ZIP_uR7,$/;" e enum:ZPARSER::__anon2 +ZIP_uR8 zparser.h /^ ZIP_uR8, ZIP_uR9, ZIP_uR10, ZIP_uR11, ZIP_uR12,$/;" e enum:ZPARSER::__anon2 +ZIP_uR9 zparser.h /^ ZIP_uR8, ZIP_uR9, ZIP_uR10, ZIP_uR11, ZIP_uR12,$/;" e enum:ZPARSER::__anon2 +ZIP_uSP zparser.h /^ ZIP_uSP, ZIP_uCC, ZIP_uPC,$/;" e enum:ZPARSER::__anon2 +ZOPCODE zopcodes.h /^} ZOPCODE;$/;" t typeref:struct:__anon1 +ZOPCODES_H zopcodes.h 2;" d +ZPARSER zparser.h /^class ZPARSER {$/;" c +ZPARSER_H zparser.h 2;" d +as_file zasm.cpp /^void as_file(FILE *fout, FILE *fp) {$/;" f +as_file zasm.cpp /^void as_file(FILE *fout, const char *fn) {$/;" f +dump_file zdump.cpp /^void dump_file(const char *fn) {$/;" f +getbits zopcodes.cpp /^static int getbits(const ZIPI ins, const int which) {$/;" f file: +iscomment zparser.cpp /^bool ZPARSER::iscomment(const char *line) const {$/;" f class:ZPARSER +islabel zparser.cpp /^bool ZPARSER::islabel(const char *line) const {$/;" f class:ZPARSER +main optest.cpp /^int main(int argc, char **argv) {$/;" f +main zasm.cpp /^int main(int argc, char **argv) {$/;" f +main zdump.cpp /^int main(int argc, char **argv) {$/;" f +nzoplist zopcodes.cpp /^const int nzoplist = (sizeof(zoplist)\/sizeof(ZOPCODE));$/;" v +op_add zparser.cpp /^ZIPI ZPARSER::op_add(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_add zparser.cpp /^} ZIPI ZPARSER::op_add(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_add zparser.h /^ ZIPI op_add(ZIPIMM imm, ZIPREG a) const \/\/ GOOD$/;" f class:ZPARSER +op_add zparser.h /^ ZIPI op_add(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_and zparser.cpp /^ZIPI ZPARSER::op_and(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_and zparser.cpp /^} ZIPI ZPARSER::op_and(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_and zparser.h /^ ZIPI op_and(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_and zparser.h /^ ZIPI op_and(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_asl zparser.h /^ ZIPI op_asl(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_asl zparser.h /^ ZIPI op_asl(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_asl zparser.h /^ ZIPI op_asl(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_asl zparser.h /^ ZIPI op_asl(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_asr zparser.cpp /^ZIPI ZPARSER::op_asr(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_asr zparser.cpp /^} ZIPI ZPARSER::op_asr(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_asr zparser.h /^ ZIPI op_asr(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_asr zparser.h /^ ZIPI op_asr(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_bge zparser.h /^ ZIPI op_bge(ZIPIMM imm) const$/;" f class:ZPARSER +op_bgt zparser.h /^ ZIPI op_bgt(ZIPIMM imm) const$/;" f class:ZPARSER +op_blt zparser.h /^ ZIPI op_blt(ZIPIMM imm) const$/;" f class:ZPARSER +op_bnz zparser.h /^ ZIPI op_bnz(ZIPIMM imm) const$/;" f class:ZPARSER +op_bra zparser.h /^ ZIPI op_bra(ZIPCOND cnd, ZIPIMM imm) const$/;" f class:ZPARSER +op_bra zparser.h /^ ZIPI op_bra(ZIPIMM imm) const$/;" f class:ZPARSER +op_brc zparser.h /^ ZIPI op_brc(ZIPIMM imm) const$/;" f class:ZPARSER +op_break zparser.cpp /^ZIPI ZPARSER::op_break(void) const {$/;" f class:ZPARSER +op_brv zparser.h /^ ZIPI op_brv(ZIPIMM imm) const$/;" f class:ZPARSER +op_brz zparser.h /^ ZIPI op_brz(ZIPIMM imm) const$/;" f class:ZPARSER +op_busy zparser.h /^ ZIPI op_busy(ZIPCOND c) const {$/;" f class:ZPARSER +op_busy zparser.h /^ ZIPI op_busy(void) const {$/;" f class:ZPARSER +op_bv zparser.h /^ ZIPI op_bv(ZIPIMM imm) const$/;" f class:ZPARSER +op_clr zparser.h /^ ZIPI op_clr(ZIPREG a) const { return op_ldi(0, a); }$/;" f class:ZPARSER +op_clrf zparser.h /^ ZIPI op_clrf(ZIPCOND cnd, ZIPREG a) const$/;" f class:ZPARSER +op_clrf zparser.h /^ ZIPI op_clrf(ZIPREG a) const$/;" f class:ZPARSER +op_cmp zparser.cpp /^ZIPI ZPARSER::op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_cmp zparser.cpp /^ZIPI ZPARSER::op_cmp(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_cmp zparser.h /^ ZIPI op_cmp(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_cmp zparser.h /^ ZIPI op_cmp(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_halt zparser.h /^ ZIPI op_halt(ZIPCOND c) const {$/;" f class:ZPARSER +op_halt zparser.h /^ ZIPI op_halt(void) const {$/;" f class:ZPARSER +op_jmp zparser.h /^ ZIPI op_jmp(ZIPCOND c, ZIPIMM imm, ZIPREG r) const$/;" f class:ZPARSER +op_ldi zparser.cpp /^ZIPI ZPARSER::op_ldi(ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_ldihi zparser.cpp /^ZIPI ZPARSER::op_ldihi(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_ldihi zparser.h /^ ZIPI op_ldihi(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_ldilo zparser.cpp /^ZIPI ZPARSER::op_ldilo(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_ldilo zparser.h /^ ZIPI op_ldilo(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_ljmp zparser.h /^ ZIPI op_ljmp(ZIPCOND c, ZIPIMM imm) const {$/;" f class:ZPARSER +op_lod zparser.cpp /^ZIPI ZPARSER::op_lod(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_lod zparser.cpp /^ZIPI ZPARSER::op_lod(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_lod zparser.h /^ ZIPI op_lod(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_lod zparser.h /^ ZIPI op_lod(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_lsl zparser.cpp /^ZIPI ZPARSER::op_lsl(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_lsl zparser.cpp /^} ZIPI ZPARSER::op_lsl(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_lsl zparser.h /^ ZIPI op_lsl(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_lsl zparser.h /^ ZIPI op_lsl(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_lsr zparser.cpp /^ZIPI ZPARSER::op_lsr(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_lsr zparser.cpp /^} ZIPI ZPARSER::op_lsr(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_lsr zparser.h /^ ZIPI op_lsr(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_lsr zparser.h /^ ZIPI op_lsr(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_mov zparser.cpp /^ZIPI ZPARSER::op_mov(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_mov zparser.h /^ ZIPI op_mov(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_mov zparser.h /^ ZIPI op_mov(ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_noop zparser.cpp /^ZIPI ZPARSER::op_noop(void) const {$/;" f class:ZPARSER +op_not zparser.h /^ ZIPI op_not(ZIPCOND c, ZIPREG r) const$/;" f class:ZPARSER +op_not zparser.h /^ ZIPI op_not(ZIPREG r) const$/;" f class:ZPARSER +op_or zparser.cpp /^ZIPI ZPARSER::op_or(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_or zparser.cpp /^} ZIPI ZPARSER::op_or(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_or zparser.h /^ ZIPI op_or(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_or zparser.h /^ ZIPI op_or(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_rtu zparser.h /^ ZIPI op_rtu(ZIPCOND cnd) const {$/;" f class:ZPARSER +op_rtu zparser.h /^ ZIPI op_rtu(void) const {$/;" f class:ZPARSER +op_sto zparser.cpp /^ZIPI ZPARSER::op_sto(ZIPCOND cnd, ZIPREG v, ZIPIMM imm, ZIPREG b) const {$/;" f class:ZPARSER +op_sto zparser.cpp /^} ZIPI ZPARSER::op_sto(ZIPCOND cnd, ZIPREG v, ZIPIMM imm) const {$/;" f class:ZPARSER +op_sto zparser.h /^ ZIPI op_sto(ZIPREG v, ZIPIMM imm) const$/;" f class:ZPARSER +op_sto zparser.h /^ ZIPI op_sto(ZIPREG v, ZIPIMM imm, ZIPREG b) const$/;" f class:ZPARSER +op_sub zparser.cpp /^ZIPI ZPARSER::op_sub(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_sub zparser.cpp /^} ZIPI ZPARSER::op_sub(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_sub zparser.h /^ ZIPI op_sub(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_sub zparser.h /^ ZIPI op_sub(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +op_trap zparser.cpp /^ZIPI ZPARSER::op_trap(ZIPCOND cnd, ZIPIMM imm) const {$/;" f class:ZPARSER +op_trap zparser.h /^ ZIPI op_trap(ZIPIMM imm) const$/;" f class:ZPARSER +op_tst zparser.cpp /^ZIPI ZPARSER::op_tst(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_tst zparser.cpp /^} ZIPI ZPARSER::op_tst(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_tst zparser.h /^ ZIPI op_tst(ZIPCOND cnd, ZIPREG a) const$/;" f class:ZPARSER +op_tst zparser.h /^ ZIPI op_tst(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_wait zparser.h /^ ZIPI op_wait(ZIPCOND c) const {$/;" f class:ZPARSER +op_wait zparser.h /^ ZIPI op_wait(void) const {$/;" f class:ZPARSER +op_xor zparser.cpp /^ZIPI ZPARSER::op_xor(ZIPCOND cnd, ZIPIMM imm, ZIPREG b, ZIPREG a) const {$/;" f class:ZPARSER +op_xor zparser.cpp /^} ZIPI ZPARSER::op_xor(ZIPCOND cnd, ZIPIMM imm, ZIPREG a) const {$/;" f class:ZPARSER +op_xor zparser.h /^ ZIPI op_xor(ZIPIMM imm, ZIPREG a) const$/;" f class:ZPARSER +op_xor zparser.h /^ ZIPI op_xor(ZIPIMM imm, ZIPREG b, ZIPREG a) const$/;" f class:ZPARSER +optest optest.cpp /^void optest(const ZIPI ins) {$/;" f +parse zparser.cpp /^bool ZPARSER::parse(const char *line, ZPARSER::ZIPA &pc, ZPARSER::ZIPI &instruction, const unsigned int lineno) {$/;" f class:ZPARSER +parse_op zparser.cpp /^bool ZPARSER::parse_op(const char *line, ZPARSER::ZIPA pc,$/;" f class:ZPARSER +rndbits twoc.cpp /^unsigned long rndbits(const long val, const int bits_in, const int bits_out) {$/;" f +s_cf zopcodes.h /^ int s_result, s_ra, s_rb, s_i, s_cf;$/;" m struct:__anon1 +s_i zopcodes.h /^ int s_result, s_ra, s_rb, s_i, s_cf;$/;" m struct:__anon1 +s_mask zopcodes.h /^ ZIPI s_mask, s_val;$/;" m struct:__anon1 +s_opstr zopcodes.h /^ char s_opstr[8];$/;" m struct:__anon1 +s_ra zopcodes.h /^ int s_result, s_ra, s_rb, s_i, s_cf;$/;" m struct:__anon1 +s_rb zopcodes.h /^ int s_result, s_ra, s_rb, s_i, s_cf;$/;" m struct:__anon1 +s_result zopcodes.h /^ int s_result, s_ra, s_rb, s_i, s_cf;$/;" m struct:__anon1 +s_val zopcodes.h /^ ZIPI s_mask, s_val;$/;" m struct:__anon1 +sbits twoc.cpp /^long sbits(const long val, const int bits) {$/;" f +sfits twoc.cpp /^bool sfits(const long val, const int bits) {$/;" f +ubits twoc.cpp /^unsigned long ubits(const long val, const int bits) {$/;" f +zipi_to_string zopcodes.cpp /^void zipi_to_string(const ZIPI ins, char *line) {$/;" f +zop_ccstr zopcodes.cpp /^const char *zop_ccstr[] = {$/;" v +zop_regstr zopcodes.cpp /^const char *zop_regstr[] = {$/;" v +zoplist zopcodes.cpp /^const ZOPCODE zoplist[] = {$/;" v

powered by: WebSVN 2.1.0

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