Commit 46a712c9 authored by Grzegorz Daniluk's avatar Grzegorz Daniluk

docs/specs/HDL: copy hdlspecs from old svn repo

parent fb415263
/*
-------------------------------------------------------------------------------
-- Title : Routing Table Unit Software Simulation
-- Project : White Rabbit Switch
-------------------------------------------------------------------------------
-- File : rtu_sim.c
-- Authors : Tomasz Wlostowski
-- Company : CERN BE-CO-HT
-- Created : 2010-04-27
-- Last update: 2010-06-30
-- Description: - functions necessary to fill in tables representing H/W memories
-- - simulation engine
--
--
-- Revisions :
-- Date Version Author Description
-- 2010-04-27 1.0 twlostow Created
-- 2010-06-30 1.1 Maciej Lipinski changes to algorithm, functions to input
data to data structures
*/
#include <stdio.h>
#include "rtu_sim.h"
#include "rtu_test_main.h"
int rtu_sim_read_hcam_entry( uint16_t i)
{
int hcam_active_bank = (CFG.cam_bank == 0 ? 1 : 0);
printf("sim_hcam[bank = %d][addr = 0x%x]: mac: 0x%2x%2x%2x%2x%2x%2x , fid: 0x%x\n",hcam_active_bank , i,rtu_cam[hcam_active_bank][i].mac[0],rtu_cam[hcam_active_bank][i].mac[1],rtu_cam[hcam_active_bank][i].mac[2],rtu_cam[hcam_active_bank][i].mac[3],rtu_cam[hcam_active_bank][i].mac[4],rtu_cam[hcam_active_bank][i].mac[5],rtu_cam[hcam_active_bank][i].fid) ;
}
/*
set active ZBT bank (0 or 1)
*/
int rtu_sim_set_active_htab_bank(uint8_t bank)
{
if(bank != 0 && bank != 1)
return -1;
CFG.rtu_bank = bank;
return 1;
}
/*
set active CAM bank (0 or 1)
*/
int rtu_sim_set_active_hcam_bank(uint8_t bank)
{
if(bank != 0 && bank != 1)
return -1;
CFG.cam_bank = bank;
return 1;
}
/*
setting:
# FIX_PRIO [read/write]: Fix priority
1: Port has fixed priority of value PRIO_VAL. It overrides the priority coming from the endpoint
0: Use priority from the endpoint
# PRIO_VAL [read/write]: Priority value
Fixed priority value for the port. Used instead the endpoint-assigned priority when FIX_PRIO = 1
*/
int rtu_sim_set_fixed_prio_on_port(int port, uint8_t prio, uint8_t set)
{
if(set)
{
CFG.port_cfg[port].fixed_prio_ena = 1;
CFG.port_cfg[port].fixed_prio_val = prio;
}
else
{
CFG.port_cfg[port].fixed_prio_ena = 0;
CFG.port_cfg[port].fixed_prio_val = 0;
}
}
/*
Set basic RTU configuration
* HT_BSEL [read/write]: Main table bank select
Selects active bank of RTU hashtable (ZBT).
0: bank 0 is used by lookup engine and bank 1 can be accessed using MFIFO
1: bank 1 is used by lookup engine and bank 0 can be accessed using MFIFO
* HCAM_BSEL [read/write]: Hash collision table (HCAM) bank select
Selects active bank of RTU extra memory for colliding hashes.
0: bank 0 is used by lookup engine
1: bank 1 is used by lookup engine
* G_ENA [read/write]: RTU Global Enable
Global RTU enable bit. Overrides all port settings.
0: RTU is disabled. All packets are dropped.
1: RTU is enabled.
*/
int rtu_sim_rtu_setting(uint8_t global_enable,uint8_t hcam_bank,uint8_t htab_bank, uint32_t hash_poly)
{
CFG.global_enable = global_enable;
CFG.cam_bank = (int) hcam_bank;
CFG.rtu_bank = (int) htab_bank;
CFG.hash_poly = hash_poly;
}
int rtu_sim_set_hash_poly(uint32_t hash_poly)
{
CFG.hash_poly = hash_poly;
}
/*
Set basic RTU configuration
for a given port, possible settings:
* LEARN_EN [read/write]: Learning enable
1: enables learning process on this port. Unrecognized requests will be put into UFIFO
0: disables learning. Unrecognized requests will be either broadcast or dropped.
* PASS_ALL [read/write]: Pass all packets
1: all packets are passed (depending on the rules in RT table).
0: all packets are dropped on this port.
* PASS_BPDU [read/write]: Pass BPDUs
1: BPDU packets (with dst MAC 01:80:c2:00:00:00) are passed according to RT rules. This setting overrides PASS_ALL.
0: BPDU packets are dropped.
* FIX_PRIO [read/write]: Fix priority
1: Port has fixed priority of value PRIO_VAL. It overrides the priority coming from the endpoint
0: Use priority from the endpoint
* PRIO_VAL [read/write]: Priority value
Fixed priority value for the port. Used instead the endpoint-assigned priority when FIX_PRIO = 1
* B_UNREC [read/write]: Unrecognized request behaviour
Sets the port behaviour for all unrecognized requests:
0: packet is dropped
1: packet is broadcast
*/
int rtu_sim_rtu_port_setting(int port, uint32_t settings)
{
if(settings & FPGA_RTU_PCR_LEARN_EN)
CFG.port_cfg[port].learning_enabled = 1;
else
CFG.port_cfg[port].learning_enabled = 0;
if(settings & FPGA_RTU_PCR_PASS_ALL)
CFG.port_cfg[port].pass_all = 1;
else
CFG.port_cfg[port].pass_all = 0;
if(settings & FPGA_RTU_PCR_PASS_BPDU)
CFG.port_cfg[port].forward_bpdu_only = 1;
else
CFG.port_cfg[port].forward_bpdu_only = 0;
if(settings & FPGA_RTU_PCR_B_UNREC)
CFG.port_cfg[port].b_unrec = 1;
else
CFG.port_cfg[port].b_unrec = 0;
if(settings & FPGA_RTU_PCR_FIX_PRIO)
{
CFG.port_cfg[port].fixed_prio_ena = 1;
CFG.port_cfg[port].fixed_prio_val = 0x7 & (settings >> 4);
}
else
{
CFG.port_cfg[port].fixed_prio_ena = 0;
CFG.port_cfg[port].fixed_prio_val = 0;
}
return 1;
}
/*
basic settings
*/
int rtu_sim_set()
{
// enable learning on all ports
int i;
for(i=0;i<RTU_NUM_PORTS;i++)
{
CFG.port_cfg[i].learning_enabled = 1;
CFG.port_cfg[i].forward_bpdu_only = 0;
}
CFG.cam_bank = 0;
CFG.rtu_bank = 0;
return 1;
}
int rtu_sim_read_global_setting()
{
int i;
printf("Reading RTU Global setting:\n");
if( CFG.global_enable)
printf("RTU enabled; ");
else
printf("RTU disabled; ");
if(CFG.cam_bank)
printf("hcam_bank = 1; ");
else
printf("hcam_bank = 0; ");
if(CFG.rtu_bank)
printf("htab_bank = 1; ");
else
printf("htab_bank = 0; ");
printf("poly= 0x%x\n",CFG.hash_poly);
}
/*
Writes entry to a table representing zbt sram in software.
*/
int rtu_sim_write_htab_entry(int valid, int end_of_bucket, int is_bpdu, int go_to_cam , \
uint8_t fid, uint16_t mac_hi, uint32_t mac_lo, \
uint8_t cam_addr, int drop_when_source, int drop_when_dest, int drop_when_unmatched_src_ports, \
uint8_t prio_src, uint8_t has_prio_src, uint8_t prio_override_src, \
uint8_t prio_dst, int has_prio_dst, int prio_override_dst, \
uint16_t port_mask_src, uint16_t port_mask_dst, uint32_t last_access , uint32_t zbt_addr /*, int bank */, int bucket)
{
int addr = zbt_addr >> 5;
int bank;
if(CFG.rtu_bank == 1 ) bank = 0;
else if(CFG.rtu_bank == 0 ) bank = 1;
else {printf("ERROR\n"); return -1;}
#ifdef ML_DBG
printf("writing data to zbt: bank = %d, htab_addr = 0x%3x [zbt_addr = 0x%3x], bucket = %d\n", bank,addr,zbt_addr,bucket);
#endif
rtu_tab[bank].buckets[addr][bucket].valid = valid;
rtu_tab[bank].buckets[addr][bucket].end_of_bucket = end_of_bucket;
rtu_tab[bank].buckets[addr][bucket].is_bpdu = is_bpdu;
rtu_tab[bank].buckets[addr][bucket].mac[0] = (mac_hi >> 8);
rtu_tab[bank].buckets[addr][bucket].mac[1] = (0xFF & mac_hi);
rtu_tab[bank].buckets[addr][bucket].mac[2] = (0xFF & (mac_lo >> 24));
rtu_tab[bank].buckets[addr][bucket].mac[3] = (0xFF & (mac_lo >> 16));
rtu_tab[bank].buckets[addr][bucket].mac[4] = (0xFF & (mac_lo >> 8));
rtu_tab[bank].buckets[addr][bucket].mac[5] = (0xFF & mac_lo) ;
rtu_tab[bank].buckets[addr][bucket].fid = fid;
rtu_tab[bank].buckets[addr][bucket].port_mask_src = port_mask_src;
rtu_tab[bank].buckets[addr][bucket].port_mask_dst = port_mask_dst;
rtu_tab[bank].buckets[addr][bucket].drop_when_source = drop_when_source;
rtu_tab[bank].buckets[addr][bucket].drop_when_dest = drop_when_dest;
rtu_tab[bank].buckets[addr][bucket].drop_unmatched_src_ports = drop_when_unmatched_src_ports;
rtu_tab[bank].buckets[addr][bucket].last_access_t = last_access;
rtu_tab[bank].buckets[addr][bucket].prio_src = prio_src;
rtu_tab[bank].buckets[addr][bucket].has_prio_src = has_prio_src;
rtu_tab[bank].buckets[addr][bucket].prio_override_src = prio_override_src;
rtu_tab[bank].buckets[addr][bucket].prio_dst = prio_dst;
rtu_tab[bank].buckets[addr][bucket].has_prio_dst = has_prio_dst;
rtu_tab[bank].buckets[addr][bucket].prio_override_dst = prio_override_dst;
rtu_tab[bank].buckets[addr][bucket].go_to_cam = go_to_cam;
rtu_tab[bank].buckets[addr][bucket].cam_addr = cam_addr;
return 1;
}
/*
Writes entry to a table representing hcam in software.
*/
int rtu_sim_write_hcam_entry(int valid, int end_of_bucket, int is_bpdu, int go_to_cam , \
uint8_t fid, uint16_t mac_hi, uint32_t mac_lo, \
uint8_t cam_addr, int drop_when_source, int drop_when_dest, int drop_when_unmatched_src_ports, \
uint8_t prio_src, uint8_t has_prio_src, uint8_t prio_override_src, \
uint8_t prio_dst, int has_prio_dst, int prio_override_dst, \
uint16_t port_mask_src, uint16_t port_mask_dst, uint32_t last_access , uint16_t hcam_addr /*, int bank */)
{
int addr = hcam_addr/8;
int bank;
if(CFG.cam_bank == 1 ) bank = 0;
else if(CFG.cam_bank == 0 ) bank = 1;
else {printf("ERROR\n"); return -1;}
#ifdef ML_DBG
printf("writing data to cam: bank = %d, entry number = %d [hcam_addr = 0x%x]\n", bank,addr,hcam_addr);
#endif
rtu_cam[bank][addr].valid = valid;
rtu_cam[bank][addr].end_of_bucket = end_of_bucket;
rtu_cam[bank][addr].is_bpdu = is_bpdu;
rtu_cam[bank][addr].mac[0] = (mac_hi >> 8);
rtu_cam[bank][addr].mac[1] = (0xFF & mac_hi);
rtu_cam[bank][addr].mac[2] = (0xFF & (mac_lo >> 24));
rtu_cam[bank][addr].mac[3] = (0xFF & (mac_lo >> 16));
rtu_cam[bank][addr].mac[4] = (0xFF & (mac_lo >> 8));
rtu_cam[bank][addr].mac[5] = (0xFF & mac_lo) ;
rtu_cam[bank][addr].fid = fid;
rtu_cam[bank][addr].port_mask_src = port_mask_src;
rtu_cam[bank][addr].port_mask_dst = port_mask_dst;
rtu_cam[bank][addr].drop_when_source = drop_when_source;
rtu_cam[bank][addr].drop_when_dest = drop_when_dest;
rtu_cam[bank][addr].drop_unmatched_src_ports = drop_when_unmatched_src_ports;
rtu_cam[bank][addr].last_access_t = last_access;
rtu_cam[bank][addr].prio_src = prio_src;
rtu_cam[bank][addr].has_prio_src = has_prio_src;
rtu_cam[bank][addr].prio_override_src = prio_override_src;
rtu_cam[bank][addr].prio_dst = prio_dst;
rtu_cam[bank][addr].has_prio_dst = has_prio_dst;
rtu_cam[bank][addr].prio_override_dst = prio_override_dst;
rtu_cam[bank][addr].go_to_cam = go_to_cam;
rtu_cam[bank][addr].cam_addr = cam_addr;
return 1;
}
/*
Writes entry to a table representing vlan in software.
*/
int rtu_sim_write_vlan_entry(int addr, uint32_t port_mask,uint8_t fid,uint8_t prio,int has_prio,int prio_override,int drop)
{
#ifdef ML_DBG
printf("writing data to vlan: addr = 0x%x]\n", addr);
#endif
vlan_tab[addr].port_mask = port_mask;
vlan_tab[addr].fid = fid;
vlan_tab[addr].prio = prio;
vlan_tab[addr].has_prio = has_prio;
vlan_tab[addr].prio_override = prio_override;
vlan_tab[addr].drop = drop;
return 1;
}
int rtu_sim_read_arg_htab_changes(changed_aging_htab_word_t sim_agr_htab[])
{
int i;
int sim_cnt;
uint32_t tmp;
// remembering changed words from agr_htab memory in simulation
sim_cnt=0;
for(i=0;i<256;i++)
{
if(rtu_agr_htab[i] != 0x00000000)
{
//fprintf(stderr, "agr_htab[0x%x] = 0x%8x\n",i,rtu_agr_htab[i]);
sim_agr_htab[sim_cnt].address = i;
sim_agr_htab[sim_cnt].word = rtu_agr_htab[i];
sim_cnt++;
}
}
return sim_cnt;
}
//////////////////////////////////// cleaning mems ////////////////////////////////////
/*
Cleans tables repesenting H/W memories (zbt sram, vlan, hcam,
*/
int rtu_sim_clean_mems()
{
int i, j;
for(i=0;i<RTU_ENTRIES/RTU_BUCKETS;i++)
for(j=0;j<RTU_BUCKETS;j++)
{
rtu_tab[0].buckets[i][j].valid = 0;
rtu_tab[0].buckets[i][j].end_of_bucket = 0;
rtu_tab[0].buckets[i][j].is_bpdu = 0;
rtu_tab[0].buckets[i][j].mac[0] = 0;
rtu_tab[0].buckets[i][j].mac[1] = 0;
rtu_tab[0].buckets[i][j].mac[2] = 0;
rtu_tab[0].buckets[i][j].mac[3] = 0;
rtu_tab[0].buckets[i][j].mac[4] = 0;
rtu_tab[0].buckets[i][j].mac[5] = 0;
rtu_tab[0].buckets[i][j].fid = 0;
rtu_tab[0].buckets[i][j].port_mask_src = 0;
rtu_tab[0].buckets[i][j].port_mask_dst = 0;
rtu_tab[0].buckets[i][j].drop_when_source = 0;
rtu_tab[0].buckets[i][j].drop_when_dest = 0;
rtu_tab[0].buckets[i][j].drop_unmatched_src_ports = 0;
rtu_tab[0].buckets[i][j].last_access_t = 0;
rtu_tab[0].buckets[i][j].prio_src = 0;
rtu_tab[0].buckets[i][j].has_prio_src = 0;
rtu_tab[0].buckets[i][j].prio_override_src = 0;
rtu_tab[0].buckets[i][j].prio_dst = 0;
rtu_tab[0].buckets[i][j].has_prio_dst = 0;
rtu_tab[0].buckets[i][j].prio_override_dst = 0;
rtu_tab[0].buckets[i][j].go_to_cam = 0;
rtu_tab[0].buckets[i][j].cam_addr = 0 ;
rtu_tab[1].buckets[i][j].valid = 0;
rtu_tab[1].buckets[i][j].valid = 0;
rtu_tab[1].buckets[i][j].end_of_bucket = 0;
rtu_tab[1].buckets[i][j].is_bpdu = 0;
rtu_tab[1].buckets[i][j].mac[0] = 0;
rtu_tab[1].buckets[i][j].mac[1] = 0;
rtu_tab[1].buckets[i][j].mac[2] = 0;
rtu_tab[1].buckets[i][j].mac[3] = 0;
rtu_tab[1].buckets[i][j].mac[4] = 0;
rtu_tab[1].buckets[i][j].mac[5] = 0;
rtu_tab[1].buckets[i][j].fid = 0;
rtu_tab[1].buckets[i][j].port_mask_src = 0;
rtu_tab[1].buckets[i][j].port_mask_dst = 0;
rtu_tab[1].buckets[i][j].drop_when_source = 0;
rtu_tab[1].buckets[i][j].drop_when_dest = 0;
rtu_tab[1].buckets[i][j].drop_unmatched_src_ports = 0;
rtu_tab[1].buckets[i][j].last_access_t = 0;
rtu_tab[1].buckets[i][j].prio_src = 0;
rtu_tab[1].buckets[i][j].has_prio_src = 0;
rtu_tab[1].buckets[i][j].prio_override_src = 0;
rtu_tab[1].buckets[i][j].prio_dst = 0;
rtu_tab[1].buckets[i][j].has_prio_dst = 0;
rtu_tab[1].buckets[i][j].prio_override_dst = 0;
rtu_tab[1].buckets[i][j].go_to_cam = 0;
rtu_tab[1].buckets[i][j].cam_addr = 0;
//rtu_tab[1].buckets[i][j].valid = 0;
}
for(i=0;i<CAM_ENTRIES;i++)
{
// rtu_cam[0][i].valid = 0;
// rtu_cam[1][i].valid = 0;
rtu_cam[0][i].valid = 0;
rtu_cam[0][i].end_of_bucket = 0;
rtu_cam[0][i].is_bpdu = 0;
rtu_cam[0][i].mac[0] = 0;
rtu_cam[0][i].mac[1] = 0;
rtu_cam[0][i].mac[2] = 0;
rtu_cam[0][i].mac[3] = 0;
rtu_cam[0][i].mac[4] = 0;
rtu_cam[0][i].mac[5] = 0;
rtu_cam[0][i].fid = 0;
rtu_cam[0][i].port_mask_src = 0;
rtu_cam[0][i].port_mask_dst = 0;
rtu_cam[0][i].drop_when_source = 0;
rtu_cam[0][i].drop_when_dest = 0;
rtu_cam[0][i].drop_unmatched_src_ports = 0;
rtu_cam[0][i].last_access_t = 0;
rtu_cam[0][i].prio_src = 0;
rtu_cam[0][i].has_prio_src = 0;
rtu_cam[0][i].prio_override_src = 0;
rtu_cam[0][i].prio_dst = 0;
rtu_cam[0][i].has_prio_dst = 0;
rtu_cam[0][i].prio_override_dst = 0;
rtu_cam[0][i].go_to_cam = 0;
rtu_cam[0][i].cam_addr = 0 ;
rtu_cam[1][i].valid = 0;
rtu_cam[1][i].end_of_bucket = 0;
rtu_cam[1][i].is_bpdu = 0;
rtu_cam[1][i].mac[0] = 0;
rtu_cam[1][i].mac[1] = 0;
rtu_cam[1][i].mac[2] = 0;
rtu_cam[1][i].mac[3] = 0;
rtu_cam[1][i].mac[4] = 0;
rtu_cam[1][i].mac[5] = 0;
rtu_cam[1][i].fid = 0;
rtu_cam[1][i].port_mask_src = 0;
rtu_cam[1][i].port_mask_dst = 0;
rtu_cam[1][i].drop_when_source = 0;
rtu_cam[1][i].drop_when_dest = 0;
rtu_cam[1][i].drop_unmatched_src_ports = 0;
rtu_cam[1][i].last_access_t = 0;
rtu_cam[1][i].prio_src = 0;
rtu_cam[1][i].has_prio_src = 0;
rtu_cam[1][i].prio_override_src = 0;
rtu_cam[1][i].prio_dst = 0;
rtu_cam[1][i].has_prio_dst = 0;
rtu_cam[1][i].prio_override_dst = 0;
rtu_cam[1][i].go_to_cam = 0;
rtu_cam[1][i].cam_addr = 0 ;
}
learning_queue.head = 0;
learning_queue.tail = MAX_FIFO_SIZE-1;
learning_queue.count = 0;
// by default, VLANs are disabled
for(i=1;i<MAX_VLANS;i++)
{
vlan_tab[i].drop = 1;
}
// clean main aging memory
for(i=0;i< ARAM_WORDS; i++)
rtu_agr_htab[i]= 0x00000000;
//clean hcam aging reg
rtu_agr_hcam= 0x00000000;
return 1;
}
char * mac_2_string(mac_addr_t mac)
{
char str[80];
sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
return strdup(str);
}
int cmp_macs(mac_addr_t mac_1,mac_addr_t mac_2)
{
int i;
for (i=0;i<6;i++)
if(mac_1[i]!=mac_2[i]) return 0;
return 1;
}
/******************************************************************************/
/* FUNCTIONS BELOW CONTAIN THE RTU ALGORITHM TO BE IMPLEMENTED IN VHDL */
/******************************************************************************/
/* CHANGES TO THE ALGORITHM BY maciej.lipinski@cern.ch
- if message dropped, port_mask and prio are set to 0x0
- request is sent to learning queue only once during match,
initially, if the source entry was not found, the request was sent to
learning queue, subsequently if the destinatin entry was not found as well,
the (same) request was sent to learning queue again
*/
/******************************************************************************/
void add_to_learning_queue(rtu_request_t rq, int verbose)
{
if(verbose) printf("add_to_learning_queue: src=%s dst=%s vid=%d port=%d prio_has=%d prio=%d\n", mac_2_string(rq.src), mac_2_string(rq.dst), rq.has_vid?rq.vid:0, rq.port_id,rq.has_prio, rq.prio);
if(learning_queue.count == MAX_FIFO_SIZE) // Learning FIFO is full? - drop the request.
return;
learning_queue.count++;
learning_queue.head++;
if(learning_queue.head == MAX_FIFO_SIZE) learning_queue.head = 0;
learning_queue.data[learning_queue.head] = rq;
}
// hash function - use your invention here, it doesn't need to use CRC
// mac - mac address, fid = Filtering Database ID
uint16_t hash_function(mac_addr_t mac, uint8_t fid)
{
uint16_t ret_hash ;
uint16_t mac_hi = (uint16_t)((mac[0] << 8) | mac[1]);
uint32_t mac_lo = (mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5];
ret_hash = hash(mac_hi, mac_lo, fid);
/*
// needed to change here to my functions which is
// synchronized with VHDL CRC
hash = crc16(hash, (0xFFFF & vlan));
hash = crc16(hash, ((uint16_t)mac[0] << 8) | mac[1]);
hash = crc16(hash, ((uint16_t)mac[2] << 8) | mac[3]);
hash = crc16(hash, ((uint16_t)mac[4] << 8) | mac[5]);
*/
return ret_hash & 0xfff; //clip it to the MAC table size
}
int mac_table_lookup(mac_addr_t mac, uint8_t fid, mac_table_entry_t **found,int verbose)
{
// 1st step: calculate hash of MAC + FID pair
uint16_t hash = hash_function(mac, fid);
mac_table_entry_t *ent;
int i;
char str[80];
sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
if(verbose) printf("hash [fid=0x%x mac=%s] = 0x%x bank = %d\n",fid, str, hash,CFG.rtu_bank);
// get the entry with matching hash in MAC table
ent = rtu_tab[CFG.rtu_bank].buckets[hash];
// 2nd step: scan the bucket array for matching MAC+FID pair
for(i =0; i<RTU_BUCKETS && ent->valid;i++,ent++)
{
//printf("\tlooking for: mac=%s fid=0x%x ,have: mac=%02x:%02x:%02x:%02x:%02x:%02x fid=0x%x [addr=0x%x], bucket = %d\n\n",str,fid,ent->mac[0], ent->mac[1], ent->mac[2], ent->mac[3], ent->mac[4], ent->mac[5],ent->fid,hash,i);
//if(ent->mac == mac && ent->fid == fid) // found matching rule in the current bucket?
if(cmp_macs(ent->mac, mac)==1 && ent->fid == fid) // found matching rule in the current bucket?
{
#ifdef ML_DBG
printf("\t----------------------\n");
printf("\nBINGO,entry found in htab for addr=0x%x, bucket = %d\n\n",hash,i);
printf("\trtu_agr_htab[0x%x] = 0x%8x\n",(hash >> 3),0x1 << (((0x7 & hash) << 2) | (0x3 & i)));
printf("\t----------------------\n");
#endif
if(verbose) printf("> found in htab, bucket=%d <\n",i);
number_of_found_entries++;
//added by ML
if(verbose) printf("\n\nbefore: 0x%x , hash=0x%x, i=%i\n",rtu_agr_htab[(hash >> 3)],hash,i);
//if(verbose) printf("\n\nrtu_agr_htab[(hash >> 3)]= ( 0x1 << (((0x7 & hash) << 2) | (0x00000003 & (unsigned int)i) )) | rtu_agr_htab[(hash >> 3)] \n");
//if(verbose) printf("\n\n 0x%8x = 1 << (0x%8x | 0x%8x ) | 0x%8x \n", \
( 0x1 << (((0x7 & hash) << 2) | (0x00000003 & (unsigned int)i)) ) | rtu_agr_htab[(hash >> 3)], \
0x1 << ((0x7 & hash) << 2) , \
(0x00000003 & (unsigned int)i) , \
rtu_agr_htab[(hash >> 3)]);
rtu_agr_htab[(hash >> 3)]= ( 0x1 << (((0x7 & hash) << 2) | (0x00000003 & (unsigned int)i)) ) | rtu_agr_htab[(hash >> 3)];
if(verbose) printf("after: 0x%x \n\n",rtu_agr_htab[(hash >> 3)]);
/////
*found = ent;
return 1;
} else if (ent->go_to_cam) // the bucket is bigger than RTU_BUCKETS entries - go find the matching one in CAM memory.
{
// printf("go to cam, cam_addr: 0x%x \n",ent->cam_addr);
int j = ent->cam_addr; // cam_addr in the last entry in the bucket points to the location of the next rule in CAM memory
// 3rd step: traverse the CAM memory until we find a matching entry or reach end of the bucket
for(; j<CAM_ENTRIES /*ML: && !rtu_cam[CFG.cam_bank][j].end_of_bucket */; j++)
{
#ifdef ML_DBG
printf("[addr = 0x%x]looking in hcam foe: mac=%s fid=0x%x ,have: mac=%02x:%02x:%02x:%02x:%02x:%02x fid=0x%x [addr=0x%x],end=%d \n\n",j,str,fid,rtu_cam[CFG.cam_bank][j].mac[0], rtu_cam[CFG.cam_bank][j].mac[1], rtu_cam[CFG.cam_bank][j].mac[2], rtu_cam[CFG.cam_bank][j].mac[3], rtu_cam[CFG.cam_bank][j].mac[4], rtu_cam[CFG.cam_bank][j].mac[5],rtu_cam[CFG.cam_bank][j].fid,j,rtu_cam[CFG.cam_bank][j].end_of_bucket);
#endif
if( cmp_macs(rtu_cam[CFG.cam_bank][j].mac, mac) == 1 && rtu_cam[CFG.cam_bank][j].fid == fid)
{
#ifdef ML_DBG
printf("\t----------------------\n");
printf("\nBINGO,entry foundin hcam for addr=0x%x, bucket = %d\n\n",hash,j);
printf("\trtu_agr_hcam] = 0x%8x\n",(0x1 << j));
printf("\t----------------------\n");
#endif
if(verbose) printf("> found in hcam <\n");
number_of_found_entries++;
*found = &rtu_cam[CFG.cam_bank][j]; // found matching entry in CAM
if(verbose) printf("\n\nbefore: 0x%x , hash=0x%x, i=%i\n",rtu_agr_hcam,hash,i);
rtu_agr_hcam = (0x1 << j) | rtu_agr_hcam;
if(verbose) printf("after: 0x%x \n\n",rtu_agr_hcam);
return 1;
}
else if(rtu_cam[CFG.cam_bank][j].end_of_bucket == 1)
break; //end if the bucket, nothing found
}
}
}
// not found (neither in MAC table nor in CAM): return 0
return 0;
}
#define PRIO_SOURCE 0
#define PRIO_DESTINATION 1
#define PRIO_VID 2
#define PRIO_PORT 3
#define NOT_DEFINED -1
// main rtu function: decides what to do with packet "rq"
int rtu_sim_match(rtu_request_t rq, rtu_response_t *rsp, int verbose )
{
//added by ML:
int already_in_learning_queue = 0;
///////////
if(verbose) printf("rtu_match: src=%s dst=%s vid=0x%x port=%d port_prio=%d , has_prio = 0x%x, has_vid = 0x%x\n", mac_2_string(rq.src), mac_2_string(rq.dst), rq.has_vid?rq.vid:0, rq.port_id, rq.prio,rq.has_prio,rq.has_vid);
rsp->port_id = rq.port_id;
//added by ML
if(CFG.global_enable == 0)
{
if(verbose) printf("rtu_match: dropped (RTU disabled)\n");
rsp->drop = 1;
rsp->prio = 0;
rsp->port_mask = 0;
return 0;
}
//ML: pass_all is in general port_enable,
// port disabling by setting pass_all=0 can be overriden by setting forward_bpdu_only=1
// so, regardless of pass_all's value, forward_bpdu_only causes only bpdu packages to be
// passed through
if(CFG.port_cfg[rq.port_id].pass_all == 0 && CFG.port_cfg[rq.port_id].forward_bpdu_only == 0)
{
if(verbose) printf("rtu_match: dropped (port %d disabled)\n",rq.port_id);
rsp->drop = 1;
rsp->prio = 0;
rsp->port_mask = 0;
return 0;
}
/*
implementing it this way, results in the fact that the changed
priority is learned
*/
// check if packet has per-port assigned priority
if(CFG.port_cfg[rq.port_id].fixed_prio_ena)
{
rq.prio = CFG.port_cfg[rq.port_id].fixed_prio_val;
rq.has_prio = 0x1;
if(verbose) printf("setting to fixed prio(new data): has_prio = %d, prio = %d\n",CFG.port_cfg[rq.port_id].fixed_prio_ena, CFG.port_cfg[rq.port_id].fixed_prio_val);
}
/////////////
// helper tables for priority selection.
// priority from the most specific to least specific definitions (e.g, per tag -> per source MAC -> per destination MAC -> per VLAN )
int prio_lookup[4] = {NOT_DEFINED, NOT_DEFINED, NOT_DEFINED, NOT_DEFINED};
int prio_override[4] = {0,0,0,0};
vlan_table_entry_t vent;
//////////////////////////////////////////////////////////////////////////////
// 1st step: determine the VLAN table entry for the packet VID
//////////////////////////////////////////////////////////////////////////////
uint16_t vid = (rq.has_vid ? rq.vid : 0); // if the packet has the VLAN id, use it, otherwise - use VID for untagged packets (0)
vent = vlan_tab[vid];
if(vent.drop) // VLAN is illegal - drop the packet and return
{
if(verbose) printf("rtu_match: dropped (blocked VLAN)\n");
rsp->drop = 1;
//added by ML
rsp->prio = 0;
rsp->port_mask = 0;
/////////////
return 0;
}
if(vent.has_prio) // VLAN has defined priority - add it to priority selection table
{
prio_lookup[PRIO_VID] = vent.prio;
prio_override[PRIO_VID] = vent.prio_override;
}
////////////////////////////////////////////////
// 2nd step: find the source MAC in MAC table
/////////////////////////////////////////////////
mac_table_entry_t *entry_src;
uint32_t port_mask_src;
int drop_unmatched_src_ports;
if(mac_table_lookup(rq.src, vent.fid, &entry_src,verbose)) // lookup the source MAC address in the table
{ // found:
port_mask_src = entry_src->port_mask_src;
if(entry_src->drop_when_source) // source MAC address is blocked? - drop the packet
{
if(verbose) printf("rtu_match: dropped (blocked source MAC)\n");
//added by ML
rsp->prio = 0;
rsp->port_mask = 0;
/////////////
rsp->drop = 1;
return 0;
}
if(entry_src->has_prio_src) // check if the source MAC has predefined priority and eventually add it to the selection table
{
prio_lookup[PRIO_SOURCE] = entry_src->prio_src;
prio_override[PRIO_SOURCE] = entry_src->prio_override_src;;
}
drop_unmatched_src_ports = entry_src->drop_unmatched_src_ports;
} else { // source MAC not found: assume it can come from any port, put the entry into learning queue
port_mask_src = 0xffffffff;
drop_unmatched_src_ports = 0;
if(CFG.port_cfg[rq.port_id].learning_enabled && (already_in_learning_queue==0))
{
add_to_learning_queue(rq,verbose);
already_in_learning_queue = 1;
}
}
// check if the packet with given source MAC can come from this port.
if(! ((1<<rq.port_id) & port_mask_src))
{
if(drop_unmatched_src_ports) { // if the MAC address is locked to source port, drop the paket
if(verbose) printf("rtu_match: dropped (source MAC doesn't match source port)\n");
//added by ML
rsp->prio = 0;
rsp->port_mask = 0;
/////////////
rsp->drop =1;
return 0;
} else { // otherwise add it to the learning queue - perhaps device has been reconnected to another port and topology info needs to be updated
if(CFG.port_cfg[rq.port_id].learning_enabled && (already_in_learning_queue==0))
{
if(verbose) printf("\n-----------------------\n");
if(verbose) printf("we have problem here???\n");
if(verbose) printf("(1<<rq.port_id) = 0x%x\n",(1<<rq.port_id));
if(verbose) printf("port_mask_src = 0x%x\n",port_mask_src);
if(verbose) printf("-----------------------\n\n");
add_to_learning_queue(rq,verbose);
already_in_learning_queue = 1;
}
}
}
////////////////////////////////////////////////////
// 3rd step: find the destination MAC in MAC table
////////////////////////////////////////////////////
mac_table_entry_t *entry_dst = NULL;
uint32_t port_mask_dst;
int is_bpdu;
if(mac_table_lookup(rq.dst, vent.fid, &entry_dst,verbose)) // lookup the destination MAC address in the table
{ // found:
port_mask_dst = entry_dst->port_mask_dst;
if(entry_dst->drop_when_dest) // destination MAC address is blocked? - drop the packet
{
if(verbose) printf("rtu_match: dropped (blocked destination MAC)\n");
//added by ML
rsp->prio = 0;
rsp->port_mask = 0;
/////////////
rsp->drop = 1;
return 0;
}
// if(entry_src->has_prio_dst) // check if the destination MAC has predefined priority and eventually add it to the selection table
//////////////
//ML: bug detected??
//////////////////
if(entry_dst->has_prio_dst) // check if the destination MAC has predefined priority and eventually add it to the selection table
{
prio_lookup[PRIO_DESTINATION] = entry_dst->prio_dst;
prio_override[PRIO_DESTINATION] = entry_dst->prio_override_dst;
}
is_bpdu = entry_dst->is_bpdu;
}
else { // destination MAC not found: broadcast the packet, put the entry into learning queue
if(CFG.port_cfg[rq.port_id].learning_enabled && (already_in_learning_queue==0))
{
add_to_learning_queue(rq,verbose);
already_in_learning_queue = 1;
}
if(CFG.port_cfg[rq.port_id].b_unrec == 0) // unrecongized request behaviour: drop packages
{
if(verbose) printf("rtu_match: dropped (urecognized packages dropped)\n");
rsp->prio = 0;
rsp->port_mask = 0;
/////////////
rsp->drop = 1;
return 0;
}
else
port_mask_dst = 0xffffffff;
is_bpdu = 0; // BPDU addresses are always registered in MAC table
}
////////////////////////////////////////////
// 4th step: make the final routing decision:
////////////////////////////////////////////
if(CFG.port_cfg[rq.port_id].forward_bpdu_only == 1 && !is_bpdu) // STP port blocked or learning
{
if(verbose) printf("rtu_match: dropped (non-BPDU packet on STP BLOCKED/LEARNING port)\n");
//added by ML
rsp->prio = 0;
rsp->port_mask = 0;
/////////////
rsp->drop = 1;
return 0;
}
rsp->port_mask = vent.port_mask & port_mask_dst; // generate the final port mask by anding the MAC-assigned destination ports with ports
// registered in current VLAN
//ML: why we don't do here like in case of prio src/dst??
// I mean: set prio_override only if has_prio=true
if(rq.has_prio)
prio_lookup[PRIO_PORT] = rq.prio;
// evaluate the final priority of the packet
rsp->prio = 0;
rsp->drop = 0;
int found = 0;
int i;
for(i=0; i<4; i++) // check for overriding priorities
if(prio_override[i])
{
rsp->prio = prio_lookup[i];
found = 1;
break;
}
if(!found)
{
for(i=0;i<4;i++)
if(prio_lookup[i] >= 0)
{
rsp->prio = prio_lookup[i];
break;
}
}
if(verbose) printf("rsp->port_mask[0x%x] = vent.port_mask[0x%x] & port_mask_dst[0x%x]\n", rsp->port_mask,vent.port_mask , port_mask_dst);
if(verbose) printf("port_mask_src = 0x%x\n", port_mask_src);
#ifdef DEBUG_SIMULATION
printf("prio_override[PRIO_SOURCE ] = 0x%x prio_lookup[PRIO_SOURCE ] = 0x%x\n",prio_override[0], prio_lookup[0]);
printf("prio_override[PRIO_DESTINATION] = 0x%x prio_lookup[PRIO_DESTINATION] = 0x%x\n",prio_override[1], prio_lookup[1]);
printf("prio_override[PRIO_VID ] = 0x%x prio_lookup[PRIO_VID ] = 0x%x\n",prio_override[2], prio_lookup[2]);
printf("prio_override[PRIO_PORT ] = 0x%x prio_lookup[PRIO_PORT ] = 0x%x\n",prio_override[3], prio_lookup[3]);
#endif
if(verbose) printf("rtu_match: accepted (portmask 0x%08x, priority: %d)\n", rsp->port_mask, rsp->prio);
return 0;
}
void set_mac(mac_addr_t mac, uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f)
{
mac[0]=a;
mac[1]=b;
mac[2]=c;
mac[3]=d;
mac[4]=e;
mac[5]=f;
}
/*
-------------------------------------------------------------------------------
-- Title : RTU spec
-- Project : White Rabbit Switch
-------------------------------------------------------------------------------
-- File : wrsw_rtu_spec.txt
-- Authors : Maciej Lipinski (maciej.lipinski@cern.ch)
-- Company : CERN BE-CO-HT
-- Created : 2010-10-06
-- Last update: 2010-10-08
-- Description: This file contain RTU specification for developers
-- of components which need to communicate with RTU
-- (mainly software developers).
-------------------------------------------------------------------------------
*/
1. What does RTU do ?:
RTU takes packet source & destination MAC addresses, VLAN ID
and priority and decides where and with what final priority (after
evaluating the per MAC-assigned priorities, per-VLAN priorities,
per-port and per-packet) the packet shall be routed.
2. Hardware interface (inputs/outputs to/from other HDL components)
2.1 ZBT SRAM
The main hash table is stored in ZBT SRAM. The memory is organized
in the following way:
addr 0: bucket 0 consists of [entry 1] [entry 2] [entry 3] [entry 4]
addr 1: bucket 1 consists of [entry 1] [entry 2] [entry 3] [entry 4]
"entry" in the memory is called "MAC entry" in this doc.
Its layout is defined in data_layout_in_mems.odt.
There are four entries in one bucket. The address of a bucket is calculated
as a hash of MAC and FID. The hash is defined by a polynomial (see 3.1).
A MAC entity is 8 words (8x32 bits), 5 words of data and 3 empty words
(to make the addressing easier).
An address of MAC entry has the following structure:
16 bit - bank
15 - 5 bits - hash address
4 - 3 bits - (bucket) number of MAC entry in the bucket (0-4)
2 - 0 bits - zeros (this is the address inside MAC entry)
2.2 N-port input/output interface.
SEE: wrsw_rtu.vhd
2.2 WISHBONE
The communication with uProcessor is performed through Wishbone Interface.
The interface is defined in wrsw_rtu_wb.wb, described in wrsw_rtu_wb.html
and implemented in wrsw_rtu_wb.vhd & wrsw_rtu_wb.h files.
It is described in details (software-wise) in section 3.
3. Software interface (talking with uProcessor):
RTU communicates with uP using Wishbone interface (generated from
wrsw_rtu_wb.wb, described in details in wrsw_rtu_wb.html).
The wishbone bus enables communication between uP and RTU by a set
of registers, memories and FIFOs. For software developers, the header
can be also generated using wrsw_rtu_wb.wb
(see documentation/specifications/hdlspec/WRSW_RTU/wrsw_rtu_wb.h).
3.1 RTU Global Control registers
Settings concerning entire RTU can be specified using this reg. It includes
- turning on/off the RTU (G_ENA),
- setting active memory banks (HT_BSEL & HCAM_BSEL)
- specifying polynomial for hash calculation
The bank which is set to be active is accessed (read) by the RTU (HW).
The bank which is NOT set to be active (inactive bank) is accessed by
the software through wishbone. HT_BSEL defines active bank of Main
hastbable which is accessed from SW by writing to MFIFO_R0 & MFIFO_R1
registers (see 3.4). HCAM_BSEL defines active bank of Hash collision
memory (HCAM) which is accessed from S/W directly at address 0x4000
(see wrsw_rtu_wb.html).
3.2 Port Control Register xxx
For each port xxx such a control register is defined. See wrsw_rtu_wb.html
for details of the register's layout.
3.3 Unrecognized request FIFO (UFIFO)
It is a set of FIFOs (r0 - r4) which hold data of unrecognized
(not found in hash table) MAC entry (source & destination MAC,
priority, PID, VID, etc). It shall be used by S/W for learning process.
There is an interrupt associated with the UFIFO which informs uP that
the there is data to be read from UFIFO.
3.4 Main hash table
The main hash table is kept in ZBT SRAM. It is addressed by hash calculated
using polynomial defined in "RTU Global Control Register" (see 3.1).
uP has only write access to this memory. It should be written by the
learning algorithm.
The main hash table is only read by RTU and only written to by S/W
(through MFIFO).
Basic write access to hash table shall be done in the following way:
- write 1 to MFIFO_R0 (AD_SEL defines whether AD_VAL is address or data),
- write address (to which data should be written) to MFIFO_R1,
- write 0 to MFIFO_R0 (AD_SEL defines whether AD_VAL is address or data),
- write data to MFIFO_R1 (minimum one MAC entry, so 5 words,
a bunch of data is considered for write to SRAM
only if the number of data words is greater or equal to
c_wrsw_entry_words_number (5), which is a parameter in:
/home/maciejl/wrdev_v3/hdl/common/global_defs.vhd).
The consecutive writes to MFIFO_R1 (AD_SEL = 0) are written to consecutive
SRAM memory addresses (atomic write) as long as one of the following
conditions is met:
- MFIFO is empty (all data written to MFIFO_R1 have been written to SRAM),
- next address is written to MFIFO_R1 (AD_SEL = 1); in such case,
an atomic write to SRAM is finished. and the next address is written
with the provided data in the successive atomic write.
The layout of the MAC entry is defined in data_layout_in_mems.odt.
The MAC entry fields are described in rtu_sim.c file.
If two consecutive MAC entries are to be written to SRAM,
they can be written with one atomic write operation
(e.g.: when writing new MAC entry to the same bucket, so the end_of_bucket
field needs to be updated in the previous MAC entry):
MAC entry address \
MAC entry data / atomic write
3 empty words /
MAC entry data /
Otherwise, write one MAC entry at a time, so :
MAC entry address \
MAC entry data / atomic write
MAC entry address \
MAC entry data / atomic write
[...]
The address supplied shall have the following layout
(defined also in data_layout_in_mems.odt) :
15 - 5 bits - hash address
4 - 3 bits - (bucket) number of MAC entry in the bucket (0-4)
2 - 0 bits - zeros (this is the address inside entry)
The data written by S/W is written to the inactive bank. It is not
used by RTU until the active bank is switched (see 3.1).
----------------------------------------------------------------------------
IMPORTANT: An exact mirror of SRAM memory needs to be kept in local memory.
This is because it is not possible to read ZBT SRAM from uP.
There is only write access from uP to ZBT SRAM through MFIFO.
----------------------------------------------------------------------------
S/W should know, by checking against local copy of Main hash table,
to which entry in given bucket, a MAC entry
should be written, and if there is free place in a give bucket.
3.5 Hash collisions memory (HCAM)
It is accessed directly (address = 0x4000), write and read.
MAC entry data layout provided in data_layout_in_mems.odt applies.
The address supplied shall have the following layout
(also in data_layout_in_mems.ods) :
8 bit - bank - is ignored, it is defined by HCAM_BSEL (see 3.1)
7 - 3 bits - HCAM address
2 - 0 bits - MAC entry word address
The data written to HCAM is written by RTU to the inactive bank. It is not
used by RTU until the active bank is switched (see 3.1).
Read access is also to inactive bank; therefore,
it is advised to keep mirror of HCAM in the local memory.
3.6 Aging bitmap for main hash table.
Aging memory is common for both banks ( and it is not cleared when
the banks are switched, it is clear-on-read). '1' indicates that the
"MAC entry" at the corresponding hash address in main hash table has
been accessed (matched).
Software should read the Aging bitmap periodically to check which MAC
entries are accessed, which shall enable implementation of aging
(deletion of MAC entries representing devices removed from the
network).
3.6 Aging register for HCAM
Each bit corresponds to one MAC entry in HCAM memory.
The same rules as in 3.6 apply.
3.7 VLAN table
Each word of VLAN table (32 bits) represents one VLAN entry
(no bank switching implemented). The layout of VLAN entry is defined
in data_layout_in_mems.ods
3.8 IRQ
There is only one interrupt generated by RTU. This is an interrupt
associated with the UFIFO.
There are four registers associated with interrupts in WB interface:
- rtu_eic_idr : interrupt disable
- rtu_eic_ier : interrupt enable
- rtu_eic_imr : interrupt mask
- rtu_eic_isr : interrupt status register
It is described in details in wrsw_rtu_wb.html file.
In general, all the interrupts inputted to WB interface
(by H/W) are multiplexed into one interrupt signal (see: wb_irq_o).
When the uP receives it, it needs to read 'rtu_eic_isr' register
to check which irq it was.
The interrupt associated with UFIFO does not required to be cleaned
(i.e. by writing rtu_eic_isr). This is because the interrupt is
triggered by the level of UFIFO empty signal. Once UFIFO is read out,
the interrupt is cleaned automatically.
For example S/W implementation of the interrupts (generated by WB)
handling, please see the code:
trunk/software/drivers/wr_vic/wr_vic.c
4 HASH address
Below table gives the kinds of hashes which are implemented by RTU
and their hex representation of polynomial (to be supplied to RTU
Global Control registers, see 3.1).
-----------------------------------------------------------
--| name | polly equation | polly (hex) |
-----------------------------------------------------------
--| CRC-16-CCITT | 1+x^5+x^12+x^16 | 0x1021 |
--| CRC-16-IBM | 1+x^2+x^15+x^16 | 0x8005 |
--| CRC-16-DECT | 1+x^3+x^7+x^8+x^10+x^16 | 0x0589 |
-----------------------------------------------------------
Please, refer an example S/W implementation of these hashes in the file:
/home/maciejl/wrdev_v3/software/tests/test_rtu/rtu_common.c
If you want to implement the calculation in a more efficient way,
please make sure you've got the same result as the example implementations
(which were tested against RTU H/W implementation).
5 RTU algorithm
The exact lookup algorithm is described in rtu_sim.c file. This algorithm
was used to simulate and test RTU.
--------------------------------------------------------------------------
AUXILIARY:
--------------------------------------------------------------------------
0) Wishbone interface generator:
The project is detailed here: http://www.ohwr.org/projects/wishbone-gen.
In short, the *.wb file enables to generate:
- vhdl/verilog source,
- C header
- html description of the interface
For RTU, the .wb file, html info and C header can be found here:
documentation/specifications/hdlspec/WRSW_RTU/ .
The vhd file is in RTU sources: hdl/modules/wrsw_rtu/wrsw_rtu_wb.vhd.
1) RTU spec files (documentation/specifications/hdlspec/WRSW_RTU)
wrsw_rtu_spec.txt -------- this file.
data_layout_in_mems.ods -- here is defined the layout of RTU memories:
MAC entry, VLAN entry
rtu_sim.c ---------------- software simulation of the hardware algorithm,
based on this file hardware algorithm
was implemented (much easier to read for S/W
people than HDL code :). It is used in RTU test
application. There outcome of this simulation
is compared with the outcome of HW implementation
when the test application is run.
wrsw_rtu_wb.wb ----------- Wishbone file, defines RTU's wishbone interface,
based on it, the below files are generated
(and wrsw_rtu_wb.vhd found in RTU sources) :
wrsw_rtu_wb.h ------------ header with S/W addresses
wrsw_rtu_wb.html --------- describes the RTU's Wishbone interface in
user-friendly way (LOOK HERE)
2) RTU test application (/software/tests/test_rtu/):
-------------------------- application written in C, it compares outcome
of the hardware matching and software simulation.
rtu_test_main.c ---------- detailed description of how the test app. works
can be found here
rtu_hw.c ----------------- the interface with hardware is implemented here
rtu_sim.c ---------------- software simulation of the hardware algorithm,
based on this file hardware algorithm was
implemented (much easier to read for S/W people
than HDL code :). The outcome of this simulation
is compared with the outcome of HW implementation
when the test application is run
3) Example code:
- IRQ handling ------------ here: trunk/software/drivers/wr_vic/wr_vic.c
\ No newline at end of file
/*
Register definitions for slave core: Routing Table Unit (RTU)
* File : wrsw_rtu_wb.h
* Author : auto-generated by wbgen2 from wrsw_rtu_wb.wb
* Created : Wed Oct 6 11:42:20 2010
* Standard : ANSI C
THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE wrsw_rtu_wb.wb
DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
*/
#ifndef __WBGEN2_REGDEFS_WRSW_RTU_WB_WB
#define __WBGEN2_REGDEFS_WRSW_RTU_WB_WB
#include <inttypes.h>
#if defined( __GNUC__)
#define PACKED __attribute__ ((packed))
#else
#error "Unsupported compiler?"
#endif
#ifndef __WBGEN2_MACROS_DEFINED__
#define __WBGEN2_MACROS_DEFINED__
#define WBGEN2_GEN_MASK(offset, size) (((1<<(size))-1) << (offset))
#define WBGEN2_GEN_WRITE(value, offset, size) (((value) & ((1<<(size))-1)) << (offset))
#define WBGEN2_GEN_READ(reg, offset, size) (((reg) >> (offset)) & ((1<<(size))-1))
#define WBGEN2_SIGN_EXTEND(value, bits) (((value) & (1<<bits) ? ~((1<<(bits))-1): 0 ) | (value))
#endif
/* definitions for register: RTU Global Control Register */
/* definitions for field: Main table bank select in reg: RTU Global Control Register */
#define RTU_GCR_HT_BSEL WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Hash collision table (HCAM) bank select in reg: RTU Global Control Register */
#define RTU_GCR_HCAM_BSEL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: RTU Global Enable in reg: RTU Global Control Register */
#define RTU_GCR_G_ENA WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Hash Poly in reg: RTU Global Control Register */
#define RTU_GCR_POLY_VAL_MASK WBGEN2_GEN_MASK(8, 16)
#define RTU_GCR_POLY_VAL_SHIFT 8
#define RTU_GCR_POLY_VAL_W(value) WBGEN2_GEN_WRITE(value, 8, 16)
#define RTU_GCR_POLY_VAL_R(reg) WBGEN2_GEN_READ(reg, 8, 16)
/* definitions for register: Aging register for HCAM */
/* definitions for register: Port Control Register 0 */
/* definitions for field: Learning enable in reg: Port Control Register 0 */
#define RTU_PCR0_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 0 */
#define RTU_PCR0_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 0 */
#define RTU_PCR0_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 0 */
#define RTU_PCR0_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 0 */
#define RTU_PCR0_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR0_PRIO_VAL_SHIFT 4
#define RTU_PCR0_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR0_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 0 */
#define RTU_PCR0_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 1 */
/* definitions for field: Learning enable in reg: Port Control Register 1 */
#define RTU_PCR1_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 1 */
#define RTU_PCR1_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 1 */
#define RTU_PCR1_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 1 */
#define RTU_PCR1_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 1 */
#define RTU_PCR1_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR1_PRIO_VAL_SHIFT 4
#define RTU_PCR1_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR1_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 1 */
#define RTU_PCR1_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 2 */
/* definitions for field: Learning enable in reg: Port Control Register 2 */
#define RTU_PCR2_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 2 */
#define RTU_PCR2_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 2 */
#define RTU_PCR2_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 2 */
#define RTU_PCR2_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 2 */
#define RTU_PCR2_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR2_PRIO_VAL_SHIFT 4
#define RTU_PCR2_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR2_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 2 */
#define RTU_PCR2_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 3 */
/* definitions for field: Learning enable in reg: Port Control Register 3 */
#define RTU_PCR3_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 3 */
#define RTU_PCR3_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 3 */
#define RTU_PCR3_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 3 */
#define RTU_PCR3_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 3 */
#define RTU_PCR3_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR3_PRIO_VAL_SHIFT 4
#define RTU_PCR3_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR3_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 3 */
#define RTU_PCR3_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 4 */
/* definitions for field: Learning enable in reg: Port Control Register 4 */
#define RTU_PCR4_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 4 */
#define RTU_PCR4_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 4 */
#define RTU_PCR4_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 4 */
#define RTU_PCR4_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 4 */
#define RTU_PCR4_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR4_PRIO_VAL_SHIFT 4
#define RTU_PCR4_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR4_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 4 */
#define RTU_PCR4_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 5 */
/* definitions for field: Learning enable in reg: Port Control Register 5 */
#define RTU_PCR5_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 5 */
#define RTU_PCR5_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 5 */
#define RTU_PCR5_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 5 */
#define RTU_PCR5_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 5 */
#define RTU_PCR5_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR5_PRIO_VAL_SHIFT 4
#define RTU_PCR5_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR5_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 5 */
#define RTU_PCR5_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 6 */
/* definitions for field: Learning enable in reg: Port Control Register 6 */
#define RTU_PCR6_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 6 */
#define RTU_PCR6_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 6 */
#define RTU_PCR6_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 6 */
#define RTU_PCR6_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 6 */
#define RTU_PCR6_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR6_PRIO_VAL_SHIFT 4
#define RTU_PCR6_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR6_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 6 */
#define RTU_PCR6_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 7 */
/* definitions for field: Learning enable in reg: Port Control Register 7 */
#define RTU_PCR7_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 7 */
#define RTU_PCR7_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 7 */
#define RTU_PCR7_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 7 */
#define RTU_PCR7_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 7 */
#define RTU_PCR7_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR7_PRIO_VAL_SHIFT 4
#define RTU_PCR7_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR7_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 7 */
#define RTU_PCR7_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 8 */
/* definitions for field: Learning enable in reg: Port Control Register 8 */
#define RTU_PCR8_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 8 */
#define RTU_PCR8_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 8 */
#define RTU_PCR8_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 8 */
#define RTU_PCR8_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 8 */
#define RTU_PCR8_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR8_PRIO_VAL_SHIFT 4
#define RTU_PCR8_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR8_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 8 */
#define RTU_PCR8_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Port Control Register 9 */
/* definitions for field: Learning enable in reg: Port Control Register 9 */
#define RTU_PCR9_LEARN_EN WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Pass all packets in reg: Port Control Register 9 */
#define RTU_PCR9_PASS_ALL WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Pass BPDUs in reg: Port Control Register 9 */
#define RTU_PCR9_PASS_BPDU WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Fix priority in reg: Port Control Register 9 */
#define RTU_PCR9_FIX_PRIO WBGEN2_GEN_MASK(3, 1)
/* definitions for field: Priority value in reg: Port Control Register 9 */
#define RTU_PCR9_PRIO_VAL_MASK WBGEN2_GEN_MASK(4, 3)
#define RTU_PCR9_PRIO_VAL_SHIFT 4
#define RTU_PCR9_PRIO_VAL_W(value) WBGEN2_GEN_WRITE(value, 4, 3)
#define RTU_PCR9_PRIO_VAL_R(reg) WBGEN2_GEN_READ(reg, 4, 3)
/* definitions for field: Unrecognized request behaviour in reg: Port Control Register 9 */
#define RTU_PCR9_B_UNREC WBGEN2_GEN_MASK(7, 1)
/* definitions for register: Interrupt disable register */
/* definitions for field: UFIFO Not Empty IRQ in reg: Interrupt disable register */
#define RTU_EIC_IDR_NEMPTY WBGEN2_GEN_MASK(0, 1)
/* definitions for register: Interrupt enable register */
/* definitions for field: UFIFO Not Empty IRQ in reg: Interrupt enable register */
#define RTU_EIC_IER_NEMPTY WBGEN2_GEN_MASK(0, 1)
/* definitions for register: Interrupt mask register */
/* definitions for field: UFIFO Not Empty IRQ in reg: Interrupt mask register */
#define RTU_EIC_IMR_NEMPTY WBGEN2_GEN_MASK(0, 1)
/* definitions for register: Interrupt status register */
/* definitions for field: UFIFO Not Empty IRQ in reg: Interrupt status register */
#define RTU_EIC_ISR_NEMPTY WBGEN2_GEN_MASK(0, 1)
/* definitions for register: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 0 */
/* definitions for field: Destination MAC address least-significant part in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 0 */
#define RTU_UFIFO_R0_DMAC_LO_MASK WBGEN2_GEN_MASK(0, 32)
#define RTU_UFIFO_R0_DMAC_LO_SHIFT 0
#define RTU_UFIFO_R0_DMAC_LO_W(value) WBGEN2_GEN_WRITE(value, 0, 32)
#define RTU_UFIFO_R0_DMAC_LO_R(reg) WBGEN2_GEN_READ(reg, 0, 32)
/* definitions for register: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 1 */
/* definitions for field: Destination MAC address most-significant part in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 1 */
#define RTU_UFIFO_R1_DMAC_HI_MASK WBGEN2_GEN_MASK(0, 16)
#define RTU_UFIFO_R1_DMAC_HI_SHIFT 0
#define RTU_UFIFO_R1_DMAC_HI_W(value) WBGEN2_GEN_WRITE(value, 0, 16)
#define RTU_UFIFO_R1_DMAC_HI_R(reg) WBGEN2_GEN_READ(reg, 0, 16)
/* definitions for register: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 2 */
/* definitions for field: Source MAC address least-significant part in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 2 */
#define RTU_UFIFO_R2_SMAC_LO_MASK WBGEN2_GEN_MASK(0, 32)
#define RTU_UFIFO_R2_SMAC_LO_SHIFT 0
#define RTU_UFIFO_R2_SMAC_LO_W(value) WBGEN2_GEN_WRITE(value, 0, 32)
#define RTU_UFIFO_R2_SMAC_LO_R(reg) WBGEN2_GEN_READ(reg, 0, 32)
/* definitions for register: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 3 */
/* definitions for field: Source MAC address most-significant part in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 3 */
#define RTU_UFIFO_R3_SMAC_HI_MASK WBGEN2_GEN_MASK(0, 16)
#define RTU_UFIFO_R3_SMAC_HI_SHIFT 0
#define RTU_UFIFO_R3_SMAC_HI_W(value) WBGEN2_GEN_WRITE(value, 0, 16)
#define RTU_UFIFO_R3_SMAC_HI_R(reg) WBGEN2_GEN_READ(reg, 0, 16)
/* definitions for register: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 4 */
/* definitions for field: VLAN Identifier in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 4 */
#define RTU_UFIFO_R4_VID_MASK WBGEN2_GEN_MASK(0, 12)
#define RTU_UFIFO_R4_VID_SHIFT 0
#define RTU_UFIFO_R4_VID_W(value) WBGEN2_GEN_WRITE(value, 0, 12)
#define RTU_UFIFO_R4_VID_R(reg) WBGEN2_GEN_READ(reg, 0, 12)
/* definitions for field: Priority in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 4 */
#define RTU_UFIFO_R4_PRIO_MASK WBGEN2_GEN_MASK(12, 3)
#define RTU_UFIFO_R4_PRIO_SHIFT 12
#define RTU_UFIFO_R4_PRIO_W(value) WBGEN2_GEN_WRITE(value, 12, 3)
#define RTU_UFIFO_R4_PRIO_R(reg) WBGEN2_GEN_READ(reg, 12, 3)
/* definitions for field: Port ID in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 4 */
#define RTU_UFIFO_R4_PID_MASK WBGEN2_GEN_MASK(16, 4)
#define RTU_UFIFO_R4_PID_SHIFT 16
#define RTU_UFIFO_R4_PID_W(value) WBGEN2_GEN_WRITE(value, 16, 4)
#define RTU_UFIFO_R4_PID_R(reg) WBGEN2_GEN_READ(reg, 16, 4)
/* definitions for field: VID valid in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 4 */
#define RTU_UFIFO_R4_HAS_VID WBGEN2_GEN_MASK(20, 1)
/* definitions for field: PRIO valid in reg: FIFO 'Unrecognized request FIFO (UFIFO)' data output register 4 */
#define RTU_UFIFO_R4_HAS_PRIO WBGEN2_GEN_MASK(21, 1)
/* definitions for register: FIFO 'Unrecognized request FIFO (UFIFO)' control/status register */
/* definitions for field: FIFO empty flag in reg: FIFO 'Unrecognized request FIFO (UFIFO)' control/status register */
#define RTU_UFIFO_CSR_EMPTY WBGEN2_GEN_MASK(17, 1)
/* definitions for field: FIFO counter in reg: FIFO 'Unrecognized request FIFO (UFIFO)' control/status register */
#define RTU_UFIFO_CSR_USEDW_MASK WBGEN2_GEN_MASK(0, 7)
#define RTU_UFIFO_CSR_USEDW_SHIFT 0
#define RTU_UFIFO_CSR_USEDW_W(value) WBGEN2_GEN_WRITE(value, 0, 7)
#define RTU_UFIFO_CSR_USEDW_R(reg) WBGEN2_GEN_READ(reg, 0, 7)
/* definitions for register: FIFO 'Main hashtable CPU access FIFO (MFIFO)' data input register 0 */
/* definitions for field: Address/data select in reg: FIFO 'Main hashtable CPU access FIFO (MFIFO)' data input register 0 */
#define RTU_MFIFO_R0_AD_SEL WBGEN2_GEN_MASK(0, 1)
/* definitions for register: FIFO 'Main hashtable CPU access FIFO (MFIFO)' data input register 1 */
/* definitions for field: Address/data value in reg: FIFO 'Main hashtable CPU access FIFO (MFIFO)' data input register 1 */
#define RTU_MFIFO_R1_AD_VAL_MASK WBGEN2_GEN_MASK(0, 32)
#define RTU_MFIFO_R1_AD_VAL_SHIFT 0
#define RTU_MFIFO_R1_AD_VAL_W(value) WBGEN2_GEN_WRITE(value, 0, 32)
#define RTU_MFIFO_R1_AD_VAL_R(reg) WBGEN2_GEN_READ(reg, 0, 32)
/* definitions for register: FIFO 'Main hashtable CPU access FIFO (MFIFO)' control/status register */
/* definitions for field: FIFO full flag in reg: FIFO 'Main hashtable CPU access FIFO (MFIFO)' control/status register */
#define RTU_MFIFO_CSR_FULL WBGEN2_GEN_MASK(16, 1)
/* definitions for field: FIFO empty flag in reg: FIFO 'Main hashtable CPU access FIFO (MFIFO)' control/status register */
#define RTU_MFIFO_CSR_EMPTY WBGEN2_GEN_MASK(17, 1)
/* definitions for field: FIFO counter in reg: FIFO 'Main hashtable CPU access FIFO (MFIFO)' control/status register */
#define RTU_MFIFO_CSR_USEDW_MASK WBGEN2_GEN_MASK(0, 6)
#define RTU_MFIFO_CSR_USEDW_SHIFT 0
#define RTU_MFIFO_CSR_USEDW_W(value) WBGEN2_GEN_WRITE(value, 0, 6)
#define RTU_MFIFO_CSR_USEDW_R(reg) WBGEN2_GEN_READ(reg, 0, 6)
/* definitions for RAM: Hash collisions memory (HCAM) */
#define RTU_HCAM_BYTES 0x00000800 /* size in bytes */
#define RTU_HCAM_WORDS 0x00000200 /* size in 32-bit words, 32-bit aligned */
/* definitions for RAM: Aging bitmap for main hashtable */
#define RTU_ARAM_MAIN_BYTES 0x00000400 /* size in bytes */
#define RTU_ARAM_MAIN_WORDS 0x00000100 /* size in 32-bit words, 32-bit aligned */
/* definitions for RAM: VLAN table (VLAN_TAB) */
#define RTU_VLAN_TAB_BYTES 0x00004000 /* size in bytes */
#define RTU_VLAN_TAB_WORDS 0x00001000 /* size in 32-bit words, 32-bit aligned */
/* [0x0]: REG RTU Global Control Register */
#define RTU_REG_GCR 0x00000000
/* [0x4]: REG Aging register for HCAM */
#define RTU_REG_AGR_HCAM 0x00000004
/* [0x8]: REG Port Control Register 0 */
#define RTU_REG_PCR0 0x00000008
/* [0xc]: REG Port Control Register 1 */
#define RTU_REG_PCR1 0x0000000c
/* [0x10]: REG Port Control Register 2 */
#define RTU_REG_PCR2 0x00000010
/* [0x14]: REG Port Control Register 3 */
#define RTU_REG_PCR3 0x00000014
/* [0x18]: REG Port Control Register 4 */
#define RTU_REG_PCR4 0x00000018
/* [0x1c]: REG Port Control Register 5 */
#define RTU_REG_PCR5 0x0000001c
/* [0x20]: REG Port Control Register 6 */
#define RTU_REG_PCR6 0x00000020
/* [0x24]: REG Port Control Register 7 */
#define RTU_REG_PCR7 0x00000024
/* [0x28]: REG Port Control Register 8 */
#define RTU_REG_PCR8 0x00000028
/* [0x2c]: REG Port Control Register 9 */
#define RTU_REG_PCR9 0x0000002c
/* [0x40]: REG Interrupt disable register */
#define RTU_REG_EIC_IDR 0x00000040
/* [0x44]: REG Interrupt enable register */
#define RTU_REG_EIC_IER 0x00000044
/* [0x48]: REG Interrupt mask register */
#define RTU_REG_EIC_IMR 0x00000048
/* [0x4c]: REG Interrupt status register */
#define RTU_REG_EIC_ISR 0x0000004c
/* [0x50]: REG FIFO 'Unrecognized request FIFO (UFIFO)' data output register 0 */
#define RTU_REG_UFIFO_R0 0x00000050
/* [0x54]: REG FIFO 'Unrecognized request FIFO (UFIFO)' data output register 1 */
#define RTU_REG_UFIFO_R1 0x00000054
/* [0x58]: REG FIFO 'Unrecognized request FIFO (UFIFO)' data output register 2 */
#define RTU_REG_UFIFO_R2 0x00000058
/* [0x5c]: REG FIFO 'Unrecognized request FIFO (UFIFO)' data output register 3 */
#define RTU_REG_UFIFO_R3 0x0000005c
/* [0x60]: REG FIFO 'Unrecognized request FIFO (UFIFO)' data output register 4 */
#define RTU_REG_UFIFO_R4 0x00000060
/* [0x64]: REG FIFO 'Unrecognized request FIFO (UFIFO)' control/status register */
#define RTU_REG_UFIFO_CSR 0x00000064
/* [0x68]: REG FIFO 'Main hashtable CPU access FIFO (MFIFO)' data input register 0 */
#define RTU_REG_MFIFO_R0 0x00000068
/* [0x6c]: REG FIFO 'Main hashtable CPU access FIFO (MFIFO)' data input register 1 */
#define RTU_REG_MFIFO_R1 0x0000006c
/* [0x70]: REG FIFO 'Main hashtable CPU access FIFO (MFIFO)' control/status register */
#define RTU_REG_MFIFO_CSR 0x00000070
#endif
This source diff could not be displayed because it is too large. You can view the blob instead.
-- -*- Mode: LUA; tab-width: 2 -*-
PCR_template = reg {
name = "Port Control Register";
description = "Register controlling the mode of certain RTU port.";
prefix = "PCR";
field {
name = "Learning enable";
description = "1: enables learning process on this port. Unrecognized requests will be put into UFIFO\
0: disables learning. Unrecognized requests will be either broadcast or dropped.";
prefix = "LEARN_EN";
type = BIT;
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
field {
name = "Pass all packets";
description = "1: all packets are passed (depending on the rules in RT table). \
0: all packets are dropped on this port.";
prefix = "PASS_ALL";
type = BIT;
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
field {
name = "Pass BPDUs";
description = "1: BPDU packets (with dst MAC 01:80:c2:00:00:00) are passed according to RT rules. This setting overrides PASS_ALL.\
0: BPDU packets are passed according to RTU rules only if PASS_ALL is set.[ML by modified]";
prefix = "PASS_BPDU";
type = BIT;
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
field {
name = "Fix priority";
description = "1: Port has fixed priority of value PRIO_VAL. It overrides the priority coming from the endpoint\
0: Use priority from the endpoint";
prefix = "FIX_PRIO";
type = BIT;
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
field {
name = "Priority value";
description = "Fixed priority value for the port. Used instead the endpoint-assigned priority when FIX_PRIO = 1";
prefix = "PRIO_VAL";
type = SLV;
align = 4;
size =3 ;
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
field {
name = "Unrecognized request behaviour";
description = "Sets the port behaviour for all unrecognized requests:\
0: packet is dropped\
1: packet is broadcast";
prefix = "B_UNREC";
type = BIT;
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
-- Mirroring Control fields go here.
};
peripheral {
name = "Routing Table Unit (RTU)";
prefix="rtu";
hdl_entity="wrsw_rtu_wb";
-- Port Configuration Register
reg {
name = "RTU Global Control Register";
description = "Control register containing global (port-independent) settings of the RTU.";
prefix = "GCR";
field {
name = "Main table bank select";
description = "Selects active bank of RTU hashtable (ZBT).\
0: bank 0 is used by lookup engine and bank 1 can be accessed using MFIFO\
1: bank 1 is used by lookup engine and bank 0 can be accessed using MFIFO";
type = BIT;
prefix = "HT_BSEL";
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
field {
name = "Hash collision table (HCAM) bank select";
description = "Selects active bank of RTU extra memory for colliding hashes.\
0: bank 0 is used by lookup engine\
1: bank 1 is used by lookup engine";
type = BIT;
prefix = "HCAM_BSEL";
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
field {
name = "RTU Global Enable";
description = "Global RTU enable bit. Overrides all port settings.\
0: RTU is disabled. All packets are dropped.\
1: RTU is enabled.";
type = BIT;
prefix = "G_ENA";
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
field {
name = "Hash Poly";
description = "Determines the polynomial used for hash computation. Currently available: 0x1021, 0x8005, 0x0589 ";
type = SLV;
prefix = "POLY_VAL";
align = 8;
size = 16 ;
access_dev = READ_ONLY;
access_bus = READ_WRITE;
};
clock = "zbt_clk_i";
};
-- TXTSU interrupts
irq {
name = "UFIFO Not Empty IRQ";
description = "Interrupt active when there are some requests in UFIFO.";
prefix = "nempty";
trigger = LEVEL_0;
};
fifo_reg {
name = "Unrecognized request FIFO (UFIFO)";
description = "FIFO containing all RTU requests for which matching entries haven't been found. CPU reads these requests,\
evaluates them and updates the RTU tables accordingly.";
prefix = "UFIFO";
direction = CORE_TO_BUS;
size = 128;
flags_dev = {FIFO_FULL, FIFO_EMPTY};
flags_bus = {FIFO_EMPTY, FIFO_COUNT};
--clock = "zbt_clk_i";
-- clock = ""; - make it asynchronous if you want
field {
name = "Destination MAC address least-significant part";
description = "Bits [31:0] of packet destination MAC address";
prefix = "DMAC_LO";
type = SLV;
size = 32;
};
field {
name = "Destination MAC address most-significant part";
description = "Bits [47:32] of packet destination MAC address";
prefix = "DMAC_HI";
type = SLV;
size = 16;
};
field {
name = "Source MAC address least-significant part";
description = "Bits [31:0] of packet source MAC address";
prefix = "SMAC_LO";
type = SLV;
size = 32;
};
field {
name = "Source MAC address most-significant part";
description = "Bits [47:32] of packet source MAC address";
prefix = "SMAC_HI";
type = SLV;
size = 16;
};
field {
name = "VLAN Identifier";
description = "VLAN ID of the packet (from the endpoint)";
prefix = "VID";
size = 12;
type = SLV;
align = 32;
};
field {
name = "Priority";
description = "Priority value (from the endpoint)";
prefix = "PRIO";
size = 3;
align = 4;
type = SLV;
};
field {
name = "Port ID";
description = "Identifier of RTU port to which came the request.";
prefix = "PID";
size = 4;
align = 4;
type = SLV;
};
field {
name = "VID valid";
description = "1: VID value is valid\
0: packet had no VLAN ID";
prefix = "HAS_VID";
align = 4;
type = BIT;
};
field {
name = "PRIO valid";
description = "1: PRIO value is valid\
0: packet had no priority assigned";
prefix = "HAS_PRIO";
type = BIT;
};
};
ram {
name = "Hash collisions memory (HCAM)";
description = "Memory block containing the 'tails' for hashes which have more than 4 entries and don't fit into a single bucket of main ZBT hashtable. \
<b>Note:</b> MSB of the address is the bank select bit. ";
prefix = "HCAM";
width = 32;
size = 32 * 8 * 2; -- 32 entries * 8 words per entry * 2 banks
access_dev = READ_ONLY;
access_bus = READ_WRITE;
clock = "zbt_clk_i"; --async?
};
ram {
name = "Aging bitmap for main hashtable";
description = "Each bit in this memory reflects the state of corresponding entry in main hashtable:\
0: entry wasn't matched\
1: entry was matched at least once.\
CPU reads this bitmap and subsequently clears it every few seconds to update the aging counters.";
prefix = "ARAM_MAIN";
width = 32;
size = 8192 / 32; -- 8192 bits
access_dev = READ_WRITE;
access_bus = READ_WRITE;
--[changed 6/10/2010] clock = "zbt_clk_i";
--clock = "zbt_clk_i"; --async?
};
ram {
name = "VLAN table (VLAN_TAB)";
description = "It stores VLAN-related information identified by VLAN ID (VID)";
prefix = "VLAN_TAB";
width = 32;
size = 4096 ; -- 4096 entries as defined in 802.1Q-2005, page 12
access_dev = READ_ONLY;
access_bus = READ_WRITE;
-- --[changed 6/10/2010] clock = "zbt_clk_i";
--clock = "zbt_clk_i"; --async?
};
reg {
name = "Aging register for HCAM";
description = "Each bit in this register reflects the state of corresponding entry in HCAM:\
0: entry wasn't matched\
1: entry was matched at least once.\
CPU reads this bitmap and subsequently clears it every few seconds to update the aging counters.";
prefix = "AGR_HCAM";
field {
name = "Aging register value";
type = SLV;
size = 32;
access_dev = READ_WRITE;
access_bus = READ_WRITE;
load = LOAD_EXT;
};
clock = "zbt_clk_i";
-- clock = "zbt_clk_i"; --async?
};
fifo_reg {
name = "Main hashtable CPU access FIFO (MFIFO)";
description = "FIFO for writing to main hashtable";
prefix = "MFIFO";
direction = BUS_TO_CORE;
size = 64;
flags_dev = {FIFO_EMPTY, FIFO_COUNT};
flags_bus = {FIFO_EMPTY, FIFO_FULL, FIFO_COUNT};
field {
name = "Address/data select";
description = "1: AD_VAL contains new memory address\
0: AD_VAL contains data word to be written at current memory address. Then, the address is incremented";
prefix = "AD_SEL";
type = BIT;
};
field {
name = "Address/data value";
description = "Value of new memory address (when AD_SEL = 1) or data word to be written (when AD_SEL = 0)";
prefix = "AD_VAL";
type = SLV;
align =32;
size = 32;
};
clock = "zbt_clk_i";
};
};
function gen_PCRs(num_pcrs)
local i;
for i=0,num_pcrs-1 do
local rp = deepcopy(PCR_template);
rp.name = rp.name.." "..i;
rp.prefix = rp.prefix..i;
table.insert(periph, rp);
end
end
gen_PCRs(10);
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
-------------------------------------------------------------------------------
-- Title : SWcore pseudocode
-- Project : White Rabbit Switch
-------------------------------------------------------------------------------
-- File : wrsw_hdl_spec.txt
-- Authors : Maciej Lipinski (maciej.lipinski@cern.ch)
-- Company : CERN BE-CO-HT
-- Created : 2012-01-11
-- Last update: 2012-01-211
-- Description: this is kind-of-pseudo code which attempts to explain how the
-- SWcore and its output queues are working.
-- It does not meant to compile.
-------------------------------------------------------------------------------
*/
#define OUT_QUEUE_NUMBER 8;
#define PORT_NUMBER 8; //whatever
#define FBM_MEMORY_SIZE 123456; //whatever
typedef struct {
FIFO single_prio_fifo; // this is an abstract type of First In First Out
boolean empty; // true if the FIFO is empty
} swcore_out_quque_t;
typedef struct {
ETHERNET_FRAME buf; // here the frame is stored
} swcore_FBM_entry_t;
typedef struct {
boolean valid; // true if the rest of the data is valid
int address; // address of the first page of the frame in the memory
int port_mask;// to which ports the frame is to be forwarded (e.g.: 0101 => forward to
// ports: 0 and 2,
int priority; // with what priority
} swcore_transfer_t;
// here we declare output queues for all the ports and their priorities
swcore_out_quque_t output[PORT_NUMBER][OUT_QUEUE_NUMBER];
// the Fabulously Big Memory (FBM)
swcore_FBM_entry_t fbm_memory[FBM_MEMORY_SIZE];
//this is used to transfer frame from input ports to output ports
swcore_transfer_t transfer[PORT_NUMBER];
boolean receive(ETHERNET_FRAME *buf, int port_number)
{
/*
* this function receives Ethernet frames from the physical interface of the port_number
*/
}
boolean send(ETHERNET_FRAME *buf, int port_number)
{
/*
* this function sends Ethernet frames to the physical interface of the port_number
*/
}
boolean rtu(ETHERNET_FRAME *buf, int *port_mask, int *priority)
{
/*
* here, the routing decision is taken
* the output of this function are:
* - the decision to which ports the frame should go (port_mask)
* - the decision what is the priority of the frame
* - (in the future) it will also tell whether it is broadcast or unicast
*/
}
int mmu()
{
/*
* Memory Management Unit - returns the address of the page allocated in the FBM memory
*/
}
/*
this function takes data from an ports' input and makes it available to ports' output
*/
void arbiter(int port_mask,int priority,int address, int port_number /*input*/)
{
transfer[port_number].address = address;
transfer[port_number].port_mask = port_mask;
transfer[port_number].priority = priority;
transfer[port_number].valid = TRUE;
// here we wait for all the appropriate ports' outputs to read the data
while (transfer[port_number].port_mask != 0);
transfer[port_number].valid = FALSE;
}
/*
input block, this is per port
*/
void input_block(int port_number)
{
ETHERNET_FRAME buf; //an abstract type to store a received Ethernet frame
int port_mask;
int priority;
int address;
while(1)
{
if( receive(&buf,port_number) == TRUE )
{
// ask Routing Table Unit
rtu(&buf, &port_mask, &priority);
//acquire address of the first page
address = mmu();
//store in memory
fbm_memory[address].buf = buf;
// forward a pointer to the frame to all the appropriate ports
// waits until all the appropriate ports read the data
arbiter(port_mask, priority, address);
}
}
}
void output_block(int port_number)
{
int address;
/* the below two whiles are done simultaneously (try to imagine :)*/
while(1)
{
for(int i=0; i<PORT_NUMBER; i++)
{
if( (transfer[i].port_mask >> port_number) & 0x1 ) // we check all the input ports for a frame
{ // destined to the port
int addresss = transfer[i].address;
int priority = transfer[i].priority;
// put the address of the first page of the frame into the output fifo for a given priority
output[port_number][priority].single_prio_fifo.push(address);
output[port_number][priority].empty = FALSE;
// indicate that the frame was received by the output port
transfer[i].port_mask = transfer[i].port_mask & (0x1 << port_number);
}
}
}
// here is the very "advanced" output scheduling algorithm
while(1)
{
for(int i=OUT_QUEUE_NUMBER-1; i>=0; i--)
{
if( output[port_number][i].empty == FALSE)
{
// get the pointer to the oldest frame in the output queue
address = output[port_number][i].single_prio_fifo.front();
// send the frame
send(fbm_memory[address], port_number);
}
}
}
}
void swcore_main()
{
int port_number;
/*
* if you imagine that all the below functions are executed simultaneusly,
* then you have the idea how the SWCORE works
*/
// PORT_NUMBER input ports
input_block(0);
input_block(1);
input_block(2);
input_block(3);
input_block(4);
input_block(5);
input_block(6);
input_block(7);
// PORT_NUMBER of output ports
input_block(0);
input_block(1);
input_block(2);
input_block(3);
input_block(4);
input_block(5);
input_block(6);
input_block(7);
}
\ No newline at end of file
/*
-------------------------------------------------------------------------------
-- Title : SWcore HDL documentation
-- Project : White Rabbit Switch
-------------------------------------------------------------------------------
-- File : wrsw_hdl_spec.txt
-- Authors : Maciej Lipinski (maciej.lipinski@cern.ch)
-- Company : CERN BE-CO-HT
-- Created : 2011-11-28
-- Last update: 2011-11-28
-- Description: This file contain description of SWcore and its components for anyone
-- who would like (fear !!!) to make any modifications to that module
-- or even worse...for someone how (for some strange reason) would
-- like to understand how it works.
-------------------------------------------------------------------------------
*/
The specification according to which the SWcore was created is in the following file
(swcore_spec.pdf). Please, read the specification first before reading this document.
In this document I assumes your prior knowledge of the spec(swcore_spec.pdf).
Refer to the swcore_architecture.pdf for a drawing of the architecture of the SWcore
(I promise to redraw it in some graphical tool when I find time, sorry for the current
poor quality).
SWcore interfaces with Endpoints and RTU@HW (another HDL modules). As of the time of writing,
the interface between Endpoints and SWcore is the Fabric Interface but it will have to be
eventually changed to pipelined Wishbone.
SWcore is generic in the following regards:
- number of ports (c_swc_num_ports)
- number of output priority queues (c_swc_output_prio_num) and
- output queues' size (c_swc_output_fifo_size)
- some more internal stuff like page number
All the parameters are defiend in the package file: swc_swcore_pkg.vhd
1. swc_core.vhd
This is the top entity which just contains and connects different componetns of the SWcore.
It can be configured to instanciate a give number of ports.
SWcore interfaces with Endpoint modules using two components:
- swc_input_block.vhd
- swc_output_block.vhd
SWcore interfaces with RTU using swc_input_block.vhd
2. INPUT_BLOCK (swc_input_block.vhd)
This block controls input to SW Core. It consists of a three Finite State Machines (FSMs):
1) Read FSM - reads information from Fabric Interface and stores it in FIFO:
* it speaks with the outside world (Endpoint) through Fabric IF (later pipelined WB)
* it waits for the decision (port_mask) from RTU
* stores data into FIO
2) Write FSM - reads data from FIFO and writes it into write pump
* it speaks with the multiport memory (swc_packet_mem.vhd)
* it writes to an allocated in advanced address
3) Page FSM - allocates pages in advance and sets usecnt of pages, i.e
* it allocates in advance one page to be used as the first page
of the pck (pckstart)
* it allocates in advnace one page to be used within the pck (interpck)
* it sets usecnt of pckstart page if it's different then the one set
durring allocation
* it sets usecnt of interpck page if it's different then the one set
durring allocation
Speaking with the outside world
This block reads the incoming package (Ethernet frame) through Fabric IF from the Endpoint and
reads forwarding decision from RTU. It stores the package in the FIFO.
The Endpoint forwards the Destination MAC, Source MAC, VLAN and priority to RTU module directly.
The SWcore only waits for the forwarding decision (port_mask, drop, prio).
Speaking with the SWcore guts:
1) Package Transfer Arbiter (swc_pck_transfer_arbiter.vhd) - input block forward to the Arbiter
the port_mask (once it is received from the RTU), the size of the package received and the
address of the first allocated page.
2) Mulitport Memory (swc_pcaket_mem.vhd) - the Write FSM writes the package from the FIFO
to the Multiport Memory at the allocated addresses (page by page)
3) MMEMORY_MANAGEMENT_UNIT (swc_multiport_page_allocator.vhd) - the input block (Page FSM) requests
from MMU a free memory page address (in advance: when waiting for new package or when
writing page). This page address is used when writing pacakge to multiport memory.
4) PCK_PAGES_FREEEING_MODULE (swc_multiport_pck_pg_free_module.vhd) - if a pacakge is dropped
during tranfser (so when we started writing to the Multiport Memory), we need to free
the already allocated and written to pages. This is what the PCK_PAGES_FREEING_MODULE is used
interfaced for.
3. OUTPUT_BLOCK (swc_output_block.vhd)
Speaking with the outside world:
It outputs a pacakge via Fabric IF to an Endpoint
Speaking with the SWcore guts:
1) TRANSER_ARBITER (swc_pck_transfer_arbiter.vhd) - output block receives from the Arbiter :
- the address of the first page of the packge,
- the priority of the package
- the size of the packge
2) MUPTIPORT_MEMORY (swc_packet_mem.vhd) - output block starts reading the package to be sent
from the Multiport Memory from the address transfed by the Transfer Arbiter.
3) PCK_PAGES_FREEEING_MODULE (swc_multiport_pck_pg_free_module.vhd) - once the package is
sent, the output block it frees the allocated pages using PCK_PAGE_FREEING_MODULE.
There is only one FSM which controls the OUTPUT_BLOCK, it simply
- waits until there is something in an output queue (not_empty_array vector is non-zero)
- request reading the page (read from the output queue) from the Multiport Memory
- reads the package from the Mulitport Memory
- frees the page address
Internal components of the OUTPUT_BLOCK:
3.1 RD_ENCODE (swc_prio_encoder.vhd)
It decides which output queue should be read, what it does is:
- it takes an input array (not_empty_array) of bits, each bits is equivalent to one priority. If
a bit is '1', it means that the output queue of the given priority is not empty, MSB is lowest
priority, LSB is the highest priority 0.
- the encoder detects the first least significant '1' (the most to the right) and returns two values:
a vector with a single '1' at the position of the first least significant '1' and the numerical
value of its position, e.g.:
in_i = 1110101011000
out_o = 3
onehot_o = 0000000001000
This is used in deciding which output queue to read first.
3.2 SSRAM (generic_ssram_dualport_singleclock)- the output queues are implemented as a single
SSRAM. The ram only stores pck_size and page_addres. The priority of the pacakge is encoded
into the address of the SSRAM under which the information is stored.
3.3 PRIO_QUEUE_CTRL (swc_ob_prio_queue.vhd)
Each piece of SSRAM allocated for a given priority is like a round buffer. So for each of this
memory space there is instanciated a PRIO_QUEUE_CTRL which controls the read/write address of this
memory space (it tracks the head/tail).
4. TRANSER_ARBITER (swc_pck_transfer_arbiter.vhd)
This module does the forwarding trick !!
It takes the following inputs from an INPUT_BLOCK:
- port mask
- page address
- priority
- package size
And forwards this information to OUTPUT_BLOCK specified by the port mask.
Speaking with the SWcore guts:
1) INPUT_BLOCK (swc_input_block.vhd) - the arbiter takes the info (port mask, page addr,
priority, size) about a correctly received package from the input block
2) OUTPUT_BLOCK (swc_output_block.vhd) - the arbiter forwards the info (port mask, page addr,
priority, size) about a correctly received packge to the appropriate output blocks.
How the stuff works:
- INPUT_BLOCK writes info (port mask, page addr, priority, size) about a correctly received package
to the TRANSER_ARBITER
- the TRANSFER_INPUT block instanciated for the port from which the info came, makes the
info avilable for the TRANSFER_OUTPUT blocks and waits for all the proper TRANSFER_OUTPUT blocks
to read the info (they clear appropriate bits in the mask (pto_read_mask)
- once all the appropriate (defined by port_mask) TRANSFER_OUTPUT blocks
(so all the appropriate OUTPUT_BLOCKs, so all the appropriate ports) have read the info,
the TRANSFER_INPUT send ack to the INPUT_BLOCK
Internal components of the TRANSER_ARBITER:
4.1 TRANSFER_INPUT (swc_pck_transfer_input.vhd)
Instanciated for each INPUT_BLOCK, it manages the transfer of the data. It takes the info
(port mask, page addr, priority, size) from the INPUT_BLOCK and make it available for
OUTPUT_BLOCKs (through TRANSFER_OUTPUT, below) as long as all the OUTPUT_BLOCKs read it.
It ackes successful reception of the info to all the OUTPUT_BLOCKs
4.2. TRANSFER_OUTPUT (swc_pck_transfer_output.vhd)
Instanciated for each OUTPUT_BLOCK, it manages the transfer of the data. It takes the info
(page addr, priority, size) from the TRANSFER_INPUT and make it available to
the OUTPUT_BLOCK. It acknowledges to the TRANSFER_INPUT block that it read the data.
5. MUPTIPORT_MEMORY (swc_packet_mem.vhd)
Here we enable 'c_swc_num_ports' ports to write and read to/from
shared memory. We assume we know the memory page (provided by page
allocator/deallocator, another component).
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
Packets from each port are written/read to/from memory pumps:
- WRPUMP (swc_packet_mem_write_pump.vhd) - write pump
- RDPUMP (swc_packet_mem_read_pump.vhd) - read pump
Each port has its own write and read pump. The pumps are an intermediate step (buffer)
between port (INPUT_BLOCK) and shared memory (FUCKING_BIG_MEMORY). Each pump has its own
time slot to access FUCKING_BIG_MEMORY. The time slot is one cycle. The time slot is
granted every 'c_swc_packet_mem_multiply' cycles (regardless it's requested by the pump or not).
** writing **
'c_swc_packet_mem_multiply' number of words written to a pump are saved in
FUCKING_BIG_MEMORY (when the access is granted). Writting to a pump can be done
regardless of the time slots granted to the pumps (at any time). It can be done as long as
the pump's buffer (register of c_swc_packet_mem_multiply words) is not full.
The address of the word is determined by the provided to the pump pgaddr
(page address, which comes from page allocator) and internal page address:
addres = pgaddr + inter_page_addr.
A page starts at the pgaddr, a page has c_swc_page_size number of inter_page_addres (words)
When the register which is currently being filled-in is going to be written to the
last word of the page, the rd_pageend_o is high indicating that next page needs to be allocated.
If the data which is written to a page by a port does not fill entire
input register (the number is not modulo c_swc_packet_mem_multiply), but
the port wants to write next data to new page and save in the FUCKING_BIG_MEMORY
the "not-full-input-reg", e.g. new package is to be saved, then wr_flush_i should be
set HIGH, it forces the pump to save "not-entirely-full" input register
in FUCKING_BIG_MEMORY during the next time slot for this port
** reading **
Similar to writing. there is a register of c_swc_packet_mem_multiply words
(ctrl+data) which are read from FUCKING_BIG_MEMORY in the pump's time slot (one cycle).
Each word of the register is made available consequtivelly, so first the
LSB word can be read by the port (availability of data is indicated by
rd_drdy_o being set to HIGH. Next word can be requested by setting rd_dreq_i
HIGH (while the previous word is read).
Speaking with the SWcore guts:
1) INPUT_BLOCKs (swc_input_block.vhd) - each block can write simultaneously to the
MUPTIPORT_MEMORY (the appripriate WRPUMP)
2) OUTPUT_BLOCKs (swc_output_block.vhd) - each block can read simultaneously from the
MUPTIPORT_MEMORY (the appripriate RDPUMP)
3) LINKED_LIST (swc_multiport_linked_list.vhd) - It stores the page addresses of packages
in a linked list. So you only need to know the address of the first page where
the package was stored. The addresses of the other pages are in a linked list:
the first address points to the second, the second to the third, etc... This linked
list is filled in when the MUPTIPORT_MEMORY is written to, and read when it is read from.
Internal components of the MUPTIPORT_MEMORY:
5.1 FUCKING_BIG_MEMORY (generic_ssram_dualport_singleclock.vhd)
This is a single SSRAM which is accessed by all the write/read pumps. It's very big, thus the name.
5.2 WRPUMP (swc_packet_mem_write_pump.vhd)
Collectes data (words of ctrl+data seq) from one port and
pumps (saves) sequence of such data to one word of SRAM memory with the
page address allocated by mutiport memory allocator. The access to
SSRAM is shared equally between many such pumps, each pump represents
one port.
A pump works in the following way:
1) it collects data from a port, data can be written continuously.
- data consits of a word of ctrl + data seq
- one word can be written at one clock cycle, in such case drdy_i is
- constantly HIGH
2) if entire "vector" of data words is collected ('c_swc_packet_mem_multiply'
number of data words), such a vector is written to SSRAM to one word:
- the dats is written to SRAM memory address = page_addr + offset
- each "memory page" (indicated by page_addr) consists of a few
SRAM consecutive addresses
3) when the vector to be written to the last address of the page is being
filled in, the 'pend_o' indicates that the end of the page
Each pump has its 'time slot' (one cycle) to read/write from/to
*FUCKING BIG SRAM (FB SRAM)*. The access is granted to each pump in sequence:
1,2,3...(c_swc_packet_mem_multiply - 1). The access is multiplexed
between the pumps.
If we want to write to the FUCKING BIG SRAM vector not fully filled in with data,
we can use 'flush_i'. High stribe on flush input enforces the pump to
behave as if it was full and the write to FB SRAM was needed in the
next available 'time slot'.
5.3 RDPUMP (swc_packet_mem_read_pump.vhd)
This piece of code reads a bunch ('c_swc_packet_mem_multiply'
of words = ctrl + data) from the FUCKING BIG SRAM and makes it available
for read by port. There is one read_pump for each port. Each pump has its
time slot to read from FB SRAM.
the thing works in the following way:
1) it takes the address (FB SRAM addr) of the page
2) it reads it in its time slot which is one cycle every
c_swc_packet_mem_multiply cycles
3) it makes it available on its output (d_o) word by word (in number of
c_swc_packet_mem_multiply words, this is how many words is saved in
on FB SRAM word)
4) it announces it with 'drdy_o' HIGH
5) the next word is available after setting dreq_i high
6. LINKED_LIST (swc_multiport_linked_list.vhd)
As the name says: it is a linked list !!!
The beginning of a list is the first page allocated to a given package (Ethernet Frame).
All the lists are stored in a single SSRAM (PAGE_INDEX_LINKED_LIST).
Since, each WR PUMP and RD PUMP needs to have access to the SSRAM with the linked list, the
access is govenred by a round robin arbiter (one for writing, on for reading).
Speaking with the SWcore guts:
1) MUPTIPORT_MEMORY (swc_packet_mem.vhd) - to be more precise, each WRPUMP and RDPUMP in
the multiport memory has individual access to the linked list.
2) PCK_PAGES_FREEEING_MODULE (swc_multiport_pck_pg_free_module.vhd) - it reads the addresses
of a package which has been successfully sent to all designated ports and the
memory (allocated pages) can be freed. You need to know the addresses of the pages to be
freed, so you read them from the linked list...
Internal components of the LINKED_LIST:
6.1 PAGE_INDEX_LINKED_LIST (generic_ssram_dualport_singleclock)
The SSRAM with the linked list. So under an address X in the SSRAM we have (as a data)
a page address Y. Under the address Y we have (as a data) the address Z, etc.
If the data is 0xF...F, it means the end of the list (last page allocated to a give package).
6.2 WRITE_ARB (swc_rr_arbiter.vhd)
It is a Round Robbin arbiter which grands access to the Linked List SSRAM.
The write access is shared between all the RDPUMPs in the MUPTIPORT_MEMORY
6.3 READ_ARB (swc_rr_arbiter.vhd)
It is a Round Robbin arbiter which grands access to the Linked List SSRAM.
The read access is shared between :
- all the RDPUMPS in the MUPTIPORT_MEMORY
- PCK_PAGES_FREEEING_MODULE
7. MEMORY_MANAGEMENT_UNIT (swc_multiport_page_allocator.vhd)
This module provides multi-access from many modues (INPUT_BLOCKs and PCK_PAGE_FREEING_MODULE)
to a single ALLOC_CORE which does the real work.
Speaking with the SWcore guts:
1) PCK_PAGES_FREEEING_MODULE (swc_multiport_pck_pg_free_module.vhd) - this module is responsible
for freeing pages, it is a proxy between modules which have the need to free pages and the
MEMORY_MANAGEMENT_UNIT
2) INPUT_BLOCK (swc_input_block.vhd) - each INPUT_BLOCK interfaces MEMORY_MANAGEMENT_UNIT
individually,
Internal components of the LINKED_LIST:
7.1 ALLOC_CORE (swc_page_allocator.vhd)
Module implements a fast (3 cycle) paged memory allocator.
The address of allocated page is made up of two parts:
* high: bits [x downto 5]
* low : bits [4 downto 0]
The low part of the page address (the low bits) is mapped to
a bit of 32 bit word in L0_LUT SRAM.
The high part of the page address is the address of the word in
the L0_LUT_SRAM memory. The address of the word in SRAM is
mapped into a bit of l1_bitmap register (high bits of the address).
Address mapped into bit means that the position of the bit (from LSB)
is equal to the address.
'1' means that a give address is free
'0' means that a give address is used
Tha page allocator looks for the lowest free (unused) page address. It uses
prio_encoder for this purpose.
prio_encoder's input is a bit vector, the output is the position of the
least significant bit set to '1' (see description of prio_encoder).
Additionally, prio_encoder returns the position encoded as one_hot and
a mask.
In the L0_UCNTMEM SRAM, the number of users assigned to a particular
page address is stored. the address in L0_UCNTMEM SRAM corresponds
directly to the page address. The default value to fill in the
SRAM are all '1s'.
The default value to fill in the l1_bitmap register is all '1s'.
Page allocation:
When page allocation is requested, the number of users (usecnt) needs
to be provided. The allocation of the page is not complited until
the provided number of users have read the page (attempted to free
the page). During allocation, the lowest free page address is sought.
As soon as the address is determined, the requested user count is
written to L0_UCNTMEM SRAM and allocation is finished.
Page Deallocation:
When free_page is attempted, the address of the page needs to be provided.
The address is decoded into high and low parts. First, the count in
L0_UCNTMEM SRAM is checked, if it's greater than 1, it is decreased.
If the usecount == 1, it means that this was the last page user, and thus
the page is freed. this means that '1' is written to the bit corresponding
to the page low part of the address in the word in L0_LUT SRAM. And '1' is
written to the l1_bitmap register to the bit corresponding to the high part
of the address.
7.2 ARB (swc_rr_arbiter.vhd)
This module makes everyone happy... it is a Round Robbin arbiter.
It arbits the access to ALLOC_CORE betwee:
- INPUT_BLOCKs
* page allocation
* forced page deallocation
* setting usecnt (based on the number of '1's in the port_mask vector
- PCK_PAGE_FREEING_MODULE
8. PCK_PAGES_FREEEING_MODULE (swc_multiport_pck_pg_free_module.vhd)
This is just a wrapper to instanciate port_number of LPDs (swc_pck_pg_free_module.vhd)
Speaking with the SWcore guts:
1) INPUT_BLOCK (swc_input_block.vhd) - input block makes requests to:
* allocate new pages
* set usecnt (now many times a page needs to be readout -> how many output_blocks need
to read a given page
* faoced freeing (if the package reception is dropped)
2) OUTPUT_BLOCK (swc_output_block.vhd) - it makes a request to free pages associated with
a package, it translates into:
* going through all the pages allocated to a give package (using the linked-list )
* making request to the MEMORY_MANAGEMENT_UNIT to free the page which can result in:
-> decreasing usecnt if it is still greater then 0
-> deallocating the page if usecnt == 0
3) MEMORY_MANAGEMENT_UNIT (swc_multiport_page_allocator.vhd) - making requests to free pages
4) LINKED_LIST (swc_multiport_linked_list.vhd) - finding out addresses of the pages
associated with a given package (Ethernet frame). The address of the first page of
the package is provided by the OUTPUT_BLOCK, but the rest of the addresses need to be
read from the Linked list
8.1 LPD (swc_pck_pg_free_module.vhd)
The incoming requests (to free or force_free pages) are inputed into a FIFO.
The main and only FSM reads the requests from the FIFO and executes them:
(1) requests MEMORY_MANAGEMENT_UNIT to free/force_free a page of a give address
(2) reads the addres of the next page from the Linked lists
(3) if the page is not the last page of the package (pgaddress != 0xF..F), go to (1)
and free the next page, otherwise...
(4) all the pages of a give pacakge have been freed (uscnt decremented or deallocated),
so the new request from the FIFO can be readout
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1052.3622"
height="744.09448"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.46"
version="1.0"
sodipodi:docname="tx_path_timing.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs4">
<marker
inkscape:stockid="Arrow2Mstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Mstart"
style="overflow:visible">
<path
id="path4118"
style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(0.6) translate(0,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Send"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Send"
style="overflow:visible;">
<path
id="path4127"
style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(0.3) rotate(180) translate(-2.3,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Sstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Sstart"
style="overflow:visible">
<path
id="path4124"
style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(0.3) translate(-2.3,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Mend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Mend"
style="overflow:visible;">
<path
id="path4103"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
transform="scale(0.4) rotate(180) translate(10,0)" />
</marker>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective10" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="403.46385"
inkscape:cy="269.18473"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1280"
inkscape:window-height="947"
inkscape:window-x="0"
inkscape:window-y="25">
<sodipodi:guide
orientation="0,1"
position="208.47023,509.74823"
id="guide3548" />
<sodipodi:guide
orientation="0,1"
position="1033.9286,553.57143"
id="guide3550" />
<sodipodi:guide
orientation="0,1"
position="200.64155,526.98396"
id="guide3552" />
<sodipodi:guide
orientation="1,0"
position="657.60931,587.90878"
id="guide10840" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="63.63961"
y="38.169018"
id="text2383"><tspan
sodipodi:role="line"
x="63.63961"
y="358.26654"
id="tspan2485"
style="font-size:10" /></text>
<flowRoot
xml:space="preserve"
id="flowRoot2620"
style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px"><flowRegion
id="flowRegion2622"><rect
id="rect2624"
width="167.85715"
height="257.85715"
x="252.85715"
y="128.3802" /></flowRegion><flowPara
id="flowPara2626" /></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot2628"
style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px"><flowRegion
id="flowRegion2630"><rect
id="rect2632"
width="188.57143"
height="190.71428"
x="318.57144"
y="109.80877" /></flowRegion><flowPara
id="flowPara2634" /></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot2986"
style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
transform="translate(-120.71429,8.5714247)"><flowRegion
id="flowRegion2988"><rect
id="rect2990"
width="152.14288"
height="483.57138"
x="161.42857"
y="132.66591"
ry="0" /></flowRegion><flowPara
id="flowPara2992" /><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara2722">phy_td_o[9:0]</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10649">tx_frame_stb_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10721">tx_input_ready_o</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10727">tx_data_valid_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10731">tx_data_i[7:0]</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10653">tx_oob_begin_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10655">tx_oob_end_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10661">tx_idle_o</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10663">tx_is_hp_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10665">tx_preemptible_o</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10667">tx_fragment_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10669">tx_continue_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10671">tx_end_frame_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10673">tx_send_pause_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10675">tx_pause_count_i[15:0]</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10677">tx_abort_i</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10679">tx_error_stb_o</flowPara><flowPara
style="font-size:10.652174px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:200%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="flowPara10681">tx_error_code_o</flowPara></flowRoot> <path
id="path10822"
d="M 173.64285,384.8802 L 173.64285,195.50589"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,214.80877 L 1034.2857,214.80877"
id="path3078" />
<path
id="path3080"
d="M 35,236.80877 L 1034.2857,236.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,258.80877 L 1034.2857,258.80877"
id="path3082" />
<path
id="path3084"
d="M 35,278.80877 L 1034.2857,278.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,300.80877 L 1034.2857,300.80877"
id="path3086" />
<path
id="path3088"
d="M 35,322.80877 L 1034.2857,322.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path3090"
d="M 35,342.80877 L 1034.2857,342.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,364.80877 L 1034.2857,364.80877"
id="path3092" />
<path
id="path3094"
d="M 35,386.80877 L 1034.2857,386.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,406.80877 L 1034.2857,406.80877"
id="path3096" />
<path
id="path3098"
d="M 35,428.80877 L 1034.2857,428.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
sodipodi:nodetypes="cs" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 539.64285,470.8802 L 539.64285,281.50589"
id="path10814" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,450.80877 L 1034.2857,450.80877"
id="path3100" />
<text
xml:space="preserve"
style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="175.05885"
y="92.169731"
id="text3102"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3104"
x="175.05885"
y="92.169731">TX path fabric i/f timing - normal/HP transmit</tspan></text>
<text
xml:space="preserve"
style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="136.87567"
y="202.14764"
id="text3106"><tspan
sodipodi:role="line"
id="tspan3108"
x="136.87567"
y="202.14764" /></text>
<text
xml:space="preserve"
style="font-size:7.48284674px;font-style:normal;font-weight:normal;fill:#666666;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="162.99248"
y="154.1958"
id="text3110"
transform="scale(0.7482847,1.3363898)"><tspan
sodipodi:role="line"
id="tspan3112"
x="162.99248"
y="154.1958">idle (no data)</tspan></text>
<rect
style="fill:#e6e6e6;stroke:#333333;stroke-width:0.73632592"
id="rect3114"
width="85.224915"
height="17.436268"
x="230.8073"
y="194.94473" />
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="239.78571"
y="206.59448"
id="text3116"><tspan
sodipodi:role="line"
id="tspan3118"
x="239.78571"
y="206.59448">frame header</tspan></text>
<rect
y="195.19069"
x="319.05325"
height="16.944351"
width="254.73299"
id="rect3120"
style="fill:#e6e6e6;stroke:#333333;stroke-width:0.82800001;stroke-miterlimit:4;stroke-dasharray:none" />
<text
id="text3122"
y="206.59448"
x="327.78571"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="206.59448"
x="327.78571"
id="tspan3124"
sodipodi:role="line">frame payload</tspan></text>
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="112.12248"
y="457.16687"
id="text3126"><tspan
sodipodi:role="line"
id="tspan3128" /></text>
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="52.971252"
y="488.06677"
id="text3237"><tspan
sodipodi:role="line"
id="tspan3239"
x="52.971252"
y="488.06677" /><tspan
sodipodi:role="line"
id="tspan3241" /></text>
<path
id="path2724"
d="M 35,512.80877 L 1034.2857,512.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,534.80877 L 1034.2857,534.80877"
id="path2726" />
<path
id="path2728"
d="M 35,554.80877 L 1034.2857,554.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,576.80877 L 1034.2857,576.80877"
id="path2730" />
<text
xml:space="preserve"
style="font-size:18.2181263px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="-402.28162"
y="26.942965"
id="text2734"
transform="matrix(0,-1,1,0,0,0)"><tspan
sodipodi:role="line"
id="tspan2736"
x="-402.28162"
y="26.942965">Fabric i/f</tspan></text>
<text
id="text2744"
y="207.70348"
x="586.24878"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="207.70348"
x="586.24878"
id="tspan2746"
sodipodi:role="line">gap</tspan></text>
<rect
y="194.94473"
x="175.12872"
height="17.436268"
width="53.480877"
id="rect3534"
style="fill:#e6e6e6;stroke:#333333;stroke-width:0.73632586" />
<text
xml:space="preserve"
style="font-size:6.38256073px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="200.83365"
y="201.88177"
id="text3536"><tspan
sodipodi:role="line"
id="tspan3538"
x="200.83365"
y="201.88177">preamble</tspan><tspan
sodipodi:role="line"
x="200.83365"
y="209.85997"
id="tspan3540">SFD</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 127.35714,234.34625 L 168.63965,234.34625 L 168.63965,217.07642 L 174.9531,217.07642 L 174.9531,234.34625 L 658.09408,234.34625"
id="path3546"
sodipodi:nodetypes="cccccc" />
<path
style="opacity:1;fill:none;fill-rule:evenodd;stroke:#008000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Mend);stroke-opacity:1"
d="M 337.89603,159.72124 C 354.21547,163.68411 373.26323,169.15723 386.38335,177.90398 C 390.92458,180.93146 400.21535,191.29588 404.5661,197.09688 C 410.03581,204.38983 411.4476,211.49092 413.65747,220.33039 C 417.19538,234.48201 419.71839,245.21748 419.71839,259.09499"
id="path3580"
sodipodi:nodetypes="cssss" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 124.82465,320.34625 L 181.46108,320.34625 L 181.46108,303.07642 L 187.77453,303.07642 L 187.77453,320.34625 L 657.60931,320.34625"
id="path7516"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 127.99092,276.34625 L 189.02923,276.34625 L 189.02923,259.07642 L 411.01025,259.07642 L 411.01025,276.34625 L 429.57181,276.34625 L 429.69808,259.11052 L 547.15676,259.11052 L 547.15676,276.34625 L 657.60931,276.34625"
id="path7518"
sodipodi:nodetypes="cccccccccc" />
<path
id="path10816"
d="M 546.14793,470.8802 L 546.14793,281.50589"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccccc"
id="path7530"
d="M 125.58227,342.34625 L 204.80333,342.34625 L 204.80333,325.07642 L 211.11678,325.07642 L 210.92037,342.34625 L 657.60931,342.34625"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 108.40967,345.11052 L 173.74624,344.60544 L 173.74624,363.29327 L 586.38845,362.34625 L 592.44936,362.34625 L 592.44936,345.11052 L 657.60931,345.11052"
id="path7532"
sodipodi:nodetypes="ccccccc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 135.31453,404.34625 L 334.2087,404.34625 L 334.2087,387.07642 L 600.91893,387.07642 L 600.91893,404.34625 L 657.60931,404.19645"
id="path7536"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 120.46069,426.23907 L 657.60931,426.23907"
id="path8089"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 120.02643,448.34625 L 657.60931,448.34625"
id="path8091"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 106.27264,382.34625 L 657.60931,382.34625"
id="path8093"
sodipodi:nodetypes="cc" />
<text
transform="scale(0.9232097,1.0831775)"
id="text8116"
y="427.22433"
x="446.61713"
style="font-size:8.91228294px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="427.22433"
x="446.61713"
id="tspan8118"
sodipodi:role="line">XXX</tspan></text>
<text
xml:space="preserve"
style="font-size:8.91228294px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="446.61713"
y="427.22433"
id="text8120"
transform="scale(0.9232097,1.0831775)"><tspan
sodipodi:role="line"
id="tspan8122"
x="446.61713"
y="427.22433">XXX</tspan></text>
<path
sodipodi:nodetypes="cccccc"
id="path10735"
d="M 127.35714,256.34625 L 175.06822,256.34625 L 175.06822,239.07642 L 547.09596,239.01821 L 547.09596,256.28804 L 658.09408,256.34625"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<rect
style="fill:#e6e6e6;stroke:#333333;stroke-width:0.73632586"
id="rect10738"
width="22.76659"
height="17.436268"
x="189.12872"
y="280.94473" />
<text
id="text10740"
y="246.83067"
x="239.64621"
style="font-size:11.67216587px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"
transform="scale(0.8374549,1.1940942)"><tspan
id="tspan10744"
y="246.83067"
x="239.64621"
sodipodi:role="line">TAG</tspan></text>
<rect
y="280.94473"
x="214.8073"
height="17.436268"
width="85.224915"
id="rect10748"
style="fill:#e6e6e6;stroke:#333333;stroke-width:0.73632592" />
<text
id="text10750"
y="292.59448"
x="223.78571"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="292.59448"
x="223.78571"
id="tspan10752"
sodipodi:role="line">frame header</tspan></text>
<rect
style="fill:#e6e6e6;stroke:#333333;stroke-width:0.82800001;stroke-miterlimit:4;stroke-dasharray:none"
id="rect10754"
width="244.01871"
height="16.944351"
x="303.05325"
y="281.19067" />
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="311.78571"
y="292.59448"
id="text10756"><tspan
sodipodi:role="line"
id="tspan10758"
x="311.78571"
y="292.59448">frame payload</tspan></text>
<rect
style="opacity:1;fill:#666666;stroke:#666666;stroke-width:0.82800001000000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
id="rect10760"
width="18.940361"
height="11.364216"
x="410.37448"
y="283.97" />
<text
xml:space="preserve"
style="font-size:9.07078075px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="453.86386"
y="265.82956"
id="text10762"
transform="scale(0.9070781,1.1024409)"><tspan
sodipodi:role="line"
id="tspan10764"
x="453.86386"
y="265.82956">XXX</tspan></text>
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="303.55084"
y="143.55879"
id="text10768"><tspan
sodipodi:role="line"
id="tspan10770"
x="303.55084"
y="143.55879">too big gap causes TX FIFO underrun -&gt; TX_UNDERRUN error is issued</tspan><tspan
sodipodi:role="line"
x="303.55084"
y="156.05879"
id="tspan10772">for HP frames data must be sent CONTINUOUSLY</tspan></text>
<path
sodipodi:nodetypes="cssss"
id="path10774"
d="M 123.89603,171.72124 C 140.21547,175.68411 159.26323,181.15723 172.38335,189.90398 C 176.92458,192.93146 186.21535,203.29588 190.5661,209.09688 C 196.03581,216.38983 197.4476,223.49092 199.65747,232.33039 C 203.19538,246.48201 205.71839,257.21748 205.71839,271.09499"
style="opacity:1;fill:none;fill-rule:evenodd;stroke:#008000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
<text
id="text10776"
y="154.98737"
x="75.122269"
style="font-size:10px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan10782"
x="75.122269"
y="154.98737">unique 16-bit frame tag value</tspan><tspan
sodipodi:role="line"
id="tspan10784"
x="75.122269"
y="167.48737">to recover the timestamp</tspan></text>
<path
sodipodi:type="arc"
style="opacity:1;fill:none;stroke:#008000;stroke-width:0.828;stroke-miterlimit:4;stroke-dasharray:0.828,1.656;stroke-dashoffset:0"
id="path10786"
sodipodi:cx="326.42856"
sodipodi:cy="395.88019"
sodipodi:rx="18.571428"
sodipodi:ry="22.5"
d="M 344.99999,395.88019 A 18.571428,22.5 0 1 1 307.85713,395.88019 A 18.571428,22.5 0 1 1 344.99999,395.88019 z" />
<path
sodipodi:nodetypes="cssss"
id="path10788"
d="M 257.89696,618.16651 C 241.57752,608.37425 222.52976,594.85019 209.40964,573.23697 C 204.86841,565.75608 195.57764,540.14561 191.22689,525.81134 C 185.75718,507.79048 184.34539,490.24368 182.13552,468.40137 C 178.59761,433.43274 176.0746,406.9054 176.0746,372.61409"
style="opacity:1;fill:none;fill-rule:evenodd;stroke:#008000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-start:none;marker-end:url(#Arrow1Mend);stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="73.122269"
y="120.98737"
id="text10790"><tspan
y="120.98737"
x="73.122269"
id="tspan10794"
sodipodi:role="line">goes high when we have outputted</tspan><tspan
y="133.48737"
x="73.122269"
sodipodi:role="line"
id="tspan10798">at leas 64 bytes</tspan></text>
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="537.49127"
y="207.45096"
id="text10800"><tspan
sodipodi:role="line"
id="tspan10802"
x="537.49127"
y="207.45096">CRC</tspan></text>
<text
id="text10804"
y="292.59448"
x="433.78571"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="292.59448"
x="433.78571"
id="tspan10806"
sodipodi:role="line">rest of frame payload</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 125.58227,470.34625 L 539.80333,470.34625 L 539.80333,453.07642 L 546.11678,453.07642 L 546.11678,470.34625 L 657.60931,470.34625"
id="path10808"
sodipodi:nodetypes="cccccc" />
<path
id="path10810"
d="M 35,472.80877 L 1034.2857,472.80877"
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#cccccc;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35,492.80877 L 1034.2857,492.80877"
id="path10812" />
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#999999;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="622.24878"
y="207.70348"
id="text10818"><tspan
sodipodi:role="line"
id="tspan10820"
x="622.24878"
y="207.70348">(idle)</tspan></text>
<path
sodipodi:nodetypes="cc"
id="path10824"
d="M 120.46069,490.23907 L 657.60931,490.23907"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="356.28571"
y="505.52304"
id="text10826"><tspan
sodipodi:role="line"
id="tspan10828"
x="356.28571"
y="505.52304">don't care</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 120.46069,532.23907 L 657.60931,532.23907"
id="path10830"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
id="path10832"
d="M 120.46069,552.23907 L 657.60931,552.23907"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
id="text10836"
y="567.52307"
x="356.28571"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="567.52307"
x="356.28571"
id="tspan10838"
sodipodi:role="line">don't care</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.99999998, 1.00000001;stroke-dashoffset:0;stroke-opacity:1"
d="M 165.41249,381.95479 L 165.41249,365.28728 L 234.70039,365.03474 L 234.70039,381.95479"
id="path10842" />
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="179.30208"
y="375.38879"
id="text10844"><tspan
sodipodi:role="line"
id="tspan10846"
x="179.30208"
y="375.38879" /></text>
<text
id="text10848"
y="618.13025"
x="263.12228"
style="font-size:10px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"
sodipodi:linespacing="125%"><tspan
id="tspan10852"
sodipodi:role="line"
x="263.12228"
y="618.13025">Should be '1' when rx_frame_stb_i is 1 to transmit HP frame.</tspan><tspan
sodipodi:role="line"
x="263.12228"
y="630.63025"
id="tspan10856">TX_preemptible_o, tx_fragment_i, tx_continue_i are ignored in this case.</tspan></text>
</g>
</svg>
Switch endpoint spec
Tomasz Wlostowski, 2009/04/13
ver 0.0.1
--------------------------------------
TOC:
--------
0. Introduction
1. General idea
2. Block diagram
2.1. RX path
2.2. TX path
2.3. Endpoint controller
2.4. Generic parameters
3. Interface description
3.0. Common/miscellanous signals
3.1 PHY interface
3.2. Host (switch fabric) interface
3.3. RTI (Routing Table Interface).
3.4. Wishbone system bus
4. Registers
4.0. EPx_RST - Endpoint reset register
4.1. EPx_CTL - Endpoint control registers:
4.2. EPx_STAT - Endpoint status register
4.3. EPx_IER - Endpoint interrupt enable register
4.4. EPx_ISR - Endpoint interrupt status register
4.5. EPx_ACT_CTL - Endpoint statistics accounting control register
4.6. EPx_ACT_CNTR_xxx - Endpoint statistics counter register family
4.7. EPx_TX_TS_FIFO_STATUS - Endpoint TX timestamping block FIFO status register
4.8. EPx_TX_TS_FIFO_TAG - Endpoint TX timestamping unit frame tag register
4.9. EPx_TX_TS_FIFO_TSVAL - Endpoint TX timestamping unit timestamp value register
4.10. EPx_TX_LCR - TX Link Control Register value register
4.11. EPx_RX_LCR - RX Link Control Register value register
0. Introduction
I wrote part of this stuff being in hospital, drugged a little bit with analgesics. So, if you find this document stupid/crazy/immature, don't hestitate to give some feedback :) Also, let me apologize for the quality of diagrams, they were drawn on my laptop using touchpad. The diagrams show my personal vision of the design. You don't have to use the exact structure I've proposed, just try to keep the interfaces compatible with descriptions. If something is left unexplained, do it as you wish - or ask me if you have any doubts.
1. General idea
Switch endpoint block implements some functionality of typical Ethernet MAC + some WR-specific extensions, like timestamping, fragmentation and HP/SP frames. Frames are passed from/to Host (Switch Fabric Interface). The endpoint also performs initial frame header analysis, distinguishes HP, SP, fragmented/contiunation frames. Parsed header data is passed via RTI to Routing Table Unit.
2. Block diagram
The general block diagram is on fig.1. It can be split into 3 parts:
2.1. Upper part contains the RX path. It gets the raw data from PHY, decodes it, checks the alignment using both 8b10b decoder and PHY sync/pass line. Decoded data is then transferred to main switch clock (refclk_i) domain using clock alignment FIFO.
Then RX data is passed to RX deframer. Purpose of this block is to:
- decode (8b10b) data stream
- detect frame preambles, headers, CRCs
- check frame integrity (FCS, header CRC32 for HP)
- detect frame type: SP, HP, unicast, multicast, broadcast
- parse frame headers (extract src/dst address, ethertype, HP flags, VLAN id/priority) and pass the data to Routing Table Interface).
- timestamp received packets and pass the timestamp and source-port ID data to Switch Fabric i/f
There is also separate preamble detection block, operating in parallel to RX deframer in phy_rbclk_i clock domain. Its purpuse is to generate trigger signal for taking precise RX timestamps.
2.2. Lower part of image shows the TX path. Its purpose is to:
- take high-level frame data
- encapsulate it, calculate all necessary checksums, add preamble, SFDs, EPDs, optional carrier extension
- encode with 8b10b
- be able to interrupt frame currently being transmitted.
- timestamp certain packets and record the timestamps.
Output data stream is then eventually passed though clock alignment FIFO (of same structure as one in RX path) and 8b-10b encoded. TX alignment FIFO is optional, and it should be possible to enable/disable it in entity parametrs. In case of downlink endpoint we don't need it at all, as the PHY is clocked with refclk_i. Uplink PHYs may be clocked both using compensated REFCLK or with loopbacked RBCLK - in this case alignment logic is necessary.
Note for RX FIFO:
For nonsynchronous mode it should compensate for local/remote frequency difference (~64 bytes should be enough for that) and during inter-frame gap, RX framing logic should purge it to avoid overflows.
For sync mode it should ONLY compensate for phase shift between refclk_i and phy_rbclk_i, not introducing any excessive delay, as it may affect determinism of switch for HP frames.
2.3. Center part contains Wishbone bus slave allowing for access to endpoint registers and timestamping unit.
Timestamping unit gathers both RX and TX timestamps, using counter clocked by refclk_i. Timestamps are gathered upon detection of SFD in data stream. Timestamps should be taken on both refclk_i edges (or you can use counter running at 2*refclk_i freq - it's up to you to decide) - see drawing 2 for explanation.
2.4. Generic parameters
Only one :)
- TX_PATH_CLK_SOURCE: allowing for selection of clock for PHY transmit path between rbclk_i and refclk_i
3. Interface description
This section contains descriptions of interface signals.
3.0. Common/miscellanous signals
- refclk_i - 125 MHz reference clock input. Master clock for entire switch.
- refclk2_i - 62.5 MHz reference clock (refclk/2, phase-aligned). Master clock for host interface and Wishbones
- rst_n_i - global switch reset input (active low). Resets all endpoint logic
- rst_ts_n_i - ASYNCHRONOUS reset of endpoint's timestamp counter. Active low.
- pps_i - PPS signal input, synchronous to refclk_i. Rising edge resets timestamp counters.
3.1 PHY interface
Endpoint block should primarily support TLK1221 GbE PHY from Texas Instruments. As most fiber PHYs are quite similar to each other, it shouldn't be very difficult to port endpoint design to use another chip. PHY interface uses following signals: (for detailed documentation, see TLK1221 datasheet)
TEMPLATE: signal_name [bus range] <clock domain>, driven by: block - description
PHY TX path:
- phy_td_o [9:0] <refclk_i/phy_rbclk_i>, driven by: TX path 8b10b-encoder
PHY transmit data, 8b10b-encoded.
- phy_enable_o <refclk_i/phy_rbclk_i>, driven by: EPx_CTL register, bit PHY_EN
PHY enable signal, active high during normal PHY operation
- phy_syncen_o <refclk_i/phy_rbclk_i>, driven by: EPxCTL register, bit PHY_SYNCEN
PHY synchronization logic enable. High level enables internal comma detection and channel alignment stuff
in PHY. It should be held high during normal operation.
- phy_loopen_o <refclk_i/phy_rbclk_i>, driven by: EPxCTL register, bit PHY_LOOPEN
PHY loopback mode enable. Active high, normally should be driven low (used for testing/initialization
purposes)
- phy_prbsen_o <refclk_i/phy_rbclk_i>, driven by: EPxCTL register, bit PHY_PRBSEN
PHY pseudo-random bit sequence generator enable. Active high, normally should be driven low (used for
testing/initialization purposes)
PHY RX path:
- phy_rbclk_i <clock signal>, driven by: PHY RBCLK0 output
Byte clock recovered from received Ethernet data stream.
- phy_rd_i <phy_rbclk_i>, driven by: PHY RDx outputs
Received raw data stream, 8b10b-encoded, comma-aligned.
- phy_sync_pass_i <phy_rbclk_i (check the doc)>, driven by: PHY SYNC/PASS pin
PHY sync detect signal (see TLK1221 datasheet for details)
3.2. Host (switch fabric) interface
This interface connects the endpoint with switch fabric (commutation field) and packet buffer/scheduler logic.
RX path signals (all synchronous to refclk2_i):
- rx_enable_i, driven by: fabric i/f
'1' enables reception operation. When it's asserted high in the middle of the frame, endpoint should start reception operation with the next
incoming frame.
- rx_frame_stb_o, driven by: RX deframer
RX frame strobe signal, indicating beginning of reception of ethernet frame. It's asserted 1 for single
REFCLK cycle upon detection of valid preamble and SFD.
- rx_data_o [15:0], driven by: RX deframer
Received data bus. Outputs entire frame data, starting from DST MAC and ending with FCS value and
additional out-of-band data. To reduce the fabric clock for easier FPGA implementation, single clock cycle allows for transferring
two bytes of frame data. First byte is MSB, the second one - LSB.
- rx_data_bytesel_o, driven by: RX deframer
'1' Indicates single byte transfer on rx_data_o. May occur only at the end of block of data (e.g. frame, header, tag or OOB).
Transferred byte is the MSB of rx_data_o.
- rx_data_valid_o, driven by: RX deframer
'1' indicates that current byte on rx_data_o is valid frame byte.
- rx_hdr_begin_stb_o, driven by: RX deframer
RX header begin strobe signal. Asserted hi for one REFCLK cycle when the deframer detects beginning of frame header.
- rx_hdr_done_stb_o, driven by: RX deframer
RX header done strobe signal. Asserted hi for single REFCLK cycle after RX deframer has parsed frame
headers and outputted them to rx_data_o. Along with assertion of this signal, rx_is_hp_o, rx_hp_flags_o, rx_is_fragmented_o,
rx_is_frag_cont_o, rx_is_pause_o, rx_is_unicast_o, rx_is_multicast_o, rx_is_broadcast_o are set to proper
values. The data passed afterwards to rx_data_o is frame payload data.
- rx_oob_begin_stb_o, driven by: RX deframer
RX out-of-band data begin strobe signal. Asserted hi for one REFCLK cycle after all the frame payload data (with FCS)
has been outputted to rx_data_o bus and RX deframer is about to send source port ID and reception timestamp to Switch fabric i/f.
- rx_oob_done_stb_o, driven by: RX deframer
RX out-of-band data end strobe signal. Asserted hi for one REFCLK cycle upon sending source port ID and RX timestamp to rx_data_o.
- rx_done_stb_o, driven by: RX deframer
RX done strobe signal. Asserted hi for one REFCLK cycle upon reception of entire frame (with header/OOB data).
- rx_idle_o, driven by: RX deframer
RX path idle signal, active hi if RX path is not doing anything interesting (when it's receiving commas or
link idle pattern )
- rx_sync_o, driven by: RX deframer, sync detect logic
RX sync signal. Derived from phy_sync_pass_i and by checking correctness of phy_rd_i by 802.x-compliant
sync FSM. High state means link is synchronized. When de-synchronization occurs during frame reception,
operation is aborted and error code shall be issued. When rx_sync_o is low, RX deframer may not output any
data to fabric interface.
- rx_error_stb_o, driven by: RX deframer
RX error signal. Asserted hi for 1 REFCLK cycle along with rx_done_stb_o if an error has been
detected. Detection of error causes immediate abort of reception operation. Along with assertion of
rx_error_o, error code shall be output on rx_error_code_o.
- rx_error_code_o, driven by: RX deframer
RX error code. Asserted along with rx_error_o. Proposed error codes are below:
type t_mac_rx_error_code is std_logic_vector(3 downto 0);
constant c_RXERR_INVALID_CRC: t_mac_rx_error_code := "0000";
constant c_RXERR_ENCODING_ERROR: t_mac_rx_error_code := "0001";
constant c_RXERR_FRAME_TOO_LONG: t_mac_rx_error_code := "0010";,
constant c_RXERR_FRAME_TOO_SHORT: t_mac_rx_error_code := "0011";,
constant c_RXERR_INVALID_HEADER: t_mac_rx_error_code := "0100";
constant c_RXERR_GAP_VIOLATION: t_mac_rx_error_code := "0101";
constant c_RXERR_HP_HEADER_INVALID: t_mac_rx_error_code := "0110";
constant c_RXERR_LINK_OUT_OF_SYNC: t_mac_rx_error_code := "0111";
RX frametype signals:
- rx_is_hp_o, driven by: RX deframer
High state means that current frame contains valid HP header. It's asserted along with rx_hdr_done_stb_o.
- rx_hp_flags_o, driven by: RX deframer
Value of hp_flags field extracted from HP frame header.
- rx_is_fragmented_o, driven by: RX deframer
High state means that current frame has been fragmented (e.g. broken frame marker has been detected).
Signal is asserted along with rx_done_stb_o.
- rx_is_frag_cont_o, driven by: RX deframer
Hi state indicates that currently received frame contains SP frame continuation header. Asserted along with
rx_hdr_done_stb_o.
- rx_is_pause_o, driven by: RX deframer
Hi state indicates that we've just received PAUSE frame. Delay value extracted from frame shall be
outputted to rx_pause_count_o.
- rx_pause_count_o [15:0], driven by: RX deframer
Value of pause interval.
- rx_is_unicast_o: driven by: RX deframer
- rx_is_multicast_o: driven by: RX deframer
- rx_is_broadcast_o: driven by: RX deframer
'1' means that frame is unicast/multicast/broadcast frame. Asserted along with rx_hdr_done_stb_o.
TX path signals (all synchronous to refclk2_i)
- tx_data_i[15:0], driving: TX framer.
Transmit path data input. Should contain full frame data (WITHOUT preamble, SFD and FCS, which are added by TX framer).
- tx_data_bytesel_i, driving: TX framer.
'1' Indicates single-byte transfer on tx_data_i. Transmitted byte is placed on tx_data_i[15:8] (MSB).
- tx_enable_i, driving: TX framer, 8b10b encoder, etc.
TX path enable. Active high.
- tx_frame_stb_i, drives: TX framer.
RX frame strobe signal, Should be asserted for single REFCLK cycle in order to start transmission of the
frame. Upon assertion, TX framer begins transmission of preamble, SFD, headers. Frame data should be
supplied on tx_data_i when tx_input_ready goes high.
- tx_oob_begin_i, drives: TX framer
Single REFCLK-long '1' indicates beginning of out-of-band data for this frame (e.g. frame tag value).
- tx_oob_end_i, drives: TX framer
Single REFCLK-long '1' indicates end of out-of-band data for this frame (e.g. frame tag value).
- tx_input_ready_o: driven by: TX framer.
TX framer input ready - '1' means that TX framer is ready to accept data ib tx_data_i.
- tx_data_valid_i: driving TX framer.
TX input data byte valid. '1' means that byte currently transferred on tx_data_i is valid frame byte. Since TX framer contains small (~16
byte) FIFO, we can suspend frame data during frame transmission for few clock cycles by driving this signal low.
- tx_idle_o, driven by: TX framer.
Active '1' when TX framer is not transmitting anything. Goes '1' after transmission of the frame and 12-
byte inter-frame gap. Goes '0' upon assertion of tx_frame_stb_i.
- tx_is_hp_i, drives: TX framer.
Asserted with tx_frame_stb_i. '1' means that we want to transmit HP frame, bypassing FIFOs. HP frame data
shall be sent immediately when tx_input_ready goes high in single block.
- tx_preemptible_o, driven by: TX framer
Asserted '1' when frame is long enough (e.g. it fits the min. 64-byte requirement) to be fragmented.
When it's 0 you can only abort the frame and retransmit it later.
- tx_fragment_i, drives: TX framer.
Assertion '1' for single refclk_i cycle during frame transmission causes the frame to be fragmented.
TX framer should generate proper markers and CRC + IFG. TX framer should store necessary data
(previous fragment CRC and last transmitted byte offset).
- tx_continue_i, drives: TX framer.
Assertion '1' for single refclk_i cycle along with rx_frame_stb_i causes TX framer to generate continuation
SP frame. When tx_input_ready goes high, host interface should continue sending frame data starting at previous offset.
- tx_end_frame_i: drives TX framer.
Assertion '1' for single refclk_i cycle tells the TX framer that we're done sending frame data. TX framer
shall then generate proper CRC and IFG, then go idle.
- tx_send_pause_i: drives TX framer.
Assertion '1' for single refclk_i cycle along with rx_frame_stb_i causes TX framer to send 802.x PAUSE frame
with counter value supplied by tx_pause_count_i input.
- tx_pause_count_i[15:0]: drives TX framer.
Value of pause interval.
- tx_abort_i, drives: TX Framer.
TX abort input. Immediately aborts currently transmitted frame, with INVALID FCS.
- tx_error_stb_o, driven by: TX framer
TX error signal. Asserted hi for 1 REFCLK cycle if an error has been
detected. Detection of error causes immediate abort of transmit operation (generating frame with invalid FCS)
Along with assertion of tx_error_o, error code shall be output on tx_error_code_o.
- tx_error_code_o, driven by: TX framer
TX error code. Asserted along with tx_error_o. Proposed error codes are below:
type t_mac_tx_error_code is std_logic_vector(3 downto 0);
constant c_TXERR_LINK_OUT_OF_SYNC: t_mac_rx_error_code := "0000";
constant c_TXERR_BUFFER_UNDERRUN: t_mac_rx_error_code := "0001"; -- TX buffer underrun error (e.g. FIFO is empty in the middle of
-- transmission of the frame
3.3. RTI (Routing Table Interface).
This i/f is used by endpoints to send frame header data to Routing Table Unit. RTU then takes the decision
where (and sometimes, when) to send the frame. RTU contains independent port (with cache) for each RTI interface.
RTI signals (all synchronous to refclk_i)
- rti_idle_i, driven by: RTU
'1' means that RTU port is idle and ready to accept RTU request.
- rti_rq_begin_o, driven by: endpoint
Assertion '1' for single refclk_i cycle indicates beginning of new RTU request. After then, endpoint shall
send the parsed frame header data on rti_data_o and rti_field_o lines.
- rti_data_o [7:0], driven by: endpoint
- rti_field_o [6:0] , driven by: endpoint
RTU request data. rti_field_o contains address of current header field (e.g 0000 = 1st byte of
destination MAC, 1000 = first byte of SRC mac, etc....), rti_data_o contains the value.
- rti_data_valid_o, driven by: endpoint
'1' indicates that current data on rti_data_o and rti_field_o is valid.
- rti_rq_done_o, driven by: endpoint
Assertion '1' for single refclk_i cycle indicates an end of RTU request. After some clock cycles RTU shall
respond with routing decision.
3.4. Wishbone system bus
Wishbone bus is used for accessing endpoint register. It's a
standard Wishbone interface with two interrupt lines. WB bus is
synchronous to refclk2_i.
Additional IRQ lines:
- sys_irq_o: '1' indicates pending interrupt request.
- sys_irq_ack_i: '1' indicates that interrupt controller has received the interrupt request. When endpoint
sees this signal asserted, it shall de-assert it's sys_irq_o output.
4. Registers.
There is no strict register map. Detailed addresses and bit offsets have to be agreed between H/W module designer and driver developer.
My proposal is following:
4.0. EPx_RST - Endpoint reset register
(w/o) Writing anything to EPx_RST register causes immediate software reset of all endpoint logic.
4.1. EPx_CTL - Endpoint control registers:
Bit fields:
(r/w) EPCTL_ENABLE - enable TX/RX path (active 1, value '0' overrides fabric i/f signals tx_enable_i and rx_enable_i)
(r/w) EPCTL_PHYEN, EPx_SYNCEN, EPx_PRBSEN, EPx_LOOPEN - PHY control signals (GPIO)
(r/w) EPCTL_TX_CARRIER_EXT_EN - '1' enables carrier extension feature for transmitted frames
(r/w) EPCTL_RX_JUMBO_EN - enable reception of jumbo frames (e.g. > 1518-byte frame length will not cause an error)
(r/w) EPCTL_RX_RUNT_EN - enable reception of runt frames (e.g. < 64-byte frame length will not cause an error)
(r/w) EPCTL_RX_FIFO_PURGE - writing 1 immediately purges clock alignment FIFOs.
(w/o) EPCTL_LCR_SEND_EN - writing '1' causes EPx_TX_LCR register to be sent to remote endpoint using 802.x Send Config Register pattern. EPSTAT_LCR_SENT bit must be cleared. Upon transmission, EPSTAT_LCR_SENT bit is set to '1'.
(w/o) EPCTL_LCR_RECV_EN - writing '1' enables reception of LCR register. EPSTAT_LCR_RCVD bit must be cleared. The received value is stored in EPx_RX_LCR register. After then, EPSTAT_LCR_RCVD bit is set to '1'.
(r/w) EPCTL_TX_TS_EN - writing '1' enables TX packet timestamping. Packets are timestamped only if OOB block is present at the beginning of TX frame.
(r/w) EPCTL_RX_TS_EN - writing '1' enables RX packet timestamping. When enabled, OOB block is appended to RXed frame.
4.2. EPx_STAT - Endpoint status register
Bit fields:
(r/o) EPSTAT_SYNCED - link is initialized and synchronized (active 1)
(r/o) EPSTAT_CARRIER - carrier is present (active 1)
(r/o) EPSTAT_SYNCMODE - clock sync detected (probably we have synchronous mode, active 1)
(r/w) EPSTAT_LCR_SENT - Link Control Register has been sent. Writing '1' clears this bit.
(r/w) EPSTAT_LCR_RCVD - Link Control Register has been received. Writing '1' clears this bit.
4.3. EPx_IER - Endpoint interrupt enable register
Bit fields:
(r/w) EPSTAT_IRQ_LINK - link status changed interrupt (active 1, write 1 to clear)
(r/w) EPSTAT_IRQ_TX_TS - TX timestamp gathered interrupt
4.4. EPx_ISR - Endpoint interrupt status register
Bit fields:
(r/w) EPSTAT_IRQ_LINK - link status changed interrupt stauts, active '1'. Writing '1' clears the flag and acknowledges the interrupt.
(r/w) EPSTAT_IRQ_TX_TS - TX timestamp gathered interrupt, active '1'. Writing '1' clears the flag and acknowledges the interrupt.
4.5. EPx_ACT_CTL - Endpoint statistics accounting control register
Bit fields:
EPCTL_ACT_RXERR_RST
EPCTL_ACT_TXERR_RST
EPCTL_ACT_FRAG_RST
EPCTL_ACT_HP_DROP_RST
EPCTL_ACT_HP_COLLIDE_RST ^^^^^^^^^^^^^^^^^
EPCTL_ACT_FRAG_COUNT_RST - writing '1' to these bits causes reset of respective event counters
4.6. EPx_ACT_CNTR_xxx - Endpoint statistics counter register family
Registers:
EPx_ACT_RXERR_CNT - number of packets received with errors
EPx_ACT_TXERR_CNT - number of packets transmitted with errors (e.g. aborted, buffer underruns, etc)
EPx_ACT_FRAG_CNT - number of fragmentation events
EPx_ACT_HP_DROP_CNT - number of dropped HP frames
EPx_ACT_HP_COLLIDE_CNT - number of HP collisions detected
EPx_ACT_FRAG_COUNT_RST - max. number of fragments of single frame transmitted by endpoint.
4.7. EPx_TX_TS_FIFO_STATUS - Endpoint TX timestamping block FIFO status register
Bit fields:
(r/o) EPx_TX_TS_FIFO_COUNT[4:0] - amount of timestamps in FIFO.
(w/o) EPx_TX_TS_FIFO_ADVANCE - writing '1' causes advancing to next gathered timestamp in FIFO. It's data will be available in TAG and TSVAL registers.
4.8. EPx_TX_TS_FIFO_TAG - Endpoint TX timestamping unit frame tag register. Contains tag value from OOB block of timestamped frame.
4.9. EPx_TX_TS_FIFO_TSVAL - Endpoint TX timestamping unit timestamp value register. Contains timestamp coutnter value of frame with tag stored in EPx_TX_TS_FIFO_TAG register.
In order to read TX timestamps, CPU has to.
- check EPx_TX_TS_FIFO_STATUS reg to determine if any frames have been timestamped.
- read TAG and TSVAL registers.
- write '1' to TS_FIFO_ADVANCE bit in order to proceed to next tag-timestamp pair.
For detailed description, see the Timestamping Architecture document.
4.10. EPx_TX_LCR - TX Link Control Register value register
Bit fields:
(r/w) EPx_TX_LCR_VAL[15:0] - Contains value of LCR register to be sent during 802.x link negotiation procedure.
4.11. EPx_RX_LCR - RX Link Control Register value register
Bit fields:
(r/o) EPx_RX_LCR_VAL[15:0] - Contains value of LCR register received from remote endpoint during 802.x link negotiation procedure.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Creator: CorelDRAW -->
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="215.9mm" height="279.4mm" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
viewBox="0 0 215.9 279.4">
<defs>
<font id="FontID1" font-variant="normal" style="fill-rule:nonzero" font-style="normal" font-weight="700">
<font-face
font-family="Courier New">
</font-face>
<missing-glyph><path d="M0 0z"/></missing-glyph>
<glyph unicode="3" horiz-adv-x="600"><path d="M442.846 334.491c29.6577,-20.1616 51.8036,-43.4767 66.473,-70.158 14.6694,-26.5041 22.0041,-56.1619 22.0041,-89.0086 0,-35.5042 -9.81504,-68.3155 -29.1616,-98.5047 -19.3112,-29.9766 -47.339,-52.8311 -84.1542,-68.3155 -36.8507,-15.5198 -85.0046,-23.1734 -144.497,-23.1734 -77.4927,0 -135.851,12.0119 -174.828,36.1775 -21.8624,13.6418 -32.6695,29.9766 -32.6695,48.8272 0,14.3151 4.64177,26.5041 14.3151,36.3192 9.6733,10.0276 21.1891,15.0237 34.831,15.0237 9.49614,0 19.3466,-3.33073 29.3388,-9.85047 14.3505,-9.81504 27.8506,-16.3348 40.5003,-19.4883 19.6655,-4.6772 46.4886,-6.83864 80.6817,-6.83864 58.1461,0 100.312,7.51187 126.497,22.6773 25.9726,15.1655 38.9767,36.4964 38.9767,64.1698 0,20.4805 -7.47644,40.3232 -22.6419,59.3154 -15.1655,18.9923 -35.5042,33.8388 -60.8391,44.1854 -14.6694,5.81107 -39.331,9.9922 -74.162,12.3308 -16.6891,0.814967 -29.516,5.98824 -38.3389,15.3072 -9.00007,9.17724 -13.5001,20.6931 -13.5001,34.3349 0,14.3505 4.81894,26.5041 14.6694,36.1775 9.81504,9.85047 22.1458,14.6694 37.1696,14.6694 33.1656,0 50.8114,0.177167 53.15,0.496067 13.004,1.34647 26.0081,5.49217 39.0121,12.6851 13.004,7.15754 23.4923,16.9726 31.5002,29.4805 8.00794,12.6851 12.0119,25.512 12.0119,38.835 0,21.1537 -9.3544,39.5082 -28.0278,54.9926 -18.8151,15.5198 -46.8075,23.1734 -84.3314,23.1734 -48.1539,0 -85.0046,-13.9962 -110.339,-41.9885 -7.47644,-8.1851 -13.5001,-13.3584 -18.0001,-15.6615 -6.8032,-3.5079 -14.4922,-5.35044 -22.9962,-5.35044 -13.6418,0 -25.3348,4.81894 -35.1499,14.6694 -9.6733,9.85047 -14.6694,21.8269 -14.6694,36.1775 0,22.5002 14.9883,44.15 45.0004,65.3391 43.5122,30.9687 98.1504,46.4886 163.489,46.4886 61.8312,0 111.509,-17.6812 148.997,-52.8311 37.3468,-35.1853 56.1619,-77.4927 56.1619,-126.851 0,-25.8309 -5.66934,-49.8193 -16.6537,-72.1423 -10.9843,-22.1813 -27.6734,-42.8389 -49.8193,-61.6895z"/></glyph>
<glyph unicode="0" horiz-adv-x="600"><path d="M518.496 371.66l0 -109.985c0,-65.0202 -18.6734,-127.347 -56.339,-187.017 -37.6657,-59.4926 -91.3117,-89.3275 -161.328,-89.3275 -40.3232,0 -74.4809,8.8229 -102.332,26.6813 -27.8152,17.6458 -54.1776,50.4925 -79.1581,98.1504 -24.8388,47.6579 -37.3468,98.1858 -37.3468,151.513l0 109.985c0,64.6659 18.6734,126.993 56.1619,186.663 37.5239,59.8469 91.17,89.6818 161.186,89.6818 40.0043,0 73.9848,-8.8229 101.835,-26.327 27.8152,-17.6812 54.3193,-50.3508 79.477,-98.0086 25.3348,-47.6579 37.8428,-98.3275 37.8428,-152.009zm-100.489 0c0,54.3548 -15.1655,101.835 -45.4964,142.513 -17.1852,22.5002 -41.5279,33.6617 -72.6738,33.6617 -30.3309,0 -54.9926,-12.3308 -74.162,-37.1696 -29.0199,-37.3468 -43.5122,-83.6581 -43.5122,-139.005l0 -109.985c0,-54.6737 15.3426,-102.19 45.8508,-142.513 16.9726,-22.5002 41.1381,-33.6617 72.8155,-33.6617 29.8349,0 54.4965,12.3308 73.6659,36.9924 29.0199,37.5239 43.5122,83.8353 43.5122,139.182l0 109.985z"/></glyph>
<glyph unicode=":" horiz-adv-x="600"><path d="M375.487 376.515c0,-18.8505 -6.66147,-34.6892 -19.9844,-47.339 -13.3229,-12.8269 -31.8191,-19.1694 -55.1697,-19.1694 -23.4923,0 -41.8468,6.34257 -55.1697,19.1694 -13.3229,12.6497 -19.9844,28.4884 -19.9844,47.339 0,18.8151 6.66147,34.6538 19.9844,47.3035 13.3229,12.6851 31.6774,19.0277 55.1697,19.0277 23.3506,0 41.8468,-6.34257 55.1697,-19.0277 13.3229,-12.6497 19.9844,-28.4884 19.9844,-47.3035zm1.02757 -327.688c0,-18.8151 -6.6969,-34.6538 -20.0198,-47.339 -13.3229,-12.6497 -31.8191,-18.9923 -55.1697,-18.9923 -23.4923,0 -41.8114,6.34257 -55.1697,18.9923 -13.5001,12.6851 -20.1616,28.5238 -20.1616,47.339 0,18.8505 6.66147,34.6892 20.1616,47.339 13.3584,12.6497 31.6774,18.9923 55.1697,18.9923 23.3506,0 41.8468,-6.34257 55.1697,-18.9923 13.3229,-12.6497 20.0198,-28.4884 20.0198,-47.339z"/></glyph>
<glyph unicode="5" horiz-adv-x="600"><path d="M215.825 531.677l0 -119.021c37.1696,11.693 70.8313,17.5041 101.02,17.5041 61.654,0 112.643,-20.9765 153.32,-63.0005 40.6775,-41.9885 61.158,-96.1661 61.158,-162.497 0,-68.4927 -20.6576,-121.997 -61.8312,-161.009 -41.1736,-38.835 -104.316,-58.3233 -189.143,-58.3233 -75.0124,0 -134.186,14.1733 -177.84,42.52 -25.3348,16.2993 -38.02,34.9727 -38.02,56.1619 0,13.3229 4.9961,24.9805 14.8466,34.831 9.9922,9.9922 21.6498,14.9883 35.327,14.9883 11.5158,0 23.8466,-5.49217 37.1696,-16.3348 13.3229,-10.9843 27.3191,-18.4962 41.9885,-22.8191 20.8348,-6.1654 47.5161,-9.17724 80.1857,-9.17724 60.4847,0 101.835,9.6733 123.981,28.9845 22.1813,19.3466 33.1656,49.0043 33.1656,89.1857 0,39.331 -10.6654,70.3352 -31.9963,92.6582 -21.3309,22.5002 -48.65,33.6617 -82.3117,33.6617 -36.0003,0 -77.1738,-11.6576 -123.521,-35.0081 -10.3111,-5.6339 -19.4883,-8.32684 -27.3191,-8.32684 -14.3505,0 -26.327,5.17327 -35.8231,15.5198 -9.6733,10.4883 -14.5277,23.9884 -14.5277,40.6421l0 289.03 306.18 0c24.1655,0 41.3153,-4.6772 51.4847,-13.8544 10.3465,-9.31897 15.5198,-21.508 15.5198,-36.4964 0,-14.6694 -5.17327,-26.5041 -15.5198,-35.8231 -10.1694,-9.3544 -27.3191,-13.9962 -51.4847,-13.9962l-206.009 0z"/></glyph>
<glyph unicode="1" horiz-adv-x="600"><path d="M351.003 648.005l0 -547.835 101.162 0c23.9884,0 41.1736,-4.6772 51.4847,-13.9962 10.3465,-9.3544 15.3426,-21.3309 15.3426,-36.3546 0,-14.6694 -4.9961,-26.6459 -15.3426,-35.8231 -10.3111,-9.31897 -27.4963,-13.9962 -51.4847,-13.9962l-302.317 0c-24.0238,0 -41.1736,4.6772 -51.5201,13.9962 -10.1694,9.17724 -15.3426,21.3309 -15.3426,36.3546 0,14.634 5.17327,26.4687 15.3426,35.8231 10.3465,9.31897 27.4963,13.9962 51.5201,13.9962l101.162 0 0 417.334 -89.3275 -23.3506c-14.3505,-4.00397 -25.1931,-5.81107 -32.3506,-5.81107 -12.6497,0 -23.6695,4.9961 -32.8467,15.1655 -9.31897,9.9922 -13.9962,22.323 -13.9962,36.9924 0,13.3229 3.5079,23.8466 10.3465,31.5002 6.83864,7.6536 21.1537,14.4922 42.8389,20.3387l215.328 55.6658z"/></glyph>
<glyph unicode="]" horiz-adv-x="600"><path d="M251.01 -56.1619l0 587.839 -60.5202 0c-24.1655,0 -41.3153,4.64177 -51.4847,13.9962 -10.3465,9.31897 -15.5198,21.1537 -15.5198,35.8231 0,14.9883 5.17327,27.1774 15.5198,36.4964 10.1694,9.17724 27.3191,13.8544 51.4847,13.8544l160.513 0 0 -788.002 -160.017 0c-24.1655,0 -41.3153,4.50004 -51.6618,13.819 -10.1694,9.31897 -15.3072,21.3309 -15.3072,36.3192 0,14.6694 5.13784,26.6813 15.3072,36.0003 10.3465,9.17724 27.4963,13.8544 51.6618,13.8544l60.0241 0z"/></glyph>
<glyph unicode="[" horiz-adv-x="600"><path d="M349.16 531.677l0 -587.839 60.5202 0c24.1655,0 41.3153,-4.50004 51.4847,-13.6773 10.3465,-9.17724 15.3426,-21.1537 15.3426,-36.1775 0,-14.9883 -4.9961,-27.0002 -15.3426,-36.3192 -10.1694,-9.31897 -27.3191,-13.819 -51.4847,-13.819l-160.69 0 0 788.002 160.194 0c24.1655,0 41.3153,-4.6772 51.4847,-13.8544 10.3465,-9.31897 15.3426,-21.508 15.3426,-36.4964 0,-14.6694 -4.9961,-26.5041 -15.3426,-35.8231 -10.1694,-9.3544 -27.3191,-13.9962 -51.4847,-13.9962l-60.0241 0z"/></glyph>
<glyph unicode="_" horiz-adv-x="600"><path d="M577.174 -300.333l-549.855 0c-23.9884,0 -41.1381,4.6772 -51.4847,13.6773 -10.3465,9.1418 -15.3426,21.1537 -15.3426,36.142 0,15.0237 4.9961,27.1774 15.3426,36.3546 10.3465,9.31897 27.4963,13.9962 51.4847,13.9962l549.855 0c23.6695,0 40.8192,-4.6772 50.9886,-13.9962 10.3465,-9.17724 15.3426,-21.3309 15.3426,-36.3546 0,-14.6694 -4.9961,-26.6459 -14.9883,-35.8231 -10.1694,-9.31897 -27.3545,-13.9962 -51.3429,-13.9962z"/></glyph>
<glyph unicode="f" horiz-adv-x="600"><path d="M299.341 343.349l0 -243.179 142.477 0c24.1655,0 41.3507,-4.6772 51.5201,-13.9962 10.3111,-9.3544 15.4844,-21.3309 15.4844,-36.3546 0,-14.6694 -5.17327,-26.6459 -15.4844,-35.8231 -10.1694,-9.31897 -27.3545,-13.9962 -51.5201,-13.9962l-302.14 0c-24.1655,0 -41.3507,4.6772 -51.5201,13.9962 -10.3111,9.17724 -15.3072,21.3309 -15.3072,36.3546 0,14.634 4.9961,26.4687 15.3072,35.8231 10.1694,9.31897 27.3545,13.9962 51.5201,13.9962l59.4926 0 0 243.179 -47.835 0c-23.9884,0 -41.1736,4.50004 -51.5201,13.819 -10.1339,9.31897 -15.3072,21.3309 -15.3072,36.3192 0,14.6694 5.17327,26.6813 15.3072,36.0003 10.3465,9.17724 27.5317,13.8544 51.5201,13.8544l47.835 0 0 38.1617c0,43.5122 16.3348,79.8313 49.1461,108.674 32.6695,28.6656 80.1857,43.1578 142.336,43.1578 27.6734,0 59.6698,-2.51577 95.8472,-7.6536 36.3192,-5.03154 59.6698,-12.0119 69.8391,-21.1891 10.3111,-9.17724 15.4844,-20.8348 15.4844,-35.1499 0,-15.3426 -4.64177,-27.6734 -13.6418,-37.3468 -9.17724,-9.6733 -20.3387,-14.4922 -33.8388,-14.4922 -6.1654,0 -15.3426,1.1693 -27.6734,3.5079 -41.4925,8.14967 -77.9888,12.1536 -109.985,12.1536 -33.201,0 -56.0201,-4.9961 -68.5281,-14.8466 -12.4725,-9.9922 -18.8151,-22.1458 -18.8151,-36.8153l0 -38.1617 154.312 0c24.0238,0 41.1736,-4.6772 51.5201,-13.8544 10.1694,-9.31897 15.3426,-21.4726 15.3426,-36.4964 0,-14.4922 -5.17327,-26.5041 -15.3426,-35.8231 -10.3465,-9.31897 -27.4963,-13.819 -51.5201,-13.819l-154.312 0z"/></glyph>
<glyph unicode="b" horiz-adv-x="600"><path d="M173.836 633.336l0 -224.683c24.3427,16.0159 49.1815,28.0278 74.4809,35.8586 25.1931,7.9725 50.6697,11.9765 76.3589,11.9765 69.3076,0 128.162,-23.8112 176.316,-71.6462 48.1894,-48.0122 72.1777,-105.662 72.1777,-173.34 0,-64.843 -22.8191,-118.985 -68.847,-162.497 -45.8153,-43.335 -106.335,-65.1619 -181.49,-65.1619 -26.823,0 -52.5122,3.5079 -77.1738,10.3111 -24.8388,6.83864 -48.65,16.8308 -71.8234,30.1892l0 -24.3427 -117.178 0c-24.1655,0 -41.3153,4.6772 -51.4847,13.9962 -10.3465,9.17724 -15.5198,21.3309 -15.5198,36.3546 0,14.634 5.35044,26.4687 15.697,35.8231 10.4883,9.31897 27.4963,13.9962 51.3075,13.9962l17.008 0 0 432.996 -17.008 0c-24.1655,0 -41.3153,4.6772 -51.4847,13.9962 -10.3465,9.17724 -15.5198,21.3309 -15.5198,36.3546 0,14.634 5.17327,26.6459 15.5198,35.8231 10.1694,9.31897 27.3191,13.9962 51.4847,13.9962l117.178 0zm299.341 -424.846c0,41.3507 -14.5277,76.3589 -43.5122,105.024 -28.9845,28.6656 -64.4887,42.9807 -106.513,42.9807 -41.6696,0 -76.8195,-14.3151 -105.804,-42.9807 -29.0199,-28.6656 -43.5122,-63.1777 -43.5122,-103.501 0,-36.8507 13.004,-67.0045 39.0121,-90.6739 26.1498,-23.4923 62.8233,-35.327 110.304,-35.327 47.6933,0 84.5085,11.8347 110.694,35.327 26.1498,23.6695 39.331,53.3272 39.331,89.1503z"/></glyph>
<glyph unicode="i" horiz-adv-x="600"><path d="M336.014 633.336l0 -106.017 -119.198 0 0 106.017 119.198 0zm13.6418 -189.994l0 -343.172 120.013 0c24.1655,0 41.3153,-4.6772 51.4847,-13.9962 10.3465,-9.3544 15.5198,-21.3309 15.5198,-36.3546 0,-14.6694 -5.17327,-26.6459 -15.5198,-35.8231 -10.1694,-9.31897 -27.3191,-13.9962 -51.4847,-13.9962l-340.337 0c-23.9884,0 -41.1736,4.6772 -51.4847,13.9962 -10.1694,9.17724 -15.3426,21.3309 -15.3426,36.3546 0,14.634 5.17327,26.4687 15.3426,35.8231 10.3111,9.31897 27.4963,13.9962 51.4847,13.9962l120.154 0 0 243.179 -80.4691 0c-23.8466,0 -40.8547,4.50004 -51.3429,13.819 -10.3465,9.31897 -15.6615,21.3309 -15.6615,36.3192 0,14.6694 5.13784,26.6813 15.4844,36.0003 10.1694,9.17724 27.3191,13.8544 51.5201,13.8544l180.639 0z"/></glyph>
<glyph unicode="e" horiz-adv-x="600"><path d="M551.343 170.824l-410.673 0c10.3465,-26.0081 28.8427,-46.9846 55.3469,-63.0005 26.4687,-15.8387 62.469,-23.8112 107.647,-23.8112 37.1696,0 86.4928,7.9725 148.005,23.8112 25.3348,6.66147 42.9807,9.85047 52.654,9.85047 13.3584,0 24.6616,-4.6772 33.8388,-14.1733 9.00007,-9.49614 13.6773,-21.3309 13.6773,-35.6814 0,-12.9686 -4.9961,-23.9884 -14.6694,-33.1656 -13.004,-11.9765 -44.8232,-23.4923 -95.3511,-34.4766 -50.3154,-10.8426 -98.8236,-16.3348 -145.489,-16.3348 -80.0085,0 -144.001,22.6419 -192.155,67.9966 -48.0122,45.1775 -72.0006,100.843 -72.0006,166.997 0,70.158 26.0081,127.489 77.9888,171.497 51.839,44.15 111.686,66.1541 179.328,66.1541 40.6775,0 78.166,-7.15754 112.182,-21.4726 33.9806,-14.3505 59.3154,-29.6931 75.8274,-46.3468 23.4923,-23.9884 42.8389,-53.8233 58.1816,-89.3275 10.3111,-24.8388 15.6615,-53.3272 15.6615,-85.9967l0 -42.52zm-110.836 100.17c-15.3426,28.6656 -35.327,49.9965 -60.1658,64.1698 -24.6616,14.1733 -54.1776,21.3309 -88.3353,21.3309 -33.8388,0 -63.1777,-7.15754 -87.8393,-21.3309 -24.8388,-14.1733 -45.0004,-35.5042 -60.6619,-64.1698l297.002 0z"/></glyph>
<glyph unicode="l" horiz-adv-x="600"><path d="M350.152 633.336l0 -533.166 120.013 0c24.1655,0 41.3507,-4.6772 51.4847,-13.9962 10.3465,-9.3544 15.5198,-21.3309 15.5198,-36.3546 0,-14.6694 -5.17327,-26.6459 -15.5198,-35.8231 -10.1339,-9.31897 -27.3191,-13.9962 -51.4847,-13.9962l-340.337 0c-23.9884,0 -41.1736,4.6772 -51.4847,13.9962 -10.1694,9.17724 -15.3426,21.3309 -15.3426,36.3546 0,14.634 5.17327,26.4687 15.3426,35.8231 10.3111,9.31897 27.4963,13.9962 51.4847,13.9962l120.19 0 0 432.996 -80.5046 0c-23.8466,0 -40.9964,4.6772 -51.3429,13.9962 -10.4883,9.17724 -15.6615,21.3309 -15.6615,36.3546 0,14.634 5.17327,26.6459 15.4844,35.8231 10.1694,9.31897 27.3545,13.9962 51.5201,13.9962l180.639 0z"/></glyph>
<glyph unicode="c" horiz-adv-x="600"><path d="M455.992 425.342c12.1891,11.3387 24.5199,17.008 37.1696,17.008 14.3505,0 26.1852,-5.03154 35.327,-15.3426 9.3544,-10.3465 13.9962,-27.3545 13.9962,-51.024l0 -64.4887c0,-23.9884 -4.64177,-41.1736 -13.9962,-51.1658 -9.1418,-10.1694 -21.3309,-15.1655 -36.3192,-15.1655 -13.6773,0 -25.1577,3.8268 -34.6538,11.6576 -6.83864,5.8465 -12.1891,17.8584 -16.193,35.8586 -3.8268,18.1419 -13.3229,31.5002 -28.1695,40.3232 -26.4687,15.6615 -60.1658,23.4923 -101.162,23.4923 -47.1618,0 -85.0046,-13.819 -113.493,-41.4925 -28.4884,-27.6734 -42.6618,-62.6816 -42.6618,-104.989 0,-39.1893 13.6773,-70.0163 40.9964,-92.5165 27.3191,-22.6773 72.6738,-33.9806 136.17,-33.9806 41.6696,0 75.6502,4.1457 102.013,12.6497 15.6615,5.17327 30.4727,14.1733 44.4689,26.6813 14.0316,12.4725 26.6813,18.8151 38.02,18.8151 13.819,0 25.512,-5.17327 35.5042,-15.1655 9.81504,-10.1694 14.8111,-22.0041 14.8111,-35.6814 0,-22.1458 -15.1655,-43.1578 -45.3193,-62.9651 -45.0004,-29.6931 -110.658,-44.5043 -197.328,-44.5043 -77.8471,0 -138.332,16.1576 -181.667,48.3311 -58.5005,43.335 -87.8393,102.65 -87.8393,177.84 0,71.3273 23.8466,130.324 71.3273,176.99 47.5161,46.6657 109.524,69.9809 185.99,69.9809 27.6734,0 53.3626,-2.48033 77.1738,-7.83077 23.6695,-5.17327 45.6736,-13.004 65.8352,-23.3151z"/></glyph>
<glyph unicode="o" horiz-adv-x="600"><path d="M559.989 213.344c0,-38.3389 -10.6654,-75.5085 -31.9963,-111.509 -21.1537,-36.0003 -53.0083,-64.6659 -95.174,-85.9967 -42.1657,-21.3309 -86.1385,-31.9963 -131.989,-31.9963 -45.6736,0 -89.1503,10.4883 -130.82,31.5002 -41.6696,20.9765 -73.5242,49.6421 -95.3511,85.6424 -21.8269,36.1775 -32.6695,74.0203 -32.6695,113.351 0,40.0043 11.0198,79.3353 33.1656,117.993 22.1813,38.5161 54.0004,68.847 95.5283,90.9928 41.4925,22.1813 84.8274,33.1656 130.147,33.1656 45.4964,0 89.3275,-11.3387 131.493,-33.8388 42.1657,-22.6419 74.0203,-53.15 95.5283,-91.3117 21.4726,-38.3389 32.138,-77.6699 32.138,-117.993zm-99.9929 -0.496067c0,32.3152 -11.6576,61.8312 -34.6538,88.9731 -31.6774,36.3546 -73.1699,54.6737 -124.513,54.6737 -45.3193,0 -82.9849,-14.4922 -113.316,-43.5122 -30.3309,-28.9845 -45.3547,-62.469 -45.3547,-100.666 0,-31.1459 15.1655,-60.3076 45.8508,-87.4849 30.6498,-27.3191 68.1738,-40.8192 112.82,-40.8192 44.8232,0 82.666,13.5001 113.174,40.8192 30.6498,27.1774 45.9925,56.5162 45.9925,88.0164z"/></glyph>
<glyph unicode="a" horiz-adv-x="600"><path d="M390.157 0l0 23.4923c-25.1577,-13.3229 -52.8311,-23.4923 -82.9849,-30.1538 -30.3309,-6.66147 -57.8272,-9.9922 -82.4888,-9.9922 -53.8587,0 -97.3354,14.3151 -130.855,42.8035 -33.6617,28.5238 -50.3154,60.0241 -50.3154,94.5007 0,42.024 21.3309,80.8589 64.1698,116.859 42.8035,36.0003 101.977,54.0004 177.486,54.0004 30.3309,0 65.3391,-3.189 104.989,-9.85047l0 24.0238c0,14.9883 -6.4843,27.1419 -19.3112,36.6381 -12.8623,9.3544 -37.3468,14.1733 -73.5242,14.1733 -29.6577,0 -67.9966,-5.81107 -115.158,-17.6458 -17.6458,-4.18114 -31.3231,-6.34257 -40.9964,-6.34257 -13.3229,0 -24.6616,4.81894 -34.016,14.4922 -9.31897,9.49614 -13.819,21.8269 -13.819,36.8507 0,8.46857 1.4882,15.6615 4.81894,21.9687 3.189,6.1654 7.8662,11.0198 13.6773,14.8466 5.8465,3.68507 18.0001,8.1851 36.6735,13.5001 24.6616,6.83864 49.8193,12.1536 75.6502,16.3348 25.6892,4.00397 49.0043,5.98824 69.8391,5.98824 62.1855,0 110.339,-13.3229 144.674,-40.146 34.3349,-27.0002 51.4847,-63.6737 51.4847,-110.162l0 -206.009 17.1852 0c23.9884,0 41.3153,-4.6772 51.4847,-13.9962 10.3465,-9.3544 15.3426,-21.3309 15.3426,-36.3546 0,-14.6694 -4.9961,-26.6459 -15.3426,-35.8231 -10.1694,-9.31897 -27.4963,-13.9962 -51.4847,-13.9962l-117.178 0zm0 179.151c-40.0043,7.8662 -76.9967,11.8347 -110.836,11.8347 -40.6421,0 -75.6502,-9.9922 -104.989,-29.8349 -18.1773,-12.6497 -27.3191,-25.6537 -27.3191,-38.6578 0,-9.31897 4.32287,-17.008 13.1458,-22.8191 16.3348,-10.8426 38.5161,-16.1576 66.8273,-16.1576 24.1655,0 51.3429,4.64177 81.851,14.1379 30.5081,9.49614 57.5083,22.3584 81.3195,38.5161l0 42.9807z"/></glyph>
<glyph unicode="d" horiz-adv-x="600"><path d="M529.835 633.336l0 -533.166 17.008 0c23.8112,0 40.8192,-4.6772 51.3075,-13.9962 10.3465,-9.3544 15.697,-21.3309 15.697,-36.3546 0,-14.6694 -5.17327,-26.6459 -15.5198,-35.8231 -10.1694,-9.31897 -27.3191,-13.9962 -51.4847,-13.9962l-117.178 0 0 24.3427c-22.8191,-13.3584 -46.6657,-23.3506 -71.5045,-30.1892 -24.8388,-6.8032 -50.6697,-10.3111 -77.3156,-10.3111 -75.3313,0 -135.851,21.8269 -181.667,65.1619 -46.0279,43.5122 -68.847,97.6543 -68.847,162.497 0,67.6777 23.9884,125.328 72.1777,173.34 48.1539,47.835 107.009,71.6462 176.316,71.6462 26.0081,0 51.5201,-4.00397 76.6778,-11.9765 24.9805,-7.83077 49.8193,-19.8427 74.162,-35.8586l0 124.513 -17.008 0c-24.1655,0 -41.3153,4.6772 -51.4847,13.9962 -10.3465,9.17724 -15.5198,21.1891 -15.5198,35.8231 0,15.0237 5.17327,27.1774 15.5198,36.3546 10.1694,9.31897 27.3191,13.9962 51.4847,13.9962l117.178 0zm-100.17 -424.846c0,41.3507 -14.4922,76.3589 -43.5122,105.024 -28.8073,28.6656 -64.3115,42.9807 -106.335,42.9807 -41.6342,0 -76.9967,-14.3151 -105.981,-42.9807 -29.0199,-28.6656 -43.5122,-63.1777 -43.5122,-103.501 0,-36.8507 13.004,-67.0045 39.1893,-90.6739 25.9726,-23.4923 62.8233,-35.327 110.304,-35.327 47.1972,0 84.0125,11.8347 110.339,35.327 26.327,23.6695 39.5082,53.3272 39.5082,89.1503z"/></glyph>
<glyph unicode="p" horiz-adv-x="600"><path d="M175.82 55.1697l0 -163.986 60.0241 0c24.1655,0 41.3153,-4.6772 51.4847,-14.0316 10.3465,-9.1418 15.3426,-21.3309 15.3426,-36.3192 0,-14.6694 -4.9961,-26.6813 -15.3426,-35.8231 -10.1694,-9.3544 -27.3191,-13.9962 -51.4847,-13.9962l-177.167 0c-24.1655,0 -41.3507,4.64177 -51.6618,13.9962 -10.1694,9.1418 -15.3426,21.1537 -15.3426,35.8231 0,14.9883 5.17327,27.1774 15.6615,36.3192 10.3465,9.3544 27.4963,14.0316 51.3429,14.0316l16.9726 0 0 452.165 -16.9726 0c-24.1655,0 -41.3507,4.50004 -51.6618,13.819 -10.1694,9.31897 -15.3426,21.3309 -15.3426,36.3192 0,14.6694 5.17327,26.6813 15.3426,36.0003 10.3111,9.17724 27.4963,13.8544 51.6618,13.8544l117.143 0 0 -34.1577c23.3506,15.9804 47.6933,27.8152 72.6738,35.6459 25.1577,7.83077 50.8469,11.6576 77.1738,11.6576 68.3155,0 126.674,-23.138 174.828,-69.4848 48.1539,-46.4886 72.3549,-99.4968 72.3549,-159.486 0,-66.0123 -28.5238,-120.509 -85.5007,-163.525 -47.5161,-35.8231 -101.198,-53.6461 -160.69,-53.6461 -25.6537,0 -51.1658,3.64964 -76.1463,11.1615 -25.0159,7.47644 -49.9965,18.6734 -74.6935,33.6617zm296.861 171.816c0,14.0316 -5.5276,31.8546 -16.6891,53.5044 -10.9843,21.6852 -27.9923,39.6854 -50.9886,54.1776 -22.9962,14.4922 -49.8193,21.8269 -80.8235,21.8269 -49.8547,0 -89.3629,-18.8151 -118.666,-56.1619 -19.8427,-25.8309 -29.6931,-50.4925 -29.6931,-74.3392 0,-26.6459 14.1733,-52.4768 42.6972,-77.8116 28.4884,-25.1931 63.6383,-37.8428 105.662,-37.8428 42.3074,0 77.6699,12.508 105.981,37.6657 28.3467,24.9805 42.52,51.3429 42.52,78.9809z"/></glyph>
<glyph unicode="s" horiz-adv-x="600"><path d="M408.157 326.164c-16.1576,10.1694 -33.3073,17.6812 -51.1658,22.6773 -18.0001,5.17327 -36.6735,7.6536 -56.1619,7.6536 -38.835,0 -69.4848,-6.34257 -92.3393,-19.1694 -10.1694,-5.49217 -15.1655,-11.4804 -15.1655,-18.0001 0,-7.47644 6.83864,-14.8111 20.5159,-22.0041 10.4883,-5.13784 33.6617,-10.1694 69.8391,-15.1655 66.473,-9.00007 112.643,-18.1419 138.651,-27.3191 34.1577,-12.0119 60.5202,-29.8349 79.1581,-53.6815 18.4962,-23.8112 27.8506,-48.8272 27.8506,-75.1541 0,-35.8231 -15.8387,-65.8352 -47.339,-89.8235 -45.3193,-34.831 -103.997,-52.3351 -176.316,-52.3351 -29.0199,0 -55.6658,2.48033 -80.3628,7.6536 -24.4844,4.9961 -47.1618,12.3308 -67.6423,22.1813 -4.85437,-4.18114 -10.0276,-7.51187 -15.5198,-9.85047 -5.66934,-2.16143 -11.3387,-3.33073 -17.1497,-3.33073 -15.6615,0 -27.9923,5.17327 -37.3468,15.3426 -9.31897,10.3111 -13.9962,27.4963 -13.9962,51.4847l0 33.6617c0,24.1655 4.6772,41.3507 13.9962,51.6973 9.3544,10.1339 21.3309,15.3072 36.3546,15.3072 11.9765,0 22.1458,-3.33073 30.3309,-9.9922 8.14967,-6.66147 14.4922,-18.1773 18.9923,-34.5121 15.3426,-12.9686 33.6617,-22.8191 55.1697,-29.4805 21.508,-6.66147 46.1697,-9.9922 74.162,-9.9922 45.9925,0 81.6739,7.15754 107.009,21.4726 11.9765,7.19297 18.0001,14.6694 18.0001,22.5002 0,13.004 -8.504,23.6695 -25.8309,32.1735 -17.1852,8.504 -52.8666,15.6615 -106.867,21.508 -80.4691,8.504 -134.151,24.6616 -161.151,48.8272 -27.0002,23.6695 -40.5003,53.0083 -40.5003,87.8393 0,35.8231 14.9883,65.658 45.3193,89.3275 41.0318,32.6695 94.6779,48.8272 161.186,48.8272 23.1734,0 45.3193,-2.16143 66.6501,-6.4843 21.3309,-4.50004 41.6696,-11.1615 61.1934,-20.3387 6.30714,4.50004 11.9765,8.00794 17.3269,10.3465 5.49217,2.16143 10.3111,3.33073 14.9883,3.33073 13.6773,0 25.0159,-5.17327 34.1577,-15.3426 9.17724,-10.3465 13.6773,-27.4963 13.6773,-51.4847l0 -24.5199c0,-21.8269 -2.6575,-36.4964 -7.83077,-44.3271 -10.3465,-14.9883 -24.4844,-22.5002 -42.4846,-22.5002 -12.0119,0 -22.6773,3.64964 -31.6774,11.1615 -9.17724,7.51187 -14.9883,17.5041 -17.6812,29.8349z"/></glyph>
<glyph unicode="y" horiz-adv-x="600"><path d="M244.171 3.5079l-173.34 339.841c-16.3348,1.8071 -28.6656,7.47644 -37.1696,16.4765 -8.504,9.17724 -12.6497,20.1616 -12.6497,33.1656 0,15.0237 5.13784,27.1774 15.3072,36.4964 10.3465,9.17724 27.5317,13.8544 51.5201,13.8544l91.3117 0c24.1655,0 41.3507,-4.6772 51.5201,-13.8544 10.3465,-9.31897 15.4844,-21.4726 15.4844,-36.4964 0,-14.4922 -5.13784,-26.5041 -15.4844,-35.8231 -10.1694,-9.31897 -26.327,-13.819 -48.5083,-13.819l118.17 -230.033 117.178 230.033c-21.508,0 -37.3468,4.50004 -47.6933,13.819 -10.1339,9.31897 -15.3072,21.3309 -15.3072,36.3192 0,14.6694 5.17327,26.6813 15.3072,36.0003 10.3465,9.17724 27.5317,13.8544 51.5201,13.8544l94.3236 0c23.6695,0 40.6775,-4.6772 50.9886,-13.8544 10.1694,-9.31897 15.3426,-21.4726 15.3426,-36.4964 0,-13.3229 -4.32287,-24.6616 -13.1458,-33.8388 -8.85834,-9.31897 -21.8624,-14.6694 -39.0121,-15.8033l-229.502 -452.165c25.0159,0 41.4925,-2.51577 49.3232,-7.3347 15.5198,-10.1694 23.3506,-24.5199 23.3506,-43.0161 0,-14.6694 -4.9961,-26.6813 -15.3426,-35.8231 -10.3465,-9.3544 -27.4963,-13.9962 -51.4847,-13.9962l-218.34 0c-23.9884,0 -41.1736,4.64177 -51.5201,13.9962 -10.1694,9.1418 -15.3072,21.1537 -15.3072,35.8231 0,14.9883 5.13784,27.1774 15.3072,36.3192 10.3465,9.3544 27.5317,14.0316 51.5201,14.0316l99.674 0 56.6579 112.324z"/></glyph>
<glyph unicode="v" horiz-adv-x="600"><path d="M300.829 121.678l107.824 221.671c-26.6459,0 -43.8311,2.16143 -51.1658,6.8032 -16.3348,10.0276 -24.4844,24.5199 -24.4844,43.335 0,14.6694 5.17327,26.6813 15.3426,36.0003 10.3111,9.17724 27.4963,13.8544 51.4847,13.8544l137.34 0c23.9884,0 41.1736,-4.6772 51.4847,-13.8544 10.1694,-9.31897 15.3426,-21.4726 15.3426,-36.4964 0,-14.4922 -5.17327,-26.5041 -15.3426,-35.8231 -10.3111,-9.31897 -27.4963,-13.819 -51.4847,-13.819l-16.6537 0 -167.529 -343.349 -104.493 0 -167.493 343.349 -14.1733 0c-23.9884,0 -41.1736,4.50004 -51.4847,13.819 -10.1694,9.31897 -15.3426,21.3309 -15.3426,36.3192 0,14.6694 5.17327,26.6813 15.3426,36.0003 10.3111,9.17724 27.4963,13.8544 51.4847,13.8544l134.328 0c23.8466,0 40.8547,-4.6772 51.024,-13.8544 10.3111,-9.31897 15.3072,-21.4726 15.3072,-36.4964 0,-18.4962 -7.6536,-32.6695 -23.3151,-42.3074 -7.83077,-5.03154 -25.3348,-7.3347 -52.3351,-7.3347l108.993 -221.671z"/></glyph>
<glyph unicode="q" horiz-adv-x="600"><path d="M532.173 343.349l0 -452.165 17.6458 0c23.6695,0 40.6775,-4.6772 51.024,-14.0316 10.3111,-9.1418 15.3072,-21.3309 15.3072,-36.3192 0,-14.6694 -4.9961,-26.6813 -15.1655,-35.8231 -9.9922,-9.3544 -27.1419,-13.9962 -51.1658,-13.9962l-177.308 0c-24.0238,0 -41.1736,4.64177 -51.5201,13.9962 -10.1694,9.1418 -15.3072,21.1537 -15.3072,35.8231 0,14.9883 5.13784,27.1774 15.3072,36.3192 10.3465,9.3544 27.4963,14.0316 51.5201,14.0316l59.6698 0 0 163.986c-24.5199,-14.9883 -49.3587,-26.1852 -74.5163,-33.6617 -25.1577,-7.51187 -50.6697,-11.1615 -76.3234,-11.1615 -59.6698,0 -113.174,17.823 -160.69,53.6461 -56.9768,43.0161 -85.5007,97.5126 -85.5007,163.525 0,59.9887 24.0238,112.997 72.3549,159.486 48.1539,46.3468 106.513,69.4848 175.147,69.4848 26.3624,0 52.0162,-3.8268 77.0321,-11.6576 24.8033,-7.83077 48.9689,-19.6655 72.4966,-35.6459l0 34.1577 117.639 0c23.6695,0 40.6775,-4.6772 51.024,-13.8544 10.3111,-9.31897 15.3072,-21.4726 15.3072,-36.4964 0,-14.4922 -4.9961,-26.5041 -15.1655,-35.8231 -9.9922,-9.31897 -27.1419,-13.819 -51.1658,-13.819l-17.6458 0zm-99.9929 -116.363c0,14.0316 -5.5276,31.8546 -16.6891,53.5044 -10.9843,21.6852 -28.1695,39.6854 -51.1658,54.1776 -23.1734,14.4922 -49.9965,21.8269 -80.6463,21.8269 -50.1736,0 -89.6818,-18.8151 -118.666,-56.1619 -19.8427,-25.8309 -29.6931,-50.4925 -29.6931,-74.3392 0,-27.0002 14.1733,-53.0083 42.6972,-77.9888 28.4884,-25.1577 63.6383,-37.6657 105.662,-37.6657 42.3074,0 77.6699,12.508 105.981,37.6657 28.3467,24.9805 42.52,51.3429 42.52,78.9809z"/></glyph>
<glyph unicode="t" horiz-adv-x="600"><path d="M275.317 343.349l0 -200.836c0,-21.3309 4.50004,-35.5042 13.1812,-42.3429 13.6773,-10.8426 38.1617,-16.1576 73.347,-16.1576 51.1658,0 98.3275,10.8072 141.663,32.6695 16.4765,8.46857 29.4805,12.6497 38.9767,12.6497 13.004,0 24.3427,-4.81894 34.016,-14.6694 9.49614,-9.6733 14.3151,-21.508 14.3151,-35.5042 0,-13.1458 -5.13784,-24.3073 -15.6615,-33.8388 -15.9804,-15.1655 -47.3035,-29.3034 -94.5007,-42.1657 -46.9846,-12.8269 -86.67,-19.3112 -118.808,-19.3112 -62.1855,0 -108.851,13.5001 -139.855,40.3232 -31.1459,26.823 -46.6657,59.8469 -46.6657,98.8236l0 220.36 -36.142 0c-24.1655,0 -41.3507,4.50004 -51.5201,13.819 -10.3111,9.31897 -15.3426,21.3309 -15.3426,36.3192 0,14.6694 5.03154,26.6813 15.3426,36.0003 10.1694,9.17724 27.3545,13.8544 51.5201,13.8544l36.142 0 0 90.3196c0,24.1655 4.6772,41.3507 13.8544,51.5201 9.31897,10.3111 21.4726,15.4844 36.4964,15.4844 14.4922,0 26.5041,-5.17327 35.8231,-15.4844 9.31897,-10.1694 13.819,-27.3545 13.819,-51.5201l0 -90.3196 185.175 0c24.0238,0 41.1736,-4.6772 51.5201,-13.8544 10.1694,-9.31897 15.3072,-21.4726 15.3072,-36.4964 0,-14.4922 -5.13784,-26.5041 -15.3072,-35.8231 -10.3465,-9.31897 -27.4963,-13.819 -51.5201,-13.819l-185.175 0z"/></glyph>
<glyph unicode="x" horiz-adv-x="600"><path d="M374.991 230.494l151.832 -130.324c18.3545,-0.992134 31.9963,-6.1654 40.9964,-15.5198 9.17724,-9.1418 13.6773,-20.7994 13.6773,-34.831 0,-14.6694 -4.9961,-26.6459 -15.3426,-35.8231 -10.3111,-9.31897 -27.4963,-13.9962 -51.4847,-13.9962l-113.847 0c-23.9884,0 -41.1381,4.6772 -51.4847,13.9962 -10.1694,9.17724 -15.3426,21.508 -15.3426,36.8507 0,11.6576 3.68507,22.0041 11.0198,31.0042 7.3347,8.8229 17.3269,14.9883 29.9766,18.319l-74.6581 64.347 -76.1817 -64.347c15.3426,-4.00397 26.1852,-9.9922 32.8467,-18.1773 6.83864,-8.14967 10.1694,-18.4962 10.1694,-31.1459 0,-15.3426 -5.17327,-27.6734 -15.1655,-36.8507 -10.1694,-9.31897 -27.1774,-13.9962 -51.3429,-13.9962l-112.82 0c-23.9884,0 -41.1736,4.6772 -51.5201,13.9962 -10.1694,9.17724 -15.3072,21.3309 -15.3072,36.3546 0,13.6418 4.50004,25.1577 13.6418,34.2995 9.17724,9.3544 22.8545,14.5277 40.9964,15.5198l148.501 130.82 -131.316 112.359c-17.3269,1.13387 -30.3309,6.4843 -39.331,15.8033 -9.00007,9.17724 -13.5001,20.6931 -13.5001,34.3349 0,14.6694 5.17327,26.6813 15.4844,36.0003 10.1694,9.17724 27.3545,13.8544 51.5201,13.8544l93.6503 0c24.1655,0 41.3507,-4.6772 51.5201,-13.8544 10.3111,-9.31897 15.3072,-21.1537 15.3072,-35.5042 0,-19.134 -9.00007,-34.831 -27.3191,-46.8075l60.6619 -50.3508 59.4926 51.3429c-17.823,12.6497 -26.823,27.3191 -26.823,44.0082 0,15.4844 5.17327,27.9923 15.3426,37.3113 10.3111,9.17724 27.4963,13.8544 51.4847,13.8544l92.8354 0c24.1655,0 41.3507,-4.6772 51.5201,-13.8544 10.3111,-9.31897 15.3072,-21.4726 15.3072,-36.4964 0,-13.3229 -4.32287,-24.6616 -13.3229,-33.8388 -9.00007,-9.31897 -22.323,-14.6694 -39.8271,-15.8033l-131.847 -112.855z"/></glyph>
<glyph unicode="r" horiz-adv-x="600"><path d="M279.321 443.342l0 -62.5044c42.024,30.3309 75.0124,50.4925 99.3551,60.4847 24.1655,10.1694 46.9846,15.1655 68.1738,15.1655 32.4924,0 63.9926,-11.9765 94.6425,-36.142 20.8348,-16.193 31.3585,-32.8467 31.3585,-49.6776 0,-14.3505 -5.03154,-26.5041 -15.0237,-36.4964 -9.81504,-9.85047 -21.8269,-14.8466 -35.8231,-14.8466 -12.3308,0 -25.3348,6.1654 -39.1539,18.4962 -13.6773,12.508 -25.8663,18.6734 -36.5318,18.6734 -13.9962,0 -34.9727,-8.8229 -62.8233,-26.5041 -27.8152,-17.5041 -62.5044,-43.8311 -104.174,-78.9809l0 -150.84 142.513 0c24.1655,0 41.3153,-4.6772 51.4847,-13.9962 10.3465,-9.3544 15.5198,-21.3309 15.5198,-36.3546 0,-14.6694 -5.17327,-26.6459 -15.5198,-35.8231 -10.1694,-9.31897 -27.3191,-13.9962 -51.4847,-13.9962l-302.176 0c-24.1655,0 -41.3153,4.6772 -51.4847,13.9962 -10.3465,9.17724 -15.5198,21.3309 -15.5198,36.3546 0,14.634 5.17327,26.4687 15.5198,35.8231 10.1694,9.31897 27.3191,13.9962 51.4847,13.9962l59.4926 0 0 243.179 -36.142 0c-24.0238,0 -41.1736,4.50004 -51.5201,13.819 -10.1694,9.31897 -15.3072,21.3309 -15.3072,36.3192 0,14.6694 5.13784,26.6813 15.3072,36.0003 10.3465,9.17724 27.4963,13.8544 51.5201,13.8544l136.312 0z"/></glyph>
</font>
<font id="FontID0" font-variant="normal" style="fill-rule:nonzero" font-style="normal" font-weight="400,700">
<font-face
font-family="Arial">
</font-face>
<missing-glyph><path d="M0 0z"/></missing-glyph>
<glyph unicode=")" horiz-adv-x="333"><path d="M33.6617 -210.51c27.0002,58.0044 46.1697,102.509 57.154,133.336 11.0198,31.0042 21.3663,66.6856 30.6853,107.009 9.49614,40.3232 16.5119,78.662 21.012,114.981 4.64177,36.1775 6.8032,73.5242 6.8032,111.509 0,77.4927 -8.14967,150.84 -24.8033,220.006 -16.6891,69.1659 -47.1618,153.001 -91.8432,251.683l93.3314 0c49.1815,-70.0163 87.3432,-144.178 114.485,-222.663 27.1774,-78.3431 40.8547,-158.033 40.8547,-238.679 0,-68.1738 -10.8426,-140.989 -32.3506,-218.836 -24.3073,-87.166 -64.6659,-173.34 -120.473,-258.345l-94.8551 0z"/></glyph>
<glyph unicode="(" horiz-adv-x="333"><path d="M299.341 -210.51l-94.3236 0c-49.6776,75.1896 -87.6975,153.356 -113.67,234.498 -26.0081,81.0006 -39.1893,159.521 -39.1893,235.348 0,94.0047 16.193,183.013 48.5083,266.99 27.8506,72.9927 63.3194,140.174 106.335,201.687l93.8275 0c-44.646,-98.6819 -75.3313,-182.517 -92.1621,-251.683 -16.6537,-69.1659 -25.0159,-142.513 -25.0159,-220.006 0,-53.3272 4.85437,-108.001 14.8466,-163.986 9.85047,-56.0201 23.4923,-109.347 40.8192,-159.663 11.3387,-33.3428 31.3585,-81.0006 60.0241,-143.186z"/></glyph>
<glyph unicode=" " horiz-adv-x="277"></glyph>
<glyph unicode="H" horiz-adv-x="722"><path d="M73.1581 0l0 715.825 144.686 0 0 -281.648 283.16 0 0 281.648 144.497 0 0 -715.825 -144.497 0 0 312.995 -283.16 0 0 -312.995 -144.686 0z"/></glyph>
<glyph unicode="C" horiz-adv-x="722"><path d="M530.839 263.175l139.985 -44.3389c-21.4962,-78.166 -57.1658,-136.159 -107.15,-174.167 -49.8429,-37.8428 -113.339,-56.8351 -190.183,-56.8351 -94.985,0 -173.151,32.5042 -234.333,97.3236 -61.158,65.0084 -91.8196,153.852 -91.8196,266.341 0,119.174 30.827,211.679 92.3393,277.679 61.4887,65.8115 142.324,98.8118 242.648,98.8118 87.4968,0 158.671,-25.8191 213.332,-77.6463 32.6695,-30.5199 57.0004,-74.5045 73.347,-131.836l-143.174 -34.1814c-8.33865,37.1814 -26.0081,66.4966 -53.0083,88.0164 -26.8112,21.4962 -59.4808,32.1499 -97.8197,32.1499 -53.0083,0 -96.1661,-18.9923 -129.166,-57.1658 -33.0003,-37.9846 -49.5122,-99.6622 -49.5122,-184.986 0,-90.4968 16.1812,-155.009 48.8508,-193.348 32.4806,-38.5042 74.8352,-57.6619 126.828,-57.6619 38.5042,0 71.5045,12.1655 99.1661,36.6617 27.6616,24.3309 47.5043,62.8351 59.6698,115.182z"/></glyph>
<glyph unicode="I" horiz-adv-x="277"><path d="M68.3391 0l0 715.825 144.497 0 0 -715.825 -144.497 0z"/></glyph>
<glyph unicode="N" horiz-adv-x="722"><path d="M74.1738 0l0 715.825 140.67 0 292.987 -477.996 0 477.996 134.34 0 0 -715.825 -145.159 0 -288.522 466.823 0 -466.823 -134.316 0z"/></glyph>
<glyph unicode="Y" horiz-adv-x="666"><path d="M260.671 0l0 301.325 -262.16 414.499 169.49 0 168.497 -283.16 165.001 283.16 166.489 0 -263.152 -415.491 0 -300.333 -144.166 0z"/></glyph>
<glyph unicode="U" horiz-adv-x="722"><path d="M71.8352 715.825l144.497 0 0 -387.664c0,-61.4887 1.84253,-101.505 5.33862,-119.67 6.1654,-29.3152 21.0002,-52.8193 44.1736,-70.4887 23.3151,-17.8348 55.1579,-26.6695 95.4811,-26.6695 41.0082,0 72.0006,8.33865 92.8354,25.1577 20.8348,16.6773 33.331,37.3468 37.5121,61.6777 4.32287,24.4963 6.33076,65.0084 6.33076,121.678l0 395.979 144.497 0 0 -375.995c0,-85.9849 -3.8268,-146.67 -11.6694,-182.151 -7.84258,-35.5042 -22.1577,-65.3391 -43.1578,-89.8354 -21.0002,-24.3545 -49.1815,-43.8429 -84.166,-58.3469 -35.1735,-14.5041 -81.166,-21.6616 -137.836,-21.6616 -68.3391,0 -120.166,7.84258 -155.505,23.6695 -35.3389,15.8269 -63.1659,36.331 -83.67,61.4887 -20.5041,25.1813 -33.9924,51.6854 -40.4885,79.3471 -9.51976,40.9846 -14.1733,101.505 -14.1733,181.655l0 381.83z"/></glyph>
<glyph unicode="P" horiz-adv-x="666"><path d="M72.8273 0l0 715.825 231.829 0c87.8511,0 145.182,-3.66145 171.852,-10.819 40.9846,-10.6772 75.4967,-34.016 103.158,-70.0163 27.6616,-36.0003 41.5043,-82.4888 41.5043,-139.324 0,-44.0082 -8.00794,-81.0006 -24.0002,-110.836 -15.9923,-30.0002 -36.1656,-53.5044 -60.8273,-70.6541 -24.5199,-17.008 -49.5122,-28.3467 -74.8352,-33.8507 -34.5121,-6.82683 -84.4967,-10.3229 -150.001,-10.3229l-94.1818 0 0 -270.002 -144.497 0zm144.497 594.666l0 -203.009 79.0164 0c57.0004,0 95.1504,3.68507 114.332,11.1733 19.1576,7.51187 34.1577,19.1813 45.1657,35.1735 10.819,15.9923 16.323,34.4885 16.323,55.654 0,26.0081 -7.6536,47.5043 -22.9844,64.5123 -15.1655,16.819 -34.6774,27.4963 -58.0162,31.6538 -17.3387,3.35436 -51.9925,4.84256 -103.985,4.84256l-69.8509 0z"/></glyph>
<glyph unicode="X" horiz-adv-x="666"><path d="M0 0l244.667 373.503 -221.671 342.322 168.84 0 143.647 -229.998 140.529 229.998 167.493 0 -222.663 -347.672 244.667 -368.153 -174.332 0 -158.671 247.502 -159.167 -247.502 -173.34 0z"/></glyph>
<glyph unicode="T" horiz-adv-x="610"><path d="M233.825 0l0 594.678 -212.317 0 0 121.147 568.812 0 0 -121.147 -211.821 0 0 -594.678 -144.674 0z"/></glyph>
<glyph unicode="R" horiz-adv-x="722"><path d="M73.1699 0l0 715.825 304.337 0c76.5006,0 131.989,-6.4843 166.643,-19.3112 34.6892,-12.8623 62.5044,-35.6814 83.3392,-68.5281 20.8348,-32.9884 31.1813,-70.4769 31.1813,-112.82 0,-53.6815 -15.8387,-98.1504 -47.339,-133.159 -31.5002,-34.831 -78.8392,-57.0123 -141.663,-66.0123 31.3231,-18.319 57.154,-38.3389 77.4927,-60.1658 20.3387,-21.8269 47.6579,-60.4847 82.1699,-116.151l87.4849 -139.678 -172.808 0 -104.493 155.836c-37.1696,55.6658 -62.5044,90.6739 -76.1817,105.166 -13.6773,14.4922 -28.1695,24.3427 -43.5122,29.8349 -15.3072,5.315 -39.4728,8.00794 -72.8155,8.00794l-29.1616 0 0 -298.845 -144.674 0zm144.674 413.153l106.832 0c69.3076,0 112.643,2.83467 130.005,8.68117 17.1497,5.8465 30.6498,16.0159 40.5003,30.3309 9.63787,14.3505 14.6694,32.1735 14.6694,53.6815 0,24.1655 -6.51974,43.4767 -19.3466,58.3233 -12.8269,14.8466 -31.0042,24.1655 -54.4965,28.1695 -11.6576,1.4882 -46.8429,2.3386 -105.521,2.3386l-112.643 0 0 -181.525z"/></glyph>
<glyph unicode="W" horiz-adv-x="943"><path d="M174.332 0l-170.836 715.825 147.828 0 108.001 -491.65 130.844 491.65 171.828 0 125.505 -499.988 109.843 499.988 145.489 0 -173.836 -715.825 -153.332 0 -142.489 535.162 -142.182 -535.162 -156.663 0z"/></glyph>
<glyph unicode="l" horiz-adv-x="222"><path d="M63.9926 0l0 715.825 87.8393 0 0 -715.825 -87.8393 0z"/></glyph>
<glyph unicode="k" horiz-adv-x="500"><path d="M66.3312 0l0 715.825 88.0164 0 0 -408.157 207.994 210.828 113.67 0 -198.179 -192.332 218.34 -326.164 -108.497 0 -171.356 265.183 -61.9729 -59.6698 0 -205.513 -88.0164 0z"/></glyph>
<glyph unicode="c" horiz-adv-x="500"><path d="M404.33 189.994l86.3511 -11.3387c-9.3544,-59.4926 -33.5199,-106.158 -72.5321,-139.82 -38.7995,-33.6617 -86.6345,-50.4925 -143.328,-50.4925 -70.8313,0 -127.985,23.1734 -171.001,69.4848 -43.1578,46.3468 -64.8076,112.855 -64.8076,199.49 0,56.0201 9.31897,105.024 27.8152,147.013 18.6734,41.9885 46.8429,73.4888 84.8274,94.5007 37.8428,21.012 79.1935,31.5002 123.662,31.5002 56.339,0 102.509,-14.3151 138.19,-42.8389 35.8231,-28.4884 58.8194,-68.8116 68.9887,-121.324l-85.5007 -13.1812c-8.14967,34.831 -22.5002,61.0162 -43.1578,78.662 -20.6576,17.5041 -45.6736,26.3624 -75.0124,26.3624 -44.3271,0 -80.3274,-15.8387 -108.001,-47.6933 -27.6734,-31.642 -41.4925,-81.8156 -41.4925,-150.485 0,-69.662 13.3229,-120.332 40.1814,-152.009 26.6459,-31.5002 61.4769,-47.339 104.493,-47.339 34.4766,0 63.1777,10.6654 86.3156,31.8546 23.1734,21.1537 37.8428,53.6461 44.0082,97.6543z"/></glyph>
<glyph unicode="a" horiz-adv-x="556"><path d="M174.332 360.334l-124.489 22.4884c13.9844,50.1736 37.9846,87.1897 72.1659,111.355 34.3231,24.0002 84.9928,36.1656 152.316,36.1656 61.3469,0 106.843,-7.34651 136.844,-21.8506 29.8349,-14.4804 51.0004,-32.8349 63.1659,-55.1579 12.1655,-22.323 18.3309,-63.1659 18.3309,-122.836l-1.4882 -160.159c0,-45.4964 2.14962,-79.1817 6.66147,-100.843 4.32287,-21.4962 12.6615,-44.835 24.6616,-69.4966l-135.828 0c-3.49609,9.16543 -8.00794,22.6773 -13.1812,40.4885 -2.14962,8.17329 -3.8268,13.5119 -4.81894,16.1812 -23.5041,-22.8427 -48.4964,-39.8271 -75.1659,-51.3311 -26.6695,-11.3387 -55.1815,-17.008 -85.5125,-17.008 -53.3154,0 -95.5047,14.5041 -126.166,43.3468 -30.827,28.9845 -46.1578,65.6462 -46.1578,109.985 0,29.1735 6.99218,55.3469 21.0002,78.3313 14.008,23.0081 33.6617,40.5121 58.8194,52.6776 25.1813,12.1655 61.6777,22.8191 109.182,31.9845 63.9926,12.0001 108.497,23.3388 133.159,33.6853l0 13.6537c0,26.5041 -6.49611,45.1657 -19.4883,56.5044 -13.0159,11.1733 -37.5121,16.8427 -73.6777,16.8427 -24.4963,0 -43.4885,-4.84256 -57.1658,-14.5041 -13.6537,-9.49614 -24.6616,-26.3388 -33.1656,-50.5043zm183.498 -111.332c-17.5041,-5.83469 -45.3311,-12.8269 -83.5046,-21.0002 -37.9846,-8.17329 -62.8351,-16.1576 -74.6699,-23.8348 -17.8112,-12.8269 -26.8112,-28.8427 -26.8112,-48.3311 0,-19.3466 7.15754,-35.8349 21.4962,-49.8429 14.3151,-13.9844 32.5042,-21.0002 54.6618,-21.0002 24.827,0 48.3311,8.17329 70.8431,24.3309 16.6537,12.3544 27.4963,27.5199 32.6459,45.52 3.68507,11.6458 5.33862,33.9924 5.33862,66.8273l0 27.3309z"/></glyph>
<glyph unicode="o" horiz-adv-x="556"><path d="M33.1656 259.337c0,95.9889 26.6813,167.175 80.1502,213.344 44.5043,38.3035 98.859,57.6501 163.029,57.6501 71.3273,0 129.651,-23.3151 174.828,-70.158 45.3193,-46.6657 67.8194,-111.19 67.8194,-193.502 0,-66.8273 -9.9922,-119.34 -29.9766,-157.501 -20.0198,-38.3389 -49.1815,-67.9966 -87.3432,-89.1857 -38.3389,-21.1537 -80.0085,-31.642 -125.328,-31.642 -72.4966,0 -131.174,23.1734 -175.997,69.8391 -44.8586,46.4886 -67.1816,113.493 -67.1816,201.155zm90.3196 0c0,-66.5084 14.5277,-116.186 43.5122,-149.174 29.0199,-33.1656 65.5163,-49.6776 109.347,-49.6776 43.6539,0 79.9731,16.6891 108.993,49.8547 28.8427,33.1656 43.335,83.8353 43.335,151.832 0,64.1698 -14.4922,112.82 -43.6893,145.844 -29.1616,32.9884 -65.3037,49.5004 -108.639,49.5004 -43.8311,0 -80.3274,-16.5119 -109.347,-49.3587 -28.9845,-32.8113 -43.5122,-82.4888 -43.5122,-148.82z"/></glyph>
<glyph unicode="d" horiz-adv-x="610"><path d="M547.327 0l-127.324 0 0 76.1581c-21.1655,-29.6695 -46.1815,-51.6618 -75.0006,-66.1659 -28.8427,-14.4804 -57.8272,-21.6616 -87.166,-21.6616 -59.6698,0 -110.67,24.0002 -153.167,72.0006 -42.331,48.0004 -63.6619,114.993 -63.6619,200.836 0,87.9928 20.6695,154.844 61.9847,200.506 41.3389,45.6618 93.6622,68.6698 156.852,68.6698 57.8272,0 107.977,-24.1655 150.332,-72.3313l0 257.813 137.151 0 0 -715.825zm-366.168 270.498c0,-55.3233 7.67723,-95.3393 23.0081,-120.166 21.9923,-35.6696 53.0083,-53.6697 92.67,-53.6697 31.6538,0 58.4886,13.5119 80.6699,40.3468 21.9923,26.8349 33.1656,66.9927 33.1656,120.332 0,59.5044 -10.8426,102.497 -32.1735,128.67 -21.4962,26.1498 -48.9925,39.331 -82.6542,39.331 -32.5042,0 -59.6698,-13.0159 -81.6857,-38.835 -21.9923,-25.8427 -33.0003,-64.5123 -33.0003,-116.009z"/></glyph>
<glyph unicode="n" horiz-adv-x="610"><path d="M543.512 0l-137.162 0 0 264.652c0,56.0201 -3.01183,92.1976 -8.85834,108.674 -5.81107,16.3348 -15.4844,29.1616 -28.6656,38.3389 -13.1458,9.00007 -28.9845,13.6773 -47.4807,13.6773 -23.8466,0 -45.1775,-6.51974 -64.0281,-19.5238 -18.8151,-13.1458 -31.8191,-30.3309 -38.7995,-51.8036 -7.0158,-21.508 -10.5237,-61.1934 -10.5237,-119.198l0 -234.817 -137.162 0 0 518.496 127.347 0 0 -76.1463c45.3193,58.6422 102.332,87.981 171.001,87.981 30.1538,0 57.969,-5.49217 82.9849,-16.3348 25.0159,-10.9843 44.0082,-24.8388 56.8351,-41.8468 12.8269,-16.9726 21.8269,-36.142 26.823,-57.6501 5.17327,-21.508 7.68904,-52.1579 7.68904,-92.1621l0 -322.337z"/></glyph>
<glyph unicode="e" horiz-adv-x="556"><path d="M372.003 165.001l136.82 -22.8427c-17.6458,-50.15 -45.3311,-88.3235 -83.3156,-114.497 -37.8428,-26.3388 -85.3471,-39.331 -142.348,-39.331 -90.1661,0 -156.828,29.3388 -200.151,88.3472 -34.1814,47.15 -51.3311,106.82 -51.3311,178.655 0,86.0086 22.4884,153.332 67.4887,201.994 44.835,48.6618 101.67,73.0163 170.34,73.0163 77.1502,0 138.001,-25.512 182.671,-76.5124 44.4807,-51.0004 65.8115,-129.001 63.9926,-234.167l-343.845 0c1.01576,-40.6539 12.0001,-72.3313 33.1656,-94.8196 21.1655,-22.6773 47.6697,-34.016 79.1817,-34.016 21.4962,0 39.4964,5.83469 54.1658,17.5041 14.6694,11.8347 25.8191,30.6617 33.1656,56.6697zm7.81896 138.663c-0.992134,39.8271 -11.1497,69.9927 -30.6617,90.6621 -19.4883,20.6695 -43.3232,31.016 -71.3155,31.016 -30.0002,0 -54.6855,-11.008 -74.1738,-32.8349 -19.512,-21.6852 -29.1735,-51.3311 -28.8427,-88.8432l204.994 0z"/></glyph>
<glyph unicode="i" horiz-adv-x="277"><path d="M71.8352 588.831l0 126.993 137.174 0 0 -126.993 -137.174 0zm0 -588.831l0 518.508 137.174 0 0 -518.508 -137.174 0z"/></glyph>
<glyph unicode="m" horiz-adv-x="889"><path d="M61.4887 518.508l126.521 0 0 -70.6777c45.1657,54.9926 99.1661,82.5125 161.647,82.5125 33.1656,0 62.0084,-6.85045 86.3393,-20.5041 24.4963,-13.6773 44.5043,-34.3467 60.1658,-62.0084 22.6773,27.6616 47.339,48.3311 73.6777,62.0084 26.3388,13.6537 54.4965,20.5041 84.4967,20.5041 38.0082,0 70.3234,-7.84258 96.6622,-23.3388 26.3388,-15.3308 45.9925,-38.1735 59.0083,-68.0084 9.49614,-22.1577 14.1497,-57.9926 14.1497,-107.505l0 -331.491 -137.151 0 0 296.341c0,51.4965 -4.6772,84.6621 -14.1733,99.6622 -12.6615,19.4883 -32.1735,29.3388 -58.4886,29.3388 -19.3466,0 -37.3468,-5.83469 -54.3548,-17.6694 -16.819,-11.6694 -28.9845,-28.8427 -36.4964,-51.4965 -7.48825,-22.6773 -11.315,-58.3469 -11.315,-107.174l0 -249.002 -137.174 0 0 284.175c0,50.4807 -2.50396,82.9849 -7.34651,97.6543 -4.81894,14.6694 -12.4962,25.512 -22.6537,32.6695 -10.3465,7.15754 -24.1655,10.8426 -41.835,10.8426 -21.1655,0 -40.1578,-5.66934 -57.0004,-17.1734 -17.008,-11.3387 -29.1735,-27.827 -36.4964,-49.3468 -7.34651,-21.4962 -11.008,-56.9768 -11.008,-106.82l0 -252.002 -137.174 0 0 518.508z"/></glyph>
<glyph unicode="y" horiz-adv-x="500"><path d="M62.0084 -199.667l-9.85047 82.4888c19.3466,-5.13784 36.0003,-7.83077 50.3508,-7.83077 19.4883,0 35.1499,3.33073 46.8075,9.85047 11.8347,6.4843 21.3663,15.4844 28.8427,27.3191 5.66934,8.68117 14.4922,30.5081 26.8585,65.3391 1.66537,4.9961 4.32287,12.0119 7.83077,21.508l-196.691 519.488 94.6779 0 108.001 -300.156c13.819,-38.1617 26.5041,-78.166 37.4885,-120.19 10.1694,40.3586 22.1813,79.6896 36.1775,118.17l110.836 302.176 87.8393 0 -197.187 -527.319c-21.1537,-57.0123 -37.6657,-96.1661 -49.3232,-117.674 -15.6615,-29.0199 -33.4845,-50.1736 -53.6815,-63.6737 -20.3033,-13.5001 -44.3271,-20.3387 -72.3195,-20.3387 -17.008,0 -35.8231,3.68507 -56.6579,10.8426z"/></glyph>
<glyph unicode="r" horiz-adv-x="389"><path d="M203.175 0l-137.162 0 0 518.496 127.312 0 0 -73.6659c21.8269,34.831 41.4925,57.8272 58.8548,68.847 17.5041,10.9843 37.1696,16.6537 59.3154,16.6537 31.3231,0 61.3351,-8.68117 90.355,-26.0081l-42.52 -119.481c-22.9962,14.8111 -44.5043,22.323 -64.347,22.323 -19.3112,0 -35.4688,-5.17327 -48.8272,-15.8387 -13.5001,-10.4883 -23.8112,-29.6577 -31.5002,-57.3312 -7.6536,-27.6734 -11.4804,-85.6778 -11.4804,-173.836l0 -160.159z"/></glyph>
<glyph unicode="s" horiz-adv-x="500"><path d="M30.827 154.844l86.8471 13.6418c4.81894,-34.831 18.4962,-61.4769 40.8192,-80.1502 22.1813,-18.4962 53.3272,-27.8506 93.5086,-27.8506 40.3232,0 70.3352,8.36227 89.8235,24.697 19.5238,16.4765 29.3388,35.8231 29.3388,57.8272 0,19.9844 -8.68117,35.5042 -26.0081,46.9846 -11.9765,7.83077 -41.9885,17.6812 -89.8235,29.6577 -64.347,16.3348 -109.17,30.3664 -134.009,42.3429 -24.8388,11.8347 -43.8311,28.3467 -56.6579,49.3232 -12.8269,21.012 -19.3466,44.1854 -19.3466,69.5202 0,23.1734 5.35044,44.5043 16.0159,64.1698 10.4883,19.8427 24.9805,36.142 43.1578,49.1461 13.6773,10.0276 32.3506,18.6734 55.843,25.6892 23.6695,6.98037 49.0043,10.4883 76.0045,10.4883 40.6421,0 76.3234,-5.98824 107.15,-17.6812 30.827,-11.6576 53.5044,-27.4963 68.1738,-47.4807 14.6694,-20.1616 24.6616,-46.8429 30.1538,-80.3274l-85.8196 -11.8347c-4.00397,26.6459 -15.3426,47.4807 -34.016,62.5044 -18.6379,14.9883 -45.1421,22.5002 -79.2998,22.5002 -40.3586,0 -69.1659,-6.66147 -86.3511,-20.0198 -17.3269,-13.3229 -26.0081,-28.9845 -26.0081,-46.8075 0,-11.5158 3.68507,-21.6852 10.8426,-30.8624 7.15754,-9.49614 18.319,-17.1497 33.6617,-23.4923 8.8229,-3.15357 34.6892,-10.6654 77.6699,-22.323 62.1855,-16.6891 105.485,-30.1892 130.005,-40.8547 24.6616,-10.4883 44.0082,-25.9726 58.0044,-46.1342 13.9962,-20.197 20.9765,-45.1775 20.9765,-75.1896 0,-29.3388 -8.64574,-56.8351 -25.6537,-82.8432 -17.1497,-25.8309 -41.8468,-45.8153 -73.9848,-59.9887 -32.1735,-14.1733 -68.6698,-21.1537 -109.347,-21.1537 -67.5005,0 -118.843,13.9962 -154.171,41.9885 -35.327,27.9923 -57.8272,69.4848 -67.5005,124.513z"/></glyph>
<glyph unicode="u" horiz-adv-x="610"><path d="M413.153 0l0 77.6699c-18.9923,-27.6734 -43.8311,-49.5004 -74.4809,-65.5163 -30.827,-15.8033 -63.3548,-23.8112 -97.5126,-23.8112 -34.831,0 -65.9769,7.6536 -93.6503,22.8191 -27.6734,15.3426 -47.6933,36.8507 -60.1658,64.4887 -12.3308,27.6734 -18.4962,66.0123 -18.4962,114.839l0 328.007 137.162 0 0 -238.148c0,-73.0281 2.48033,-117.674 7.6536,-134.186 4.9961,-16.3348 14.1733,-29.3388 27.4963,-39.0121 13.3229,-9.63787 30.3309,-14.3151 50.8469,-14.3151 23.4923,0 44.5043,6.34257 63.0005,19.1694 18.4962,13.004 31.1459,28.8427 37.9846,47.835 6.83864,19.1694 10.3465,65.8352 10.3465,139.997l0 218.659 137.162 0 0 -518.496 -127.347 0z"/></glyph>
<glyph unicode="t" horiz-adv-x="277"><path d="M257.848 78.662l12.6497 -77.6699c-24.6616,-5.17327 -46.8429,-7.83077 -66.3312,-7.83077 -31.9963,0 -56.6579,4.9961 -74.3392,15.1655 -17.5041,9.9922 -29.8349,23.3506 -36.9924,39.8271 -7.15754,16.3348 -10.8426,51.024 -10.8426,103.678l0 298.349 -64.4887 0 0 68.3155 64.4887 0 0 128.517 87.5204 52.654 0 -181.171 88.3353 0 0 -68.3155 -88.3353 0 0 -303.168c0,-25.1931 1.4882,-41.1736 4.50004,-48.3311 3.15357,-7.19297 8.14967,-12.8623 15.1655,-17.1852 6.98037,-4.1457 16.9726,-6.34257 29.9766,-6.34257 9.85047,0 22.6773,1.1693 38.6932,3.5079z"/></glyph>
<glyph unicode="p" horiz-adv-x="610"><path d="M67.8194 518.496l128.021 0 0 -76.1463c16.4765,26.1498 38.9767,47.3035 67.3234,63.4966 28.3467,16.3348 59.8469,24.4844 94.3236,24.4844 60.1658,0 111.332,-23.6695 153.178,-70.8313 41.9885,-47.1618 63.0005,-112.997 63.0005,-197.328 0,-86.4928 -21.1537,-153.852 -63.3194,-201.828 -42.3429,-48.0122 -93.6858,-72.0006 -153.852,-72.0006 -28.6656,0 -54.6737,5.66934 -77.9888,17.008 -23.1734,11.4804 -47.6579,30.9687 -73.4888,58.6422l0 -261.321 -137.198 0 0 715.825zm135.851 -250.514c0,-58.1461 11.4804,-101.304 34.6538,-128.977 22.9962,-27.8506 51.1658,-41.8468 84.5085,-41.8468 31.8191,0 58.3233,12.8269 79.5124,38.3389 21.1537,25.512 31.8191,67.5005 31.8191,125.682 0,54.4965 -10.9843,94.8196 -32.8467,121.147 -21.8269,26.327 -48.8272,39.5082 -81.0006,39.5082 -33.4845,0 -61.3351,-12.8269 -83.481,-38.835 -22.1813,-25.8309 -33.1656,-64.1698 -33.1656,-115.017z"/></glyph>
</font>
<style type="text/css">
<![CDATA[
@font-face { font-family:"Courier New";src:url("#FontID1") format(svg)}
@font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
.str0 {stroke:#1F1A17;stroke-width:0.0762}
.fil1 {fill:#1F1A17}
.fil4 {fill:#383431}
.fil2 {fill:#C2C1C1}
.fil3 {fill:#DA251D}
.fil0 {fill:#DEDEDD}
.fil5 {fill:#1F1A17;fill-rule:nonzero}
.fnt3 {font-weight:normal;font-size:2.8222;font-family:'Arial'}
.fnt1 {font-weight:bold;font-size:2.8222;font-family:'Arial'}
.fnt2 {font-weight:bold;font-size:2.8222;font-family:'Courier New'}
.fnt0 {font-weight:bold;font-size:4.2333;font-family:'Arial'}
.fnt4 {font-weight:bold;font-size:4.2333;font-family:'Arial'}
]]>
</style>
</defs>
<g id="Warstwa_x0020_1">
<metadata id="CorelCorpID_0Corel-Layer"/>
<rect class="fil0 str0" x="41.5661" y="78.5186" width="50.1521" height="87.7064"/>
<rect class="fil0 str0" x="120.306" y="78.5186" width="50.1521" height="87.282"/>
<text x="43.8552" y="84.1373" class="fil1 fnt0">WR miNIC</text>
<text x="122.595" y="84.1373" class="fil1 fnt0">WR endpoint</text>
<rect class="fil2 str0" x="53.6983" y="86.8794" width="39.8106" height="38.1409"/>
<rect class="fil2 str0" x="53.6983" y="127.519" width="39.8106" height="31.0234"/>
<rect class="fil2 str0" x="117.198" y="86.8794" width="39.8106" height="38.1409"/>
<rect class="fil2 str0" x="117.198" y="127.519" width="39.8106" height="31.0234"/>
<text x="54.4789" y="90.262" class="fil1 fnt1">TX output (packet source)</text>
<text x="54.4789" y="130.902" class="fil1 fnt1">RX input (packet sink)</text>
<text x="117.979" y="90.262" class="fil1 fnt1">TX input (packet sink)</text>
<text x="117.979" y="130.902" class="fil1 fnt1">RX output (packet source)</text>
<text x="66.5995" y="93.5943" class="fil3 fnt2">rx_data_o[15:0]</text>
<text x="68.2933" y="96.7914" class="fil3 fnt2">rx_ctrl_o[3:0]</text>
<text x="76.7623" y="99.9885" class="fil3 fnt2">rx_dreq_i</text>
<text x="75.0685" y="103.186" class="fil3 fnt2">rx_valid_o</text>
<text x="71.6809" y="106.383" class="fil3 fnt2">rx_bytesel_o</text>
<text x="75.0685" y="109.58" class="fil3 fnt2">rx_sof_p_o</text>
<text x="75.0685" y="112.777" class="fil3 fnt2">rx_eof_p_o</text>
<text x="71.6809" y="115.974" class="fil3 fnt2">rx_error_p_o</text>
<text x="71.6809" y="119.171" class="fil4 fnt2">rx_error_p_i</text>
<text x="71.6809" y="122.368" class="fil4 fnt2">rx_abort_p_i</text>
<text x="118.363" y="133.888" class="fil3 fnt2">rx_data_o[15:0]</text>
<text x="118.363" y="137.085" class="fil3 fnt2">rx_ctrl_o[3:0]</text>
<text x="118.363" y="140.282" class="fil3 fnt2">rx_dreq_i</text>
<text x="118.363" y="143.479" class="fil3 fnt2">rx_valid_o</text>
<text x="118.363" y="146.676" class="fil3 fnt2">rx_bytesel_o</text>
<text x="118.363" y="149.873" class="fil3 fnt2">rx_sof_p_o</text>
<text x="118.363" y="153.07" class="fil3 fnt2">rx_eof_p_o</text>
<text x="118.363" y="156.267" class="fil3 fnt2">rx_error_p_o</text>
<text x="119.303" y="94.2114" class="fil3 fnt2">tx_data_i[15:0]</text>
<text x="119.303" y="97.4085" class="fil3 fnt2">tx_ctrl_i[3:0]</text>
<text x="119.303" y="100.606" class="fil3 fnt2">tx_dreq_o</text>
<text x="119.303" y="103.803" class="fil3 fnt2">tx_valid_i</text>
<text x="119.303" y="107" class="fil3 fnt2">tx_bytesel_i</text>
<text x="119.303" y="110.197" class="fil3 fnt2">tx_sof_p_i</text>
<text x="119.303" y="113.394" class="fil3 fnt2">tx_eof_p_i</text>
<text x="119.303" y="116.591" class="fil4 fnt2">tx_error_p_o</text>
<text x="119.303" y="119.788" class="fil4 fnt2">tx_abort_p_o</text>
<text x="67.1927" y="133.984" class="fil3 fnt2">tx_data_i[15:0]</text>
<text x="68.8865" y="137.182" class="fil3 fnt2">tx_ctrl_i[3:0]</text>
<text x="77.3555" y="140.379" class="fil3 fnt2">tx_dreq_o</text>
<text x="75.6617" y="143.576" class="fil3 fnt2">tx_valid_i</text>
<text x="72.2741" y="146.773" class="fil3 fnt2">tx_bytesel_i</text>
<text x="75.6617" y="149.97" class="fil3 fnt2">tx_sof_p_i</text>
<text x="75.6617" y="153.167" class="fil3 fnt2">tx_eof_p_i</text>
<text x="72.2741" y="156.364" class="fil4 fnt2">tx_error_p_i</text>
<g>
<path class="fil5" d="M115.545 92.9611l-22.0023 0 0 -0.1764 22.0023 0 0 0.1764zm-0.1465 -1.0177l1.6898 0.9295 -1.6898 0.9295 0 -1.859z"/>
</g>
<g>
<path class="fil5" d="M95.1697 133.425l22.0023 0 0 0.1764 -22.0023 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M115.545 96.1111l-22.0023 0 0 -0.1764 22.0023 0 0 0.1764zm-0.1465 -1.0177l1.6898 0.9295 -1.6898 0.9295 0 -1.859z"/>
</g>
<g>
<path class="fil5" d="M95.1697 136.575l22.0023 0 0 0.1764 -22.0023 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M95.0855 99.2791l22.0023 0 0 0.1764 -22.0023 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M115.629 140.096l-22.0023 0 0 -0.1764 22.0023 0 0 0.1764zm-0.1465 -1.0177l1.6898 0.9295 -1.6898 0.9295 0 -1.859z"/>
</g>
<g>
<path class="fil5" d="M115.545 102.481l-22.0023 0 0 -0.1764 22.0023 0 0 0.1764zm-0.1465 -1.0177l1.6898 0.9295 -1.6898 0.9295 0 -1.859z"/>
</g>
<g>
<path class="fil5" d="M95.1697 142.944l22.0023 0 0 0.1764 -22.0023 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M115.545 105.818l-22.0023 0 0 -0.1764 22.0023 0 0 0.1764zm-0.1465 -1.0177l1.6898 0.9295 -1.6898 0.9295 0 -1.859z"/>
</g>
<g>
<path class="fil5" d="M95.1697 146.282l22.0023 0 0 0.1764 -22.0023 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M115.545 109.041l-22.0023 0 0 -0.1764 22.0023 0 0 0.1764zm-0.1465 -1.0177l1.6898 0.9295 -1.6898 0.9295 0 -1.859z"/>
</g>
<g>
<path class="fil5" d="M95.1697 149.505l22.0023 0 0 0.1764 -22.0023 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M115.545 112.264l-22.0023 0 0 -0.1764 22.0023 0 0 0.1764zm-0.1465 -1.0177l1.6898 0.9295 -1.6898 0.9295 0 -1.859z"/>
</g>
<g>
<path class="fil5" d="M95.1697 152.728l22.0023 0 0 0.1764 -22.0023 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M95.1697 155.839l22.0023 0 0 0.1764 -22.0023 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M118.618 164.159l0 -1.859 1.6898 0.9295 -1.6898 0.9295zm-25.3521 -1.0177l25.4986 0 0 0.1764 -25.4986 0 0 -0.1764zm0.1465 1.0177l-1.6898 -0.9295 1.6898 -0.9295 0 1.859z"/>
</g>
<g>
<path class="fil5" d="M95.1628 118.703l0.0048 -0.1758 0.9152 0.0182 0.851 -0.0008 0.7911 -0.0187 0.7367 -0.0353 0.687 -0.0507 0.6425 -0.0647 0.6029 -0.0779 0.5683 -0.0897 0.5387 -0.1005 0.5143 -0.1097 0.4945 -0.1185 0.4805 -0.1257 0.4706 -0.1318 0.4665 -0.1365 0.4665 -0.1406 0.4725 -0.1431 0.4826 -0.1444 0.4981 -0.1449 0.5181 -0.1438 0.5431 -0.1416 0.5735 -0.1383 0.6081 -0.1336 0.6481 -0.1279 0.6924 -0.1209 0.7424 -0.1129 0.7966 -0.1035 0.8564 -0.0927 0.9207 -0.0815 0.9895 -0.0682 1.0644 -0.0542 1.1433 -0.039 1.2276 -0.0226 0.0014 0.1758 -1.2248 0.0226 -1.1407 0.039 -1.0608 0.0542 -0.9869 0.0682 -0.9171 0.0807 -0.8524 0.0927 -0.793 0.1029 -0.7384 0.1121 -0.689 0.1203 -0.6439 0.1271 -0.6047 0.133 -0.5699 0.1375 -0.5405 0.141 -0.5159 0.1432 -0.4961 0.1441 -0.4818 0.1444 -0.4719 0.1431 -0.4679 0.1406 -0.4679 0.1373 -0.4734 0.1324 -0.4831 0.1263 -0.4987 0.1193 -0.5185 0.1111 -0.5435 0.1011 -0.5731 0.0905 -0.6077 0.0785 -0.6473 0.0655 -0.6918 0.0507 -0.7409 0.0353 -0.7953 0.0187 -0.8544 0.0008 -0.9186 -0.0182zm0.1214 0.8456l-1.6616 -0.979 1.7165 -0.8792 -0.0549 1.8582z"/>
</g>
<g>
<path class="fil5" d="M95.1112 122.087l0.0048 -0.1758 0.9152 0.0182 0.851 -0.0008 0.7911 -0.0187 0.7368 -0.0353 0.687 -0.0507 0.6424 -0.0647 0.6029 -0.0779 0.5684 -0.0897 0.5386 -0.1005 0.5143 -0.1097 0.4945 -0.1185 0.4806 -0.1257 0.4706 -0.1318 0.4664 -0.1365 0.4665 -0.1406 0.4725 -0.1431 0.4826 -0.1444 0.4981 -0.1449 0.5181 -0.1438 0.5432 -0.1416 0.5734 -0.1383 0.6081 -0.1336 0.6481 -0.1279 0.6925 -0.1209 0.7423 -0.1129 0.7966 -0.1035 0.8564 -0.0927 0.9207 -0.0815 0.9895 -0.0682 1.0644 -0.0542 1.1433 -0.039 1.2276 -0.0226 0.0014 0.1758 -1.2248 0.0226 -1.1407 0.039 -1.0608 0.0542 -0.9869 0.0682 -0.9171 0.0807 -0.8524 0.0927 -0.793 0.1029 -0.7383 0.1121 -0.6891 0.1203 -0.6439 0.1271 -0.6047 0.133 -0.5698 0.1375 -0.5406 0.141 -0.5159 0.1432 -0.4961 0.1441 -0.4818 0.1444 -0.4719 0.1431 -0.4679 0.1406 -0.4678 0.1373 -0.4734 0.1324 -0.4832 0.1263 -0.4987 0.1193 -0.5185 0.1111 -0.5434 0.1011 -0.5732 0.0905 -0.6077 0.0785 -0.6472 0.0655 -0.6918 0.0507 -0.741 0.0353 -0.7953 0.0187 -0.8544 0.0008 -0.9186 -0.0182zm0.1214 0.8456l-1.6616 -0.979 1.7165 -0.8792 -0.0549 1.8582z"/>
</g>
<text x="97.5448" y="162.622" class="fil1 fnt3">system clock</text>
<rect class="fil0 str0" x="8.3124" y="113.031" width="22.7796" height="21.8536"/>
<rect class="fil0 str0" x="180.873" y="112.905" width="22.7796" height="21.8536"/>
<text x="14.4796" y="125.247" class="fil1 fnt4">CPU</text>
<text x="188.06" y="123.306" class="fil1 fnt4">PHY</text>
<text x="186.295" y="128.035" class="fil1 fnt4">media</text>
<g>
<path class="fil5" d="M31.076 123.747l2.177 -1.0881 0 2.1769 -2.177 -1.0888zm8.4571 0.1764l-6.394 0 0 -0.3528 6.394 0 0 0.3528zm2.0631 -0.1764l-2.177 1.0888 0 -2.1769 2.177 1.0881z"/>
</g>
<g>
<path class="fil5" d="M180.889 124.043l-2.177 1.0881 0 -2.1769 2.177 1.0888zm-8.4571 -0.1764l6.394 0 0 0.3528 -6.394 0 0 -0.3528zm-2.0631 0.1764l2.177 -1.0888 0 2.1769 -2.177 -1.0881z"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Creator: CorelDRAW -->
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="215.9mm" height="279.4mm" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
viewBox="0 0 215.9 279.4">
<defs>
<font id="FontID1" font-variant="normal" style="fill-rule:nonzero" font-style="normal" font-weight="400,700">
<font-face
font-family="Courier New">
</font-face>
<missing-glyph><path d="M0 0z"/></missing-glyph>
<glyph unicode="5" horiz-adv-x="600"><path d="M187.017 571.327l0 -200.659c24.1655,9.9922 47.1618,17.6812 69.3076,22.6773 22.1813,4.9961 43.1578,7.47644 63.0005,7.47644 51.5201,0 94.5007,-18.0001 129.19,-54.1422 34.6538,-36.1775 51.9807,-83.6936 51.9807,-142.513 0,-65.1619 -19.4883,-117.851 -58.6776,-158.316 -38.9767,-40.3586 -87.8038,-60.5202 -146.481,-60.5202 -38.6578,0 -76.0045,8.68117 -111.686,25.8309 -25.4766,12.1891 -48.4728,27.0002 -69.3076,45.0004 -12.508,10.6654 -18.6734,19.6655 -18.6734,26.823 0,5.8465 1.98427,10.8426 5.8465,14.8466 3.96854,4.18114 8.46857,6.1654 13.6418,6.1654 5.66934,0 11.5158,-3.01183 17.6812,-8.8229 49.1461,-45.8508 102.65,-68.847 160.655,-68.847 47.835,0 87.3432,16.3348 118.666,49.1815 31.1813,32.6695 46.8429,76.1463 46.8429,130.501 0,46.3114 -13.5001,83.481 -40.5003,111.65 -27.0002,28.1695 -61.3351,42.1657 -103.005,42.1657 -42.6618,0 -85.3235,-11.1615 -127.985,-33.6617 -10.3465,-5.17327 -17.6812,-7.83077 -22.0041,-7.83077 -5.8465,0 -10.5237,1.98427 -14.1733,5.8465 -3.5079,4.00397 -5.35044,9.49614 -5.35044,16.6537l0 271.986 286.195 0c9.63787,0 16.6537,-1.98427 20.9765,-5.81107 4.18114,-4.00397 6.34257,-9.00007 6.34257,-15.1655 0,-5.8465 -2.16143,-10.8426 -6.34257,-14.6694 -4.32287,-4.00397 -11.3387,-5.8465 -20.9765,-5.8465l-245.163 0z"/></glyph>
<glyph unicode="4" horiz-adv-x="600"><path d="M376.515 171.32l-272.022 0 0 47.5161 228.014 393.983 85.5007 0 0 -400.503 34.1577 0c9.9922,0 17.1852,-1.8071 21.508,-5.49217 4.1457,-3.8268 6.34257,-8.8229 6.34257,-14.9883 0,-5.8465 -2.19687,-10.6654 -6.34257,-14.6694 -4.32287,-3.8268 -11.5158,-5.8465 -21.508,-5.8465l-34.1577 0 0 -130.324 34.1577 0c9.9922,0 17.1852,-1.84253 21.508,-5.66934 4.1457,-3.64964 6.34257,-8.64574 6.34257,-14.8111 0,-5.8465 -2.19687,-10.6654 -6.34257,-14.6694 -4.32287,-3.86224 -11.5158,-5.8465 -21.508,-5.8465l-152.328 0c-10.1694,0 -17.3269,1.98427 -21.508,5.8465 -4.1457,4.00397 -6.34257,8.8229 -6.34257,14.6694 0,6.1654 2.19687,11.1615 6.34257,14.8111 4.18114,3.8268 11.3387,5.66934 21.508,5.66934l76.6778 0 0 130.324zm0 40.9964l0 359.011 -21.508 0 -207.498 -359.011 229.006 0z"/></glyph>
<glyph unicode="9" horiz-adv-x="600"><path d="M468.323 346.68c-21.1537,-37.5239 -46.3114,-65.5163 -75.473,-84.5085 -29.1971,-18.8505 -59.032,-28.3467 -89.6818,-28.3467 -28.3467,0 -55.6658,8.1851 -82.1699,24.5199 -26.5041,16.1576 -47.6579,40.146 -63.3194,71.5045 -15.5198,31.3231 -23.3506,64.3115 -23.3506,98.8236 0,50.1736 15.5198,95.8118 46.4886,136.985 31.1813,41.1736 72.6738,61.8312 124.867,61.8312 37.1342,0 70.973,-11.6576 101.481,-34.6538 30.6853,-23.1734 54.4965,-56.6579 71.3273,-100.666 21.8269,-56.339 32.6695,-121.678 32.6695,-196.336 0,-57.8272 -9.17724,-106.017 -27.8152,-144.497 -12.3308,-26.0081 -30.5081,-51.1658 -54.3548,-75.6856 -23.9884,-24.3073 -50.8114,-44.3271 -80.8235,-59.4926 -40.9964,-20.4805 -83.6581,-30.827 -127.985,-30.827 -29.1971,0 -53.1855,5.49217 -71.6817,16.6537 -8.504,5.17327 -12.8269,11.693 -12.8269,19.5238 0,5.49217 1.98427,10.1694 5.98824,13.819 3.8268,3.8268 8.504,5.66934 14.1733,5.66934 3.8268,0 9.49614,-1.84253 17.008,-5.315 12.6497,-6.1654 27.3191,-9.3544 43.9728,-9.3544 69.3431,0 128.836,25.0159 178.69,75.0124 49.8193,49.9965 74.6581,112.501 74.6581,187.655 0,13.6773 -0.673234,32.9884 -1.84253,57.6855zm-7.83077 68.3155c-17.3269,66.1541 -38.6578,111.154 -64.3115,135.001 -25.512,23.9884 -55.3469,36.0003 -89.5046,36.0003 -34.831,0 -65.5163,-14.6694 -91.8432,-44.0082 -26.327,-29.3388 -39.5082,-66.8273 -39.5082,-112.82 0,-44.5043 13.1812,-81.4967 39.5082,-110.517 26.327,-29.1616 56.1619,-43.8311 89.3275,-43.8311 19.1694,0 38.1617,5.35044 57.0123,15.6615 18.6734,10.5237 36.3192,26.0081 52.8311,46.8429 10.8426,13.9962 26.327,40.0043 46.4886,77.6699z"/></glyph>
<glyph unicode="8" horiz-adv-x="600"><path d="M384.346 317.837c34.1577,-16.5119 59.9887,-38.5161 77.3156,-65.658 17.5041,-27.1774 26.1852,-56.339 26.1852,-87.6621 0,-48.5083 -18.3545,-90.5322 -54.6737,-126.001 -36.4964,-35.3625 -80.8235,-53.1855 -132.84,-53.1855 -52.1579,0 -96.3433,17.823 -132.84,53.1855 -36.4964,35.4688 -54.6737,77.4927 -54.6737,126.001 0,30.9687 8.68117,59.9887 26.1852,87.166 17.3269,27.1419 43.335,49.3232 77.8116,66.1541 -29.9766,17.3269 -51.8036,35.1499 -65.4808,53.8233 -18.8505,26.327 -28.3467,55.4886 -28.3467,87.3432 0,44.8232 17.3269,84.1542 52.0162,117.816 34.6538,33.8388 76.5006,50.6697 125.328,50.6697 49.1815,0 90.9928,-16.8308 125.505,-50.6697 34.5121,-33.6617 51.6618,-72.9927 51.6618,-117.816 0,-31.8546 -9.31897,-60.8391 -28.3467,-86.9889 -13.3229,-18.8505 -34.9727,-36.8507 -64.8076,-54.1776zm51.1658 139.678c0,35.1499 -13.004,65.3037 -39.331,90.6385 -26.1852,25.1931 -58.3587,37.8428 -96.3433,37.8428 -37.8428,0 -69.8391,-12.8269 -95.9889,-38.1617 -26.1852,-25.3348 -39.331,-55.3469 -39.331,-89.8235 0,-31.8546 12.9686,-59.8469 38.7995,-83.6936 25.8663,-23.9884 58.0044,-36.0003 96.5204,-36.0003 38.6578,0 71.0084,12.0119 96.8393,36.0003 25.9726,23.8466 38.835,51.6973 38.835,83.1975zm11.3387 -294.026c0,36.1775 -14.0316,67.6777 -42.024,94.359 -27.9923,26.6459 -62.8233,39.9688 -104.493,39.9688 -41.6696,0 -76.5006,-13.3229 -104.493,-39.9688 -27.9923,-26.6813 -42.024,-58.0044 -42.024,-93.8629 0,-36.9924 14.0316,-69.3076 42.2011,-96.6622 28.1341,-27.3191 62.9651,-40.9964 104.316,-40.9964 41.3507,0 76.0045,13.6773 104.174,40.9964 28.1695,27.3545 42.3429,59.4926 42.3429,96.1661z"/></glyph>
<glyph unicode="3" horiz-adv-x="600"><path d="M384.346 333.499c37.6657,-17.008 66.473,-40.1814 86.3156,-69.4848 19.8427,-29.516 29.8349,-60.1658 29.8349,-92.1976 0,-49.1461 -19.9844,-92.481 -59.8469,-130.147 -39.8271,-37.4885 -89.8235,-56.339 -149.635,-56.339 -35.1853,0 -71.6817,7.51187 -109.347,22.5002 -37.8428,14.9883 -64.1698,30.3309 -79.1581,45.8508 -4.85437,5.315 -7.3347,10.8072 -7.3347,16.6537 0,5.17327 1.98427,9.6733 5.66934,13.6773 3.64964,3.8268 8.14967,5.81107 13.5001,5.81107 5.17327,0 10.9843,-2.48033 17.5041,-7.3347 50.4925,-37.3113 103.82,-56.1619 160.159,-56.1619 47.4807,0 87.3432,15.0237 119.34,44.6815 32.138,29.8349 48.1539,63.0005 48.1539,99.3197 0,24.5199 -8.00794,48.5083 -23.6695,71.8234 -15.8387,23.5277 -38.4806,42.024 -68.1738,55.5241 -29.6577,13.5001 -59.4926,20.1616 -89.8235,20.1616 -9.85047,0 -16.8308,1.84253 -21.012,5.66934 -4.1457,3.64964 -6.30714,8.64574 -6.30714,14.8111 0,5.8465 1.98427,10.8426 6.1654,14.6694 4.00397,4.00397 10.1694,5.8465 18.1419,5.8465l35.1853 -0.496067c36.8153,0 67.1462,11.3387 91.17,33.8388 23.8112,22.323 35.8231,48.4728 35.8231,77.9888 0,30.6853 -12.508,57.6855 -37.6657,81.1778 -25.0159,23.3151 -57.6501,35.1499 -98.0086,35.1499 -28.3112,0 -54.4965,-4.9961 -78.166,-14.6694 -23.8112,-9.81504 -42.8389,-23.1734 -57.154,-40.146 -5.17327,-6.51974 -9.17724,-10.5237 -12.0119,-11.8347 -2.6575,-1.52363 -5.81107,-2.3386 -9.49614,-2.3386 -5.49217,0 -10.1694,1.98427 -14.1733,5.66934 -3.8268,3.8268 -5.81107,8.14967 -5.81107,13.5001 0,13.004 14.1379,29.3388 42.4846,49.3232 39.331,27.6734 84.1542,41.4925 134.328,41.4925 51.6618,0 94.1818,-15.6615 127.347,-46.6657 33.1656,-31.1459 49.8193,-68.1738 49.8193,-111.154 0,-27.3191 -8.00794,-53.1855 -23.8112,-77.4927 -16.0159,-24.5199 -39.5082,-44.0082 -70.3352,-58.6776z"/></glyph>
<glyph unicode="2" horiz-adv-x="600"><path d="M123.485 40.9964l315.002 0 0 16.1576c0,9.6733 2.0197,16.6891 5.8465,21.012 3.8268,4.18114 9.00007,6.34257 15.1655,6.34257 5.8465,0 10.6654,-2.16143 14.6694,-6.34257 3.8268,-4.32287 5.8465,-11.3387 5.8465,-21.012l0 -57.154 -396.499 0 0 60.4847c83.3038,75.0124 164.304,151.194 243.144,228.51 36.8507,36.1775 62.0084,62.6816 75.6856,79.6896 13.6418,16.8308 22.9962,31.8191 28.1695,44.646 4.9961,12.8269 7.47644,25.8309 7.47644,38.835 0,35.1853 -14.1733,66.1541 -42.4846,93.1543 -28.3467,27.1774 -62.5044,40.6775 -102.509,40.6775 -35.8231,0 -67.5005,-10.3465 -95.174,-30.827 -27.6734,-20.5159 -45.6736,-45.8508 -53.8233,-76.1817 -1.84253,-7.83077 -4.32287,-12.8269 -7.3347,-15.1655 -3.8268,-3.15357 -8.32684,-4.81894 -13.6773,-4.81894 -5.49217,0 -10.1694,1.84253 -13.819,5.66934 -3.8268,3.64964 -5.66934,8.14967 -5.66934,13.3229 0,15.6615 8.504,36.8507 25.6537,63.4966 17.008,26.6813 40.6775,47.6579 70.8313,63.0005 30.012,15.3426 60.8391,22.9962 92.5165,22.9962 51.1658,0 94.9968,-17.823 131.847,-53.3272 36.8153,-35.5042 55.1343,-75.6502 55.1343,-120.509 0,-18.9923 -3.15357,-36.3192 -9.31897,-51.9807 -6.1654,-15.8387 -16.6537,-33.1656 -31.5002,-51.839 -14.8466,-18.6734 -41.3153,-46.9846 -79.8313,-84.6503 -96.3433,-95.0322 -174.651,-168.84 -235.348,-221.175l0 -3.01183z"/></glyph>
<glyph unicode="7" horiz-adv-x="600"><path d="M437.992 552.654l0 18.6734 -293.991 0 0 -36.1775c0,-9.81504 -1.84253,-16.8308 -5.49217,-20.9765 -3.8268,-4.18114 -8.85834,-6.34257 -15.0237,-6.34257 -5.81107,0 -10.6654,2.16143 -14.6694,6.34257 -3.8268,4.1457 -5.81107,11.1615 -5.81107,20.9765l0 77.6699 376.479 0 0 -65.4808 -164.978 -527.355c-2.6575,-8.46857 -5.66934,-13.9962 -9.3544,-16.8308 -3.47247,-2.83467 -7.6536,-4.1457 -12.1536,-4.1457 -5.8465,0 -10.8426,1.98427 -14.6694,5.81107 -4.00397,4.00397 -5.8465,8.504 -5.8465,13.6773 0,3.33073 1.02757,7.83077 2.83467,13.6773l162.675 520.48z"/></glyph>
<glyph unicode="6" horiz-adv-x="600"><path d="M177.663 259.337c25.512,37.3468 51.5201,64.9848 78.5203,82.9849 26.823,17.8584 56.6579,26.8585 89.4692,26.8585 43.6893,0 82.3471,-18.1773 116.186,-54.4965 33.9806,-36.3546 50.8114,-81.1778 50.8114,-134.505 0,-48.8626 -15.4844,-93.5086 -46.3114,-134.009 -31.0042,-40.5003 -73.6659,-60.8391 -128.021,-60.8391 -35.4688,0 -68.4927,11.0198 -99.3197,32.6695 -30.6498,21.8269 -54.8154,55.3469 -72.4966,100.666 -21.8269,56.339 -32.6695,118.666 -32.6695,187.017 0,51.4847 10.1694,99.3197 30.6853,143.47 15.6615,34.1932 36.4964,64.347 62.469,90.1779 26.1852,25.8309 56.5162,46.9846 91.17,63.4966 34.6892,16.3348 72.1777,24.6616 112.501,24.6616 27.3545,0 50.1736,-5.66934 68.3509,-16.6537 7.83077,-4.81894 11.6576,-11.3387 11.6576,-19.4883 0,-5.8465 -1.66537,-10.6654 -5.315,-14.5277 -3.5079,-3.64964 -8.1851,-5.49217 -13.6773,-5.49217 -4.18114,0 -9.17724,1.66537 -15.1655,4.85437 -13.3584,6.4843 -29.8349,9.81504 -49.6776,9.81504 -63.4966,0 -121.324,-27.3191 -173.659,-81.8156 -52.1579,-54.5319 -78.3431,-119.34 -78.3431,-194.671 0,-10.6654 0.992134,-27.4963 2.83467,-50.1736zm9.3544 -67.9966c12.3308,-59.1737 31.8191,-101.517 58.3233,-126.851 26.5041,-25.4766 57.8272,-38.1617 94.0047,-38.1617 36.4964,0 67.6423,14.3505 93.4732,42.8389 25.8309,28.3467 38.835,65.5163 38.835,111.013 0,42.6618 -13.004,77.9888 -38.9767,105.981 -26.1852,27.9923 -55.5241,42.024 -88.5125,42.024 -31.5002,0 -62.0084,-13.5001 -91.17,-40.5003 -19.6655,-18.0001 -41.4925,-50.0319 -65.9769,-96.3433z"/></glyph>
<glyph unicode="1" horiz-adv-x="600"><path d="M320.317 621.182l0 -580.186 140.67 0c9.6733,0 16.6891,-1.84253 21.012,-5.66934 4.18114,-3.64964 6.34257,-8.64574 6.34257,-14.8111 0,-5.8465 -2.16143,-10.6654 -6.34257,-14.6694 -4.32287,-3.86224 -11.3387,-5.8465 -21.012,-5.8465l-322.337 0c-9.81504,0 -16.8308,1.98427 -20.9765,5.8465 -4.18114,4.00397 -6.34257,8.8229 -6.34257,14.6694 0,6.1654 2.16143,11.1615 6.34257,14.8111 4.1457,3.8268 11.1615,5.66934 20.9765,5.66934l140.67 0 0 523.492 -133.832 -41.9885c-6.4843,-1.98427 -11.1615,-3.01183 -14.1733,-3.01183 -4.81894,0 -9.31897,2.0197 -13.3229,6.1654 -4.1457,4.00397 -6.1654,8.85834 -6.1654,14.3505 0,4.9961 1.66537,9.49614 4.85437,13.6773 2.6575,2.6575 7.9725,5.315 16.1576,8.32684l187.478 59.1737z"/></glyph>
<glyph unicode="0" horiz-adv-x="600"><path d="M488.342 356.991l0 -101.658c0,-88.1582 -21.012,-157.997 -63.0005,-209.482 -33.0239,-40.3586 -74.5163,-60.5202 -124.513,-60.5202 -24.1655,0 -46.8429,4.81894 -68.1738,14.4922 -21.3309,9.49614 -39.4728,22.9962 -54.4965,40.1814 -9.31897,10.8426 -19.6655,27.9923 -31.0042,51.839 -11.1615,23.6695 -19.1694,45.4964 -24.1655,65.3391 -7.47644,27.9923 -11.1615,60.8036 -11.1615,98.1504l0 101.658c0,88.5125 21.012,158.493 63.0005,209.836 32.8467,40.5003 74.3392,60.6619 124.513,60.6619 24.3427,0 47.1618,-4.81894 68.3155,-14.4922 21.1891,-9.49614 39.1893,-22.9962 54.1776,-40.146 9.81504,-11.1969 20.1616,-28.5238 31.3231,-52.3351 11.0198,-23.8466 19.1694,-45.3547 24.3427,-65.0202 7.15754,-27.9923 10.8426,-60.8391 10.8426,-98.5047zm-40.9964 -5.49217c0,38.835 -5.5276,74.8352 -16.5119,108.178 -10.8426,33.3073 -23.1734,59.9887 -36.8507,79.8313 -8.14967,11.4804 -18.6379,21.1537 -31.642,29.3388 -18.4962,11.3032 -39.331,17.1497 -62.5044,17.1497 -45.9925,0 -81.851,-23.4923 -108.001,-70.3352 -26.0081,-46.8429 -39.0121,-101.658 -39.0121,-164.163l0 -90.3196c0,-38.6932 5.49217,-74.8352 16.3348,-108.355 11.0198,-33.4845 23.3506,-60.1658 37.3468,-79.9731 7.83077,-11.1969 18.319,-20.6931 31.3231,-28.8427 18.4962,-11.8347 39.5082,-17.6812 63.0005,-17.6812 45.4964,0 81.355,23.4923 107.328,70.6895 26.0081,46.9846 39.1893,101.658 39.1893,164.163l0 90.3196z"/></glyph>
<glyph unicode="X" horiz-adv-x="600"><path d="M324.676 292.502l194.813 -251.506 15.6615 0c9.85047,0 16.8663,-1.84253 21.012,-5.66934 4.18114,-3.64964 6.34257,-8.64574 6.34257,-14.8111 0,-5.8465 -2.16143,-10.6654 -6.34257,-14.6694 -4.1457,-3.86224 -11.1615,-5.8465 -21.012,-5.8465l-131.812 0c-9.85047,0 -16.8308,1.98427 -21.012,5.8465 -4.1457,4.00397 -6.34257,8.8229 -6.34257,14.6694 0,6.1654 2.19687,11.1615 6.34257,14.8111 4.18114,3.8268 11.1615,5.66934 21.012,5.66934l65.4808 0 -169.478 217.844 -167.493 -217.844 65.4808 0c9.6733,0 16.6891,-1.84253 21.012,-5.66934 4.1457,-3.64964 6.34257,-8.64574 6.34257,-14.8111 0,-5.8465 -2.19687,-10.6654 -6.34257,-14.6694 -4.32287,-3.86224 -11.3387,-5.8465 -21.012,-5.8465l-130.997 0c-9.6733,0 -16.6537,1.98427 -21.012,5.8465 -4.1457,4.00397 -6.30714,8.8229 -6.30714,14.6694 0,4.50004 1.31103,8.64574 4.00397,12.1536 2.48033,3.64964 5.49217,5.8465 8.8229,6.83864 3.15357,0.992134 13.1458,1.4882 29.6577,1.4882l192.509 251.506 -183.686 237.829 -15.1655 0c-9.63787,0 -16.6537,1.84253 -20.9765,5.49217 -4.18114,3.8268 -6.34257,8.85834 -6.34257,15.0237 0,6.1654 2.16143,11.1615 6.34257,14.8111 4.32287,3.8268 11.3387,5.66934 20.9765,5.66934l111.863 0c10.1339,0 17.3269,-1.84253 21.4726,-5.66934 4.18114,-3.64964 6.34257,-8.64574 6.34257,-14.8111 0,-6.1654 -2.16143,-11.1969 -6.34257,-15.0237 -4.1457,-3.64964 -11.3387,-5.49217 -21.4726,-5.49217l-45.8508 0 158.174 -204.663 157.147 204.663 -45.8153 0c-10.1694,0 -17.3269,1.84253 -21.508,5.49217 -4.18114,3.8268 -6.34257,8.85834 -6.34257,15.0237 0,6.1654 2.16143,11.1615 6.34257,14.8111 4.18114,3.8268 11.3387,5.66934 21.508,5.66934l112.324 0c9.6733,0 16.6537,-1.84253 21.012,-5.66934 4.1457,-3.64964 6.34257,-8.64574 6.34257,-14.8111 0,-6.1654 -2.19687,-11.1969 -6.34257,-15.0237 -4.3583,-3.64964 -11.3387,-5.49217 -21.012,-5.49217l-15.6615 0 -182.659 -237.829z"/></glyph>
<glyph unicode="b" horiz-adv-x="600"><path d="M145.489 612.82l0 -271.986c49.5004,64.4887 109.17,96.6622 179.186,96.6622 59.9887,0 111.154,-21.6498 153.816,-65.1619 42.6618,-43.5122 63.9926,-96.8393 63.9926,-160.017 0,-63.6383 -21.6498,-117.816 -64.6659,-161.966 -43.1578,-44.3626 -94.1464,-66.5084 -153.143,-66.5084 -71.5045,0 -131.351,32.3152 -179.186,96.6622l0 -80.5046 -96.1661 0c-9.81504,0 -16.8308,1.98427 -20.9765,5.8465 -4.18114,4.00397 -6.34257,8.8229 -6.34257,14.6694 0,6.1654 2.16143,11.1615 6.34257,14.8111 4.1457,3.8268 11.1615,5.66934 20.9765,5.66934l55.1697 0 0 530.331 -55.1697 0c-9.81504,0 -16.8308,1.84253 -20.9765,5.8465 -4.18114,3.8268 -6.34257,9.00007 -6.34257,15.1655 0,5.81107 2.16143,10.6654 6.34257,14.6694 4.1457,3.8268 11.1615,5.81107 20.9765,5.81107l96.1661 0zm355.999 -402.31c0,51.6618 -17.823,95.4929 -53.3272,131.493 -35.327,36.0003 -76.8195,54.0004 -124.477,54.0004 -47.5161,0 -89.0086,-18.0001 -124.513,-54.0004 -35.5042,-36.0003 -53.1855,-79.8313 -53.1855,-131.493 0,-51.839 17.6812,-95.67 53.1855,-131.67 35.5042,-36.0003 76.9967,-54.0004 124.513,-54.0004 47.6579,0 89.1503,18.0001 124.477,54.0004 35.5042,36.0003 53.3272,79.8313 53.3272,131.67z"/></glyph>
<glyph unicode="a" horiz-adv-x="600"><path d="M418.007 0l0 59.1737c-59.6698,-50.1736 -123.166,-75.3313 -191.021,-75.3313 -49.1461,0 -87.4849,12.508 -115.158,37.3113 -27.6734,25.0159 -41.4925,55.5241 -41.4925,91.6661 0,39.6854 18.1773,74.3392 54.6737,103.997 36.4964,29.6931 89.6464,44.3626 159.663,44.3626 18.8151,0 39.331,-1.1693 61.5123,-3.68507 22.1458,-2.3386 46.1342,-6.1654 71.8234,-11.3387l0 66.3312c0,22.5002 -10.5237,42.024 -31.3231,58.6776 -20.8348,16.5119 -52.0162,24.8388 -93.6858,24.8388 -31.9963,0 -76.6778,-9.31897 -134.328,-27.8506 -10.3465,-3.33073 -17.008,-4.81894 -20.0198,-4.81894 -5.13784,0 -9.63787,1.84253 -13.5001,5.8465 -3.64964,3.8268 -5.49217,8.8229 -5.49217,14.6694 0,5.49217 1.66537,9.81504 4.85437,13.1458 4.50004,4.85437 22.9962,11.5158 55.1697,20.0198 50.8114,13.6418 89.1503,20.4805 115.3,20.4805 51.6973,0 92.0204,-12.8269 121.005,-38.3389 29.0199,-25.4766 43.5122,-54.4965 43.5122,-86.67l0 -271.49 54.6737 0c10.1694,0 17.1497,-1.84253 21.508,-5.66934 4.1457,-3.64964 6.30714,-8.64574 6.30714,-14.8111 0,-5.8465 -2.16143,-10.6654 -6.30714,-14.6694 -4.3583,-3.86224 -11.3387,-5.8465 -21.508,-5.8465l-96.1661 0zm0 204.167c-19.1694,5.49217 -39.5082,9.49614 -61.0162,12.1536 -21.508,2.51577 -44.15,3.86224 -67.9966,3.86224 -59.4926,0 -105.981,-12.8623 -139.678,-38.5161 -25.2994,-19.1694 -37.9846,-42.1657 -37.9846,-68.847 0,-24.8033 9.6733,-45.6382 28.9845,-62.469 19.5238,-17.008 47.6933,-25.512 84.8629,-25.512 35.327,0 68.3155,7.15754 98.8236,21.3309 30.3309,14.1733 61.654,36.6735 94.0047,67.6777l0 90.3196z"/></glyph>
<glyph unicode="f" horiz-adv-x="600"><path d="M273.014 381.334l0 -340.337 180.143 0c9.6733,0 16.6891,-1.84253 21.012,-5.66934 4.18114,-3.64964 6.34257,-8.64574 6.34257,-14.8111 0,-5.8465 -2.16143,-10.6654 -6.34257,-14.6694 -4.32287,-3.86224 -11.3387,-5.8465 -21.012,-5.8465l-320.814 0c-9.85047,0 -16.8308,1.98427 -21.012,5.8465 -4.18114,4.00397 -6.34257,8.8229 -6.34257,14.6694 0,6.1654 2.16143,11.1615 6.34257,14.8111 4.18114,3.8268 11.1615,5.66934 21.012,5.66934l99.1425 0 0 340.337 -88.9731 0c-9.6733,0 -16.6891,1.98427 -21.012,5.8465 -4.18114,4.00397 -6.34257,9.00007 -6.34257,15.1655 0,5.81107 2.16143,10.8072 6.34257,14.6694 4.32287,3.8268 11.3387,5.81107 21.012,5.81107l88.9731 0 0 62.0084c0,34.5121 14.0316,64.4887 42.024,89.8235 27.9923,25.512 64.9848,38.1617 111.332,38.1617 38.6578,0 80.0085,-3.64964 123.981,-10.8072 16.5119,-2.51577 26.5041,-5.66934 30.012,-9.17724 3.33073,-3.68507 5.17327,-8.32684 5.17327,-14.1733 0,-5.81107 -2.0197,-10.6654 -5.8465,-14.4922 -4.00397,-3.68507 -9.17724,-5.49217 -15.6615,-5.49217 -2.6575,0 -7.0158,0.3189 -13.1812,1.31103 -49.1461,7.51187 -90.6385,11.3387 -124.477,11.3387 -35.8586,0 -63.4966,-8.8229 -82.8432,-26.327 -19.3466,-17.6812 -28.9845,-37.6657 -28.9845,-60.1658l0 -62.0084 191.836 0c9.81504,0 16.8308,-1.98427 20.9765,-5.81107 4.18114,-3.86224 6.34257,-9.00007 6.34257,-15.1655 0,-5.8465 -2.16143,-10.6654 -6.34257,-14.6694 -4.1457,-3.86224 -11.1615,-5.8465 -20.9765,-5.8465l-191.836 0z"/></glyph>
<glyph unicode="e" horiz-adv-x="600"><path d="M522.004 201.651l-418.007 0c7.15754,-52.9729 29.3388,-95.8118 66.6856,-128.162 37.3113,-32.3152 83.3038,-48.65 138.474,-48.65 30.5081,0 62.5044,5.17327 96.1661,15.1655 33.5199,10.1694 60.8391,23.4923 82.0282,40.0043 6.1654,4.9961 11.4804,7.3347 16.1576,7.3347 5.17327,0 9.6733,-2.0197 13.6418,-6.02367 3.86224,-4.1457 5.8465,-8.8229 5.8465,-14.4922 0,-5.49217 -2.6575,-10.8426 -7.83077,-15.9804 -15.6615,-16.3348 -43.335,-31.5002 -83.3392,-45.6736 -39.8271,-14.1733 -80.8235,-21.3309 -122.67,-21.3309 -70.3352,0 -128.977,22.9962 -176.139,69.1659 -47.0201,45.9925 -70.5124,101.835 -70.5124,167.175 0,59.6343 22.0041,110.658 66.1541,153.32 44.1854,42.6618 98.6819,63.9926 163.844,63.9926 67.0045,0 122.174,-21.8269 165.509,-65.658 43.335,-43.8311 64.6659,-100.489 63.9926,-170.186zm-41.4925 41.5279c-8.1851,45.1421 -29.516,81.9928 -64.1698,110.304 -34.6892,28.3467 -76.0045,42.52 -123.84,42.52 -47.835,0 -89.0086,-13.9962 -123.485,-41.9885 -34.5121,-28.0278 -56.0201,-65.0202 -64.5241,-110.836l376.019 0z"/></glyph>
<glyph unicode="d" horiz-adv-x="600"><path d="M500.992 612.82l0 -571.823 54.6737 0c10.1694,0 17.3269,-1.84253 21.508,-5.66934 4.1457,-3.64964 6.34257,-8.64574 6.34257,-14.8111 0,-5.8465 -2.19687,-10.6654 -6.34257,-14.6694 -4.18114,-3.86224 -11.3387,-5.8465 -21.508,-5.8465l-96.1661 0 0 81.4967c-47.5161,-64.9848 -108.001,-97.6543 -181.171,-97.6543 -37.1696,0 -72.6738,9.81504 -106.654,29.6577 -34.016,19.6655 -60.8391,47.6579 -80.6817,84.1542 -19.6655,36.4964 -29.4805,74.0203 -29.4805,112.855 0,38.9767 9.81504,76.6423 29.4805,112.997 19.8427,36.3192 46.6657,64.3115 80.6817,84.1542 33.9806,19.8427 69.662,29.8349 107.15,29.8349 71.6817,0 131.847,-32.4924 180.675,-97.6543l0 231.486 -54.6737 0c-10.1694,0 -17.3269,1.84253 -21.508,5.8465 -4.32287,3.8268 -6.30714,9.00007 -6.30714,15.1655 0,5.81107 1.98427,10.6654 6.30714,14.6694 4.18114,3.8268 11.3387,5.81107 21.508,5.81107l96.1661 0zm-41.4925 -402.31c0,51.9807 -17.6812,95.9889 -52.8311,131.812 -35.0081,35.8586 -76.8195,53.6815 -125.328,53.6815 -48.8272,0 -90.8511,-17.823 -126.001,-53.6815 -35.1853,-35.8231 -52.8311,-79.8313 -52.8311,-131.812 0,-51.839 17.6458,-95.67 52.8311,-131.67 35.1499,-36.0003 77.1738,-54.0004 126.001,-54.0004 48.5083,0 90.3196,18.0001 125.328,54.0004 35.1499,36.0003 52.8311,79.8313 52.8311,131.67z"/></glyph>
<glyph unicode="c" horiz-adv-x="600"><path d="M471.157 381.334l0 13.6773c0,10.1694 2.0197,17.3269 5.8465,21.4726 4.00397,4.18114 8.8229,6.34257 14.6694,6.34257 6.1654,0 11.3387,-2.16143 15.1655,-6.34257 3.8268,-4.1457 5.81107,-11.3032 5.81107,-21.4726l0 -92.8354c-0.3189,-9.9922 -2.30317,-17.1852 -5.98824,-21.3309 -3.8268,-4.3583 -8.8229,-6.51974 -14.9883,-6.51974 -5.49217,0 -10.1694,2.0197 -13.8544,5.66934 -3.8268,3.8268 -5.98824,9.9922 -6.66147,18.8505 -1.98427,23.138 -17.1497,45.0004 -45.6736,65.8352 -28.4884,20.8348 -66.8273,31.3231 -114.981,31.3231 -60.8391,0 -107.009,-18.9923 -138.686,-57.154 -31.5002,-38.02 -47.3035,-81.6739 -47.3035,-130.855 0,-53.0083 17.5041,-96.8393 52.3351,-131.316 34.831,-34.5121 79.8313,-51.839 135.143,-51.839 31.8546,0 64.347,5.98824 97.5126,17.6458 32.9884,11.693 62.8233,30.5081 89.5046,56.6934 6.83864,6.4843 12.8269,9.63787 18.1419,9.63787 5.5276,0 10.1694,-1.8071 13.8544,-5.49217 3.8268,-3.8268 5.66934,-8.504 5.66934,-13.9962 0,-13.9962 -16.5119,-31.6774 -49.3232,-53.15 -53.1855,-34.831 -112.182,-52.3351 -177.344,-52.3351 -66.0123,0 -120.332,21.1537 -162.852,63.3194 -42.4846,42.1657 -63.6383,95.4929 -63.6383,160.336 0,66.1541 21.6498,121.005 65.1619,164.517 43.4767,43.6539 98.1504,65.4808 164.304,65.4808 62.8588,0 115.513,-18.6734 158.174,-56.1619z"/></glyph>
</font>
<font id="FontID0" font-variant="normal" style="fill-rule:nonzero" font-style="normal" font-weight="400,700">
<font-face
font-family="Arial">
</font-face>
<missing-glyph><path d="M0 0z"/></missing-glyph>
<glyph unicode=" " horiz-adv-x="277"></glyph>
<glyph unicode="." horiz-adv-x="277"><path d="M90.8157 0l0 100.17 100.17 0 0 -100.17 -100.17 0z"/></glyph>
<glyph unicode="5" horiz-adv-x="556"><path d="M44.5037 184.166l136.657 14.0031c3.82675,-30.8408 15.5054,-55.3319 34.6675,-73.3318 19.1621,-18.17 41.3289,-27.1841 66.3303,-27.1841 28.6864,0 53.0075,11.6787 72.8499,34.8376 19.814,23.329 29.8203,58.5067 29.8203,105.335 0,43.8517 -9.83616,76.8468 -29.6502,98.8435 -19.6723,21.9967 -45.354,32.9951 -76.8468,32.9951 -39.3446,0 -74.6641,-17.4897 -105.987,-52.3272l-111.344 16.1574 70.3271 372.498 362.832 0 0 -128.324 -258.83 0 -21.4865 -121.662c30.6423,15.3353 61.8232,22.9888 93.8262,22.9888 60.8311,0 112.506,-22.1668 154.657,-66.3303 42.3493,-44.3336 63.4957,-101.82 63.4957,-172.487 0,-58.8469 -16.9794,-111.514 -51.165,-157.69 -46.658,-63.1555 -111.146,-94.6482 -193.832,-94.6482 -66.1602,0 -119.99,17.6597 -161.659,53.1493 -41.669,35.5179 -66.6704,83.168 -74.6641,143.177z"/></glyph>
<glyph unicode="4" horiz-adv-x="556"><path d="M311.497 0l0 143.999 -292.987 0 0 120.16 310.647 454.674 115.171 0 0 -454.164 88.8372 0 0 -120.67 -88.8372 0 0 -143.999 -132.831 0zm0 264.669l0 244.657 -164.493 -244.657 164.493 0z"/></glyph>
<glyph unicode="7" horiz-adv-x="556"><path d="M42.4911 578.661l0 127.331 469.188 0 0 -99.4954c-38.6927,-38.1541 -78.009,-92.8341 -118.176,-164.153 -39.9966,-71.1775 -70.4972,-147.004 -91.5018,-227.167 -21.0046,-80.3334 -31.3226,-152.021 -31.0108,-215.177l-132.32 0c2.32439,99.0135 22.677,199.841 61.3413,302.653 38.4942,103.01 89.9994,194.852 154.487,276.008l-312.007 0z"/></glyph>
<glyph unicode="6" horiz-adv-x="556"><path d="M507.342 540.507l-132.831 -14.6834c-3.17478,27.3542 -11.6787,47.5084 -25.3416,60.6894 -13.6629,12.9826 -31.4927,19.4739 -53.3477,19.4739 -28.8282,0 -53.3193,-12.9826 -73.5019,-39.1462 -19.9841,-25.9935 -32.4848,-80.1633 -37.8139,-162.509 34.3273,40.3368 76.6483,60.491 127.502,60.491 57.3162,0 106.327,-21.8266 147.146,-65.4799 40.847,-43.5115 61.3413,-99.8356 61.3413,-168.83 0,-73.3318 -21.4865,-132.009 -64.4878,-176.342 -42.8312,-44.1635 -98.1632,-66.3303 -165.514,-66.3303 -72.1696,0 -131.668,28.0061 -178.156,84.1601 -46.5162,56.154 -69.8452,148.166 -69.8452,276.178 0,131.158 24.1794,225.665 72.6799,283.661 48.5005,57.9965 111.486,86.9947 188.985,86.9947 54.3398,0 99.3537,-15.3353 135.013,-45.6659 35.6596,-30.5006 58.3366,-74.6641 68.1728,-132.661zm-311.015 -299.337c0,-44.5037 10.1763,-79.0011 30.6707,-103.18 20.4944,-24.3211 43.9934,-36.4817 70.3271,-36.4817 25.5117,0 46.5162,9.97789 63.4957,29.8203 17.0078,19.8424 25.3416,52.4973 25.3416,97.6813 0,46.4879 -8.98577,80.6452 -27.3258,102.33 -18.17,21.6566 -40.9887,32.4848 -68.3429,32.4848 -26.3337,0 -48.6706,-10.318 -66.8122,-30.9825 -18.34,-20.6644 -27.3542,-51.3351 -27.3542,-91.6719z"/></glyph>
<glyph unicode="3" horiz-adv-x="556"><path d="M37.6722 190.005l132.661 15.9873c4.33698,-33.8171 15.6755,-59.6689 34.3273,-77.4987 18.5101,-17.9999 41.0171,-26.9857 67.3508,-26.9857 28.3179,0 52.1572,10.8283 71.4893,32.3148 19.3322,21.5148 28.9982,50.343 28.9982,86.853 0,34.4974 -9.15585,61.8232 -27.836,81.9774 -18.4818,20.3526 -41.1588,30.3589 -67.8326,30.3589 -17.4897,0 -38.4942,-3.34486 -62.9854,-10.1763l15.1653 111.656c37.162,-0.822042 65.4799,7.17161 84.9821,24.1794 19.5022,17.1495 29.3384,39.8265 29.3384,68.1728 0,24.151 -7.17161,43.3131 -21.4865,57.6563 -14.3432,14.3432 -33.5053,21.4865 -57.1744,21.4865 -23.4991,0 -43.5115,-8.16373 -60.0091,-24.4912 -16.6676,-16.1574 -26.8156,-39.9966 -30.3305,-71.1492l-126.509 21.3164c8.84404,43.3415 22.0251,78.009 39.8549,103.832 17.6597,25.8518 42.4911,46.1761 74.1539,61.0012 31.8329,14.8251 67.3508,22.3369 106.667,22.3369 67.4925,0 121.492,-21.4865 162.169,-64.4878 33.5053,-35.1777 50.343,-74.8342 50.343,-119.168 0,-62.8437 -34.3273,-113.017 -103.01,-150.349 40.9887,-8.81569 73.672,-28.488 98.3332,-59.1587 24.4912,-30.5006 36.8218,-67.4925 36.8218,-110.834 0,-62.8437 -22.9888,-116.333 -68.8248,-160.667 -45.8359,-44.1635 -102.982,-66.3303 -171.325,-66.3303 -64.8279,0 -118.516,18.6519 -161.177,55.8138 -42.6611,37.3604 -67.3224,86.0026 -74.1539,146.352z"/></glyph>
<glyph unicode="2" horiz-adv-x="556"><path d="M505.839 127.502l0 -127.502 -481.008 0c5.3291,48.1603 20.8345,93.8262 46.9981,136.998 25.9935,43.1714 77.4987,100.346 154.175,171.665 61.9933,57.5146 99.8356,96.6608 113.839,117.184 18.8219,28.3179 28.3179,56.3241 28.3179,83.99 0,30.5006 -8.16373,53.9997 -24.6613,70.4972 -16.4975,16.4975 -39.1746,24.6613 -68.1728,24.6613 -28.6581,0 -51.3351,-8.67396 -68.3145,-25.8235 -16.8377,-17.3479 -26.6738,-46.006 -29.3384,-86.0026l-136.686 13.6629c8.19207,75.5145 33.6754,129.656 76.6767,162.679 43.0013,32.825 96.6608,49.3225 161.177,49.3225 70.6673,0 126.169,-19.1621 166.478,-57.1744 40.3368,-38.1541 60.5193,-85.4924 60.5193,-142.157 0,-32.173 -5.83933,-62.8437 -17.3479,-92.012 -11.4802,-29.1683 -29.8203,-59.6689 -54.8217,-91.5018 -16.6676,-21.1463 -46.658,-51.6469 -89.8294,-91.3317 -43.3415,-39.6564 -70.8373,-66.1602 -82.3459,-79.1428 -11.4802,-13.0109 -21.0046,-25.6817 -28.1479,-38.0124l272.493 0z"/></glyph>
<glyph unicode="1" horiz-adv-x="556"><path d="M393.503 0l-137.168 0 0 517.178c-50.1729,-46.9981 -109.162,-81.6656 -177.164,-104.002l0 124.497c35.6596,11.6503 74.6641,33.8171 116.673,66.5004 41.9808,32.825 70.809,71.0074 86.3144,114.661l111.344 0 0 -718.833z"/></glyph>
<glyph unicode="L" horiz-adv-x="556"><path d="M73.1699 0l0 715.825 94.8196 0 0 -631.316 352.526 0 0 -84.5085 -447.346 0z"/></glyph>
<glyph unicode="B" horiz-adv-x="666"><path d="M73.1699 0l0 715.825 268.656 0c54.6737,0 98.5047,-7.3347 131.493,-21.6498 33.1656,-14.4922 59.032,-36.8507 77.6699,-67.0045 18.6734,-30.012 28.1695,-61.5123 28.1695,-94.5007 0,-30.5081 -8.32684,-59.3509 -24.9805,-86.3511 -16.5119,-27.0002 -41.6696,-48.8272 -75.1896,-65.4808 43.335,-12.6851 76.5006,-34.3349 99.8512,-64.843 23.3151,-30.6498 35.0081,-66.8273 35.0081,-108.497 0,-33.4845 -7.19297,-64.6659 -21.3309,-93.5086 -14.1733,-28.8073 -31.6774,-50.9886 -52.5122,-66.6501 -20.8348,-15.6615 -47.0201,-27.3545 -78.3431,-35.327 -31.3231,-8.00794 -69.8391,-12.0119 -115.477,-12.0119l-273.014 0zm94.8196 414.995l154.844 0c41.8468,0 72.0006,2.83467 90.3196,8.32684 24.0238,7.19297 42.1657,19.0277 54.3548,35.6814 12.1536,16.6537 18.319,37.4885 18.319,62.5044 0,23.6695 -5.66934,44.646 -17.008,62.6462 -11.4804,18.1773 -27.8152,30.5081 -48.8272,37.1696 -21.1537,6.66147 -57.5083,9.9922 -108.993,9.9922l-143.009 0 0 -216.321zm0 -330.487l178.194 0c30.6498,0 52.1579,1.1693 64.4887,3.33073 21.8269,4.00397 40.0043,10.4883 54.6737,19.6655 14.6694,9.00007 26.6459,22.323 36.142,39.6499 9.3544,17.5041 14.1733,37.5239 14.1733,60.343 0,26.6813 -6.83864,49.8193 -20.4805,69.662 -13.6773,19.6655 -32.6695,33.5199 -57.0123,41.4925 -24.1655,7.83077 -59.1737,11.8347 -104.67,11.8347l-165.509 0 0 -245.978z"/></glyph>
<glyph unicode="O" horiz-adv-x="777"><path d="M48.3311 348.664c0,118.843 31.8191,211.821 95.67,279.002 63.8155,67.1816 146.163,100.843 247.183,100.843 65.9769,0 125.647,-15.8387 178.655,-47.339 53.0083,-31.6774 93.5086,-75.6856 121.324,-132.166 27.8506,-56.339 41.6696,-120.509 41.6696,-192.013 0,-72.6738 -14.4922,-137.659 -43.8311,-194.813 -29.3388,-57.3312 -70.8313,-100.666 -124.513,-130.182 -53.8233,-29.4805 -111.65,-44.15 -173.836,-44.15 -67.5005,0 -127.666,16.1576 -180.639,48.8272 -53.1855,32.4924 -93.3314,76.9967 -120.686,133.336 -27.3191,56.1619 -40.9964,115.832 -40.9964,178.655zm97.6543 -1.4882c0,-86.3511 23.1734,-154.171 69.5202,-203.848 46.4886,-49.6776 104.67,-74.4809 174.651,-74.4809 71.3273,0 130.005,24.9805 175.997,75.1541 46.0279,50.1736 69.1659,121.324 69.1659,213.486 0,58.1816 -9.9922,109.028 -29.6577,152.505 -19.6655,43.5122 -48.5083,77.1738 -86.3156,101.162 -38.02,23.8466 -80.5046,35.8586 -127.666,35.8586 -67.1816,0 -124.832,-22.9962 -173.163,-69.1659 -48.3665,-46.0279 -72.5321,-123.025 -72.5321,-230.671z"/></glyph>
<glyph unicode="E" horiz-adv-x="666"><path d="M79.1581 0l0 715.825 517.504 0 0 -84.5085 -422.826 0 0 -219.155 396.003 0 0 -83.977 -396.003 0 0 -243.675 439.48 0 0 -84.5085 -534.158 0z"/></glyph>
<glyph unicode="C" horiz-adv-x="722"><path d="M587.839 251.01l94.8196 -24.0238c-19.8427,-77.6699 -55.6658,-136.985 -107.15,-177.982 -51.6618,-40.8547 -114.662,-61.158 -189.356,-61.158 -77.1384,0 -139.82,15.6615 -188.151,46.9846 -48.3311,31.5002 -85.1818,76.9967 -110.339,136.489 -25.1577,59.6698 -37.8428,123.662 -37.8428,192.013 0,74.5163 14.1733,139.501 42.6972,194.99 28.4884,55.5241 68.9887,97.6897 121.643,126.497 52.5122,28.8427 110.339,43.1933 173.517,43.1933 71.6462,0 131.812,-18.1773 180.675,-54.6737 48.8272,-36.4964 82.8077,-87.6621 101.977,-153.852l-93.1543 -22.0041c-16.6891,52.1933 -40.6775,90.0007 -72.3549,113.847 -31.5002,23.8466 -71.1502,35.6814 -119.162,35.6814 -54.9926,0 -100.808,-13.1812 -137.836,-39.5082 -36.9924,-26.5041 -63.0005,-61.8312 -77.8116,-106.335 -15.0237,-44.3271 -22.5002,-90.1779 -22.5002,-137.34 0,-60.9808 8.8229,-113.989 26.5041,-159.486 17.823,-45.3547 45.3193,-79.3353 82.8077,-101.835 37.5239,-22.5002 78.0242,-33.6617 121.678,-33.6617 53.0083,0 97.8315,15.3072 134.682,45.8153 36.8153,30.6853 61.654,76.1817 74.6581,136.348z"/></glyph>
<glyph unicode="A" horiz-adv-x="666"><path d="M-1.4882 0l274.998 715.825 101.977 0 292.998 -715.825 -108.001 0 -83.481 216.817 -299.341 0 -78.4849 -216.817 -100.666 0zm206.506 293.991l242.825 0 -74.8352 198.179c-22.6773,60.1658 -39.6854,109.666 -50.6697,148.501 -9.17724,-45.9925 -22.0041,-91.4889 -38.6578,-136.844l-78.662 -209.836z"/></glyph>
<glyph unicode="M" horiz-adv-x="833"><path d="M74.162 0l0 715.825 142.655 0 169.336 -506.839c15.697,-47.1618 27.1774,-82.4888 34.1932,-105.981 8.14967,26.0081 20.8348,64.3115 38.1617,114.839l171.32 497.98 127.489 0 0 -715.825 -91.3117 0 0 599.178 -207.994 -599.178 -85.5007 0 -207.002 609.347 0 -609.347 -91.3472 0z"/></glyph>
<glyph unicode="D" horiz-adv-x="722"><path d="M77.1738 0l0 715.825 246.51 0c55.6658,0 98.1504,-3.5079 127.489,-10.3111 40.9964,-9.3544 76.0045,-26.5041 104.989,-51.1658 37.6657,-32.0317 66.0123,-72.6738 84.6857,-122.351 18.8151,-49.6776 28.1695,-106.335 28.1695,-170.151 0,-54.3548 -6.34257,-102.509 -19.1694,-144.497 -12.6851,-42.024 -28.8427,-76.8549 -48.8626,-104.351 -19.8072,-27.4963 -41.4925,-49.1461 -65.1619,-64.843 -23.4923,-15.8033 -51.9807,-27.8152 -85.3235,-36.0003 -33.4845,-8.14967 -71.8234,-12.1536 -115.017,-12.1536l-258.309 0zm94.6425 84.5085l152.859 0c47.1618,0 84.3314,4.32287 111.154,13.1458 26.823,8.85834 48.1539,21.1891 64.1698,37.1696 22.5002,22.3584 40.0043,52.6894 52.5122,90.4968 12.4725,38.02 18.8151,83.8353 18.8151,138.013 0,74.8352 -12.3308,132.344 -36.8153,172.49 -24.6616,40.3586 -54.4965,67.1816 -89.6818,80.8589 -25.3348,9.81504 -66.3312,14.634 -122.493,14.634l-150.521 0 0 -546.807z"/></glyph>
<glyph unicode="_" horiz-adv-x="556"><path d="M-15.1653 -198.679l0 63.3539 582.488 0 0 -63.3539 -582.488 0z"/></glyph>
<glyph unicode="Y" horiz-adv-x="666"><path d="M278.825 0l0 303.168 -275.813 412.657 115.158 0 141.166 -215.825c26.0081,-40.3232 50.1736,-80.6817 72.6738,-121.182 21.4726,37.5239 47.4807,79.6896 78.166,126.532l138.651 210.474 110.339 0 -285.664 -412.657 0 -303.168 -94.6779 0z"/></glyph>
<glyph unicode="P" horiz-adv-x="666"><path d="M77.1738 0l0 715.825 270.002 0c47.4807,0 83.8353,-2.3386 108.816,-6.83864 35.1853,-5.81107 64.6659,-16.9726 88.5125,-33.4845 23.6695,-16.3348 42.8389,-39.5082 57.3312,-68.9887 14.4922,-29.6931 21.6498,-62.1855 21.6498,-97.6897 0,-60.8391 -19.3112,-112.501 -57.969,-154.667 -38.835,-41.9885 -108.851,-63.1422 -210.013,-63.1422l-183.686 0 0 -291.014 -94.6425 0zm94.6425 375.487l185.175 0c61.158,0 104.67,11.3387 130.359,34.1932 25.6537,22.8191 38.4806,54.8154 38.4806,96.1661 0,29.9766 -7.51187,55.6658 -22.6773,76.9967 -15.1655,21.3309 -34.9727,35.327 -59.8115,42.1657 -16.0159,4.1457 -45.3547,6.30714 -88.3353,6.30714l-183.19 0 0 -255.829z"/></glyph>
<glyph unicode="X" horiz-adv-x="666"><path d="M4.32287 0l277.018 373.007 -244.171 342.818 112.678 0 129.97 -183.651c27.0002,-38.02 46.1697,-67.3234 57.5083,-87.8393 16.0159,26.0081 34.831,53.15 56.6579,81.4967l144.178 189.994 103.005 0 -251.506 -337.325 270.994 -378.499 -117.143 0 -180.179 255.333c-10.1694,14.6694 -20.5159,30.6498 -31.3231,47.835 -16.0159,-26.0081 -27.3545,-43.8311 -34.1932,-53.6815l-179.647 -249.486 -113.847 0z"/></glyph>
<glyph unicode="R" horiz-adv-x="722"><path d="M78.662 0l0 715.825 317.341 0c63.8155,0 112.324,-6.4843 145.489,-19.3112 33.1656,-12.8623 59.6698,-35.5042 79.6896,-67.9966 19.8072,-32.6695 29.6577,-68.6698 29.6577,-108.001 0,-50.8469 -16.3348,-93.5086 -49.3232,-128.34 -32.8467,-34.831 -83.6936,-57.0123 -152.363,-66.5084 25.1931,-12.0119 44.1854,-23.8466 57.1894,-35.6814 27.6734,-25.3348 53.8233,-57.154 78.662,-95.1385l124.513 -194.848 -119.198 0 -94.6425 148.997c-27.6734,42.8389 -50.528,75.8274 -68.5281,98.5047 -17.823,22.8191 -33.8034,38.835 -47.9768,47.835 -14.1733,9.17724 -28.4884,15.4844 -43.1578,19.1694 -10.8426,2.16143 -28.3467,3.33073 -52.8311,3.33073l-109.843 0 0 -317.837 -94.6779 0zm94.6779 399.83l203.671 0c43.1578,0 77.1384,4.50004 101.481,13.5001 24.5199,9.00007 43.0161,23.3506 55.6658,43.0161 12.6851,19.6655 18.9923,40.9964 18.9923,64.1698 0,33.8034 -12.1536,61.654 -36.8153,83.481 -24.4844,21.8269 -63.3194,32.6695 -116.505,32.6695l-226.49 0 0 -236.837z"/></glyph>
<glyph unicode="T" horiz-adv-x="610"><path d="M259.337 0l0 631.316 -235.844 0 0 84.5085 567.323 0 0 -84.5085 -236.801 0 0 -631.316 -94.6779 0z"/></glyph>
<glyph unicode="S" horiz-adv-x="666"><path d="M45.0004 229.998l89.3275 7.83077c4.18114,-35.8231 13.9962,-65.1619 29.516,-88.1582 15.4844,-22.9962 39.4728,-41.4925 72.0006,-55.6658 32.4924,-14.1733 69.1659,-21.1537 109.808,-21.1537 36.1775,0 68.032,5.315 95.67,15.9804 27.6734,10.8426 48.3311,25.512 61.8312,44.1854 13.5001,18.8151 20.3387,39.1539 20.3387,61.2997 0,22.5002 -6.4843,42.024 -19.6655,58.8548 -13.004,16.8308 -34.4766,30.827 -64.3115,42.1657 -19.3466,7.51187 -61.6895,19.1694 -127.525,35.0081 -65.658,15.8387 -111.828,30.6498 -138.155,44.646 -34.1577,17.8584 -59.6698,40.1814 -76.5006,66.6856 -16.6537,26.5041 -25.0159,56.1619 -25.0159,89.1503 0,36.0003 10.1694,69.8391 30.6853,101.162 20.4805,31.5002 50.4925,55.3469 89.8235,71.6817 39.5082,16.1576 83.1621,24.3427 131.351,24.3427 53.15,0 99.8157,-8.504 140.493,-25.6892 40.5003,-17.008 71.6462,-42.1657 93.5086,-75.3313 21.6498,-33.1656 33.4845,-70.8313 35.1499,-112.82l-90.8157 -6.83864c-5.03154,45.1775 -21.508,79.5124 -49.6776,102.509 -28.1695,23.1734 -69.662,34.6538 -124.655,34.6538 -57.3666,0 -99.0008,-10.4883 -125.363,-31.5002 -26.1498,-21.012 -39.331,-46.3468 -39.331,-75.8274 0,-25.8309 9.3544,-47.0201 27.8506,-63.4966 18.319,-16.6891 65.8352,-33.6617 142.832,-51.024 76.9967,-17.4686 129.828,-32.6341 158.493,-45.6382 41.6696,-19.3466 72.4966,-43.6893 92.3393,-73.0281 19.8427,-29.4805 29.6577,-63.4966 29.6577,-101.8 0,-38.1972 -10.8426,-74.0203 -32.6695,-107.682 -21.8269,-33.6617 -53.15,-59.8469 -94.0047,-78.662 -40.8192,-18.6734 -86.8117,-27.9923 -137.836,-27.9923 -64.8076,0 -119.162,9.31897 -162.816,28.3112 -43.8311,18.8505 -78.166,47.1618 -103.182,85.1818 -24.8033,37.8428 -37.9846,80.8235 -39.1539,128.658z"/></glyph>
<glyph unicode="i" horiz-adv-x="222"><path d="M66.3303 614.661l0 101.168 88.0152 0 0 -101.168 -88.0152 0zm0 -614.661l0 518.51 88.0152 0 0 -518.51 -88.0152 0z"/></glyph>
<glyph unicode="b" horiz-adv-x="556"><path d="M147.004 0l-81.4955 0 0 715.829 87.8168 0 0 -255.315c37.162,46.4879 84.5003,69.8169 142.015,69.8169 32.0029,0 62.1634,-6.4913 90.6514,-19.3322 28.5164,-12.8409 51.8453,-31.0108 70.3555,-54.1697 18.3117,-23.329 32.825,-51.3351 43.143,-84.3302 10.5165,-32.825 15.6755,-68.0027 15.6755,-105.335 0,-89.0073 -21.9967,-157.662 -65.9901,-206.162 -43.8517,-48.5005 -96.6892,-72.6799 -158.172,-72.6799 -61.1713,0 -109.162,25.5117 -143.999,76.6767l0 -64.998zm-0.99212 263.167c0,-62.1634 8.47554,-107.007 25.3132,-134.673 27.666,-45.3257 65.1681,-68.0027 112.336,-68.0027 38.4942,0 71.6594,16.6676 99.6655,50.1729 28.0061,33.3352 42.0092,82.9979 42.0092,149.158 0,67.6909 -13.4928,117.665 -40.3368,149.838 -26.8439,32.173 -59.3288,48.3304 -97.3411,48.3304 -38.4942,0 -71.6594,-16.6676 -99.6655,-50.0028 -28.0061,-33.3352 -41.9808,-81.6656 -41.9808,-144.821z"/></glyph>
<glyph unicode="f" horiz-adv-x="277"><path d="M86.8246 0l0 450.167 -77.4987 0 0 68.3429 77.4987 0 0 55.1619c0,34.8376 3.17478,60.8311 9.35427,77.6688 8.47554,22.8188 23.329,41.3289 44.6454,55.502 21.3447,14.1448 51.165,21.1463 89.6876,21.1463 24.6613,0 51.9871,-2.83463 81.9774,-8.81569l-13.1527 -76.6767c-18.17,3.34486 -35.4895,5.01729 -51.8453,5.01729 -26.6455,0 -45.4958,-5.66926 -56.4941,-17.1778 -11.1684,-11.3385 -16.6676,-32.6833 -16.6676,-64.0059l0 -47.8202 100.998 0 0 -68.3429 -100.998 0 0 -450.167 -87.505 0z"/></glyph>
<glyph unicode="a" horiz-adv-x="556"><path d="M404.331 64.0059c-32.6549,-27.666 -64.0059,-47.1682 -93.9963,-58.6768 -30.1604,-11.3385 -62.5035,-17.0078 -97.001,-17.0078 -57.0044,0 -100.658,13.833 -131.328,41.669 -30.5006,27.836 -45.8359,63.4957 -45.8359,106.667 0,25.5117 5.66926,48.6706 17.3196,69.6752 11.5086,21.0046 26.6738,37.8423 45.354,50.5131 18.8219,12.6424 39.8265,22.3085 63.3256,28.8282 17.1778,4.47871 43.1714,8.98577 78.009,13.1527 70.9791,8.50388 123.335,18.5101 156.812,30.3305 0.340155,12.0188 0.510233,19.6723 0.510233,22.8471 0,35.8297 -8.33381,61.1713 -25.0014,75.6562 -22.3369,20.0125 -55.8422,29.8486 -100.006,29.8486 -41.3289,0 -71.8295,-7.17161 -91.6719,-21.6849 -19.644,-14.4849 -34.1573,-40.1667 -43.6533,-76.9885l-85.8325 11.8204c7.82357,36.6801 20.6644,66.5004 38.4942,89.0073 17.8298,22.677 43.8233,40.1667 77.6688,52.3272 33.8455,12.1889 72.9917,18.34 117.665,18.34 44.3336,0 80.1633,-5.3291 107.829,-15.6755 27.666,-10.4881 48.0186,-23.4991 61.1713,-39.3163 13.0109,-15.8456 21.9967,-35.6596 27.3258,-59.839 2.83463,-14.9952 4.33698,-42.0092 4.33698,-81.0137l0 -117.155c0,-81.8357 1.84251,-133.511 5.66926,-154.997 3.65667,-21.6566 11.1684,-42.4911 22.1668,-62.3335l-91.8419 0c-8.98577,18.17 -14.9952,39.4864 -17.4897,64.0059zm-7.34169 196.326c-32.0029,-13.1527 -79.8231,-24.1794 -143.489,-33.3352 -36.1699,-5.15902 -61.8232,-10.9984 -76.6767,-17.4897 -14.9952,-6.51964 -26.6455,-16.0156 -34.6675,-28.6864 -8.16373,-12.5007 -12.3306,-26.3337 -12.3306,-41.6407 0,-23.5274 9.01412,-43.0013 26.6738,-58.6768 17.6597,-15.5054 43.6533,-23.329 77.8389,-23.329 33.8171,0 64.0059,7.31334 90.3396,22.1668 26.3337,14.8251 45.8076,35.1494 58.1666,60.8311 9.496,19.814 14.1448,49.1524 14.1448,87.8168l0 32.3431z"/></glyph>
<glyph unicode="d" horiz-adv-x="556"><path d="M402.347 0l0 65.5082c-32.8533,-51.5052 -81.1837,-77.1869 -145.02,-77.1869 -41.3289,0 -79.3412,11.3385 -113.98,34.1856 -34.6675,22.6487 -61.5114,54.4815 -80.6735,95.4986 -19.0204,40.8186 -28.5164,87.675 -28.5164,140.824 0,51.6753 8.67396,98.6734 25.8518,140.824 17.3196,42.1793 43.1714,74.5224 77.6688,96.8592 34.4974,22.4786 73.1617,33.8171 115.823,33.8171 31.1526,0 58.9886,-6.66138 83.3381,-19.8424 24.4912,-13.1527 44.3336,-30.3305 59.6689,-51.4768l0 256.817 87.3349 0 0 -715.829 -81.4955 0zm-277.85 258.83c0,-66.5004 14.0031,-116.163 42.0092,-148.988 28.0061,-32.8533 61.0012,-49.3509 99.1553,-49.3509 38.3525,0 71.0074,15.8456 97.8514,47.1682 26.8156,31.351 40.3084,79.3412 40.3084,143.829 0,71.0074 -13.6629,123.023 -40.9887,156.188 -27.3258,33.3352 -61.0012,49.8328 -101.168,49.8328 -39.0045,0 -71.6594,-16.0156 -97.823,-47.8485 -26.1636,-31.8329 -39.3446,-82.1475 -39.3446,-150.831z"/></glyph>
<glyph unicode="k" horiz-adv-x="499"><path d="M66.3303 0l0 715.829 88.0152 0 0 -408.158 207.977 210.84 113.669 0 -198.169 -192.329 218.351 -326.181 -108.51 0 -171.325 265.179 -61.9933 -59.6689 0 -205.511 -88.0152 0z"/></glyph>
<glyph unicode="l" horiz-adv-x="222"><path d="M64.0059 0l0 715.829 87.8168 0 0 -715.829 -87.8168 0z"/></glyph>
<glyph unicode="c" horiz-adv-x="499"><path d="M404.331 190.005l86.3428 -11.3385c-9.35427,-59.4988 -33.5053,-106.157 -72.5098,-139.832 -38.8344,-33.6754 -86.6546,-50.5131 -143.319,-50.5131 -70.8373,0 -128.012,23.1873 -171.013,69.5051 -43.1714,46.3462 -64.8279,112.847 -64.8279,199.501 0,56.0122 9.32593,104.995 27.836,147.004 18.6519,42.0092 46.8281,73.5019 84.8121,94.5065 37.8423,21.0046 79.1712,31.4927 123.675,31.4927 56.3524,0 102.5,-14.3432 138.16,-42.8312 35.858,-28.488 58.8469,-68.8248 69.0232,-121.322l-85.5207 -13.181c-8.16373,34.8376 -22.4786,61.0012 -43.143,78.6609 -20.6928,17.518 -45.6659,26.3337 -75.0043,26.3337 -44.3336,0 -80.3334,-15.8172 -107.999,-47.6501 -27.666,-31.6628 -41.499,-81.8357 -41.499,-150.519 0,-69.6468 13.3228,-120.33 40.1667,-151.993 26.6455,-31.4927 61.4831,-47.3383 104.484,-47.3383 34.4974,0 63.1839,10.6865 86.3428,31.8329 23.1589,21.1747 37.8423,53.6879 43.9934,97.6813z"/></glyph>
<glyph unicode="o" horiz-adv-x="556"><path d="M33.1651 259.34c0,95.9805 26.6738,167.158 80.1633,213.334 44.5037,38.3242 98.8435,57.6563 162.991,57.6563 71.3476,0 129.684,-23.329 174.84,-70.157 45.354,-46.6863 67.8326,-111.174 67.8326,-193.52 0,-66.8122 -9.97789,-119.309 -29.9904,-157.492 -20.0125,-38.3242 -49.1808,-68.0027 -87.3349,-89.149 -38.3242,-21.1747 -79.9932,-31.6911 -125.347,-31.6911 -72.4814,0 -131.158,23.1873 -175.974,69.8452 -44.8438,46.4879 -67.1807,113.498 -67.1807,201.174zm90.3396 0c0,-66.5004 14.4849,-116.163 43.4832,-149.186 28.9982,-33.1651 65.5082,-49.6627 109.332,-49.6627 43.6816,0 80.0215,16.6676 109.02,49.8328 28.8282,33.1651 43.3415,83.8483 43.3415,151.851 0,64.1476 -14.5133,112.818 -43.6816,145.813 -29.1683,33.0234 -65.3382,49.5209 -108.68,49.5209 -43.8233,0 -80.3334,-16.4975 -109.332,-49.3509 -28.9982,-32.825 -43.4832,-82.4877 -43.4832,-148.818z"/></glyph>
<glyph unicode="e" horiz-adv-x="556"><path d="M420.829 166.988l90.8498 -11.1684c-14.3432,-53.1493 -40.847,-94.3081 -79.5113,-123.646 -38.8344,-29.1683 -88.327,-43.8517 -148.506,-43.8517 -75.8263,0 -136.005,23.3573 -180.339,70.0153 -44.4753,46.658 -66.6421,112.166 -66.6421,196.496 0,87.3349 22.4786,154.997 67.3224,203.158 44.9855,48.1887 103.152,72.3397 174.84,72.3397 69.335,0 125.999,-23.6691 169.823,-70.8373 43.9934,-47.1682 65.9901,-113.669 65.9901,-199.161 0,-5.3291 -0.141731,-13.1527 -0.481887,-23.4991l-386.672 0c3.17478,-57.0044 19.3322,-100.658 48.3304,-130.846 28.9982,-30.3305 64.998,-45.4958 108.339,-45.4958 32.173,0 59.6689,8.50388 82.4877,25.5117 22.8471,16.8377 40.847,43.8233 54.1697,80.9853zm-288.508 142.185l289.501 0c-3.82675,43.4832 -14.9952,76.3365 -33.1651,97.9931 -27.9778,33.8455 -64.3177,50.8249 -108.821,50.8249 -40.3368,0 -74.3239,-13.4928 -101.848,-40.4785 -27.4959,-27.014 -42.6611,-63.1839 -45.6659,-108.339z"/></glyph>
<glyph unicode="v" horiz-adv-x="499"><path d="M209.989 0l-197.318 518.51 92.8341 0 111.316 -310.505c12.0188,-33.5053 23.0172,-68.3429 33.1935,-104.513 7.82357,27.3542 18.6519,60.1791 32.6549,98.6734l115.341 316.344 90.3112 0 -196.326 -518.51 -82.0058 0z"/></glyph>
<glyph unicode="y" horiz-adv-x="499"><path d="M61.9933 -199.671l-9.83616 82.516c19.3322,-5.18737 35.9998,-7.85192 50.343,-7.85192 19.5022,0 35.1777,3.34486 46.8281,9.83616 11.8487,6.4913 21.3447,15.5054 28.8282,27.3258 5.66926,8.67396 14.5133,30.5006 26.8439,65.3382 1.67243,5.01729 4.33698,12.0188 7.82357,21.5148l-196.666 519.502 94.6766 0 107.999 -300.187c13.833,-38.1541 26.5038,-78.1507 37.5021,-120.16 10.1763,40.3368 22.1668,79.6814 36.1699,118.176l110.834 302.171 87.8168 0 -197.148 -527.354c-21.1747,-56.976 -37.6722,-96.1506 -49.3509,-117.665 -15.6471,-28.9982 -33.477,-50.1446 -53.6595,-63.6657 -20.3243,-13.4928 -44.3336,-20.3243 -72.3397,-20.3243 -16.9794,0 -35.8297,3.65667 -56.6642,10.8283z"/></glyph>
<glyph unicode="p" horiz-adv-x="556"><path d="M65.9901 -198.679l0 717.189 80.0215 0 0 -67.3508c18.8219,26.3337 40.1667,46.1761 63.9775,59.3288 23.6691,13.181 52.4973,19.8424 86.3428,19.8424 44.3336,0 83.3381,-11.5086 117.155,-34.1573 34.0155,-22.8471 59.4988,-55.0201 76.6767,-96.5191 17.3479,-41.499 25.9935,-86.9947 25.9935,-136.487 0,-53.0075 -9.496,-100.828 -28.6581,-143.347 -18.992,-42.4911 -46.658,-74.9759 -82.9979,-97.6529 -36.3399,-22.5069 -74.494,-33.8455 -114.491,-33.8455 -29.3384,0 -55.502,6.17949 -78.831,18.5101 -23.3573,12.3306 -42.3493,28.0061 -57.3445,46.8281l0 -252.339 -87.8451 0zm79.5113 455.014c0,-66.6704 13.4928,-115.993 40.5068,-147.996 26.9857,-31.8329 59.839,-47.8485 98.1632,-47.8485 39.0045,0 72.4814,16.4975 100.317,49.6627 27.836,33.0234 41.8391,84.1884 41.8391,153.523 0,66.1602 -13.6629,115.483 -40.8186,148.478 -27.1841,32.8533 -59.6689,49.3509 -97.3411,49.3509 -37.5021,0 -70.6673,-17.518 -99.4954,-52.4973 -28.8282,-35.0077 -43.1714,-86.0026 -43.1714,-152.673z"/></glyph>
<glyph unicode="q" horiz-adv-x="556"><path d="M396.508 -198.679l0 253.841c-13.6629,-19.1621 -32.8533,-35.1494 -57.3445,-47.8202 -24.6613,-12.6708 -50.8249,-19.0204 -78.4908,-19.0204 -61.5114,0 -114.519,24.5195 -158.853,73.672 -44.4753,49.1808 -66.6421,116.503 -66.6421,202.166 0,52.0154 8.98577,98.8435 27.1557,140.172 17.9999,41.3289 44.1635,72.6799 78.4908,93.9963 34.3557,21.3447 71.9995,32.0029 113.017,32.0029 64.1476,0 114.661,-26.9857 151.483,-81.1554l0 69.335 79.0011 0 0 -717.189 -87.8168 0zm-271.019 459.351c0,-66.6704 14.0031,-116.673 42.0092,-150.009 28.0061,-33.5053 61.5114,-50.1729 100.516,-50.1729 37.4738,0 69.6468,15.8456 96.6608,47.6784 27.1557,31.6628 40.6486,79.9932 40.6486,144.821 0,69.0232 -14.3149,120.84 -42.8312,155.678 -28.488,34.8376 -61.8232,52.3272 -100.317,52.3272 -38.0124,0 -70.3555,-16.3275 -96.8309,-48.6706 -26.5038,-32.3148 -39.8549,-82.8278 -39.8549,-151.653z"/></glyph>
<glyph unicode="r" horiz-adv-x="333"><path d="M64.998 0l0 518.51 79.0011 0 0 -78.5192c20.1542,36.6801 38.8344,61.0012 56.0122,72.6799 16.9794,11.6503 35.8297,17.6597 56.3241,17.6597 29.6786,0 59.6689,-9.496 90.3396,-28.3179l-30.3305 -81.6656c-21.3447,12.8125 -42.8312,19.1621 -64.3461,19.1621 -19.3322,0 -36.51,-5.83933 -51.8453,-17.3479 -15.307,-11.6503 -26.1636,-27.666 -32.6549,-48.1603 -9.83616,-31.1809 -14.655,-65.3382 -14.655,-102.5l0 -271.501 -87.8451 0z"/></glyph>
<glyph unicode="u" horiz-adv-x="556"><path d="M405.818 0l0 76.1817c-40.5003,-58.6776 -95.3157,-87.8393 -164.659,-87.8393 -30.5081,0 -59.1737,5.81107 -85.6424,17.5041 -26.5041,11.6576 -46.1697,26.5041 -59.032,44.15 -12.9686,17.823 -21.9687,39.5082 -27.1419,65.1619 -3.5079,17.3269 -5.35044,44.6815 -5.35044,82.1699l0 321.168 87.8393 0 0 -287.506c0,-45.9925 1.84253,-76.8195 5.35044,-92.8354 5.6339,-23.138 17.3269,-41.1381 35.1499,-54.4965 18.0001,-13.1458 40.1814,-19.6655 66.5084,-19.6655 26.327,0 50.9886,6.66147 74.162,20.1616 23.1734,13.5001 39.5082,31.9963 49.0043,55.1697 9.6733,23.3506 14.4922,57.1894 14.4922,101.339l0 277.833 87.8393 0 0 -518.496 -78.5203 0z"/></glyph>
<glyph unicode="t" horiz-adv-x="277"><path d="M257.838 78.6609l12.6708 -77.6688c-24.6613,-5.15902 -46.8281,-7.82357 -66.3303,-7.82357 -32.0029,0 -56.6642,4.98894 -74.3523,15.1653 -17.4897,10.0062 -29.8203,23.329 -36.9919,39.8265 -7.17161,16.3275 -10.8283,50.995 -10.8283,103.662l0 298.345 -64.5161 0 0 68.3429 64.5161 0 0 128.494 87.505 52.6674 0 -181.161 88.327 0 0 -68.3429 -88.327 0 0 -303.163c0,-25.1715 1.50235,-41.1588 4.47871,-48.3304 3.17478,-7.17161 8.16373,-12.8409 15.1653,-17.1778 7.00153,-4.1669 17.0078,-6.32122 30.0187,-6.32122 9.83616,0 22.6487,1.1622 38.6643,3.48659z"/></glyph>
<glyph unicode="s" horiz-adv-x="499"><path d="M30.8408 154.827l86.8246 13.6629c4.84721,-34.8376 18.5101,-61.4831 40.847,-80.1633 22.1668,-18.4818 53.3193,-27.836 93.486,-27.836 40.3368,0 70.3271,8.33381 89.8294,24.6896 19.5022,16.4975 29.3384,35.8297 29.3384,57.8264 0,19.9841 -8.67396,35.4895 -25.9935,46.9981 -12.0188,7.82357 -42.0092,17.6597 -89.8294,29.6502 -64.3461,16.3558 -109.19,30.3589 -134.021,42.3493 -24.8313,11.8204 -43.8233,28.3179 -56.6642,49.3225 -12.8125,21.0046 -19.3322,44.1635 -19.3322,69.5051 0,23.1589 5.3291,44.5037 16.0156,64.176 10.4881,19.814 25.0014,36.1699 43.1714,49.1524 13.6629,10.0062 32.3148,18.6802 55.8138,25.6817 23.6691,7.00153 49.0107,10.4881 75.9964,10.4881 40.6769,0 76.3365,-6.00941 107.177,-17.6597 30.8408,-11.6787 53.4894,-27.4959 68.1728,-47.5084 14.655,-20.1542 24.6613,-46.8281 30.1604,-80.3334l-85.8325 -11.8204c-3.99683,26.6455 -15.3353,47.48 -33.9872,62.5035 -18.6802,14.9952 -45.184,22.4786 -79.3412,22.4786 -40.3368,0 -69.1649,-6.66138 -86.3428,-19.9841 -17.3196,-13.3511 -25.9935,-28.9982 -25.9935,-46.8281 0,-11.5086 3.65667,-21.6849 10.8283,-30.8408 7.17161,-9.496 18.34,-17.1778 33.6754,-23.4991 8.81569,-3.17478 34.6675,-10.6582 77.6688,-22.3369 62.1634,-16.6676 105.505,-30.1604 129.996,-40.847 24.6613,-10.4881 43.9934,-25.9935 57.9965,-46.1477 14.0031,-20.1826 21.0046,-45.184 21.0046,-75.1743 0,-29.3384 -8.67396,-56.8343 -25.6817,-82.8278 -17.1495,-25.8518 -41.8108,-45.8359 -73.9838,-60.0091 -32.173,-14.1731 -68.683,-21.1747 -109.332,-21.1747 -67.5208,0 -118.856,14.0031 -154.175,42.0092 -35.3195,28.0061 -57.8264,69.5051 -67.4925,124.497z"/></glyph>
</font>
<style type="text/css">
<![CDATA[
@font-face { font-family:"Courier New";src:url("#FontID1") format(svg)}
@font-face { font-family:"Arial";src:url("#FontID0") format(svg)}
.str0 {stroke:#1F1A17;stroke-width:0.0762}
.str2 {stroke:#DA251D;stroke-width:0.0762}
.str1 {stroke:#1F1A17;stroke-width:0.1764}
.fil2 {fill:none}
.fil1 {fill:#1F1A17}
.fil0 {fill:#C2C1C1}
.fil3 {fill:#DA251D}
.fnt0 {font-weight:normal;font-size:2.8222;font-family:'Arial'}
.fnt2 {font-weight:normal;font-size:2.8222;font-family:'Courier New'}
.fnt3 {font-weight:bold;font-size:2.8222;font-family:'Courier New'}
.fnt4 {font-weight:normal;font-size:3.5278;font-family:'Arial'}
.fnt1 {font-weight:bold;font-size:3.5278;font-family:'Arial'}
.fnt5 {font-weight:bold;font-size:3.5278;font-family:'Arial'}
]]>
</style>
</defs>
<g id="Warstwa_x0020_1">
<metadata id="CorelCorpID_0Corel-Layer"/>
<rect class="fil0 str0" x="17.4948" y="46.5931" width="18.6676" height="4.12615"/>
<rect class="fil0 str0" x="36.3575" y="46.5931" width="17.9399" height="4.12615"/>
<rect class="fil0 str0" x="54.3701" y="46.5931" width="6.4125" height="4.12615"/>
<rect class="fil0 str0" x="60.8095" y="46.6216" width="73.7991" height="4.12615"/>
<rect class="fil0 str0" x="135.259" y="46.6216" width="17.928" height="4.12615"/>
<g transform="matrix(0.946753 0 0 1 -81.8469 -89.4959)">
<text x="107.95" y="139.7" class="fil1 fnt0">Dest. MAC</text>
</g>
<g transform="matrix(0.946753 0 0 1 -62.9533 -89.5194)">
<text x="107.95" y="139.7" class="fil1 fnt0">Source MAC</text>
</g>
<g transform="matrix(0.946753 0 0 1 -44.9407 -89.5194)">
<text x="107.95" y="139.7" class="fil1 fnt0">ET</text>
</g>
<g transform="matrix(0.946753 0 0 1 36.3393 -89.5194)">
<text x="107.95" y="139.7" class="fil1 fnt0">RX OOB</text>
</g>
<g transform="matrix(0.946753 0 0 1 -9.67408 -89.3876)">
<text x="107.95" y="139.7" class="fil1 fnt0">PAYLOAD</text>
</g>
<polyline class="fil2 str0" points="162.433,44.6151 162.431,40.2786 159.483,40.2786 159.483,44.5348 156.278,44.6472 156.282,40.4159 153.334,40.4159 153.334,44.6721 150.123,44.6793 150.12,40.3428 147.172,40.3428 147.172,44.599 143.944,44.5282 143.925,40.3588 140.977,40.3588 140.977,44.615 137.765,44.6222 137.763,40.2857 134.815,40.2857 134.815,44.5419 131.607,44.5282 131.593,40.3146 128.645,40.3146 128.645,44.5708 125.434,44.578 125.432,40.2415 122.483,40.2415 122.483,44.4977 119.255,44.5495 119.236,40.2575 116.288,40.2575 116.288,44.5137 113.077,44.5209 113.074,40.1844 110.126,40.1844 110.126,44.4406 106.909,44.6058 106.901,40.4273 103.953,40.4273 103.953,44.6835 100.741,44.6907 100.739,40.3542 97.7908,40.3542 97.7908,44.6104 94.5625,44.5396 94.5434,40.3702 91.5953,40.3702 91.5953,44.6264 88.3839,44.6336 88.3816,40.2971 85.4335,40.2971 85.4335,44.5533 82.2255,44.5396 82.2119,40.326 79.2638,40.326 79.2638,44.5822 76.0524,44.5894 76.0501,40.2529 73.102,40.2529 73.102,44.5091 69.8737,44.5609 69.8546,40.2689 66.9065,40.2689 66.9065,44.5251 63.6951,44.5323 63.6928,40.1958 60.7447,40.1958 60.7447,44.452 57.5399,44.5644 57.5443,40.3331 54.5962,40.3331 54.5962,44.5893 51.3848,44.5965 51.3825,40.26 48.4344,40.26 48.4344,44.5162 45.2061,44.4454 45.187,40.276 42.2389,40.276 42.2389,44.5322 39.0275,44.5394 39.0252,40.2029 36.0771,40.2029 36.0771,44.4591 32.8691,44.4454 32.8555,40.2318 29.9074,40.2318 29.9074,44.488 26.696,44.4952 26.6937,40.1587 23.7456,40.1587 23.7456,44.4149 20.5173,44.4667 20.4982,40.1747 17.5501,40.1747 17.5501,44.4309 14.3387,44.4381 14.3364,40.1016 11.3883,40.1016 11.3883,44.3578 8.1792,44.3578 "/>
<g transform="matrix(0.946753 0 0 1 -84.2551 -89.4669)">
<text x="107.95" y="139.7" class="fil1 fnt1">1</text>
</g>
<g transform="matrix(0.946753 0 0 1 -65.3924 -89.4669)">
<text x="107.95" y="139.7" class="fil1 fnt1">2</text>
</g>
<g transform="matrix(0.946753 0 0 1 -47.3798 -89.4669)">
<text x="107.95" y="139.7" class="fil1 fnt1">3</text>
</g>
<g transform="matrix(0.946753 0 0 1 33.9002 -89.4669)">
<text x="107.95" y="139.7" class="fil1 fnt1">6</text>
</g>
<g transform="matrix(0.946753 0 0 1 -40.9404 -89.4384)">
<text x="107.95" y="139.7" class="fil1 fnt1">7</text>
</g>
<g transform="matrix(0.884296 0 0 1 -77.7845 -86.5046)">
<text x="107.95" y="139.7" class="fil1 fnt2">0001</text>
</g>
<g transform="matrix(0.884296 0 0 1 -41.0096 -86.3571)">
<text x="107.95" y="139.7" class="fil1 fnt2">0c0d</text>
</g>
<g transform="matrix(0.884296 0 0 1 14.1968 -86.3114)">
<text x="107.95" y="139.7" class="fil1 fnt2">1c1d</text>
</g>
<g transform="matrix(0.884296 0 0 1 -59.4407 -86.4564)">
<text x="107.95" y="139.7" class="fil1 fnt2">0607</text>
</g>
<g transform="matrix(0.884296 0 0 1 -10.2935 -86.3531)">
<text x="107.95" y="139.7" class="fil1 fnt2">1617</text>
</g>
<g transform="matrix(0.884296 0 0 1 -71.8295 -86.5046)">
<text x="107.95" y="139.7" class="fil1 fnt2">0203</text>
</g>
<g transform="matrix(0.884296 0 0 1 -22.6823 -86.4013)">
<text x="107.95" y="139.7" class="fil1 fnt2">1213</text>
</g>
<g transform="matrix(0.884296 0 0 1 -35.0546 -86.3571)">
<text x="107.95" y="139.7" class="fil1 fnt2">0e0f</text>
</g>
<g transform="matrix(0.884296 0 0 1 26.7894 -86.1167)">
<text x="107.95" y="139.7" class="fil1 fnt2">1e1f</text>
</g>
<g transform="matrix(0.884296 0 0 1 45.4602 -86.1691)">
<text x="107.95" y="139.7" class="fil1 fnt2">6123</text>
</g>
<g transform="matrix(0.884296 0 0 1 -53.4857 -86.4564)">
<text x="107.95" y="139.7" class="fil1 fnt2">0809</text>
</g>
<g transform="matrix(0.884296 0 0 1 -4.33848 -86.3531)">
<text x="107.95" y="139.7" class="fil1 fnt2">1819</text>
</g>
<g transform="matrix(0.884296 0 0 1 -65.4595 -86.5046)">
<text x="107.95" y="139.7" class="fil1 fnt2">0405</text>
</g>
<g transform="matrix(0.884296 0 0 1 -16.3123 -86.4013)">
<text x="107.95" y="139.7" class="fil1 fnt2">1415</text>
</g>
<g transform="matrix(0.884296 0 0 1 -28.6846 -86.3571)">
<text x="107.95" y="139.7" class="fil1 fnt2">1011</text>
</g>
<g transform="matrix(0.884296 0 0 1 33.1594 -86.1167)">
<text x="107.95" y="139.7" class="fil1 fnt2">20XX</text>
</g>
<g transform="matrix(0.884296 0 0 1 51.8302 -86.1691)">
<text x="107.95" y="139.7" class="fil1 fnt2">4567</text>
</g>
<g transform="matrix(0.884296 0 0 1 -47.1157 -86.4564)">
<text x="107.95" y="139.7" class="fil1 fnt2">0a0b</text>
</g>
<g transform="matrix(0.884296 0 0 1 8.09072 -86.4107)">
<text x="107.95" y="139.7" class="fil1 fnt2">1a1b</text>
</g>
<g transform="matrix(0.884296 0 0 1 3.62892 -86.268)">
<text x="107.95" y="139.7" class="fil1 fnt3">XX</text>
</g>
<g transform="matrix(0.884296 0 0 1 21.9787 -86.1052)">
<text x="107.95" y="139.7" class="fil1 fnt3">XX</text>
</g>
<g transform="matrix(0.884296 0 0 1 -85.1573 -88.6482)">
<text x="107.95" y="139.7" class="fil1 fnt3">XX</text>
</g>
<g transform="matrix(0.884296 0 0 1 61.8987 -88.6482)">
<text x="107.95" y="139.7" class="fil1 fnt3">XX</text>
</g>
<g transform="matrix(0.884296 0 0 1 39.2347 -86.0528)">
<text x="107.95" y="139.7" class="fil1 fnt2">08XX</text>
</g>
<line class="fil2 str1" x1="23.5587" y1="51.1944" x2="23.5587" y2= "53.4984" />
<line class="fil2 str1" x1="60.3336" y1="51.3419" x2="60.3336" y2= "53.6459" />
<line class="fil2 str1" x1="122.178" y1="51.5823" x2="122.178" y2= "53.8863" />
<line class="fil2 str1" x1="140.848" y1="51.5299" x2="140.848" y2= "53.8339" />
<line class="fil2 str1" x1="115.759" y1="51.4367" x2="115.759" y2= "53.7407" />
<line class="fil2 str1" x1="41.9025" y1="51.2426" x2="41.9025" y2= "53.5466" />
<line class="fil2 str1" x1="91.0497" y1="51.3459" x2="91.0497" y2= "53.6499" />
<line class="fil2 str1" x1="29.8073" y1="51.0912" x2="29.8073" y2= "53.6015" />
<line class="fil2 str1" x1="78.9545" y1="51.1945" x2="78.9545" y2= "53.7048" />
<line class="fil2 str1" x1="66.5822" y1="51.2387" x2="66.5822" y2= "53.749" />
<line class="fil2 str1" x1="128.426" y1="51.4791" x2="128.426" y2= "53.9894" />
<line class="fil2 str1" x1="147.097" y1="51.4267" x2="147.097" y2= "53.937" />
<line class="fil2 str1" x1="48.1511" y1="51.1394" x2="48.1511" y2= "53.6497" />
<line class="fil2 str1" x1="97.2983" y1="51.2427" x2="97.2983" y2= "53.753" />
<line class="fil2 str1" x1="103.546" y1="51.2427" x2="103.546" y2= "53.753" />
<line class="fil2 str1" x1="35.953" y1="51.16" x2="35.953" y2= "53.7046" />
<line class="fil2 str1" x1="85.1002" y1="51.2633" x2="85.1002" y2= "53.8079" />
<line class="fil2 str1" x1="72.7279" y1="51.3075" x2="72.7279" y2= "53.8521" />
<line class="fil2 str1" x1="134.572" y1="51.5479" x2="134.572" y2= "54.0925" />
<line class="fil2 str1" x1="153.243" y1="51.4955" x2="153.243" y2= "54.0401" />
<line class="fil2 str1" x1="54.2968" y1="51.2082" x2="54.2968" y2= "53.7528" />
<line class="fil2 str1" x1="109.503" y1="51.2539" x2="109.503" y2= "53.7985" />
<polyline class="fil2 str0" points="9.0569,66.9804 11.4136,66.9804 11.4136,63.4459 17.0676,63.4459 17.0676,67.0393 163.661,67.0393 "/>
<polyline class="fil2 str0" points="9.0569,85.4751 147.041,85.4751 147.041,81.9406 152.695,81.9406 152.695,85.534 163.661,85.534 "/>
<polyline class="fil2 str0" points="8.6972,69.8544 91.1473,69.8544 91.1473,73.9938 97.2714,73.9938 97.2714,69.9968 163.661,69.9968 "/>
<polyline class="fil2 str0" points="8.982,79.3952 17.2424,79.3952 17.2424,75.2632 97.1281,75.2632 97.1281,79.6892 103.537,79.6892 103.537,75.408 115.64,75.408 115.64,79.8247 121.92,79.8247 121.92,75.4052 134.592,75.4052 152.74,75.4052 152.74,79.4204 163.661,79.4204 "/>
<text x="-0.99" y="43.14" class="fil1 fnt4">clock</text>
<text x="-0.8425" y="49.4125" class="fil1 fnt4">ctrl</text>
<text x="-0.8425" y="53.3536" class="fil1 fnt4">data</text>
<text x="-0.3245" y="72.5425" class="fil1 fnt4">dreq</text>
<text x="-2.8355" y="66.605" class="fil1 fnt4">sof_p1</text>
<text x="-4.2715" y="61.3814" class="fil1 fnt4">bytesel</text>
<text x="-0.4926" y="78.4196" class="fil1 fnt4">valid</text>
<text x="-3.9065" y="85.507" class="fil1 fnt4">eof_p1</text>
<polyline class="fil2 str0" points="7.0375,60.383 128.346,60.383 128.346,56.472 134.662,56.472 134.662,60.1313 163.661,60.1313 "/>
<ellipse class="fil2 str2" cx="14.6827" cy="71.7863" rx="3.80335" ry="10.7709"/>
<ellipse class="fil2 str2" cx="97.1971" cy="75.109" rx="7.9542" ry="6.70215"/>
<ellipse class="fil2 str2" cx="119.1" cy="77.9783" rx="4.1619" ry="3.8328"/>
<ellipse class="fil2 str2" cx="131.222" cy="58.9978" rx="4.1619" ry="3.8328"/>
<ellipse class="fil2 str2" cx="149.884" cy="80.6898" rx="4.1619" ry="7.6608"/>
<text x="13.3922" y="66.6639" class="fil3 fnt5">1</text>
<text x="98.4642" y="76.6479" class="fil3 fnt5">2</text>
<text x="118.432" y="78.7279" class="fil3 fnt5">3</text>
<text x="130.912" y="60.4239" class="fil3 fnt5">4</text>
<text x="149.84" y="81.4319" class="fil3 fnt5">5</text>
</g>
</svg>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment