ngspice simulator

This commit is contained in:
Maciej Suminski 2016-08-11 15:04:55 +02:00
commit 5b2f375ffb
103 changed files with 33674 additions and 464 deletions

View File

@ -59,6 +59,7 @@ endif()
option( BUILD_GITHUB_PLUGIN "Build the GITHUB_PLUGIN for pcbnew." ON )
option( KICAD_SPICE "Build Kicad with internal Spice simulator." OFF )
# This can be set to a custom name to brag about a particular branch in the "About" dialog:
set( KICAD_REPO_NAME "product" CACHE STRING "Name of the tree from which this build came." )
@ -250,6 +251,10 @@ if( KICAD_SCRIPTING_WXPYTHON )
add_definitions( -DKICAD_SCRIPTING_WXPYTHON )
endif()
if( KICAD_SPICE )
add_definitions( -DKICAD_SPICE )
endif()
if( USE_WX_GRAPHICS_CONTEXT OR APPLE )
add_definitions( -DUSE_WX_GRAPHICS_CONTEXT )
endif()

View File

@ -512,6 +512,12 @@ set( BMAPS_MID
select_w_layer
shape_3d
sheetset
sim_run
sim_stop
sim_tune
sim_probe
sim_add_signal
sim_settings
setcolor_3d_bg
setcolor_silkscreen
setcolor_soldermask

View File

@ -0,0 +1,52 @@
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x02, 0x31, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
0x03, 0x3d, 0x30, 0xc3, 0xf0, 0xb5, 0x48, 0x53, 0x3c, 0x3f, 0x59, 0x43, 0xa2, 0x40, 0x81, 0xa6,
0x16, 0xa9, 0x08, 0xe5, 0xf2, 0x69, 0x88, 0xe5, 0xbf, 0xd2, 0x10, 0xcb, 0x5b, 0x42, 0x53, 0x8b,
0x34, 0x44, 0xf3, 0x5b, 0x81, 0x16, 0xfd, 0x07, 0xe2, 0x7f, 0x5a, 0xa2, 0xb9, 0x86, 0x34, 0xb1,
0x88, 0x81, 0xa1, 0x81, 0x09, 0x68, 0x41, 0x1d, 0x10, 0x1f, 0x57, 0x17, 0x2b, 0x58, 0xa4, 0x21,
0x56, 0x10, 0x44, 0xd3, 0x38, 0x52, 0x17, 0xcf, 0xef, 0xd0, 0x14, 0xcf, 0xb5, 0xa0, 0x79, 0x62,
0x18, 0xf4, 0x16, 0x81, 0x83, 0x5e, 0xa4, 0x48, 0x4d, 0x5d, 0xa4, 0x8c, 0x57, 0x45, 0x25, 0x97,
0x5d, 0x4d, 0xa2, 0xd0, 0x8c, 0x6a, 0x16, 0xa9, 0x8b, 0x16, 0x84, 0x40, 0x52, 0x6a, 0x9e, 0x95,
0x86, 0x78, 0x41, 0x24, 0x84, 0x5d, 0xd0, 0xa0, 0x21, 0x5e, 0xa8, 0x0b, 0x32, 0x43, 0x43, 0x24,
0xcf, 0x98, 0x2a, 0x16, 0x69, 0x8a, 0xe5, 0xbb, 0xaa, 0x89, 0xe6, 0xdb, 0x80, 0x30, 0x30, 0x01,
0x35, 0x41, 0xf4, 0xe7, 0xe5, 0x2b, 0x28, 0x24, 0x70, 0x68, 0x8b, 0x66, 0x49, 0x68, 0x8a, 0xe5,
0x95, 0x51, 0xc5, 0x22, 0x20, 0x60, 0x04, 0xa5, 0x50, 0x63, 0xa9, 0x34, 0x2e, 0xa0, 0xaf, 0xea,
0xc1, 0x96, 0x8b, 0x16, 0x64, 0xab, 0x8b, 0xe7, 0x28, 0xea, 0x48, 0x15, 0xc9, 0x82, 0x7c, 0x4c,
0xb5, 0x38, 0xd2, 0x11, 0xcb, 0x17, 0x07, 0xd1, 0xda, 0xa2, 0x05, 0x06, 0xa0, 0x38, 0x32, 0x10,
0x28, 0x10, 0x00, 0x59, 0x02, 0xf2, 0xa5, 0x92, 0x60, 0x39, 0x3f, 0x5e, 0x8b, 0x80, 0x79, 0xa9,
0x18, 0x84, 0x65, 0x64, 0x0a, 0x39, 0x61, 0xe2, 0xa0, 0xe0, 0x30, 0x66, 0x48, 0x63, 0x45, 0xd7,
0x08, 0x8a, 0x78, 0x18, 0x5b, 0x5b, 0x2a, 0x5f, 0x0e, 0xe2, 0x53, 0x07, 0x16, 0x60, 0xd0, 0xf1,
0xe0, 0x4b, 0x0c, 0xd6, 0x65, 0xb9, 0x4b, 0x56, 0x03, 0x2d, 0x79, 0x03, 0x2e, 0x21, 0x44, 0xf3,
0x97, 0x83, 0x83, 0x43, 0xa4, 0x40, 0x12, 0xc8, 0x3e, 0x05, 0x8c, 0xe8, 0x07, 0xda, 0x12, 0xb9,
0x5a, 0x60, 0x0b, 0x24, 0x72, 0x45, 0x81, 0x6a, 0x96, 0xaa, 0x8b, 0xe5, 0xbf, 0xd7, 0x10, 0xcf,
0x4b, 0x03, 0x89, 0xe9, 0xf2, 0x67, 0x0a, 0x42, 0xd4, 0xe5, 0xff, 0xd0, 0x14, 0x2f, 0x74, 0xc1,
0x67, 0x51, 0xd3, 0xd2, 0x79, 0x87, 0x5f, 0x03, 0x15, 0xfe, 0x04, 0x1a, 0x30, 0x15, 0x64, 0x19,
0x30, 0x0e, 0xa2, 0x81, 0xf4, 0x3d, 0xb0, 0x81, 0x62, 0xf9, 0x6f, 0x81, 0x78, 0x8d, 0xba, 0x78,
0x81, 0x13, 0xd4, 0x31, 0x5f, 0x35, 0xc4, 0xf3, 0xcf, 0x00, 0xe9, 0x6f, 0x5a, 0xe2, 0xf9, 0xe6,
0x30, 0xb6, 0xa6, 0x68, 0xfe, 0x35, 0x20, 0xfd, 0x41, 0x53, 0x34, 0x4f, 0x15, 0xab, 0x45, 0x7f,
0xff, 0xfe, 0x6f, 0x5e, 0xbe, 0xe0, 0xc8, 0x0b, 0xa0, 0x0b, 0x27, 0x39, 0x30, 0x34, 0xb0, 0x00,
0x15, 0x5f, 0x02, 0xfb, 0x4c, 0x3c, 0xff, 0x9d, 0x9a, 0x58, 0xae, 0x3e, 0x30, 0xc2, 0x4b, 0xa0,
0x65, 0xe1, 0x6f, 0x20, 0xbe, 0x0c, 0x8a, 0x74, 0x50, 0x70, 0x81, 0x7c, 0x00, 0x53, 0xa7, 0x25,
0x9e, 0xe7, 0x0c, 0x0e, 0x01, 0xb1, 0x82, 0x6e, 0x6c, 0x41, 0x0d, 0x63, 0xc4, 0xcf, 0x9d, 0xba,
0x6f, 0x3b, 0x2c, 0x31, 0x80, 0xaa, 0x0b, 0x70, 0x9c, 0x41, 0xf3, 0x83, 0xb6, 0x76, 0x03, 0x1b,
0x30, 0x49, 0x4f, 0x07, 0xe2, 0x69, 0xa0, 0x8c, 0x89, 0xc8, 0x4f, 0x79, 0x1e, 0xa0, 0x02, 0x19,
0x64, 0xf1, 0xf0, 0x2e, 0xeb, 0x40, 0x25, 0x05, 0x5d, 0x2c, 0x02, 0xa5, 0x52, 0x60, 0xc2, 0x28,
0x07, 0x65, 0x0d, 0x5c, 0xf9, 0xe8, 0x38, 0x10, 0xef, 0xa0, 0x02, 0xfe, 0x0d, 0x4e, 0xb9, 0xa2,
0xf9, 0x8f, 0x34, 0xc5, 0xf3, 0x74, 0x50, 0x2c, 0x02, 0xa5, 0x36, 0x90, 0x0b, 0xa8, 0x81, 0x41,
0x49, 0x1c, 0x94, 0xaf, 0x80, 0xbe, 0xb2, 0xa3, 0x69, 0x2b, 0x48, 0x53, 0xac, 0x20, 0x00, 0x54,
0x1e, 0x0e, 0x48, 0x73, 0x0b, 0x00, 0x1a, 0x04, 0x6e, 0x5e, 0xc4, 0x63, 0x0b, 0x12, 0x00, 0x00,
0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE sim_add_signal_xpm[1] = {{ png, sizeof( png ), "sim_add_signal_xpm" }};
//EOF

View File

@ -0,0 +1,58 @@
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x02, 0x96, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xb5, 0x96, 0xcd, 0x6b, 0x13,
0x41, 0x18, 0xc6, 0xd7, 0x4f, 0xaa, 0x48, 0x09, 0x69, 0x66, 0x66, 0x5d, 0xa3, 0x46, 0x12, 0xb2,
0xb3, 0xd9, 0xa2, 0x42, 0x0f, 0x45, 0x2d, 0xb4, 0xe0, 0x45, 0x10, 0x24, 0x1e, 0xc4, 0xab, 0xa8,
0xf4, 0x90, 0x76, 0x77, 0x26, 0x49, 0x55, 0x44, 0x0f, 0xf1, 0xa2, 0x28, 0xe8, 0xcd, 0x93, 0x50,
0x0f, 0x8a, 0x8a, 0x5a, 0x15, 0x05, 0xbd, 0x09, 0xfe, 0x01, 0x7a, 0xf0, 0x20, 0x88, 0x78, 0x53,
0x14, 0x0f, 0x5a, 0xbc, 0x28, 0x55, 0x59, 0x9f, 0xa9, 0xa6, 0xdd, 0xd9, 0x24, 0xed, 0x36, 0x4d,
0x0e, 0x7b, 0xd8, 0x61, 0xf6, 0xfd, 0xbd, 0xef, 0xf3, 0x7e, 0xad, 0x11, 0x04, 0x81, 0xd1, 0x8d,
0xc7, 0x30, 0x6a, 0x2b, 0xb5, 0xf7, 0x4e, 0x03, 0x38, 0x95, 0x15, 0x87, 0xca, 0x47, 0x0e, 0x15,
0x4f, 0x39, 0xf5, 0x2f, 0x0f, 0x58, 0xa3, 0xeb, 0x3b, 0x0a, 0x72, 0x89, 0xbf, 0xcf, 0x66, 0xe2,
0x8d, 0x43, 0xfc, 0xb1, 0xfa, 0x99, 0x4d, 0xc5, 0x09, 0x9e, 0xf2, 0x86, 0x3b, 0x02, 0x72, 0x88,
0x38, 0xec, 0xf4, 0x8d, 0x17, 0x39, 0x11, 0x5f, 0x39, 0x15, 0x0f, 0xb4, 0xe8, 0x4c, 0x39, 0x82,
0xc8, 0x4a, 0xcb, 0x06, 0x71, 0x26, 0x4f, 0xc3, 0x78, 0x00, 0xb9, 0x7e, 0x01, 0xf4, 0xb9, 0x9f,
0x0a, 0xa6, 0xcb, 0x28, 0xaa, 0x05, 0xe6, 0xef, 0x5d, 0x16, 0x28, 0x4f, 0x65, 0x11, 0x86, 0x66,
0xfe, 0x81, 0x66, 0x9f, 0x9f, 0x59, 0x52, 0xca, 0xcd, 0x49, 0xe9, 0xd6, 0xd6, 0xe2, 0xec, 0x19,
0xaa, 0x62, 0x45, 0xdb, 0x20, 0x78, 0xbe, 0x1d, 0xfa, 0x7f, 0x09, 0x41, 0x02, 0x9b, 0xc8, 0x6b,
0x7a, 0xb4, 0xfe, 0x79, 0x1b, 0x79, 0x6b, 0xbb, 0xea, 0xf2, 0x56, 0x35, 0x05, 0xc3, 0xaf, 0xc3,
0x10, 0xce, 0xc4, 0xf3, 0x4c, 0xa6, 0xd6, 0x13, 0xaa, 0xbc, 0x5d, 0x70, 0xe4, 0x6a, 0xdb, 0xe5,
0xad, 0x7a, 0x03, 0xb9, 0x78, 0x12, 0x86, 0xa0, 0x94, 0xdf, 0x65, 0x93, 0x95, 0xcd, 0xf5, 0x3b,
0x39, 0xd3, 0x23, 0xea, 0x4e, 0x3a, 0x5d, 0x5e, 0xd7, 0x36, 0x48, 0xf5, 0x85, 0x26, 0x17, 0x15,
0xd3, 0x9c, 0x56, 0x76, 0xcf, 0x3b, 0x72, 0x68, 0x15, 0xce, 0xef, 0xe7, 0xa8, 0x97, 0x6d, 0x70,
0x32, 0x2e, 0xa4, 0x40, 0xe4, 0x51, 0x18, 0xf9, 0x13, 0x02, 0xfd, 0xe6, 0x44, 0x1e, 0xd1, 0xf3,
0x22, 0x2e, 0x38, 0x29, 0xb9, 0xbf, 0xa9, 0x1a, 0xb1, 0xf2, 0x42, 0xc4, 0x10, 0x0c, 0x7f, 0xd7,
0xa3, 0x91, 0x17, 0xb5, 0x7e, 0xa2, 0xfe, 0x41, 0x9c, 0x9f, 0x6b, 0x29, 0xfb, 0xa2, 0x0d, 0x99,
0xa8, 0x6e, 0x45, 0x72, 0xdf, 0x47, 0x24, 0x7b, 0xa8, 0x64, 0x9a, 0x9f, 0x0a, 0x25, 0x13, 0xe7,
0x53, 0xd1, 0xf9, 0x16, 0x1b, 0xa4, 0x12, 0x0a, 0x03, 0x2f, 0xb4, 0x0a, 0xa3, 0xe2, 0x15, 0xdf,
0x34, 0xd6, 0x17, 0xc9, 0xdd, 0x4d, 0x97, 0x94, 0x73, 0x0b, 0x16, 0xd2, 0xc2, 0xc9, 0x17, 0xd7,
0x23, 0x90, 0x4f, 0x0e, 0xf3, 0xfb, 0xb5, 0x88, 0x91, 0x13, 0x8c, 0xa1, 0x53, 0x8b, 0x56, 0x6c,
0x4b, 0xc9, 0xa8, 0x7f, 0x32, 0x02, 0xf9, 0x61, 0xb3, 0xca, 0x81, 0xe8, 0x3d, 0x9b, 0x88, 0x3b,
0x90, 0x6e, 0xc3, 0x92, 0x40, 0x83, 0x49, 0xaf, 0x17, 0xf9, 0x98, 0x82, 0xd1, 0x97, 0xca, 0xb0,
0xd6, 0x2f, 0xc4, 0x6b, 0xf0, 0x3a, 0xcb, 0x26, 0x28, 0x2a, 0x6d, 0x32, 0x56, 0x0f, 0x86, 0x5f,
0x76, 0x66, 0x64, 0x22, 0x34, 0x5a, 0x66, 0x42, 0x9d, 0x3f, 0xd9, 0x7c, 0xde, 0x79, 0x3b, 0xe2,
0xc8, 0xd6, 0x08, 0x4a, 0x00, 0x44, 0xc4, 0x07, 0x4d, 0x32, 0xe2, 0x7f, 0xdc, 0x46, 0x8f, 0xb3,
0xa6, 0x39, 0x34, 0x65, 0x06, 0x6b, 0xe0, 0xd2, 0x92, 0x41, 0x58, 0x5c, 0x67, 0x23, 0x79, 0xa9,
0xc3, 0xbc, 0x66, 0x1f, 0x8f, 0x18, 0xb5, 0xd5, 0x6a, 0xdc, 0xb8, 0x96, 0xd8, 0x12, 0x1b, 0xe4,
0xf6, 0x96, 0x93, 0xaa, 0xaa, 0x42, 0x0d, 0x39, 0xad, 0xc0, 0x6a, 0x1d, 0xb8, 0xe9, 0x63, 0xc9,
0x96, 0x45, 0x93, 0x92, 0x1b, 0xe1, 0xc8, 0x63, 0xd7, 0xf4, 0x0a, 0xb1, 0x40, 0x03, 0xc6, 0xe8,
0x1a, 0xb5, 0x8a, 0x01, 0xc1, 0x12, 0xf3, 0xdf, 0x02, 0xb4, 0x27, 0xf6, 0x1a, 0x47, 0x44, 0x6a,
0x5a, 0x43, 0xc6, 0x1b, 0x05, 0x26, 0x06, 0xc3, 0xcd, 0xdc, 0x00, 0x42, 0xc2, 0xaf, 0xa8, 0x49,
0xac, 0x76, 0x88, 0xf2, 0xb2, 0x9d, 0x3d, 0x65, 0xa7, 0xc6, 0x2d, 0x9b, 0xc9, 0x33, 0x68, 0xe0,
0x7b, 0x0e, 0x13, 0x77, 0x21, 0xeb, 0x6d, 0x35, 0x9a, 0xe6, 0x40, 0x00, 0x14, 0x11, 0xc1, 0xb7,
0x3c, 0xa9, 0x0e, 0x75, 0xed, 0xf7, 0xeb, 0xff, 0xa2, 0xba, 0xc5, 0xcd, 0xf2, 0x70, 0xb7, 0x20,
0xb3, 0x20, 0x0b, 0xff, 0x5d, 0xd1, 0xd9, 0xd5, 0x8d, 0xe7, 0x2f, 0xdd, 0xe9, 0x8f, 0x4f, 0x15,
0x70, 0x65, 0x93, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE sim_probe_xpm[1] = {{ png, sizeof( png ), "sim_probe_xpm" }};
//EOF

View File

@ -0,0 +1,39 @@
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x01, 0x62, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
0x03, 0x08, 0x33, 0x4c, 0xb3, 0x11, 0x84, 0xb1, 0x69, 0x81, 0x11, 0x8c, 0x89, 0x76, 0xed, 0x0c,
0x93, 0xed, 0xd7, 0x31, 0x4c, 0xb6, 0x53, 0xa4, 0xad, 0x45, 0x93, 0xed, 0xdb, 0x18, 0x26, 0xd9,
0xff, 0x07, 0xe2, 0x1f, 0x40, 0xdc, 0xca, 0xd0, 0xed, 0xc6, 0x4d, 0x6b, 0x8b, 0x20, 0x78, 0xb2,
0xfd, 0x13, 0x86, 0x49, 0x76, 0xd1, 0x0c, 0xff, 0x19, 0x18, 0xa9, 0x6b, 0x11, 0xc8, 0x17, 0xc8,
0x16, 0x21, 0xf0, 0x51, 0x86, 0xc9, 0x0e, 0x26, 0x54, 0xf4, 0x91, 0x43, 0x0b, 0x0e, 0x8b, 0x40,
0xf8, 0x1f, 0x10, 0xcf, 0x65, 0x98, 0xe0, 0x2c, 0x4e, 0x6b, 0x8b, 0x60, 0xf8, 0x23, 0x30, 0x38,
0x8b, 0x19, 0x66, 0x1a, 0xb3, 0x52, 0x10, 0x74, 0x76, 0xcd, 0x44, 0x58, 0x04, 0xc3, 0x37, 0x81,
0xa9, 0xd4, 0x8b, 0xcc, 0xe4, 0x6d, 0xdf, 0x44, 0x82, 0x45, 0xb0, 0x04, 0xb3, 0x95, 0x61, 0x8a,
0x8d, 0x1a, 0xed, 0x2d, 0x82, 0xe0, 0x5f, 0x0c, 0x93, 0x1c, 0x7a, 0x18, 0x26, 0x99, 0xf3, 0x11,
0x9b, 0xea, 0x1a, 0xc9, 0xb4, 0x08, 0x86, 0x5f, 0x00, 0x83, 0x3f, 0x09, 0x57, 0x76, 0xa0, 0xa6,
0x45, 0x30, 0x7c, 0x06, 0x18, 0x7f, 0x56, 0x78, 0x82, 0xce, 0xa1, 0x81, 0x4a, 0x16, 0x41, 0xb1,
0xc3, 0x12, 0x86, 0x3e, 0x27, 0x69, 0x2c, 0xc9, 0xdb, 0xae, 0x9e, 0xba, 0x16, 0xd9, 0x3f, 0x07,
0xfa, 0x2c, 0x8c, 0x96, 0x16, 0xfd, 0x04, 0xfa, 0xa6, 0x83, 0xa1, 0xd3, 0x9a, 0x17, 0x57, 0x1c,
0xd5, 0x51, 0xc1, 0x92, 0x8d, 0x0c, 0x93, 0x9c, 0x94, 0x09, 0x15, 0xaa, 0xb5, 0x14, 0x58, 0x70,
0x95, 0x61, 0x8a, 0xbd, 0x2b, 0xb1, 0xa5, 0x37, 0x39, 0x16, 0xbd, 0x03, 0xe2, 0x3c, 0x86, 0x06,
0x07, 0x16, 0x12, 0x8a, 0x20, 0x87, 0x1a, 0x12, 0x2c, 0xf8, 0x03, 0x8c, 0xe8, 0xe9, 0x0c, 0x3d,
0x0e, 0x22, 0xe4, 0xd4, 0xb0, 0xd5, 0x44, 0x5a, 0xb2, 0x9f, 0x61, 0x92, 0xa3, 0x3e, 0x25, 0x55,
0x39, 0x21, 0x8b, 0x1e, 0x00, 0x7d, 0x1d, 0x42, 0x8d, 0x8a, 0xaf, 0x0a, 0x87, 0x05, 0x5f, 0xc1,
0xf1, 0x37, 0xdf, 0x81, 0x83, 0x4a, 0x8d, 0x13, 0xfb, 0x4a, 0x2c, 0x96, 0x2c, 0x03, 0xfa, 0x42,
0x86, 0xca, 0xad, 0x20, 0x14, 0x8b, 0xce, 0x32, 0x4c, 0x76, 0xb4, 0xa6, 0x51, 0xe3, 0xc4, 0xa1,
0x02, 0x68, 0xc1, 0x4b, 0x60, 0x09, 0x91, 0xcc, 0xd0, 0xc0, 0xc0, 0x44, 0xbb, 0xe6, 0x16, 0x30,
0x25, 0x11, 0xaa, 0x53, 0x28, 0xc1, 0x00, 0xfb, 0x3a, 0x4b, 0x39, 0x99, 0xc1, 0x7b, 0x69, 0x00,
0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE sim_run_xpm[1] = {{ png, sizeof( png ), "sim_run_xpm" }};
//EOF

View File

@ -0,0 +1,40 @@
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x01, 0x6e, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0xd5, 0x96, 0x3d, 0x4b, 0x03,
0x41, 0x10, 0x40, 0x4f, 0x11, 0x0c, 0x48, 0x30, 0x3f, 0x41, 0x10, 0x5b, 0x05, 0x6d, 0x2c, 0xc4,
0x88, 0x4d, 0x1a, 0xd3, 0x88, 0x8a, 0x90, 0x46, 0x4b, 0x89, 0x16, 0x16, 0x62, 0xa1, 0xf8, 0x0b,
0xa2, 0x95, 0x42, 0x50, 0xc8, 0x5f, 0xb0, 0x52, 0xac, 0x04, 0xc5, 0xca, 0xc2, 0x54, 0x5a, 0x58,
0x89, 0xa0, 0xad, 0x85, 0x9d, 0x5f, 0xe7, 0x5b, 0xd8, 0x83, 0x65, 0x99, 0xdb, 0xec, 0xe6, 0x8c,
0xe8, 0xc0, 0x2b, 0x96, 0xec, 0xdc, 0x5b, 0x36, 0x33, 0x73, 0x17, 0xc5, 0x71, 0x1c, 0xfd, 0x06,
0xd1, 0x9f, 0x13, 0x11, 0xdd, 0xb0, 0x64, 0x50, 0xee, 0x94, 0x68, 0x10, 0x62, 0x83, 0xc7, 0x1f,
0x11, 0x11, 0xf3, 0x30, 0x6e, 0xac, 0xcb, 0x96, 0xe8, 0x03, 0x7a, 0xf4, 0x6f, 0x5d, 0xb0, 0x0a,
0x03, 0x41, 0x22, 0xa2, 0xa2, 0x1f, 0xf4, 0x06, 0xdb, 0xb0, 0x0b, 0x2f, 0x96, 0x48, 0x71, 0x07,
0x55, 0x38, 0xd1, 0xeb, 0x87, 0x34, 0x99, 0x4b, 0x12, 0xb7, 0x89, 0x28, 0x93, 0x44, 0x47, 0x19,
0x24, 0xc9, 0x95, 0x16, 0x7d, 0x44, 0x79, 0x7d, 0xaa, 0x76, 0x45, 0x3b, 0x21, 0xff, 0xd1, 0x8d,
0xf0, 0x80, 0x27, 0x58, 0x81, 0x51, 0x98, 0x86, 0x1a, 0xbc, 0x0b, 0xfb, 0x16, 0x5a, 0x8a, 0x88,
0x1c, 0xcc, 0x08, 0xc9, 0xf7, 0x50, 0x10, 0x0e, 0x54, 0x84, 0x4f, 0x6b, 0xef, 0x15, 0xf4, 0xa7,
0x8a, 0x88, 0x3d, 0xc7, 0x75, 0x94, 0x1c, 0x6d, 0xd0, 0x48, 0xc9, 0x79, 0x86, 0x31, 0x49, 0x54,
0x4f, 0x49, 0x50, 0x27, 0xee, 0x73, 0x88, 0x2a, 0x8e, 0x03, 0x4e, 0x85, 0x88, 0x54, 0x15, 0xe5,
0x1c, 0xa2, 0xc5, 0x50, 0x51, 0xcd, 0x91, 0x30, 0xe9, 0x10, 0xed, 0x07, 0x89, 0x8c, 0xd2, 0x2e,
0xc1, 0x97, 0x95, 0xd0, 0x84, 0x5e, 0x41, 0x32, 0xa2, 0xa7, 0x87, 0x2d, 0x58, 0x87, 0x21, 0x35,
0x9a, 0x5a, 0x95, 0xf7, 0x99, 0x90, 0x7c, 0x0b, 0xb3, 0xaa, 0xeb, 0x61, 0x18, 0x36, 0xe0, 0x55,
0xda, 0xe7, 0x3b, 0x82, 0xd4, 0x80, 0x3c, 0xcf, 0xd0, 0xb0, 0x97, 0xea, 0x95, 0xe2, 0x23, 0xaa,
0x66, 0x1c, 0x41, 0x8a, 0x2d, 0x1f, 0xd1, 0x5c, 0x4a, 0xc7, 0x87, 0x70, 0xe8, 0x3b, 0x82, 0x4c,
0xd9, 0x05, 0x9c, 0x0a, 0x05, 0x92, 0x70, 0x0d, 0xc7, 0xc6, 0xba, 0xe1, 0x75, 0x75, 0x96, 0x6c,
0x2d, 0xa9, 0x1c, 0x5d, 0x8d, 0xb6, 0x64, 0xd3, 0xd8, 0xbf, 0x0c, 0x07, 0x92, 0x24, 0xf4, 0x55,
0x9e, 0x17, 0x44, 0x13, 0x1d, 0xf9, 0x0a, 0xd2, 0x4d, 0x5d, 0x37, 0x28, 0xfc, 0xdf, 0xcf, 0xad,
0xac, 0x7c, 0x03, 0x01, 0x1d, 0x36, 0xf5, 0x73, 0x3f, 0xe1, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x49,
0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE sim_settings_xpm[1] = {{ png, sizeof( png ), "sim_settings_xpm" }};
//EOF

View File

@ -0,0 +1,23 @@
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x00, 0x5a, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
0x03, 0x3d, 0x30, 0xc3, 0xf0, 0xb5, 0xe8, 0x8c, 0xb1, 0x31, 0xeb, 0x2d, 0x55, 0xd9, 0x65, 0x40,
0xbc, 0x94, 0x1a, 0xf8, 0xb6, 0x8a, 0x6c, 0x2b, 0x56, 0x8b, 0xee, 0x2b, 0x28, 0x70, 0x00, 0x15,
0xfc, 0x04, 0xe2, 0xff, 0x54, 0xc2, 0x07, 0x47, 0x2d, 0x1a, 0xb5, 0x68, 0xd4, 0xa2, 0x51, 0x8b,
0x46, 0x2d, 0x1a, 0xb5, 0x68, 0xd4, 0xa2, 0xdb, 0x2a, 0x2a, 0xec, 0x40, 0xc9, 0x2b, 0xb7, 0x54,
0xe5, 0xae, 0x51, 0x03, 0xdf, 0x54, 0x93, 0x5d, 0x39, 0x42, 0x5a, 0x41, 0xb4, 0xc6, 0x00, 0xc9,
0x67, 0x4f, 0x6a, 0x0a, 0x58, 0xfb, 0xec, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE sim_stop_xpm[1] = {{ png, sizeof( png ), "sim_stop_xpm" }};
//EOF

View File

@ -0,0 +1,44 @@
/* Do not modify this file, it was automatically generated by the
* PNG2cpp CMake script, using a *.png file as input.
*/
#include <bitmaps.h>
static const unsigned char png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0x4a, 0x4c,
0xce, 0x00, 0x00, 0x01, 0xad, 0x49, 0x44, 0x41, 0x54, 0x48, 0xc7, 0x63, 0xf8, 0xff, 0xff, 0x3f,
0x03, 0x3d, 0x30, 0x4d, 0x0d, 0x57, 0x13, 0x2e, 0x94, 0xa6, 0xa9, 0x45, 0x1a, 0x22, 0x45, 0x6a,
0x1a, 0x62, 0x79, 0xbb, 0x35, 0xc4, 0xf2, 0xbf, 0x6b, 0x89, 0xe7, 0x9b, 0xd3, 0xc4, 0x22, 0x35,
0x89, 0x7c, 0x53, 0xa0, 0x05, 0x5f, 0x80, 0xf8, 0xbf, 0xba, 0x58, 0xfe, 0x7b, 0x15, 0x89, 0x5c,
0x51, 0xaa, 0x5b, 0x64, 0x20, 0x50, 0x20, 0x00, 0xb4, 0xe0, 0x32, 0xc8, 0x12, 0x10, 0xd6, 0x14,
0x2d, 0xc8, 0xa6, 0x7a, 0xd0, 0x69, 0x8b, 0x66, 0xf1, 0x00, 0x0d, 0x3f, 0x0e, 0xb5, 0xe4, 0x27,
0x30, 0xe8, 0xea, 0xa9, 0x9e, 0x18, 0x64, 0x64, 0x0a, 0x39, 0x35, 0xc4, 0x0b, 0x0e, 0x40, 0x2d,
0xf9, 0xaa, 0x29, 0x5e, 0xe8, 0x42, 0xf5, 0x54, 0xa7, 0xa2, 0x92, 0xcb, 0xae, 0x21, 0x56, 0xb0,
0x13, 0x6a, 0xc9, 0x27, 0x2d, 0xd1, 0x42, 0x5b, 0xaa, 0x27, 0x6f, 0x63, 0x86, 0x34, 0x56, 0xa0,
0xe1, 0x1b, 0xc1, 0x96, 0x88, 0xe7, 0xbf, 0x53, 0x93, 0x28, 0x34, 0xa3, 0x7a, 0x3e, 0x62, 0x60,
0x08, 0x65, 0xd6, 0x14, 0x2f, 0x58, 0x09, 0xf5, 0xc9, 0x2b, 0x6d, 0xd1, 0x02, 0x03, 0xaa, 0x67,
0x58, 0x20, 0x60, 0x04, 0x1a, 0xbe, 0x10, 0x6a, 0xc9, 0x33, 0x6d, 0x89, 0x5c, 0x2d, 0x9a, 0x94,
0x0c, 0x40, 0xc3, 0x67, 0x40, 0x2d, 0x79, 0xa8, 0x2d, 0x5a, 0xa8, 0x42, 0x93, 0x22, 0x48, 0x5d,
0x34, 0xbf, 0x1f, 0x9c, 0x47, 0xc4, 0xf2, 0xef, 0x68, 0x4a, 0x66, 0xcb, 0x53, 0xad, 0xac, 0xd3,
0x10, 0xcd, 0xcf, 0x01, 0xa6, 0xaa, 0x6e, 0x07, 0x86, 0x06, 0x16, 0x6d, 0x99, 0x42, 0x21, 0xa0,
0x25, 0xb7, 0x80, 0x11, 0x7f, 0x5d, 0x5d, 0x24, 0x47, 0x8a, 0xaa, 0x85, 0x2a, 0x3c, 0xe9, 0x8a,
0xe6, 0xef, 0x03, 0x59, 0x04, 0xf2, 0x85, 0xb2, 0x78, 0x89, 0x18, 0x55, 0x4b, 0x6f, 0x4d, 0x91,
0x02, 0x23, 0xa0, 0x25, 0xcf, 0x61, 0x45, 0x0a, 0x10, 0x1f, 0x03, 0xe5, 0x1b, 0xaa, 0x55, 0x13,
0x6a, 0x52, 0xc5, 0x22, 0xc0, 0x38, 0x98, 0x0e, 0x34, 0xf8, 0x2f, 0x92, 0x25, 0x90, 0xf2, 0x4b,
0x3c, 0x6f, 0x2e, 0x55, 0x2c, 0x02, 0x5a, 0x10, 0x07, 0x34, 0xf0, 0x03, 0xba, 0x05, 0x50, 0xfc,
0x16, 0x58, 0x22, 0xef, 0xa1, 0xd8, 0x22, 0xa0, 0x41, 0xe9, 0x40, 0xfc, 0x0f, 0x87, 0x25, 0x75,
0x54, 0xa9, 0x61, 0x81, 0xa5, 0xaf, 0x04, 0xac, 0x1e, 0xc1, 0xc4, 0x05, 0x0f, 0x40, 0x05, 0x27,
0x55, 0x2c, 0x42, 0xca, 0x84, 0x18, 0x18, 0x98, 0x77, 0x42, 0xa9, 0xd2, 0x66, 0x50, 0x13, 0xce,
0xd1, 0x00, 0x1a, 0xf8, 0x1b, 0xab, 0x45, 0xe2, 0xf9, 0x5b, 0xa8, 0xd6, 0x38, 0x01, 0x26, 0x80,
0xc5, 0x38, 0x7c, 0x73, 0x50, 0x4f, 0xbc, 0x84, 0x9b, 0x6a, 0x16, 0x21, 0xd5, 0x8c, 0x30, 0x7c,
0x0f, 0xe8, 0x93, 0x28, 0x50, 0xe1, 0x49, 0xd5, 0xe6, 0x96, 0x86, 0x68, 0x41, 0x02, 0xa8, 0xd2,
0x02, 0xc6, 0xc5, 0x23, 0x75, 0xf1, 0xbc, 0x7c, 0x6d, 0xed, 0x06, 0xb6, 0x21, 0xd5, 0xae, 0x43,
0xc6, 0x00, 0xc1, 0x11, 0xfb, 0x4d, 0x3d, 0x78, 0x20, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
};
const BITMAP_OPAQUE sim_tune_xpm[1] = {{ png, sizeof( png ), "sim_tune_xpm" }};
//EOF

View File

@ -0,0 +1,874 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
height="26"
width="26"
version="1.1"
id="svg2"
inkscape:version="0.48.4 r9939"
sodipodi:docname="sim_add_signal.svg">
<metadata
id="metadata50">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1000"
id="namedview48"
showgrid="true"
inkscape:zoom="18.980741"
inkscape:cx="10.347211"
inkscape:cy="9.8544862"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-to-guides="false"
inkscape:snap-grids="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3006"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<style
id="style3201"
type="text/css">
.fil0 {fill:#00923F}
</style>
<style
id="style3753"
type="text/css">
@font-face { font-family:&quot;Times New Roman&quot;;src:url(&quot;#FontID0&quot;) format(svg)}
.str1 {stroke:white;stroke-width:0.0762}
.str0 {stroke:#28166F;stroke-width:5.6444}
.fil1 {fill:none}
.fil2 {fill:#28166F}
.fil3 {fill:white}
.fil0 {fill:#28166F;fill-rule:nonzero}
.fnt0 {font-weight:normal;font-size:23.2785;font-family:'Times New Roman'}
</style>
<font
font-weight="400"
style="fill-rule:nonzero"
font-variant="normal"
id="FontID0">
<font-face
id="font-face3377"
font-family="Times New Roman" />
<missing-glyph
id="missing-glyph3379">
<path
id="path3381"
d="M0 0z" />
</missing-glyph>
<glyph
id="glyph3383"
horiz-adv-x="277"
unicode="/">
<path
id="path3385"
d="M280.332 694.332l-239.831 -707.997 -39.0017 0 239.668 707.997 39.1649 0z" />
</glyph>
<glyph
id="glyph3387"
horiz-adv-x="249"
unicode=".">
<path
id="path3389"
d="M124.999 94.6668c15.3317,0 28.1676,-5.16786 38.499,-15.8344 10.5033,-10.499 15.6668,-23.3305 15.6668,-38.3315 0,-15.001 -5.3311,-27.6693 -15.8301,-38.3358 -10.5033,-10.499 -23.3348,-15.8301 -38.3358,-15.8301 -15.001,0 -27.8325,5.3311 -38.3315,15.8301 -10.5033,10.6665 -15.8344,23.3348 -15.8344,38.3358 0,15.3317 5.3311,28.1676 15.8344,38.6666 10.499,10.3314 23.3305,15.4993 38.3315,15.4993z" />
</glyph>
<glyph
id="glyph3391"
horiz-adv-x="332"
unicode="-">
<path
id="path3393"
d="M40.5009 261.168l252.499 0 0 -73.6688 -252.499 0 0 73.6688z" />
</glyph>
<glyph
id="glyph3395"
horiz-adv-x="249"
unicode=",">
<path
id="path3397"
d="M53.6675 -166.501l0 21.5005c33.4987,11.0016 59.5013,28.1676 77.999,51.5025 18.3345,23.3305 27.5018,47.9971 27.5018,73.9996 0,6.16449 -1.50353,11.3323 -4.33447,15.6668 -2.33262,2.83094 -4.66525,4.33018 -6.83463,4.33018 -3.66433,0 -11.4999,-3.33355 -23.4981,-9.83311 -5.83371,-2.83094 -12.0025,-4.33018 -18.5021,-4.33018 -15.9976,0 -28.6659,4.66525 -38.164,14.1633 -9.33479,9.50233 -14.1676,22.5014 -14.1676,39.0017 0,16.0019 6.16449,29.6669 18.3345,40.9992 12.1657,11.4999 27.1667,17.1661 44.6635,17.1661 21.5005,0 40.6684,-9.3305 57.3362,-28.1633 16.831,-18.6696 25.1649,-43.5037 25.1649,-74.3347 0,-33.4987 -11.6674,-64.6691 -34.8347,-93.5026 -23.3305,-28.8292 -60.1671,-51.4982 -110.664,-68.1659z" />
</glyph>
<glyph
id="glyph3399"
horiz-adv-x="564"
unicode="+">
<path
id="path3401"
d="M261.168 68.8318l0 243.667 -243.169 0 0 40.0026 243.169 0 0 242.666 39.1649 0 0 -242.666 244.165 0 0 -40.0026 -244.165 0 0 -243.667 -39.1649 0z" />
</glyph>
<glyph
id="glyph3403"
horiz-adv-x="499"
unicode="*">
<path
id="path3405"
d="M241.167 509.835c-1.3317,22.3296 -5.83371,44.6635 -13.665,66.8299 -11.0016,31.8362 -16.5002,53.8351 -16.5002,65.8333 0,17.0028 3.9994,29.8344 11.8307,38.6666 8.00309,8.83648 17.8362,13.1667 29.6669,13.1667 10.0006,0 18.8328,-4.33018 26.3333,-13.1667 7.50048,-8.83218 11.1691,-21.333 11.1691,-37.6657 0,-14.6659 -4.33447,-34.998 -12.8359,-61.168 -8.66465,-26.3333 -14,-50.4972 -15.9976,-72.4961 17.9994,11.3323 33.997,25.1649 48.3322,41.4975 22.1664,25.6675 38.6666,41.6694 49.3331,47.8338 10.834,6.16878 21.6681,9.16726 32.8329,9.16726 10.6665,0 19.6662,-3.66862 26.9992,-11.0016 7.33295,-7.16541 11.0016,-15.9976 11.0016,-25.9982 0,-12.1657 -5.3354,-22.8322 -16.1651,-32.3346 -10.6665,-9.33479 -37.5024,-18.8328 -80.5035,-28.3309 -24.9973,-5.50293 -45.832,-11.835 -62.4997,-19.0004 17.0028,-8.83648 37.67,-15.5036 62.0014,-20.0013 39.3324,-7.16541 65.1674,-16.1651 77.3332,-26.8316 12.3333,-10.834 18.3345,-22.5014 18.3345,-35.1698 0,-9.83311 -3.66862,-18.167 -11.0016,-25.3324 -7.33295,-7.16541 -15.8344,-10.834 -25.4999,-10.834 -9.83311,0 -20.6671,3.50108 -32.4978,10.3357 -11.835,6.83034 -28.0001,22.1664 -48.1689,45.832 -13.3342,16.0019 -29.8344,30.9986 -49.8314,44.9986 0.66585,-18.6653 4.49771,-38.8341 11.3323,-60.6654 11.6674,-38.3315 17.5011,-64.5016 17.5011,-78.5016 0,-12.9991 -3.83616,-23.9964 -11.6674,-33.0004 -7.83556,-8.99972 -16.1694,-13.4974 -24.8341,-13.4974 -12.1657,0 -22.9998,4.83279 -32.8329,14.1676 -6.83463,6.83034 -10.1682,17.8319 -10.1682,32.8329 0,15.4993 3.66862,34.3321 11.1691,56.3309 7.50048,22.0031 12.1657,37.1673 14.1633,45.3337 2.00185,8.33387 3.83616,20.6671 5.3354,36.9998 -19.1679,-12.8316 -35.9989,-26.8316 -50.1665,-42.4984 -23.8332,-26.6684 -41.6651,-43.6669 -53.8351,-50.8323 -8.49711,-5.16786 -17.1661,-7.83556 -26.3333,-7.83556 -10.9973,0 -20.4996,3.83616 -28.3309,11.3323 -7.83556,7.50048 -11.6674,15.6668 -11.6674,24.8341 0,8.16633 3.33355,16.6677 10.0006,25.6675 6.6671,8.99972 16.6677,16.3327 29.9976,22.1664 8.83648,3.9994 28.8335,9.16726 59.9996,15.6668 20.1688,4.16694 40.0026,10.3357 59.1705,18.5021 -17.6687,8.83218 -38.6666,15.6668 -63.0023,20.4996 -39.9983,8.49711 -64.8324,16.1651 -74.1671,22.9998 -14.6659,10.6665 -21.9988,23.8332 -21.9988,38.9974 0,8.83648 3.66433,16.8353 11.0016,24.1682 7.33295,7.33295 15.8301,11.0016 25.6632,11.0016 10.6665,0 22.0031,-3.33355 34.1689,-10.1682 11.9982,-6.83463 26.9992,-20.6671 44.8311,-41.3343 18.0037,-20.6671 36.1664,-36.6647 54.6685,-47.9971z" />
</glyph>
<glyph
id="glyph3407"
horiz-adv-x="332"
unicode=")">
<path
id="path3409"
d="M22.5014 673.832l0 20.4996c49.5006,-24.3315 90.6674,-53.1649 123.5,-86.5004 46.4978,-47.4988 82.4967,-103.164 107.833,-167.163 25.4999,-64.0033 38.164,-130.67 38.164,-200 0,-100.836 -24.8341,-192.835 -74.4979,-276.001 -49.6681,-83.1669 -114.668,-142.668 -195,-178.499l0 17.9994c39.9983,22.5014 72.9987,52.8342 98.8337,91.1657 25.8307,38.1683 45.1661,86.8355 57.6669,146.002 12.4965,58.9986 18.8328,120.665 18.8328,184.664 0,69.3344 -5.50293,132.667 -16.1694,190.004 -8.16633,44.9986 -18.3302,80.83 -30.5002,107.997 -12.3333,27.0035 -28.4984,53.0017 -48.6672,78.0033 -20.1645,25.1649 -46.8329,48.998 -79.9966,71.8302z" />
</glyph>
<glyph
id="glyph3411"
horiz-adv-x="332"
unicode="(">
<path
id="path3413"
d="M310.501 -195.833l0 -17.9994c-49.1698,24.6665 -90.169,53.6675 -123.002,86.8312 -46.8329,47.168 -82.9993,102.833 -108.332,167 -25.4999,64.1665 -38.1683,130.67 -38.1683,199.669 0,100.999 25.0016,192.998 74.6655,276.165 49.8357,83.1669 114.836,142.668 194.836,178.499l0 -20.4996c-40.0026,-22.1664 -72.8354,-52.3316 -98.6662,-90.8306 -25.6675,-38.3358 -44.8354,-87.003 -57.5037,-146.002 -12.664,-58.8311 -18.9961,-120.502 -18.9961,-184.501 0,-69.6651 5.3311,-132.998 15.9976,-189.999 8.50141,-44.9986 18.8328,-81.0018 30.8353,-108.168 11.9982,-27.1667 28.1633,-53.3325 48.4997,-78.3298 20.3321,-25.1691 47.0005,-49.0023 79.8333,-71.8345z" />
</glyph>
<glyph
id="glyph3415"
horiz-adv-x="180"
unicode="'">
<path
id="path3417"
d="M77.1656 392.169l-26.3333 144.498c-7.50048,39.9983 -11.3323,67.0017 -11.3323,81.0018 0,20.8304 4.33447,35.9989 12.6683,45.4969 8.49711,9.33479 20.1645,14 34.6629,14 14.6702,0 26.8359,-4.66525 36.5015,-14.3308 9.50233,-9.66987 14.3351,-22.1664 14.3351,-37.8332 0,-12.0025 -4.16694,-41.6694 -12.6683,-88.833l-26.3333 -144 -21.5005 0z" />
</glyph>
<glyph
id="glyph3419"
horiz-adv-x="777"
unicode="&amp;">
<path
id="path3421"
d="M510.334 426.333l205 0 0 -18.167c-28.3352,-2.16509 -49.1655,-8.50141 -62.6673,-18.8328 -13.665,-10.1682 -34.6672,-41.1667 -63.3331,-93 -28.6659,-51.6657 -60.833,-100.002 -96.6686,-145.001 29.001,-33.8338 54.836,-57.4994 77.6682,-71.0011 22.8322,-13.4974 45.6688,-20.3321 68.8318,-20.3321 22.5014,0 41.5018,6.16878 57.1686,18.3345 15.4993,12.1657 26.6684,30.1652 33.1679,53.9983l17.9994 -13.1667c-12.0025,-45.9995 -31.3336,-79.8333 -58.002,-101.665 -26.6641,-21.6681 -57.8302,-32.6696 -93.3308,-32.6696 -26.6684,0 -53.8351,7.33724 -81.3369,21.8356 -27.4975,14.3308 -57.4994,38.8341 -89.9972,73.3338 -40.3334,-35.6681 -76.8348,-60.5022 -109.169,-74.3347 -32.3303,-13.8325 -66.9974,-20.8347 -103.83,-20.8347 -53.6675,0 -96.3335,14.3351 -127.835,43.0011 -31.6687,28.6659 -47.3355,62.8348 -47.3355,102.502 0,39.5 14.1676,78.6649 42.5027,117.997 28.3309,39.1692 81.5001,79.8333 159.667,121.833 -15.336,33.8338 -25.835,61.5031 -31.3336,83.1669 -5.49864,21.6681 -8.33387,42.5027 -8.33387,62.3322 0,55.6694 20.4996,98.1678 61.4988,127.336 31.9995,22.8322 68.3334,34.1646 109.002,34.1646 38.6666,0 70.331,-11.3323 94.6668,-34.3321 24.499,-22.9998 36.6647,-51.1674 36.6647,-84.6661 0,-34.4996 -11.8307,-64.8324 -35.5006,-90.8349 -23.4981,-26.1658 -65.3307,-54.5009 -125.167,-85.4995 41.3343,-73.5013 84.5029,-141.001 129.334,-202.165 57.3362,68.3334 86.0021,126 86.0021,172.833 0,14.9967 -4.83279,28.3309 -14.6659,39.9983 -7.16971,8.83218 -17.3336,14 -30.6678,15.6668l0 18.167zm-186.666 -12.8316c40.5009,19.3311 70.6661,41.1667 90.6674,65.4982 19.997,24.499 29.9976,51.6657 29.9976,81.5001 0,23.4981 -7.16541,42.8335 -21.6681,58.1653 -14.4984,15.336 -32.4978,22.9998 -53.9983,22.9998 -28.3352,0 -49.6681,-9.83311 -64.1665,-29.6669 -14.4984,-19.6662 -21.8313,-38.9974 -21.8313,-57.8302 0,-16.0019 2.83094,-33.6663 8.32957,-53.5 5.50293,-19.6662 16.5002,-48.6672 32.6696,-87.1663zm75.6664 -305.17c-42.8335,58.6679 -72.6679,101.501 -89.3357,128.501 -16.5002,26.9992 -34.8304,60.5022 -54.6642,100.5 -39.0017,-22.3339 -68.3334,-47.168 -88.1672,-74.1671 -19.6662,-26.9992 -29.4993,-56.3309 -29.4993,-87.8321 0,-34.8347 11.3323,-65.4982 33.6663,-91.8315 22.4972,-26.3333 52.8342,-39.5 90.8306,-39.5 20.5039,0 40.3334,3.9994 59.3337,12.1657 19.0004,8.16633 45.0029,25.4999 77.8358,52.164z" />
</glyph>
<glyph
id="glyph3423"
horiz-adv-x="833"
unicode="%">
<path
id="path3425"
d="M679.666 677.166l-482.333 -704.5 -43.4994 0 482.333 704.5 43.4994 0zm-502 0c44.002,0 78.1665,-18.167 102.335,-54.6642 24.3315,-36.334 36.334,-78.1665 36.334,-125.502 0,-56.4985 -13.6693,-100.333 -41.0035,-131.331 -27.3299,-30.8353 -60.1628,-46.3346 -98.4986,-46.3346 -25.8307,0 -49.3331,7.00217 -70.8336,21.1655 -21.5005,14.1676 -38.6666,35.333 -51.4982,63.3331 -12.8359,28.0001 -19.3354,59.0029 -19.3354,93.1675 0,34.3321 6.49956,65.6657 19.503,94.4992 12.9991,28.8335 30.831,50.334 53.5,64.5016 22.6647,14.1676 45.832,21.1655 69.4976,21.1655zm-1.3317 -27.3342c-16.6677,0 -31.3336,-9.66557 -44.3328,-29.1643 -12.8359,-19.6662 -19.1679,-60.6654 -19.1679,-123.165 0,-45.1704 3.50108,-79.6701 10.6665,-103.503 5.49864,-17.8319 14.1676,-31.6644 25.835,-41.4975 6.99787,-5.83371 15.3317,-8.66894 25.4999,-8.66894 15.6668,0 28.9967,8.33387 39.9983,25.3324 16.3327,25.0016 24.499,66.8342 24.499,125.502 0,61.8339 -7.9988,105.333 -24.0007,130.335 -10.3314,16.6634 -23.4981,24.8298 -38.9974,24.8298zm480.834 -321.163c23.163,0 46.1628,-7.33295 69.1668,-22.0031 22.9998,-14.6659 40.6641,-35.9989 53.1649,-63.999 12.5008,-28.0001 18.8328,-58.6679 18.8328,-92.3341 0,-57.4994 -13.8325,-101.665 -41.5018,-131.997 -27.665,-30.5002 -60.3303,-45.6688 -98.1635,-45.6688 -23.6699,0 -46.8329,7.33295 -68.9993,21.9988 -22.3339,14.6702 -40.0026,35.5006 -52.8342,62.6673 -12.8359,27.1667 -19.3354,58.1696 -19.3354,93 0,34.1689 6.49956,65.5025 19.3354,93.8334 12.8316,28.3352 30.5002,49.5006 52.8342,63.5007 22.1664,14 44.8311,21.0022 67.5001,21.0022zm0.498314 -26.0025c-15.4993,0 -29.1685,-8.66465 -40.5009,-26.3333 -14.6659,-22.8322 -21.9988,-65.8333 -21.9988,-129.334 0,-58.3328 7.50048,-98.9969 22.5014,-122.164 10.9973,-16.5002 24.499,-24.8341 39.9983,-24.8341 15.001,0 28.3352,8.99972 40.1658,26.8316 15.4993,23.8332 23.3348,64.6691 23.3348,122.504 0,61.3313 -7.83556,104.165 -23.3348,128.496 -10.834,16.6677 -24.1682,24.8341 -40.1658,24.8341z" />
</glyph>
<glyph
id="glyph3427"
horiz-adv-x="499"
unicode="$">
<path
id="path3429"
d="M52.6666 163.168l21.5005 0c3.66433,-44.6678 17.6644,-78.8324 42.0001,-102.67 24.499,-23.6656 61.0005,-37.8332 109.5,-42.4984l0 285.169c-73.3338,45.3337 -122.169,85.332 -146.5,120.167 -17.3336,24.6665 -26.0025,54.8317 -26.0025,90.3323 0,39.9983 15.001,75.0005 44.6678,104.998 29.8344,30.0019 72.3328,48.0014 127.835,54.1702l0 44.9986 31.1661 0 0 -44.9986c26.6684,-1.66677 49.1655,-4.66954 67.3325,-9.33479 9.50233,-2.16938 40.6684,-13.5017 93.8334,-33.6663l0 -146.002 -19.0004 0c-4.33447,51.8332 -17.6644,89.6664 -40.3334,113.5 -22.6647,24.0007 -56.4985,38.1683 -101.832,42.8335l0 -247.997c81.9984,-57.3362 134.665,-99.6671 158,-126.834 23.1673,-27.1667 34.8347,-60.833 34.8347,-101.334 0,-44.8354 -17.0028,-84.3353 -50.9998,-118.667 -34.0013,-34.1689 -81.3369,-53.8351 -141.835,-58.9986l0 -62.4997 -31.1661 0 0 62.4997c-30.6678,1.3317 -59.1662,4.83279 -85.4995,10.499 -26.3333,5.66617 -55.5019,15.001 -87.5013,28.0001l0 138.334zm173.001 249.501l0 226.999c-32.6653,-3.9994 -56.8336,-14.3351 -72.6679,-31.0029 -15.6668,-16.831 -23.6656,-37.8332 -23.6656,-63.3331 0,-23.6656 7.16541,-45.832 21.5005,-66.4991 14.3308,-20.6671 39.3324,-42.8335 74.833,-66.1641zm31.1661 -394.669c24.499,4.33447 43.1643,10.3357 56.1677,18.167 18.167,11.3323 32.6653,26.3333 43.1643,44.6678 10.6665,18.3345 15.8344,38.0007 15.8344,58.8311 0,21.5005 -6.33202,41.8326 -19.1679,61.0005 -12.8316,19.1679 -44.8311,46.3346 -95.9985,81.5001l0 -264.167z" />
</glyph>
<glyph
id="glyph3431"
horiz-adv-x="499"
unicode="#">
<path
id="path3433"
d="M56.1677 -13.665l45.3337 222.166 -83.5019 0 0 39.9983 91.3332 0 33.6663 167.502 -124.999 0 0 38.9974 134.334 0 44.5003 222.166 40.5009 0 -44.5003 -222.166 164.667 0 47.3312 222.166 40.5009 0 -46.3346 -222.166 82.9993 0 0 -38.9974 -90.3323 0 -34.1646 -167.502 124.497 0 0 -39.9983 -132.831 0 -45.5012 -222.166 -39.5 0 44.5003 222.166 -165.668 0 -46.3303 -222.166 -40.5009 0zm94.1641 262.165l165.668 0 35.0023 167.502 -166.501 0 -34.1689 -167.502z" />
</glyph>
<glyph
id="glyph3435"
horiz-adv-x="408"
unicode="&quot;">
<path
id="path3437"
d="M281.333 392.169l-26.5008 142.496 -10.6665 59.1662c-0.66585,8.00309 -0.996628,16.1694 -0.996628,24.3358 0,20.4996 4.49771,35.5006 13.665,44.9986 9.16726,9.33479 21.1655,14 36.1664,14 14,0 25.6675,-4.66525 34.8347,-14 9.3305,-9.49803 14,-22.1664 14,-38.164 0,-27.6693 -3.16601,-57.6669 -9.33479,-89.834l-27.8325 -142.999 -23.3348 0zm-178.835 0l-26.8316 144.498c-7.16541,39.6675 -10.6665,66.6667 -10.6665,81.0018 0,20.8304 4.33447,35.9989 12.8316,45.4969 8.66894,9.33479 20.3364,14 35.0023,14 14.3308,0 26.1658,-4.66525 35.6681,-14.3308 9.3305,-9.66987 14.1633,-22.3339 14.1633,-38.3358 0,-12.664 -4.33018,-42.1677 -12.8316,-88.3304l-26.3333 -144 -21.0022 0z" />
</glyph>
<glyph
id="glyph3439"
horiz-adv-x="332"
unicode="!">
<path
id="path3441"
d="M175.832 175.333l-18.6653 0 -42.8335 395.498c-1.99755,17.1704 -2.99847,30.0019 -2.99847,38.5033 0,20.4996 5.49864,36.9998 16.3327,49.3331 11.0016,12.3333 24.0007,18.4978 39.3324,18.4978 15.3317,0 28.1676,-6.16449 38.8341,-18.4978 10.499,-12.3333 15.8344,-30.6678 15.8344,-55.1668 0,-7.83556 -0.670146,-18.6696 -2.00185,-32.6696l-43.8344 -395.498zm-9.83311 -81.165c15.001,0 27.8325,-5.16786 38.3358,-15.8344 10.6665,-10.499 15.8301,-23.1673 15.8301,-37.8332 0,-15.001 -5.16356,-27.6693 -15.8301,-38.3358 -10.5033,-10.499 -23.3348,-15.8301 -38.3358,-15.8301 -14.9967,0 -27.665,5.3311 -38.3315,15.8301 -10.499,10.6665 -15.8344,23.3348 -15.8344,38.3358 0,14.6659 5.3354,27.3342 15.8344,37.8332 10.6665,10.6665 23.3348,15.8344 38.3315,15.8344z" />
</glyph>
<glyph
id="glyph3443"
horiz-adv-x="249"
unicode=" " />
<glyph
id="glyph3445"
horiz-adv-x="443"
unicode="?">
<path
id="path3447"
d="M221.668 156.333l-20.0013 0c2.33262,40.9992 7.33295,74.833 15.3317,101.669 8.00309,26.8316 24.5033,64.3297 49.6681,112.164 19.4987,36.669 32.167,64.9999 38.0007,84.6661 5.83371,19.6662 8.83218,39.6675 8.83218,59.8363 0,41.33 -11.0016,74.1671 -33.0004,98.6662 -21.9988,24.3315 -48.8305,36.4972 -80.8342,36.4972 -28.3309,0 -50.4972,-6.6628 -66.8299,-19.997 -16.337,-13.3342 -24.5033,-27.8325 -24.5033,-43.3361 0,-12.1657 5.00032,-26.9992 14.6702,-44.5003 9.83311,-17.6644 14.6659,-30.9986 14.6659,-39.9983 0,-11.835 -3.66862,-21.6681 -11.1691,-29.6669 -7.50048,-7.83126 -16.6634,-11.835 -27.3299,-11.835 -13.6693,0 -26.1701,6.6671 -37.3349,20.1688 -11.3323,13.5017 -16.8353,32.3346 -16.8353,56.4985 0,36.669 15.6668,69.3344 47.3355,97.6695 31.5012,28.3309 74.3304,42.3309 128.333,42.3309 67.165,0 116.335,-19.4987 147.999,-58.5003 23.5024,-28.6659 35.1655,-60.3303 35.1655,-95.1651 0,-23.8332 -5.3311,-48.1689 -15.8301,-73.3338 -10.6665,-25.0016 -30.6678,-54.5009 -60.3346,-88.3347 -47.168,-53.3325 -76.169,-91.1657 -86.668,-113.5 -10.6665,-22.3339 -16.9985,-52.9974 -19.3311,-91.9991zm-6.83463 -60.6654c15.3317,0 28.3352,-5.3354 38.8341,-15.8344 10.499,-10.499 15.8344,-23.4981 15.8344,-38.8341 0,-15.001 -5.3354,-27.665 -16.0019,-38.3315 -10.834,-10.499 -23.6656,-15.8344 -38.6666,-15.8344 -15.001,0 -27.665,5.3354 -38.3315,15.8344 -10.5033,10.6665 -15.8344,23.3305 -15.8344,38.3315 0,15.336 5.3311,28.3352 15.8344,38.8341 10.6665,10.499 23.3305,15.8344 38.3315,15.8344z" />
</glyph>
<glyph
id="glyph3449"
horiz-adv-x="564"
unicode="&gt;">
<path
id="path3451"
d="M543.502 318.835l-525.502 -227.502 0 42.0001 452.667 196.331 -452.667 198.17 0 44.5003 525.502 -229.504 0 -23.9964z" />
</glyph>
<glyph
id="glyph3453"
horiz-adv-x="564"
unicode="=">
<path
id="path3455"
d="M17.9994 431.166l527.001 0 0 -39.9983 -527.001 0 0 39.9983zm0 -159.164l527.001 0 0 -40.0026 -527.001 0 0 40.0026z" />
</glyph>
<glyph
id="glyph3457"
horiz-adv-x="564"
unicode="&lt;">
<path
id="path3459"
d="M17.9994 344.666l525.502 227.669 0 -42.5027 -452.168 -196.331 452.168 -198.166 0 -44.002 -525.502 229.499 0 23.8332z" />
</glyph>
<glyph
id="glyph3461"
horiz-adv-x="277"
unicode=";">
<path
id="path3463"
d="M137.668 461.499c15.001,0 27.8325,-5.3311 38.3315,-15.6668 10.6665,-10.499 15.8344,-23.1673 15.8344,-38.164 0,-15.001 -5.16786,-27.6693 -15.8344,-38.3358 -10.499,-10.499 -23.3305,-15.8344 -38.3315,-15.8344 -15.001,0 -27.6693,5.3354 -38.3358,15.8344 -10.499,10.6665 -15.8301,23.3348 -15.8301,38.3358 0,14.9967 5.3311,27.665 15.8301,38.164 10.6665,10.3357 23.3348,15.6668 38.3358,15.6668zm-68.3334 -628l0 21.5005c33.4987,11.0016 59.497,28.1676 77.8315,51.5025 18.5021,23.3305 27.6693,47.9971 27.6693,73.9996 0,6.16449 -1.50353,11.3323 -4.50201,15.6668 -2.16509,2.83094 -4.49771,4.33018 -6.83463,4.33018 -3.49679,0 -11.3323,-3.33355 -23.3305,-9.83311 -5.83371,-2.83094 -12.0025,-4.33018 -18.5021,-4.33018 -15.9976,0 -28.6659,4.66525 -38.164,14.1633 -9.50233,9.50233 -14.1676,22.5014 -14.1676,39.0017 0,16.0019 6.16449,29.6669 18.3302,40.9992 12.17,11.4999 27.0035,17.1661 44.6678,17.1661 21.5005,0 40.6684,-9.3305 57.3362,-28.1633 16.831,-18.6696 25.1649,-43.5037 25.1649,-74.3347 0,-33.4987 -11.6674,-64.6691 -34.8347,-93.5026 -23.3305,-28.8292 -60.1671,-51.4982 -110.664,-68.1659z" />
</glyph>
<glyph
id="glyph3465"
horiz-adv-x="277"
unicode=":">
<path
id="path3467"
d="M141.165 461c15.001,0 27.6693,-5.3354 38.3358,-16.0019 10.499,-10.499 15.8344,-23.3305 15.8344,-38.3315 0,-14.8334 -5.3354,-27.665 -15.8344,-38.3358 -10.6665,-10.499 -23.3348,-15.8301 -38.3358,-15.8301 -14.9967,0 -27.8325,5.3311 -38.3315,15.8301 -10.6665,10.6708 -16.0019,23.5024 -16.0019,38.3358 0,15.001 5.3354,27.8325 16.0019,38.3315 10.499,10.6665 23.3348,16.0019 38.3315,16.0019zm-0.996628 -365.835c15.3317,0 28.1633,-5.3311 38.8341,-15.9976 10.499,-10.834 15.8301,-23.6656 15.8301,-38.6666 0,-15.001 -5.3311,-27.6693 -16.1651,-38.3358 -10.6665,-10.499 -23.5024,-15.8301 -38.499,-15.8301 -15.001,0 -27.8325,5.3311 -38.3358,15.8301 -10.6665,10.6665 -15.8301,23.3348 -15.8301,38.3358 0,15.001 5.16356,27.8325 15.8301,38.6666 10.5033,10.6665 23.3348,15.9976 38.3358,15.9976z" />
</glyph>
<glyph
id="glyph3469"
horiz-adv-x="499"
unicode="9">
<path
id="path3471"
d="M52.6666 -13.665l0 17.9994c42.3352,0.66585 81.8352,10.499 118.165,29.6669 36.5015,19.0004 71.8345,52.3316 105.836,99.8303 34.0013,47.5031 57.6669,99.6671 71.0011,156.668 -51.1674,-32.8329 -97.3345,-49.3331 -138.669,-49.3331 -46.4978,0 -86.5004,17.9994 -119.668,53.9983 -33.1636,36.0032 -49.8314,83.6695 -49.8314,143.334 0,58.002 16.6677,109.5 49.8314,154.834 40.0026,54.9992 92.3341,82.501 156.836,82.501 54.3334,0 100.831,-22.5014 139.498,-67.5001 47.6663,-55.6651 71.3362,-124.334 71.3362,-206.001 0,-73.5013 -17.9994,-142.166 -54.1659,-205.834 -36.1707,-63.6639 -86.5004,-116.498 -150.834,-158.331 -52.4991,-34.6672 -109.5,-51.8332 -171.502,-51.8332l-27.8325 0zm302.833 340.331c5.83371,42.3352 8.83218,76.169 8.83218,101.501 0,31.6644 -5.49864,65.6657 -16.1651,102.33 -10.834,36.669 -25.9982,64.6691 -45.6688,84.1678 -19.6662,19.6662 -42.0001,29.3361 -67.165,29.3361 -29.001,0 -54.3334,-13.0034 -76.1647,-39.0017 -21.8356,-25.9982 -32.6696,-64.8324 -32.6696,-116.167 0,-68.6685 14.5027,-122.499 43.4994,-161.166 21.0022,-28.0001 47.168,-42.0001 78.0033,-42.0001 14.9967,0 32.8329,3.50108 53.3325,10.6665 20.4996,7.16541 38.499,17.3336 54.1659,30.3327z" />
</glyph>
<glyph
id="glyph3473"
horiz-adv-x="499"
unicode="8">
<path
id="path3475"
d="M191.834 333.501c-52.3316,43.0011 -86.1653,77.5007 -101.334,103.499 -15.001,25.9982 -22.6647,53.0017 -22.6647,81.0018 0,42.9968 16.6634,79.9966 49.8314,111.167 33.1679,30.9986 77.3332,46.6654 132.332,46.6654 53.3325,0 96.3335,-14.5027 128.836,-43.4994 32.6653,-29.001 48.8305,-62.0014 48.8305,-99.1688 0,-24.6665 -8.66465,-49.9989 -26.3333,-75.6664 -17.4968,-25.6675 -54.1659,-56.0002 -109.831,-90.8349 57.3319,-44.1652 95.1651,-78.9999 113.835,-104.5 24.6665,-33.1636 36.9998,-68.1659 36.9998,-104.998 0,-46.4978 -17.6687,-86.3329 -53.1692,-119.333 -35.5006,-33.0004 -81.9984,-49.5006 -139.665,-49.5006 -62.8348,0 -111.833,19.6662 -147.003,58.9986 -28.0001,31.6687 -42.0001,66.1684 -42.0001,103.503 0,29.3318 9.8374,58.3328 29.6669,87.1663 19.6705,28.8335 53.5,60.6654 101.669,95.5001zm76.6673 52.164c39.1649,35.1698 63.8314,63.0023 74.3304,83.3344 10.3357,20.3321 15.5036,43.3361 15.5036,69.1668 0,34.1689 -9.50233,60.833 -28.6702,80.1684 -19.3311,19.4987 -45.4969,29.1643 -78.6649,29.1643 -33.1679,0 -60.1671,-9.66557 -81.0018,-28.8335 -20.8304,-19.1636 -31.3293,-41.6651 -31.3293,-67.3325 0,-16.9985 4.33018,-33.8338 12.9991,-50.8323 8.49711,-16.9985 20.8304,-33.0004 36.8323,-48.3322l80.0009 -66.5034zm-53.6675 -70.6661c-26.9992,-22.8322 -47.0005,-47.6663 -59.9996,-74.4979 -12.9991,-26.8359 -19.4987,-56.0002 -19.4987,-87.1663 0,-42.0001 11.3323,-75.6664 34.3321,-100.836 22.9998,-25.1649 52.164,-37.8332 87.6646,-37.8332 35.1698,0 63.3331,9.83311 84.5029,29.8344 21.1655,19.8338 31.6644,43.8344 31.6644,72.1653 0,23.5024 -6.16449,44.5003 -18.4978,63.0023 -23.1673,34.4996 -69.8327,79.6658 -140.168,135.331z" />
</glyph>
<glyph
id="glyph3477"
horiz-adv-x="499"
unicode="7">
<path
id="path3479"
d="M100.668 662.165l354.834 0 0 -18.6653 -220.667 -657.164 -54.6685 0 197.835 596.164 -182.168 0c-36.8323,0 -62.998,-4.33018 -78.6649,-13.1667 -27.3342,-15.001 -49.3331,-38.0007 -65.8333,-69.3344l-14.1676 5.3354 63.5007 156.831z" />
</glyph>
<glyph
id="glyph3481"
horiz-adv-x="499"
unicode="6">
<path
id="path3483"
d="M448.165 675.834l0 -18.167c-42.8292,-4.16694 -77.999,-12.6683 -105.166,-25.6675 -27.1667,-12.8316 -53.9983,-32.3346 -80.4992,-58.8311 -26.5008,-26.3333 -48.4997,-55.6694 -66.0008,-87.9997 -17.3336,-32.5021 -31.9995,-71.0011 -43.6669,-115.501 46.8329,32.167 93.8334,48.3322 141.169,48.3322 45.1661,0 84.4986,-18.3345 117.667,-54.6642 33.1679,-36.5015 49.8314,-83.3344 49.8314,-140.671 0,-55.33 -16.831,-105.832 -50.334,-151.333 -40.3334,-55.33 -93.8334,-82.9993 -160.165,-82.9993 -45.3337,0 -83.6652,15.001 -115.334,44.8354 -61.8339,58.3328 -92.6649,133.832 -92.6649,226.664 0,59.1662 11.8307,115.501 35.6638,168.834 23.6699,53.5 57.6669,100.836 101.836,142.166 43.9977,41.3343 86.3329,69.1668 126.666,83.5019 40.3334,14.3351 77.999,21.5005 112.834,21.5005l28.1633 0zm-303.666 -341.835c-5.82941,-43.9977 -8.83218,-79.4982 -8.83218,-106.497 0,-31.1704 5.83371,-65.1674 17.3336,-101.836 11.6674,-36.4972 28.8335,-65.6657 51.6657,-87.1663 16.5002,-15.1642 36.669,-22.8322 60.5022,-22.8322 28.3309,0 53.6675,13.3342 75.8339,39.9983 22.3339,26.6684 33.4987,64.8367 33.4987,114.333 0,55.6694 -11.0016,103.834 -33.1679,144.502 -22.1664,40.6641 -53.5,61.0005 -94.3317,61.0005 -12.3333,0 -25.4999,-2.6677 -39.6675,-7.83556 -14.1676,-5.16356 -35.1655,-16.5002 -62.8348,-33.6663z" />
</glyph>
<glyph
id="glyph3485"
horiz-adv-x="499"
unicode="5">
<path
id="path3487"
d="M434.165 662.165l-38.164 -82.9993 -199.167 0 -43.4994 -89.0006c86.3329,-12.664 154.666,-44.6635 205,-96.166 43.3318,-44.1652 64.9999,-96.3335 64.9999,-156.166 0,-34.8347 -7.00217,-67.165 -21.1697,-96.6686 -14.1633,-29.6626 -31.9995,-54.8317 -53.5,-75.6664 -21.5005,-20.8304 -45.4969,-37.6657 -71.8302,-50.3297 -37.3349,-18.0037 -75.8339,-26.8359 -115.166,-26.8359 -39.835,0 -68.6685,6.6671 -86.668,20.1688 -18.167,13.4974 -27.1667,28.4984 -27.1667,44.6635 0,9.16726 3.83186,17.1704 11.1648,24.1682 7.50048,7.00217 17.0028,10.499 28.3352,10.499 8.50141,0 15.9976,-1.16416 22.3339,-3.83186 6.33202,-2.6677 17.1661,-9.33479 32.4978,-20.0013 24.3358,-16.9985 49.0023,-25.4999 74.1671,-25.4999 38.0007,0 71.4995,14.5027 100.333,43.3361 28.8335,28.8335 43.1686,63.8314 43.1686,105.166 0,39.9983 -12.8359,77.3332 -38.499,112 -25.835,34.6672 -61.168,61.4988 -106.502,80.3316 -35.5006,14.6659 -83.8327,23.1673 -145.001,25.4999l127.001 257.332 237.331 0z" />
</glyph>
<glyph
id="glyph3489"
horiz-adv-x="499"
unicode="4">
<path
id="path3491"
d="M465.335 244.165l0 -69.3301 -88.833 0 0 -174.835 -80.6667 0 0 174.835 -280.168 0 0 62.4997 307.168 438.499 53.6675 0 0 -431.669 88.833 0zm-169.5 0l0 328.668 -232.335 -328.668 232.335 0z" />
</glyph>
<glyph
id="glyph3493"
horiz-adv-x="499"
unicode="3">
<path
id="path3495"
d="M50.8323 536.169c18.8328,44.496 42.666,78.9999 71.4995,103.164 28.8335,24.3358 64.6691,36.5015 107.67,36.5015 52.9974,0 93.6658,-17.3336 121.997,-51.8332 21.5005,-25.6675 32.3346,-53.1692 32.3346,-82.501 0,-48.1646 -30.3327,-98.0003 -90.8349,-149.331 40.6684,-16.0019 71.3362,-38.8341 92.1666,-68.501 20.8347,-29.4993 31.3336,-64.334 31.3336,-104.5 0,-57.1686 -18.167,-106.832 -54.6642,-148.833 -47.5031,-54.6685 -116.335,-82.0027 -206.5,-82.0027 -44.6678,0 -75.0005,5.49864 -91.17,16.5002 -15.9976,11.1691 -24.1639,22.9998 -24.1639,35.6681 0,9.49803 3.83186,17.8319 11.4999,24.9973 7.66802,7.16971 16.831,10.6665 27.665,10.6665 7.9988,0 16.3327,-1.3317 24.8341,-3.83186 5.49864,-1.66677 17.9994,-7.66802 37.6657,-17.8319 19.503,-10.3357 33.0004,-16.3327 40.5009,-18.3345 11.9982,-3.66433 24.8341,-5.3311 38.499,-5.3311 33.1679,0 62.169,12.8316 86.668,38.499 24.6665,25.6675 36.8323,56.1677 36.8323,91.3332 0,25.6675 -5.66617,50.8323 -16.9985,75.1638 -8.50141,18.167 -17.8319,32.0038 -27.8325,41.5018 -14,12.9991 -33.1679,24.8341 -57.6669,35.333 -24.3358,10.6665 -49.3331,16.0019 -74.6698,16.0019l-15.6625 0 0 14.6659c25.6632,3.16601 51.4982,12.5008 77.3332,27.8325 25.9982,15.1685 44.8311,33.6663 56.4985,55.1668 11.6674,21.5005 17.5011,44.9986 17.5011,70.6661 0,33.6663 -10.5033,60.6654 -31.5012,81.3326 -21.0022,20.6671 -47.0005,31.0029 -78.3341,31.0029 -50.5015,0 -92.5017,-27.0035 -126.499,-81.0018l-16.0019 7.83556z" />
</glyph>
<glyph
id="glyph3497"
horiz-adv-x="499"
unicode="2">
<path
id="path3499"
d="M458.5 127.5l-46.3346 -127.5 -390.665 0 0 17.9994c114.831,104.835 195.833,190.502 242.666,256.834 46.8329,66.4991 70.3353,127.169 70.3353,182.168 0,42.0001 -12.8359,76.4998 -38.6666,103.499 -25.6675,26.9992 -56.3352,40.5009 -92.1666,40.5009 -32.6696,0 -61.8339,-9.50233 -87.6689,-28.5027 -25.835,-19.0004 -44.9986,-46.9962 -57.3319,-83.6652l-18.167 0c8.16633,60.1671 29.001,106.334 62.8305,138.669 33.6706,32.167 75.6707,48.3322 126.168,48.3322 53.6675,0 98.4986,-17.3336 134.502,-51.8332 35.9989,-34.4996 53.9983,-75.1681 53.9983,-122.001 0,-33.4987 -7.83126,-67.165 -23.4981,-100.668 -24.0007,-52.6666 -63.1699,-108.499 -117.168,-167.498 -81.0018,-88.5023 -131.667,-141.835 -151.831,-160.169l172.833 0c35.1655,0 59.832,1.336 73.9996,4.00369 14.1633,2.50016 26.9992,7.83126 38.3315,15.8301 11.3323,8.00309 21.333,19.3354 29.8344,34.0013l17.9994 0z" />
</glyph>
<glyph
id="glyph3501"
horiz-adv-x="499"
unicode="1">
<path
id="path3503"
d="M117.168 597.165l161.166 78.6692 16.1651 0 0 -559.168c0,-36.9998 1.49924,-60.1671 4.50201,-69.3344 3.16601,-8.99972 9.66557,-15.9976 19.3311,-20.9979 9.83311,-4.83279 29.6669,-7.66802 59.6688,-8.33387l0 -17.9994 -249.17 0 0 17.9994c31.3336,0.66585 51.5025,3.33355 60.6697,8.16633 8.99972,4.66954 15.3317,11.0016 19.0004,19.0004 3.49679,7.9988 5.3311,31.8319 5.3311,71.4995l0 357.502c0,48.1646 -1.66677,78.9999 -4.83279,92.6649 -2.33262,10.5033 -6.49956,18.167 -12.5008,22.9998 -5.99695,4.83279 -13.1667,7.33295 -21.6638,7.33295 -12.0025,0 -28.8335,-4.99603 -50.334,-15.1642l-7.33295 15.1642z" />
</glyph>
<glyph
id="glyph3505"
horiz-adv-x="499"
unicode="0">
<path
id="path3507"
d="M36.1664 327.165c0,75.5031 11.3323,140.503 34.1689,195.004 22.8322,54.4966 52.9974,95.1651 90.8306,121.833 29.3361,21.1655 59.5013,31.8319 90.8349,31.8319 50.6648,0 96.3335,-26.0025 136.667,-77.6682 50.4972,-64.1665 75.6664,-150.998 75.6664,-260.833 0,-76.8348 -11.0016,-141.998 -33.1679,-195.666 -22.1664,-53.8351 -50.334,-92.8324 -84.6661,-117.001 -34.3321,-24.3315 -67.5001,-36.334 -99.4995,-36.334 -63.0023,0 -115.669,37.1673 -157.669,111.833 -35.4963,62.8348 -53.1649,138.501 -53.1649,226.999zm95.6677 -12.1657c0,-91.1657 11.1648,-165.664 33.6663,-223.167 18.4978,-48.4997 46.3346,-72.8312 82.9993,-72.8312 17.6687,0 35.8356,7.9988 54.6685,23.6656 19.0004,15.8344 33.3312,42.3352 42.9968,79.335 15.001,56.0002 22.5014,135 22.5014,236.832 0,75.4989 -7.83126,138.501 -23.4981,188.998 -11.6674,37.5024 -26.8359,64.0033 -45.3337,79.6701 -13.3342,10.6665 -29.4993,15.9976 -48.3364,15.9976 -22.1664,0 -41.8326,-9.83311 -59.1662,-29.6669 -23.3305,-26.9992 -39.3324,-69.4976 -47.8338,-127.5 -8.49711,-57.9977 -12.664,-114.999 -12.664,-171.334z" />
</glyph>
<glyph
id="glyph3509"
horiz-adv-x="722"
unicode="O">
<path
id="path3511"
d="M365.668 677.166c85.9978,0 160.5,-32.4978 223.498,-97.8328 63.0023,-65.335 94.4992,-146.668 94.4992,-244.333 0,-100.668 -31.8319,-184.166 -95.3326,-250.502 -63.5007,-66.4991 -140.331,-99.6671 -230.5,-99.6671 -90.9981,0 -167.665,32.5021 -229.667,97.1669 -61.9971,64.8367 -93,148.669 -93,251.502 0,105.166 35.8356,190.833 107.335,257.332 62.3322,57.6669 136.667,86.3329 223.167,86.3329zm-9.16726 -35.5006c-59.3337,0 -106.832,-21.9988 -142.668,-65.9965 -44.5003,-54.6685 -66.8342,-134.669 -66.8342,-240.17 0,-108.164 23.1673,-191.331 69.3344,-249.496 35.5006,-44.337 82.3335,-66.5034 140.666,-66.5034 62.169,0 113.5,24.3358 154,72.8354 40.5009,48.4997 60.833,124.999 60.833,229.499 0,113.165 -22.3339,197.667 -66.9974,253.332 -35.8356,44.3328 -85.1687,66.4991 -148.334,66.4991z" />
</glyph>
<glyph
id="glyph3513"
horiz-adv-x="722"
unicode="N">
<path
id="path3515"
d="M-13.1667 662.165l179.668 0 404.833 -496.664 0 381.833c0,40.6684 -4.66954,66.1684 -13.6693,76.1647 -12.1657,13.6693 -31.1661,20.5039 -57.1643,20.5039l-22.9998 0 0 18.1627 230.5 0 0 -18.1627 -23.5024 0c-28.0001,0 -47.8338,-8.50141 -59.497,-25.3367 -7.16971,-10.499 -10.6665,-34.1646 -10.6665,-71.3319l0 -558 -17.6687 0 -436.501 533.166 0 -407.831c0,-40.6684 4.33447,-66.0008 13.1667,-76.169 12.3333,-13.665 31.5012,-20.4996 57.1686,-20.4996l23.3348 0 0 -17.9994 -230.337 0 0 17.9994 22.8365 0c28.3309,0 48.3322,8.50141 60.1671,25.4999 7.16541,10.3357 10.6665,34.1689 10.6665,71.1687l0 460.498c-19.1679,22.5014 -33.8338,37.3349 -43.6669,44.5003 -10.0006,7.16541 -24.5033,13.8325 -43.6669,20.0013 -9.50233,2.83094 -23.8332,4.33447 -43.0011,4.33447l0 18.1627z" />
</glyph>
<glyph
id="glyph3517"
horiz-adv-x="889"
unicode="M">
<path
id="path3519"
d="M409.167 0l-255.833 557.166 0 -442.498c0,-40.6684 4.33018,-66.0008 13.1667,-76.169 11.9982,-13.665 31.1661,-20.4996 57.1643,-20.4996l23.3348 0 0 -17.9994 -230.333 0 0 17.9994 23.3305 0c28.0001,0 47.8338,8.50141 59.6688,25.4999 7.16541,10.3357 10.6665,34.1689 10.6665,71.1687l0 432.665c0,29.3318 -3.16601,50.5015 -9.66557,63.5007 -4.66954,9.49803 -13.0034,17.3336 -25.1691,23.6656 -12.3333,6.33202 -31.8319,9.50233 -58.8311,9.50233l0 18.1627 187.499 0 240.166 -518.165 236.334 518.165 187.499 0 0 -18.1627 -22.9998 0c-28.3309,0 -48.3322,-8.50141 -59.9996,-25.3367 -7.16541,-10.499 -10.834,-34.1646 -10.834,-71.3319l0 -432.665c0,-40.6684 4.66954,-66.0008 13.8325,-76.169 12.0025,-13.665 31.0029,-20.4996 57.0011,-20.4996l22.9998 0 0 -17.9994 -281.333 0 0 17.9994 23.4981 0c28.3352,0 48.1689,8.50141 59.6688,25.4999 7.16541,10.3357 10.6665,34.1689 10.6665,71.1687l0 442.498 -255.334 -557.166 -16.1651 0z" />
</glyph>
<glyph
id="glyph3521"
horiz-adv-x="610"
unicode="L">
<path
id="path3523"
d="M573.168 183.165l16.1651 -3.49679 -56.666 -179.668 -512.666 0 0 17.9994 24.9973 0c28.0001,0 48.0014,9.16726 59.9996,27.3342 6.83463,10.499 10.1682,34.6672 10.1682,72.3328l0 427.334c0,41.3343 -4.49771,67.165 -13.665,77.5007 -12.6683,14.3308 -31.5012,21.5005 -56.5028,21.5005l-24.9973 0 0 18.1627 299.83 0 0 -18.1627c-35.1655,0.330777 -59.832,-2.83523 -73.9996,-9.66987 -14.1633,-6.83034 -23.8332,-15.4993 -28.9967,-25.9982 -5.16786,-10.3357 -7.83556,-35.333 -7.83556,-74.6655l0 -416.002c0,-26.9992 2.6677,-45.5012 7.83556,-55.6651 3.83186,-6.83463 9.83311,-11.835 17.9994,-15.1685 8.16633,-3.16601 33.4987,-4.83279 76.1647,-4.83279l48.3322 0c50.8366,0 86.5004,3.66862 107,11.1648 20.4996,7.50048 39.1692,20.8347 56.1677,39.835 16.8353,19.0004 33.8338,49.1655 50.6691,90.1647z" />
</glyph>
<glyph
id="glyph3525"
horiz-adv-x="722"
unicode="K">
<path
id="path3527"
d="M298.834 367.167l244.165 -242.666c40.0026,-40.0026 74.1671,-67.3325 102.502,-81.8352 28.3309,-14.4984 56.666,-22.6647 84.9969,-24.6665l0 -17.9994 -314.999 0 0 17.9994c18.8328,0 32.5021,3.16601 40.836,9.66557 8.32957,6.33632 12.4965,13.3342 12.4965,21.1697 0,7.83126 -1.66677,14.8334 -4.66525,20.9979 -3.16601,6.16878 -13.3342,17.6687 -30.5002,34.6672l-228.666 225.998 0 -213.33c0,-33.503 2.16509,-55.6694 6.49956,-66.3359 3.16601,-8.16633 10.0006,-15.1642 20.4996,-20.9979 14,-7.83556 28.6659,-11.835 44.3328,-11.835l22.5014 0 0 -17.9994 -282.166 0 0 17.9994 23.3305 0c27.3342,0 47.168,7.9988 59.6688,24.0007 7.83126,10.3314 11.6674,35.5006 11.6674,75.1681l0 427.833c0,33.4987 -2.16938,55.8326 -6.33632,66.8342 -3.33355,7.83126 -9.99635,14.6659 -19.997,20.4996 -14.3351,7.83126 -29.3361,11.6674 -45.0029,11.6674l-23.3305 0 0 18.1627 282.166 0 0 -18.1627 -22.5014 0c-15.3317,0 -29.9976,-3.66862 -44.3328,-11.1691 -10.1682,-5.16786 -17.1661,-12.9991 -20.9979,-23.4981 -4.00369,-10.3357 -6.00125,-31.8362 -6.00125,-64.334l0 -202.668c6.6671,6.16878 28.8335,26.8316 67.0017,62.0014 96.6643,88.498 155.165,147.664 175.329,177.163 8.66894,13.0034 13.1667,24.5033 13.1667,34.1689 0,7.50048 -3.49679,14.1676 -10.3314,19.8338 -6.83463,5.66617 -18.3345,8.50141 -34.6672,8.50141l-15.1642 0 0 18.1627 243.164 0 0 -18.1627c-14.3308,-0.335073 -27.3342,-2.16938 -38.9974,-5.83371 -11.6674,-3.50108 -26.0025,-10.5033 -43.0011,-20.6671 -16.8353,-10.3357 -37.6657,-26.8359 -62.4997,-49.6681 -7.16971,-6.49956 -40.1658,-39.835 -99.1688,-99.9979l-100.999 -100.668z" />
</glyph>
<glyph
id="glyph3529"
horiz-adv-x="389"
unicode="J">
<path
id="path3531"
d="M99.6671 644.002l0 18.1627 283.665 0 0 -18.1627 -24.0007 0c-26.9992,0 -46.6654,-8.00309 -58.9986,-23.8374 -7.83126,-10.499 -11.835,-35.4963 -11.835,-75.1638l0 -323.835c0,-49.8314 -5.3311,-90.1647 -16.3327,-121 -10.834,-30.9986 -29.6669,-57.9977 -56.3309,-80.83 -26.6684,-23.0041 -59.0029,-34.5039 -96.6686,-34.5039 -30.6678,0 -54.6642,7.66802 -72.3328,22.669 -17.5011,15.1642 -26.3333,32.4978 -26.3333,52.0008 0,15.9976 3.9994,28.0001 12.1657,36.1664 10.834,10.1639 23.3348,15.1642 37.67,15.1642 10.3314,0 19.8295,-3.33355 28.0001,-10.1639 8.32957,-6.83463 18.8328,-25.1691 31.4969,-54.836 7.50048,-17.4968 17.1661,-26.3333 28.8335,-26.3333 8.83218,0 17.0028,5.3354 24.6665,16.1694 7.66802,10.6665 11.4999,29.8301 11.4999,57.1643l0 452.168c0,33.4987 -2.16509,55.6651 -6.33202,66.3316 -3.33355,8.16633 -10.1682,15.1685 -20.4996,21.0022 -14,7.83126 -28.8335,11.6674 -44.5003,11.6674l-23.8332 0z" />
</glyph>
<glyph
id="glyph3533"
horiz-adv-x="332"
unicode="I">
<path
id="path3535"
d="M308.667 17.9994l0 -17.9994 -283.833 0 0 17.9994 23.4981 0c27.3342,0 47.168,7.9988 59.5013,24.0007 7.83126,10.3314 11.835,35.5006 11.835,75.1681l0 427.833c0,33.4987 -2.16938,55.6651 -6.33632,66.3316 -3.33355,8.16633 -10.0006,15.1685 -19.997,21.0022 -14.3351,7.83126 -29.3361,11.6674 -45.0029,11.6674l-23.4981 0 0 18.1627 283.833 0 0 -18.1627 -24.0007 0c-26.9992,0 -46.6654,-8.00309 -58.9986,-23.8374 -8.16633,-10.499 -12.3333,-35.4963 -12.3333,-75.1638l0 -427.833c0,-33.503 2.16509,-55.6694 6.33202,-66.3359 3.33355,-8.16633 10.1682,-15.1642 20.4996,-20.9979 14,-7.83556 28.8335,-11.835 44.5003,-11.835l24.0007 0z" />
</glyph>
<glyph
id="glyph3537"
horiz-adv-x="722"
unicode="H">
<path
id="path3539"
d="M205.499 355.001l307.67 0 0 189.497c0,33.8338 -2.16938,56.1677 -6.33632,66.8342 -3.33355,8.16633 -10.1639,15.1685 -20.4996,21.0022 -14,7.83126 -28.8335,11.6674 -44.5003,11.6674l-23.3305 0 0 18.1627 283.163 0 0 -18.1627 -23.4981 0c-15.4993,0 -30.3327,-3.66862 -44.3328,-11.1691 -10.499,-5.16786 -17.5011,-13.1667 -21.333,-23.6656 -3.66862,-10.6665 -5.50293,-32.167 -5.50293,-64.6691l0 -427.33c0,-33.503 2.00185,-55.6694 6.33632,-66.3359 3.16601,-8.16633 9.83311,-15.1642 19.997,-20.9979 14.3351,-7.83556 29.3361,-11.835 44.8354,-11.835l23.4981 0 0 -17.9994 -283.163 0 0 17.9994 23.3305 0c26.9992,0 46.8329,7.9988 59.1662,24.0007 8.16633,10.3314 12.17,35.5006 12.17,75.1681l0 201.667 -307.67 0 0 -201.667c0,-33.503 2.16938,-55.6694 6.33632,-66.3359 3.33355,-8.16633 10.1639,-15.1642 20.6671,-20.9979 14,-7.83556 28.6659,-11.835 44.3328,-11.835l23.9964 0 0 -17.9994 -283.665 0 0 17.9994 23.3348 0c27.3342,0 47.1637,7.9988 59.6645,24.0007 7.66802,10.3314 11.6674,35.5006 11.6674,75.1681l0 427.33c0,33.8338 -2.16509,56.1677 -6.33202,66.8342 -3.33355,8.16633 -10.0006,15.1685 -20.0013,21.0022 -14.3308,7.83126 -29.3318,11.6674 -44.9986,11.6674l-23.3348 0 0 18.1627 283.665 0 0 -18.1627 -23.9964 0c-15.6668,0 -30.3327,-3.66862 -44.3328,-11.1691 -10.1682,-5.16786 -17.1704,-13.1667 -21.0022,-23.6656 -3.9994,-10.6665 -6.00125,-32.167 -6.00125,-64.6691l0 -189.497z" />
</glyph>
<glyph
id="glyph3541"
horiz-adv-x="722"
unicode="G">
<path
id="path3543"
d="M613.833 677.166l17.0028 -208.832 -17.0028 0c-17.3336,52.0008 -39.6675,91.1657 -66.9974,117.667 -39.3367,38.0007 -90.0015,57.0011 -151.835,57.0011 -84.331,0 -148.498,-33.3355 -192.332,-100.002 -36.8323,-56.3309 -55.1668,-123.333 -55.1668,-201.164 0,-63.1699 12.1657,-120.837 36.4972,-172.833 24.5033,-52.1683 56.5028,-90.3366 96.0027,-114.501 39.5,-24.3358 80.1641,-36.5015 121.833,-36.5015 24.499,0 47.9971,3.16601 70.8336,9.33479 22.8322,6.16449 44.6635,15.3317 65.8333,27.3342l0 191.499c0,33.1679 -2.50016,54.8317 -7.50048,65.1674 -5.00032,10.1639 -12.8359,17.9994 -23.5024,23.3305 -10.499,5.50293 -29.1643,8.16633 -55.8326,8.16633l0 18.5021 256.335 0 0 -18.5021 -12.1657 0c-25.4999,0 -42.8335,-8.49711 -52.3358,-25.4999 -6.49956,-11.9982 -9.66557,-35.8313 -9.66557,-71.1644l0 -202.668c-37.5024,-20.1645 -74.5022,-34.998 -110.832,-44.5003 -36.5015,-9.49803 -77.0024,-14.1676 -121.67,-14.1676 -127.83,0 -224.997,41.0035 -291.496,123.002 -49.8357,61.6663 -74.6698,132.5 -74.6698,212.999 0,58.1696 14,114.002 42.0001,167.502 33.1679,63.5007 78.8324,112.331 136.667,146.5 48.4997,28.3309 105.836,42.3309 171.832,42.3309 24.1682,0 46.0038,-1.83431 65.8333,-5.83371 19.6705,-3.83186 47.5031,-12.4965 83.6695,-25.8307 18.167,-6.83463 30.5002,-10.1682 36.6647,-10.1682 6.16878,0 11.4999,2.83523 15.8344,8.50141 4.33447,5.66617 6.99787,16.831 7.9988,33.3312l18.167 0z" />
</glyph>
<glyph
id="glyph3545"
horiz-adv-x="556"
unicode="F">
<path
id="path3547"
d="M204.665 625.998l0 -260.33 120.502 0c27.665,0 48.0014,6.16449 60.833,18.3302 12.8316,12.17 21.333,36.334 25.6675,72.5004l17.9994 0 0 -223.996 -17.9994 0c-0.335073,25.6632 -3.66862,44.496 -10.0006,56.4985 -6.33202,12.1657 -15.1685,21.1655 -26.5008,27.1667 -11.1648,6.00125 -27.8325,8.99972 -49.9989,8.99972l-120.502 0 0 -207.999c0,-33.503 2.00185,-55.6694 6.33632,-66.3359 3.16601,-8.16633 9.99635,-15.1642 20.4996,-20.9979 14.3308,-7.83556 29.1643,-11.835 44.8311,-11.835l24.0007 0 0 -17.9994 -284.168 0 0 17.9994 23.3348 0c27.3342,0 47.3312,7.9988 59.6688,24.0007 7.83126,10.3314 11.6631,35.5006 11.6631,75.1681l0 427.833c0,33.4987 -2.16509,55.6651 -6.33202,66.3316 -3.33355,8.16633 -10.0006,15.1685 -20.0013,21.0022 -14,7.83126 -28.9967,11.6674 -44.9986,11.6674l-23.3348 0 0 18.1627 492.669 0 6.33202 -145.499 -17.1661 0c-8.33387,30.8353 -18.3345,53.5 -29.4993,68.0027 -11.1691,14.4984 -25.0016,24.9973 -41.5018,31.4969 -16.5002,6.49956 -41.8326,9.83311 -76.3322,9.83311l-146.002 0z" />
</glyph>
<glyph
id="glyph3549"
horiz-adv-x="610"
unicode="E">
<path
id="path3551"
d="M209 625.998l0 -261.666 145.499 0c37.8332,0 63.0023,5.66617 75.6664,17.0028 17.0028,14.9967 26.3333,41.33 28.3352,79.1632l17.9994 0 0 -230.496 -17.9994 0c-4.50201,32.1627 -9.16726,52.8299 -13.665,61.9971 -5.83371,11.3323 -15.5036,20.3364 -28.8335,26.8359 -13.3342,6.49956 -33.8338,9.83311 -61.5031,9.83311l-145.499 0 0 -218.335c0,-29.3318 1.3317,-47.168 3.83186,-53.5 2.6677,-6.33202 7.16971,-11.3323 13.6693,-15.1685 6.49956,-3.66433 19.0004,-5.49864 37.1673,-5.49864l112.331 0c37.3349,0 64.6691,2.50016 81.5001,7.83556 16.9985,5.16356 33.1679,15.3317 48.8348,30.6635 20.1645,20.1688 40.8317,50.6691 61.9971,91.3332l19.503 0 -57.0011 -165.999 -510.334 0 0 17.9994 23.5024 0c15.4993,0 30.3327,3.83186 44.3328,11.3323 10.499,5.16786 17.4968,13.0034 21.333,23.3348 3.66433,10.499 5.49864,31.8319 5.49864,63.999l0 430.169c0,42.0001 -4.16694,67.8308 -12.6683,77.6639 -11.6631,12.9991 -31.1661,19.503 -58.496,19.503l-23.5024 0 0 18.1627 510.334 0 7.33295 -144.996 -19.1679 0c-6.83034,34.8304 -14.3308,58.6636 -22.6647,71.667 -8.33387,12.9991 -20.4996,22.9998 -36.8323,29.8301 -12.9991,4.83279 -36.0032,7.33295 -68.8361,7.33295l-181.665 0z" />
</glyph>
<glyph
id="glyph3553"
horiz-adv-x="722"
unicode="D">
<path
id="path3555"
d="M17.1661 0l0 17.9994 24.8341 0c28.0001,0 47.8338,8.99972 59.5013,26.9992 7.16541,10.6665 10.834,34.8347 10.834,72.1696l0 427.833c0,41.3343 -4.66954,67.165 -13.6693,77.5007 -12.664,14.3308 -31.6644,21.5005 -56.666,21.5005l-24.8341 0 0 18.1627 269.502 0c98.8337,0 174.165,-11.3323 225.831,-33.6663 51.5025,-22.4972 93,-59.9996 124.501,-112.331 31.3336,-52.4991 47.168,-113.001 47.168,-181.665 0,-92.1666 -28.0001,-169.169 -84.0003,-231.003 -62.8348,-68.9993 -158.666,-103.499 -287.166,-103.499l-295.835 0zm188.835 47.8338c41.33,-9.16726 75.9972,-13.6693 103.997,-13.6693 75.5031,0 138.166,26.5008 188.002,79.6701 49.8314,52.9974 74.833,124.999 74.833,215.83 0,91.3332 -25.0016,163.503 -74.833,216.169 -49.8357,52.8342 -113.667,79.1675 -191.834,79.1675 -29.3318,0 -62.6673,-4.66954 -100.165,-14.1676l0 -563z" />
</glyph>
<glyph
id="glyph3557"
horiz-adv-x="667"
unicode="C">
<path
id="path3559"
d="M602.002 677.166l15.1642 -224.997 -15.1642 0c-20.1688,67.3325 -49.0023,115.832 -86.3372,145.499 -37.4981,29.6669 -82.3335,44.5003 -134.833,44.5003 -43.9977,0 -83.6652,-11.1691 -119.166,-33.503 -35.5006,-22.3296 -63.3331,-57.8302 -83.6652,-106.665 -20.3364,-48.8348 -30.5002,-109.668 -30.5002,-182.168 0,-59.832 9.49803,-111.833 28.8335,-155.83 19.1636,-43.8344 47.9971,-77.5007 86.6637,-101.003 38.5033,-23.4981 82.501,-35.1655 132.002,-35.1655 43.0011,0 80.8342,9.16726 113.835,27.6693 32.8329,18.3302 68.9993,54.8317 108.332,109.5l15.1685 -9.66987c-33.1679,-58.9986 -72.0021,-102.167 -116.167,-129.497 -44.3328,-27.3342 -96.8318,-41.0035 -157.832,-41.0035 -109.668,0 -194.669,40.6684 -254.836,122.169 -44.8311,60.4979 -67.3325,131.834 -67.3325,213.833 0,66.0008 14.8334,126.834 44.3328,182.168 29.6669,55.3343 70.5028,98.1678 122.336,128.668 51.9965,30.3327 108.667,45.4969 170.166,45.4969 47.8338,0 95.1651,-11.6674 141.667,-34.998 13.665,-7.16971 23.4981,-10.834 29.3318,-10.834 8.66894,0 16.3327,3.16601 22.8322,9.33479 8.50141,8.66465 14.5027,20.9979 18.167,36.4972l17.0028 0z" />
</glyph>
<glyph
id="glyph3561"
horiz-adv-x="667"
unicode="B">
<path
id="path3563"
d="M461.834 337.835c45.9995,-9.66987 80.3316,-25.3367 103.168,-46.8372 31.4969,-29.9976 47.3312,-66.4991 47.3312,-109.831 0,-32.8329 -10.499,-64.334 -31.3336,-94.4992 -20.8347,-30.1695 -49.3331,-52.0008 -85.667,-65.8333 -36.334,-13.8368 -91.664,-20.8347 -166.166,-20.8347l-312.499 0 0 17.9994 24.8341 0c27.665,0 47.4988,8.83218 59.497,26.5008 7.50048,11.3323 11.3366,35.5006 11.3366,72.6679l0 427.833c0,40.9992 -4.66954,66.8342 -14.1676,77.5007 -12.6683,14.3308 -31.6687,21.5005 -56.666,21.5005l-24.8341 0 0 18.1627 285.998 0c53.5,0 96.3335,-3.9994 128.501,-11.8307 48.8348,-11.6674 86.1653,-32.3346 111.833,-62.169 25.6675,-29.8301 38.499,-63.999 38.499,-102.833 0,-33.1636 -9.99635,-62.8305 -30.1652,-89.1638 -20.1645,-26.1701 -49.9989,-45.5012 -89.4989,-58.3328zm-255.833 26.4966c12.1657,-2.33262 25.8307,-3.9994 41.33,-5.16356 15.5036,-1.16846 32.5021,-1.66677 51.0041,-1.66677 47.4988,0 83.3301,5.00032 107.163,15.3317 24.0007,10.1682 42.3352,25.9982 54.9992,47.168 12.6683,20.9979 19.0004,44.1652 19.0004,69.3301 0,38.6666 -15.8301,71.667 -47.3312,99.0012 -31.6687,27.3342 -77.6682,40.9992 -138.166,40.9992 -32.6696,0 -61.8339,-3.49679 -87.9997,-10.6665l0 -254.333zm0 -316.498c37.8332,-8.83218 75.1638,-13.1667 111.833,-13.1667 58.9986,0 103.834,13.3342 134.833,39.8307 30.8353,26.5008 46.3346,59.3337 46.3346,98.3354 0,25.6675 -7.00217,50.5015 -21.0022,74.1671 -14,23.8332 -36.8323,42.4984 -68.3334,56.1677 -31.4969,13.665 -70.6661,20.4996 -117.164,20.4996 -20.1688,0 -37.5024,-0.335073 -51.8332,-0.833387 -14.3351,-0.66585 -25.835,-1.83431 -34.6672,-3.50108l0 -271.499z" />
</glyph>
<glyph
id="glyph3565"
horiz-adv-x="722"
unicode="A">
<path
id="path3567"
d="M457.499 221.668l-256.331 0 -44.8354 -104.5c-11.1648,-25.6675 -16.6677,-44.8354 -16.6677,-57.6669 0,-10.0006 4.83279,-18.8328 14.3351,-26.5008 9.66557,-7.66802 30.3327,-12.6683 62.3322,-15.001l0 -17.9994 -208.501 0 0 17.9994c27.6693,5.00032 45.5012,11.3323 53.6675,19.1679 16.6677,15.4993 35.0023,47.3312 55.1668,95.1651l233 544.833 16.9985 0 230.5 -550.667c18.5021,-44.3328 35.3373,-72.9987 50.5015,-86.1653 15.1685,-13.1667 36.334,-20.6671 63.3331,-22.3339l0 -17.9994 -261.331 0 0 17.9994c26.3333,1.336 44.1652,5.83371 53.5,13.3342 9.3305,7.33295 14,16.5002 14,27.3342 0,14.3308 -6.6671,36.8323 -19.6662,67.8308l-40.0026 95.1694zm-13.665 36.1664l-112.335 267.5 -115.166 -267.5 227.502 0z" />
</glyph>
<glyph
id="glyph3569"
horiz-adv-x="920"
unicode="@">
<path
id="path3571"
d="M687.501 467.835l-57.1686 -194.836c-21.1655,-72.9987 -34.0013,-119.166 -38.499,-138.664 -4.66525,-19.6662 -6.83463,-35.1655 -6.83463,-47.0005 0,-10.3357 3.50108,-19.1679 10.499,-26.3333 7.00217,-7.16541 15.6668,-10.6665 26.1701,-10.6665 23.6656,0 52.164,11.8307 85.667,35.6681 33.3312,23.6656 61.8296,62.3322 85.667,115.665 23.6656,53.3325 35.6638,109.002 35.6638,167 0,55.6651 -13.4974,107 -40.3334,154.336 -26.8316,47.1637 -64.8324,83.3301 -113.835,108.667 -48.998,25.1649 -102.996,37.8332 -162.33,37.8332 -75.1681,0 -145.001,-20.0013 -209.502,-59.8363 -64.334,-39.9983 -115.334,-97.3302 -153,-172.167 -37.6657,-74.833 -56.3309,-152.664 -56.3309,-233.331 0,-75.0005 16.5002,-142.999 49.4963,-204.167 33.0004,-61.168 79.5025,-107.498 139.335,-138.832 59.9996,-31.5012 124.334,-47.168 193.5,-47.168 85.4995,0 163,22.8322 232.167,68.8318 69.1668,45.8363 122.499,113.001 160.332,201.168l28.3352 0c-29.3361,-89.1681 -82.501,-161.501 -159.667,-216.835 -77.1656,-55.33 -165.002,-82.9993 -263.668,-82.9993 -77.5007,0 -149.498,18.3345 -215.834,54.9992 -66.3316,36.5015 -117.997,88.5023 -154.834,155.667 -36.6647,67.3325 -55.1668,141.169 -55.1668,222.003 0,85.8303 20.1688,165.999 60.5022,240.497 40.5009,74.3347 96.9994,132.5 169.835,174.337 72.6636,41.8326 149.834,62.663 231.664,62.663 67.3325,0 128.165,-13.8325 182.336,-41.6651 54.1659,-27.8325 95.5001,-68.6685 123.831,-122.169 28.3352,-53.5 42.3352,-110.334 42.3352,-170.664 0,-59.5013 -13.1667,-118.5 -39.6675,-177 -26.5008,-58.3328 -60.3346,-100.999 -101.334,-127.667 -40.9992,-26.6684 -83.8327,-39.9983 -128.501,-39.9983 -24.6665,0 -43.3318,5.82941 -55.8326,17.4968 -12.5008,11.835 -18.8328,28.1676 -18.8328,49.3331 0,18.3345 2.99847,42.1677 8.83218,71.8345 -48.1646,-58.3328 -86.8312,-95.9985 -115.832,-113.332 -28.8335,-17.1661 -54.5009,-25.835 -76.6673,-25.835 -22.9998,0 -43.4994,10.3357 -61.4988,31.0029 -17.8362,20.6628 -26.8359,48.1646 -26.8359,82.8318 0,47.168 15.336,99.9979 46.1671,158.666 30.8353,58.5003 71.4995,106.167 122.336,142.999 37.4981,27.0035 70.9968,40.5009 100.5,40.5009 21.8313,0 39.9983,-5.49864 54.4966,-16.831 14.5027,-11.1691 24.3358,-28.0001 29.4993,-50.5015l16.1694 53.6675 76.6673 10.834zm-171.334 -20.0013c-24.499,0 -49.1655,-12.9991 -74.3347,-38.6666 -36.6647,-37.6657 -68.1659,-88.6655 -94.1641,-152.832 -19.1679,-46.8372 -28.8335,-84.6704 -28.8335,-113.336 0,-20.4996 5.83371,-37.1673 17.3336,-49.9989 11.4999,-12.8316 24.499,-19.3354 38.8298,-19.3354 18.8328,0 38.6666,7.16971 59.5013,21.5005 20.8347,14.3351 42.666,36.5015 65.4982,66.1684 22.8365,29.8344 39.3367,59.6645 49.8357,89.6664 18.167,51.6657 27.3342,93.8334 27.3342,126.499 0,21.5005 -6.00125,38.5033 -17.8362,51.1674 -11.8307,12.6683 -26.3333,19.1679 -43.1643,19.1679z" />
</glyph>
<glyph
id="glyph3573"
horiz-adv-x="499"
unicode="_">
<path
id="path3575"
d="M508.834 -215.834l-517.168 0 0 40.9992 517.168 0 0 -40.9992z" />
</glyph>
<glyph
id="glyph3577"
horiz-adv-x="469"
unicode="^">
<path
id="path3579"
d="M243.169 675.834l207.496 -350.169 -44.8311 0 -170.999 286.17 -170.836 -286.17 -45.9995 0 210.499 350.169 14.6702 0z" />
</glyph>
<glyph
id="glyph3581"
horiz-adv-x="277"
unicode="\">
<path
id="path3583"
d="M40.5009 694.332l239.332 -707.997 -39.1649 0 -239.169 707.997 39.0017 0z" />
</glyph>
<glyph
id="glyph3585"
horiz-adv-x="610"
unicode="Z">
<path
id="path3587"
d="M575.166 662.165l-434.998 -622.166 271.499 0c41.6651,0 73.6645,9.16726 95.8309,27.3342 22.3339,18.3345 42.1677,55.1668 59.3337,110.836l16.1694 -2.83523 -31.1661 -175.333 -539.167 0 0 17.9994 424.83 604.502 -211.831 0c-35.1655,0 -60.6654,-3.83616 -76.4998,-11.3366 -15.8344,-7.66372 -27.8325,-18.8328 -36.1664,-33.3312 -8.33387,-14.4984 -15.8344,-41.5018 -22.669,-81.165l-18.4978 0 13.665 165.496 489.666 0z" />
</glyph>
<glyph
id="glyph3589"
horiz-adv-x="722"
unicode="Y">
<path
id="path3591"
d="M476.5 662.165l230.999 0 0 -18.1627 -12.664 0c-8.50141,0 -20.8347,-3.66862 -37.1673,-11.1691 -16.1651,-7.50048 -30.9986,-18.167 -44.3328,-32.167 -13.3342,-14 -29.8344,-36.8323 -49.3331,-68.501l-159.667 -251.331 0 -166.166c0,-40.6684 4.49771,-66.0008 13.665,-76.169 12.3333,-13.665 31.8319,-20.4996 58.5003,-20.4996l21.5005 0 0 -17.9994 -281.165 0 0 17.9994 23.3305 0c28.0001,0 48.0014,8.50141 59.6688,25.4999 7.16541,10.3357 10.6665,34.1689 10.6665,71.1687l0 156.831 -181.67 277.333c-21.333,32.5021 -35.9989,52.8342 -43.6626,61.0005 -7.66802,8.16633 -23.5024,17.9994 -47.5031,29.3318 -6.49956,3.33355 -15.9976,4.83708 -28.3309,4.83708l0 18.1627 283.167 0 0 -18.1627 -14.6702 0c-15.3317,0 -29.3318,-3.50108 -42.1634,-10.6708 -13.0034,-7.16541 -19.3354,-17.9994 -19.3354,-32.3303 0,-11.6674 9.83311,-32.8329 29.8344,-63.3331l138.166 -213.502 129.832 204.167c19.503,30.6678 29.3361,53.3325 29.3361,68.3334 0,9.16726 -2.33692,17.3336 -7.16971,24.499 -4.66525,7.16971 -11.4999,12.6683 -20.1645,16.8353 -8.83218,3.9994 -21.9988,6.00125 -39.6675,6.00125l0 18.1627z" />
</glyph>
<glyph
id="glyph3593"
horiz-adv-x="722"
unicode="X">
<path
id="path3595"
d="M408.166 366.665l142.166 -211.831c39.3367,-58.6679 68.501,-95.6677 87.6689,-111.167 19.0004,-15.4993 43.1643,-24.0007 72.5004,-25.6675l0 -17.9994 -284.168 0 0 17.9994c18.8328,0.335073 32.8329,2.33262 42.0001,6.00125 6.83463,2.83094 12.3333,7.33295 16.8353,13.3342 4.33018,5.99695 6.49956,12.1657 6.49956,18.3302 0,7.50048 -1.50353,15.001 -4.33447,22.5014 -2.33262,5.49864 -11.3323,19.8338 -26.8359,43.0011l-112.331 169.831 -138.669 -177.666c-14.6659,-19.0004 -23.4981,-31.4969 -26.3333,-37.8332 -2.99847,-6.33202 -4.49771,-12.9991 -4.49771,-19.8338 0,-10.499 4.49771,-19.0004 13.1667,-25.8307 8.83218,-6.83463 25.6675,-10.834 50.334,-11.835l0 -17.9994 -234.835 0 0 17.9994c16.6677,1.66677 30.8353,5.16786 43.0011,10.3357 20.1645,8.49711 39.3324,19.8295 57.4994,34.1646 18.3345,14.3351 39.1649,36.334 62.4997,66.0008l156.333 197.165 -130.335 191c-35.4963,51.6657 -65.6657,85.667 -90.3323,101.669 -24.8341,16.1651 -53.3325,24.6665 -85.4995,25.6675l0 18.1627 306.167 0 0 -18.1627c-25.9982,-1.00092 -43.8344,-5.16786 -53.5,-12.6683 -9.49803,-7.50048 -14.3308,-15.8344 -14.3308,-24.8341 0,-12.1657 7.83126,-29.6669 23.3305,-52.8342l101.669 -151.831 117.667 149c13.665,17.4968 21.9988,29.4993 25.1649,35.9989 2.99847,6.6671 4.66525,13.3342 4.66525,20.1645 0,6.83463 -1.99755,12.8359 -5.99695,18.0037 -4.83279,6.83034 -11.0016,11.6631 -18.5021,14.3308 -7.50048,2.83523 -22.9998,4.33447 -46.3346,4.66954l0 18.1627 234.835 0 0 -18.1627c-18.4978,-1.00092 -33.6663,-3.83616 -45.5012,-8.66894 -17.4968,-7.50048 -33.6663,-17.6644 -48.3322,-30.3327 -14.6659,-12.6683 -35.333,-36.1664 -61.9971,-70.3353l-131.336 -168.001z" />
</glyph>
<glyph
id="glyph3597"
horiz-adv-x="943"
unicode="W">
<path
id="path3599"
d="M936.001 662.165l0 -18.1627c-17.1661,0 -31.1661,-3.00277 -42.0001,-9.16726 -10.6665,-6.33632 -21.0022,-17.8362 -30.6678,-34.6672 -6.49956,-11.4999 -16.8353,-38.6666 -30.831,-81.6676l-184.501 -533.668 -19.503 0 -150.998 423.335 -149.834 -423.335 -17.6687 0 -196.666 549.834c-14.6659,41.0035 -24.0007,65.335 -27.8325,72.8354 -6.49956,12.3333 -15.4993,21.5005 -26.6641,27.4975 -11.1691,6.00125 -26.5008,9.00402 -45.6688,9.00402l0 18.1627 245.166 0 0 -18.1627 -11.6674 0c-17.3336,0 -30.5002,-3.83616 -39.6675,-11.6674 -8.99972,-7.83556 -13.665,-17.3336 -13.665,-28.3352 0,-11.3323 7.16541,-37.6657 21.5005,-78.6649l130.335 -371.502 109.831 315.832 -19.4987 55.6694 -15.4993 44.5003c-6.83463,16.3327 -14.5027,30.6635 -22.9998,42.9968 -4.33447,6.16878 -9.50233,11.3366 -15.6668,15.6668 -8.16633,5.83371 -16.3327,10.0006 -24.3358,12.6683 -6.33202,1.83431 -15.9976,2.83523 -29.3318,2.83523l0 18.1627 257.834 0 0 -18.1627 -17.6687 0c-18.167,0 -31.5012,-3.83616 -39.9983,-11.6674 -8.50141,-7.83556 -12.6683,-18.3345 -12.6683,-31.6687 0,-16.6677 7.33295,-45.6645 21.9988,-86.9987l126.834 -359.834 126 364.667c14.3351,40.5009 21.5005,68.3334 21.5005,84.0003 0,7.50048 -2.33262,14.4984 -6.99787,20.9979 -4.83708,6.50386 -10.6708,11.1691 -17.8362,13.6693 -12.3333,4.66525 -28.4984,6.83463 -48.3322,6.83463l0 18.1627 197.667 0z" />
</glyph>
<glyph
id="glyph3601"
horiz-adv-x="722"
unicode="V">
<path
id="path3603"
d="M709.998 662.165l0 -18.1627c-23.4981,-4.16694 -41.1667,-11.6674 -53.3325,-22.3339 -17.1661,-16.0019 -32.4978,-40.5009 -45.832,-73.3338l-230.999 -563.503 -18.0037 0 -247.997 570.836c-12.8359,29.3318 -21.6681,47.168 -27.0035,53.6675 -7.9988,10.1639 -17.9994,17.9994 -29.9976,23.6656 -11.835,5.83371 -27.8325,9.33479 -48.0014,11.0016l0 18.1627 270.503 0 0 -18.1627c-30.6678,-2.83523 -50.5015,-8.17063 -59.6688,-15.5036 -8.99972,-7.50048 -13.665,-17.1661 -13.665,-28.8335 0,-16.3327 7.50048,-41.6651 22.4972,-76.1647l168.503 -388.165 156.166 383.165c15.3317,37.8332 22.9998,63.999 22.9998,78.6649 0,9.50233 -4.66525,18.5021 -14.1676,27.1667 -9.49803,8.50141 -25.3324,14.6702 -47.8338,18.167 -1.66677,0.335073 -4.33018,0.833387 -8.33387,1.50353l0 18.1627 204.167 0z" />
</glyph>
<glyph
id="glyph3605"
horiz-adv-x="722"
unicode="U">
<path
id="path3607"
d="M476.998 644.002l0 18.1627 234.504 0 0 -18.1627 -25.0016 0c-26.0025,0 -45.9995,-10.834 -59.9996,-32.6696 -6.83463,-10.1639 -10.3357,-33.4987 -10.3357,-70.331l0 -268.501c0,-66.4991 -6.49956,-118.002 -19.6662,-154.499 -13.1667,-36.669 -39.1649,-68.1702 -77.6639,-94.336 -38.6666,-26.1658 -91.17,-39.3324 -157.502,-39.3324 -72.3328,0 -127.169,12.5008 -164.499,37.6657 -37.5024,25.0016 -63.999,58.6679 -79.6658,101.003 -10.3357,28.9967 -15.6668,83.3301 -15.6668,163.163l0 258.835c0,40.6641 -5.50293,67.3325 -16.8353,80.0009 -11.1648,12.664 -29.3318,19.0004 -54.3334,19.0004l-24.9973 0 0 18.1627 286.165 0 0 -18.1627 -25.3324 0c-27.3342,0 -47.0005,-8.50141 -58.6679,-25.835 -8.16633,-11.6674 -12.1657,-36.1664 -12.1657,-73.1662l0 -288.666c0,-25.6675 2.33262,-55.1668 6.99787,-88.3347 4.83279,-33.1679 13.3342,-59.1662 25.6675,-77.6682 12.3333,-18.4978 30.1652,-33.8338 53.5,-45.832 23.3348,-12.1657 51.8332,-18.167 85.667,-18.167 43.3318,0 81.9984,9.49803 116.167,28.3352 34.1646,18.8328 57.6669,42.9968 70.1635,72.4961 12.5008,29.5036 18.8371,79.335 18.8371,149.67l0 268.166c0,41.3343 -4.66954,67.165 -13.6693,77.5007 -12.8316,14.3308 -31.6644,21.5005 -56.666,21.5005l-25.0016 0z" />
</glyph>
<glyph
id="glyph3609"
horiz-adv-x="610"
unicode="T">
<path
id="path3611"
d="M578.667 662.165l7.33295 -155.332 -18.6653 0c-3.50108,27.3342 -8.33387,46.8329 -14.6659,58.6679 -10.0006,18.8328 -23.5024,32.6653 -40.1701,41.6651 -16.831,8.99972 -38.8341,13.5017 -66.1641,13.5017l-93.3351 0 0 -505.999c0,-40.6684 4.50201,-66.0008 13.1667,-76.169 12.3333,-13.665 31.5012,-20.4996 57.1686,-20.4996l22.9998 0 0 -17.9994 -280.834 0 0 17.9994 23.4981 0c28.0001,0 47.8338,8.50141 59.5013,25.4999 7.16541,10.3357 10.834,34.1689 10.834,71.1687l0 505.999 -79.6658 0c-30.8353,0 -52.8342,-2.33262 -65.8333,-6.83463 -17.0028,-6.16449 -31.5012,-18.167 -43.4994,-35.6638 -12.0025,-17.6687 -19.1679,-41.3343 -21.5005,-71.3362l-18.5021 0 7.83556 155.332 540.499 0z" />
</glyph>
<glyph
id="glyph3613"
horiz-adv-x="556"
unicode="S">
<path
id="path3615"
d="M458.5 677.166l0 -229.001 -17.9994 0c-6.00125,44.002 -16.5002,78.9999 -31.5012,105.002 -15.1685,26.1658 -36.8323,46.8329 -64.8324,62.0014 -28.0001,15.3317 -56.8336,22.9998 -86.8355,22.9998 -33.8338,0 -61.8339,-10.3357 -84.0003,-31.0029 -22.1664,-20.6671 -33.1636,-44.1652 -33.1636,-70.4985 0,-20.1688 6.99787,-38.6666 20.9979,-55.1668 20.1688,-24.499 68.1659,-57.0011 144,-97.6652 61.8339,-33.1679 104.169,-58.6679 126.666,-76.4998 22.669,-17.6687 40.1701,-38.6666 52.3358,-62.6673 12.1657,-24.1682 18.3302,-49.3331 18.3302,-75.6664 0,-50.1665 -19.4987,-93.3351 -58.3328,-129.669 -38.9974,-36.334 -89.0006,-54.5009 -150.164,-54.5009 -19.3354,0 -37.3349,1.50353 -54.3334,4.50201 -10.0006,1.49924 -31.0029,7.50048 -62.6673,17.6644 -31.6687,10.3357 -51.8332,15.5036 -60.3346,15.5036 -8.16633,0 -14.4984,-2.50016 -19.3311,-7.33295 -4.66954,-4.83708 -8.16633,-15.001 -10.5033,-30.337l-17.9994 0 0 227.003 17.9994 0c8.50141,-47.5031 20.0013,-83.0036 34.3364,-106.669 14.3308,-23.4981 36.1664,-43.1643 65.6657,-58.8311 29.3318,-15.4993 61.6663,-23.3348 96.8318,-23.3348 40.6684,0 72.8354,10.6665 96.5011,32.167 23.5024,21.5005 35.333,46.8329 35.333,76.1647 0,16.337 -4.49771,32.6696 -13.3342,49.3331 -8.99972,16.6677 -22.9998,32.0038 -41.8326,46.3346 -12.664,9.83311 -47.3312,30.5002 -103.997,62.3322 -56.6703,31.6687 -96.8361,57.0011 -120.837,75.8339 -23.9964,19.0004 -42.0001,39.835 -54.4966,62.4997 -12.3333,22.8365 -18.5021,48.0014 -18.5021,75.3356 0,47.4988 18.167,88.3347 54.6685,122.667 36.4972,34.3321 82.8318,51.4982 139.167,51.4982 35.1655,0 72.4961,-8.49711 111.833,-25.8307 18.167,-8.16633 31.1661,-12.17 38.499,-12.17 8.50141,0 15.4993,2.50016 20.8347,7.50048 5.3311,5.16786 9.66557,15.336 12.9991,30.5002l17.9994 0z" />
</glyph>
<glyph
id="glyph3617"
horiz-adv-x="667"
unicode="R">
<path
id="path3619"
d="M675.834 0l-176.833 0 -224.168 309.5c-16.5002,-0.498314 -29.9976,-0.833387 -40.5009,-0.833387 -4.16694,0 -8.66465,0 -13.665,0.167537 -4.83279,0.167537 -9.83311,0.330777 -15.1685,0.66585l0 -192.332c0,-41.6694 4.66954,-67.5001 13.6693,-77.6682 12.5008,-14.3351 30.9986,-21.5005 55.6651,-21.5005l25.9982 0 0 -17.9994 -283.665 0 0 17.9994 24.8341 0c28.0001,0 48.0014,9.16726 59.9996,27.3342 6.83463,10.1682 10.3357,34.1646 10.3357,71.8345l0 427.833c0,41.6651 -4.66954,67.5001 -13.6693,77.5007 -12.664,14.3308 -31.6644,21.5005 -56.666,21.5005l-24.8341 0 0 18.1627 241.167 0c70.3353,0 122.169,-5.16356 155.5,-15.4993 33.3355,-10.1639 61.6663,-28.9967 85.0012,-56.4985 23.1673,-27.665 34.8347,-60.3346 34.8347,-98.4986 0,-40.6684 -13.1667,-76.0015 -39.835,-106.003 -26.5008,-29.8301 -67.5001,-50.9998 -123.165,-63.3331l136.667 -189.999c31.1661,-43.6669 58.1653,-72.6636 80.4992,-86.9987 22.4972,-14.1676 51.8332,-23.3348 87.9997,-27.3342l0 -17.9994zm-470.335 340.331c6.33632,0 11.6674,0 16.1694,-0.163241 4.49771,-0.167537 8.33387,-0.335073 11.1648,-0.335073 63.1656,0 110.832,13.665 142.836,40.9992 32.1627,27.3342 48.1646,62.169 48.1646,104.5 0,41.3343 -12.9991,75.0005 -38.8341,100.836 -25.8307,25.8307 -60.1671,38.8341 -102.833,38.8341 -18.8328,0 -44.3328,-3.17031 -76.6673,-9.33479l0 -275.336z" />
</glyph>
<glyph
id="glyph3621"
horiz-adv-x="722"
unicode="Q">
<path
id="path3623"
d="M440.501 -7.33295c33.1636,-57.3319 68.9993,-99.4995 107.666,-126.499 38.499,-27.0035 82.3335,-42.5027 131.499,-46.3346l0 -15.6668c-44.8311,1.66677 -92.8324,10.6665 -144,27.1667 -51.1674,16.3327 -99.4995,39.1649 -145.332,68.3334 -45.6688,29.1643 -85.1687,60.1671 -118.332,93 -46.8372,18.8328 -84.0003,38.8341 -111.334,59.9996 -39.6675,31.6687 -70.5028,70.4985 -92.5017,116.498 -21.9988,46.1671 -33.0004,100.5 -33.0004,163.335 0,99.0012 31.9995,181.167 96.166,246.665 64.1665,65.335 141.835,98.0003 233,98.0003 86.5004,0 161.501,-32.6653 224.834,-98.3311 63.3331,-65.5025 95.0018,-148.334 95.0018,-248.336 0,-80.9975 -22.669,-152.166 -67.6676,-213.33 -45.1661,-61.168 -103.834,-102.67 -175.999,-124.501zm-82.1659 647c-59.1662,0 -106.837,-21.1655 -143.003,-63.5007 -45.4969,-53.0017 -68.3334,-134.334 -68.3334,-243.667 0,-107 23.1673,-189.669 69.3344,-247.499 35.8356,-44.6678 83.1669,-67.0017 142.002,-67.0017 61.3313,0 110.497,22.3339 147.999,67.0017 43.9977,52.6666 66.0008,130.498 66.0008,233.331 0,79.1675 -12.17,145.667 -36.1664,199.669 -18.6696,41.6651 -43.1686,72.3328 -74.0039,92.1666 -30.831,19.6662 -65.3307,29.4993 -103.83,29.4993z" />
</glyph>
<glyph
id="glyph3625"
horiz-adv-x="556"
unicode="P">
<path
id="path3627"
d="M205 309.998l0 -192.83c0,-41.6694 4.66525,-67.5001 13.8325,-77.6682 12.3333,-14.3351 30.9986,-21.5005 56.0002,-21.5005l25.4999 0 0 -17.9994 -283.665 0 0 17.9994 24.8341 0c28.0001,0 47.9971,9.16726 59.9996,27.3342 6.49956,10.1682 9.83311,34.1646 9.83311,71.8345l0 427.833c0,41.6651 -4.33447,67.5001 -13.1667,77.5007 -12.6683,14.3308 -31.6687,21.5005 -56.666,21.5005l-24.8341 0 0 18.1627 242.666 0c59.1662,0 105.832,-6.16449 140,-18.3302 34.3321,-12.1657 62.998,-32.8329 86.5004,-61.8339 23.4981,-29.001 35.1655,-63.3331 35.1655,-103.001 0,-53.9983 -17.8319,-98.0003 -53.5,-131.834 -35.6681,-33.8338 -86.0021,-50.8323 -151.165,-50.8323 -15.8344,0 -33.1679,1.16846 -51.67,3.50108 -18.4978,2.33262 -38.499,5.66617 -59.6645,10.1639zm0 27.8368c17.3336,-3.17031 32.6653,-5.67047 45.9995,-7.33724 13.3342,-1.49924 24.6665,-2.33262 34.1689,-2.33262 33.8295,0 62.998,12.9991 87.6646,39.3324 24.499,26.1701 36.8323,60.0039 36.8323,101.669 0,28.6659 -5.83371,55.3343 -17.4968,79.8333 -11.835,24.6665 -28.3352,43.0011 -49.8357,55.1668 -21.5005,12.3333 -45.9995,18.3345 -73.3338,18.3345 -16.5002,0 -37.8332,-3.00277 -63.999,-9.16726l0 -275.499z" />
</glyph>
<glyph
id="glyph3629"
horiz-adv-x="499"
unicode="o">
<path
id="path3631"
d="M249.999 460.498c67.6676,0 122.001,-25.8307 163.168,-77.1656 34.8347,-43.9977 52.1683,-94.4992 52.1683,-151.333 0,-40.1658 -9.66987,-80.6667 -28.8335,-121.666 -19.1679,-40.9992 -45.6688,-72.0021 -79.335,-92.8324 -33.6663,-20.8347 -71.1644,-31.1661 -112.499,-31.1661 -67.5001,0 -121,26.8316 -160.668,80.4992 -33.4987,45.3337 -50.334,96.166 -50.334,152.334 0,41.1667 10.1682,81.8309 30.5002,122.332 20.3321,40.5009 47.168,70.4985 80.3316,89.834 33.1679,19.4987 68.3334,29.1643 105.501,29.1643zm-15.1642 -31.8319c-17.1661,0 -34.4996,-5.00032 -52.0008,-15.3317 -17.3336,-10.3357 -31.5012,-28.1676 -42.1677,-54.0026 -10.834,-25.6632 -16.1651,-58.6636 -16.1651,-98.9969 0,-65.1674 12.9991,-121.335 38.8341,-168.503 25.8307,-47.1637 59.9996,-70.8336 102.33,-70.8336 31.5012,0 57.4994,13.0034 78.1665,39.0017 20.4996,26.1658 30.6678,70.8336 30.6678,134.334 0,79.4982 -16.9985,141.998 -51.3349,187.499 -22.9998,31.3336 -52.4991,46.8329 -88.3304,46.8329z" />
</glyph>
<glyph
id="glyph3633"
horiz-adv-x="499"
unicode="n">
<path
id="path3635"
d="M161.668 365.668c52.3316,63.1656 102.33,94.83 149.834,94.83 24.499,0 45.4969,-6.16449 62.998,-18.3302 17.6687,-12.1657 31.6687,-32.3346 42.0001,-60.3346 7.16541,-19.4987 10.6665,-49.5006 10.6665,-89.834l0 -191c0,-28.1633 2.33262,-47.4988 6.99787,-57.4994 3.50108,-8.16633 9.33479,-14.4984 17.3336,-19.1679 7.83556,-4.49771 22.669,-6.83034 44.1695,-6.83034l0 -17.5011 -221.333 0 0 17.5011 9.3305 0c20.8347,0 35.5006,3.33355 43.6669,9.66557 8.33387,6.33202 14.1676,15.6668 17.3336,28.0001 1.336,4.83279 2.00185,20.1645 2.00185,45.832l0 183.169c0,40.6641 -5.3354,70.1635 -15.8344,88.6655 -10.6665,18.3345 -28.4984,27.5018 -53.5,27.5018 -38.6666,0 -77.3332,-21.1697 -115.665,-63.5007l0 -235.836c0,-30.1652 1.66677,-48.8305 5.3311,-56.0002 4.50201,-9.49803 10.834,-16.5002 18.8328,-20.8304 7.9988,-4.33447 24.1682,-6.6671 48.4997,-6.6671l0 -17.5011 -221.165 0 0 17.5011 9.83311 0c22.669,0 38.1683,5.83371 46.1671,17.3336 7.83126,11.6674 11.835,33.6663 11.835,66.1641l0 166.166c0,53.6675 -1.16846,86.3329 -3.66862,98.0003 -2.33262,11.835 -6.16449,19.8338 -11.1648,24.0007 -5.00032,4.16694 -11.835,6.33202 -20.3364,6.33202 -8.99972,0 -19.997,-2.49587 -32.6653,-7.33295l-7.33295 17.6687 134.833 54.6642 21.0022 0 0 -94.83z" />
</glyph>
<glyph
id="glyph3637"
horiz-adv-x="777"
unicode="m">
<path
id="path3639"
d="M164.001 365.165c32.6653,32.6696 51.8332,51.3349 57.6669,56.1677 14.6659,12.5008 30.5002,21.9988 47.3312,28.8335 17.0028,6.83463 33.6663,10.3314 50.334,10.3314 28.0001,0 52.1683,-8.16633 72.3328,-24.499 20.1688,-16.1651 33.6663,-39.8307 40.5009,-70.8336 33.4987,39.1692 61.8339,64.8367 85.0012,77.0024 22.9998,12.1657 46.8329,18.3302 71.1644,18.3302 23.8332,0 44.8354,-6.16449 63.3331,-18.3302 18.3345,-12.1657 32.8329,-32.167 43.6669,-59.8363 7.16541,-18.8328 10.6665,-48.4997 10.6665,-88.833l0 -192.5c0,-28.0001 2.16938,-47.1637 6.33632,-57.4994 3.32925,-7.16541 9.3305,-13.3342 18.1627,-18.3345 8.83648,-5.00032 22.9998,-7.66372 43.0011,-7.66372l0 -17.5011 -220.83 0 0 17.5011 9.3305 0c19.1679,0 34.1689,3.83186 44.9986,11.3323 7.50048,5.16786 12.8359,13.5017 16.0019,24.8341 1.3317,5.49864 2.00185,21.333 2.00185,47.3312l0 192.5c0,36.5015 -4.33447,62.169 -13.1667,77.1699 -12.6683,20.8304 -33.0004,31.1661 -61.0005,31.1661 -17.3336,0 -34.6672,-4.33447 -52.0008,-12.8359 -17.5011,-8.66465 -38.499,-24.6665 -63.3331,-48.1646l-1.00092 -5.3354 1.00092 -20.9979 0 -213.502c0,-30.5002 1.83431,-49.5006 5.16786,-56.9968 3.49679,-7.50048 9.83311,-13.8368 19.3311,-18.8371 9.33479,-5.00032 25.4999,-7.66372 48.3322,-7.66372l0 -17.5011 -226.166 0 0 17.5011c24.8341,0 41.8326,2.99847 51.1674,8.83218 9.16726,5.83371 15.6668,14.6659 19.1679,26.3333 1.66677,5.66617 2.50016,21.6681 2.50016,48.3322l0 192.5c0,36.5015 -5.3354,62.6673 -16.1694,78.5016 -14.3308,20.8347 -34.3321,31.3336 -59.9996,31.3336 -17.6644,0 -34.998,-4.66525 -52.3316,-14.1676 -26.9992,-14.3308 -47.8338,-30.5002 -62.4997,-48.3322l0 -239.835c0,-29.1643 2.16509,-48.3322 6.16449,-56.9968 3.9994,-8.83648 10.1682,-15.5036 17.9994,-19.8338 8.00309,-4.33447 24.1682,-6.6671 48.6672,-6.6671l0 -17.5011 -221.165 0 0 17.5011c20.4996,0 34.8347,2.33262 43.0011,6.6671 7.9988,4.33018 14.3308,11.3323 18.4978,20.9979 4.16694,9.66557 6.33632,28.1676 6.33632,55.8326l0 171.003c0,49.1655 -1.50353,80.83 -4.33447,95.1651 -2.33262,10.834 -6.00125,18.167 -10.834,22.1664 -4.83279,4.16694 -11.4999,6.16449 -20.0013,6.16449 -9.16726,0 -19.997,-2.49587 -32.6653,-7.33295l-7.33295 17.6687 134.665 54.6642 21.0022 0 0 -95.3326z" />
</glyph>
<glyph
id="glyph3641"
horiz-adv-x="277"
unicode="l">
<path
id="path3643"
d="M184.999 694.332l0 -593.333c0,-28.0001 2.16938,-46.4978 6.16878,-55.6651 3.9994,-8.99972 10.3314,-16.0019 18.8328,-20.6671 8.50141,-4.66525 24.1639,-7.16541 47.3312,-7.16541l0 -17.5011 -219.164 0 0 17.5011c20.4996,0 34.4996,2.16509 41.8326,6.49956 7.50048,4.16694 13.4974,11.1648 17.6644,20.9979 4.16694,9.66987 6.33632,28.3352 6.33632,56.0002l0 406.336c0,50.4972 -1.16846,81.5001 -3.33355,93 -2.33262,11.4999 -6.00125,19.4987 -11.0016,23.6656 -5.16786,4.33447 -11.4999,6.33202 -19.3311,6.33202 -8.50141,0 -19.1679,-2.50016 -32.167,-7.83126l-8.33387 17.1661 133.333 54.6642 21.8313 0z" />
</glyph>
<glyph
id="glyph3645"
horiz-adv-x="499"
unicode="k">
<path
id="path3647"
d="M163.499 694.332l0 -445.334 113.835 104.002c24.1682,22.1664 38.1683,36.1664 42.0001,42.0001 2.6677,3.9994 3.83186,7.83556 3.83186,11.6674 0,6.6671 -2.6634,12.1657 -7.9988,16.9985 -5.3311,4.66954 -14.1676,7.33295 -26.6684,8.00309l0 15.6625 194.334 0 0 -15.6625c-26.6641,-0.670146 -48.8305,-4.66954 -66.4991,-12.17 -17.8319,-7.50048 -37.3306,-20.8304 -58.5003,-40.1658l-114.664 -105.832 114.664 -145.001c31.9995,-40.1658 53.5,-65.5025 64.5016,-76.3322 15.6668,-15.1685 29.3318,-25.1691 40.9992,-29.6669 8.16633,-3.33355 22.3339,-5.00032 42.4984,-5.00032l0 -17.5011 -217.334 0 0 17.5011c12.5008,0.330777 20.8347,2.33262 25.1691,5.66617 4.49771,3.50108 6.6671,8.16633 6.6671,14.4984 0,7.50048 -6.49956,19.503 -19.503,35.9989l-137.333 175.333 0 -148.33c0,-29.001 2.16938,-48.1689 6.16878,-57.1686 3.9994,-9.16726 9.83311,-15.6668 17.3336,-19.4987 7.50048,-3.9994 23.8332,-6.16878 48.8305,-6.49956l0 -17.5011 -227.497 0 0 17.5011c22.8322,0 39.8307,2.83094 51.1674,8.33387 6.83034,3.66433 12.1657,9.16296 15.6668,16.6634 4.83279,10.6665 7.33295,29.3361 7.33295,55.6694l0 407.165c0,51.8332 -1.16846,83.5019 -3.33355,95.0018 -2.33262,11.4999 -6.16878,19.4987 -11.3323,23.9964 -5.16786,4.33447 -12.0025,6.50386 -20.5039,6.50386 -6.83034,0 -16.9985,-2.6677 -30.6635,-8.33387l-8.33387 17.1661 132.831 54.6642 22.3339 0z" />
</glyph>
<glyph
id="glyph3649"
horiz-adv-x="277"
unicode="j">
<path
id="path3651"
d="M144.498 694.834c14,0 25.835,-4.83279 35.6681,-14.6659 9.83311,-9.83311 14.6659,-21.6681 14.6659,-35.6681 0,-13.665 -4.83279,-25.3324 -14.6659,-35.1655 -9.83311,-9.66987 -21.6681,-14.6702 -35.6681,-14.6702 -13.665,0 -25.3324,5.00032 -35.1655,14.6702 -9.66557,9.83311 -14.6659,21.5005 -14.6659,35.1655 0,14 5.00032,25.835 14.6659,35.6681 9.83311,9.83311 21.5005,14.6659 35.1655,14.6659zm42.0001 -234.336l0 -450.166c0,-76.4998 -16.3327,-133.333 -48.8305,-170.496 -32.5021,-37.1673 -74.833,-55.6694 -127.001,-55.6694 -29.4993,0 -51.4982,5.3354 -65.8333,16.1694 -14.3351,10.6665 -21.5005,21.8313 -21.5005,33.1636 0,11.3366 3.9994,21.1697 12.0025,29.3361 7.9988,8.16633 17.3336,12.1657 28.0001,12.1657 8.49711,0 17.1661,-2.16509 25.9982,-6.33202 5.49864,-2.33692 16.1651,-10.5033 31.8319,-24.6665 15.8344,-14.1676 29.1685,-21.1697 39.835,-21.1697 7.83126,0 15.4993,3.00277 22.9998,8.99972 7.50048,6.00125 12.9991,16.0019 16.6677,30.1695 3.49679,14.1633 5.3311,44.8311 5.3311,92.1666l0 318.332c0,49.1655 -1.49924,80.6667 -4.49771,94.6668 -2.16938,10.834 -5.83371,18.167 -10.6665,22.1664 -4.83279,4.16694 -11.4999,6.16449 -20.0013,6.16449 -9.16726,0 -20.1688,-2.49587 -33.1679,-7.33295l-6.83034 17.6687 134.665 54.6642 20.9979 0z" />
</glyph>
<glyph
id="glyph3653"
horiz-adv-x="277"
unicode="i">
<path
id="path3655"
d="M145.001 694.332c13.665,0 25.3324,-4.83279 34.998,-14.3308 9.50233,-9.66557 14.3351,-21.333 14.3351,-35.0023 0,-13.665 -4.83279,-25.3324 -14.3351,-35.1655 -9.66557,-9.66557 -21.333,-14.6659 -34.998,-14.6659 -13.6693,0 -25.3324,5.00032 -35.1655,14.6659 -9.66987,9.83311 -14.6702,21.5005 -14.6702,35.1655 0,13.6693 4.83279,25.3367 14.5027,35.0023 9.49803,9.49803 21.333,14.3308 35.333,14.3308zm40.5009 -233.834l0 -359.499c0,-28.0001 1.99755,-46.4978 6.16449,-55.8326 3.9994,-9.33479 10.0006,-16.1651 17.9994,-20.8347 8.00309,-4.49771 22.669,-6.83034 43.8344,-6.83034l0 -17.5011 -217.334 0 0 17.5011c21.8356,0 36.5015,2.16509 43.8344,6.49956 7.50048,4.16694 13.4974,11.1648 17.8319,20.9979 4.50201,9.66987 6.6671,28.3352 6.6671,56.0002l0 172.503c0,48.4997 -1.49924,79.8333 -4.33447,94.1641 -2.33262,10.5033 -5.99695,17.6687 -10.834,21.6681 -4.83279,4.16694 -11.4999,6.16449 -19.997,6.16449 -9.16726,0 -20.1688,-2.49587 -33.1679,-7.33295l-6.83463 17.6687 134.669 54.6642 21.5005 0z" />
</glyph>
<glyph
id="glyph3657"
horiz-adv-x="499"
unicode="h">
<path
id="path3659"
d="M162.665 694.332l0 -327.165c36.0032,39.6675 64.6691,65.1674 85.8346,76.4998 21.1655,11.1648 42.3352,16.831 63.5007,16.831 25.3324,0 47.168,-6.99787 65.4982,-20.9979 18.167,-14 31.6687,-35.9989 40.5009,-66.0008 6.16878,-20.8304 9.16726,-58.8311 9.16726,-114.165l0 -158.335c0,-28.1633 2.33262,-47.6663 6.99787,-57.9977 3.17031,-7.83556 8.66894,-14 16.5002,-18.6696 7.83556,-4.49771 22.1707,-6.83034 43.0011,-6.83034l0 -17.5011 -219.666 0 0 17.5011 10.1682 0c20.8304,0 35.333,3.33355 43.4994,9.66557 8.16633,6.33202 13.8325,15.6668 16.9985,28.0001 1.00092,5.16786 1.49924,20.4996 1.49924,45.832l0 158.335c0,48.8348 -2.50016,80.8342 -7.49619,96.166 -5.16786,15.3317 -13.1667,26.6684 -24.1682,34.3321 -11.1691,7.66802 -24.499,11.4999 -40.1658,11.4999 -15.8344,0 -32.5021,-4.16694 -49.6681,-12.664 -17.3336,-8.50141 -38.0007,-25.4999 -62.0014,-51.3349l0 -236.334c0,-30.5002 1.66677,-49.5006 5.00032,-56.9968 3.50108,-7.50048 9.83311,-13.8368 19.1679,-18.8371 9.16726,-5.00032 25.1649,-7.66372 48.0014,-7.66372l0 -17.5011 -221.668 0 0 17.5011c19.8338,0 35.5006,3.16601 46.8329,9.3305 6.49956,3.33355 11.835,9.50233 15.6668,18.5021 3.9994,9.16726 5.83371,27.665 5.83371,55.6651l0 404.833c0,51.1674 -1.16846,82.501 -3.66862,94.336 -2.33262,11.6674 -6.16449,19.6662 -11.1648,23.8332 -5.00032,4.33447 -11.835,6.33202 -20.3321,6.33202 -6.83463,0 -17.8362,-2.50016 -33.1679,-7.83126l-6.83463 17.1661 133.836 54.6642 22.4972 0z" />
</glyph>
<glyph
id="glyph3661"
horiz-adv-x="499"
unicode="g">
<path
id="path3663"
d="M150.834 163.168c-27.3342,13.3342 -48.3364,31.8319 -63.0023,55.8326 -14.6659,24.0007 -21.8313,50.334 -21.8313,79.335 0,44.3328 16.6677,82.3292 49.9989,114.333 33.3355,31.8319 76.0015,47.8295 128.165,47.8295 42.666,0 79.5025,-10.499 110.836,-31.3293l94.6668 0c14,0 22.1664,-0.335073 24.499,-1.16846 2.16509,-0.833387 3.83186,-2.16509 4.83279,-4.16694 2.00185,-2.99847 2.99847,-8.16633 2.99847,-15.6668 0,-8.50141 -0.833387,-14.3351 -2.50016,-17.5011 -0.996628,-1.66677 -2.6634,-2.99847 -5.16356,-3.9994 -2.33262,-1.00092 -10.6665,-1.3317 -24.6665,-1.3317l-58.002 0c18.167,-23.5024 27.3342,-53.5 27.3342,-90.0015 0,-41.6651 -16.0019,-77.1656 -47.8338,-106.832 -31.9995,-29.6669 -74.833,-44.5003 -128.501,-44.5003 -22.1664,0 -44.6678,3.33355 -67.8308,9.83311 -14.3351,-12.3333 -24.0007,-23.1673 -29.001,-32.4978 -5.16786,-9.33479 -7.66802,-17.1704 -7.66802,-23.6699 0,-5.49864 2.6677,-10.834 7.9988,-16.1651 5.50293,-5.16786 16.0019,-8.83218 31.5012,-11.1648 9.16726,-1.336 31.9995,-2.50016 68.501,-3.50108 67.0017,-1.49924 110.501,-3.83616 130.335,-6.83463 30.1652,-4.16694 54.3334,-15.3317 72.4961,-33.6663 18.0037,-18.167 27.0035,-40.6684 27.0035,-67.3325 0,-36.8323 -17.1661,-71.3362 -51.67,-103.499 -50.8323,-47.5031 -116.996,-71.3362 -198.664,-71.3362 -62.8348,0 -116,14.1676 -159.336,42.5027 -24.3315,16.3327 -36.4972,33.1636 -36.4972,50.8323 0,7.83126 1.66677,15.4993 5.3311,23.3305 5.50293,12.17 17.0028,28.8335 34.1689,50.334 2.33262,3.00277 18.8328,20.4996 49.8314,52.6666 -16.9985,10.1682 -28.8335,19.1679 -35.8313,27.1667 -7.00217,8.00309 -10.499,17.0028 -10.499,27.1667 0,11.3366 4.49771,24.6665 13.8325,40.0026 9.3305,15.3317 30.6635,36.9998 64.1665,64.9999zm84.9969 273.832c-23.9964,0 -44.3328,-9.66557 -60.4979,-28.8335 -16.3327,-19.1679 -24.499,-48.6672 -24.499,-88.3347 0,-51.4982 11.1648,-91.3332 33.3312,-119.664 16.8353,-21.5005 38.3358,-32.167 64.334,-32.167 24.8341,0 45.1661,9.16726 61.0005,27.8325 16.0019,18.5021 24.0007,47.6663 24.0007,87.3338 0,51.8332 -11.1691,92.3341 -33.6663,121.666 -16.6677,21.5005 -38.0007,32.167 -64.0033,32.167zm-89.8297 -437c-15.336,-16.6677 -26.8359,-31.9995 -34.6672,-46.3346 -7.83556,-14.3308 -11.6674,-27.4975 -11.6674,-39.6675 0,-15.4993 9.33479,-29.1643 28.3309,-40.9992 32.5021,-20.1645 79.5025,-30.1652 141.001,-30.1652 58.6679,0 101.832,10.3314 129.669,30.9986 27.8325,20.6671 41.8326,42.666 41.8326,66.1684 0,16.831 -8.33387,28.8335 -25.0016,35.9989 -16.831,7.16541 -50.4972,11.4999 -100.5,12.8359 -73.3338,1.83001 -129.665,5.66617 -168.997,11.1648z" />
</glyph>
<glyph
id="glyph3665"
horiz-adv-x="332"
unicode="f">
<path
id="path3667"
d="M206.001 412.166l0 -294.001c0,-41.6651 4.66525,-67.9984 13.665,-79.1632 12.1657,-14.3351 28.1676,-21.5005 48.3322,-21.5005l40.6684 0 0 -17.5011 -267.165 0 0 17.5011 19.997 0c12.9991,0 25.0016,3.33355 35.6681,9.83311 10.6665,6.49956 18.167,15.3317 22.1664,26.3333 4.16694,11.1648 6.16878,32.6653 6.16878,64.4973l0 294.001 -87.003 0 0 35.1655 87.003 0 0 29.1685c0,44.6678 7.16541,82.501 21.4962,113.332 14.3351,31.0029 36.1664,56.0002 65.67,75.0005 29.4993,19.0004 62.4997,28.5027 99.332,28.5027 34.1646,0 65.6657,-11.0016 94.3317,-33.1679 18.8328,-14.6659 28.1676,-31.1661 28.1676,-49.3331 0,-9.83311 -4.16694,-19.0004 -12.6683,-27.5018 -8.49711,-8.66465 -17.4968,-12.9991 -27.3299,-12.9991 -7.50048,0 -15.336,2.6677 -23.6699,7.9988 -8.32957,5.3354 -18.4978,17.0028 -30.5002,34.6672 -11.9982,17.8362 -23.163,29.6669 -33.1636,35.9989 -10.1682,6.16878 -21.333,9.16726 -33.6663,9.16726 -15.001,0 -27.6693,-3.9994 -38.1683,-11.9982 -10.3314,-7.83556 -17.8319,-20.3321 -22.5014,-36.9998 -4.49771,-16.8353 -6.83034,-59.9996 -6.83034,-129.669l0 -32.167 115.334 0 0 -35.1655 -115.334 0z" />
</glyph>
<glyph
id="glyph3669"
horiz-adv-x="443"
unicode="e">
<path
id="path3671"
d="M106.502 278.832c-0.335073,-66.4991 15.6668,-118.5 48.3322,-156.333 32.4978,-37.6657 70.8336,-56.4985 114.668,-56.4985 29.3318,0 54.8317,7.9988 76.4998,24.1639 21.6638,16.0019 39.6632,43.6669 54.3334,82.6686l15.1642 -9.66557c-6.83463,-44.6678 -26.6641,-85.3363 -59.5013,-121.833 -32.9961,-36.669 -74.1629,-54.9992 -123.496,-54.9992 -53.8351,0 -99.8346,20.8304 -138.003,62.663 -38.3315,41.8369 -57.3319,98.1678 -57.3319,168.834 0,76.4998 19.4987,136.169 58.8311,178.835 39.1692,42.8335 88.3347,64.334 147.668,64.334 50.1665,0 91.3332,-16.5002 123.5,-49.6681 32.167,-33.0004 48.3322,-77.1656 48.3322,-132.5l-308.998 0zm0 28.3352l206.998 0c-1.66677,28.6659 -5.00032,48.8305 -10.3314,60.4979 -8.00309,18.167 -20.1688,32.5021 -36.334,43.0011 -16.1694,10.3314 -33.0004,15.6668 -50.5015,15.6668 -26.9992,0 -51.1674,-10.499 -72.5004,-31.5012 -21.333,-20.9979 -33.8338,-50.334 -37.3306,-87.6646z" />
</glyph>
<glyph
id="glyph3673"
horiz-adv-x="499"
unicode="d">
<path
id="path3675"
d="M347.166 50.334c-21.8313,-22.8322 -43.1643,-39.1692 -63.999,-49.1655 -20.8347,-9.83311 -43.3318,-14.8334 -67.3325,-14.8334 -48.8348,0 -91.5007,20.4996 -128.002,61.3313 -36.334,40.8317 -54.6642,93.3351 -54.6642,157.334 0,64.1665 20.1645,122.834 60.6654,176.167 40.3334,53.1649 92.1666,79.8333 155.667,79.8333 39.3324,0 71.9978,-12.6683 97.6652,-37.6657l0 82.4967c0,51.1674 -1.16416,82.501 -3.66433,94.336 -2.50016,11.6674 -6.33632,19.6662 -11.4999,23.8332 -5.16786,4.33447 -11.6674,6.33202 -19.503,6.33202 -8.49711,0 -19.6662,-2.50016 -33.6663,-7.83126l-6.33202 17.1661 133.333 54.6642 21.8313 0 0 -517.164c0,-52.3358 1.336,-84.3353 3.66862,-95.8352 2.50016,-11.6674 6.33202,-19.6662 11.835,-24.1639 5.3311,-4.66954 11.6631,-6.83463 18.6653,-6.83463 8.83218,0 20.6671,2.6677 35.1655,8.33387l5.49864 -17.1661 -132.831 -55.1668 -22.5014 0 0 63.999zm0 34.1646l0 230.5c-1.99755,22.0031 -7.83126,42.3352 -17.5011,60.5022 -9.83311,18.167 -22.8322,31.9995 -38.8298,41.1667 -16.1694,9.3305 -31.8362,14 -47.168,14 -28.6659,0 -54.1659,-12.8359 -76.6673,-38.499 -29.6669,-34.0013 -44.5003,-83.3344 -44.5003,-148.502 0,-65.8333 14.3351,-116.167 43.0011,-151.165 28.6659,-35.0023 60.4979,-52.5034 95.6677,-52.5034 29.6669,0 58.3328,14.8334 85.9978,44.5003z" />
</glyph>
<glyph
id="glyph3677"
horiz-adv-x="443"
unicode="c">
<path
id="path3679"
d="M411.165 169.998c-11.9982,-58.9986 -35.6638,-104.332 -70.8336,-135.997 -35.1655,-31.8362 -73.9996,-47.6663 -116.666,-47.6663 -50.8323,0 -95.1651,21.333 -132.831,63.999 -37.8332,42.666 -56.6703,100.165 -56.6703,172.833 0,70.331 21.0022,127.5 62.8348,171.334 41.8326,43.9977 91.9991,65.9965 150.499,65.9965 44.002,0 80.1684,-11.6631 108.499,-34.998 28.3352,-23.1673 42.5027,-47.3312 42.5027,-72.5004 0,-12.3333 -3.9994,-22.3339 -12.0025,-29.9976 -7.9988,-7.66802 -19.1636,-11.4999 -33.4987,-11.4999 -19.1679,0 -33.6663,6.16449 -43.4994,18.4978 -5.49864,6.83463 -9.16726,20.0013 -10.834,39.1649 -1.83431,19.1679 -8.50141,33.8338 -19.8338,44.002 -11.4999,9.66557 -27.1667,14.4984 -47.3312,14.4984 -32.6696,0 -58.8354,-11.9982 -78.6692,-35.9989 -26.3333,-31.9995 -39.5,-74.1671 -39.5,-126.499 0,-53.3325 13.0034,-100.5 39.3367,-141.332 26.1658,-40.836 61.4988,-61.3356 106.167,-61.3356 31.8319,0 60.4979,10.834 85.8303,32.6653 17.9994,15.001 35.333,42.1677 52.3358,81.6676l14.1633 -6.83463z" />
</glyph>
<glyph
id="glyph3681"
horiz-adv-x="499"
unicode="b">
<path
id="path3683"
d="M153.833 370.166c43.3318,60.1671 90.0015,90.3323 140.168,90.3323 45.832,0 85.8346,-19.6662 119.999,-58.8311 34.1646,-39.3324 51.3349,-92.8324 51.3349,-160.998 0,-79.335 -26.3333,-143.334 -79.1675,-191.834 -45.1661,-41.6694 -95.6677,-62.4997 -151.333,-62.4997 -26.0025,0 -52.5034,4.66525 -79.335,14.1633 -26.8316,9.50233 -54.3334,23.6699 -82.3335,42.5027l0 463.333c0,50.8323 -1.16416,81.9984 -3.66433,93.8334 -2.33692,11.6674 -6.16878,19.6662 -11.3366,23.8332 -5.3311,4.33447 -11.8307,6.33202 -19.6662,6.33202 -8.99972,0 -20.4996,-2.50016 -34.1646,-7.83126l-6.83463 17.1661 134.334 54.6642 21.9988 0 0 -324.166zm0 -31.3336l0 -267.5c16.5002,-16.3327 33.6663,-28.6659 51.5025,-36.8323 17.6644,-8.33387 35.8313,-12.5008 54.4966,-12.5008 29.4993,0 57.1686,16.3327 82.6686,48.8348 25.4999,32.4978 38.3315,79.8333 38.3315,141.998 0,57.3362 -12.8316,101.334 -38.3315,132.169 -25.4999,30.6678 -54.5009,46.1671 -87.1663,46.1671 -17.1661,0 -34.4996,-4.50201 -51.6657,-13.1667 -13.0034,-6.49956 -29.6669,-19.6662 -49.8357,-39.1692z" />
</glyph>
<glyph
id="glyph3685"
horiz-adv-x="443"
unicode="a">
<path
id="path3687"
d="M284.666 64.5016c-45.832,-35.5006 -74.6655,-56.0002 -86.5004,-61.5031 -17.5011,-8.16633 -36.1664,-12.3333 -56.0002,-12.3333 -30.9986,0 -56.4985,10.6665 -76.4998,31.8362 -19.997,21.1655 -29.9976,48.998 -29.9976,83.4976 0,21.8356 4.83279,40.6684 14.6659,56.666 13.3342,22.0031 36.4972,42.8335 69.4976,62.4997 33.0004,19.503 87.9997,43.1686 164.835,71.1687l0 17.6644c0,44.5003 -6.99787,75.1681 -21.1655,91.8358 -14.1676,16.5002 -34.8347,24.8341 -61.8339,24.8341 -20.4996,0 -36.8323,-5.50293 -48.8348,-16.6677 -12.3333,-11.0016 -18.4978,-23.6656 -18.4978,-38.0007l1.00092 -28.3309c0,-15.001 -3.83616,-26.5008 -11.4999,-34.6672 -7.66802,-8.16633 -17.6687,-12.17 -30.0019,-12.17 -12.1657,0 -21.9988,4.16694 -29.6669,12.6683 -7.66802,8.50141 -11.4999,20.0013 -11.4999,34.6672 0,28.0001 14.3351,53.6675 43.0011,77.1656 28.6659,23.3348 68.8318,35.1655 120.665,35.1655 39.6675,0 72.1653,-6.6628 97.6652,-19.997 19.1679,-10.1682 33.3355,-26.0025 42.5027,-47.4988 5.83371,-14 8.66465,-42.5027 8.66465,-85.8346l0 -151.835c0,-42.666 0.833387,-68.8318 2.50016,-78.4973 1.66677,-9.50233 4.33447,-16.0019 8.00309,-19.1679 3.83186,-3.33355 8.16633,-5.00032 12.9991,-5.00032 5.16356,0 9.83311,1.16846 13.665,3.50108 6.83463,4.16694 20.0013,16.1651 39.5,35.6638l0 -27.3299c-36.334,-48.8348 -71.1644,-73.3338 -104.5,-73.3338 -15.8344,0 -28.4984,5.49864 -38.0007,16.6634 -9.49803,11.0016 -14.3308,30.0019 -14.6659,56.6703zm0 31.6644l0 170.501c-49.1655,-19.6662 -80.8342,-33.4987 -95.1651,-41.5018 -25.835,-14.3308 -44.1695,-29.3318 -55.1668,-44.9986 -11.1691,-15.6668 -16.6677,-32.6653 -16.6677,-51.3349 0,-23.3305 7.00217,-42.8292 21.0022,-58.3328 14,-15.3317 30.1652,-23.1673 48.3322,-23.1673 24.8341,0 57.3319,16.337 97.6652,48.8348z" />
</glyph>
<glyph
id="glyph3689"
horiz-adv-x="541"
unicode="~">
<path
id="path3691"
d="M508.834 329.665l21.9988 0c-1.3317,-42.3309 -13.3342,-75.4989 -36.1664,-99.4995 -22.8322,-23.8332 -50.6648,-35.8313 -83.5019,-35.8313 -14.9967,0 -31.1661,2.50016 -48.3322,7.50048 -17.3336,5.16356 -61.8339,22.3339 -133.832,51.6657 -50.1665,20.8347 -85.8346,31.1661 -107,31.1661 -22.669,0 -42.0001,-6.99787 -57.4994,-20.9979 -15.6668,-14 -26.6684,-36.8366 -33.1679,-68.3334l-21.5005 0c1.83431,43.9977 14,77.5007 35.9989,100.831 22.1664,23.3348 48.1689,34.8347 78.1665,34.8347 14.3351,0 29.001,-2.16938 44.002,-6.83463 33.8338,-9.66557 78.3341,-26.3333 133.501,-49.9989 55.1668,-23.6656 93.9966,-35.333 116.498,-35.333 24.3358,0 44.8354,7.83126 61.4988,23.3305 16.6677,15.6668 26.3333,38.1683 29.3361,67.5001z" />
</glyph>
<glyph
id="glyph3693"
horiz-adv-x="443"
unicode="z">
<path
id="path3695"
d="M420.001 137.165l-5.50293 -137.165 -394.497 0 0 17.5011 296.832 395.666 -146.5 0c-31.5012,0 -52.1683,-2.16509 -62.0014,-6.16878 -9.66557,-4.16264 -17.6644,-11.8307 -23.8332,-23.163 -8.83218,-16.337 -13.8325,-36.5015 -15.1642,-60.6697l-19.503 0 2.83523 124.166 374.998 0 0 -18.1627 -299.667 -396.503 163 0c34.1689,0 57.3362,2.83523 69.6694,8.66894 12.1657,5.66617 21.9988,15.6668 29.4993,29.9976 5.16786,10.3357 9.49803,32.3346 13.1667,65.8333l16.6677 0z" />
</glyph>
<glyph
id="glyph3697"
horiz-adv-x="499"
unicode="y">
<path
id="path3699"
d="M5.83371 447.331l208.501 0 0 -18.1627 -10.1682 0c-14.6659,0 -25.6675,-3.17031 -33.0004,-9.50233 -7.33295,-6.33202 -11.0016,-14.1676 -11.0016,-23.6656 0,-12.6683 5.3354,-30.3327 16.1694,-52.6666l108.834 -225.667 100.165 247c5.49864,13.5017 8.16633,26.6684 8.16633,39.6675 0,5.83371 -1.16846,10.1639 -3.33355,13.1667 -2.6677,3.49679 -6.6671,6.33202 -12.1657,8.49711 -5.66617,2.16938 -15.336,3.17031 -29.3361,3.17031l0 18.1627 145.503 0 0 -18.1627c-12.0025,-1.336 -21.333,-3.83616 -27.8368,-7.83556 -6.49956,-3.83186 -13.665,-11.1648 -21.4962,-21.9988 -3.00277,-4.50201 -8.50141,-17.0028 -16.6677,-37.5024l-182.001 -446.33c-17.6687,-43.3361 -40.6684,-76.0015 -69.1668,-98.1678 -28.4984,-22.1664 -55.8326,-33.1679 -82.3335,-33.1679 -19.1679,0 -34.998,5.50293 -47.3355,16.6677 -12.3333,11.0016 -18.4978,23.6656 -18.4978,38.0007 0,13.665 4.49771,24.6665 13.3342,33.0004 8.99972,8.33387 21.333,12.5008 36.9998,12.5008 10.6665,0 25.3324,-3.66862 43.8344,-10.834 12.9991,-4.83279 21.1655,-7.33295 24.499,-7.33295 9.66557,0 20.3321,5.16356 31.9995,15.1642 11.4999,10.1682 23.1673,29.6669 34.8347,58.6679l31.8319 77.5007 -160.668 337.5c-5.00032,10.0006 -12.664,22.6647 -23.4981,37.4981 -8.16633,11.4999 -14.8334,19.1679 -20.0013,22.9998 -7.50048,5.16786 -19.4987,9.83311 -36.1664,13.6693l0 18.1627z" />
</glyph>
<glyph
id="glyph3701"
horiz-adv-x="499"
unicode="x">
<path
id="path3703"
d="M13.1667 447.331l210.499 0 0 -18.1627c-13.3342,0 -22.6647,-2.16938 -28.1676,-6.83463 -5.3311,-4.50201 -7.9988,-10.499 -7.9988,-17.9994 0,-7.83556 5.66617,-19.8338 17.1661,-36.1664 3.50108,-5.16786 8.83648,-13.3342 16.0019,-24.3358l31.8319 -50.8323 36.5015 50.8323c23.4981,32.167 35.1655,52.4991 35.1655,61.0005 0,6.83463 -2.6677,12.5008 -8.16633,17.3336 -5.66617,4.66525 -14.4984,7.00217 -26.9992,7.00217l0 18.1627 151.5 0 0 -18.1627c-16.0019,-1.00092 -29.8344,-5.3354 -41.5018,-13.1667 -15.9976,-11.0016 -37.8332,-35.1698 -65.4982,-72.1696l-61.0005 -81.6676 111.334 -160.165c27.3299,-39.3324 46.8329,-62.998 58.5003,-71.0011 11.8307,-7.9988 26.8316,-12.4965 45.4969,-13.4974l0 -17.5011 -210.997 0 0 17.5011c14.6659,0 25.9982,3.33355 34.1646,9.83311 6.16878,4.49771 9.33479,10.6665 9.33479,17.9994 0,7.50048 -10.499,26.5008 -31.3336,56.666l-65.335 95.8352 -71.8302 -95.8352c-22.1707,-29.4993 -33.1679,-47.168 -33.1679,-52.6666 0,-7.83126 3.66433,-14.8334 10.9973,-21.333 7.33724,-6.33202 18.3345,-9.83311 33.0004,-10.499l0 -17.5011 -145.997 0 0 17.5011c11.6674,1.66677 21.8313,5.83371 30.6635,12.3333 12.3376,9.3305 33.1679,33.4987 62.504,72.1653l93.8334 124.501 -85.0012 123.165c-24.1682,35.1655 -42.666,57.1686 -56.0002,66.1684 -13.1667,8.83218 -29.6669,13.3342 -49.5006,13.3342l0 18.1627z" />
</glyph>
<glyph
id="glyph3705"
horiz-adv-x="722"
unicode="w">
<path
id="path3707"
d="M6.33202 447.331l187.499 0 0 -18.1627c-17.1661,-1.336 -28.4984,-4.33447 -33.997,-9.16726 -5.3354,-5.00032 -7.9988,-12.0025 -7.9988,-21.0022 0,-10.1639 2.83094,-22.3339 8.32957,-36.6647l95.6677 -257.336 96.166 209.502 -25.3324 65.8333c-7.83126,19.4987 -17.9994,33.0004 -30.831,40.5009 -7.16971,4.66525 -20.5039,7.33295 -40.0026,8.33387l0 18.1627 212.999 0 0 -18.1627c-23.4981,-1.00092 -40.1658,-5.16786 -49.8314,-12.6683 -6.49956,-5.16786 -9.83311,-13.5017 -9.83311,-24.8341 0,-6.49956 1.3317,-13.1667 3.9994,-20.0013l101.501 -256.997 94.1641 247.666c6.49956,17.5011 9.83311,31.4969 9.83311,42.0001 0,6.16449 -3.16601,11.6674 -9.49803,16.5002 -6.33202,5.00032 -18.8328,7.66372 -37.3349,8.33387l0 18.1627 141.001 0 0 -18.1627c-28.3352,-4.16694 -49.1655,-23.3348 -62.4997,-57.5037l-149.335 -385.33 -19.997 0 -111.837 285.667 -130.331 -285.667 -18.167 0 -143.502 375.999c-9.49803,23.6656 -18.6653,39.8307 -27.8325,47.9971 -9.16726,8.33387 -23.4981,14.6702 -43.0011,18.8371l0 18.1627z" />
</glyph>
<glyph
id="glyph3709"
horiz-adv-x="499"
unicode="v">
<path
id="path3711"
d="M8.33387 447.331l210.499 0 0 -18.1627 -13.8325 0c-12.6683,0 -22.3339,-3.00277 -29.001,-9.16726 -6.6671,-6.33632 -10.0006,-14.5027 -10.0006,-25.0016 0,-11.3323 3.50108,-24.8341 10.3357,-40.5009l103.997 -247 104.5 256.335c7.50048,18.167 11.1691,31.9995 11.1691,41.5018 0,4.49771 -1.336,8.16633 -3.83186,11.1648 -3.66862,4.83279 -8.17063,8.16633 -13.6693,10.0006 -5.66617,1.83431 -16.831,2.6677 -33.8338,2.6677l0 18.1627 146.002 0 0 -18.1627c-16.8353,-1.336 -28.6659,-4.66954 -35.1655,-10.1682 -11.3366,-9.83311 -21.5005,-26.1658 -30.6678,-48.8348l-158.666 -383.831 -20.0013 0 -159.667 377.499c-7.16541,17.5011 -14,30.1652 -20.4996,37.8332 -6.6671,7.66802 -14.8334,14 -25.0016,19.1679 -5.49864,2.99847 -16.5002,5.83371 -32.6653,8.33387l0 18.1627z" />
</glyph>
<glyph
id="glyph3713"
horiz-adv-x="499"
unicode="u">
<path
id="path3715"
d="M423.335 447.331l0 -270.997c0,-51.8332 1.16416,-83.5019 3.66433,-95.0018 2.50016,-11.6674 6.33202,-19.6662 11.6674,-24.1639 5.49864,-4.66954 11.6674,-6.83463 18.8328,-6.83463 10.1682,0 21.5005,2.6677 34.1689,8.33387l6.83034 -17.1661 -133.832 -55.1668 -21.8356 0 0 94.6668c-38.499,-41.6694 -67.8308,-67.8351 -87.9997,-78.5016 -20.1645,-10.834 -41.4975,-16.1651 -63.8314,-16.1651 -25.1649,0 -46.8329,7.16541 -65.335,21.6638 -18.3302,14.5027 -31.1661,33.1679 -38.3315,56.0002 -7.16541,22.8322 -10.6665,54.9992 -10.6665,96.6686l0 199.665c0,21.1655 -2.33262,35.8356 -6.83463,44.002 -4.49771,8.16633 -11.3323,14.3308 -20.3321,18.8328 -8.83218,4.33447 -25.1691,6.33202 -48.4997,6.00125l0 18.1627 156.664 0 0 -299.332c0,-41.6651 7.33724,-68.9993 21.8356,-81.9984 14.4984,-13.1667 31.9995,-19.6662 52.4991,-19.6662 14,0 29.8344,4.49771 47.4988,13.1667 17.8362,8.83218 38.8341,25.6675 63.3331,50.334l0 253.5c0,25.3324 -4.66525,42.4984 -14,51.4982 -9.3305,8.83218 -28.4984,13.665 -57.8302,14.3351l0 18.1627 152.334 0z" />
</glyph>
<glyph
id="glyph3717"
horiz-adv-x="277"
unicode="t">
<path
id="path3719"
d="M161.166 594.166l0 -146.835 104.5 0 0 -34.1646 -104.5 0 0 -290.165c0,-29.001 4.16694,-48.504 12.5008,-58.5003 8.16633,-10.1682 18.8328,-15.1685 31.8319,-15.1685 10.834,0 21.1697,3.33355 31.3336,10.0006 10.0006,6.6671 17.8362,16.5002 23.5024,29.4993l19.0004 0c-11.4999,-31.8319 -27.5018,-55.8326 -48.3364,-71.9978 -20.8304,-16.1694 -42.3309,-24.1682 -64.4973,-24.1682 -15.001,0 -29.6669,4.16694 -44.002,12.5008 -14.3308,8.33387 -24.8341,20.1645 -31.6644,35.6638 -6.83463,15.336 -10.3357,39.1692 -10.3357,71.5037l0 300.831 -70.6661 0 0 16.0019c17.8319,7.16541 36.1664,19.3311 54.8317,36.3297 18.6696,17.1704 35.5006,37.5024 50.0032,60.8373 7.50048,12.3333 17.9994,34.998 31.3336,67.8308l15.1642 0z" />
</glyph>
<glyph
id="glyph3721"
horiz-adv-x="389"
unicode="s">
<path
id="path3723"
d="M320.334 460.498l0 -152.329 -16.1694 0c-12.3333,47.8295 -28.1633,80.3316 -47.4988,97.6652 -19.4987,17.1661 -44.1652,25.835 -73.9996,25.835 -22.8322,0 -41.1667,-6.00125 -55.1668,-18.167 -14,-12.0025 -20.9979,-25.3367 -20.9979,-40.0026 0,-18.167 5.16356,-33.8338 15.4993,-46.8329 10.1639,-13.3342 30.6678,-27.4975 61.6663,-42.4984l71.1644 -34.6672c66.1684,-32.167 99.1688,-74.6655 99.1688,-127.5 0,-40.6684 -15.3317,-73.3338 -46.1671,-98.3354 -30.6678,-24.8341 -65.1674,-37.3306 -103.168,-37.3306 -27.4975,0 -58.6636,4.83279 -93.8334,14.6659 -10.6665,3.16601 -19.4987,4.83279 -26.3333,4.83279 -7.50048,0 -13.3299,-4.16694 -17.6644,-12.6683l-16.0019 0 0 159.667 16.0019 0c9.16726,-45.4969 26.6641,-79.8333 52.3316,-103.001 25.6675,-23.163 54.5009,-34.6629 86.3329,-34.6629 22.5014,0 40.836,6.49956 54.9992,19.6662 14.1676,13.3299 21.1697,29.1643 21.1697,47.6663 0,22.4972 -7.83556,41.3343 -23.6656,56.666 -15.6668,15.3317 -47.168,34.6672 -94.5035,58.1653 -47.1637,23.3348 -77.999,44.5003 -92.6649,63.3331 -14.6659,18.6696 -21.9988,42.0001 -21.9988,70.3353 0,36.8323 12.664,67.6676 37.8332,92.3341 25.1649,24.6665 57.8302,37.163 97.8328,37.163 17.6644,0 38.9974,-3.83186 63.999,-11.3323 16.6677,-4.83279 27.665,-7.33295 33.1679,-7.33295 5.3311,0 9.3305,1.16846 12.3333,3.50108 2.83094,2.33262 6.33202,7.33295 10.1639,15.1642l16.1694 0z" />
</glyph>
<glyph
id="glyph3725"
horiz-adv-x="332"
unicode="r">
<path
id="path3727"
d="M162.167 460.498l0 -100.664c37.3349,67.165 75.8339,100.664 115.166,100.664 17.8319,0 32.6653,-5.49864 44.5003,-16.3327 11.6674,-10.9973 17.5011,-23.6656 17.5011,-37.8332 0,-12.8316 -4.16694,-23.4981 -12.6683,-32.3303 -8.50141,-8.83648 -18.4978,-13.1667 -30.3327,-13.1667 -11.3323,0 -24.1682,5.66617 -38.3315,16.831 -14.1676,11.1691 -24.6708,16.8353 -31.5012,16.8353 -5.83371,0 -12.1657,-3.16601 -19.0004,-9.66987 -14.6659,-13.3299 -29.8344,-35.333 -45.3337,-65.9965l0 -214.335c0,-24.6665 2.99847,-43.4994 9.16726,-56.1677 4.33447,-8.83218 11.8307,-16.1651 22.4972,-21.9988 10.834,-5.83371 26.1701,-8.83218 46.3346,-8.83218l0 -17.5011 -229.001 0 0 17.5011c22.8365,0 39.835,3.66433 50.8366,10.834 8.16633,5.16356 13.8325,13.4974 17.1661,24.8298 1.49924,5.67047 2.33262,21.333 2.33262,47.5031l0 173.332c0,52.0008 -1.00092,82.9993 -3.16601,93 -2.00185,9.83311 -6.00125,17.1661 -11.6674,21.6681 -5.66617,4.49771 -12.8316,6.83034 -21.333,6.83034 -10.0006,0 -21.333,-2.49587 -34.1689,-7.33295l-4.83279 17.6687 135.335 54.6642 20.4996 0z" />
</glyph>
<glyph
id="glyph3729"
horiz-adv-x="499"
unicode="q">
<path
id="path3731"
d="M427.167 460.498l0 -575.166c0,-28.6659 2.00185,-47.1637 6.00125,-55.33 3.83186,-8.00309 10.0006,-14.3351 18.3302,-19.0004 8.17063,-4.50201 24.3358,-6.83463 48.4997,-6.83463l0 -17.9994 -225.663 0 0 17.9994 9.3305 0c18.3345,0 32.167,2.6677 41.5018,7.83126 6.49956,3.66862 11.6674,10.0006 15.6668,19.3354 3.83186,9.16726 5.83371,27.1667 5.83371,53.9983l0 192.336c-29.6669,-35.1698 -55.5019,-59.1662 -77.6682,-72.0021 -22.1664,-12.8316 -44.9986,-19.3311 -68.8318,-19.3311 -43.3361,0 -82.0027,19.6662 -116,58.9986 -34.0013,39.5 -50.9998,92.1666 -50.9998,158.335 0,75.8296 22.4972,137.496 67.5001,185.33 44.8311,47.6663 98.9969,71.4995 162.498,71.4995 18.5021,0 35.6681,-2.6634 51.3349,-7.83126 15.4993,-5.16786 29.4993,-12.9991 42.0001,-23.4981 18.8328,9.16296 36.8323,19.4987 54.1659,31.3293l16.5002 0zm-80.4992 -352.166l0 210.001c0,24.499 -3.16601,43.6669 -9.50233,57.6669 -6.33202,14 -17.6644,25.835 -33.997,35.6681 -16.1694,9.66557 -34.6672,14.6659 -55.1668,14.6659 -36.334,0 -67.6676,-15.4993 -93.6701,-46.4978 -25.9982,-30.8353 -39.1649,-77.6682 -39.1649,-140.503 0,-60.3303 13.3342,-105.999 39.835,-137.333 26.4966,-31.1661 58.5003,-46.8329 95.9985,-46.8329 19.1679,0 36.334,4.16694 51.1674,12.5008 15.001,8.33387 29.8344,21.8313 44.5003,40.6641z" />
</glyph>
<glyph
id="glyph3733"
horiz-adv-x="499"
unicode="p">
<path
id="path3735"
d="M-1.00092 402.835l137.668 55.6651 18.6653 0 0 -104.5c22.9998,39.3324 46.1671,66.9974 69.5019,82.8318 23.3305,15.6668 47.8338,23.6656 73.5013,23.6656 44.9986,0 82.3292,-17.6644 112.331,-52.8299 36.8323,-43.0011 55.1668,-98.8337 55.1668,-168.001 0,-77.0024 -22.1664,-140.834 -66.4991,-191.335 -36.334,-41.3343 -82.3335,-61.9971 -137.668,-61.9971 -24.0007,0 -44.8311,3.33355 -62.4997,10.1639 -12.9991,5.00032 -27.665,14.6659 -43.8344,29.3361l0 -136.169c0,-30.6678 1.83431,-49.9989 5.50293,-58.3328 3.83186,-8.33387 10.3314,-15.001 19.6662,-19.8338 9.16726,-4.83279 25.9982,-7.33295 50.4972,-7.33295l0 -17.9994 -234.5 0 0 17.9994 12.3333 0c17.8362,-0.335073 33.1679,3.16601 45.8363,10.3314 6.16449,3.50108 10.9973,9.33479 14.4984,17.3336 3.33355,8.00309 5.00032,28.1676 5.00032,60.6697l0 423c0,28.8335 -1.16846,47.3312 -3.83186,55.1668 -2.6677,7.83126 -6.83463,13.665 -12.5008,17.4968 -5.66617,4.00369 -13.3342,5.83371 -23.1673,5.83371 -7.83556,0 -17.6687,-2.16509 -29.8344,-6.83034l-5.83371 15.6668zm156.333 -77.6682l0 -167c0,-36.1664 1.336,-59.832 4.33447,-71.3362 4.50201,-18.8328 15.6668,-35.333 33.4987,-49.6639 17.6687,-14.3351 40.0026,-21.5005 67.1693,-21.5005 32.4978,0 58.8311,12.6683 78.9999,38.0007 26.3333,33.1636 39.5,80.0009 39.5,140.164 0,68.3334 -14.8334,121 -44.8354,157.669 -20.8304,25.4999 -45.6645,38.1683 -74.1671,38.1683 -15.6668,0 -31.1661,-4.00369 -46.4978,-11.6674 -11.6674,-6.00125 -31.0029,-23.5024 -58.002,-52.8342z" />
</glyph>
<glyph
id="glyph3737"
horiz-adv-x="759"
unicode="®">
<path
id="path3739"
d="M379.835 677.166c58.3328,0 115.166,-14.8334 170.496,-44.6635 55.3343,-29.6669 98.5029,-72.3371 129.669,-127.835 30.9986,-55.5019 46.4978,-113.332 46.4978,-173.667 0,-59.832 -15.1642,-117.336 -45.832,-172.335 -30.6678,-54.9992 -73.3338,-97.6652 -128.501,-128.165 -54.9992,-30.5002 -112.331,-45.6688 -172.331,-45.6688 -59.8363,0 -117.168,15.1685 -172.004,45.6688 -54.9992,30.5002 -97.6652,73.1662 -128.165,128.165 -30.6678,54.9992 -45.9995,112.503 -45.9995,172.335 0,60.3346 15.4993,118.165 46.6654,173.667 31.0029,55.4976 74.3347,98.1678 129.669,127.835 55.3343,29.8301 112,44.6635 169.835,44.6635zm0 -29.6669c-53.0017,0 -104.835,-13.665 -155.169,-40.9992 -50.5015,-27.3342 -89.834,-66.3316 -118.165,-117.001 -28.3352,-50.6648 -42.5027,-103.499 -42.5027,-158.498 0,-54.6685 13.8325,-107 41.6694,-157.166 27.8325,-50.1665 66.8299,-89.1681 116.996,-117.168 50.1708,-28.0001 102.502,-42.0001 157.171,-42.0001 54.6642,0 107.163,14 157.497,42.0001 50.334,28.0001 89.3357,67.0017 117.168,117.168 27.8325,50.1665 41.8326,102.498 41.8326,157.166 0,54.9992 -14.1676,107.833 -42.4984,158.498 -28.3352,50.6691 -67.6676,89.6664 -118.169,117.001 -50.4972,27.3342 -102.335,40.9992 -155.83,40.9992zm-191.335 -103.499l188.5 0c47.168,0 83.1669,-10.6665 107.833,-31.9995 24.8341,-21.333 37.1673,-47.168 37.1673,-77.5007 0,-24.6665 -8.33387,-46.3346 -25.1691,-65.1674 -16.831,-18.6653 -44.5003,-33.0004 -83.3301,-43.1643l102.163 -145.503c12.3333,-17.3293 23.3348,-29.1643 33.1679,-35.6638 6.16878,-3.83616 14.8334,-6.33202 25.835,-7.33295l0 -16.0019 -89.834 0 -143.502 197.667 -37.1673 0 0 -150.834c2.00185,-10.834 6.6671,-18.6653 14,-23.4981 7.33724,-4.83279 21.8356,-7.33295 43.6669,-7.33295l0 -16.0019 -179.165 0 0 16.0019c15.4993,0 26.6684,1.83431 33.1679,5.66617 6.49956,3.66433 11.1648,9.16726 14.1676,16.3327 2.33262,5.16786 3.32925,20.3321 3.32925,45.3337l0 255.498c0,24.0007 -0.498314,38.1683 -1.3317,42.5027 -2.33262,7.50048 -6.49956,13.1667 -12.5008,17.3336 -5.99695,3.9994 -16.3327,6.00125 -30.9986,6.00125l0 17.6644zm115.665 -203.669c38.5033,0 66.5034,3.66862 84.3353,11.1691 17.6687,7.50048 31.3336,17.9994 40.6684,31.5012 9.49803,13.4974 14.1633,28.9967 14.1633,46.1671 0,26.3333 -9.16726,48.4997 -27.4975,66.4991 -18.5021,17.8319 -42.0001,26.8316 -70.6661,26.8316 -12.3333,0 -26.0025,-2.6677 -41.0035,-7.83126l0 -174.337z" />
</glyph>
<glyph
id="glyph3741"
horiz-adv-x="332"
unicode="­">
<path
id="path3743"
d="M40.5009 261.168l252.499 0 0 -73.6688 -252.499 0 0 73.6688z" />
</glyph>
<glyph
id="glyph3745"
horiz-adv-x="759"
unicode="©">
<path
id="path3747"
d="M379.835 677.166c58.3328,0 115.166,-14.8334 170.496,-44.6635 55.3343,-29.6669 98.5029,-72.3371 129.669,-127.835 30.9986,-55.5019 46.4978,-113.332 46.4978,-173.667 0,-59.832 -15.1642,-117.336 -45.832,-172.335 -30.6678,-54.9992 -73.3338,-97.6652 -128.501,-128.165 -54.9992,-30.5002 -112.331,-45.6688 -172.331,-45.6688 -59.8363,0 -117.168,15.1685 -172.004,45.6688 -54.9992,30.5002 -97.6652,73.1662 -128.165,128.165 -30.6678,54.9992 -45.9995,112.503 -45.9995,172.335 0,60.3346 15.4993,118.165 46.6654,173.667 31.0029,55.4976 74.3347,98.1678 129.669,127.835 55.3343,29.8301 112,44.6635 169.835,44.6635zm0 -29.6669c-53.0017,0 -104.835,-13.665 -155.169,-40.9992 -50.5015,-27.3342 -89.834,-66.3316 -118.165,-117.001 -28.3352,-50.6648 -42.5027,-103.499 -42.5027,-158.498 0,-54.6685 13.8325,-107 41.6694,-157.166 27.8325,-50.1665 66.8299,-89.1681 116.996,-117.168 50.1708,-28.0001 102.502,-42.0001 157.171,-42.0001 54.6642,0 107.163,14 157.497,42.0001 50.334,28.0001 89.3357,67.0017 117.168,117.168 27.8325,50.1665 41.8326,102.498 41.8326,157.166 0,54.9992 -14.1676,107.833 -42.4984,158.498 -28.3352,50.6691 -67.6676,89.6664 -118.169,117.001 -50.4972,27.3342 -102.335,40.9992 -155.83,40.9992zm171.497 -93.8334l9.66557 -136.667 -19.0004 0c-11.6631,38.6666 -30.3327,67.6676 -55.8326,86.668 -25.6675,19.0004 -56.3309,28.4984 -92.1666,28.4984 -26.6641,0 -50.334,-5.49864 -71.1644,-16.5002 -20.8347,-11.1648 -38.0007,-25.9982 -51.3349,-44.496 -9.83311,-14 -17.9994,-32.5021 -24.499,-55.6694 -6.49956,-23.1673 -9.66557,-47.4988 -9.66557,-73.1662 0,-68.9993 14.8334,-119.999 44.3328,-152.664 29.6669,-32.6696 68.8318,-49.0023 117.331,-49.0023 63.3331,0 114.17,26.3333 152.334,78.9999l17.9994 -9.16726c-45.1661,-66.1641 -107.498,-99.1645 -187.001,-99.1645 -65.1631,0 -118.998,20.9979 -161.832,63.1656 -42.8335,42.1677 -64.1665,93.3351 -64.1665,153.665 0,62.4997 22.669,115.837 68.3334,159.834 45.5012,44.1652 103.834,66.1684 174.668,66.1684 15.001,0 27.4975,-1.00092 37.4981,-2.83523 9.83311,-1.99755 27.5018,-7.16541 52.8342,-15.6668 8.16633,-2.6677 14.1676,-3.9994 18.167,-3.9994 5.16786,0 9.49803,1.49924 13.1667,4.16694 3.50108,2.83523 7.16541,8.83218 10.6665,17.8319l19.6662 0z" />
</glyph>
<glyph
id="glyph3749"
horiz-adv-x="499"
unicode="£">
<path
id="path3751"
d="M353 321.833l-126 0c0.335073,-15.001 0.50261,-26.1658 0.50261,-33.3355 0,-30.496 -2.16938,-58.8311 -6.50386,-84.8293 -4.49771,-26.1701 -12.3333,-56.0002 -23.6656,-89.834 63.6682,-20.4996 100.17,-31.8362 109.333,-33.8338 16.8353,-3.83616 33.503,-5.83371 49.8357,-5.83371 26.9992,0 48.998,6.33202 65.8333,18.8328 16.9985,12.5008 29.3318,32.3346 37.1673,59.3337l17.4968 -4.33447c-6.83034,-52.4991 -23.6656,-92.1666 -50.4972,-119.166 -26.8359,-26.9992 -56.666,-40.5009 -89.6664,-40.5009 -22.0031,0 -42.0001,3.9994 -59.9996,11.835 -17.8362,7.9988 -50.9998,30.1652 -99.1688,66.1641 -12.9991,-25.9982 -26.9992,-45.4969 -42.1677,-58.5003 -15.1642,-12.9991 -31.3336,-19.4987 -48.6672,-19.4987 -16.1651,0 -29.8301,5.49864 -40.6641,16.8353 -11.0016,11.1648 -16.3327,26.5008 -16.3327,46.1671 0,21.6638 7.50048,39.8307 22.3339,54.3334 14.9967,14.4984 34.3321,21.8313 57.6669,21.8313 5.49864,0 11.6631,-0.335073 18.6653,-1.00092 6.83463,-0.66585 14.3308,-1.66677 22.8322,-2.99847 0.66585,8.50141 1.16846,15.8344 1.336,21.9988 0.163241,6.16878 0.163241,11.3323 0.163241,15.6668 0,28.6659 -3.49679,82.1659 -10.3314,160.668l-94.6668 0 0 46.3346 94.6668 0c-4.16694,48.4997 -6.33202,80.83 -6.33202,97.1669 0,39.6632 7.9988,75.9972 23.9964,108.83 16.0019,33.0004 38.0007,58.002 66.1684,75.5031 28.1676,17.3336 58.3328,26.1658 90.4998,26.1658 40.9992,0 72.0021,-11.1691 92.6649,-33.3355 20.6671,-21.9988 31.0029,-44.1652 31.0029,-66.3316 0,-10.3314 -3.9994,-19.6662 -12.0025,-27.8325 -7.9988,-8.16633 -16.6634,-12.1657 -26.1658,-12.1657 -12.3333,0 -22.6647,6.16449 -30.6678,18.4978 -3.66433,5.83371 -6.16449,18.5021 -7.33295,37.8332 -1.3317,19.3354 -6.83034,33.6663 -16.6634,42.8335 -10.1682,8.99972 -24.3358,13.665 -42.5027,13.665 -25.6675,0 -47.0005,-10.1639 -63.6639,-30.3327 -16.8353,-20.1645 -25.1691,-55.6651 -25.1691,-106.497 0,-23.6699 2.00185,-54.1659 5.83371,-91.3332 2.33262,-24.3358 3.83186,-42.0001 4.83279,-52.6666l126 0 0 -46.3346zm-207.5 -237.833c-7.16541,4.49771 -14.1676,7.9988 -20.9979,10.1682 -6.83463,2.33262 -13.6693,3.49679 -20.4996,3.49679 -14.6702,0 -26.0025,-3.9994 -34.1689,-11.9982 -8.16633,-7.9988 -12.1657,-18.3345 -12.1657,-30.9986 0,-11.6674 3.16601,-21.0022 9.49803,-27.8368 6.33632,-6.83034 13.6693,-10.1639 22.1664,-10.1639 10.834,0 21.3373,5.00032 31.5012,15.001 10.3357,10.1639 18.5021,27.4975 24.6665,52.3316z" />
</glyph>
</font>
</defs>
<g
style="fill-rule:evenodd"
id="g3961"
transform="matrix(0.26092747,0,0,0.26092747,-150.0074,-14.465307)">
<g
id="Layer_x0020_1">
<metadata
id="CorelCorpID_0Corel-Layer" />
<g
id="g3757">
<path
id="path3759"
d="m 593.15,80.4362 -14.7544,0 7.3772,-13.4111 7.3772,13.4111 z m -7.3772,63.2708 -1.4111,-1.4111 0,-63.0225 2.8222,0 0,63.0225 -1.4111,1.4111 z m 0,0 -1.4111,0 0,-1.4111 1.4111,1.4111 z m 70.9777,0 -70.9777,0 0,-2.8222 70.9777,0 0,2.8222 z m -1.1628,-8.7883 13.4111,7.3772 -13.4111,7.3772 0,-14.7544 z"
class="fil0"
inkscape:connector-curvature="0"
style="fill:#28166f;fill-rule:nonzero" />
</g>
<path
id="path3761"
d="m 584.507,122.884 c 5.4385,-10.8771 6.772,-13.3112 12.6675,-1.5201 5.2569,10.5139 11.1935,-16.4141 16.3833,-0.8445 4.908,14.7242 14.9355,-18.1932 21.6192,1.8579 1.2202,3.6606 6.4838,-0.3776 7.9383,-2.1957 7.0041,-8.7586 6.283,-3.6821 11.6541,1.689"
class="fil1 str0"
inkscape:connector-curvature="0"
style="fill:none;stroke:#28166f;stroke-width:5.64440012" />
<text
id="text3763"
class="fil2 fnt0"
y="105.433"
x="624.72302"
style="font-size:23.2784996px;font-weight:normal;fill:#28166f;font-family:Times New Roman">v(t)</text>
<rect
id="rect3765"
height="11.394"
width="3.4182"
y="115.457"
x="580.90997"
class="fil3 str1"
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.0762" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
height="26"
width="26"
version="1.1"
id="svg2"
inkscape:version="0.48.4 r9939"
sodipodi:docname="sim_tune.svg">
<metadata
id="metadata50">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1000"
id="namedview48"
showgrid="true"
inkscape:zoom="22.961539"
inkscape:cx="22.847263"
inkscape:cy="14.370314"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-to-guides="false"
inkscape:snap-grids="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3006"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<style
id="style3201"
type="text/css">
.fil0 {fill:#00923F}
</style>
<style
id="style3282"
type="text/css">
.str0 {stroke:#DA251D;stroke-width:0.0762}
.fil0 {fill:#DA251D}
</style>
<style
id="style3363"
type="text/css">
.fil0 {fill:#28166F}
</style>
<style
id="style3448"
type="text/css">
.str0 {stroke:#28166F;stroke-width:0.0762}
.str1 {stroke:#28166F;stroke-width:2.8222}
.fil1 {fill:none}
.fil0 {fill:#28166F}
</style>
</defs>
<g
style="fill-rule:evenodd"
id="g3469"
transform="matrix(0.24461259,0,0,0.22640667,-97.21454,-8.3068908)">
<g
id="Layer_x0020_1">
<metadata
id="CorelCorpID_0Corel-Layer" />
<polygon
id="polygon3452"
points="479.386,49.1497 468.164,67.1189 461.483,62.0725 475.843,46.3793 "
class="fil0 str0"
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
<polygon
id="polygon3454"
points="409.114,129.032 418.351,109.564 433.894,121.304 417.417,135.398 "
class="fil0 str0"
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
<rect
id="rect3456"
ry="0.79079998"
rx="0.79079998"
height="36.848999"
width="7.9926"
transform="matrix(1.485,1.12165,-1.21627,1.61027,464.721,51.9919)"
class="fil0 str0"
x="0"
y="0"
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
<rect
id="rect3458"
ry="1.6112"
rx="1.6112"
height="3.4238"
width="11.6812"
transform="matrix(1.80799,1.36561,-1.36561,1.80799,416.388,106.365)"
class="fil0 str0"
x="0"
y="0"
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
<polygon
id="polygon3460"
points="415.651,125.526 405.196,139.368 400.984,148.426 408.418,142.645 419.076,128.535 "
class="fil0 str0"
style="fill:#28166f;stroke:#28166f;stroke-width:0.0762" />
<path
id="path3462"
d="m 476.138,50.2632 c 6.9706,-10.9547 21.8672,-11.2504 20.0427,3.4745 -2.3011,18.57 -50.7341,55.7184 -26.4633,74.9809 4.1502,3.1639 15.5463,9.4991 27.8104,7.409"
class="fil1 str1"
inkscape:connector-curvature="0"
style="fill:none;stroke:#28166f;stroke-width:2.82220006" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
height="26"
width="26"
version="1.1"
id="svg2"
inkscape:version="0.48.4 r9939"
sodipodi:docname="add_arc.svg">
<metadata
id="metadata50">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1000"
id="namedview48"
showgrid="true"
inkscape:zoom="22.961539"
inkscape:cx="21.978887"
inkscape:cy="14.372445"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-to-guides="false"
inkscape:snap-grids="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3006"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<style
id="style3201"
type="text/css">
.fil0 {fill:#00923F}
</style>
</defs>
<g
style="fill-rule:evenodd"
id="g3212"
transform="matrix(0.25556099,0,0,0.25556099,-38.947924,-8.6975232)">
<g
id="Layer_x0020_1">
<metadata
id="CorelCorpID_0Corel-Layer" />
<polygon
id="polygon3205"
points="162.107,36.8175 245.819,85.5025 162.359,133.984 "
class="fil0"
style="fill:#00923f" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
height="26"
width="26"
version="1.1"
id="svg2"
inkscape:version="0.48.4 r9939"
sodipodi:docname="sim_settings.svg">
<metadata
id="metadata50">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1000"
id="namedview48"
showgrid="true"
inkscape:zoom="22.961539"
inkscape:cx="21.978887"
inkscape:cy="14.372445"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-to-guides="false"
inkscape:snap-grids="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3006"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<style
id="style3201"
type="text/css">
.fil0 {fill:#00923F}
</style>
</defs>
<path
id="path3281"
d="M 23.256135,14.998175 V 11.21958 L 20.910799,10.828691 C 20.780503,10.307505 20.51991,9.7863203 20.129021,9.0045413 L 21.562281,7.0500948 18.826057,4.3138704 16.87161,5.7471309 C 16.220128,5.3562417 15.568646,5.0956489 15.047461,4.9653525 L 14.786868,2.6200171 H 11.008272 L 10.617383,4.9653525 C 9.9659012,5.0956489 9.4447152,5.3562417 8.7932342,5.7471309 L 6.8387876,4.3138704 4.1025629,7.0500948 5.405527,9.0045413 C 5.0146378,9.6560233 4.8843414,10.177209 4.6237486,10.828691 l -2.215039,0.260593 v 3.778594 l 2.3453354,0.39089 c 0.1302964,0.651482 0.3908892,1.172667 0.7817784,1.824149 l -1.3029641,1.954446 2.7362247,2.736225 1.9544462,-1.302964 c 0.521185,0.260593 1.1726668,0.521186 1.8241488,0.781778 l 0.390889,2.345336 h 3.908893 l 0.390889,-2.345336 c 0.651482,-0.130296 1.172668,-0.390889 1.82415,-0.781778 l 1.954446,1.43326 2.736224,-2.736224 -1.43326,-1.954446 c 0.390889,-0.651482 0.651482,-1.302964 0.781778,-1.82415 l 1.954447,-0.390889 z m -10.423713,1.954446 c -2.215039,0 -3.9088918,-1.693853 -3.9088918,-3.908892 0,-2.215038 1.6938528,-3.9088917 3.9088918,-3.9088917 2.215039,0 3.908892,1.6938537 3.908892,3.9088917 0,2.215039 -1.693853,3.908892 -3.908892,3.908892 z"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
height="26"
width="26"
version="1.1"
id="svg2"
inkscape:version="0.48.4 r9939"
sodipodi:docname="sim_run.svg">
<metadata
id="metadata50">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1000"
id="namedview48"
showgrid="true"
inkscape:zoom="16.23626"
inkscape:cx="28.212686"
inkscape:cy="8.3654748"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-to-guides="false"
inkscape:snap-grids="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3006"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<style
id="style3201"
type="text/css">
.fil0 {fill:#00923F}
</style>
<style
id="style3282"
type="text/css">
.str0 {stroke:#DA251D;stroke-width:0.0762}
.fil0 {fill:#DA251D}
</style>
</defs>
<g
style="fill-rule:evenodd"
id="g3293"
transform="matrix(0.21662328,0,0,0.21662328,-0.09790372,-11.577568)">
<g
id="Layer_x0020_1">
<metadata
id="CorelCorpID_0Corel-Layer" />
<rect
id="rect3286"
height="89.604897"
width="90.811699"
y="69.152901"
x="14.49"
class="fil0 str0"
style="fill:#da251d;stroke:#da251d;stroke-width:0.0762" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
height="26"
width="26"
version="1.1"
id="svg2"
inkscape:version="0.48.4 r9939"
sodipodi:docname="sim_stop.svg">
<metadata
id="metadata50">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1000"
id="namedview48"
showgrid="true"
inkscape:zoom="16.23626"
inkscape:cx="37.591318"
inkscape:cy="25.47254"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-to-guides="false"
inkscape:snap-grids="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3006"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<style
id="style3201"
type="text/css">
.fil0 {fill:#00923F}
</style>
<style
id="style3282"
type="text/css">
.str0 {stroke:#DA251D;stroke-width:0.0762}
.fil0 {fill:#DA251D}
</style>
<style
id="style3363"
type="text/css">
.fil0 {fill:#28166F}
</style>
</defs>
<g
style="fill-rule:evenodd"
id="g3375"
transform="matrix(0.21994704,0,0,0.21994704,-59.705381,-6.2888419)">
<g
id="Layer_x0020_1">
<metadata
id="CorelCorpID_0Corel-Layer" />
<g
id="_210257584">
<path
d="m 278.712,140.427 c -3.801,-3.5131 -2.6247,-12.0338 8.2392,-27.0585 6.2877,-8.6956 20.0408,-11.3843 21.6725,-14.7159 1.579,-3.2236 -1.1947,-12.8616 5.3512,-9.6322 3.4875,1.7205 6.4926,4.3826 8.8694,7.2744 2.9118,2.3567 5.5741,5.3616 7.2946,8.8491 3.2294,6.5459 -6.4085,3.7723 -9.6321,5.3513 -3.3319,1.6316 -6.0204,15.3847 -14.716,21.6724 -15.0247,10.8639 -23.5454,12.0402 -27.0788,8.2594 z"
class="fil0"
id="_210248864"
inkscape:connector-curvature="0"
style="fill:#28166f" />
<polygon
points="327.688,91.3873 330.28,94.3283 370.774,55.4503 374.438,53.3445 376.998,50.6064 382.653,41.1421 380.414,38.6621 377.937,36.4203 368.472,42.0751 365.734,44.6346 363.628,48.2992 324.75,88.7924 "
class="fil0"
id="_210248840"
style="fill:#28166f" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -169,6 +169,7 @@ set( COMMON_DLG_SRCS
)
set( COMMON_WIDGET_SRCS
widgets/mathplot.cpp
widgets/widget_hotkey_list.cpp
)

View File

@ -247,6 +247,7 @@ KIWAY::FACE_T KIWAY::KifaceType( FRAME_T aFrameType )
case FRAME_SCH_LIB_EDITOR:
case FRAME_SCH_VIEWER:
case FRAME_SCH_VIEWER_MODAL:
case FRAME_SIMULATOR:
return FACE_SCH;
case FRAME_PCB:
@ -301,6 +302,7 @@ KIWAY_PLAYER* KIWAY::Player( FRAME_T aFrameType, bool doCreate, KIWAY_PLAYER* aP
return NULL;
}
printf("Player %d\n", aFrameType);
// return the previously opened window
KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );

View File

@ -1,4 +1,28 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2016 KiCad Developers, see CHANGELOG.TXT for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <kiway.h>
#include <kiway_player.h>

3612
common/widgets/mathplot.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,123 @@
* Node assignments
* non-inverting input
* | inverting input
* | | positive supply
* | | | negative supply
* | | | | output
* | | | | |
.SUBCKT AD8009 1 2 99 50 28
* input stage *
q1 50 3 5 qp1
q2 99 5 4 qn1
q3 99 3 6 qn2
q4 50 6 4 qp2
i1 99 5 1.625e-3
i2 6 50 1.625e-3
cin1 1 98 2.6e-12
cin2 2 98 1e-12
v1 4 2 0
* input error sources *
eos 3 1 poly(1) 20 98 2e-3 1
fbn 2 98 poly(1) vnoise3 50e-6 1e-3
fbp 1 98 poly(1) vnoise3 50e-6 1e-3
* slew limiting stage *
fsl 98 16 v1 1
dsl1 98 16 d1
dsl2 16 98 d1
dsl3 16 17 d1
dsl4 17 16 d1
rsl 17 18 0.22
vsl 18 98 0
* gain stage *
f1 98 7 vsl 2
rgain 7 98 2.5e5
cgain 7 98 1.25e-12
dcl1 7 8 d1
dcl2 9 7 d1
vcl1 99 8 1.83
vcl2 9 50 1.83
gcm 98 7 poly(2) 98 0 30 0 0 1e-5 1e-5
* second pole *
epole 14 98 7 98 1
rpole 14 15 1
cpole 15 98 2e-10
* reference stage *
eref 98 0 poly(2) 99 0 50 0 0 0.5 0.5
ecmref 30 0 poly(2) 1 0 2 0 0 0.5 0.5
* vnoise stage *
rnoise1 19 98 4.6e-3
vnoise1 19 98 0
vnoise2 21 98 0.53
dnoise1 21 19 dn
fnoise1 20 98 vnoise1 1
rnoise2 20 98 1
* inoise stage *
rnoise3 22 98 8.18e-6
vnoise3 22 98 0
vnoise4 24 98 0.575
dnoise2 24 22 dn
fnoise2 23 98 vnoise3 1
rnoise4 23 98 1
* buffer stage *
gbuf 98 13 15 98 1e-2
rbuf 98 13 1e2
* output current reflected to supplies *
fcurr 98 40 voc 1
vcur1 26 98 0
vcur2 98 27 0
dcur1 40 26 d1
dcur2 27 40 d1
* output stage *
vo1 99 90 0
vo2 91 50 0
fout1 0 99 poly(2) vo1 vcur1 -9.27e-3 1 -1
fout2 50 0 poly(2) vo2 vcur2 -9.27e-3 1 -1
gout1 90 10 13 99 0.5
gout2 91 10 13 50 0.5
rout1 10 90 2
rout2 10 91 2
voc 10 28 0
rout3 28 98 1e6
dcl3 13 11 d1
dcl4 12 13 d1
vcl3 11 10 -0.445
vcl4 10 12 -0.445
.model qp1 pnp()
.model qp2 pnp()
.model qn1 npn()
.model qn2 npn()
.model d1 d()
.model dn d(af=1 kf=1e-8)
.ends

View File

@ -0,0 +1 @@
.model FZT1049A NPN IS=1.5E-12 NF=1.0 BF=600 IKF=7.5 VAF=100 ISE=0.9E-13 NE=1.25 NR=1.0 BR=150 IKR=3 VAR=15 ISC=5.0E-13 NC=1.76 RB=0.1 RE=0.018 RC=0.007 CJC=136E-12 CJE=550E-12 MJC=0.352 MJE=0.36 VJC=0.554 VJE=0.726 TF=400E-12 TR=6.9E-9

View File

@ -0,0 +1 @@
.model LASER D(Is=1e-22 Rs=6 N=1.5 Cjo=50p Xti=100 Iave=160m Vpk=5)

View File

@ -0,0 +1,166 @@
EESchema-LIBRARY Version 2.3
#encoding utf-8
#
# C
#
DEF C C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "C" 25 -100 50 H V L CNN
F2 "" 38 -150 30 H V C CNN
F3 "" 0 0 60 H V C CNN
$FPLIST
C?
C_????_*
C_????
SMD*_c
Capacitor*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 150 110 D 40 40 1 1 P
X ~ 2 0 -150 110 U 40 40 1 1 P
ENDDRAW
ENDDEF
#
# GND
#
DEF GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "GND" 0 -150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# Generic_Opamp
#
DEF Generic_Opamp U 0 20 Y Y 1 F N
F0 "U" 0 250 50 H V L CNN
F1 "Generic_Opamp" 0 150 50 H V L CNN
F2 "" -100 -100 50 H V C CNN
F3 "" 0 0 50 H V C CNN
DRAW
P 4 0 1 10 -200 200 200 0 -200 -200 -200 200 f
X + 1 -300 100 100 R 50 50 1 1 I
X - 2 -300 -100 100 R 50 50 1 1 I
X V+ 3 -100 300 150 D 50 50 1 1 W
X V- 4 -100 -300 150 U 50 50 1 1 W
X ~ 5 300 0 100 L 50 50 1 1 O
ENDDRAW
ENDDEF
#
# LED
#
DEF LED D 0 40 Y N 1 F N
F0 "D" 0 100 50 H V C CNN
F1 "LED" 0 -100 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
$FPLIST
LED-3MM
LED-5MM
LED-10MM
LED-0603
LED-0805
LED-1206
LEDV
$ENDFPLIST
DRAW
P 2 0 1 0 -50 50 -50 -50 N
P 3 0 1 0 -80 -25 -125 -65 -120 -40 N
P 3 0 1 0 -65 -40 -110 -80 -105 -55 N
P 3 0 1 0 50 50 -50 0 50 -50 F
X K 1 -200 0 150 R 40 40 1 1 P
X A 2 200 0 150 L 40 40 1 1 P
ENDDRAW
ENDDEF
#
# Q_NPN_CBE
#
DEF Q_NPN_CBE Q 0 0 Y N 1 F N
F0 "Q" 300 50 50 H V R CNN
F1 "Q_NPN_CBE" 600 -50 50 H V R CNN
F2 "" 200 100 29 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
C 50 0 111 0 1 10 N
P 2 0 1 0 25 25 100 100 N
P 3 0 1 0 25 -25 100 -100 100 -100 N
P 3 0 1 20 25 75 25 -75 25 -75 N
P 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F
X C 1 100 200 100 D 50 50 1 1 P
X B 2 -200 0 225 R 50 50 1 1 I
X E 3 100 -200 100 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# R
#
DEF R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "R" 0 0 50 V V C CNN
F2 "" -70 0 30 V V C CNN
F3 "" 0 0 30 H V C CNN
$FPLIST
R_*
Resistor_*
$ENDFPLIST
DRAW
S -40 -100 40 100 0 1 10 N
X ~ 1 0 150 50 D 60 60 1 1 P
X ~ 2 0 -150 50 U 60 60 1 1 P
ENDDRAW
ENDDEF
#
# VDD
#
DEF VDD #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "VDD" 0 150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
C 0 75 25 0 1 0 N
P 2 0 1 0 0 0 0 50 N
X VDD 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# VSOURCE
#
DEF ~VSOURCE V 0 40 Y Y 1 F N
F0 "V" 200 200 50 H V C CNN
F1 "VSOURCE" 250 100 50 H I C CNN
F2 "" 0 0 50 H V C CNN
F3 "" 0 0 50 H V C CNN
F4 "Value" 0 0 60 H I C CNN "Fieldname"
F5 "V" 0 0 60 H I C CNN "Spice_Primitive"
F6 "1 2" -300 200 60 H I C CNN "Spice_Node_Sequence"
DRAW
C 0 0 100 0 1 0 N
P 2 0 1 0 0 -75 0 75 N
P 4 0 1 0 0 75 -25 25 25 25 0 75 F
X ~ 1 0 200 100 D 50 50 1 1 I
X ~ 2 0 -200 100 U 50 50 1 1 I
ENDDRAW
ENDDEF
#
# VSS
#
DEF VSS #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "VSS" 0 150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
C 0 75 25 0 1 0 N
P 2 0 1 0 0 0 0 50 N
X VSS 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

View File

@ -0,0 +1,61 @@
update=wto, 19 lip 2016, 23:56:07
version=1
last_client=eeschema
[general]
version=1
RootSch=
BoardNm=
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.500000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
[eeschema/libraries]
LibName1=power
LibName2=device
LibName3=transistors
LibName4=conn
LibName5=linear
LibName6=regul
LibName7=74xx
LibName8=cmos4000
LibName9=adc-dac
LibName10=memory
LibName11=xilinx
LibName12=microcontrollers
LibName13=dsp
LibName14=microchip
LibName15=analog_switches
LibName16=motorola
LibName17=texas
LibName18=intel
LibName19=audio
LibName20=interface
LibName21=digital-audio
LibName22=philips
LibName23=display
LibName24=cypress
LibName25=siliconi
LibName26=opto
LibName27=atmel
LibName28=contrib
LibName29=valves

View File

@ -0,0 +1,382 @@
EESchema Schematic File Version 2
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:contrib
LIBS:valves
LIBS:laser_driver-cache
EELAYER 25 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L VSOURCE V1
U 1 1 57336052
P 2650 3550
F 0 "V1" H 2778 3596 50 0000 L CNN
F 1 "pulse (check properties)" H 2778 3505 50 0000 L CNN
F 2 "" H 2650 3550 50 0000 C CNN
F 3 "" H 2650 3550 50 0000 C CNN
F 4 "V" H 2650 3550 60 0001 C CNN "Spice_Primitive"
F 5 "pulse(0 3 100n 1n 1n 20n 100n )" H 2650 3550 60 0001 C CNN "Spice_Model"
1 2650 3550
1 0 0 -1
$EndComp
Text Notes 3150 5400 0 60 ~ 0
.tran 10p 150n
$Comp
L Generic_Opamp U1
U 1 1 5788FF9F
P 5050 3500
F 0 "U1" H 5391 3546 50 0000 L CNN
F 1 "AD8009" H 5391 3455 50 0000 L CNN
F 2 "" H 4950 3400 50 0000 C CNN
F 3 "" H 5050 3500 50 0000 C CNN
F 4 "Value" H 5050 3500 60 0001 C CNN "Fieldname"
F 5 "X" H 5050 3500 60 0001 C CNN "Spice_Primitive"
F 6 "ad8009" H 5050 3500 60 0001 C CNN "Spice_Model"
F 7 "Y" H 5050 3500 60 0001 C CNN "Spice_Netlist_Enabled"
F 8 "ad8009.lib" H 5050 3500 60 0001 C CNN "Spice_Lib_File"
1 5050 3500
1 0 0 -1
$EndComp
$Comp
L VSOURCE V2
U 1 1 578900BA
P 9650 1850
F 0 "V2" H 9778 1896 50 0000 L CNN
F 1 "DC 10" H 9778 1805 50 0000 L CNN
F 2 "" H 9650 1850 50 0000 C CNN
F 3 "" H 9650 1850 50 0000 C CNN
F 4 "Value" H 9650 1850 60 0001 C CNN "Fieldname"
F 5 "V" H 9650 1850 60 0001 C CNN "Spice_Primitive"
F 6 "1 2" H 9350 2050 60 0001 C CNN "Spice_Node_Sequence"
1 9650 1850
1 0 0 -1
$EndComp
$Comp
L VSOURCE V3
U 1 1 57890232
P 9650 2350
F 0 "V3" H 9778 2396 50 0000 L CNN
F 1 "DC 10" H 9778 2305 50 0000 L CNN
F 2 "" H 9650 2350 50 0000 C CNN
F 3 "" H 9650 2350 50 0000 C CNN
F 4 "Value" H 9650 2350 60 0001 C CNN "Fieldname"
F 5 "V" H 9650 2350 60 0001 C CNN "Spice_Primitive"
F 6 "1 2" H 9350 2550 60 0001 C CNN "Spice_Node_Sequence"
1 9650 2350
1 0 0 -1
$EndComp
$Comp
L GND #PWR7
U 1 1 578902D2
P 9400 2100
F 0 "#PWR7" H 9400 1850 50 0001 C CNN
F 1 "GND" H 9405 1927 50 0000 C CNN
F 2 "" H 9400 2100 50 0000 C CNN
F 3 "" H 9400 2100 50 0000 C CNN
1 9400 2100
1 0 0 -1
$EndComp
$Comp
L VDD #PWR8
U 1 1 578903C0
P 9650 1600
F 0 "#PWR8" H 9650 1450 50 0001 C CNN
F 1 "VDD" H 9667 1773 50 0000 C CNN
F 2 "" H 9650 1600 50 0000 C CNN
F 3 "" H 9650 1600 50 0000 C CNN
1 9650 1600
1 0 0 -1
$EndComp
$Comp
L VSS #PWR9
U 1 1 578903E2
P 9650 2600
F 0 "#PWR9" H 9650 2450 50 0001 C CNN
F 1 "VSS" H 9668 2773 50 0000 C CNN
F 2 "" H 9650 2600 50 0000 C CNN
F 3 "" H 9650 2600 50 0000 C CNN
1 9650 2600
-1 0 0 1
$EndComp
$Comp
L VDD #PWR3
U 1 1 57890425
P 4950 3200
F 0 "#PWR3" H 4950 3050 50 0001 C CNN
F 1 "VDD" H 4967 3373 50 0000 C CNN
F 2 "" H 4950 3200 50 0000 C CNN
F 3 "" H 4950 3200 50 0000 C CNN
1 4950 3200
1 0 0 -1
$EndComp
$Comp
L VSS #PWR4
U 1 1 57890453
P 4950 3800
F 0 "#PWR4" H 4950 3650 50 0001 C CNN
F 1 "VSS" H 4968 3973 50 0000 C CNN
F 2 "" H 4950 3800 50 0000 C CNN
F 3 "" H 4950 3800 50 0000 C CNN
1 4950 3800
-1 0 0 1
$EndComp
$Comp
L C C2
U 1 1 5789085B
P 6800 4000
F 0 "C2" H 6915 3954 50 0000 L CNN
F 1 "1p" H 6915 4045 50 0000 L CNN
F 2 "" H 6838 3850 50 0000 C CNN
F 3 "" H 6800 4000 50 0000 C CNN
1 6800 4000
-1 0 0 1
$EndComp
$Comp
L R R5
U 1 1 578EA6D8
P 6400 4000
F 0 "R5" H 6469 3954 50 0000 L CNN
F 1 "2.5" H 6469 4045 50 0000 L CNN
F 2 "" V 6330 4000 50 0000 C CNN
F 3 "" H 6400 4000 50 0000 C CNN
1 6400 4000
-1 0 0 1
$EndComp
$Comp
L R R1
U 1 1 578EA7EE
P 4150 3600
F 0 "R1" V 3943 3600 50 0000 C CNN
F 1 "220" V 4034 3600 50 0000 C CNN
F 2 "" V 4080 3600 50 0000 C CNN
F 3 "" H 4150 3600 50 0000 C CNN
1 4150 3600
0 1 1 0
$EndComp
$Comp
L R R3
U 1 1 578EA8B4
P 5400 4150
F 0 "R3" V 5193 4150 50 0000 C CNN
F 1 "220" V 5284 4150 50 0000 C CNN
F 2 "" V 5330 4150 50 0000 C CNN
F 3 "" H 5400 4150 50 0000 C CNN
1 5400 4150
0 1 1 0
$EndComp
$Comp
L C C1
U 1 1 578EB076
P 5400 4400
F 0 "C1" V 5240 4400 50 0000 C CNN
F 1 "1p" V 5149 4400 50 0000 C CNN
F 2 "" H 5438 4250 50 0000 C CNN
F 3 "" H 5400 4400 50 0000 C CNN
1 5400 4400
0 -1 -1 0
$EndComp
$Comp
L LED D1
U 1 1 578EB1E8
P 6400 4900
F 0 "D1" V 6446 4792 50 0000 R CNN
F 1 "laser diode" V 6355 4792 50 0000 R CNN
F 2 "" H 6400 4900 50 0000 C CNN
F 3 "" H 6400 4900 50 0000 C CNN
F 4 "qtlp690c" H 6400 4900 60 0001 C CNN "Fieldname"
F 5 "D" H 6400 4900 60 0001 C CNN "Spice_Primitive"
F 6 "laser" H 6400 4900 60 0001 C CNN "Spice_Model"
F 7 "Y" H 6400 4900 60 0001 C CNN "Spice_Netlist_Enabled"
F 8 "laser.lib" H 6400 4900 60 0001 C CNN "Spice_Lib_File"
F 9 "2 1" V 6400 4900 60 0001 C CNN "Spice_Node_Sequence"
1 6400 4900
0 -1 -1 0
$EndComp
$Comp
L GND #PWR6
U 1 1 578EB42D
P 6400 5100
F 0 "#PWR6" H 6400 4850 50 0001 C CNN
F 1 "GND" H 6405 4927 50 0000 C CNN
F 2 "" H 6400 5100 50 0000 C CNN
F 3 "" H 6400 5100 50 0000 C CNN
1 6400 5100
1 0 0 -1
$EndComp
$Comp
L R R4
U 1 1 578EBA35
P 6150 2900
F 0 "R4" V 5943 2900 50 0000 C CNN
F 1 "220" V 6034 2900 50 0000 C CNN
F 2 "" V 6080 2900 50 0000 C CNN
F 3 "" H 6150 2900 50 0000 C CNN
1 6150 2900
0 1 1 0
$EndComp
$Comp
L R R2
U 1 1 578EBB39
P 4350 2900
F 0 "R2" V 4143 2900 50 0000 C CNN
F 1 "160" V 4234 2900 50 0000 C CNN
F 2 "" V 4280 2900 50 0000 C CNN
F 3 "" H 4350 2900 50 0000 C CNN
1 4350 2900
0 1 1 0
$EndComp
$Comp
L GND #PWR2
U 1 1 578EBBE4
P 4000 3600
F 0 "#PWR2" H 4000 3350 50 0001 C CNN
F 1 "GND" H 4005 3427 50 0000 C CNN
F 2 "" H 4000 3600 50 0000 C CNN
F 3 "" H 4000 3600 50 0000 C CNN
1 4000 3600
0 1 1 0
$EndComp
$Comp
L VDD #PWR5
U 1 1 578EBCE4
P 6400 3300
F 0 "#PWR5" H 6400 3150 50 0001 C CNN
F 1 "VDD" H 6417 3473 50 0000 C CNN
F 2 "" H 6400 3300 50 0000 C CNN
F 3 "" H 6400 3300 50 0000 C CNN
1 6400 3300
1 0 0 -1
$EndComp
Wire Wire Line
9650 2100 9400 2100
Wire Wire Line
5350 3500 6100 3500
Wire Wire Line
4300 3600 4750 3600
Wire Wire Line
4500 4150 5250 4150
Wire Wire Line
4500 4150 4500 3600
Connection ~ 4500 3600
Wire Wire Line
6400 4150 6400 4700
Wire Wire Line
6800 4350 6800 4150
Connection ~ 6400 4350
Wire Wire Line
5900 4150 5900 3750
Wire Wire Line
5550 4150 5900 4150
Wire Wire Line
5100 4400 5250 4400
Wire Wire Line
5100 4150 5100 4400
Connection ~ 5100 4150
Wire Wire Line
5550 4400 5750 4400
Wire Wire Line
5750 4400 5750 4150
Connection ~ 5750 4150
Wire Wire Line
6400 4350 7000 4350
Wire Wire Line
4500 2900 6000 2900
Wire Wire Line
6300 2900 7000 2900
Wire Wire Line
4650 3400 4650 2900
Connection ~ 4650 2900
Wire Wire Line
4750 3400 4650 3400
Wire Wire Line
4200 2900 2650 2900
Wire Wire Line
2650 2900 2650 3350
$Comp
L GND #PWR1
U 1 1 578EC19D
P 2650 4200
F 0 "#PWR1" H 2650 3950 50 0001 C CNN
F 1 "GND" H 2655 4027 50 0000 C CNN
F 2 "" H 2650 4200 50 0000 C CNN
F 3 "" H 2650 4200 50 0000 C CNN
1 2650 4200
1 0 0 -1
$EndComp
Wire Wire Line
2650 4200 2650 3750
Text Label 3650 2900 0 60 ~ 0
in
Wire Wire Line
7000 2900 7000 4350
Connection ~ 6800 4350
$Comp
L Q_NPN_CBE Q1
U 1 1 578EADCC
P 6300 3500
F 0 "Q1" H 6491 3546 50 0000 L CNN
F 1 "fzt1049a" H 6491 3455 50 0000 L CNN
F 2 "" H 6500 3600 50 0000 C CNN
F 3 "" H 6300 3500 50 0000 C CNN
F 4 "Value" H 6300 3500 60 0001 C CNN "Fieldname"
F 5 "Q" H 6300 3500 60 0001 C CNN "Spice_Primitive"
F 6 "fzt1049a" H 6300 3500 60 0001 C CNN "Spice_Model"
F 7 "Y" H 6300 3500 60 0001 C CNN "Spice_Netlist_Enabled"
F 8 "fzt1049a.lib" H 6300 3500 60 0001 C CNN "Spice_Lib_File"
1 6300 3500
1 0 0 -1
$EndComp
Wire Wire Line
6400 3700 6400 3850
Wire Wire Line
5900 3750 6800 3750
Wire Wire Line
6800 3750 6800 3850
Connection ~ 6400 3750
Text Label 6550 4350 0 60 ~ 0
out
Wire Wire Line
9650 1600 9650 1650
Wire Wire Line
9650 2600 9650 2550
Wire Wire Line
9650 2050 9650 2150
Connection ~ 9650 2100
$EndSCHEMATC

View File

@ -0,0 +1,98 @@
EESchema-LIBRARY Version 2.3
#encoding utf-8
#
# C
#
DEF C C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "C" 25 -100 50 H V L CNN
F2 "" 38 -150 30 H V C CNN
F3 "" 0 0 60 H V C CNN
$FPLIST
C?
C_????_*
C_????
SMD*_c
Capacitor*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 150 110 D 40 40 1 1 P
X ~ 2 0 -150 110 U 40 40 1 1 P
ENDDRAW
ENDDEF
#
# D
#
DEF D D 0 40 N N 1 F N
F0 "D" 0 100 50 H V C CNN
F1 "D" 0 -100 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
$FPLIST
Diode_*
D-Pak_TO252AA
*SingleDiode
*_Diode_*
*SingleDiode*
$ENDFPLIST
DRAW
P 2 0 1 6 -50 50 -50 -50 N
P 3 0 1 0 50 50 -50 0 50 -50 F
X K 1 -150 0 100 R 50 50 1 1 P
X A 2 150 0 100 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# GND
#
DEF GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "GND" 0 -150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# R
#
DEF R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "R" 0 0 50 V V C CNN
F2 "" -70 0 30 V V C CNN
F3 "" 0 0 30 H V C CNN
$FPLIST
R_*
Resistor_*
$ENDFPLIST
DRAW
S -40 -100 40 100 0 1 10 N
X ~ 1 0 150 50 D 60 60 1 1 P
X ~ 2 0 -150 50 U 60 60 1 1 P
ENDDRAW
ENDDEF
#
# VSOURCE-RESCUE-rectifier
#
DEF ~VSOURCE-RESCUE-rectifier V 0 40 Y Y 1 F N
F0 "V" 200 200 50 H V C CNN
F1 "VSOURCE-RESCUE-rectifier" 250 100 50 H I C CNN
F2 "" 0 0 50 H V C CNN
F3 "" 0 0 50 H V C CNN
F4 "Value" 0 0 60 H I C CNN "Fieldname"
F5 "V" 0 0 60 H I C CNN "Spice_Primitive"
F6 "1 2" -300 200 60 H I C CNN "Spice_Node_Sequence"
DRAW
C 0 0 100 0 1 0 N
P 2 0 1 0 0 -75 0 75 N
P 4 0 1 0 0 75 -25 25 25 25 0 75 F
X ~ 1 0 200 100 D 50 50 1 1 I
X ~ 2 0 -200 100 U 50 50 1 1 I
ENDDRAW
ENDDEF
#
#End Library

View File

@ -0,0 +1,62 @@
update=Fri 05 Aug 2016 05:56:48 PM CEST
version=1
last_client=eeschema
[general]
version=1
RootSch=
BoardNm=
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.500000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
[eeschema/libraries]
LibName1=rectifier-rescue
LibName2=power
LibName3=device
LibName4=transistors
LibName5=conn
LibName6=linear
LibName7=regul
LibName8=74xx
LibName9=cmos4000
LibName10=adc-dac
LibName11=memory
LibName12=xilinx
LibName13=microcontrollers
LibName14=dsp
LibName15=microchip
LibName16=analog_switches
LibName17=motorola
LibName18=texas
LibName19=intel
LibName20=audio
LibName21=interface
LibName22=digital-audio
LibName23=philips
LibName24=display
LibName25=cypress
LibName26=siliconi
LibName27=opto
LibName28=atmel
LibName29=contrib
LibName30=valves

View File

@ -0,0 +1,144 @@
EESchema Schematic File Version 2
LIBS:rectifier-rescue
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:contrib
LIBS:valves
LIBS:rectifier-cache
EELAYER 25 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L VSOURCE-RESCUE-rectifier V1
U 1 1 57336052
P 4400 4050
F 0 "V1" H 4528 4096 50 0000 L CNN
F 1 "SINE(0 1.5 1k 0 0 0 0)" H 4528 4005 50 0000 L CNN
F 2 "" H 4400 4050 50 0000 C CNN
F 3 "" H 4400 4050 50 0000 C CNN
1 4400 4050
-1 0 0 1
$EndComp
$Comp
L GND #PWR1
U 1 1 573360D3
P 4400 4350
F 0 "#PWR1" H 4400 4100 50 0001 C CNN
F 1 "GND" H 4405 4177 50 0000 C CNN
F 2 "" H 4400 4350 50 0000 C CNN
F 3 "" H 4400 4350 50 0000 C CNN
1 4400 4350
1 0 0 -1
$EndComp
$Comp
L R R1
U 1 1 573360F5
P 4650 3700
F 0 "R1" V 4443 3700 50 0000 C CNN
F 1 "1k" V 4534 3700 50 0000 C CNN
F 2 "" V 4580 3700 50 0000 C CNN
F 3 "" H 4650 3700 50 0000 C CNN
1 4650 3700
0 1 1 0
$EndComp
$Comp
L D D1
U 1 1 573361B8
P 5100 3700
F 0 "D1" H 5100 3485 50 0000 C CNN
F 1 "1N4148" H 5100 3576 50 0000 C CNN
F 2 "" H 5100 3700 50 0000 C CNN
F 3 "" H 5100 3700 50 0000 C CNN
1 5100 3700
-1 0 0 1
$EndComp
$Comp
L C C1
U 1 1 5733628F
P 5400 4000
F 0 "C1" H 5515 4046 50 0000 L CNN
F 1 "100n" H 5515 3955 50 0000 L CNN
F 2 "" H 5438 3850 50 0000 C CNN
F 3 "" H 5400 4000 50 0000 C CNN
1 5400 4000
1 0 0 -1
$EndComp
$Comp
L R R2
U 1 1 573362F7
P 5750 4000
F 0 "R2" H 5680 3954 50 0000 R CNN
F 1 "100k" H 5680 4045 50 0000 R CNN
F 2 "" V 5680 4000 50 0000 C CNN
F 3 "" H 5750 4000 50 0000 C CNN
1 5750 4000
-1 0 0 1
$EndComp
Text Notes 4300 4900 0 60 ~ 0
.tran 1u 10m\n
Wire Wire Line
4400 4350 4400 4250
Wire Wire Line
4400 4300 5750 4300
Connection ~ 4400 4300
Wire Wire Line
5250 3700 5750 3700
Wire Wire Line
5750 3700 5750 3850
Wire Wire Line
5400 3850 5400 3700
Connection ~ 5400 3700
Wire Wire Line
5400 4300 5400 4150
Wire Wire Line
5750 4300 5750 4150
Connection ~ 5400 4300
Wire Wire Line
4800 3700 4950 3700
Wire Wire Line
4400 3850 4400 3700
Wire Wire Line
4400 3700 4500 3700
Text Label 4400 3800 0 60 ~ 0
in
Text Label 5550 3700 0 60 ~ 0
rect
Text Notes 4300 5000 0 60 ~ 0
*.ac dec 10 1 1Meg\n
$EndSCHEMATC

View File

@ -0,0 +1,112 @@
* AD8051 SPICE Macro-model
* Description: Amplifier
* Generic Desc: Single 110 MHz rail-to-rail op amp - 3V
* Developed by: JCH / ADI
* Revision History: 08/10/2012 - Updated to new header style
* 0.0 (09/1998)
* Copyright 1998, 2012 by Analog Devices, Inc.
*
* Refer to http://www.analog.com/Analog_Root/static/techSupport/designTools/spiceModels/license/spice_general.html for License Statement. Use of this model
* indicates your acceptance with the terms and provisions in the License Statement.
*
* BEGIN Notes:
*
* Not Modeled:
* CMRR IS NOT MODELED
*
* Parameters modeled include:
* THIS MODEL IS FOR SINGLE SUPPLY OPERATION (+5V)
*
* END Notes
*
* Node assignments
* noninverting input
* | inverting input
* | | positive supply
* | | | negative supply
* | | | | output
* | | | | |
* | | | | |
.SUBCKT AD8051 1 2 99 50 45
*
* INPUT STAGE
*
Q1 4 3 5 QPI
Q2 6 2 7 QPI
RC1 50 4 20.5k
RC2 50 6 20.5k
RE1 5 8 5k
RE2 7 8 5k
EOS 3 1 POLY(1) 53 98 1.7E-3 1
IOS 1 2 0.1u
FNOI1 1 0 VMEAS2 1E-4
FNOI2 2 0 VMEAS2 1E-4
CPAR1 3 50 1.7p
CPAR2 2 50 1.7p
VCMH1 99 9 1
VCMH2 99 10 1
D1 5 9 DX
D2 7 10 DX
IBIAS 99 8 73u
*
* INTERNAL VOLTAGE REFERENCE
*
EREF1 98 0 POLY(2) 99 0 50 0 0 0.5 0.5
EREF2 97 0 POLY(2) 1 0 2 0 0 0.5 0.5
GREF2 97 0 97 0 1E-6
*
*VOLTAGE NOISE STAGE
*
DN1 51 52 DNOI1
VN1 51 98 0.61
VMEAS 52 98 0
RNOI1 52 98 6.5E-3
H1 53 98 VMEAS 1
RNOI2 53 98 1
*
*CURRENT NOISE STAGE
*
DN2 61 62 DNOI2
VN2 61 98 0.545
VMEAS2 62 98 0
RNOI3 62 98 2E-4
*
* INTERMEDIATE GAIN STAGE WITH POLE = 96MHz
*
G1 98 20 4 6 1E-3
RP1 98 20 550
CP1 98 20 3p
*
* GAIN STAGE WITH DOMINANT POLE
*
G4 98 30 20 98 2.6E-3
RG1 30 98 155k
CF1 30 45 13.5p
D5 31 99 DX
D6 50 32 DX
V1 31 30 0.6
V2 30 32 0.6
*
* OUTPUT STAGE
*
Q3 45 42 99 QPOX
Q4 45 44 50 QNOX
EO3 99 42 POLY(1) 98 30 0.7175 0.5
EO4 44 50 POLY(1) 30 98 0.7355 0.5
*
* MODELS
*
.MODEL QPI PNP (IS=8.6E-18,BF=91,VAF=30.6)
.MODEL QNOX NPN(IS=6.37E-16,BF=100,VAF=90,RC=3)
.MODEL QPOX PNP(IS=1.19E-15,BF=112,VAF=19.2,RC=6)
.MODEL DX D(IS=1E-16)
.MODEL DZ D(IS=1E-14,BV=6.6)
.MODEL DNOI1 D(KF=9E-10)
.MODEL DNOI2 D(KF=1E-8)
.ENDS AD8051

View File

@ -0,0 +1,121 @@
EESchema-LIBRARY Version 2.3
#encoding utf-8
#
# C
#
DEF C C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "C" 25 -100 50 H V L CNN
F2 "" 38 -150 30 H V C CNN
F3 "" 0 0 60 H V C CNN
$FPLIST
C?
C_????_*
C_????
SMD*_c
Capacitor*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 150 110 D 40 40 1 1 P
X ~ 2 0 -150 110 U 40 40 1 1 P
ENDDRAW
ENDDEF
#
# GND
#
DEF GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "GND" 0 -150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# Generic_Opamp
#
DEF Generic_Opamp U 0 20 Y Y 1 F N
F0 "U" 0 250 50 H V L CNN
F1 "Generic_Opamp" 0 150 50 H V L CNN
F2 "" -100 -100 50 H V C CNN
F3 "" 0 0 50 H V C CNN
DRAW
P 4 0 1 10 -200 200 200 0 -200 -200 -200 200 f
X + 1 -300 100 100 R 50 50 1 1 I
X - 2 -300 -100 100 R 50 50 1 1 I
X V+ 3 -100 300 150 D 50 50 1 1 W
X V- 4 -100 -300 150 U 50 50 1 1 W
X ~ 5 300 0 100 L 50 50 1 1 O
ENDDRAW
ENDDEF
#
# R
#
DEF R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "R" 0 0 50 V V C CNN
F2 "" -70 0 30 V V C CNN
F3 "" 0 0 30 H V C CNN
$FPLIST
R_*
Resistor_*
$ENDFPLIST
DRAW
S -40 -100 40 100 0 1 10 N
X ~ 1 0 150 50 D 60 60 1 1 P
X ~ 2 0 -150 50 U 60 60 1 1 P
ENDDRAW
ENDDEF
#
# VDD
#
DEF VDD #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "VDD" 0 150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
C 0 75 25 0 1 0 N
P 2 0 1 0 0 0 0 50 N
X VDD 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# VSOURCE-RESCUE-sallen_key
#
DEF ~VSOURCE-RESCUE-sallen_key V 0 40 Y Y 1 F N
F0 "V" 200 200 50 H V C CNN
F1 "VSOURCE-RESCUE-sallen_key" 250 100 50 H I C CNN
F2 "" 0 0 50 H V C CNN
F3 "" 0 0 50 H V C CNN
F4 "Value" 0 0 60 H I C CNN "Fieldname"
F5 "V" 0 0 60 H I C CNN "Spice_Primitive"
F6 "1 2" -300 200 60 H I C CNN "Spice_Node_Sequence"
DRAW
C 0 0 100 0 1 0 N
P 2 0 1 0 0 -75 0 75 N
P 4 0 1 0 0 75 -25 25 25 25 0 75 F
X ~ 1 0 200 100 D 50 50 1 1 I
X ~ 2 0 -200 100 U 50 50 1 1 I
ENDDRAW
ENDDEF
#
# VSS
#
DEF VSS #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "VSS" 0 150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
C 0 75 25 0 1 0 N
P 2 0 1 0 0 0 0 50 N
X VSS 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

View File

@ -0,0 +1,73 @@
update=Fri 05 Aug 2016 05:58:16 PM CEST
version=1
last_client=eeschema
[general]
version=1
RootSch=
BoardNm=
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.500000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[cvpcb]
version=1
NetIExt=net
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=
SpiceForceRefPrefix=0
SpiceUseNetNumbers=0
LabSize=60
ERC_TestSimilarLabels=1
[eeschema]
version=1
[eeschema/libraries]
LibName1=sallen_key-rescue
LibName2=power
LibName3=device
LibName4=transistors
LibName5=conn
LibName6=linear
LibName7=regul
LibName8=74xx
LibName9=cmos4000
LibName10=adc-dac
LibName11=memory
LibName12=xilinx
LibName13=microcontrollers
LibName14=dsp
LibName15=microchip
LibName16=analog_switches
LibName17=motorola
LibName18=texas
LibName19=intel
LibName20=audio
LibName21=interface
LibName22=digital-audio
LibName23=philips
LibName24=display
LibName25=cypress
LibName26=siliconi
LibName27=opto
LibName28=atmel
LibName29=contrib
LibName30=valves

View File

@ -0,0 +1,278 @@
EESchema Schematic File Version 2
LIBS:sallen_key-rescue
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:contrib
LIBS:valves
LIBS:sallen_key-cache
EELAYER 25 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L VSOURCE-RESCUE-sallen_key V1
U 1 1 57336052
P 6000 4700
F 0 "V1" H 6128 4746 50 0000 L CNN
F 1 "AC 1" H 6128 4655 50 0000 L CNN
F 2 "" H 6000 4700 50 0000 C CNN
F 3 "" H 6000 4700 50 0000 C CNN
1 6000 4700
1 0 0 -1
$EndComp
Text Label 8550 4400 0 60 ~ 0
lowpass
Text Notes 4300 5000 0 60 ~ 0
.ac dec 10 1 1Meg\n
$Comp
L Generic_Opamp U1
U 1 1 5788FF9F
P 7850 4400
F 0 "U1" H 8191 4446 50 0000 L CNN
F 1 "AD8051" H 8191 4355 50 0000 L CNN
F 2 "" H 7750 4300 50 0000 C CNN
F 3 "" H 7850 4400 50 0000 C CNN
F 4 "X" H 7850 4400 60 0001 C CNN "Spice_Primitive"
F 5 "AD8051" H 7850 4400 60 0001 C CNN "Spice_Model"
F 6 "ad8051.lib" H 7850 4400 60 0001 C CNN "Spice_Lib_File"
F 7 "Y" H 7850 4400 60 0001 C CNN "Spice_Netlist_Enabled"
1 7850 4400
1 0 0 -1
$EndComp
$Comp
L VSOURCE-RESCUE-sallen_key V2
U 1 1 578900BA
P 9650 1850
F 0 "V2" H 9778 1896 50 0000 L CNN
F 1 "DC 10" H 9778 1805 50 0000 L CNN
F 2 "" H 9650 1850 50 0000 C CNN
F 3 "" H 9650 1850 50 0000 C CNN
F 4 "Value" H 9650 1850 60 0001 C CNN "Fieldname"
F 5 "V" H 9650 1850 60 0001 C CNN "Spice_Primitive"
F 6 "1 2" H 9350 2050 60 0001 C CNN "Spice_Node_Sequence"
1 9650 1850
1 0 0 -1
$EndComp
$Comp
L VSOURCE-RESCUE-sallen_key V3
U 1 1 57890232
P 9650 2350
F 0 "V3" H 9778 2396 50 0000 L CNN
F 1 "DC 10" H 9778 2305 50 0000 L CNN
F 2 "" H 9650 2350 50 0000 C CNN
F 3 "" H 9650 2350 50 0000 C CNN
F 4 "Value" H 9650 2350 60 0001 C CNN "Fieldname"
F 5 "V" H 9650 2350 60 0001 C CNN "Spice_Primitive"
F 6 "1 2" H 9350 2550 60 0001 C CNN "Spice_Node_Sequence"
1 9650 2350
1 0 0 -1
$EndComp
$Comp
L GND #PWR5
U 1 1 578902D2
P 9400 2100
F 0 "#PWR5" H 9400 1850 50 0001 C CNN
F 1 "GND" H 9405 1927 50 0000 C CNN
F 2 "" H 9400 2100 50 0000 C CNN
F 3 "" H 9400 2100 50 0000 C CNN
1 9400 2100
1 0 0 -1
$EndComp
$Comp
L VDD #PWR6
U 1 1 578903C0
P 9650 1600
F 0 "#PWR6" H 9650 1450 50 0001 C CNN
F 1 "VDD" H 9667 1773 50 0000 C CNN
F 2 "" H 9650 1600 50 0000 C CNN
F 3 "" H 9650 1600 50 0000 C CNN
1 9650 1600
1 0 0 -1
$EndComp
$Comp
L VSS #PWR7
U 1 1 578903E2
P 9650 2600
F 0 "#PWR7" H 9650 2450 50 0001 C CNN
F 1 "VSS" H 9668 2773 50 0000 C CNN
F 2 "" H 9650 2600 50 0000 C CNN
F 3 "" H 9650 2600 50 0000 C CNN
1 9650 2600
-1 0 0 1
$EndComp
$Comp
L VDD #PWR3
U 1 1 57890425
P 7750 4100
F 0 "#PWR3" H 7750 3950 50 0001 C CNN
F 1 "VDD" H 7767 4273 50 0000 C CNN
F 2 "" H 7750 4100 50 0000 C CNN
F 3 "" H 7750 4100 50 0000 C CNN
1 7750 4100
1 0 0 -1
$EndComp
$Comp
L VSS #PWR4
U 1 1 57890453
P 7750 4700
F 0 "#PWR4" H 7750 4550 50 0001 C CNN
F 1 "VSS" H 7768 4873 50 0000 C CNN
F 2 "" H 7750 4700 50 0000 C CNN
F 3 "" H 7750 4700 50 0000 C CNN
1 7750 4700
-1 0 0 1
$EndComp
$Comp
L R R2
U 1 1 57890691
P 6950 4300
F 0 "R2" V 6743 4300 50 0000 C CNN
F 1 "1k" V 6834 4300 50 0000 C CNN
F 2 "" V 6880 4300 50 0000 C CNN
F 3 "" H 6950 4300 50 0000 C CNN
F 4 "Value" H 6950 4300 60 0001 C CNN "Fieldname"
F 5 "1 2" H 6950 4300 60 0001 C CNN "SpiceMapping"
F 6 "R" V 6950 4300 60 0001 C CNN "Spice_Primitive"
1 6950 4300
0 1 1 0
$EndComp
$Comp
L R R1
U 1 1 578906FF
P 6400 4300
F 0 "R1" V 6193 4300 50 0000 C CNN
F 1 "1k" V 6284 4300 50 0000 C CNN
F 2 "" V 6330 4300 50 0000 C CNN
F 3 "" H 6400 4300 50 0000 C CNN
F 4 "Value" H 6400 4300 60 0001 C CNN "Fieldname"
F 5 "1 2" H 6400 4300 60 0001 C CNN "SpiceMapping"
F 6 "R" V 6400 4300 60 0001 C CNN "Spice_Primitive"
1 6400 4300
0 1 1 0
$EndComp
$Comp
L C C1
U 1 1 5789077D
P 7000 4950
F 0 "C1" V 6748 4950 50 0000 C CNN
F 1 "100n" V 6839 4950 50 0000 C CNN
F 2 "" H 7038 4800 50 0000 C CNN
F 3 "" H 7000 4950 50 0000 C CNN
1 7000 4950
0 1 1 0
$EndComp
$Comp
L C C2
U 1 1 5789085B
P 7350 4000
F 0 "C2" H 7465 4046 50 0000 L CNN
F 1 "100n" H 7465 3955 50 0000 L CNN
F 2 "" H 7388 3850 50 0000 C CNN
F 3 "" H 7350 4000 50 0000 C CNN
F 4 "Value" H 7350 4000 60 0001 C CNN "Fieldname"
F 5 "C" H 7350 4000 60 0001 C CNN "Spice_Primitive"
F 6 "1 2" H 7350 4000 60 0001 C CNN "SpiceMapping"
1 7350 4000
-1 0 0 1
$EndComp
$Comp
L GND #PWR2
U 1 1 57890B95
P 7350 3800
F 0 "#PWR2" H 7350 3550 50 0001 C CNN
F 1 "GND" H 7355 3627 50 0000 C CNN
F 2 "" H 7350 3800 50 0000 C CNN
F 3 "" H 7350 3800 50 0000 C CNN
1 7350 3800
-1 0 0 1
$EndComp
Wire Wire Line
9650 2100 9400 2100
Wire Wire Line
8150 4400 8900 4400
Wire Wire Line
8350 4950 8350 4400
Wire Wire Line
7150 4950 8350 4950
Wire Wire Line
7400 4950 7400 4500
Wire Wire Line
7400 4500 7550 4500
Wire Wire Line
7100 4300 7550 4300
Wire Wire Line
6550 4300 6800 4300
Wire Wire Line
6850 4950 6650 4950
Wire Wire Line
6650 4950 6650 4300
Connection ~ 6650 4300
Wire Wire Line
7400 4950 7450 4950
Connection ~ 7400 4950
Wire Wire Line
7350 4150 7350 4300
Connection ~ 7350 4300
Wire Wire Line
7350 3800 7350 3850
Wire Wire Line
6250 4300 6000 4300
Wire Wire Line
6000 4300 6000 4500
Wire Wire Line
6000 4900 6000 5000
$Comp
L GND #PWR1
U 1 1 57890E7F
P 6000 5000
F 0 "#PWR1" H 6000 4750 50 0001 C CNN
F 1 "GND" H 6005 4827 50 0000 C CNN
F 2 "" H 6000 5000 50 0000 C CNN
F 3 "" H 6000 5000 50 0000 C CNN
1 6000 5000
1 0 0 -1
$EndComp
Connection ~ 8350 4400
Wire Wire Line
9650 2600 9650 2550
Wire Wire Line
9650 1600 9650 1650
Wire Wire Line
9650 2050 9650 2150
Connection ~ 9650 2100
$EndSCHEMATC

View File

@ -194,6 +194,29 @@ set( EESCHEMA_COMMON_SRCS
)
if( KICAD_SPICE )
set( EESCHEMA_SRCS
${EESCHEMA_SRCS}
sim/simulate.cpp
sim/sim_plot_frame_base.cpp
sim/sim_plot_frame.cpp
sim/sim_plot_panel.cpp
sim/spice_simulator.cpp
sim/spice_value.cpp
sim/ngspice.cpp
sim/netlist_exporter_pspice_sim.cpp
dialogs/dialog_signal_list.cpp
dialogs/dialog_signal_list_base.cpp
dialogs/dialog_sim_settings.cpp
dialogs/dialog_sim_settings_base.cpp
dialogs/dialog_spice_model.cpp
dialogs/dialog_spice_model_base.cpp
widgets/tuner_slider.cpp
widgets/tuner_slider_base.cpp
)
endif()
if( MINGW )
# EESCHEMA_RESOURCES variable is set by the macro.
mingw_resource_compiler( eeschema )

View File

@ -885,7 +885,7 @@ bool LIB_PART::Load( LINE_READER& aLineReader, wxString& aErrorMsg )
{
p = strtok( line, " \t\n" );
if( p && stricmp( p, "ENDDEF" ) == 0 )
if( p && strcasecmp( p, "ENDDEF" ) == 0 )
break;
}
@ -1143,7 +1143,7 @@ bool LIB_PART::LoadFootprints( LINE_READER& aLineReader, wxString& aErrorMsg )
p = strtok( line, " \t\r\n" );
if( stricmp( p, "$ENDFPLIST" ) == 0 )
if( strcasecmp( p, "$ENDFPLIST" ) == 0 )
break;
m_FootprintList.Add( FROM_UTF8( p ) );

View File

@ -458,7 +458,7 @@ bool PART_LIB::Load( wxString& aErrorMsg )
{
char * line = reader.Line();
if( type == LIBRARY_TYPE_EESCHEMA && strnicmp( line, "$HEADER", 7 ) == 0 )
if( type == LIBRARY_TYPE_EESCHEMA && strncasecmp( line, "$HEADER", 7 ) == 0 )
{
if( !LoadHeader( reader ) )
{
@ -471,7 +471,7 @@ bool PART_LIB::Load( wxString& aErrorMsg )
wxString msg;
if( strnicmp( line, "DEF", 3 ) == 0 )
if( strncasecmp( line, "DEF", 3 ) == 0 )
{
// Read one DEF/ENDDEF part entry from library:
LIB_PART* part = new LIB_PART( wxEmptyString, this );
@ -536,10 +536,10 @@ bool PART_LIB::LoadHeader( LINE_READER& aLineReader )
text = strtok( line, " \t\r\n" );
data = strtok( NULL, " \t\r\n" );
if( stricmp( text, "TimeStamp" ) == 0 )
if( strcasecmp( text, "TimeStamp" ) == 0 )
timeStamp = atol( data );
if( stricmp( text, "$ENDHEADER" ) == 0 )
if( strcasecmp( text, "$ENDHEADER" ) == 0 )
return true;
}
@ -574,7 +574,7 @@ bool PART_LIB::LoadDocs( wxString& aErrorMsg )
return false;
}
if( strnicmp( line, DOCFILE_IDENT, 10 ) != 0 )
if( strncasecmp( line, DOCFILE_IDENT, 10 ) != 0 )
{
aErrorMsg.Printf( _( "File '%s' is not a valid component library document file." ),
GetChars( fn.GetFullPath() ) );

View File

@ -46,6 +46,10 @@
#include <sch_validators.h>
#include <dialog_edit_component_in_schematic_fbp.h>
#ifdef KICAD_SPICE
#include <dialog_spice_model.h>
#include <netlist_exporter_pspice.h>
#endif /* KICAD_SPICE */
/**
@ -126,7 +130,7 @@ private:
void showButtonHandler( wxCommandEvent& event );
void OnTestChipName( wxCommandEvent& event );
void OnSelectChipName( wxCommandEvent& event );
void OnInitDlg( wxInitDialogEvent& event )
void OnInitDlg( wxInitDialogEvent& event )
{
TransferDataToWindow();
@ -134,6 +138,8 @@ private:
FinishDialogSettings();
}
void EditSpiceModel( wxCommandEvent& event ) override;
SCH_FIELD* findField( const wxString& aFieldName );
/**
@ -141,7 +147,7 @@ private:
* update the listbox showing fields, according to the fields texts
* must be called after a text change in fields, if this change is not an edition
*/
void updateDisplay( )
void updateDisplay()
{
for( unsigned ii = FIELD1; ii<m_FieldsBuf.size(); ii++ )
setRowItem( ii, m_FieldsBuf[ii] );
@ -187,6 +193,10 @@ void SCH_EDIT_FRAME::EditComponent( SCH_COMPONENT* aComponent )
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( wxWindow* aParent ) :
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( aParent )
{
#ifndef KICAD_SPICE
spiceFieldsButton->Hide();
#endif /* not KICAD_SPICE */
m_parent = (SCH_EDIT_FRAME*) aParent;
m_cmp = NULL;
@ -284,6 +294,18 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnSelectChipName( wxCommandEvent& event
}
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::EditSpiceModel( wxCommandEvent& event )
{
#ifdef KICAD_SPICE
setSelectedFieldNdx( 0 );
DIALOG_SPICE_MODEL dialog( this, *m_cmp, m_FieldsBuf );
if( dialog.ShowModal() == wxID_OK )
updateDisplay();
#endif /* KICAD_SPICE */
}
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnListItemSelected( wxListEvent& event )
{
DBG( printf( "OnListItemSelected()\n" ); )

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version May 21 2016)
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@ -12,287 +12,290 @@
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* mainSizer;
mainSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* upperSizer;
upperSizer = new wxBoxSizer( wxHORIZONTAL );
wxStaticBoxSizer* optionsSizer;
optionsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Component") ), wxVERTICAL );
m_staticTextUnit = new wxStaticText( optionsSizer->GetStaticBox(), wxID_ANY, _("Unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextUnit->Wrap( -1 );
optionsSizer->Add( m_staticTextUnit, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
wxArrayString unitChoiceChoices;
unitChoice = new wxChoice( optionsSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, unitChoiceChoices, 0 );
unitChoice->SetSelection( 0 );
optionsSizer->Add( unitChoice, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizerUnitsInterchangeable;
bSizerUnitsInterchangeable = new wxBoxSizer( wxHORIZONTAL );
unitsInterchageableText = new wxStaticText( optionsSizer->GetStaticBox(), wxID_ANY, _("Units are interchangeable:"), wxDefaultPosition, wxDefaultSize, 0 );
unitsInterchageableText->Wrap( -1 );
bSizerUnitsInterchangeable->Add( unitsInterchageableText, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
unitsInterchageableLabel = new wxStaticText( optionsSizer->GetStaticBox(), wxID_ANY, _("Yes"), wxDefaultPosition, wxDefaultSize, 0 );
unitsInterchageableLabel->Wrap( -1 );
bSizerUnitsInterchangeable->Add( unitsInterchageableLabel, 0, wxALL, 5 );
optionsSizer->Add( bSizerUnitsInterchangeable, 0, wxEXPAND, 5 );
wxString orientationRadioBoxChoices[] = { _("0"), _("+90"), _("180"), _("-90") };
int orientationRadioBoxNChoices = sizeof( orientationRadioBoxChoices ) / sizeof( wxString );
orientationRadioBox = new wxRadioBox( optionsSizer->GetStaticBox(), wxID_ANY, _("Orientation (Degrees)"), wxDefaultPosition, wxDefaultSize, orientationRadioBoxNChoices, orientationRadioBoxChoices, 1, wxRA_SPECIFY_COLS );
orientationRadioBox->SetSelection( 0 );
orientationRadioBox->SetToolTip( _("Select if the component is to be rotated when drawn") );
optionsSizer->Add( orientationRadioBox, 0, wxEXPAND|wxALL, 5 );
wxString mirrorRadioBoxChoices[] = { _("Normal"), _("Mirror ---"), _("Mirror |") };
int mirrorRadioBoxNChoices = sizeof( mirrorRadioBoxChoices ) / sizeof( wxString );
mirrorRadioBox = new wxRadioBox( optionsSizer->GetStaticBox(), wxID_ANY, _("Mirror"), wxDefaultPosition, wxDefaultSize, mirrorRadioBoxNChoices, mirrorRadioBoxChoices, 1, wxRA_SPECIFY_COLS );
mirrorRadioBox->SetSelection( 0 );
mirrorRadioBox->SetToolTip( _("Pick the graphical transformation to be used when displaying the component, if any") );
optionsSizer->Add( mirrorRadioBox, 0, wxALL|wxEXPAND, 5 );
convertCheckBox = new wxCheckBox( optionsSizer->GetStaticBox(), wxID_ANY, _("Converted Shape"), wxDefaultPosition, wxDefaultSize, 0 );
convertCheckBox->SetToolTip( _("Use the alternate shape of this component.\nFor gates, this is the \"De Morgan\" conversion") );
optionsSizer->Add( convertCheckBox, 0, wxALL, 5 );
wxStaticBoxSizer* sbSizerChipName;
sbSizerChipName = new wxStaticBoxSizer( new wxStaticBox( optionsSizer->GetStaticBox(), wxID_ANY, _("Chip Name") ), wxVERTICAL );
chipnameTextCtrl = new wxTextCtrl( sbSizerChipName->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
chipnameTextCtrl->SetToolTip( _("The name of the symbol in the library from which this component came") );
sbSizerChipName->Add( chipnameTextCtrl, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
wxBoxSizer* bSizerChpinameButt;
bSizerChpinameButt = new wxBoxSizer( wxHORIZONTAL );
m_buttonTestChipName = new wxButton( sbSizerChipName->GetStaticBox(), wxID_ANY, _("Test"), wxDefaultPosition, wxDefaultSize, 0 );
bSizerChpinameButt->Add( m_buttonTestChipName, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 );
m_buttonSelectChipName = new wxButton( sbSizerChipName->GetStaticBox(), wxID_ANY, _("Select"), wxDefaultPosition, wxDefaultSize, 0 );
bSizerChpinameButt->Add( m_buttonSelectChipName, 0, wxTOP|wxBOTTOM, 5 );
sbSizerChipName->Add( bSizerChpinameButt, 1, wxEXPAND, 5 );
optionsSizer->Add( sbSizerChipName, 0, wxEXPAND|wxALL, 5 );
m_staticTextTimeStamp = new wxStaticText( optionsSizer->GetStaticBox(), wxID_ANY, _("Timestamp"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextTimeStamp->Wrap( -1 );
optionsSizer->Add( m_staticTextTimeStamp, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_textCtrlTimeStamp = new wxTextCtrl( optionsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
m_textCtrlTimeStamp->SetToolTip( _("An unique ID (a time stamp) to identify the component.\nThis is an alternate identifier to the reference.") );
optionsSizer->Add( m_textCtrlTimeStamp, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
m_staticline1 = new wxStaticLine( optionsSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
optionsSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
spiceFieldsButton = new wxButton( optionsSizer->GetStaticBox(), wxID_ANY, _("Edit Spice model"), wxDefaultPosition, wxDefaultSize, 0 );
optionsSizer->Add( spiceFieldsButton, 0, wxALL|wxEXPAND, 5 );
defaultsButton = new wxButton( optionsSizer->GetStaticBox(), wxID_ANY, _("Reset to Library Defaults"), wxDefaultPosition, wxDefaultSize, 0 );
defaultsButton->SetToolTip( _("Set position and style of fields and component orientation to default lib value.\nFields texts are not modified.") );
optionsSizer->Add( defaultsButton, 0, wxALL|wxEXPAND, 5 );
upperSizer->Add( optionsSizer, 0, wxEXPAND|wxALL, 5 );
wxStaticBoxSizer* fieldsSizer;
fieldsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Fields") ), wxHORIZONTAL );
wxStaticBoxSizer* gridStaticBoxSizer;
gridStaticBoxSizer = new wxStaticBoxSizer( new wxStaticBox( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString ), wxVERTICAL );
fieldListCtrl = new wxListCtrl( gridStaticBoxSizer->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_VRULES );
fieldListCtrl->SetMinSize( wxSize( 220,-1 ) );
gridStaticBoxSizer->Add( fieldListCtrl, 1, wxALL|wxEXPAND, 8 );
addFieldButton = new wxButton( gridStaticBoxSizer->GetStaticBox(), wxID_ANY, _("Add Field"), wxDefaultPosition, wxDefaultSize, 0 );
addFieldButton->SetToolTip( _("Add a new custom field") );
gridStaticBoxSizer->Add( addFieldButton, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
deleteFieldButton = new wxButton( gridStaticBoxSizer->GetStaticBox(), wxID_ANY, _("Delete Field"), wxDefaultPosition, wxDefaultSize, 0 );
deleteFieldButton->SetToolTip( _("Delete one of the optional fields") );
gridStaticBoxSizer->Add( deleteFieldButton, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
moveUpButton = new wxButton( gridStaticBoxSizer->GetStaticBox(), wxID_ANY, _("Move Up"), wxDefaultPosition, wxDefaultSize, 0 );
moveUpButton->SetToolTip( _("Move the selected optional fields up one position") );
gridStaticBoxSizer->Add( moveUpButton, 0, wxALL|wxEXPAND, 5 );
fieldsSizer->Add( gridStaticBoxSizer, 3, wxEXPAND|wxRIGHT|wxLEFT, 8 );
wxBoxSizer* fieldEditBoxSizer;
fieldEditBoxSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizerJustification;
bSizerJustification = new wxBoxSizer( wxHORIZONTAL );
wxString m_FieldHJustifyCtrlChoices[] = { _("Left"), _("Center"), _("Right") };
int m_FieldHJustifyCtrlNChoices = sizeof( m_FieldHJustifyCtrlChoices ) / sizeof( wxString );
m_FieldHJustifyCtrl = new wxRadioBox( fieldsSizer->GetStaticBox(), wxID_ANY, _("Horiz. Justify"), wxDefaultPosition, wxDefaultSize, m_FieldHJustifyCtrlNChoices, m_FieldHJustifyCtrlChoices, 1, wxRA_SPECIFY_COLS );
m_FieldHJustifyCtrl->SetSelection( 2 );
bSizerJustification->Add( m_FieldHJustifyCtrl, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxString m_FieldVJustifyCtrlChoices[] = { _("Bottom"), _("Center"), _("Top") };
int m_FieldVJustifyCtrlNChoices = sizeof( m_FieldVJustifyCtrlChoices ) / sizeof( wxString );
m_FieldVJustifyCtrl = new wxRadioBox( fieldsSizer->GetStaticBox(), wxID_ANY, _("Vert. Justify"), wxDefaultPosition, wxDefaultSize, m_FieldVJustifyCtrlNChoices, m_FieldVJustifyCtrlChoices, 1, wxRA_SPECIFY_COLS );
m_FieldVJustifyCtrl->SetSelection( 2 );
bSizerJustification->Add( m_FieldVJustifyCtrl, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
fieldEditBoxSizer->Add( bSizerJustification, 1, wxEXPAND|wxBOTTOM, 5 );
wxBoxSizer* bSizerStyle;
bSizerStyle = new wxBoxSizer( wxHORIZONTAL );
wxStaticBoxSizer* visibilitySizer;
visibilitySizer = new wxStaticBoxSizer( new wxStaticBox( fieldsSizer->GetStaticBox(), wxID_ANY, _("Visibility") ), wxVERTICAL );
showCheckBox = new wxCheckBox( visibilitySizer->GetStaticBox(), wxID_ANY, _("Show"), wxDefaultPosition, wxDefaultSize, 0 );
showCheckBox->SetToolTip( _("Check if you want this field visible") );
visibilitySizer->Add( showCheckBox, 0, wxALL, 5 );
rotateCheckBox = new wxCheckBox( visibilitySizer->GetStaticBox(), wxID_ANY, _("Rotate"), wxDefaultPosition, wxDefaultSize, 0 );
rotateCheckBox->SetToolTip( _("Check if you want this field's text rotated 90 degrees") );
visibilitySizer->Add( rotateCheckBox, 0, wxALL, 5 );
bSizerStyle->Add( visibilitySizer, 1, wxEXPAND|wxALL, 5 );
wxString m_StyleRadioBoxChoices[] = { _("Normal"), _("Italic"), _("Bold"), _("Bold Italic") };
int m_StyleRadioBoxNChoices = sizeof( m_StyleRadioBoxChoices ) / sizeof( wxString );
m_StyleRadioBox = new wxRadioBox( fieldsSizer->GetStaticBox(), wxID_ANY, _("Style:"), wxDefaultPosition, wxDefaultSize, m_StyleRadioBoxNChoices, m_StyleRadioBoxChoices, 1, wxRA_SPECIFY_COLS );
m_StyleRadioBox->SetSelection( 3 );
m_StyleRadioBox->SetToolTip( _("The style of the currently selected field's text in the schematic") );
bSizerStyle->Add( m_StyleRadioBox, 1, wxEXPAND|wxALL, 5 );
fieldEditBoxSizer->Add( bSizerStyle, 1, wxEXPAND|wxBOTTOM, 5 );
wxBoxSizer* fieldNameBoxSizer;
fieldNameBoxSizer = new wxBoxSizer( wxVERTICAL );
fieldNameLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("Field Name"), wxDefaultPosition, wxDefaultSize, 0 );
fieldNameLabel->Wrap( -1 );
fieldNameBoxSizer->Add( fieldNameLabel, 0, wxTOP, 5 );
fieldNameTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fieldNameTextCtrl->SetToolTip( _("The name of the currently selected field\nSome fixed fields names are not editable") );
fieldNameBoxSizer->Add( fieldNameTextCtrl, 0, wxBOTTOM|wxEXPAND, 5 );
fieldValueLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("Field Value"), wxDefaultPosition, wxDefaultSize, 0 );
fieldValueLabel->Wrap( -1 );
fieldNameBoxSizer->Add( fieldValueLabel, 0, wxALIGN_TOP|wxTOP, 5 );
fieldValueTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fieldValueTextCtrl->SetToolTip( _("The name of the currently selected field\nSome fixed fields names are not editable") );
fieldNameBoxSizer->Add( fieldValueTextCtrl, 0, wxEXPAND|wxBOTTOM, 5 );
m_show_datasheet_button = new wxButton( fieldsSizer->GetStaticBox(), wxID_ANY, _("Show in Browser"), wxDefaultPosition, wxDefaultSize, 0 );
m_show_datasheet_button->SetToolTip( _("If your datasheet is an http:// link or a complete file path, then it may show in your browser by pressing this button.") );
fieldNameBoxSizer->Add( m_show_datasheet_button, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
fieldEditBoxSizer->Add( fieldNameBoxSizer, 0, wxBOTTOM|wxEXPAND, 5 );
wxFlexGridSizer* fgSizerPosSize;
fgSizerPosSize = new wxFlexGridSizer( 3, 3, 0, 0 );
fgSizerPosSize->AddGrowableCol( 1 );
fgSizerPosSize->SetFlexibleDirection( wxBOTH );
fgSizerPosSize->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
textSizeLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("Size"), wxDefaultPosition, wxDefaultSize, 0 );
textSizeLabel->Wrap( -1 );
fgSizerPosSize->Add( textSizeLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
textSizeTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
textSizeTextCtrl->SetToolTip( _("The size of the currently selected field's text in the schematic") );
fgSizerPosSize->Add( textSizeTextCtrl, 0, wxEXPAND|wxBOTTOM, 5 );
m_staticTextUnitSize = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextUnitSize->Wrap( -1 );
fgSizerPosSize->Add( m_staticTextUnitSize, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
posXLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("PosX"), wxDefaultPosition, wxDefaultSize, 0 );
posXLabel->Wrap( -1 );
fgSizerPosSize->Add( posXLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
posXTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
posXTextCtrl->SetToolTip( _("The X coordinate of the text relative to the component") );
fgSizerPosSize->Add( posXTextCtrl, 0, wxEXPAND|wxTOP, 5 );
m_staticTextUnitPosX = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextUnitPosX->Wrap( -1 );
fgSizerPosSize->Add( m_staticTextUnitPosX, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
posYLabel = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("PosY"), wxDefaultPosition, wxDefaultSize, 0 );
posYLabel->Wrap( -1 );
fgSizerPosSize->Add( posYLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
posYTextCtrl = new wxTextCtrl( fieldsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
posYTextCtrl->SetToolTip( _("The Y coordinate of the text relative to the component") );
fgSizerPosSize->Add( posYTextCtrl, 0, wxEXPAND, 5 );
m_staticTextUnitPosY = new wxStaticText( fieldsSizer->GetStaticBox(), wxID_ANY, _("unit"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextUnitPosY->Wrap( -1 );
fgSizerPosSize->Add( m_staticTextUnitPosY, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
fieldEditBoxSizer->Add( fgSizerPosSize, 1, wxEXPAND|wxTOP, 5 );
fieldsSizer->Add( fieldEditBoxSizer, 2, wxEXPAND, 5 );
upperSizer->Add( fieldsSizer, 1, wxALL|wxEXPAND, 5 );
mainSizer->Add( upperSizer, 1, wxEXPAND, 5 );
stdDialogButtonSizer = new wxStdDialogButtonSizer();
stdDialogButtonSizerOK = new wxButton( this, wxID_OK );
stdDialogButtonSizer->AddButton( stdDialogButtonSizerOK );
stdDialogButtonSizerCancel = new wxButton( this, wxID_CANCEL );
stdDialogButtonSizer->AddButton( stdDialogButtonSizerCancel );
stdDialogButtonSizer->Realize();
mainSizer->Add( stdDialogButtonSizer, 0, wxALL|wxEXPAND, 5 );
this->SetSizer( mainSizer );
this->Layout();
// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnCloseDialog ) );
this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnInitDlg ) );
m_buttonTestChipName->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnTestChipName ), NULL, this );
m_buttonSelectChipName->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnSelectChipName ), NULL, this );
spiceFieldsButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::EditSpiceModel ), NULL, this );
defaultsButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::SetInitCmp ), NULL, this );
fieldListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnListItemDeselected ), NULL, this );
fieldListCtrl->Connect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnListItemSelected ), NULL, this );
@ -311,6 +314,7 @@ DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::~DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP(
this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnInitDlg ) );
m_buttonTestChipName->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnTestChipName ), NULL, this );
m_buttonSelectChipName->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnSelectChipName ), NULL, this );
spiceFieldsButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::EditSpiceModel ), NULL, this );
defaultsButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::SetInitCmp ), NULL, this );
fieldListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_DESELECTED, wxListEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnListItemDeselected ), NULL, this );
fieldListCtrl->Disconnect( wxEVT_COMMAND_LIST_ITEM_SELECTED, wxListEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnListItemSelected ), NULL, this );
@ -320,5 +324,5 @@ DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::~DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP(
m_show_datasheet_button->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::showButtonHandler ), NULL, this );
stdDialogButtonSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnCancelButtonClick ), NULL, this );
stdDialogButtonSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP::OnOKButtonClick ), NULL, this );
}

View File

@ -44,7 +44,7 @@
<property name="minimum_size"></property>
<property name="name">DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP</property>
<property name="pos"></property>
<property name="size">688,586</property>
<property name="size">928,741</property>
<property name="style">wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU</property>
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
<property name="title">Component Properties</property>
@ -286,11 +286,11 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizerUnitsInterchangeable</property>
<property name="orient">wxHORIZONTAL</property>
@ -378,11 +378,11 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -731,11 +731,11 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticBoxSizer" expanded="1">
<object class="wxStaticBoxSizer" expanded="0">
<property name="id">wxID_ANY</property>
<property name="label">Chip Name</property>
<property name="minimum_size"></property>
@ -835,20 +835,20 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizerChpinameButt</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxTOP|wxBOTTOM|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -932,11 +932,11 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -1024,11 +1024,11 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -1107,11 +1107,11 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="1">
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -1198,11 +1198,11 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticLine" expanded="1">
<object class="wxStaticLine" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
@ -1279,6 +1279,94 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Edit Spice model</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">spiceFieldsButton</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">EditSpiceModel</event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
@ -1386,7 +1474,7 @@
<property name="border">8</property>
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
<property name="proportion">3</property>
<object class="wxStaticBoxSizer" expanded="1">
<object class="wxStaticBoxSizer" expanded="0">
<property name="id">wxID_ANY</property>
<property name="label"></property>
<property name="minimum_size"></property>
@ -1770,16 +1858,16 @@
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">2</property>
<object class="wxBoxSizer" expanded="1">
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">fieldEditBoxSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxBOTTOM</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizerJustification</property>
<property name="orient">wxHORIZONTAL</property>
@ -1966,20 +2054,20 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxBOTTOM</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizerStyle</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALL</property>
<property name="proportion">1</property>
<object class="wxStaticBoxSizer" expanded="1">
<object class="wxStaticBoxSizer" expanded="0">
<property name="id">wxID_ANY</property>
<property name="label">Visibility</property>
<property name="minimum_size"></property>
@ -2258,11 +2346,11 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">fieldNameBoxSizer</property>
<property name="orient">wxVERTICAL</property>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version May 21 2016)
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@ -40,7 +40,7 @@ class DIALOG_SHIM;
class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
{
private:
protected:
wxStaticText* m_staticTextUnit;
wxChoice* unitChoice;
@ -55,6 +55,7 @@ class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
wxStaticText* m_staticTextTimeStamp;
wxTextCtrl* m_textCtrlTimeStamp;
wxStaticLine* m_staticline1;
wxButton* spiceFieldsButton;
wxButton* defaultsButton;
wxListCtrl* fieldListCtrl;
wxButton* addFieldButton;
@ -82,12 +83,13 @@ class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
wxStdDialogButtonSizer* stdDialogButtonSizer;
wxButton* stdDialogButtonSizerOK;
wxButton* stdDialogButtonSizerCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnCloseDialog( wxCloseEvent& event ) { event.Skip(); }
virtual void OnInitDlg( wxInitDialogEvent& event ) { event.Skip(); }
virtual void OnTestChipName( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSelectChipName( wxCommandEvent& event ) { event.Skip(); }
virtual void EditSpiceModel( wxCommandEvent& event ) { event.Skip(); }
virtual void SetInitCmp( wxCommandEvent& event ) { event.Skip(); }
virtual void OnListItemDeselected( wxListEvent& event ) { event.Skip(); }
virtual void OnListItemSelected( wxListEvent& event ) { event.Skip(); }
@ -97,13 +99,13 @@ class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP : public DIALOG_SHIM
virtual void showButtonHandler( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCancelButtonClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Component Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 688,586 ), long style = wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU );
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Component Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 928,741 ), long style = wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU );
~DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP();
};
#endif //__DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP_H__

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version May 6 2016)
// C++ code generated with wxFormBuilder (version Jun 21 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@ -35,7 +35,7 @@ DIALOG_LIB_EDIT_TEXT_BASE::DIALOG_LIB_EDIT_TEXT_BASE( wxWindow* parent, wxWindow
m_TextValue = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_TextValue->SetMinSize( wxSize( 200,-1 ) );
bTextValueOptsSizer->Add( m_TextValue, 1, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 5 );
bTextValueOptsSizer->Add( m_TextValue, 1, wxALL|wxEXPAND, 5 );
m_TextValueSelectButton = new wxButton( this, wxID_ANY, _("Select"), wxDefaultPosition, wxDefaultSize, 0 );
bTextValueOptsSizer->Add( m_TextValueSelectButton, 0, wxALIGN_CENTER_VERTICAL, 5 );
@ -54,7 +54,7 @@ DIALOG_LIB_EDIT_TEXT_BASE::DIALOG_LIB_EDIT_TEXT_BASE( wxWindow* parent, wxWindow
bTextSizeSizer->Add( m_TextSizeText, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_TextSize = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bTextSizeSizer->Add( m_TextSize, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP, 5 );
bTextSizeSizer->Add( m_TextSize, 0, wxBOTTOM|wxLEFT|wxRIGHT|wxTOP, 5 );
bUpperBoxSizer->Add( bTextSizeSizer, 0, wxEXPAND, 5 );

View File

@ -214,7 +214,7 @@
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
@ -489,7 +489,7 @@
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP</property>
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
@ -684,6 +684,7 @@
<property name="minimum_size"></property>
<property name="name">sOptionsSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="parent">1</property>
<property name="permission">none</property>
<event name="OnUpdateUI"></event>
<object class="sizeritem" expanded="0">

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version May 6 2016)
// C++ code generated with wxFormBuilder (version Jun 21 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!

View File

@ -52,6 +52,7 @@
#include <wildcards_and_files_ext.h>
#include <wildcards_and_files_ext.h>
#include <invoke_sch_dialog.h>
#include <netlist_exporters/netlist_exporter_pspice.h>
#include <eeschema_id.h>

View File

@ -0,0 +1,104 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "dialog_signal_list.h"
#include <sim/sim_plot_frame.h>
#include <sim/netlist_exporter_pspice_sim.h>
DIALOG_SIGNAL_LIST::DIALOG_SIGNAL_LIST( SIM_PLOT_FRAME* aParent, NETLIST_EXPORTER_PSPICE_SIM* aExporter )
: DIALOG_SIGNAL_LIST_BASE( aParent ), m_plotFrame( aParent ), m_exporter( aExporter )
{
}
bool DIALOG_SIGNAL_LIST::TransferDataFromWindow()
{
if( !DIALOG_SIGNAL_LIST_BASE::TransferDataFromWindow() )
return false;
addSelectionToPlotFrame();
return true;
}
bool DIALOG_SIGNAL_LIST::TransferDataToWindow()
{
// Create a list of possible signals
/// @todo it could include separated mag & phase for AC analysis
if( m_exporter )
{
// Voltage list
for( const auto& net : m_exporter->GetNetIndexMap() )
{
if( net.first != "GND" )
m_signals->Append( wxString::Format( "V(%s)", net.first ) );
}
// For some reason, it is not possible to plot currents in any but transient analysis
if( m_exporter->GetSimType() == ST_TRANSIENT )
{
for( const auto& item : m_exporter->GetSpiceItems() )
{
// Add all possible currents for the primitive
for( const auto& current :
NETLIST_EXPORTER_PSPICE_SIM::GetCurrents( (SPICE_PRIMITIVE) item.m_primitive ) )
{
m_signals->Append( wxString::Format( "%s(%s)", current, item.m_refName ) );
}
}
}
}
return DIALOG_SIGNAL_LIST_BASE::TransferDataToWindow();
}
void DIALOG_SIGNAL_LIST::addSelectionToPlotFrame()
{
for( unsigned int i = 0; i < m_signals->GetCount(); ++i )
{
if( m_signals->IsSelected( i ) )
{
const wxString& plotName = m_signals->GetString( i );
// Get the part in the parentheses
wxString name = plotName.AfterFirst( '(' ).BeforeLast( ')' );
if( plotName[0] == 'V' )
{
m_plotFrame->AddVoltagePlot( name );
}
else if( plotName[0] == 'I' )
{
m_plotFrame->AddCurrentPlot( name, plotName.BeforeFirst( '(' ) );
}
else
{
wxASSERT_MSG( false, "Unhandled plot type" );
}
}
}
}

View File

@ -0,0 +1,53 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef DIALOG_SIGNAL_LIST_H
#define DIALOG_SIGNAL_LIST_H
#include "dialog_signal_list_base.h"
class SIM_PLOT_FRAME;
class NETLIST_EXPORTER_PSPICE_SIM;
class DIALOG_SIGNAL_LIST : public DIALOG_SIGNAL_LIST_BASE
{
public:
DIALOG_SIGNAL_LIST( SIM_PLOT_FRAME* aParent, NETLIST_EXPORTER_PSPICE_SIM* aExporter );
bool TransferDataFromWindow() override;
bool TransferDataToWindow() override;
private:
void onSignalAdd( wxCommandEvent& event ) override
{
addSelectionToPlotFrame();
}
void addSelectionToPlotFrame();
SIM_PLOT_FRAME* m_plotFrame;
NETLIST_EXPORTER_PSPICE_SIM* m_exporter;
};
#endif /* DIALOG_SIGNAL_LIST_H */

View File

@ -0,0 +1,46 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dialog_signal_list_base.h"
///////////////////////////////////////////////////////////////////////////
DIALOG_SIGNAL_LIST_BASE::DIALOG_SIGNAL_LIST_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* bSizer6;
bSizer6 = new wxBoxSizer( wxVERTICAL );
m_signals = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB|wxLB_SORT );
bSizer6->Add( m_signals, 1, wxALL|wxEXPAND, 5 );
m_sdbSizer = new wxStdDialogButtonSizer();
m_sdbSizerOK = new wxButton( this, wxID_OK );
m_sdbSizer->AddButton( m_sdbSizerOK );
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
m_sdbSizer->AddButton( m_sdbSizerCancel );
m_sdbSizer->Realize();
bSizer6->Add( m_sdbSizer, 0, wxEXPAND, 5 );
this->SetSizer( bSizer6 );
this->Layout();
this->Centre( wxBOTH );
// Connect Events
m_signals->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( DIALOG_SIGNAL_LIST_BASE::onSignalAdd ), NULL, this );
}
DIALOG_SIGNAL_LIST_BASE::~DIALOG_SIGNAL_LIST_BASE()
{
// Disconnect Events
m_signals->Disconnect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( DIALOG_SIGNAL_LIST_BASE::onSignalAdd ), NULL, this );
}

View File

@ -0,0 +1,213 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="13" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">dialog_signal_list_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">1</property>
<property name="name">DIALOG_SIGNAL_LIST_BASE</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center">wxBOTH</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">DIALOG_SIGNAL_LIST_BASE</property>
<property name="pos"></property>
<property name="size">424,535</property>
<property name="style">wxDEFAULT_DIALOG_STYLE</property>
<property name="subclass"></property>
<property name="title"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnActivate"></event>
<event name="OnActivateApp"></event>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnClose"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnHibernate"></event>
<event name="OnIconize"></event>
<event name="OnIdle"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer6</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxListBox" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_signals</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxLB_EXTENDED|wxLB_NEEDED_SB|wxLB_SORT</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnListBox"></event>
<event name="OnListBoxDClick">onSignalAdd</event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxStdDialogButtonSizer" expanded="1">
<property name="Apply">0</property>
<property name="Cancel">1</property>
<property name="ContextHelp">0</property>
<property name="Help">0</property>
<property name="No">0</property>
<property name="OK">1</property>
<property name="Save">0</property>
<property name="Yes">0</property>
<property name="minimum_size"></property>
<property name="name">m_sdbSizer</property>
<property name="permission">protected</property>
<event name="OnApplyButtonClick"></event>
<event name="OnCancelButtonClick"></event>
<event name="OnContextHelpButtonClick"></event>
<event name="OnHelpButtonClick"></event>
<event name="OnNoButtonClick"></event>
<event name="OnOKButtonClick"></event>
<event name="OnSaveButtonClick"></event>
<event name="OnYesButtonClick"></event>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -0,0 +1,51 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_SIGNAL_LIST_BASE_H__
#define __DIALOG_SIGNAL_LIST_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
#include <wx/string.h>
#include <wx/listbox.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/sizer.h>
#include <wx/button.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_SIGNAL_LIST_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_SIGNAL_LIST_BASE : public wxDialog
{
private:
protected:
wxListBox* m_signals;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;
// Virtual event handlers, overide them in your derived class
virtual void onSignalAdd( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_SIGNAL_LIST_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 424,535 ), long style = wxDEFAULT_DIALOG_STYLE );
~DIALOG_SIGNAL_LIST_BASE();
};
#endif //__DIALOG_SIGNAL_LIST_BASE_H__

View File

@ -0,0 +1,413 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "dialog_sim_settings.h"
#include <sim/netlist_exporter_pspice_sim.h>
#include <confirm.h>
#include <wx/tokenzr.h>
/// @todo ngspice offers more types of analysis,
//so there are a few tabs missing (e.g. pole-zero, distortion, sensitivity)
// Helper function to shorten conditions
static bool empty( const wxTextEntryBase* aCtrl )
{
return aCtrl->GetValue().IsEmpty();
}
DIALOG_SIM_SETTINGS::DIALOG_SIM_SETTINGS( wxWindow* aParent )
: DIALOG_SIM_SETTINGS_BASE( aParent ), m_exporter( nullptr ), m_spiceEmptyValidator( true )
{
m_posIntValidator.SetMin( 1 );
m_acPointsNumber->SetValidator( m_posIntValidator );
m_acFreqStart->SetValidator( m_spiceValidator );
m_acFreqStop->SetValidator( m_spiceValidator );
m_dcStart1->SetValidator( m_spiceValidator );
m_dcStop1->SetValidator( m_spiceValidator );
m_dcIncr1->SetValidator( m_spiceValidator );
m_dcStart2->SetValidator( m_spiceValidator );
m_dcStop2->SetValidator( m_spiceValidator );
m_dcIncr2->SetValidator( m_spiceValidator );
m_noisePointsNumber->SetValidator( m_posIntValidator );
m_noiseFreqStart->SetValidator( m_spiceValidator );
m_noiseFreqStop->SetValidator( m_spiceValidator );
m_transStep->SetValidator( m_spiceValidator );
m_transFinal->SetValidator( m_spiceValidator );
m_transInitial->SetValidator( m_spiceEmptyValidator );
m_sdbSizerOK->SetDefault();
updateNetlistOpts();
}
bool DIALOG_SIM_SETTINGS::TransferDataFromWindow()
{
if( !wxDialog::TransferDataFromWindow() )
return false;
wxWindow* page = m_simPages->GetCurrentPage();
// AC analysis
if( page == m_pgAC )
{
if( !m_pgAC->Validate() )
return false;
m_simCommand = wxString::Format( ".ac %s %s %s %s",
scaleToString( m_acScale->GetSelection() ),
m_acPointsNumber->GetValue(),
SPICE_VALUE( m_acFreqStart->GetValue() ).ToSpiceString(),
SPICE_VALUE( m_acFreqStop->GetValue() ).ToSpiceString() );
}
// DC transfer analysis
else if( page == m_pgDC )
{
// At least one source has to be enabled
if( !m_dcEnable1->IsChecked() && !m_dcEnable1->IsChecked() )
{
DisplayError( this, wxT( "You need to enable at least one source" ) );
return false;
}
wxString simCmd = wxString( ".dc " );
if( m_dcEnable1->IsChecked() )
{
if( empty( m_dcSource1 ) )
{
DisplayError( this, wxT( "You need to select DC source (sweep 1)" ) );
return false;
}
/// @todo for some reason it does not trigger the assigned SPICE_VALIDATOR,
// hence try..catch below
if( !m_dcStart1->Validate() || !m_dcStop1->Validate() || !m_dcIncr1->Validate() )
return false;
try
{
simCmd += wxString::Format( "v%s %s %s %s",
m_dcSource1->GetValue(),
SPICE_VALUE( m_dcStart1->GetValue() ).ToSpiceString(),
SPICE_VALUE( m_dcStop1->GetValue() ).ToSpiceString(),
SPICE_VALUE( m_dcIncr1->GetValue() ).ToSpiceString() );
}
catch( std::exception& e )
{
DisplayError( this, e.what() );
return false;
}
}
if( m_dcEnable2->IsChecked() )
{
if( empty( m_dcSource2 ) )
{
DisplayError( this, wxT( "You need to select DC source (sweep 2)" ) );
return false;
}
/// @todo for some reason it does not trigger the assigned SPICE_VALIDATOR,
// hence try..catch below
if( !m_dcStart2->Validate() || !m_dcStop2->Validate() || !m_dcIncr2->Validate() )
return false;
try
{
simCmd += wxString::Format( "v%s %s %s %s",
m_dcSource2->GetValue(),
SPICE_VALUE( m_dcStart2->GetValue() ).ToSpiceString(),
SPICE_VALUE( m_dcStop2->GetValue() ).ToSpiceString(),
SPICE_VALUE( m_dcIncr2->GetValue() ).ToSpiceString() );
}
catch( std::exception& e )
{
DisplayError( this, e.what() );
return false;
}
}
m_simCommand = simCmd;
}
// Noise analysis
else if( page == m_pgNoise )
{
const NETLIST_EXPORTER_PSPICE::NET_INDEX_MAP& netMap = m_exporter->GetNetIndexMap();
if( empty( m_noiseMeas ) || empty( m_noiseSrc ) || empty( m_noisePointsNumber )
|| empty( m_noiseFreqStart ) || empty( m_noiseFreqStop ) )
return false;
wxString ref = empty( m_noiseRef )
? wxString() : wxString::Format( ", %d", netMap.at( m_noiseRef->GetValue() ) );
m_simCommand = wxString::Format( ".noise v(%d%s) v%s %s %s %s %s",
netMap.at( m_noiseMeas->GetValue() ), ref,
m_noiseSrc->GetValue(), scaleToString( m_noiseScale->GetSelection() ),
m_noisePointsNumber->GetValue(),
SPICE_VALUE( m_noiseFreqStart->GetValue() ).ToSpiceString(),
SPICE_VALUE( m_noiseFreqStop->GetValue() ).ToSpiceString() );
}
// DC operating point analysis
else if( page == m_pgOP )
{
m_simCommand = wxString( ".op" );
}
// Transient analysis
else if( page == m_pgTransient )
{
if( !m_pgTransient->Validate() )
return false;
wxString initial = empty( m_transInitial )
? "" : SPICE_VALUE( m_transInitial->GetValue() ).ToSpiceString();
m_simCommand = wxString::Format( ".tran %s %s %s",
SPICE_VALUE( m_transStep->GetValue() ).ToSpiceString(),
SPICE_VALUE( m_transFinal->GetValue() ).ToSpiceString(),
initial );
}
// Custom directives
else if( page == m_pgCustom )
{
m_simCommand = m_customTxt->GetValue();
}
else
{
return false;
}
m_simCommand.Trim();
updateNetlistOpts();
return true;
}
bool DIALOG_SIM_SETTINGS::TransferDataToWindow()
{
/// @todo one day it could interpret the sim command and fill out appropriate fields..
if( empty( m_customTxt ) )
loadDirectives();
if( m_simCommand.IsEmpty() && !empty( m_customTxt ) )
return parseCommand( m_customTxt->GetValue() );
return true;
}
int DIALOG_SIM_SETTINGS::ShowModal()
{
// Fill out comboboxes that allow to select nets
// Map comoboxes to their current values
std::map<wxComboBox*, wxString> cmbNet = {
{ m_noiseMeas, m_noiseMeas->GetStringSelection() },
{ m_noiseRef, m_noiseRef->GetStringSelection() }
};
for( auto c : cmbNet )
c.first->Clear();
for( auto net : m_exporter->GetNetIndexMap() )
{
for( auto c : cmbNet )
c.first->Append( net.first );
}
// Try to restore the previous selection, if possible
for( auto c : cmbNet )
{
int idx = c.first->FindString( c.second );
if( idx != wxNOT_FOUND )
c.first->SetSelection( idx );
}
// Fill out comboboxes that allow to select power sources
std::map<wxComboBox*, wxString> cmbSrc = {
{ m_dcSource1, m_dcSource1->GetStringSelection() },
{ m_dcSource2, m_dcSource2->GetStringSelection() },
{ m_noiseSrc, m_noiseSrc->GetStringSelection() },
};
for( auto c : cmbSrc )
c.first->Clear();
for( auto item : m_exporter->GetSpiceItems() )
{
if( item.m_primitive == 'V' )
{
for( auto c : cmbSrc )
c.first->Append( item.m_refName );
}
}
// Try to restore the previous selection, if possible
for( auto c : cmbSrc )
{
int idx = c.first->FindString( c.second );
if( idx != wxNOT_FOUND )
c.first->SetSelection( idx );
}
return DIALOG_SIM_SETTINGS_BASE::ShowModal();
}
bool DIALOG_SIM_SETTINGS::parseCommand( const wxString& aCommand )
{
if( aCommand.IsEmpty() )
return false;
wxStringTokenizer tokenizer( aCommand, " " );
wxString tkn = tokenizer.GetNextToken().Lower();
try {
if( tkn == ".ac" )
{
m_simPages->SetSelection( m_simPages->FindPage( m_pgAC ) );
tkn = tokenizer.GetNextToken().Lower();
if( tkn == "dec" )
m_acScale->SetSelection( 0 );
if( tkn == "oct" )
m_acScale->SetSelection( 1 );
if( tkn == "lin" )
m_acScale->SetSelection( 2 );
else
return false;
// If the fields below are empty, it will be caught by the exception handler
m_acPointsNumber->SetValue( tokenizer.GetNextToken() );
m_acFreqStart->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
m_acFreqStop->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
}
else if( tkn == ".dc" )
{
m_simPages->SetSelection( m_simPages->FindPage( m_pgDC ) );
tkn = tokenizer.GetNextToken();
if( !tkn.IsEmpty() )
{
m_dcSource1->SetValue( tkn );
m_dcStart1->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
m_dcStop1->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
m_dcIncr1->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
// Check the 'Enabled' field, if all values are filled
m_dcEnable1->SetValue( !empty( m_dcSource1 ) && !empty( m_dcStart1 )
&& !empty( m_dcStop1 ) && !empty( m_dcIncr1 ) );
}
tkn = tokenizer.GetNextToken();
if( !tkn.IsEmpty() )
{
m_dcSource2->SetValue( tkn );
m_dcStart2->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
m_dcStop2->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
m_dcIncr2->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
// Check the 'Enabled' field, if all values are filled
m_dcEnable2->SetValue( !empty( m_dcSource2 ) && !empty( m_dcStart2 )
&& !empty( m_dcStop2 ) && !empty( m_dcIncr2 ) );
}
// Check if the directive is complete
if( !m_dcEnable1->IsChecked() || !m_dcEnable2->IsChecked() )
return false;
}
else if( tkn == ".tran" )
{
m_simPages->SetSelection( m_simPages->FindPage( m_pgTransient ) );
// If the fields below are empty, it will be caught by the exception handler
m_transStep->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
m_transFinal->SetValue( SPICE_VALUE( tokenizer.GetNextToken() ).ToSpiceString() );
// Initial time is an optional field
tkn = tokenizer.GetNextToken();
if( !tkn.IsEmpty() )
m_transInitial->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
}
// Custom directives
else if( !empty( m_customTxt ) )
{
m_simPages->SetSelection( m_simPages->FindPage( m_pgCustom ) );
}
}
catch( ... )
{
// Nothing really bad has happened
return false;
}
return true;
}
void DIALOG_SIM_SETTINGS::loadDirectives()
{
if( m_exporter )
m_customTxt->SetValue( m_exporter->GetSheetSimCommand() );
}
void DIALOG_SIM_SETTINGS::updateNetlistOpts()
{
m_netlistOpts = NET_ALL_FLAGS;
if( !m_fixPassiveVals->IsChecked() )
m_netlistOpts &= ~NET_ADJUST_PASSIVE_VALS;
if( !m_fixIncludePaths->IsChecked() )
m_netlistOpts &= ~NET_ADJUST_INCLUDE_PATHS;
}

View File

@ -0,0 +1,121 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef DIALOG_SIM_SETTINGS_BASE_H
#define DIALOG_SIM_SETTINGS_BASE_H
#include "dialog_sim_settings_base.h"
#include <sim/spice_value.h>
#include <wx/valnum.h>
class NETLIST_EXPORTER_PSPICE_SIM;
class DIALOG_SIM_SETTINGS : public DIALOG_SIM_SETTINGS_BASE
{
public:
DIALOG_SIM_SETTINGS( wxWindow* aParent );
const wxString& GetSimCommand() const
{
return m_simCommand;
}
bool SetSimCommand( const wxString& aCommand )
{
bool res = parseCommand( aCommand );
if( res )
m_simCommand = aCommand;
return res;
}
int GetNetlistOptions() const
{
return m_netlistOpts;
}
void SetNetlistExporter( NETLIST_EXPORTER_PSPICE_SIM* aExporter )
{
m_exporter = aExporter;
}
bool TransferDataFromWindow() override;
bool TransferDataToWindow() override;
int ShowModal() override;
private:
enum SCALE_TYPE
{
DECADE,
OCTAVE,
LINEAR
};
/**
* @brief Parses a Spice directive.
* @param aCommand is the directive to be parsed (e.g. ".tran 10n 1000n").
* @return bool if the directive was parsed correctly.
*/
bool parseCommand( const wxString& aCommand );
void onLoadDirectives( wxCommandEvent& event ) override
{
loadDirectives();
}
static wxString scaleToString( int aOption )
{
switch( aOption )
{
case DECADE:
return wxString( "dec" );
case OCTAVE:
return wxString( "oct" );
case LINEAR:
return wxString( "lin" );
}
wxASSERT_MSG( false, "Unhandled scale type" );
return wxEmptyString;
}
void loadDirectives();
void updateNetlistOpts();
wxString m_simCommand;
int m_netlistOpts;
NETLIST_EXPORTER_PSPICE_SIM* m_exporter;
SPICE_VALIDATOR m_spiceValidator;
SPICE_VALIDATOR m_spiceEmptyValidator;
wxIntegerValidator<int> m_posIntValidator;
};
#endif /* DIALOG_SIM_SETTINGS_BASE_H */

View File

@ -0,0 +1,417 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dialog_sim_settings_base.h"
///////////////////////////////////////////////////////////////////////////
DIALOG_SIM_SETTINGS_BASE::DIALOG_SIM_SETTINGS_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
m_simPages = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
m_pgAC = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxBoxSizer* bSizer3;
bSizer3 = new wxBoxSizer( wxVERTICAL );
bSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
wxString m_acScaleChoices[] = { wxT("Decade"), wxT("Octave"), wxT("Linear") };
int m_acScaleNChoices = sizeof( m_acScaleChoices ) / sizeof( wxString );
m_acScale = new wxRadioBox( m_pgAC, wxID_ANY, wxT("Frequency scale"), wxDefaultPosition, wxDefaultSize, m_acScaleNChoices, m_acScaleChoices, 1, wxRA_SPECIFY_COLS );
m_acScale->SetSelection( 0 );
m_acScale->Hide();
bSizer3->Add( m_acScale, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
bSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
wxFlexGridSizer* fgSizer1;
fgSizer1 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer1->SetFlexibleDirection( wxBOTH );
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText1 = new wxStaticText( m_pgAC, wxID_ANY, wxT("Number of points"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText1->Wrap( -1 );
fgSizer1->Add( m_staticText1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_acPointsNumber = new wxTextCtrl( m_pgAC, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_acPointsNumber, 0, wxALL|wxEXPAND, 5 );
m_staticText2 = new wxStaticText( m_pgAC, wxID_ANY, wxT("Start frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText2->Wrap( -1 );
fgSizer1->Add( m_staticText2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_acFreqStart = new wxTextCtrl( m_pgAC, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_acFreqStart, 0, wxALL|wxEXPAND, 5 );
m_staticText3 = new wxStaticText( m_pgAC, wxID_ANY, wxT("Stop frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText3->Wrap( -1 );
fgSizer1->Add( m_staticText3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_acFreqStop = new wxTextCtrl( m_pgAC, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer1->Add( m_acFreqStop, 0, wxALL, 5 );
bSizer3->Add( fgSizer1, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
m_pgAC->SetSizer( bSizer3 );
m_pgAC->Layout();
bSizer3->Fit( m_pgAC );
m_simPages->AddPage( m_pgAC, wxT("AC"), true );
m_pgDC = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxBoxSizer* bSizer4;
bSizer4 = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbSizer21;
sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_pgDC, wxID_ANY, wxT("DC sweep source 1") ), wxVERTICAL );
m_dcEnable1 = new wxCheckBox( sbSizer21->GetStaticBox(), wxID_ANY, wxT("Enable"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer21->Add( m_dcEnable1, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
wxFlexGridSizer* fgSizer21;
fgSizer21 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer21->SetFlexibleDirection( wxBOTH );
fgSizer21->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText41 = new wxStaticText( sbSizer21->GetStaticBox(), wxID_ANY, wxT("DC source"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText41->Wrap( -1 );
fgSizer21->Add( m_staticText41, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_dcSource1 = new wxComboBox( sbSizer21->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgSizer21->Add( m_dcSource1, 0, wxALL, 5 );
m_staticText51 = new wxStaticText( sbSizer21->GetStaticBox(), wxID_ANY, wxT("Starting voltage [V]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText51->Wrap( -1 );
fgSizer21->Add( m_staticText51, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_dcStart1 = new wxTextCtrl( sbSizer21->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer21->Add( m_dcStart1, 0, wxALL, 5 );
m_staticText61 = new wxStaticText( sbSizer21->GetStaticBox(), wxID_ANY, wxT("Final voltage [V]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText61->Wrap( -1 );
fgSizer21->Add( m_staticText61, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_dcStop1 = new wxTextCtrl( sbSizer21->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer21->Add( m_dcStop1, 0, wxALL, 5 );
m_staticText71 = new wxStaticText( sbSizer21->GetStaticBox(), wxID_ANY, wxT("Increment step [V]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText71->Wrap( -1 );
fgSizer21->Add( m_staticText71, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_dcIncr1 = new wxTextCtrl( sbSizer21->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer21->Add( m_dcIncr1, 0, wxALL, 5 );
sbSizer21->Add( fgSizer21, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizer4->Add( sbSizer21, 1, wxEXPAND, 5 );
wxStaticBoxSizer* sbSizer2;
sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( m_pgDC, wxID_ANY, wxT("DC sweep source 2") ), wxVERTICAL );
m_dcEnable2 = new wxCheckBox( sbSizer2->GetStaticBox(), wxID_ANY, wxT("Enable"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer2->Add( m_dcEnable2, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
wxFlexGridSizer* fgSizer2;
fgSizer2 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer2->SetFlexibleDirection( wxBOTH );
fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText4 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, wxT("DC source"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText4->Wrap( -1 );
fgSizer2->Add( m_staticText4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_dcSource2 = new wxComboBox( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgSizer2->Add( m_dcSource2, 0, wxALL, 5 );
m_staticText5 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, wxT("Starting voltage [V]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText5->Wrap( -1 );
fgSizer2->Add( m_staticText5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_dcStart2 = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer2->Add( m_dcStart2, 0, wxALL, 5 );
m_staticText6 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, wxT("Final voltage [V]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText6->Wrap( -1 );
fgSizer2->Add( m_staticText6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_dcStop2 = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer2->Add( m_dcStop2, 0, wxALL, 5 );
m_staticText7 = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, wxT("Increment step [V]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText7->Wrap( -1 );
fgSizer2->Add( m_staticText7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_dcIncr2 = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer2->Add( m_dcIncr2, 0, wxALL, 5 );
sbSizer2->Add( fgSizer2, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizer4->Add( sbSizer2, 1, wxEXPAND, 5 );
m_pgDC->SetSizer( bSizer4 );
m_pgDC->Layout();
bSizer4->Fit( m_pgDC );
m_simPages->AddPage( m_pgDC, wxT("DC Transfer"), false );
m_pgDistortion = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pgDistortion->Hide();
m_simPages->AddPage( m_pgDistortion, wxT("Distortion"), false );
m_pgNoise = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pgNoise->Hide();
wxBoxSizer* bSizer15;
bSizer15 = new wxBoxSizer( wxVERTICAL );
bSizer15->Add( 0, 0, 1, wxEXPAND, 5 );
wxFlexGridSizer* fgSizer7;
fgSizer7 = new wxFlexGridSizer( 0, 3, 0, 0 );
fgSizer7->SetFlexibleDirection( wxBOTH );
fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText14 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Measured node"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText14->Wrap( -1 );
fgSizer7->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_noiseMeas = new wxComboBox( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgSizer7->Add( m_noiseMeas, 0, wxALL, 5 );
fgSizer7->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText15 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Reference node"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText15->Wrap( -1 );
fgSizer7->Add( m_staticText15, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_noiseRef = new wxComboBox( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgSizer7->Add( m_noiseRef, 0, wxALL, 5 );
m_staticText23 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("(optional; default GND)"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText23->Wrap( -1 );
fgSizer7->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_staticText16 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Noise source"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText16->Wrap( -1 );
fgSizer7->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_noiseSrc = new wxComboBox( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgSizer7->Add( m_noiseSrc, 0, wxALL, 5 );
fgSizer7->Add( 0, 0, 1, wxEXPAND, 5 );
bSizer15->Add( fgSizer7, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizer15->Add( 0, 0, 1, wxEXPAND, 5 );
wxString m_noiseScaleChoices[] = { wxT("Decade"), wxT("Octave"), wxT("Linear") };
int m_noiseScaleNChoices = sizeof( m_noiseScaleChoices ) / sizeof( wxString );
m_noiseScale = new wxRadioBox( m_pgNoise, wxID_ANY, wxT("Frequency scale"), wxDefaultPosition, wxDefaultSize, m_noiseScaleNChoices, m_noiseScaleChoices, 1, wxRA_SPECIFY_COLS );
m_noiseScale->SetSelection( 0 );
bSizer15->Add( m_noiseScale, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
bSizer15->Add( 0, 0, 1, wxEXPAND, 5 );
wxFlexGridSizer* fgSizer11;
fgSizer11 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer11->SetFlexibleDirection( wxBOTH );
fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText11 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Number of points"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText11->Wrap( -1 );
fgSizer11->Add( m_staticText11, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_noisePointsNumber = new wxTextCtrl( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer11->Add( m_noisePointsNumber, 0, wxALL, 5 );
m_staticText21 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Start frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText21->Wrap( -1 );
fgSizer11->Add( m_staticText21, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_noiseFreqStart = new wxTextCtrl( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer11->Add( m_noiseFreqStart, 0, wxALL, 5 );
m_staticText31 = new wxStaticText( m_pgNoise, wxID_ANY, wxT("Stop frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText31->Wrap( -1 );
fgSizer11->Add( m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_noiseFreqStop = new wxTextCtrl( m_pgNoise, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer11->Add( m_noiseFreqStop, 0, wxALL, 5 );
bSizer15->Add( fgSizer11, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizer15->Add( 0, 0, 1, wxEXPAND, 5 );
m_pgNoise->SetSizer( bSizer15 );
m_pgNoise->Layout();
bSizer15->Fit( m_pgNoise );
m_simPages->AddPage( m_pgNoise, wxT("Noise"), false );
m_pgOP = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pgOP->Hide();
wxBoxSizer* bSizer8;
bSizer8 = new wxBoxSizer( wxVERTICAL );
bSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText13 = new wxStaticText( m_pgOP, wxID_ANY, wxT("This tab has no settings"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText13->Wrap( -1 );
bSizer8->Add( m_staticText13, 0, wxALIGN_CENTER, 5 );
bSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
m_pgOP->SetSizer( bSizer8 );
m_pgOP->Layout();
bSizer8->Fit( m_pgOP );
m_simPages->AddPage( m_pgOP, wxT("Operating Point"), false );
m_pgPoleZero = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pgPoleZero->Hide();
m_simPages->AddPage( m_pgPoleZero, wxT("Pole-Zero"), false );
m_pgSensitivity = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pgSensitivity->Hide();
m_simPages->AddPage( m_pgSensitivity, wxT("Sensitvity"), false );
m_pgTransferFunction = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pgTransferFunction->Hide();
m_simPages->AddPage( m_pgTransferFunction, wxT("Transfer Function"), false );
m_pgTransient = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxBoxSizer* bSizer81;
bSizer81 = new wxBoxSizer( wxVERTICAL );
bSizer81->Add( 0, 0, 1, wxEXPAND, 5 );
wxFlexGridSizer* fgSizer6;
fgSizer6 = new wxFlexGridSizer( 0, 3, 0, 0 );
fgSizer6->SetFlexibleDirection( wxBOTH );
fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText151 = new wxStaticText( m_pgTransient, wxID_ANY, wxT("Time step [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText151->Wrap( -1 );
fgSizer6->Add( m_staticText151, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_transStep = new wxTextCtrl( m_pgTransient, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer6->Add( m_transStep, 0, wxALL, 5 );
fgSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText161 = new wxStaticText( m_pgTransient, wxID_ANY, wxT("Final time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText161->Wrap( -1 );
fgSizer6->Add( m_staticText161, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_transFinal = new wxTextCtrl( m_pgTransient, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer6->Add( m_transFinal, 0, wxALL, 5 );
fgSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText17 = new wxStaticText( m_pgTransient, wxID_ANY, wxT("Initial time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText17->Wrap( -1 );
fgSizer6->Add( m_staticText17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_transInitial = new wxTextCtrl( m_pgTransient, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer6->Add( m_transInitial, 0, wxALL, 5 );
m_staticText24 = new wxStaticText( m_pgTransient, wxID_ANY, wxT("(optional; default 0)"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText24->Wrap( -1 );
fgSizer6->Add( m_staticText24, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
bSizer81->Add( fgSizer6, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
bSizer81->Add( 0, 0, 1, wxEXPAND, 5 );
m_pgTransient->SetSizer( bSizer81 );
m_pgTransient->Layout();
bSizer81->Fit( m_pgTransient );
m_simPages->AddPage( m_pgTransient, wxT("Transient"), false );
m_pgCustom = new wxPanel( m_simPages, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxVERTICAL );
m_staticText18 = new wxStaticText( m_pgCustom, wxID_ANY, wxT("Spice directives:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText18->Wrap( -1 );
bSizer2->Add( m_staticText18, 0, wxALL, 5 );
m_customTxt = new wxTextCtrl( m_pgCustom, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
m_customTxt->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
bSizer2->Add( m_customTxt, 1, wxALL|wxEXPAND, 5 );
m_loadDirectives = new wxButton( m_pgCustom, wxID_ANY, wxT("Load directives from schematic"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer2->Add( m_loadDirectives, 0, wxALL|wxEXPAND, 5 );
m_pgCustom->SetSizer( bSizer2 );
m_pgCustom->Layout();
bSizer2->Fit( m_pgCustom );
m_simPages->AddPage( m_pgCustom, wxT("Custom"), false );
bSizer1->Add( m_simPages, 1, wxEXPAND | wxALL, 5 );
m_fixPassiveVals = new wxCheckBox( this, wxID_ANY, wxT("Adjust passive component values (e.g. M -> Meg; 100 nF -> 100n)"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer1->Add( m_fixPassiveVals, 0, wxALL, 5 );
m_fixIncludePaths = new wxCheckBox( this, wxID_ANY, wxT("Add full path for .include library directives"), wxDefaultPosition, wxDefaultSize, 0 );
m_fixIncludePaths->SetValue(true);
bSizer1->Add( m_fixIncludePaths, 0, wxALL, 5 );
m_sdbSizer = new wxStdDialogButtonSizer();
m_sdbSizerOK = new wxButton( this, wxID_OK );
m_sdbSizer->AddButton( m_sdbSizerOK );
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
m_sdbSizer->AddButton( m_sdbSizerCancel );
m_sdbSizer->Realize();
bSizer1->Add( m_sdbSizer, 0, wxALL|wxEXPAND, 5 );
this->SetSizer( bSizer1 );
this->Layout();
this->Centre( wxBOTH );
// Connect Events
m_loadDirectives->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SIM_SETTINGS_BASE::onLoadDirectives ), NULL, this );
}
DIALOG_SIM_SETTINGS_BASE::~DIALOG_SIM_SETTINGS_BASE()
{
// Disconnect Events
m_loadDirectives->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SIM_SETTINGS_BASE::onLoadDirectives ), NULL, this );
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,123 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_SIM_SETTINGS_BASE_H__
#define __DIALOG_SIM_SETTINGS_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/string.h>
#include <wx/radiobox.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/stattext.h>
#include <wx/textctrl.h>
#include <wx/valtext.h>
#include <wx/sizer.h>
#include <wx/panel.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/checkbox.h>
#include <wx/combobox.h>
#include <wx/statbox.h>
#include <wx/button.h>
#include <wx/notebook.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_SIM_SETTINGS_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_SIM_SETTINGS_BASE : public wxDialog
{
private:
protected:
wxNotebook* m_simPages;
wxPanel* m_pgAC;
wxRadioBox* m_acScale;
wxStaticText* m_staticText1;
wxTextCtrl* m_acPointsNumber;
wxStaticText* m_staticText2;
wxTextCtrl* m_acFreqStart;
wxStaticText* m_staticText3;
wxTextCtrl* m_acFreqStop;
wxPanel* m_pgDC;
wxCheckBox* m_dcEnable1;
wxStaticText* m_staticText41;
wxComboBox* m_dcSource1;
wxStaticText* m_staticText51;
wxTextCtrl* m_dcStart1;
wxStaticText* m_staticText61;
wxTextCtrl* m_dcStop1;
wxStaticText* m_staticText71;
wxTextCtrl* m_dcIncr1;
wxCheckBox* m_dcEnable2;
wxStaticText* m_staticText4;
wxComboBox* m_dcSource2;
wxStaticText* m_staticText5;
wxTextCtrl* m_dcStart2;
wxStaticText* m_staticText6;
wxTextCtrl* m_dcStop2;
wxStaticText* m_staticText7;
wxTextCtrl* m_dcIncr2;
wxPanel* m_pgDistortion;
wxPanel* m_pgNoise;
wxStaticText* m_staticText14;
wxComboBox* m_noiseMeas;
wxStaticText* m_staticText15;
wxComboBox* m_noiseRef;
wxStaticText* m_staticText23;
wxStaticText* m_staticText16;
wxComboBox* m_noiseSrc;
wxRadioBox* m_noiseScale;
wxStaticText* m_staticText11;
wxTextCtrl* m_noisePointsNumber;
wxStaticText* m_staticText21;
wxTextCtrl* m_noiseFreqStart;
wxStaticText* m_staticText31;
wxTextCtrl* m_noiseFreqStop;
wxPanel* m_pgOP;
wxStaticText* m_staticText13;
wxPanel* m_pgPoleZero;
wxPanel* m_pgSensitivity;
wxPanel* m_pgTransferFunction;
wxPanel* m_pgTransient;
wxStaticText* m_staticText151;
wxTextCtrl* m_transStep;
wxStaticText* m_staticText161;
wxTextCtrl* m_transFinal;
wxStaticText* m_staticText17;
wxTextCtrl* m_transInitial;
wxStaticText* m_staticText24;
wxPanel* m_pgCustom;
wxStaticText* m_staticText18;
wxTextCtrl* m_customTxt;
wxButton* m_loadDirectives;
wxCheckBox* m_fixPassiveVals;
wxCheckBox* m_fixIncludePaths;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;
// Virtual event handlers, overide them in your derived class
virtual void onLoadDirectives( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_SIM_SETTINGS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Simulation settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 450,700 ), long style = wxDEFAULT_DIALOG_STYLE );
~DIALOG_SIM_SETTINGS_BASE();
};
#endif //__DIALOG_SIM_SETTINGS_BASE_H__

View File

@ -0,0 +1,761 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "dialog_spice_model.h"
#include <netlist_exporters/netlist_exporter_pspice.h>
#include <sim/spice_value.h>
#include <confirm.h>
#include <project.h>
#include <wx/tokenzr.h>
// Helper function to shorten conditions
static bool empty( const wxTextCtrl* aCtrl )
{
return aCtrl->GetValue().IsEmpty();
}
// Function to sort PWL values list
static int wxCALLBACK comparePwlValues( wxIntPtr aItem1, wxIntPtr aItem2, wxIntPtr WXUNUSED( aSortData ) )
{
float* t1 = reinterpret_cast<float*>( &aItem1 );
float* t2 = reinterpret_cast<float*>( &aItem2 );
if( *t1 > *t2 )
return 1;
if( *t1 < *t2 )
return -1;
return 0;
}
DIALOG_SPICE_MODEL::DIALOG_SPICE_MODEL( wxWindow* aParent, SCH_COMPONENT& aComponent, SCH_FIELDS& aFields )
: DIALOG_SPICE_MODEL_BASE( aParent ), m_component( aComponent ), m_fields( aFields ),
m_spiceEmptyValidator( true ), m_notEmptyValidator( wxFILTER_EMPTY )
{
m_pasValue->SetValidator( m_spiceValidator );
m_semiType->SetValidator( m_notEmptyValidator );
m_semiModel->SetValidator( m_notEmptyValidator );
m_icModel->SetValidator( m_notEmptyValidator );
m_genDc->SetValidator( m_spiceEmptyValidator );
m_genAcMag->SetValidator( m_spiceEmptyValidator );
m_genAcPhase->SetValidator( m_spiceEmptyValidator );
m_pulseInit->SetValidator( m_spiceEmptyValidator );
m_pulseNominal->SetValidator( m_spiceEmptyValidator );
m_pulseDelay->SetValidator( m_spiceEmptyValidator );
m_pulseRise->SetValidator( m_spiceEmptyValidator );
m_pulseFall->SetValidator( m_spiceEmptyValidator );
m_pulseWidth->SetValidator( m_spiceEmptyValidator );
m_pulsePeriod->SetValidator( m_spiceEmptyValidator );
m_sinOffset->SetValidator( m_spiceEmptyValidator );
m_sinAmplitude->SetValidator( m_spiceEmptyValidator );
m_sinFreq->SetValidator( m_spiceEmptyValidator );
m_sinDelay->SetValidator( m_spiceEmptyValidator );
m_sinDampFactor->SetValidator( m_spiceEmptyValidator );
m_expInit->SetValidator( m_spiceEmptyValidator );
m_expPulsed->SetValidator( m_spiceEmptyValidator );
m_expRiseDelay->SetValidator( m_spiceEmptyValidator );
m_expRiseConst->SetValidator( m_spiceEmptyValidator );
m_expFallDelay->SetValidator( m_spiceEmptyValidator );
m_expFallConst->SetValidator( m_spiceEmptyValidator );
m_pwlTimeCol = m_pwlValList->AppendColumn( "Time [s]", wxLIST_FORMAT_LEFT, 100 );
m_pwlValueCol = m_pwlValList->AppendColumn( "Value [V/A]", wxLIST_FORMAT_LEFT, 100 );
m_sdbSizerOK->SetDefault();
}
bool DIALOG_SPICE_MODEL::TransferDataFromWindow()
{
if( !DIALOG_SPICE_MODEL_BASE::TransferDataFromWindow() )
return false;
wxWindow* page = m_notebook->GetCurrentPage();
// Passive
if( page == m_passive )
{
if( !m_passive->Validate() )
return false;
switch( m_pasType->GetSelection() )
{
case 0: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_RESISTOR; break;
case 1: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_CAPACITOR; break;
case 2: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_INDUCTOR; break;
default:
wxASSERT_MSG( false, "Unhandled passive type" );
return false;
break;
}
m_fieldsTmp[SF_MODEL] = m_pasValue->GetValue();
}
// Semiconductor
else if( page == m_semiconductor )
{
if( !m_semiconductor->Validate() )
return false;
switch( m_semiType->GetSelection() )
{
case 0: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_DIODE; break;
case 1: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_BJT; break;
case 2: m_fieldsTmp[SF_PRIMITIVE] = (char) SP_MOSFET; break;
default:
wxASSERT_MSG( false, "Unhandled semiconductor type" );
return false;
break;
}
m_fieldsTmp[SF_MODEL] = m_semiModel->GetValue();
if( !empty( m_semiLib ) )
m_fieldsTmp[SF_LIB_FILE] = m_semiLib->GetValue();
}
// Integrated circuit
else if( page == m_ic )
{
if( !m_ic->Validate() )
return false;
m_fieldsTmp[SF_PRIMITIVE] = (char) SP_SUBCKT;
m_fieldsTmp[SF_MODEL] = m_icModel->GetValue();
if( !empty( m_icLib ) )
m_fieldsTmp[SF_LIB_FILE] = m_icLib->GetValue();
}
// Power source
else if( page == m_power )
{
wxString model;
if( !generatePowerSource( model ) )
return false;
m_fieldsTmp[SF_PRIMITIVE] = (char)( m_pwrType->GetSelection() ? SP_ISOURCE : SP_VSOURCE );
m_fieldsTmp[SF_MODEL] = model;
}
else
{
wxASSERT_MSG( false, "Unhandled model type" );
return false;
}
m_fieldsTmp[SF_ENABLED] = !m_disabled->GetValue() ? "Y" : "N"; // note bool inversion
m_fieldsTmp[SF_NODE_SEQUENCE] = m_nodeSeqCheck->IsChecked() ? m_nodeSeqVal->GetValue() : "";
// Apply the settings
for( int i = 0; i < SF_END; ++i )
{
if( m_fieldsTmp.count( (SPICE_FIELD) i ) > 0 && !m_fieldsTmp.at( i ).IsEmpty() )
{
getField( i ).SetText( m_fieldsTmp[i] );
}
else
{
// Erase empty fields (having empty fields causes a warning in the properties dialog)
const wxString& spiceField = NETLIST_EXPORTER_PSPICE::GetSpiceFieldName( (SPICE_FIELD) i );
auto fieldIt = std::find_if( m_fields.begin(), m_fields.end(), [&]( const SCH_FIELD& f ) {
return f.GetName() == spiceField;
} );
if( fieldIt != m_fields.end() )
m_fields.erase( fieldIt );
}
}
return true;
}
bool DIALOG_SPICE_MODEL::TransferDataToWindow()
{
const auto& spiceFields = NETLIST_EXPORTER_PSPICE::GetSpiceFields();
// Fill out the working buffer
for( unsigned int idx = 0; idx < spiceFields.size(); ++idx )
{
const wxString& spiceField = spiceFields[idx];
auto fieldIt = std::find_if( m_fields.begin(), m_fields.end(), [&]( const SCH_FIELD& f ) {
return f.GetName() == spiceField;
} );
// Do not modify the existing value, just add missing fields with default values
if( fieldIt != m_fields.end() && !fieldIt->GetText().IsEmpty() )
m_fieldsTmp[idx] = fieldIt->GetText();
else
m_fieldsTmp[idx] = NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal( (SPICE_FIELD) idx, &m_component,
NET_USE_X_PREFIX | NET_ADJUST_INCLUDE_PATHS | NET_ADJUST_PASSIVE_VALS );
}
// Analyze the component fields to fill out the dialog
char primitive = toupper( m_fieldsTmp[SF_PRIMITIVE][0] );
switch( primitive )
{
case SP_RESISTOR:
case SP_CAPACITOR:
case SP_INDUCTOR:
m_notebook->SetSelection( m_notebook->FindPage( m_passive ) );
m_pasType->SetSelection( primitive == SP_RESISTOR ? 0
: primitive == SP_CAPACITOR ? 1
: primitive == SP_INDUCTOR ? 2
: -1 );
m_pasValue->SetValue( m_fieldsTmp[SF_MODEL] );
break;
case SP_DIODE:
case SP_BJT:
case SP_MOSFET:
m_notebook->SetSelection( m_notebook->FindPage( m_semiconductor ) );
m_semiType->SetSelection( primitive == SP_DIODE ? 0
: primitive == SP_BJT ? 1
: primitive == SP_MOSFET ? 2
: -1 );
m_semiModel->SetValue( m_fieldsTmp[SF_MODEL] );
m_semiLib->SetValue( m_fieldsTmp[SF_LIB_FILE] );
if( !empty( m_semiLib ) )
{
const wxString& libFile = m_semiLib->GetValue();
m_fieldsTmp[SF_LIB_FILE] = libFile;
updateFromFile( m_semiModel, libFile, ".model" );
}
break;
case SP_SUBCKT:
m_notebook->SetSelection( m_notebook->FindPage( m_ic ) );
m_icModel->SetValue( m_fieldsTmp[SF_MODEL] );
m_icLib->SetValue( m_fieldsTmp[SF_LIB_FILE] );
if( !empty( m_icLib ) )
{
const wxString& libFile = m_icLib->GetValue();
m_fieldsTmp[SF_LIB_FILE] = libFile;
updateFromFile( m_icModel, libFile, ".subckt" );
}
break;
case SP_VSOURCE:
case SP_ISOURCE:
if( !parsePowerSource( m_fieldsTmp[SF_MODEL] ) )
return false;
m_notebook->SetSelection( m_notebook->FindPage( m_power ) );
m_pwrType->SetSelection( primitive == SP_ISOURCE ? 1 : 0 );
break;
default:
//wxASSERT_MSG( false, "Unhandled Spice primitive type" );
break;
}
m_disabled->SetValue( !NETLIST_EXPORTER_PSPICE::StringToBool( m_fieldsTmp[SF_ENABLED] ) );
// Check if node sequence is different than the default one
if( m_fieldsTmp[SF_NODE_SEQUENCE]
!= NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal( SF_NODE_SEQUENCE, &m_component, 0 ) )
{
m_nodeSeqCheck->SetValue( true );
m_nodeSeqVal->SetValue( m_fieldsTmp[SF_NODE_SEQUENCE] );
}
return DIALOG_SPICE_MODEL_BASE::TransferDataToWindow();
}
bool DIALOG_SPICE_MODEL::parsePowerSource( const wxString& aModel )
{
if( aModel.IsEmpty() )
return false;
wxStringTokenizer tokenizer( aModel, " ()" );
wxString tkn = tokenizer.GetNextToken().Lower();
while( tokenizer.HasMoreTokens() )
{
// Variables used for generic values processing (filling out wxTextCtrls in sequence)
bool genericProcessing = false;
unsigned int genericReqParamsCount = 0;
std::vector<wxTextCtrl*> genericControls;
if( tkn == "dc" )
{
// There might be an optional "dc" or "trans" directive, skip it
if( tkn == "dc" || tkn == "trans" )
tkn = tokenizer.GetNextToken().Lower();
// DC value
try
{
m_genDc->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
}
catch( ... )
{
return false;
}
}
else if( tkn == "ac" )
{
// AC magnitude
try
{
tkn = tokenizer.GetNextToken().Lower();
m_genAcMag->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
}
catch( ... )
{
return false;
}
// AC phase (optional)
try
{
tkn = tokenizer.GetNextToken().Lower();
m_genAcPhase->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
}
catch( ... )
{
continue; // perhaps another directive
}
}
else if( tkn == "pulse" )
{
m_powerNotebook->SetSelection( m_powerNotebook->FindPage( m_pwrPulse ) );
genericProcessing = true;
genericReqParamsCount = 2;
genericControls = { m_pulseInit, m_pulseNominal, m_pulseDelay,
m_pulseRise, m_pulseFall, m_pulseWidth, m_pulsePeriod };
}
else if( tkn == "sin" )
{
m_powerNotebook->SetSelection( m_powerNotebook->FindPage( m_pwrSin ) );
genericProcessing = true;
genericReqParamsCount = 2;
genericControls = { m_sinOffset, m_sinAmplitude, m_sinFreq, m_sinDelay, m_sinDampFactor };
}
else if( tkn == "exp" )
{
m_powerNotebook->SetSelection( m_powerNotebook->FindPage( m_pwrExp ) );
genericProcessing = true;
genericReqParamsCount = 2;
genericControls = { m_expInit, m_expPulsed,
m_expRiseDelay, m_expRiseConst, m_expFallDelay, m_expFallConst };
}
else if( tkn == "pwl" )
{
m_powerNotebook->SetSelection( m_powerNotebook->FindPage( m_pwrPwl ) );
try
{
while( tokenizer.HasMoreTokens() )
{
tkn = tokenizer.GetNextToken();
SPICE_VALUE time( tkn );
tkn = tokenizer.GetNextToken();
SPICE_VALUE value( tkn );
addPwlValue( time.ToSpiceString(), value.ToSpiceString() );
}
}
catch( ... )
{
return false;
}
}
else
{
// Unhandled power source type
wxASSERT_MSG( false, "Unhandled power source type" );
return false;
}
if( genericProcessing )
{
try
{
for( unsigned int i = 0; i < genericControls.size(); ++i )
{
// If there are no more tokens, let's check if we got at least required fields
if( !tokenizer.HasMoreTokens() )
return ( i >= genericReqParamsCount );
tkn = tokenizer.GetNextToken().Lower();
genericControls[i]->SetValue( SPICE_VALUE( tkn ).ToSpiceString() );
}
}
catch( ... )
{
return false;
}
}
// Get the next token now, so if any of the branches catches an expection, try to
// process it in another branch
tkn = tokenizer.GetNextToken().Lower();
}
return true;
}
bool DIALOG_SPICE_MODEL::generatePowerSource( wxString& aTarget ) const
{
wxString acdc, trans;
wxWindow* page = m_powerNotebook->GetCurrentPage();
bool useTrans = true; // shall we use the transient command part?
// Variables for generic processing
bool genericProcessing = false;
unsigned int genericReqParamsCount = 0;
std::vector<wxTextCtrl*> genericControls;
/// DC / AC section
// If SPICE_VALUE can be properly constructed, then it is a valid value
try
{
if( !empty( m_genDc ) )
acdc += wxString::Format( "dc %s ", SPICE_VALUE( m_genDc->GetValue() ).ToSpiceString() );
}
catch( ... )
{
DisplayError( NULL, wxT( "Invalid DC value" ) );
return false;
}
try
{
if( !empty( m_genAcMag ) )
{
acdc += wxString::Format( "ac %s ", SPICE_VALUE( m_genAcMag->GetValue() ).ToSpiceString() );
if( !empty( m_genAcPhase ) )
acdc += wxString::Format( "%s ", SPICE_VALUE( m_genAcPhase->GetValue() ).ToSpiceString() );
}
}
catch( ... )
{
DisplayError( NULL, wxT( "Invalid AC magnitude or phase" ) );
return false;
}
/// Transient section
if( page == m_pwrPulse )
{
if( !m_pwrPulse->Validate() )
return false;
genericProcessing = true;
trans += "pulse";
genericReqParamsCount = 2;
genericControls = { m_pulseInit, m_pulseNominal, m_pulseDelay,
m_pulseRise, m_pulseFall, m_pulseWidth, m_pulsePeriod };
}
else if( page == m_pwrSin )
{
if( !m_pwrSin->Validate() )
return false;
genericProcessing = true;
trans += "sin";
genericReqParamsCount = 2;
genericControls = { m_sinOffset, m_sinAmplitude, m_sinFreq, m_sinDelay, m_sinDampFactor };
}
else if( page == m_pwrExp )
{
if( !m_pwrExp->Validate() )
return false;
genericProcessing = true;
trans += "exp";
genericReqParamsCount = 2;
genericControls = { m_expInit, m_expPulsed,
m_expRiseDelay, m_expRiseConst, m_expFallDelay, m_expFallConst };
}
else if( page == m_pwrPwl )
{
if( m_pwlValList->GetItemCount() > 0 )
{
trans += "pwl(";
for( int i = 0; i < m_pwlValList->GetItemCount(); ++i )
{
trans += wxString::Format( "%s %s ", m_pwlValList->GetItemText( i, m_pwlTimeCol ),
m_pwlValList->GetItemText( i, m_pwlValueCol ) );
}
trans.Trim();
trans += ")";
}
}
if( genericProcessing )
{
bool finished = false;
unsigned int paramCounter = 0;
trans += "(";
for( auto textCtrl : genericControls )
{
if( empty( textCtrl ) )
{
finished = true;
if( paramCounter < genericReqParamsCount )
{
if( paramCounter == 0 )
{
// It is fine, no parameters were entered
useTrans = false;
break;
}
DisplayError( NULL,
wxString::Format( wxT( "You need to specify at least the "
"first %d parameters for the transient source" ),
genericReqParamsCount ) );
return false;
}
}
else if( finished )
{
DisplayError( NULL, wxT( "You cannot leave interleaved blank "
"spaces for the transient source" ) );
return false;
}
trans += wxString::Format( "%s ", textCtrl->GetValue() );
++paramCounter;
}
trans.Trim();
trans += ")";
}
aTarget = acdc;
if( useTrans )
aTarget += trans;
aTarget.Trim( false );
aTarget.Trim( true );
return true;
}
void DIALOG_SPICE_MODEL::updateFromFile( wxComboBox* aComboBox,
const wxString& aFilePath, const wxString& aKeyword )
{
wxString curValue = aComboBox->GetValue();
const wxString keyword( aKeyword.Lower() );
wxFileName filePath( aFilePath );
if( !filePath.Exists() )
{
// Look for the file in the project path
filePath.SetPath( Prj().GetProjectPath() );
}
wxTextFile file;
if( !file.Open( filePath.GetFullPath() ) )
return;
aComboBox->Clear();
// Process the file, looking for components
for( wxString line = file.GetFirstLine().Lower(); !file.Eof(); line = file.GetNextLine() )
{
wxStringTokenizer tokenizer( line, " " );
while( tokenizer.HasMoreTokens() )
{
wxString token = tokenizer.GetNextToken().Lower();
if( token == keyword )
{
token = tokenizer.GetNextToken();
if( !token.IsEmpty() )
aComboBox->Append( token );
}
}
}
// Restore the previous value or if there is none - pick the first one from the loaded library
if( !curValue.IsEmpty() )
aComboBox->SetValue( curValue );
else if( aComboBox->GetCount() > 0 )
aComboBox->SetSelection( 0 );
}
SCH_FIELD& DIALOG_SPICE_MODEL::getField( int aFieldType )
{
const wxString& spiceField = NETLIST_EXPORTER_PSPICE::GetSpiceFieldName( (SPICE_FIELD) aFieldType );
auto fieldIt = std::find_if( m_fields.begin(), m_fields.end(), [&]( const SCH_FIELD& f ) {
return f.GetName() == spiceField;
} );
// Found one, so return it
if( fieldIt != m_fields.end() )
return *fieldIt;
// Create a new field with requested name
m_fields.emplace_back( wxPoint(), m_fields.size(), &m_component, spiceField );
return m_fields.back();
}
bool DIALOG_SPICE_MODEL::addPwlValue( const wxString& aTime, const wxString& aValue )
{
// TODO execute validators
if( aTime.IsEmpty() || aValue.IsEmpty() )
return false;
long idx = m_pwlValList->InsertItem( m_pwlTimeCol, aTime );
m_pwlValList->SetItem( idx, m_pwlValueCol, aValue );
// There is no wxString::ToFloat, but we need to guarantee it fits in 4 bytes
double timeD;
float timeF;
m_pwlTime->GetValue().ToDouble( &timeD );
timeF = timeD;
// Store the time value, so the entries can be sorted
m_pwlValList->SetItemData( idx, *reinterpret_cast<long*>( &timeF ) );
// Sort items by timestamp
m_pwlValList->SortItems( comparePwlValues, -1 );
return true;
}
void DIALOG_SPICE_MODEL::onSemiSelectLib( wxCommandEvent& event )
{
wxFileDialog openDlg( this, wxT( "Select library" ),
wxFileName( m_semiLib->GetValue() ).GetPath(), "",
"Spice library file (*.lib)|*.lib;*.LIB|Any file|*",
wxFD_OPEN | wxFD_FILE_MUST_EXIST );
if( openDlg.ShowModal() == wxID_CANCEL )
return;
wxFileName libPath( openDlg.GetPath() );
// Try to convert the path to relative to project
if( libPath.MakeRelativeTo( Prj().GetProjectPath() ) && !libPath.GetFullPath().StartsWith( ".." ) )
m_semiLib->SetValue( libPath.GetFullPath() );
else
m_semiLib->SetValue( openDlg.GetPath() );
updateFromFile( m_semiModel, openDlg.GetPath(), ".model" );
}
void DIALOG_SPICE_MODEL::onSelectIcLib( wxCommandEvent& event )
{
wxFileDialog openDlg( this, wxT( "Select library" ),
wxFileName( m_icLib->GetValue() ).GetPath(), "",
"Spice library file (*.lib)|*.lib;*.LIB|Any file|*",
wxFD_OPEN | wxFD_FILE_MUST_EXIST );
if( openDlg.ShowModal() == wxID_CANCEL )
return;
wxFileName libPath( openDlg.GetPath() );
// Try to convert the path to relative to project
if( libPath.MakeRelativeTo( Prj().GetProjectPath() ) && !libPath.GetFullPath().StartsWith( ".." ) )
m_icLib->SetValue( libPath.GetFullPath() );
else
m_icLib->SetValue( openDlg.GetPath() );
updateFromFile( m_icModel, openDlg.GetPath(), ".subckt" );
}
void DIALOG_SPICE_MODEL::onPwlAdd( wxCommandEvent& event )
{
addPwlValue( m_pwlTime->GetValue(), m_pwlValue->GetValue() );
}
void DIALOG_SPICE_MODEL::onPwlRemove( wxCommandEvent& event )
{
long idx = m_pwlValList->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
m_pwlValList->DeleteItem( idx );
}

View File

@ -0,0 +1,105 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef DIALOG_SPICE_MODEL_H
#define DIALOG_SPICE_MODEL_H
#include "dialog_spice_model_base.h"
#include <sim/spice_value.h>
#include <sch_component.h>
#include <wx/valnum.h>
class DIALOG_SPICE_MODEL : public DIALOG_SPICE_MODEL_BASE
{
public:
DIALOG_SPICE_MODEL( wxWindow* aParent, SCH_COMPONENT& aComponent, SCH_FIELDS& aSchFields );
private:
/**
* Parse a string describing a power source, so appropriate settings are checked in the dialog
* @param aModel contains the string to be parse (e.g. sin(0 1 10k))
* @return True if the input string was parsed without errors.
*/
bool parsePowerSource( const wxString& aModel );
/**
* Generates a string to describe power source parameters, basing on the current selection.
* If there are missing fields, it will not modify the target string.
* @param aTarget is the destination for the generated string.
* @return True if the string was saved successfully.
*/
bool generatePowerSource( wxString& aTarget ) const;
/**
* Loads a list of components from a file and adds them to a combo box.
* @param aComboBox is the target combo box
* @param aFilePath is the file to be processed
* @param aKeyword is the keyword to select the type of components (e.g. "subckt" or "model")
*/
void updateFromFile( wxComboBox* aComboBox, const wxString& aFilePath, const wxString& aKeyword );
/**
* Returns or creates a field in the edited schematic fields vector.
* @param aFieldType is an SPICE_FIELD enum value.
* @return Requested field.
*/
SCH_FIELD& getField( int aFieldType );
/**
* Adds a value to the PWL values list.
* @param aTime is the time value.
* @param aValue is the source value at the given time.
* @return True if request has completed successfully, false if the data is invalid.
*/
bool addPwlValue( const wxString& aTime, const wxString& aValue );
bool TransferDataFromWindow() override;
bool TransferDataToWindow() override;
// Event handlers
void onSemiSelectLib( wxCommandEvent& event ) override;
void onSelectIcLib( wxCommandEvent& event ) override;
void onPwlAdd( wxCommandEvent& event ) override;
void onPwlRemove( wxCommandEvent& event ) override;
///> Edited component
SCH_COMPONENT& m_component;
///> Fields from the component properties dialog
SCH_FIELDS& m_fields;
///> Temporary field values
std::map<int, wxString> m_fieldsTmp;
///> Column identifiers for PWL power source value list
long m_pwlTimeCol, m_pwlValueCol;
SPICE_VALIDATOR m_spiceValidator;
SPICE_VALIDATOR m_spiceEmptyValidator;
wxTextValidator m_notEmptyValidator;
};
#endif /* DIALOG_SPICE_MODEL_H */

View File

@ -0,0 +1,492 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dialog_spice_model_base.h"
///////////////////////////////////////////////////////////////////////////
DIALOG_SPICE_MODEL_BASE::DIALOG_SPICE_MODEL_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
m_passive = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxFlexGridSizer* fgSizer1;
fgSizer1 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer1->AddGrowableCol( 0 );
fgSizer1->SetFlexibleDirection( wxBOTH );
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText2 = new wxStaticText( m_passive, wxID_ANY, _("Type"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText2->Wrap( -1 );
fgSizer1->Add( m_staticText2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pasType = new wxComboBox( m_passive, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
m_pasType->Append( _("Resistor") );
m_pasType->Append( _("Capacitor") );
m_pasType->Append( _("Inductor") );
fgSizer1->Add( m_pasType, 0, wxALL|wxEXPAND, 5 );
m_staticText3 = new wxStaticText( m_passive, wxID_ANY, _("Value"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText3->Wrap( -1 );
fgSizer1->Add( m_staticText3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pasValue = new wxTextCtrl( m_passive, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_pasValue->SetMinSize( wxSize( 200,-1 ) );
fgSizer1->Add( m_pasValue, 0, wxALL|wxEXPAND, 5 );
m_passive->SetSizer( fgSizer1 );
m_passive->Layout();
fgSizer1->Fit( m_passive );
m_notebook->AddPage( m_passive, _("Passive"), false );
m_semiconductor = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxFlexGridSizer* fgSizer3;
fgSizer3 = new wxFlexGridSizer( 0, 3, 0, 0 );
fgSizer3->AddGrowableCol( 0 );
fgSizer3->SetFlexibleDirection( wxBOTH );
fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText4 = new wxStaticText( m_semiconductor, wxID_ANY, _("Type"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText4->Wrap( -1 );
fgSizer3->Add( m_staticText4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_semiType = new wxComboBox( m_semiconductor, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
m_semiType->Append( _("Diode") );
m_semiType->Append( _("Bipolar transistor (BJT)") );
m_semiType->Append( _("MOSFET") );
fgSizer3->Add( m_semiType, 0, wxALL|wxEXPAND, 5 );
fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText5 = new wxStaticText( m_semiconductor, wxID_ANY, _("Model"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText5->Wrap( -1 );
fgSizer3->Add( m_staticText5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_semiModel = new wxComboBox( m_semiconductor, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
fgSizer3->Add( m_semiModel, 0, wxALL|wxEXPAND, 5 );
fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText7 = new wxStaticText( m_semiconductor, wxID_ANY, _("Library"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText7->Wrap( -1 );
fgSizer3->Add( m_staticText7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_semiLib = new wxTextCtrl( m_semiconductor, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
fgSizer3->Add( m_semiLib, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
m_semiSelectLib = new wxButton( m_semiconductor, wxID_ANY, _("Select file..."), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer3->Add( m_semiSelectLib, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_semiconductor->SetSizer( fgSizer3 );
m_semiconductor->Layout();
fgSizer3->Fit( m_semiconductor );
m_notebook->AddPage( m_semiconductor, _("Semiconductor"), false );
m_ic = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxFlexGridSizer* fgSizer4;
fgSizer4 = new wxFlexGridSizer( 0, 3, 0, 0 );
fgSizer4->AddGrowableCol( 0 );
fgSizer4->SetFlexibleDirection( wxBOTH );
fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText8 = new wxStaticText( m_ic, wxID_ANY, _("Model"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText8->Wrap( -1 );
fgSizer4->Add( m_staticText8, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_icModel = new wxComboBox( m_ic, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
m_icModel->SetMinSize( wxSize( 200,-1 ) );
fgSizer4->Add( m_icModel, 0, wxALL|wxEXPAND, 5 );
fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText9 = new wxStaticText( m_ic, wxID_ANY, _("Library"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText9->Wrap( -1 );
fgSizer4->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_icLib = new wxTextCtrl( m_ic, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
fgSizer4->Add( m_icLib, 0, wxALL|wxEXPAND, 5 );
m_icSelectLib = new wxButton( m_ic, wxID_ANY, _("Select file..."), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer4->Add( m_icSelectLib, 0, wxALL, 5 );
m_ic->SetSizer( fgSizer4 );
m_ic->Layout();
fgSizer4->Fit( m_ic );
m_notebook->AddPage( m_ic, _("Integrated circuit"), false );
m_power = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxBoxSizer* bSizer4;
bSizer4 = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbSizer1;
sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( m_power, wxID_ANY, _("DC/AC analysis") ), wxVERTICAL );
wxFlexGridSizer* fgSizer6;
fgSizer6 = new wxFlexGridSizer( 0, 4, 0, 0 );
fgSizer6->AddGrowableCol( 0 );
fgSizer6->SetFlexibleDirection( wxBOTH );
fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText10 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("DC [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText10->Wrap( -1 );
fgSizer6->Add( m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_genDc = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_genDc->SetMinSize( wxSize( 60,-1 ) );
fgSizer6->Add( m_genDc, 0, wxALL, 5 );
fgSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
fgSizer6->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText11 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("AC magnitude [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText11->Wrap( -1 );
fgSizer6->Add( m_staticText11, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_genAcMag = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_genAcMag->SetMinSize( wxSize( 60,-1 ) );
fgSizer6->Add( m_genAcMag, 0, wxALL|wxEXPAND, 5 );
m_staticText12 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("AC phase [rad]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText12->Wrap( -1 );
fgSizer6->Add( m_staticText12, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_genAcPhase = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_genAcPhase->SetMinSize( wxSize( 60,-1 ) );
fgSizer6->Add( m_genAcPhase, 0, wxALL|wxEXPAND, 5 );
sbSizer1->Add( fgSizer6, 1, wxEXPAND, 5 );
bSizer4->Add( sbSizer1, 1, wxALL|wxEXPAND, 5 );
wxStaticBoxSizer* sbSizer3;
sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_power, wxID_ANY, _("Transient analysis") ), wxVERTICAL );
m_powerNotebook = new wxNotebook( sbSizer3->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
m_pwrPulse = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxFlexGridSizer* fgSizer7;
fgSizer7 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer7->AddGrowableCol( 0 );
fgSizer7->SetFlexibleDirection( wxBOTH );
fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText13 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Initial value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText13->Wrap( -1 );
fgSizer7->Add( m_staticText13, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pulseInit = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_pulseInit->SetMinSize( wxSize( 100,-1 ) );
fgSizer7->Add( m_pulseInit, 0, wxALL|wxEXPAND, 5 );
m_staticText14 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Pulsed value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText14->Wrap( -1 );
fgSizer7->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pulseNominal = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer7->Add( m_pulseNominal, 0, wxALL|wxEXPAND, 5 );
m_staticText15 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Delay time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText15->Wrap( -1 );
fgSizer7->Add( m_staticText15, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pulseDelay = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer7->Add( m_pulseDelay, 0, wxALL|wxEXPAND, 5 );
m_staticText16 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Rise time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText16->Wrap( -1 );
fgSizer7->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pulseRise = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer7->Add( m_pulseRise, 0, wxALL|wxEXPAND, 5 );
m_staticText17 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Fall time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText17->Wrap( -1 );
fgSizer7->Add( m_staticText17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pulseFall = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer7->Add( m_pulseFall, 0, wxALL|wxEXPAND, 5 );
m_staticText18 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Pulse width [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText18->Wrap( -1 );
fgSizer7->Add( m_staticText18, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pulseWidth = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer7->Add( m_pulseWidth, 0, wxALL|wxEXPAND, 5 );
m_staticText20 = new wxStaticText( m_pwrPulse, wxID_ANY, _("Period [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText20->Wrap( -1 );
fgSizer7->Add( m_staticText20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pulsePeriod = new wxTextCtrl( m_pwrPulse, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer7->Add( m_pulsePeriod, 0, wxALL|wxEXPAND, 5 );
m_pwrPulse->SetSizer( fgSizer7 );
m_pwrPulse->Layout();
fgSizer7->Fit( m_pwrPulse );
m_powerNotebook->AddPage( m_pwrPulse, _("Pulse"), true );
m_pwrSin = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxFlexGridSizer* fgSizer8;
fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer8->AddGrowableCol( 0 );
fgSizer8->SetFlexibleDirection( wxBOTH );
fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText21 = new wxStaticText( m_pwrSin, wxID_ANY, _("DC offset [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText21->Wrap( -1 );
fgSizer8->Add( m_staticText21, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_sinOffset = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_sinOffset->SetMinSize( wxSize( 100,-1 ) );
fgSizer8->Add( m_sinOffset, 0, wxALL, 5 );
m_staticText22 = new wxStaticText( m_pwrSin, wxID_ANY, _("Amplitude [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText22->Wrap( -1 );
fgSizer8->Add( m_staticText22, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_sinAmplitude = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer8->Add( m_sinAmplitude, 0, wxALL|wxEXPAND, 5 );
m_staticText23 = new wxStaticText( m_pwrSin, wxID_ANY, _("Frequency [Hz]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText23->Wrap( -1 );
fgSizer8->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_sinFreq = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer8->Add( m_sinFreq, 0, wxALL|wxEXPAND, 5 );
m_staticText24 = new wxStaticText( m_pwrSin, wxID_ANY, _("Delay [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText24->Wrap( -1 );
fgSizer8->Add( m_staticText24, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_sinDelay = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer8->Add( m_sinDelay, 0, wxALL|wxEXPAND, 5 );
m_staticText25 = new wxStaticText( m_pwrSin, wxID_ANY, _("Damping factor [1/s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText25->Wrap( -1 );
fgSizer8->Add( m_staticText25, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_sinDampFactor = new wxTextCtrl( m_pwrSin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer8->Add( m_sinDampFactor, 0, wxALL|wxEXPAND, 5 );
m_pwrSin->SetSizer( fgSizer8 );
m_pwrSin->Layout();
fgSizer8->Fit( m_pwrSin );
m_powerNotebook->AddPage( m_pwrSin, _("Sinusoidal"), false );
m_pwrExp = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxFlexGridSizer* fgSizer9;
fgSizer9 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer9->AddGrowableCol( 0 );
fgSizer9->SetFlexibleDirection( wxBOTH );
fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText26 = new wxStaticText( m_pwrExp, wxID_ANY, _("Initial value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText26->Wrap( -1 );
fgSizer9->Add( m_staticText26, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_expInit = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_expInit->SetMinSize( wxSize( 100,-1 ) );
fgSizer9->Add( m_expInit, 0, wxALL|wxEXPAND, 5 );
m_staticText27 = new wxStaticText( m_pwrExp, wxID_ANY, _("Pulsed value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText27->Wrap( -1 );
fgSizer9->Add( m_staticText27, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_expPulsed = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer9->Add( m_expPulsed, 0, wxALL|wxEXPAND, 5 );
m_staticText28 = new wxStaticText( m_pwrExp, wxID_ANY, _("Rise delay time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText28->Wrap( -1 );
fgSizer9->Add( m_staticText28, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_expRiseDelay = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer9->Add( m_expRiseDelay, 0, wxALL|wxEXPAND, 5 );
m_staticText29 = new wxStaticText( m_pwrExp, wxID_ANY, _("Rise time constant [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText29->Wrap( -1 );
fgSizer9->Add( m_staticText29, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_expRiseConst = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer9->Add( m_expRiseConst, 0, wxALL|wxEXPAND, 5 );
m_staticText30 = new wxStaticText( m_pwrExp, wxID_ANY, _("Fall delay time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText30->Wrap( -1 );
fgSizer9->Add( m_staticText30, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_expFallDelay = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer9->Add( m_expFallDelay, 0, wxALL|wxEXPAND, 5 );
m_staticText31 = new wxStaticText( m_pwrExp, wxID_ANY, _("Fall time constant [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText31->Wrap( -1 );
fgSizer9->Add( m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_expFallConst = new wxTextCtrl( m_pwrExp, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer9->Add( m_expFallConst, 0, wxALL|wxEXPAND, 5 );
m_pwrExp->SetSizer( fgSizer9 );
m_pwrExp->Layout();
fgSizer9->Fit( m_pwrExp );
m_powerNotebook->AddPage( m_pwrExp, _("Exponential"), false );
m_pwrPwl = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pwrPwl->SetToolTip( _("Piece-wise linear") );
wxFlexGridSizer* fgSizer15;
fgSizer15 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer15->AddGrowableCol( 0 );
fgSizer15->AddGrowableRow( 1 );
fgSizer15->SetFlexibleDirection( wxBOTH );
fgSizer15->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL );
wxFlexGridSizer* fgSizer10;
fgSizer10 = new wxFlexGridSizer( 0, 2, 0, 0 );
fgSizer10->AddGrowableCol( 0 );
fgSizer10->SetFlexibleDirection( wxBOTH );
fgSizer10->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticText34 = new wxStaticText( m_pwrPwl, wxID_ANY, _("Time [s]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText34->Wrap( -1 );
fgSizer10->Add( m_staticText34, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pwlTime = new wxTextCtrl( m_pwrPwl, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_pwlTime->SetMinSize( wxSize( 100,-1 ) );
fgSizer10->Add( m_pwlTime, 0, wxALL|wxEXPAND, 5 );
m_staticText35 = new wxStaticText( m_pwrPwl, wxID_ANY, _("Value [V/A]"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText35->Wrap( -1 );
fgSizer10->Add( m_staticText35, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pwlValue = new wxTextCtrl( m_pwrPwl, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
fgSizer10->Add( m_pwlValue, 0, wxALL|wxEXPAND, 5 );
fgSizer15->Add( fgSizer10, 1, wxEXPAND, 5 );
m_pwlAddButton = new wxButton( m_pwrPwl, wxID_ANY, _("Add"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer15->Add( m_pwlAddButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pwlValList = new wxListCtrl( m_pwrPwl, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL );
m_pwlValList->SetMinSize( wxSize( 200,-1 ) );
fgSizer15->Add( m_pwlValList, 0, wxALL|wxEXPAND, 5 );
m_pwlRemoveBtn = new wxButton( m_pwrPwl, wxID_ANY, _("Remove"), wxDefaultPosition, wxDefaultSize, 0 );
fgSizer15->Add( m_pwlRemoveBtn, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_pwrPwl->SetSizer( fgSizer15 );
m_pwrPwl->Layout();
fgSizer15->Fit( m_pwrPwl );
m_powerNotebook->AddPage( m_pwrPwl, _("Piece-wise Linear"), false );
m_pwrFm = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pwrFm->Hide();
m_powerNotebook->AddPage( m_pwrFm, _("FM"), false );
m_pwrAm = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pwrAm->Hide();
m_powerNotebook->AddPage( m_pwrAm, _("AM"), false );
m_pwrTransNoise = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pwrTransNoise->Hide();
m_powerNotebook->AddPage( m_pwrTransNoise, _("Transient noise"), false );
m_pwrRandom = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pwrRandom->Hide();
m_powerNotebook->AddPage( m_pwrRandom, _("Random"), false );
m_pwrExtData = new wxPanel( m_powerNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_pwrExtData->Hide();
m_powerNotebook->AddPage( m_pwrExtData, _("External data"), false );
sbSizer3->Add( m_powerNotebook, 1, wxEXPAND | wxALL, 5 );
bSizer4->Add( sbSizer3, 1, wxALL|wxEXPAND, 5 );
wxString m_pwrTypeChoices[] = { _("Voltage"), _("Current") };
int m_pwrTypeNChoices = sizeof( m_pwrTypeChoices ) / sizeof( wxString );
m_pwrType = new wxRadioBox( m_power, wxID_ANY, _("Source type"), wxDefaultPosition, wxDefaultSize, m_pwrTypeNChoices, m_pwrTypeChoices, 1, wxRA_SPECIFY_ROWS );
m_pwrType->SetSelection( 0 );
bSizer4->Add( m_pwrType, 0, wxALL|wxEXPAND, 5 );
m_power->SetSizer( bSizer4 );
m_power->Layout();
bSizer4->Fit( m_power );
m_notebook->AddPage( m_power, _("Source"), true );
bSizer1->Add( m_notebook, 1, wxEXPAND | wxALL, 5 );
m_disabled = new wxCheckBox( this, wxID_ANY, _("Disable component for simulation"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer1->Add( m_disabled, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxHORIZONTAL );
m_nodeSeqCheck = new wxCheckBox( this, wxID_ANY, _("Alternate node sequence:"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer2->Add( m_nodeSeqCheck, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_nodeSeqVal = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
m_nodeSeqVal->SetMinSize( wxSize( 200,-1 ) );
bSizer2->Add( m_nodeSeqVal, 0, wxALL, 5 );
bSizer1->Add( bSizer2, 0, wxEXPAND, 5 );
m_sdbSizer = new wxStdDialogButtonSizer();
m_sdbSizerOK = new wxButton( this, wxID_OK );
m_sdbSizer->AddButton( m_sdbSizerOK );
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
m_sdbSizer->AddButton( m_sdbSizerCancel );
m_sdbSizer->Realize();
bSizer1->Add( m_sdbSizer, 0, wxALL|wxEXPAND, 5 );
this->SetSizer( bSizer1 );
this->Layout();
this->Centre( wxBOTH );
// Connect Events
m_semiSelectLib->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onSemiSelectLib ), NULL, this );
m_icSelectLib->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onSelectIcLib ), NULL, this );
m_pwlAddButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onPwlAdd ), NULL, this );
m_pwlRemoveBtn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onPwlRemove ), NULL, this );
}
DIALOG_SPICE_MODEL_BASE::~DIALOG_SPICE_MODEL_BASE()
{
// Disconnect Events
m_semiSelectLib->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onSemiSelectLib ), NULL, this );
m_icSelectLib->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onSelectIcLib ), NULL, this );
m_pwlAddButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onPwlAdd ), NULL, this );
m_pwlRemoveBtn->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SPICE_MODEL_BASE::onPwlRemove ), NULL, this );
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,151 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_SPICE_MODEL_BASE_H__
#define __DIALOG_SPICE_MODEL_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
class DIALOG_SHIM;
#include "dialog_shim.h"
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/combobox.h>
#include <wx/textctrl.h>
#include <wx/sizer.h>
#include <wx/panel.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/button.h>
#include <wx/statbox.h>
#include <wx/listctrl.h>
#include <wx/notebook.h>
#include <wx/radiobox.h>
#include <wx/checkbox.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_SPICE_MODEL_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_SPICE_MODEL_BASE : public DIALOG_SHIM
{
private:
protected:
wxNotebook* m_notebook;
wxPanel* m_passive;
wxStaticText* m_staticText2;
wxComboBox* m_pasType;
wxStaticText* m_staticText3;
wxTextCtrl* m_pasValue;
wxPanel* m_semiconductor;
wxStaticText* m_staticText4;
wxComboBox* m_semiType;
wxStaticText* m_staticText5;
wxComboBox* m_semiModel;
wxStaticText* m_staticText7;
wxTextCtrl* m_semiLib;
wxButton* m_semiSelectLib;
wxPanel* m_ic;
wxStaticText* m_staticText8;
wxComboBox* m_icModel;
wxStaticText* m_staticText9;
wxTextCtrl* m_icLib;
wxButton* m_icSelectLib;
wxPanel* m_power;
wxStaticText* m_staticText10;
wxTextCtrl* m_genDc;
wxStaticText* m_staticText11;
wxTextCtrl* m_genAcMag;
wxStaticText* m_staticText12;
wxTextCtrl* m_genAcPhase;
wxNotebook* m_powerNotebook;
wxPanel* m_pwrPulse;
wxStaticText* m_staticText13;
wxTextCtrl* m_pulseInit;
wxStaticText* m_staticText14;
wxTextCtrl* m_pulseNominal;
wxStaticText* m_staticText15;
wxTextCtrl* m_pulseDelay;
wxStaticText* m_staticText16;
wxTextCtrl* m_pulseRise;
wxStaticText* m_staticText17;
wxTextCtrl* m_pulseFall;
wxStaticText* m_staticText18;
wxTextCtrl* m_pulseWidth;
wxStaticText* m_staticText20;
wxTextCtrl* m_pulsePeriod;
wxPanel* m_pwrSin;
wxStaticText* m_staticText21;
wxTextCtrl* m_sinOffset;
wxStaticText* m_staticText22;
wxTextCtrl* m_sinAmplitude;
wxStaticText* m_staticText23;
wxTextCtrl* m_sinFreq;
wxStaticText* m_staticText24;
wxTextCtrl* m_sinDelay;
wxStaticText* m_staticText25;
wxTextCtrl* m_sinDampFactor;
wxPanel* m_pwrExp;
wxStaticText* m_staticText26;
wxTextCtrl* m_expInit;
wxStaticText* m_staticText27;
wxTextCtrl* m_expPulsed;
wxStaticText* m_staticText28;
wxTextCtrl* m_expRiseDelay;
wxStaticText* m_staticText29;
wxTextCtrl* m_expRiseConst;
wxStaticText* m_staticText30;
wxTextCtrl* m_expFallDelay;
wxStaticText* m_staticText31;
wxTextCtrl* m_expFallConst;
wxPanel* m_pwrPwl;
wxStaticText* m_staticText34;
wxTextCtrl* m_pwlTime;
wxStaticText* m_staticText35;
wxTextCtrl* m_pwlValue;
wxButton* m_pwlAddButton;
wxListCtrl* m_pwlValList;
wxButton* m_pwlRemoveBtn;
wxPanel* m_pwrFm;
wxPanel* m_pwrAm;
wxPanel* m_pwrTransNoise;
wxPanel* m_pwrRandom;
wxPanel* m_pwrExtData;
wxRadioBox* m_pwrType;
wxCheckBox* m_disabled;
wxCheckBox* m_nodeSeqCheck;
wxTextCtrl* m_nodeSeqVal;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;
// Virtual event handlers, overide them in your derived class
virtual void onSemiSelectLib( wxCommandEvent& event ) { event.Skip(); }
virtual void onSelectIcLib( wxCommandEvent& event ) { event.Skip(); }
virtual void onPwlAdd( wxCommandEvent& event ) { event.Skip(); }
virtual void onPwlRemove( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_SPICE_MODEL_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,768 ), long style = wxDEFAULT_DIALOG_STYLE );
~DIALOG_SPICE_MODEL_BASE();
};
#endif //__DIALOG_SPICE_MODEL_BASE_H__

6
eeschema/diodes.lib Normal file
View File

@ -0,0 +1,6 @@
* Copyright © 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Linear Technology Corporation. All rights reserved.
*
* Mike Engelhardt
*
.model 1N914 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)
.model 1N4148 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)

View File

@ -46,6 +46,7 @@
#include <wildcards_and_files_ext.h>
#include <kiway.h>
#include <sim/sim_plot_frame.h>
// The main sheet of the project
SCH_SHEET* g_RootSheet = NULL;
@ -70,6 +71,8 @@ static struct IFACE : public KIFACE_I
wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 )
{
printf("Create class %d\n", aClassId);
switch( aClassId )
{
case FRAME_SCH:
@ -92,6 +95,14 @@ static struct IFACE : public KIFACE_I
}
break;
#ifdef KICAD_SPICE
case FRAME_SIMULATOR:
{
SIM_PLOT_FRAME* frame = new SIM_PLOT_FRAME( aKiway, aParent );
return frame;
}
break;
#endif /* KICAD_SPICE */
case FRAME_SCH_VIEWER:
case FRAME_SCH_VIEWER_MODAL:
@ -238,4 +249,3 @@ void IFACE::OnKifaceEnd()
wxConfigSaveSetups( KifaceSettings(), cfg_params() );
end_common();
}

View File

@ -251,10 +251,18 @@ enum id_eeschema_frm
ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC,
ID_SET_RELATIVE_OFFSET,
ID_END_EESCHEMA_ID_LIST,
ID_UPDATE_PCB_FROM_SCH,
ID_UPDATE_SCH_FROM_PCB
ID_UPDATE_SCH_FROM_PCB,
ID_SIM_RUN,
ID_SIM_TUNE,
ID_SIM_PROBE,
ID_SIM_SETTINGS,
ID_SIM_ADD_SIGNALS,
ID_SIM_SHOW,
ID_END_EESCHEMA_ID_LIST
};

View File

@ -142,7 +142,7 @@ bool LIB_TEXT::Load( LINE_READER& aLineReader, wxString& errorMsg )
m_Size.y = m_Size.x;
if( strnicmp( tmp, "Italic", 6 ) == 0 )
if( strncasecmp( tmp, "Italic", 6 ) == 0 )
m_Italic = true;
if( thickness > 0 )

View File

@ -160,7 +160,7 @@ again." );
while( *line == ' ' )
line++;
if( strnicmp( line, "EELAYER END", 11 ) == 0 )
if( strncasecmp( line, "EELAYER END", 11 ) == 0 )
break; // end of not used header found
}
@ -342,66 +342,66 @@ bool ReadSchemaDescr( LINE_READER* aLine, wxString& aMsgDiag, SCH_SCREEN* aScree
line = aLine->Line();
if( strnicmp( line, "$End", 4 ) == 0 )
if( strncasecmp( line, "$End", 4 ) == 0 )
{
aScreen->SetTitleBlock( tb );
break;
}
if( strnicmp( line, "Sheet", 2 ) == 0 )
if( strncasecmp( line, "Sheet", 2 ) == 0 )
sscanf( line + 5, " %d %d",
&aScreen->m_ScreenNumber, &aScreen->m_NumberOfScreens );
if( strnicmp( line, "Title", 2 ) == 0 )
if( strncasecmp( line, "Title", 2 ) == 0 )
{
ReadDelimitedText( buf, line, 256 );
tb.SetTitle( FROM_UTF8( buf ) );
continue;
}
if( strnicmp( line, "Date", 2 ) == 0 )
if( strncasecmp( line, "Date", 2 ) == 0 )
{
ReadDelimitedText( buf, line, 256 );
tb.SetDate( FROM_UTF8( buf ) );
continue;
}
if( strnicmp( line, "Rev", 2 ) == 0 )
if( strncasecmp( line, "Rev", 2 ) == 0 )
{
ReadDelimitedText( buf, line, 256 );
tb.SetRevision( FROM_UTF8( buf ) );
continue;
}
if( strnicmp( line, "Comp", 4 ) == 0 )
if( strncasecmp( line, "Comp", 4 ) == 0 )
{
ReadDelimitedText( buf, line, 256 );
tb.SetCompany( FROM_UTF8( buf ) );
continue;
}
if( strnicmp( line, "Comment1", 8 ) == 0 )
if( strncasecmp( line, "Comment1", 8 ) == 0 )
{
ReadDelimitedText( buf, line, 256 );
tb.SetComment1( FROM_UTF8( buf ) );
continue;
}
if( strnicmp( line, "Comment2", 8 ) == 0 )
if( strncasecmp( line, "Comment2", 8 ) == 0 )
{
ReadDelimitedText( buf, line, 256 );
tb.SetComment2( FROM_UTF8( buf ) );
continue;
}
if( strnicmp( line, "Comment3", 8 ) == 0 )
if( strncasecmp( line, "Comment3", 8 ) == 0 )
{
ReadDelimitedText( buf, line, 256 );
tb.SetComment3( FROM_UTF8( buf ) );
continue;
}
if( strnicmp( line, "Comment4", 8 ) == 0 )
if( strncasecmp( line, "Comment4", 8 ) == 0 )
{
ReadDelimitedText( buf, line, 256 );
tb.SetComment4( FROM_UTF8( buf ) );

View File

@ -492,6 +492,16 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
_( "Run CvPcb" ),
KiBitmap( cvpcb_xpm ) );
toolsMenu->AppendSeparator();
#ifdef KICAD_SPICE
// Simulator
AddMenuItem( toolsMenu,
ID_SIM_SHOW,
_("Simula&tor"), _( "Simulate the circuit" ),
wxNullBitmap );
#endif /* KICAD_SPICE */
// Help Menu:
wxMenu* helpMenu = new wxMenu;

View File

@ -47,13 +47,6 @@ enum NETLIST_TYPE_ID {
};
/// Options for Spice netlist generation (OR'ed bits
enum netlistOptions {
NET_USE_X_PREFIX = 2, // for Spice netlist : change "U" and "IC" reference prefix to "X"
NET_USE_NETCODES_AS_NETNAMES = 4 // for Spice netlist : use netcode numbers as netnames
};
#define NETLIST_HEAD_STRING "EESchema Netlist Version 1.1"
// Max pin number per component and footprint

View File

@ -23,149 +23,241 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "netlist_exporter_pspice.h"
#include <fctsys.h>
#include <build_version.h>
#include <confirm.h>
#include <map>
#include <search_stack.h>
#include <schframe.h>
#include <netlist.h>
#include <sch_reference_list.h>
#include <class_netlist_object.h>
#include <wx/tokenzr.h>
#include "netlist_exporter_pspice.h"
#include <wx/regex.h>
bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsigned aNetlistOptions )
{
FILE* f = NULL;
bool aUsePrefix = aNetlistOptions & NET_USE_X_PREFIX;
bool aUseNetcodeAsNetName = aNetlistOptions & NET_USE_NETCODES_AS_NETNAMES;
FILE_OUTPUTFORMATTER outputFile( aOutFileName, wxT( "wt" ), '\'' );
int ret = 0;
int nbitems;
wxString text;
wxArrayString spiceCommandAtBeginFile;
wxArrayString spiceCommandAtEndFile;
wxString msg;
wxString netName;
return Format( &outputFile, aNetlistOptions );
}
#define BUFYPOS_LEN 4
wxChar bufnum[BUFYPOS_LEN + 1];
std::vector<int> pinSequence; // numeric indices into m_SortedComponentPinList
wxArrayString stdPinNameArray; // Array containing Standard Pin Names
wxString delimeters = wxT( "{:,; }" );
wxString disableStr = wxT( "N" );
if( ( f = wxFopen( aOutFileName, wxT( "wt" ) ) ) == NULL )
{
msg.Printf( _( "Failed to create file '%s'" ),
GetChars( aOutFileName ) );
DisplayError( NULL, msg );
bool NETLIST_EXPORTER_PSPICE::Format( OUTPUTFORMATTER* aFormatter, unsigned aCtl )
{
// Netlist options
const bool useNetcodeAsNetName = aCtl & NET_USE_NETCODES_AS_NETNAMES;
if( !ProcessNetlist( aCtl ) )
return false;
aFormatter->Print( 0, ".title KiCad schematic\n" );
// Write .include directives
for( auto lib : m_libraries )
{
if( ( aCtl & NET_ADJUST_INCLUDE_PATHS ) && m_paths )
{
// Look for the library in known search locations
lib = m_paths->FindValidPath( lib );
}
aFormatter->Print( 0, ".include %s\n", (const char*) lib.c_str() );
}
ret |= fprintf( f, "* %s\n\n", TO_UTF8( aOutFileName ) );
ret |= fprintf( f, "* %s (Spice format) creation date: %s\n\n",
NETLIST_HEAD_STRING, TO_UTF8( DateAndTime() ) );
for( const auto& item : m_spiceItems )
{
aFormatter->Print( 0, "%c%s ", item.m_primitive, (const char*) item.m_refName.c_str() );
// Pins to node mapping
int activePinIndex = 0;
for( unsigned ii = 0; ii < item.m_pins.size(); ii++ )
{
// Case of Alt Sequence definition with Unused/Invalid Node index:
// Valid used Node Indexes are in the set
// {0,1,2,...m_item.m_pin.size()-1}
if( !item.m_pinSequence.empty() )
{
// All Vector values must be less <= max package size
// And Total Vector size should be <= package size
if( ( (unsigned) item.m_pinSequence[ii] < item.m_pins.size() )
&& ( ii < item.m_pinSequence.size() ) )
{
// Case of Alt Pin Sequence in control good Index:
activePinIndex = item.m_pinSequence[ii];
}
else
{
// Case of Alt Pin Sequence in control Bad Index or not using all
// pins for simulation:
wxASSERT_MSG( false, "Used an invalid pin number in node sequence" );
continue;
}
}
// Case of Standard Pin Sequence in control:
else
{
activePinIndex = ii;
}
NETLIST_OBJECT* pin = item.m_pins[activePinIndex];
assert( pin );
wxString netName = pin->GetNetName();
if( useNetcodeAsNetName )
{
assert( m_netMap.count( netName ) );
aFormatter->Print( 0, "%d ", m_netMap[netName] );
}
else
{
sprintPinNetName( netName , wxT( "N-%.6d" ), pin, useNetcodeAsNetName );
//Replace parenthesis with underscore to prevent parse issues with simulators
netName.Replace( wxT( "(" ), wxT( "_" ) );
netName.Replace( wxT( ")" ), wxT( "_" ) );
if( netName.IsEmpty() )
netName = wxT( "?" );
aFormatter->Print( 0, "%s ", TO_UTF8( netName ) );
}
}
aFormatter->Print( 0, "%s\n", (const char*) item.m_model.c_str() );
}
// Print out all directives found in the text fields on the schematics
writeDirectives( aFormatter, aCtl );
aFormatter->Print( 0, ".end\n" );
return true;
}
wxString NETLIST_EXPORTER_PSPICE::GetSpiceField( SPICE_FIELD aField,
SCH_COMPONENT* aComponent, unsigned aCtl )
{
SCH_FIELD* field = aComponent->FindField( GetSpiceFieldName( aField ) );
return field ? field->GetText() : GetSpiceFieldDefVal( aField, aComponent, aCtl );
}
wxString NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal( SPICE_FIELD aField,
SCH_COMPONENT* aComponent, unsigned aCtl )
{
switch( aField )
{
case SF_PRIMITIVE:
{
const wxString& refName = aComponent->GetField( REFERENCE )->GetText();
// Convert ICs to subcircuits
if( aCtl & NET_USE_X_PREFIX && ( refName.StartsWith( "IC" ) || refName.StartsWith( "U" ) ) )
return wxString( "X" );
else
return refName.GetChar( 0 );
break;
}
case SF_MODEL:
{
wxChar prim = aComponent->GetField( REFERENCE )->GetText().GetChar( 0 );
wxString value = aComponent->GetField( VALUE )->GetText();
// Is it a passive component?
if( aCtl & NET_ADJUST_PASSIVE_VALS && ( prim == 'C' || prim == 'L' || prim == 'R' ) )
{
// Regular expression to match common formats used for passive parts description
// (e.g. 100k, 2k3, 1 uF)
wxRegEx passiveVal( "^([0-9\\. ]+)([fFpPnNuUmMkKgGtT]|M(e|E)(g|G))?([fFhH]|ohm)?([-1-9 ]*)$" );
if( passiveVal.Matches( value ) )
{
wxString prefix( passiveVal.GetMatch( value, 1 ) );
wxString unit( passiveVal.GetMatch( value, 2 ) );
wxString suffix( passiveVal.GetMatch( value, 6 ) );
prefix.Trim(); prefix.Trim( false );
unit.Trim(); unit.Trim( false );
suffix.Trim(); suffix.Trim( false );
// Make 'mega' units comply with the Spice expectations
if( unit == "M" )
unit = "Meg";
value = prefix + unit + suffix;
}
}
return value;
break;
}
case SF_ENABLED:
return wxString( "Y" );
break;
case SF_NODE_SEQUENCE:
{
wxString nodeSeq;
std::vector<LIB_PIN*> pins;
aComponent->GetPins( pins );
for( auto pin : pins )
nodeSeq += pin->GetNumberString() + " ";
nodeSeq.Trim();
return nodeSeq;
break;
}
case SF_LIB_FILE:
// There is no default Spice library
return wxEmptyString;
break;
default:
wxASSERT_MSG( false, "Missing default value definition for a Spice field" );
break;
}
return wxString( "<unknown>" );
}
bool NETLIST_EXPORTER_PSPICE::ProcessNetlist( unsigned aCtl )
{
const wxString delimiters( "{:,; }" );
SCH_SHEET_LIST sheetList( g_RootSheet );
// Set of reference names, to check for duplications
std::set<wxString> refNames;
// Prepare list of nets generation (not used here, but...
for( unsigned ii = 0; ii < m_masterList->size(); ii++ )
m_masterList->GetItem( ii )->m_Flag = 0;
ret |= fprintf( f, "* To exclude a component from the Spice Netlist add [Spice_Netlist_Enabled] user FIELD set to: N\n" );
ret |= fprintf( f, "* To reorder the component spice node sequence add [Spice_Node_Sequence] user FIELD and define sequence: 2,1,0\n" );
// Create text list starting by [.-]pspice , or [.-]gnucap (simulator
// commands) and create text list starting by [+]pspice , or [+]gnucap
// (simulator commands)
bufnum[BUFYPOS_LEN] = 0;
SCH_SHEET_LIST sheetList( g_RootSheet );
for( unsigned i = 0; i < sheetList.size(); i++ )
{
for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
{
size_t l1, l2;
wxChar ident;
if( item->Type() != SCH_TEXT_T )
continue;
SCH_TEXT* drawText = (SCH_TEXT*) item;
text = drawText->GetText();
if( text.IsEmpty() )
continue;
ident = text.GetChar( 0 );
if( ident != '.' && ident != '-' && ident != '+' )
continue;
text.Remove( 0, 1 ); // Remove the first char.
text.Remove( 6 ); // text contains 6 char.
text.MakeLower();
if( text != wxT( "pspice" ) && text != wxT( "gnucap" ) )
continue;
text = drawText->GetText().Mid( 7 );
l1 = text.Length();
text.Trim( false );
l2 = text.Length();
if( l1 == l2 )
continue; // no whitespace after ident text
{
// Put the Y position as an ascii string, for sort by vertical
// position, using usual sort string by alphabetic value
int ypos = drawText->GetPosition().y;
for( int ii = 0; ii < BUFYPOS_LEN; ii++ )
{
bufnum[BUFYPOS_LEN - 1 - ii] = (ypos & 63) + ' ';
ypos >>= 6;
}
// First BUFYPOS_LEN char are the Y position.
msg.Printf( wxT( "%s %s" ), bufnum, text.GetData() );
if( ident == '+' )
spiceCommandAtEndFile.Add( msg );
else
spiceCommandAtBeginFile.Add( msg );
}
}
}
// Print texts starting by [.-]pspice , ou [.-]gnucap (of course, without
// the Y position string)
nbitems = spiceCommandAtBeginFile.GetCount();
if( nbitems )
{
spiceCommandAtBeginFile.Sort();
for( int ii = 0; ii < nbitems; ii++ )
{
spiceCommandAtBeginFile[ii].Remove( 0, BUFYPOS_LEN );
spiceCommandAtBeginFile[ii].Trim( true );
spiceCommandAtBeginFile[ii].Trim( false );
ret |= fprintf( f, "%s\n", TO_UTF8( spiceCommandAtBeginFile[ii] ) );
}
}
ret |= fprintf( f, "\n" );
// Create component list
m_netMap.clear();
m_netMap["GND"] = 0; // 0 is reserved for "GND"
int netIdx = 1;
m_libraries.clear();
m_ReferencesAlreadyFound.Clear();
UpdateDirectives( aCtl );
for( unsigned sheet_idx = 0; sheet_idx < sheetList.size(); sheet_idx++ )
{
ret |= fprintf( f, "* Sheet Name: %s\n",
TO_UTF8( sheetList[sheet_idx].PathHumanReadable() ) );
// Process component attributes to find Spice directives
for( EDA_ITEM* item = sheetList[sheet_idx].LastDrawList(); item; item = item->Next() )
{
SCH_COMPONENT* comp = findNextComponentAndCreatePinList( item, &sheetList[sheet_idx] );
@ -175,47 +267,60 @@ bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsign
item = comp;
// Reset NodeSeqIndex Count:
pinSequence.clear();
SPICE_ITEM spiceItem;
spiceItem.m_parent = comp;
// Check to see if component should be removed from Spice Netlist:
SCH_FIELD* netlistEnabledField = comp->FindField( wxT( "Spice_Netlist_Enabled" ) );
// Obtain Spice fields
SCH_FIELD* fieldLibFile = comp->FindField( GetSpiceFieldName( SF_LIB_FILE ) );
SCH_FIELD* fieldSeq = comp->FindField( GetSpiceFieldName( SF_NODE_SEQUENCE ) );
if( netlistEnabledField )
spiceItem.m_primitive = GetSpiceField( SF_PRIMITIVE, comp, aCtl )[0];
spiceItem.m_model = GetSpiceField( SF_MODEL, comp, aCtl );
spiceItem.m_refName = comp->GetRef( &sheetList[sheet_idx] );
// Duplicate references will result in simulation errors
if( refNames.count( spiceItem.m_refName ) )
{
wxString netlistEnabled = netlistEnabledField->GetText();
if( netlistEnabled.CmpNoCase( disableStr ) == 0 )
continue;
DisplayError( NULL, wxT( "There are duplicate components. "
"You need to annotate schematics first." ) );
return false;
}
// Check if Alternative Pin Sequence is Available:
SCH_FIELD* spiceSeqField = comp->FindField( wxT( "Spice_Node_Sequence" ) );
refNames.insert( spiceItem.m_refName );
if( spiceSeqField )
// Check to see if component should be removed from Spice netlist
spiceItem.m_enabled = StringToBool( GetSpiceField( SF_ENABLED, comp, aCtl ) );
if( fieldLibFile && !fieldLibFile->GetText().IsEmpty() )
m_libraries.insert( fieldLibFile->GetText() );
wxArrayString pinNames;
// Store pin information
for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
{
// Get String containing the Sequence of Nodes:
wxString nodeSeqIndexLineStr = spiceSeqField->GetText();
NETLIST_OBJECT* pin = m_SortedComponentPinList[ii];
assert( pin );
spiceItem.m_pins.push_back( pin );
pinNames.Add( pin->GetPinNumText() );
// Verify Field Exists and is not empty:
// Create net mapping
const wxString& netName = pin->GetNetName();
if( m_netMap.count( netName ) == 0 )
m_netMap[netName] = netIdx++;
}
// Check if an alternative pin sequence is available:
if( fieldSeq )
{
// Get the string containing the sequence of nodes:
wxString nodeSeqIndexLineStr = fieldSeq->GetText();
// Verify field exists and is not empty:
if( !nodeSeqIndexLineStr.IsEmpty() )
{
// Create an Array of Standard Pin Names from part definition:
stdPinNameArray.Clear();
for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
{
NETLIST_OBJECT* pin = m_SortedComponentPinList[ii];
if( !pin )
continue;
stdPinNameArray.Add( pin->GetPinNumText() );
}
// Get Alt Pin Name Array From User:
wxStringTokenizer tkz( nodeSeqIndexLineStr, delimeters );
wxStringTokenizer tkz( nodeSeqIndexLineStr, delimiters );
while( tkz.HasMoreTokens() )
{
@ -223,136 +328,80 @@ bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsign
int seq;
// Find PinName In Standard List assign Standard List Index to Name:
seq = stdPinNameArray.Index(pinIndex);
seq = pinNames.Index( pinIndex );
if( seq != wxNOT_FOUND )
{
pinSequence.push_back( seq );
}
spiceItem.m_pinSequence.push_back( seq );
}
}
}
//Get Standard Reference Designator:
wxString RefName = comp->GetRef( &sheetList[sheet_idx] );
m_spiceItems.push_back( spiceItem );
}
}
//Conditionally add Prefix only for devices that begin with U or IC:
if( aUsePrefix )
return true;
}
void NETLIST_EXPORTER_PSPICE::UpdateDirectives( unsigned aCtl )
{
const SCH_SHEET_LIST& sheetList = g_RootSheet;
m_directives.clear();
for( unsigned i = 0; i < sheetList.size(); i++ )
{
for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() )
{
if( item->Type() != SCH_TEXT_T )
continue;
wxString text = static_cast<SCH_TEXT*>( item )->GetText();
if( text.IsEmpty() )
continue;
if( text.GetChar( 0 ) == '.' )
{
if( RefName.StartsWith( wxT( "U" ) ) || RefName.StartsWith( wxT( "IC" ) ) )
RefName = wxT( "X" ) + RefName;
}
wxStringTokenizer tokenizer( text, "\r\n" );
ret |= fprintf( f, "%s ", TO_UTF8( RefName ) );
// Write pin list:
int activePinIndex = 0;
for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ )
{
// Case of Alt Sequence definition with Unused/Invalid Node index:
// Valid used Node Indexes are in the set
// {0,1,2,...m_SortedComponentPinList.size()-1}
if( pinSequence.size() )
while( tokenizer.HasMoreTokens() )
{
// All Vector values must be less <= max package size
// And Total Vector size should be <= package size
if( ( (unsigned) pinSequence[ii] < m_SortedComponentPinList.size() )
&& ( ii < pinSequence.size() ) )
wxString directive( tokenizer.GetNextToken() );
if( directive.StartsWith( ".inc" ) )
{
// Case of Alt Pin Sequence in control good Index:
activePinIndex = pinSequence[ii];
wxString lib = directive.AfterFirst( ' ' );
if( !lib.IsEmpty() )
m_libraries.insert( lib );
}
else
{
// Case of Alt Pin Sequence in control Bad Index or not using all
// pins for simulation:
continue;
m_directives.push_back( directive );
}
}
// Case of Standard Pin Sequence in control:
else
{
activePinIndex = ii;
}
NETLIST_OBJECT* pin = m_SortedComponentPinList[activePinIndex];
if( !pin )
continue;
sprintPinNetName( netName , wxT( "N-%.6d" ), pin, aUseNetcodeAsNetName );
//Replace parenthesis with underscore to prevent parse issues with Simulators:
netName.Replace( wxT( "(" ), wxT( "_" ) );
netName.Replace( wxT( ")" ), wxT( "_" ) );
if( netName.IsEmpty() )
netName = wxT( "?" );
ret |= fprintf( f, " %s", TO_UTF8( netName ) );
}
// Get Component Value Name:
wxString CompValue = comp->GetField( VALUE )->GetText();
// Check if Override Model Name is Provided:
SCH_FIELD* spiceModelField = comp->FindField( wxT( "spice_model" ) );
if( spiceModelField )
{
// Get Model Name String:
wxString ModelNameStr = spiceModelField->GetText();
// Verify Field Exists and is not empty:
if( !ModelNameStr.IsEmpty() )
CompValue = ModelNameStr;
}
// Print Component Value:
ret |= fprintf( f, " %s\t\t",TO_UTF8( CompValue ) );
// Show Seq Spec on same line as component using line-comment ";":
for( unsigned ii = 0; ii < pinSequence.size(); ++ii )
{
if( ii == 0 )
ret |= fprintf( f, ";Node Sequence Spec.<" );
ret |= fprintf( f, "%s", TO_UTF8( stdPinNameArray.Item( pinSequence[ii] ) ) );
if( ii < pinSequence.size()-1 )
ret |= fprintf( f, "," );
else
ret |= fprintf( f, ">" );
}
// Next Netlist line record:
ret |= fprintf( f, "\n" );
}
}
m_SortedComponentPinList.clear();
// Print texts starting with [+]pspice or [+]gnucap
nbitems = spiceCommandAtEndFile.GetCount();
if( nbitems )
{
ret |= fprintf( f, "\n" );
spiceCommandAtEndFile.Sort();
for( int ii = 0; ii < nbitems; ii++ )
{
spiceCommandAtEndFile[ii].Remove( 0, +BUFYPOS_LEN );
spiceCommandAtEndFile[ii].Trim( true );
spiceCommandAtEndFile[ii].Trim( false );
ret |= fprintf( f, "%s\n", TO_UTF8( spiceCommandAtEndFile[ii] ) );
}
}
ret |= fprintf( f, "\n.end\n" );
fclose( f );
return ret >= 0;
}
void NETLIST_EXPORTER_PSPICE::writeDirectives( OUTPUTFORMATTER* aFormatter, unsigned aCtl ) const
{
for( auto& dir : m_directives )
{
aFormatter->Print( 0, "%s\n", (const char*) dir.c_str() );
}
}
// Entries in the vector below have to follow the order in SPICE_FIELD enum
const std::vector<wxString> NETLIST_EXPORTER_PSPICE::m_spiceFields = {
"Spice_Primitive",
"Spice_Model",
"Spice_Netlist_Enabled",
"Spice_Node_Sequence",
"Spice_Lib_File"
};

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 1992-2013 jp.charras at wanadoo.fr
* Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2015 KiCad Developers
* Copyright (C) 1992-2016 KiCad Developers
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -27,6 +27,57 @@
#define NETLIST_EXPORTER_PSPICE_H
#include "netlist_exporter.h"
#include <map>
class SEARCH_STACK;
/// Flags for Spice netlist generation (can be combined)
enum SPICE_NETLIST_OPTIONS {
NET_USE_X_PREFIX = 2, // change "U" and "IC" reference prefix to "X"
NET_USE_NETCODES_AS_NETNAMES = 4, // use netcode numbers as netnames
NET_ADJUST_INCLUDE_PATHS = 8, // use full paths for included files (if they are in search path)
NET_ADJUST_PASSIVE_VALS = 16, // reformat passive component values (e.g. 1M -> 1Meg)
NET_ALL_FLAGS = 0xffff
};
enum SPICE_FIELD {
SF_PRIMITIVE,
SF_MODEL,
SF_ENABLED,
SF_NODE_SEQUENCE,
SF_LIB_FILE,
SF_END // sentinel
};
enum SPICE_PRIMITIVE {
SP_RESISTOR = 'R',
SP_CAPACITOR = 'C',
SP_INDUCTOR = 'L',
SP_DIODE = 'D',
SP_BJT = 'Q',
SP_MOSFET = 'M',
SP_SUBCKT = 'X',
SP_VSOURCE = 'V',
SP_ISOURCE = 'I'
};
/// @todo add NET_ADJUST_INCLUDE_PATHS & NET_ADJUST_PASSIVE_VALS checkboxes in the netlist export dialog
struct SPICE_ITEM
{
SCH_COMPONENT* m_parent;
wxChar m_primitive;
wxString m_model;
wxString m_refName;
bool m_enabled;
///> Array containing Standard Pin Name
std::vector<NETLIST_OBJECT*> m_pins;
///> Numeric indices into m_SortedComponentPinList
std::vector<int> m_pinSequence;
};
/**
* Class NETLIST_EXPORTER_PSPICE
@ -35,16 +86,100 @@
class NETLIST_EXPORTER_PSPICE : public NETLIST_EXPORTER
{
public:
NETLIST_EXPORTER_PSPICE( NETLIST_OBJECT_LIST* aMasterList, PART_LIBS* aLibs ) :
NETLIST_EXPORTER( aMasterList, aLibs )
NETLIST_EXPORTER_PSPICE( NETLIST_OBJECT_LIST* aMasterList, PART_LIBS* aLibs,
SEARCH_STACK* aPaths = NULL ) :
NETLIST_EXPORTER( aMasterList, aLibs ), m_paths( aPaths )
{
}
virtual ~NETLIST_EXPORTER_PSPICE()
{
}
typedef std::list<SPICE_ITEM> SPICE_ITEM_LIST;
///> Net name to node number mapping
typedef std::map<wxString, int> NET_INDEX_MAP;
const SPICE_ITEM_LIST& GetSpiceItems() const
{
return m_spiceItems;
}
/**
* Function WriteNetlist
* writes to specified output file
*/
bool WriteNetlist( const wxString& aOutFileName, unsigned aNetlistOptions );
bool Format( OUTPUTFORMATTER* aFormatter, unsigned aCtl );
/**
* @brief Processes the netlist to create net mapping and a list of SPICE_ITEMs.
* It is automatically called by WriteNetlist(), but might be used separately,
* if only net mapping and the list of SPICE_ITEMs are required.
* @return True if successful.
*/
bool ProcessNetlist( unsigned aCtl );
const NET_INDEX_MAP& GetNetIndexMap() const
{
return m_netMap;
}
static const std::vector<wxString>& GetSpiceFields()
{
return m_spiceFields;
}
static const wxString& GetSpiceFieldName( SPICE_FIELD aField )
{
return m_spiceFields[(int) aField];
}
/**
* @brief Retrieves either the requested field value or the default value.
*/
static wxString GetSpiceField( SPICE_FIELD aField, SCH_COMPONENT* aComponent, unsigned aCtl );
static wxString GetSpiceFieldDefVal( SPICE_FIELD aField, SCH_COMPONENT* aComponent, unsigned aCtl );
void UpdateDirectives( unsigned aCtl );
const std::vector<wxString> GetDirectives() const
{
return m_directives;
}
static bool StringToBool( const wxString& aStr )
{
if( aStr.IsEmpty() )
return false;
char c = tolower( aStr[0] );
// Different ways of saying false (no/false/0)
return !( c == 'n' || c == 'f' || c == '0' );
}
protected:
virtual void writeDirectives( OUTPUTFORMATTER* aFormatter, unsigned aCtl ) const;
private:
///> Spice directives found in the processed schematic sheet
std::vector<wxString> m_directives;
///> Libraries used by the simulated circuit
std::set<wxString> m_libraries;
NET_INDEX_MAP m_netMap;
SPICE_ITEM_LIST m_spiceItems;
SEARCH_STACK* m_paths;
// Component fields that are processed during netlist export & simulation
static const std::vector<wxString> m_spiceFields;
};
#endif

162
eeschema/noname.sch Normal file
View File

@ -0,0 +1,162 @@
EESchema Schematic File Version 2
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:contrib
LIBS:valves
LIBS:pspice
LIBS:noname-cache
EELAYER 25 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L VSOURCE V1
U 1 1 57336052
P 4400 4050
F 0 "V1" H 4528 4096 50 0000 L CNN
F 1 "SINE(0 1.5 1k 0 0 0 0)" H 4528 4005 50 0000 L CNN
F 2 "" H 4400 4050 50 0000 C CNN
F 3 "" H 4400 4050 50 0000 C CNN
F 4 "Value" H 4400 4050 60 0001 C CNN "Fieldname"
F 5 "V" H 4400 4050 60 0001 C CNN "Spice_Primitive"
F 6 "1 2" H 4100 4250 60 0001 C CNN "Spice_Node_Sequence"
1 4400 4050
-1 0 0 1
$EndComp
$Comp
L GND #PWR1
U 1 1 573360D3
P 4400 4350
F 0 "#PWR1" H 4400 4100 50 0001 C CNN
F 1 "GND" H 4405 4177 50 0000 C CNN
F 2 "" H 4400 4350 50 0000 C CNN
F 3 "" H 4400 4350 50 0000 C CNN
1 4400 4350
1 0 0 -1
$EndComp
$Comp
L R R1
U 1 1 573360F5
P 4650 3700
F 0 "R1" V 4443 3700 50 0000 C CNN
F 1 "1k" V 4534 3700 50 0000 C CNN
F 2 "" V 4580 3700 50 0000 C CNN
F 3 "" H 4650 3700 50 0000 C CNN
F 4 "Value" H 4650 3700 60 0001 C CNN "Fieldname"
F 5 "1 2" H 4650 3700 60 0001 C CNN "SpiceMapping"
F 6 "R" V 4650 3700 60 0001 C CNN "Spice_Primitive"
1 4650 3700
0 1 1 0
$EndComp
$Comp
L D D1
U 1 1 573361B8
P 5100 3700
F 0 "D1" H 5100 3485 50 0000 C CNN
F 1 "1N4148" H 5100 3576 50 0000 C CNN
F 2 "" H 5100 3700 50 0000 C CNN
F 3 "" H 5100 3700 50 0000 C CNN
F 4 "Value" H 5100 3700 60 0001 C CNN "Fieldname"
F 5 "D" H 5100 3700 60 0001 C CNN "Spice_Primitive"
F 6 "2 1" H 5100 3700 60 0001 C CNN "Spice_Node_Sequence"
1 5100 3700
-1 0 0 1
$EndComp
$Comp
L C C1
U 1 1 5733628F
P 5400 4000
F 0 "C1" H 5515 4046 50 0000 L CNN
F 1 "100n" H 5515 3955 50 0000 L CNN
F 2 "" H 5438 3850 50 0000 C CNN
F 3 "" H 5400 4000 50 0000 C CNN
F 4 "Value" H 5400 4000 60 0001 C CNN "Fieldname"
F 5 "C" H 5400 4000 60 0001 C CNN "Spice_Primitive"
F 6 "1 2" H 5400 4000 60 0001 C CNN "SpiceMapping"
1 5400 4000
1 0 0 -1
$EndComp
$Comp
L R R2
U 1 1 573362F7
P 5750 4000
F 0 "R2" H 5680 3954 50 0000 R CNN
F 1 "100k" H 5680 4045 50 0000 R CNN
F 2 "" V 5680 4000 50 0000 C CNN
F 3 "" H 5750 4000 50 0000 C CNN
F 4 "Value" H 5750 4000 60 0001 C CNN "Fieldname"
F 5 "1 2" H 5750 4000 60 0001 C CNN "SpiceMapping"
F 6 "R" V 5750 4000 60 0001 C CNN "Spice_Primitive"
1 5750 4000
-1 0 0 1
$EndComp
Text Notes 4300 4900 0 60 ~ 0
.tran 1u 10m\n
Wire Wire Line
4400 4350 4400 4250
Wire Wire Line
4400 4300 5750 4300
Connection ~ 4400 4300
Wire Wire Line
5250 3700 5750 3700
Wire Wire Line
5750 3700 5750 3850
Wire Wire Line
5400 3850 5400 3700
Connection ~ 5400 3700
Wire Wire Line
5400 4300 5400 4150
Wire Wire Line
5750 4300 5750 4150
Connection ~ 5400 4300
Wire Wire Line
4800 3700 4950 3700
Connection ~ 4900 3700
Wire Wire Line
4400 3850 4400 3700
Wire Wire Line
4400 3700 4500 3700
Text Notes 4300 4800 0 60 ~ 0
.include diodes.lib\n
Text Label 4400 3800 0 60 ~ 0
in
Text Label 5550 3700 0 60 ~ 0
rect
Text Notes 4300 5000 0 60 ~ 0
*.ac dec 10 1 1Meg\n
$EndSCHEMATC

View File

@ -28,9 +28,11 @@
*/
#include <fctsys.h>
#include <kiway.h>
#include <eeschema_id.h>
#include <class_drawpanel.h>
#include <schframe.h>
#include <sim/sim_plot_frame.h>
#include <menus_helpers.h>
#include <sch_bus_entry.h>
@ -43,6 +45,8 @@
#include <sch_sheet.h>
#include <sch_sheet_path.h>
#include <sch_bitmap.h>
#include <class_netlist_object.h>
#include <class_library.h> // fo class SCHLIB_FILTER to filter power parts
@ -321,6 +325,56 @@ void SCH_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
}
break;
#ifdef KICAD_SPICE
case ID_SIM_PROBE:
{
const KICAD_T wiresAndComponents[] = { SCH_LINE_T, SCH_COMPONENT_T, SCH_SHEET_PIN_T };
item = LocateAndShowItem( aPosition, wiresAndComponents );
if( !item )
break;
NETLIST_OBJECT_LIST* netlist = BuildNetListBase();
for( NETLIST_OBJECT* obj : *netlist )
{
if( obj->m_Comp == item )
{
SIM_PLOT_FRAME* simFrame = (SIM_PLOT_FRAME*) Kiway().Player( FRAME_SIMULATOR, false );
if( simFrame )
simFrame->AddVoltagePlot( obj->GetNetName() );
break;
}
}
}
break;
case ID_SIM_TUNE:
{
const KICAD_T fieldsAndComponents[] = { SCH_COMPONENT_T, SCH_FIELD_T };
item = LocateAndShowItem( aPosition, fieldsAndComponents );
if( !item )
return;
if( item->Type() != SCH_COMPONENT_T )
{
item = static_cast<SCH_ITEM*>( item->GetParent() );
if( item->Type() != SCH_COMPONENT_T )
return;
}
SIM_PLOT_FRAME* simFrame = (SIM_PLOT_FRAME*) Kiway().Player( FRAME_SIMULATOR, false );
if( simFrame )
simFrame->AddTuner( static_cast<SCH_COMPONENT*>( item ) );
}
break;
#endif /* KICAD_SPICE */
default:
SetToolID( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor(), wxEmptyString );
wxFAIL_MSG( wxT( "SCH_EDIT_FRAME::OnLeftClick invalid tool ID <" ) +

View File

@ -136,7 +136,7 @@ bool SCH_BITMAP::Load( LINE_READER& aLine, wxString& aErrorMsg )
{
char* line = aLine.Line();
if( strnicmp( line, "$Bitmap", 7 ) != 0 )
if( strncasecmp( line, "$Bitmap", 7 ) != 0 )
{
aErrorMsg.Printf( wxT( "Eeschema file bitmap image load error at line %d, aborted" ),
aLine.LineNumber() );
@ -151,13 +151,13 @@ bool SCH_BITMAP::Load( LINE_READER& aLine, wxString& aErrorMsg )
line = aLine.Line();
if( strnicmp( line, "Pos", 3 ) == 0 )
if( strncasecmp( line, "Pos", 3 ) == 0 )
{
sscanf( line + 3, "%d %d", &m_pos.x, &m_pos.y );
continue;
}
if( strnicmp( line, "Scale", 5 ) == 0 )
if( strncasecmp( line, "Scale", 5 ) == 0 )
{
double scale = 1.0;
sscanf( line + 5, "%lf", &scale );
@ -165,12 +165,12 @@ bool SCH_BITMAP::Load( LINE_READER& aLine, wxString& aErrorMsg )
continue;
}
if( strnicmp( line, "Data", 4 ) == 0 )
if( strncasecmp( line, "Data", 4 ) == 0 )
{
m_image->LoadData( aLine, aErrorMsg );
}
if( strnicmp( line, "$EndBitmap", 4 ) == 0 )
if( strncasecmp( line, "$EndBitmap", 4 ) == 0 )
break;
}

View File

@ -1450,7 +1450,7 @@ bool SCH_COMPONENT::Load( LINE_READER& aLine, wxString& aErrorMsg )
if( !(line = aLine.ReadLine()) )
return false;
if( strnicmp( "$End", line, 4 ) != 0 )
if( strncasecmp( "$End", line, 4 ) != 0 )
{
aErrorMsg.Printf( wxT( "Component End expected at line %d, aborted" ),
aLine.LineNumber() );

View File

@ -39,6 +39,7 @@
#include <vector>
#include <lib_draw_item.h>
class SCH_SCREEN;
class SCH_SHEET_PATH;
class LIB_ITEM;
class LIB_PIN;

View File

@ -316,7 +316,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg )
}
}
if( strnicmp( "$End", ((char*)aLine), 4 ) != 0 )
if( strncasecmp( "$End", ((char*)aLine), 4 ) != 0 )
{
aErrorMsg.Printf( wxT( "**Eeschema file end_sheet struct error at line %d, aborted\n" ),
aLine.LineNumber() );

View File

@ -484,7 +484,7 @@ bool SCH_TEXT::Load( LINE_READER& aLine, wxString& aErrorMsg )
m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0;
}
if( strnicmp( Name2, "Italic", 6 ) == 0 )
if( strncasecmp( Name2, "Italic", 6 ) == 0 )
m_Italic = 1;
return true;
@ -947,7 +947,7 @@ bool SCH_LABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0;
}
if( stricmp( Name2, "Italic" ) == 0 )
if( strcasecmp( Name2, "Italic" ) == 0 )
m_Italic = 1;
return true;
@ -1077,19 +1077,19 @@ bool SCH_GLOBALLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
m_Bold = ( thickness != 0 );
m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0;
if( stricmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
if( strcasecmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
m_shape = NET_OUTPUT;
if( stricmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
if( strcasecmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
m_shape = NET_BIDI;
if( stricmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
if( strcasecmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
m_shape = NET_TRISTATE;
if( stricmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
if( strcasecmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
m_shape = NET_UNSPECIFIED;
if( stricmp( Name3, "Italic" ) == 0 )
if( strcasecmp( Name3, "Italic" ) == 0 )
m_Italic = 1;
return true;
@ -1521,19 +1521,19 @@ bool SCH_HIERLABEL::Load( LINE_READER& aLine, wxString& aErrorMsg )
m_Bold = ( thickness != 0 );
m_Thickness = m_Bold ? GetPenSizeForBold( size ) : 0;
if( stricmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
if( strcasecmp( Name2, SheetLabelType[NET_OUTPUT] ) == 0 )
m_shape = NET_OUTPUT;
if( stricmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
if( strcasecmp( Name2, SheetLabelType[NET_BIDI] ) == 0 )
m_shape = NET_BIDI;
if( stricmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
if( strcasecmp( Name2, SheetLabelType[NET_TRISTATE] ) == 0 )
m_shape = NET_TRISTATE;
if( stricmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
if( strcasecmp( Name2, SheetLabelType[NET_UNSPECIFIED] ) == 0 )
m_shape = NET_UNSPECIFIED;
if( stricmp( Name3, "Italic" ) == 0 )
if( strcasecmp( Name3, "Italic" ) == 0 )
m_Italic = 1;
return true;

View File

@ -609,6 +609,18 @@ void SCH_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
SetToolID( id, wxCURSOR_BULLSEYE, _( "Delete item" ) );
break;
#ifdef KICAD_SPICE
case ID_SIM_PROBE:
SetToolID( id, -1, _( "Add a simulator probe" ) );
m_canvas->SetCursor( CURSOR_PROBE );
break;
case ID_SIM_TUNE:
SetToolID( id, -1, _( "Select a value to be tuned" ) );
m_canvas->SetCursor( CURSOR_TUNE );
break;
#endif /* KICAD_SPICE */
default:
SetRepeatItem( NULL );
}

View File

@ -280,6 +280,12 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME )
EVT_TOOL_RANGE( ID_SCHEMATIC_VERTICAL_TOOLBAR_START, ID_SCHEMATIC_VERTICAL_TOOLBAR_END,
SCH_EDIT_FRAME::OnSelectTool )
#ifdef KICAD_SPICE
EVT_TOOL( ID_SIM_SHOW, SCH_EDIT_FRAME::OnSimulate )
EVT_TOOL( ID_SIM_PROBE, SCH_EDIT_FRAME::OnSelectTool )
EVT_TOOL( ID_SIM_TUNE, SCH_EDIT_FRAME::OnSelectTool )
#endif /* KICAD_SPICE */
EVT_MENU( ID_CANCEL_CURRENT_COMMAND, SCH_EDIT_FRAME::OnCancelCurrentCommand )
EVT_MENU( ID_SCH_DRAG_ITEM, SCH_EDIT_FRAME::OnDragItem )
EVT_MENU_RANGE( ID_SCH_ROTATE_CLOCKWISE, ID_SCH_ROTATE_COUNTERCLOCKWISE,
@ -1371,4 +1377,3 @@ void SCH_EDIT_FRAME::UpdateTitle()
SetTitle( title );
}

View File

@ -813,6 +813,7 @@ private:
void OnErc( wxCommandEvent& event );
void OnCreateNetlist( wxCommandEvent& event );
void OnUpdatePCB( wxCommandEvent& event );
void OnSimulate( wxCommandEvent& event );
void OnCreateBillOfMaterials( wxCommandEvent& event );
void OnFindItems( wxCommandEvent& event );
void OnFindDialogClose( wxFindDialogEvent& event );
@ -1380,6 +1381,12 @@ public:
wxString GetNetListerCommand() const { return m_netListerCommand; }
///> Probe cursor, used by circuit simulator
const static wxCursor CURSOR_PROBE;
///> Tuner cursor, used by circuit simulator
const static wxCursor CURSOR_TUNE;
DECLARE_EVENT_TABLE()
};

View File

@ -0,0 +1,184 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "netlist_exporter_pspice_sim.h"
wxString NETLIST_EXPORTER_PSPICE_SIM::GetSpiceVector( const wxString& aName, SIM_PLOT_TYPE aType,
const wxString& aParam ) const
{
wxString res;
// Some of the flags should exclude mutually
assert( ( ( aType & SPT_VOLTAGE ) == 0 ) != ( ( aType & SPT_CURRENT ) == 0 ) );
assert( ( ( aType & SPT_AC_PHASE ) == 0 ) || ( ( aType & SPT_AC_MAG ) == 0 ) );
if( aType & SPT_VOLTAGE )
{
const auto& netMapping = GetNetIndexMap();
auto it = netMapping.find( aName );
if( it == netMapping.end() )
return "";
return wxString::Format( "V(%d)", it->second );
}
else if( aType & SPT_CURRENT )
{
return wxString::Format( "@%s[%s]", GetSpiceDevice( aName ).Lower(),
aParam.IsEmpty() ? "i" : aParam.Lower() );
}
return res;
}
const std::vector<wxString>& NETLIST_EXPORTER_PSPICE_SIM::GetCurrents( SPICE_PRIMITIVE aPrimitive )
{
static const std::vector<wxString> passive = { "I" };
static const std::vector<wxString> diode = { "Id" };
static const std::vector<wxString> bjt = { "Ib", "Ic", "Ie" };
static const std::vector<wxString> mos = { "Ig", "Id", "Is" };
static const std::vector<wxString> empty;
switch( aPrimitive )
{
case SP_RESISTOR:
case SP_CAPACITOR:
case SP_INDUCTOR:
case SP_VSOURCE:
return passive;
case SP_DIODE:
return diode;
case SP_BJT:
return bjt;
case SP_MOSFET:
return mos;
default:
return empty;
}
}
wxString NETLIST_EXPORTER_PSPICE_SIM::GetSpiceDevice( const wxString& aComponent ) const
{
const auto& spiceItems = GetSpiceItems();
auto it = std::find_if( spiceItems.begin(), spiceItems.end(), [&]( const SPICE_ITEM& item ) {
return item.m_refName == aComponent;
} );
if( it == spiceItems.end() )
return wxEmptyString;
return wxString( it->m_primitive + it->m_refName );
}
wxString NETLIST_EXPORTER_PSPICE_SIM::GetSheetSimCommand()
{
wxString simCmd;
UpdateDirectives( NET_ALL_FLAGS );
for( const auto& dir : GetDirectives() )
{
if( IsSimCommand( dir ) )
simCmd += wxString::Format( "%s\r\n", dir );
}
return simCmd;
}
SIM_TYPE NETLIST_EXPORTER_PSPICE_SIM::GetSimType()
{
return CommandToSimType( m_simCommand.IsEmpty() ? GetSheetSimCommand() : m_simCommand );
}
SIM_TYPE NETLIST_EXPORTER_PSPICE_SIM::CommandToSimType( const wxString& aCmd )
{
const std::map<wxString, SIM_TYPE> simCmds = {
{ ".ac", ST_AC }, { ".dc", ST_DC }, { ".disto", ST_DISTORTION }, { ".noise", ST_NOISE },
{ ".op", ST_OP }, { ".pz", ST_POLE_ZERO }, { ".sens", ST_SENSITIVITY }, { ".tf", ST_TRANS_FUNC },
{ ".tran", ST_TRANSIENT }
};
wxString lcaseCmd = aCmd.Lower();
for( const auto& c : simCmds )
{
if( lcaseCmd.StartsWith( c.first ) )
return c.second;
}
return ST_UNKNOWN;
}
void NETLIST_EXPORTER_PSPICE_SIM::writeDirectives( OUTPUTFORMATTER* aFormatter, unsigned aCtl ) const
{
// Add a directive to obtain currents
//aFormatter->Print( 0, ".options savecurrents\n" ); // does not work :(
for( const auto& item : GetSpiceItems() )
{
for( const auto& current :
NETLIST_EXPORTER_PSPICE_SIM::GetCurrents( (SPICE_PRIMITIVE) item.m_primitive ) )
{
/// @todo is it required to switch to lowercase
aFormatter->Print( 0, ".save %s\n",
(const char*) GetSpiceVector( item.m_refName, SPT_CURRENT, current ).c_str() );
}
}
// If we print out .save directives for currents, then it needs to be done for voltages as well
for( const auto& netMap : GetNetIndexMap() )
{
aFormatter->Print( 0, ".save %s\n",
(const char*) GetSpiceVector( netMap.first, SPT_VOLTAGE ).c_str() );
}
if( m_simCommand.IsEmpty() )
{
// Fallback to the default behavior and just write all directives
NETLIST_EXPORTER_PSPICE::writeDirectives( aFormatter, aCtl );
}
else
{
// Dump all directives but simulation commands
for( const auto& dir : GetDirectives() )
{
if( !IsSimCommand( dir ) )
aFormatter->Print( 0, "%s\n", (const char*) dir.c_str() );
}
// Finish with our custom simulation command
aFormatter->Print( 0, "%s\n", (const char*) m_simCommand.c_str() );
}
}

View File

@ -0,0 +1,125 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef NETLIST_EXPORTER_PSPICE_SIM_H
#define NETLIST_EXPORTER_PSPICE_SIM_H
#include <netlist_exporters/netlist_exporter_pspice.h>
#include <vector>
#include "sim_types.h"
/// Special netlist exporter flavor that allows to override simulation commands
class NETLIST_EXPORTER_PSPICE_SIM : public NETLIST_EXPORTER_PSPICE
{
public:
NETLIST_EXPORTER_PSPICE_SIM( NETLIST_OBJECT_LIST* aMasterList, PART_LIBS* aLibs,
SEARCH_STACK* aPaths = NULL ) :
NETLIST_EXPORTER_PSPICE( aMasterList, aLibs, aPaths )
{
}
/**
* @brief Returns name of Spice dataset for a specific plot.
* @param aName is name of the measured net or device
* @param aType describes the type of expected plot
* @param aParam is an optional parameter for devices, if absent it will return current (only
* for passive devices).
* @return Empty string if query is invalid, otherwise a plot name that
* can be requested from the simulator.
*/
wxString GetSpiceVector( const wxString& aName, SIM_PLOT_TYPE aType,
const wxString& aParam = wxEmptyString ) const;
/**
* @brief Returns name of Spice device corresponding to a schematic component.
* @param aComponent is the component reference.
* @return Spice device name or empty string if there is no such component in the netlist.
*/
wxString GetSpiceDevice( const wxString& aComponent ) const;
/**
* @brief Returns a list of currents that can be probed in a Spice primitive.
*/
static const std::vector<wxString>& GetCurrents( SPICE_PRIMITIVE aPrimitive );
/**
* @brief Overrides the simulation command directive.
*/
void SetSimCommand( const wxString& aCmd )
{
m_simCommand = aCmd;
}
/**
* @brief Returns the simulation command directive.
*/
const wxString& GetSimCommand() const
{
return m_simCommand;
}
/**
* @brief Clears the simulation command directive.
*/
void ClearSimCommand()
{
m_simCommand.Clear();
}
/**
* @brief Returns simulation type basing on the simulation command directives.
* Simulation directives set using SetSimCommand() have priority over the ones placed in
* schematic sheets.
*/
SIM_TYPE GetSimType();
/**
* @brief Returns simulation command directives placed in schematic sheets (if any).
*/
wxString GetSheetSimCommand();
/**
* @brief Determines if a directive is a simulation command.
*/
static bool IsSimCommand( const wxString& aCmd )
{
return CommandToSimType( aCmd ) != ST_UNKNOWN;
}
/**
* @brief Returns simulation type basing on a simulation command directive.
*/
static SIM_TYPE CommandToSimType( const wxString& aCmd );
protected:
void writeDirectives( OUTPUTFORMATTER* aFormatter, unsigned aCtl ) const override;
private:
///> Custom simulation command (has priority over the schematic sheet simulation commands)
wxString m_simCommand;
};
#endif /* NETLIST_EXPORTER_PSPICE_SIM_H */

370
eeschema/sim/ngspice.cpp Normal file
View File

@ -0,0 +1,370 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "ngspice.h"
#include "spice_reporter.h"
#include <wx/dynlib.h>
#include <wx/log.h>
#include <sstream>
#include <stdexcept>
using namespace std;
NGSPICE::NGSPICE()
{
init_dll();
}
NGSPICE::~NGSPICE()
{
delete m_dll;
}
void NGSPICE::Init()
{
if( m_error )
{
delete m_dll;
init_dll();
}
Command( "reset" );
}
vector<COMPLEX> NGSPICE::GetPlot( const string& aName, int aMaxLen )
{
vector<COMPLEX> data;
setlocale( LC_ALL, "C" );
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
setlocale( LC_ALL, "" );
if( vi )
{
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
data.reserve( length );
if( vi->v_realdata )
{
for( int i = 0; i < length; i++ )
data.push_back( COMPLEX( vi->v_realdata[i], 0.0 ) );
}
else if( vi->v_compdata )
{
for( int i = 0; i < length; i++ )
data.push_back( COMPLEX( vi->v_compdata[i].cx_real, vi->v_compdata[i].cx_imag ) );
}
}
return data;
}
vector<double> NGSPICE::GetRealPlot( const string& aName, int aMaxLen )
{
vector<double> data;
setlocale( LC_ALL, "C" );
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
setlocale( LC_ALL, "" );
if( vi )
{
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
data.reserve( length );
if( vi->v_realdata )
{
for( int i = 0; i < length; i++ )
{
data.push_back( vi->v_realdata[i] );
}
}
else if( vi->v_compdata )
{
for( int i = 0; i < length; i++ )
{
assert( vi->v_compdata[i].cx_imag == 0.0 );
data.push_back( vi->v_compdata[i].cx_real );
}
}
}
return data;
}
vector<double> NGSPICE::GetImagPlot( const string& aName, int aMaxLen )
{
vector<double> data;
setlocale( LC_ALL, "C" );
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
setlocale( LC_ALL, "" );
if( vi )
{
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
data.reserve( length );
if( vi->v_compdata )
{
for( int i = 0; i < length; i++ )
{
data.push_back( vi->v_compdata[i].cx_imag );
}
}
}
return data;
}
vector<double> NGSPICE::GetMagPlot( const string& aName, int aMaxLen )
{
vector<double> data;
setlocale( LC_ALL, "C" );
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
setlocale( LC_ALL, "" );
if( vi )
{
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
data.reserve( length );
if( vi->v_realdata )
{
for( int i = 0; i < length; i++ )
data.push_back( vi->v_realdata[i] );
}
else if( vi->v_compdata )
{
for( int i = 0; i < length; i++ )
data.push_back( hypot( vi->v_compdata[i].cx_real, vi->v_compdata[i].cx_imag ) );
}
}
return data;
}
vector<double> NGSPICE::GetPhasePlot( const string& aName, int aMaxLen )
{
vector<double> data;
setlocale( LC_ALL, "C" );
vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
setlocale( LC_ALL, "" );
if( vi )
{
int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
data.reserve( length );
if( vi->v_realdata )
{
for( int i = 0; i < length; i++ )
data.push_back( 0.0 ); // well, that's life
}
else if( vi->v_compdata )
{
for( int i = 0; i < length; i++ )
data.push_back( atan2( vi->v_compdata[i].cx_imag, vi->v_compdata[i].cx_real ) );
}
}
return data;
}
bool NGSPICE::LoadNetlist( const string& aNetlist )
{
vector<char*> lines;
stringstream ss( aNetlist );
while( !ss.eof() )
{
char line[1024];
ss.getline( line, sizeof( line ) );
lines.push_back( strdup( line ) );
}
lines.push_back( nullptr );
setlocale( LC_ALL, "C" );
m_ngSpice_Circ( lines.data() );
setlocale( LC_ALL, "" );
for( auto line : lines )
delete line;
return true;
}
bool NGSPICE::Run()
{
setlocale( LC_ALL, "C" );
bool rv = Command( "bg_run" ); // bg_* commands execute in a separate thread
setlocale( LC_ALL, "" );
return rv;
}
bool NGSPICE::Stop()
{
setlocale( LC_ALL, "C" );
bool rv = Command( "bg_halt" ); // bg_* commands execute in a separate thread
setlocale( LC_ALL, "" );
return rv;
}
bool NGSPICE::IsRunning()
{
setlocale( LC_ALL, "C" );
bool rv = m_ngSpice_Running();
setlocale( LC_ALL, "" );
return rv;
}
bool NGSPICE::Command( const string& aCmd )
{
setlocale( LC_ALL, "C" );
m_ngSpice_Command( (char*) aCmd.c_str() );
setlocale( LC_ALL, "" );
return true;
}
string NGSPICE::GetXAxis( SIM_TYPE aType ) const
{
switch( aType )
{
case ST_AC:
case ST_NOISE:
return string( "frequency" );
break;
case ST_DC:
return string( "v-sweep" );
break;
case ST_TRANSIENT:
return string( "time" );
break;
default:
break;
}
return string( "" );
}
void NGSPICE::init_dll()
{
#ifdef __WINDOWS__
m_dll = new wxDynamicLibrary( "libngspice-0.dll" );
#else
m_dll = new wxDynamicLibrary( wxDynamicLibrary::CanonicalizeName( "ngspice" ) );
#endif
if( !m_dll || !m_dll->IsLoaded() )
throw std::runtime_error( "Missing ngspice shared library" );
m_error = false;
// Obtain function pointers
m_ngSpice_Init = (ngSpice_Init) m_dll->GetSymbol( "ngSpice_Init" );
m_ngSpice_Circ = (ngSpice_Circ) m_dll->GetSymbol( "ngSpice_Circ" );
m_ngSpice_Command = (ngSpice_Command) m_dll->GetSymbol( "ngSpice_Command" );
m_ngGet_Vec_Info = (ngGet_Vec_Info) m_dll->GetSymbol( "ngGet_Vec_Info" );
m_ngSpice_AllPlots = (ngSpice_AllPlots) m_dll->GetSymbol( "ngSpice_AllPlots" );
m_ngSpice_AllVecs = (ngSpice_AllVecs) m_dll->GetSymbol( "ngSpice_AllVecs" );
m_ngSpice_Running = (ngSpice_Running) m_dll->GetSymbol( "ngSpice_running" ); // it is not a typo
setlocale( LC_ALL, "C" );
m_ngSpice_Init( &cbSendChar, &cbSendStat, &cbControlledExit, NULL, NULL, &cbBGThreadRunning, this );
// Workaround to avoid hang ups on certain errors
Command( "unset interactive" );
setlocale( LC_ALL, "" );
}
int NGSPICE::cbSendChar( char* what, int id, void* user )
{
NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
if( sim->m_reporter )
{
// strip stdout/stderr from the line
if( ( strncasecmp( what, "stdout ", 7 ) == 0 )
|| ( strncasecmp( what, "stderr ", 7 ) == 0 ) )
what += 7;
sim->m_reporter->Report( what );
}
return 0;
}
int NGSPICE::cbSendStat( char* what, int id, void* user )
{
/* NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
if( sim->m_consoleReporter )
sim->m_consoleReporter->Report( what );*/
return 0;
}
int NGSPICE::cbBGThreadRunning( bool is_running, int id, void* user )
{
NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
if( sim->m_reporter )
// I know the test below seems like an error, but well, it works somehow..
sim->m_reporter->OnSimStateChange( sim, is_running ? SIM_IDLE : SIM_RUNNING );
return 0;
}
int NGSPICE::cbControlledExit( int status, bool immediate, bool exit_upon_quit, int id, void* user )
{
// Something went wrong, reload the dll
NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
sim->m_error = true;
//printf("stat %d immed %d quit %d\n", status, !!immediate, !!exit_upon_quit);
return 0;
}

111
eeschema/sim/ngspice.h Normal file
View File

@ -0,0 +1,111 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef NGSPICE_H
#define NGSPICE_H
#include <../share/ngspice/include/ngspice/sharedspice.h>
#include "spice_simulator.h"
class wxDynamicLibrary;
class NGSPICE : public SPICE_SIMULATOR {
public:
NGSPICE();
virtual ~NGSPICE();
///> @copydoc SPICE_SIMULATOR::Init()
void Init() override;
///> @copydoc SPICE_SIMULATOR::LoadNetlist()
bool LoadNetlist( const std::string& aNetlist ) override;
///> @copydoc SPICE_SIMULATOR::Run()
bool Run() override;
///> @copydoc SPICE_SIMULATOR::Stop()
bool Stop() override;
///> @copydoc SPICE_SIMULATOR::IsRunning()
bool IsRunning() override;
///> @copydoc SPICE_SIMULATOR::Command()
bool Command( const std::string& aCmd ) override;
///> @copydoc SPICE_SIMULATOR::GetXAxis()
std::string GetXAxis( SIM_TYPE aType ) const override;
///> @copydoc SPICE_SIMULATOR::GetPlot()
std::vector<COMPLEX> GetPlot( const std::string& aName, int aMaxLen = -1 ) override;
///> @copydoc SPICE_SIMULATOR::GetRealPlot()
std::vector<double> GetRealPlot( const std::string& aName, int aMaxLen = -1 ) override;
///> @copydoc SPICE_SIMULATOR::GetImagPlot()
std::vector<double> GetImagPlot( const std::string& aName, int aMaxLen = -1 ) override;
///> @copydoc SPICE_SIMULATOR::GetMagPlot()
std::vector<double> GetMagPlot( const std::string& aName, int aMaxLen = -1 ) override;
///> @copydoc SPICE_SIMULATOR::GetPhasePlot()
std::vector<double> GetPhasePlot( const std::string& aName, int aMaxLen = -1 ) override;
private:
bool m_error;
// Performs DLL initialization, obtains function pointers
void init_dll();
// ngspice library functions
typedef void (*ngSpice_Init)( SendChar*, SendStat*, ControlledExit*,
SendData*, SendInitData*, BGThreadRunning*, void* );
typedef int (*ngSpice_Circ)( char** circarray );
typedef int (*ngSpice_Command)( char* command );
typedef pvector_info (*ngGet_Vec_Info)( char* vecname );
typedef char** (*ngSpice_AllPlots)( void );
typedef char** (*ngSpice_AllVecs)( char* plotname );
typedef bool (*ngSpice_Running)( void );
///> Handles to DLL functions
ngSpice_Init m_ngSpice_Init;
ngSpice_Circ m_ngSpice_Circ;
ngSpice_Command m_ngSpice_Command;
ngGet_Vec_Info m_ngGet_Vec_Info;
ngSpice_AllPlots m_ngSpice_AllPlots;
ngSpice_AllVecs m_ngSpice_AllVecs;
ngSpice_Running m_ngSpice_Running;
wxDynamicLibrary* m_dll;
// Callback functions
static int cbSendChar( char* what, int id, void* user );
static int cbSendStat( char* what, int id, void* user );
static int cbBGThreadRunning( bool is_running, int id, void* user );
static int cbControlledExit( int status, bool immediate, bool exit_upon_quit, int id, void* user );
void dump();
};
#endif /* NGSPICE_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,328 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __sim_plot_frame__
#define __sim_plot_frame__
/**
* @file Subclass of SIM_PLOT_FRAME_BASE, which is generated by wxFormBuilder.
*/
#include "sim_plot_frame_base.h"
#include "sim_types.h"
#include <kiway_player.h>
#include <dialogs/dialog_sim_settings.h>
#include <wx/event.h>
#include <list>
#include <memory>
#include <map>
class SCH_EDIT_FRAME;
class SCH_COMPONENT;
class SPICE_SIMULATOR;
class NETLIST_EXPORTER_PSPICE_SIM;
class SIM_PLOT_PANEL;
class TUNER_SLIDER;
///> Trace descriptor class
class TRACE_DESC
{
public:
TRACE_DESC( const NETLIST_EXPORTER_PSPICE_SIM& aExporter, const wxString& aName,
SIM_PLOT_TYPE aType, const wxString& aParam );
///> Modifies an existing TRACE_DESC simulation type
TRACE_DESC( const NETLIST_EXPORTER_PSPICE_SIM& aExporter,
const TRACE_DESC& aDescription, SIM_PLOT_TYPE aNewType )
: TRACE_DESC( aExporter, aDescription.GetName(), aNewType, aDescription.GetParam() )
{
}
const wxString& GetTitle() const
{
return m_title;
}
const wxString& GetName() const
{
return m_name;
}
const wxString& GetParam() const
{
return m_param;
}
SIM_PLOT_TYPE GetType() const
{
return m_type;
}
private:
// Three basic parameters
///> Name of the measured net/device
wxString m_name;
///> Type of the signal
SIM_PLOT_TYPE m_type;
///> Name of the signal parameter
wxString m_param;
// Generated data
///> Title displayed in the signal list/plot legend
wxString m_title;
};
/** Implementing SIM_PLOT_FRAME_BASE */
class SIM_PLOT_FRAME : public SIM_PLOT_FRAME_BASE
{
public:
/** Constructor */
SIM_PLOT_FRAME( KIWAY* aKiway, wxWindow* aParent );
~SIM_PLOT_FRAME();
void StartSimulation();
void StopSimulation();
bool IsSimulationRunning();
/**
* @brief Creates a new plot panel for a given simulation type and adds it to the main
* notebook.
* @param aSimType is requested simulation type.
* @return The new plot panel.
*/
SIM_PLOT_PANEL* NewPlotPanel( SIM_TYPE aSimType );
/**
* @brief Adds a voltage plot for a given net name.
* @param aNetName is the net name for which a voltage plot should be created.
*/
void AddVoltagePlot( const wxString& aNetName );
/**
* @brief Adds a current plot for a particular device.
* @param aDeviceName is the device name (e.g. R1, C1).
* @param aParam is the current type (e.g. I, Ic, Id).
*/
void AddCurrentPlot( const wxString& aDeviceName, const wxString& aParam );
/**
* @brief Adds a tuner for a component.
*/
void AddTuner( SCH_COMPONENT* aComponent );
/**
* @brief Removes an existing tuner.
* @param aTuner is the tuner to be removed.
* @param aErase decides whether the tuner should be also removed from the tuners list.
* Otherwise it is removed only from the SIM_PLOT_FRAME pane.
*/
void RemoveTuner( TUNER_SLIDER* aTuner, bool aErase = true );
/**
* @brief Returns the currently opened plot panel (or NULL if there is none).
*/
SIM_PLOT_PANEL* CurrentPlot() const;
private:
/**
* @brief Adds a new plot to the current panel.
* @param aName is the device/net name.
* @param aType describes the type of plot.
* @param aParam is the parameter for the device/net (e.g. I, Id, V).
*/
void addPlot( const wxString& aName, SIM_PLOT_TYPE aType, const wxString& aParam );
/**
* @brief Removes a plot with a specific title.
* @param aPlotName is the full plot title (e.g. I(Net-C1-Pad1)).
* @param aErase decides if plot should be removed from corresponding TRACE_MAP (see m_plots).
*/
void removePlot( const wxString& aPlotName, bool aErase = true );
/**
* @brief Reloads the current schematic for the netlist exporter.
*/
void updateNetlistExporter();
/**
* @brief Updates plot in a particular SIM_PLOT_PANEL. If the panel does not contain
* the plot, it will be added.
* @param aDescriptor contains the plot description.
* @param aPanel is the panel that should receive the update.
* @return True if a plot was successfully added/updated.
*/
bool updatePlot( const TRACE_DESC& aDescriptor, SIM_PLOT_PANEL* aPanel );
/**
* @brief Updates the list of currently plotted signals.
*/
void updateSignalList();
/**
* @brief Updates the cursor values list.
*/
void updateCursors();
/**
* @brief Filters out tuners for components that do not exist anymore.
* Decisions are based on the current NETLIST_EXPORTER data.
*/
void updateTuners();
/**
* @brief Applies component values specified using tunder sliders to the current netlist.
*/
void applyTuners();
/**
* @brief Loads plot settings from a file.
* @param aPath is the file name.
* @return True if successful.
*/
bool loadWorkbook( const wxString& aPath );
/**
* @brief Saves plot settings to a file.
* @param aPath is the file name.
* @return True if successful.
*/
bool saveWorkbook( const wxString& aPath );
/**
* @brief Returns X axis for a given simulation type.
*/
SIM_PLOT_TYPE GetXAxisType( SIM_TYPE aType ) const;
// Menu handlers
void menuNewPlot( wxCommandEvent& aEvent ) override;
void menuOpenWorkbook( wxCommandEvent& event ) override;
void menuSaveWorkbook( wxCommandEvent& event ) override;
void menuExit( wxCommandEvent& event ) override
{
Close();
}
void menuSaveImage( wxCommandEvent& event ) override;
void menuSaveCsv( wxCommandEvent& event ) override;
void menuZoomIn( wxCommandEvent& event ) override;
void menuZoomOut( wxCommandEvent& event ) override;
void menuZoomFit( wxCommandEvent& event ) override;
void menuShowGrid( wxCommandEvent& event ) override;
void menuShowGridUpdate( wxUpdateUIEvent& event ) override;
void menuShowLegend( wxCommandEvent& event ) override;
void menuShowLegendUpdate( wxUpdateUIEvent& event ) override;
// Event handlers
void onPlotChanged( wxAuiNotebookEvent& event ) override;
void onPlotClose( wxAuiNotebookEvent& event ) override;
void onSignalDblClick( wxCommandEvent& event ) override;
void onSignalRClick( wxMouseEvent& event ) override;
void onSimulate( wxCommandEvent& event );
void onSettings( wxCommandEvent& event );
void onAddSignal( wxCommandEvent& event );
void onProbe( wxCommandEvent& event );
void onTune( wxCommandEvent& event );
void onClose( wxCloseEvent& aEvent );
void onCursorUpdate( wxCommandEvent& aEvent );
void onSimUpdate( wxCommandEvent& aEvent );
void onSimReport( wxCommandEvent& aEvent );
void onSimStarted( wxCommandEvent& aEvent );
void onSimFinished( wxCommandEvent& aEvent );
// Toolbar buttons
wxToolBarToolBase* m_toolSimulate;
wxToolBarToolBase* m_toolAddSignals;
wxToolBarToolBase* m_toolProbe;
wxToolBarToolBase* m_toolTune;
wxToolBarToolBase* m_toolSettings;
SCH_EDIT_FRAME* m_schematicFrame;
std::unique_ptr<NETLIST_EXPORTER_PSPICE_SIM> m_exporter;
std::unique_ptr<SPICE_SIMULATOR> m_simulator;
typedef std::map<wxString, TRACE_DESC> TRACE_MAP;
struct PLOT_INFO
{
///> Map of the traces displayed on the plot
TRACE_MAP m_traces;
///> Spice directive used to execute the simulation
wxString m_simCommand;
};
///> Map of plot panels and associated data
std::map<SIM_PLOT_PANEL*, PLOT_INFO> m_plots;
///> List of currently displayed tuners
std::list<TUNER_SLIDER*> m_tuners;
// Trick to preserve settings between runs
DIALOG_SIM_SETTINGS m_settingsDlg;
// Right click context menu for signals in the listbox
class SIGNAL_CONTEXT_MENU : public wxMenu
{
public:
SIGNAL_CONTEXT_MENU( const wxString& aSignal, SIM_PLOT_FRAME* aPlotFrame );
private:
void onMenuEvent( wxMenuEvent& aEvent );
const wxString& m_signal;
SIM_PLOT_FRAME* m_plotFrame;
enum SIGNAL_CONTEXT_MENU_EVENTS
{
HIDE_SIGNAL,
SHOW_CURSOR,
HIDE_CURSOR
};
};
///> Panel that was used as the most recent one for simulations
SIM_PLOT_PANEL* m_lastSimPlot;
};
// Commands
wxDECLARE_EVENT( EVT_SIM_UPDATE, wxCommandEvent );
wxDECLARE_EVENT( EVT_SIM_REPORT, wxCommandEvent );
// Notifications
wxDECLARE_EVENT( EVT_SIM_STARTED, wxCommandEvent );
wxDECLARE_EVENT( EVT_SIM_FINISHED, wxCommandEvent );
#endif // __sim_plot_frame__

View File

@ -0,0 +1,265 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "sim_plot_frame_base.h"
///////////////////////////////////////////////////////////////////////////
SIM_PLOT_FRAME_BASE::SIM_PLOT_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : KIWAY_PLAYER( parent, id, title, pos, size, style, name )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
m_mainMenu = new wxMenuBar( 0 );
m_fileMenu = new wxMenu();
wxMenuItem* m_newPlot;
m_newPlot = new wxMenuItem( m_fileMenu, wxID_NEW, wxString( _("New Plot") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_newPlot );
m_fileMenu->AppendSeparator();
wxMenuItem* m_openWorkbook;
m_openWorkbook = new wxMenuItem( m_fileMenu, wxID_OPEN, wxString( _("Open Workbook") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_openWorkbook );
wxMenuItem* m_saveWorkbook;
m_saveWorkbook = new wxMenuItem( m_fileMenu, wxID_SAVE, wxString( _("Save Workbook") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_saveWorkbook );
m_fileMenu->AppendSeparator();
wxMenuItem* m_saveImage;
m_saveImage = new wxMenuItem( m_fileMenu, wxID_ANY, wxString( _("Save as image") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_saveImage );
wxMenuItem* m_saveCsv;
m_saveCsv = new wxMenuItem( m_fileMenu, wxID_ANY, wxString( _("Save as .csv file") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_saveCsv );
m_fileMenu->AppendSeparator();
wxMenuItem* m_exitSim;
m_exitSim = new wxMenuItem( m_fileMenu, wxID_CLOSE, wxString( _("Exit Simulation") ) , wxEmptyString, wxITEM_NORMAL );
m_fileMenu->Append( m_exitSim );
m_mainMenu->Append( m_fileMenu, _("File") );
m_simulationMenu = new wxMenu();
m_runSimulation = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Run Simulation") ) , wxEmptyString, wxITEM_NORMAL );
m_simulationMenu->Append( m_runSimulation );
m_simulationMenu->AppendSeparator();
m_addSignals = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Add signals...") ) , wxEmptyString, wxITEM_NORMAL );
m_simulationMenu->Append( m_addSignals );
m_probeSignals = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Probe from schematics") ) , wxEmptyString, wxITEM_NORMAL );
m_simulationMenu->Append( m_probeSignals );
m_tuneValue = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Tune component value") ) , wxEmptyString, wxITEM_NORMAL );
m_simulationMenu->Append( m_tuneValue );
m_simulationMenu->AppendSeparator();
m_settings = new wxMenuItem( m_simulationMenu, wxID_ANY, wxString( _("Settings...") ) , wxEmptyString, wxITEM_NORMAL );
m_simulationMenu->Append( m_settings );
m_mainMenu->Append( m_simulationMenu, _("Simulation") );
m_viewMenu = new wxMenu();
wxMenuItem* m_zoomIn;
m_zoomIn = new wxMenuItem( m_viewMenu, wxID_ZOOM_IN, wxString( _("Zoom In") ) , wxEmptyString, wxITEM_NORMAL );
m_viewMenu->Append( m_zoomIn );
wxMenuItem* m_zoomOut;
m_zoomOut = new wxMenuItem( m_viewMenu, wxID_ZOOM_OUT, wxString( _("Zoom Out") ) , wxEmptyString, wxITEM_NORMAL );
m_viewMenu->Append( m_zoomOut );
wxMenuItem* m_zoomFit;
m_zoomFit = new wxMenuItem( m_viewMenu, wxID_ZOOM_FIT, wxString( _("Fit on Screen") ) , wxEmptyString, wxITEM_NORMAL );
m_viewMenu->Append( m_zoomFit );
m_viewMenu->AppendSeparator();
wxMenuItem* m_showGrid;
m_showGrid = new wxMenuItem( m_viewMenu, wxID_ANY, wxString( _("Show &grid") ) , wxEmptyString, wxITEM_CHECK );
m_viewMenu->Append( m_showGrid );
wxMenuItem* m_showLegend;
m_showLegend = new wxMenuItem( m_viewMenu, wxID_ANY, wxString( _("Show &legend") ) , wxEmptyString, wxITEM_CHECK );
m_viewMenu->Append( m_showLegend );
m_mainMenu->Append( m_viewMenu, _("View") );
this->SetMenuBar( m_mainMenu );
m_sizer1 = new wxBoxSizer( wxVERTICAL );
m_toolBar = new wxToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_FLAT|wxTB_HORIZONTAL|wxTB_TEXT );
m_toolBar->Realize();
m_sizer1->Add( m_toolBar, 0, wxEXPAND, 5 );
m_splitterPlot = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D );
m_splitterPlot->SetSashGravity( 0.8 );
m_splitterPlot->Connect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitterPlotOnIdle ), NULL, this );
m_panel2 = new wxPanel( m_splitterPlot, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_sizer11 = new wxBoxSizer( wxVERTICAL );
m_splitterConsole = new wxSplitterWindow( m_panel2, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D );
m_splitterConsole->SetSashGravity( 0.8 );
m_splitterConsole->Connect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitterConsoleOnIdle ), NULL, this );
m_plotPanel = new wxPanel( m_splitterConsole, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_sizer5 = new wxBoxSizer( wxHORIZONTAL );
m_plotNotebook = new wxAuiNotebook( m_plotPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_NB_MIDDLE_CLICK_CLOSE|wxAUI_NB_TAB_MOVE|wxAUI_NB_TAB_SPLIT|wxAUI_NB_TOP );
m_welcomePanel = new wxPanel( m_plotNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_sizer8 = new wxBoxSizer( wxVERTICAL );
m_sizer8->Add( 0, 0, 1, wxEXPAND, 5 );
wxBoxSizer* bSizer81;
bSizer81 = new wxBoxSizer( wxHORIZONTAL );
bSizer81->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText2 = new wxStaticText( m_welcomePanel, wxID_ANY, _("Start the simulation by clicking the Run Simulation button"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText2->Wrap( -1 );
m_staticText2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
m_staticText2->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
bSizer81->Add( m_staticText2, 0, wxALIGN_RIGHT|wxALL|wxEXPAND, 5 );
bSizer81->Add( 0, 0, 1, wxEXPAND, 5 );
m_sizer8->Add( bSizer81, 0, wxEXPAND, 5 );
m_sizer8->Add( 0, 0, 1, wxEXPAND, 5 );
m_welcomePanel->SetSizer( m_sizer8 );
m_welcomePanel->Layout();
m_sizer8->Fit( m_welcomePanel );
m_plotNotebook->AddPage( m_welcomePanel, _("a page"), false, wxNullBitmap );
m_sizer5->Add( m_plotNotebook, 1, wxEXPAND | wxALL, 5 );
m_plotPanel->SetSizer( m_sizer5 );
m_plotPanel->Layout();
m_sizer5->Fit( m_plotPanel );
m_panel5 = new wxPanel( m_splitterConsole, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_sizer13 = new wxBoxSizer( wxVERTICAL );
m_simConsole = new wxTextCtrl( m_panel5, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
m_simConsole->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
m_sizer13->Add( m_simConsole, 1, wxALL|wxEXPAND, 5 );
m_panel5->SetSizer( m_sizer13 );
m_panel5->Layout();
m_sizer13->Fit( m_panel5 );
m_splitterConsole->SplitHorizontally( m_plotPanel, m_panel5, 500 );
m_sizer11->Add( m_splitterConsole, 1, wxEXPAND, 5 );
m_panel2->SetSizer( m_sizer11 );
m_panel2->Layout();
m_sizer11->Fit( m_panel2 );
m_sidePanel = new wxPanel( m_splitterPlot, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_sideSizer = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbSizer1;
sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( m_sidePanel, wxID_ANY, _("Signals") ), wxVERTICAL );
m_signals = new wxListBox( sbSizer1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE|wxLB_SORT );
sbSizer1->Add( m_signals, 1, wxALL|wxEXPAND, 5 );
m_sideSizer->Add( sbSizer1, 1, wxEXPAND, 5 );
wxStaticBoxSizer* sbSizer3;
sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_sidePanel, wxID_ANY, _("Cursors") ), wxVERTICAL );
m_cursors = new wxListCtrl( sbSizer3->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_SINGLE_SEL );
sbSizer3->Add( m_cursors, 1, wxALL|wxEXPAND, 5 );
m_sideSizer->Add( sbSizer3, 1, wxEXPAND, 5 );
sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( m_sidePanel, wxID_ANY, _("Tune") ), wxVERTICAL );
m_tuneSizer = new wxBoxSizer( wxHORIZONTAL );
sbSizer4->Add( m_tuneSizer, 1, wxEXPAND, 5 );
m_sideSizer->Add( sbSizer4, 1, wxEXPAND, 5 );
m_sidePanel->SetSizer( m_sideSizer );
m_sidePanel->Layout();
m_sideSizer->Fit( m_sidePanel );
m_splitterPlot->SplitVertically( m_panel2, m_sidePanel, 700 );
m_sizer1->Add( m_splitterPlot, 1, wxEXPAND, 5 );
this->SetSizer( m_sizer1 );
this->Layout();
this->Centre( wxBOTH );
// Connect Events
this->Connect( m_newPlot->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuNewPlot ) );
this->Connect( m_openWorkbook->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuOpenWorkbook ) );
this->Connect( m_saveWorkbook->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveWorkbook ) );
this->Connect( m_saveImage->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveImage ) );
this->Connect( m_saveCsv->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveCsv ) );
this->Connect( m_exitSim->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuExit ) );
this->Connect( m_zoomIn->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomIn ) );
this->Connect( m_zoomOut->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomOut ) );
this->Connect( m_zoomFit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomFit ) );
this->Connect( m_showGrid->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuShowGrid ) );
this->Connect( m_showGrid->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler( SIM_PLOT_FRAME_BASE::menuShowGridUpdate ) );
this->Connect( m_showLegend->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuShowLegend ) );
this->Connect( m_showLegend->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler( SIM_PLOT_FRAME_BASE::menuShowLegendUpdate ) );
m_plotNotebook->Connect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( SIM_PLOT_FRAME_BASE::onPlotChanged ), NULL, this );
m_plotNotebook->Connect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEventHandler( SIM_PLOT_FRAME_BASE::onPlotClose ), NULL, this );
m_signals->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::onSignalDblClick ), NULL, this );
m_signals->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( SIM_PLOT_FRAME_BASE::onSignalRClick ), NULL, this );
}
SIM_PLOT_FRAME_BASE::~SIM_PLOT_FRAME_BASE()
{
// Disconnect Events
this->Disconnect( wxID_NEW, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuNewPlot ) );
this->Disconnect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuOpenWorkbook ) );
this->Disconnect( wxID_SAVE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveWorkbook ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveImage ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuSaveCsv ) );
this->Disconnect( wxID_CLOSE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuExit ) );
this->Disconnect( wxID_ZOOM_IN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomIn ) );
this->Disconnect( wxID_ZOOM_OUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomOut ) );
this->Disconnect( wxID_ZOOM_FIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuZoomFit ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuShowGrid ) );
this->Disconnect( wxID_ANY, wxEVT_UPDATE_UI, wxUpdateUIEventHandler( SIM_PLOT_FRAME_BASE::menuShowGridUpdate ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::menuShowLegend ) );
this->Disconnect( wxID_ANY, wxEVT_UPDATE_UI, wxUpdateUIEventHandler( SIM_PLOT_FRAME_BASE::menuShowLegendUpdate ) );
m_plotNotebook->Disconnect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( SIM_PLOT_FRAME_BASE::onPlotChanged ), NULL, this );
m_plotNotebook->Disconnect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEventHandler( SIM_PLOT_FRAME_BASE::onPlotClose ), NULL, this );
m_signals->Disconnect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::onSignalDblClick ), NULL, this );
m_signals->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( SIM_PLOT_FRAME_BASE::onSignalRClick ), NULL, this );
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,120 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __SIM_PLOT_FRAME_BASE_H__
#define __SIM_PLOT_FRAME_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
class KIWAY_PLAYER;
#include "kiway_player.h"
#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/toolbar.h>
#include <wx/stattext.h>
#include <wx/sizer.h>
#include <wx/panel.h>
#include <wx/aui/auibook.h>
#include <wx/textctrl.h>
#include <wx/splitter.h>
#include <wx/listbox.h>
#include <wx/statbox.h>
#include <wx/listctrl.h>
#include <wx/frame.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class SIM_PLOT_FRAME_BASE
///////////////////////////////////////////////////////////////////////////////
class SIM_PLOT_FRAME_BASE : public KIWAY_PLAYER
{
private:
protected:
wxMenuBar* m_mainMenu;
wxMenu* m_fileMenu;
wxMenu* m_simulationMenu;
wxMenuItem* m_runSimulation;
wxMenuItem* m_addSignals;
wxMenuItem* m_probeSignals;
wxMenuItem* m_tuneValue;
wxMenuItem* m_settings;
wxMenu* m_viewMenu;
wxBoxSizer* m_sizer1;
wxToolBar* m_toolBar;
wxSplitterWindow* m_splitterPlot;
wxPanel* m_panel2;
wxBoxSizer* m_sizer11;
wxSplitterWindow* m_splitterConsole;
wxPanel* m_plotPanel;
wxBoxSizer* m_sizer5;
wxAuiNotebook* m_plotNotebook;
wxPanel* m_welcomePanel;
wxBoxSizer* m_sizer8;
wxStaticText* m_staticText2;
wxPanel* m_panel5;
wxBoxSizer* m_sizer13;
wxTextCtrl* m_simConsole;
wxPanel* m_sidePanel;
wxBoxSizer* m_sideSizer;
wxListBox* m_signals;
wxListCtrl* m_cursors;
wxStaticBoxSizer* sbSizer4;
wxBoxSizer* m_tuneSizer;
// Virtual event handlers, overide them in your derived class
virtual void menuNewPlot( wxCommandEvent& event ) { event.Skip(); }
virtual void menuOpenWorkbook( wxCommandEvent& event ) { event.Skip(); }
virtual void menuSaveWorkbook( wxCommandEvent& event ) { event.Skip(); }
virtual void menuSaveImage( wxCommandEvent& event ) { event.Skip(); }
virtual void menuSaveCsv( wxCommandEvent& event ) { event.Skip(); }
virtual void menuExit( wxCommandEvent& event ) { event.Skip(); }
virtual void menuZoomIn( wxCommandEvent& event ) { event.Skip(); }
virtual void menuZoomOut( wxCommandEvent& event ) { event.Skip(); }
virtual void menuZoomFit( wxCommandEvent& event ) { event.Skip(); }
virtual void menuShowGrid( wxCommandEvent& event ) { event.Skip(); }
virtual void menuShowGridUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void menuShowLegend( wxCommandEvent& event ) { event.Skip(); }
virtual void menuShowLegendUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void onPlotChanged( wxAuiNotebookEvent& event ) { event.Skip(); }
virtual void onPlotClose( wxAuiNotebookEvent& event ) { event.Skip(); }
virtual void onSignalDblClick( wxCommandEvent& event ) { event.Skip(); }
virtual void onSignalRClick( wxMouseEvent& event ) { event.Skip(); }
public:
SIM_PLOT_FRAME_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Simulation Workbook"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 1000,700 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL, const wxString& name = wxT("SIM_PLOT_FRAME") );
~SIM_PLOT_FRAME_BASE();
void m_splitterPlotOnIdle( wxIdleEvent& )
{
m_splitterPlot->SetSashPosition( 700 );
m_splitterPlot->Disconnect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitterPlotOnIdle ), NULL, this );
}
void m_splitterConsoleOnIdle( wxIdleEvent& )
{
m_splitterConsole->SetSashPosition( 500 );
m_splitterConsole->Disconnect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitterConsoleOnIdle ), NULL, this );
}
};
#endif //__SIM_PLOT_FRAME_BASE_H__

View File

@ -0,0 +1,648 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "sim_plot_panel.h"
#include <algorithm>
#include <limits>
static wxString formatFloat( double x, int nDigits )
{
wxString rv, fmt;
if( nDigits )
{
fmt = wxT( "%.0Nf" );
fmt[3] = '0' + nDigits;
}
else
{
fmt = wxT( "%.0f" );
}
rv.Printf( fmt, x );
return rv;
}
static void getSISuffix( double x, const wxString& unit, int& power, wxString& suffix )
{
const int n_powers = 11;
const struct
{
double exponent;
char suffix;
} powers[] =
{
{ -18, 'a' },
{ -15, 'f' },
{ -12, 'p' },
{ -9, 'n' },
{ -6, 'u' },
{ -3, 'm' },
{ 0, 0 },
{ 3, 'k' },
{ 6, 'M' },
{ 9, 'G' },
{ 12, 'T' },
{ 14, 'P' }
};
power = 0;
suffix = unit;
if( x == 0.0 )
return;
for( int i = 0; i < n_powers - 1; i++ )
{
double r_cur = pow( 10, powers[i].exponent );
if( fabs( x ) >= r_cur && fabs( x ) < r_cur * 1000.0 )
{
power = powers[i].exponent;
if( powers[i].suffix )
suffix = wxString( powers[i].suffix ) + unit;
else
suffix = unit;
return;
}
}
}
static int countDecimalDigits( double x, int maxDigits )
{
int64_t k = (int)( ( x - floor( x ) ) * pow( 10.0, (double) maxDigits ) );
int n = 0;
while( k && ( ( k % 10LL ) == 0LL || ( k % 10LL ) == 9LL ) )
{
k /= 10LL;
}
n = 0;
while( k != 0LL )
{
n++;
k /= 10LL;
}
return n;
}
static void formatSILabels( mpScaleBase* scale, const wxString& aUnit, int nDigits )
{
double maxVis = scale->AbsVisibleMaxValue();
wxString suffix;
int power, digits = 0;
getSISuffix( maxVis, aUnit, power, suffix );
double sf = pow( 10.0, power );
for( auto &l : scale->TickLabels() )
{
int k = countDecimalDigits( l.pos / sf, nDigits );
digits = std::max( digits, k );
}
for( auto &l : scale->TickLabels() )
{
l.label = formatFloat ( l.pos / sf, digits ) + suffix;
l.visible = true;
}
}
class FREQUENCY_LOG_SCALE : public mpScaleXLog
{
public:
FREQUENCY_LOG_SCALE( wxString name, int flags ) :
mpScaleXLog( name, flags ) {};
void formatLabels()
{
const wxString unit = wxT( "Hz" );
wxString suffix;
int power;
for( auto &l : TickLabels() )
{
getSISuffix( l.pos, unit, power, suffix );
double sf = pow( 10.0, power );
int k = countDecimalDigits( l.pos / sf, 3 );
l.label = formatFloat( l.pos / sf, k ) + suffix;
l.visible = true;
}
}
};
class FREQUENCY_LIN_SCALE : public mpScaleX
{
public:
FREQUENCY_LIN_SCALE( wxString name, int flags ) :
mpScaleX( name, flags, false , 0 ) {};
void formatLabels()
{
formatSILabels( this, wxT( "Hz" ), 3 );
}
};
class TIME_SCALE : public mpScaleX
{
public:
TIME_SCALE( wxString name, int flags ) :
mpScaleX( name, flags, false, 0 ) {};
void formatLabels()
{
formatSILabels( this, wxT( "s" ), 3 );
}
};
class VOLTAGE_SCALE_X : public mpScaleX
{
public:
VOLTAGE_SCALE_X( wxString name, int flags ) :
mpScaleX( name, flags, false, 0 ) {};
void formatLabels()
{
formatSILabels( this, wxT( "V" ), 3 );
}
};
class GAIN_SCALE : public mpScaleY
{
public:
GAIN_SCALE( wxString name, int flags ) :
mpScaleY( name, flags, false ) {};
void formatLabels()
{
formatSILabels( this, wxT( "dB" ), 3 );
}
};
class PHASE_SCALE : public mpScaleY
{
public:
PHASE_SCALE( wxString name, int flags ) :
mpScaleY( name, flags, false ) {};
void formatLabels()
{
formatSILabels( this, wxT( "\u00B0" ), 3 ); // degree sign
}
};
class VOLTAGE_SCALE_Y : public mpScaleY
{
public:
VOLTAGE_SCALE_Y( wxString name, int flags ) :
mpScaleY( name, flags, false ) {};
void formatLabels()
{
formatSILabels( this, wxT( "V" ), 3 );
}
};
class CURRENT_SCALE : public mpScaleY
{
public:
CURRENT_SCALE( wxString name, int flags ) :
mpScaleY( name, flags, false ) {};
void formatLabels()
{
formatSILabels( this, wxT( "A" ), 3 );
}
};
void CURSOR::Plot( wxDC& aDC, mpWindow& aWindow )
{
if( !m_window )
m_window = &aWindow;
if( !m_visible )
return;
const auto& dataX = m_trace->GetDataX();
const auto& dataY = m_trace->GetDataY();
if( dataX.size() <= 1 )
return;
if( m_updateRequired )
{
m_coords.x = m_trace->s2x( aWindow.p2x( m_dim.x ) );
// Find the closest point coordinates
auto maxXIt = std::upper_bound( dataX.begin(), dataX.end(), m_coords.x );
int maxIdx = maxXIt - dataX.begin();
int minIdx = maxIdx - 1;
// Out of bounds checks
if( minIdx < 0 )
{
minIdx = 0;
maxIdx = 1;
m_coords.x = dataX[0];
}
else if( maxIdx >= (int) dataX.size() )
{
maxIdx = dataX.size() - 1;
minIdx = maxIdx - 1;
m_coords.x = dataX[maxIdx];
}
const double leftX = dataX[minIdx];
const double rightX = dataX[maxIdx];
const double leftY = dataY[minIdx];
const double rightY = dataY[maxIdx];
// Linear interpolation
m_coords.y = leftY + ( rightY - leftY ) / ( rightX - leftX ) * ( m_coords.x - leftX );
m_updateRequired = false;
// Notify the parent window about the changes
wxQueueEvent( aWindow.GetParent(), new wxCommandEvent( EVT_SIM_CURSOR_UPDATE ) );
}
else
{
m_updateRef = true;
}
if( m_updateRef )
{
UpdateReference();
m_updateRef = false;
}
// Line length in horizontal and vertical dimensions
const wxPoint cursorPos( aWindow.x2p( m_trace->x2s( m_coords.x ) ),
aWindow.y2p( m_trace->y2s( m_coords.y ) ) );
wxCoord leftPx = m_drawOutsideMargins ? 0 : aWindow.GetMarginLeft();
wxCoord rightPx = m_drawOutsideMargins ? aWindow.GetScrX() : aWindow.GetScrX() - aWindow.GetMarginRight();
wxCoord topPx = m_drawOutsideMargins ? 0 : aWindow.GetMarginTop();
wxCoord bottomPx = m_drawOutsideMargins ? aWindow.GetScrY() : aWindow.GetScrY() - aWindow.GetMarginBottom();
aDC.SetPen( wxPen( *wxWHITE, 1, m_continuous ? wxSOLID : wxLONG_DASH ) );
if( topPx < cursorPos.y && cursorPos.y < bottomPx )
aDC.DrawLine( leftPx, cursorPos.y, rightPx, cursorPos.y );
if( leftPx < cursorPos.x && cursorPos.x < rightPx )
aDC.DrawLine( cursorPos.x, topPx, cursorPos.x, bottomPx );
}
bool CURSOR::Inside( wxPoint& aPoint )
{
if( !m_window )
return false;
return ( std::abs( (double) aPoint.x - m_window->x2p( m_trace->x2s( m_coords.x ) ) ) <= DRAG_MARGIN )
|| ( std::abs( (double) aPoint.y - m_window->y2p( m_trace->y2s( m_coords.y ) ) ) <= DRAG_MARGIN );
}
void CURSOR::UpdateReference()
{
if( !m_window )
return;
m_reference.x = m_window->x2p( m_trace->x2s( m_coords.x ) );
m_reference.y = m_window->y2p( m_trace->y2s( m_coords.y ) );
}
SIM_PLOT_PANEL::SIM_PLOT_PANEL( SIM_TYPE aType, wxWindow* parent, wxWindowID id, const wxPoint& pos,
const wxSize& size, long style, const wxString& name )
: mpWindow( parent, id, pos, size, style ), m_colorIdx( 0 ),
m_axis_x( nullptr ), m_axis_y1( nullptr ), m_axis_y2( nullptr ), m_type( aType )
{
LimitView( true );
SetMargins( 50, 80, 50, 80 );
wxColour grey( 96, 96, 96 );
SetColourTheme( *wxBLACK, *wxWHITE, grey );
EnableDoubleBuffer( true );
UpdateAll();
switch( m_type )
{
case ST_AC:
m_axis_x = new FREQUENCY_LOG_SCALE( wxT( "Frequency" ), mpALIGN_BOTTOM );
m_axis_y1 = new GAIN_SCALE( wxT( "Gain" ), mpALIGN_LEFT );
m_axis_y2 = new PHASE_SCALE( wxT( "Phase" ), mpALIGN_RIGHT );
m_axis_y2->SetMasterScale( m_axis_y1 );
break;
case ST_DC:
m_axis_x = new VOLTAGE_SCALE_X( wxT( "Voltage (sweeped)" ), mpALIGN_BOTTOM );
m_axis_y1 = new VOLTAGE_SCALE_Y( wxT( "Voltage (measured)" ), mpALIGN_LEFT );
break;
case ST_NOISE:
m_axis_x = new FREQUENCY_LOG_SCALE( wxT( "Frequency" ), mpALIGN_BOTTOM );
m_axis_y1 = new mpScaleY( wxT( "noise [(V or A)^2/Hz]" ), mpALIGN_LEFT );
break;
case ST_TRANSIENT:
m_axis_x = new TIME_SCALE( wxT( "Time" ), mpALIGN_BOTTOM );
m_axis_y1 = new VOLTAGE_SCALE_Y( wxT( "Voltage" ), mpALIGN_LEFT );
m_axis_y2 = new CURRENT_SCALE( wxT( "Current" ), mpALIGN_RIGHT );
m_axis_y2->SetMasterScale( m_axis_y1 );
break;
default:
// suppress warnings
break;
}
if( m_axis_x )
{
m_axis_x->SetTicks( false );
m_axis_x->SetNameAlign ( mpALIGN_BOTTOM );
AddLayer( m_axis_x );
}
if( m_axis_y1 )
{
m_axis_y1->SetTicks( false );
m_axis_y1->SetNameAlign ( mpALIGN_LEFT );
AddLayer( m_axis_y1 );
}
if( m_axis_y2 )
{
m_axis_y2->SetTicks( false );
m_axis_y2->SetNameAlign ( mpALIGN_RIGHT );
AddLayer( m_axis_y2 );
}
m_legend = new mpInfoLegend( wxRect( 0, 40, 200, 40 ), wxTRANSPARENT_BRUSH );
AddLayer( m_legend );
m_topLevel.push_back( m_legend );
SetColourTheme( *wxBLACK, *wxWHITE, grey );
EnableDoubleBuffer( true );
UpdateAll();
}
SIM_PLOT_PANEL::~SIM_PLOT_PANEL()
{
// ~mpWindow destroys all the added layers, so there is no need to destroy m_traces contents
}
bool SIM_PLOT_PANEL::IsPlottable( SIM_TYPE aSimType )
{
switch( aSimType )
{
case ST_AC:
case ST_DC:
case ST_TRANSIENT:
return true;
default:
return false;
}
}
bool SIM_PLOT_PANEL::AddTrace( const wxString& aName, int aPoints,
const double* aX, const double* aY, SIM_PLOT_TYPE aFlags )
{
TRACE* t = NULL;
// Find previous entry, if there is one
auto prev = m_traces.find( aName );
bool addedNewEntry = ( prev == m_traces.end() );
if( addedNewEntry )
{
if( m_type == ST_TRANSIENT )
{
bool hasVoltageTraces = false;
for( auto t : m_traces )
{
if( !( t.second->GetFlags() & SPT_CURRENT ) )
{
hasVoltageTraces = true;
break;
}
}
if( !hasVoltageTraces )
m_axis_y2->SetMasterScale( nullptr );
else
m_axis_y2->SetMasterScale( m_axis_y1 );
}
// New entry
t = new TRACE( aName );
t->SetPen( wxPen( generateColor(), 2, wxSOLID ) );
m_traces[aName] = t;
// It is a trick to keep legend & coords always on the top
for( mpLayer* l : m_topLevel )
DelLayer( l );
AddLayer( (mpLayer*) t );
for( mpLayer* l : m_topLevel )
AddLayer( l );
}
else
{
t = prev->second;
}
std::vector<double> tmp( aY, aY + aPoints );
if( m_type == ST_AC )
{
if( aFlags & SPT_AC_PHASE )
{
for( int i = 0; i < aPoints; i++ )
tmp[i] = tmp[i] * 180.0 / M_PI; // convert to degrees
}
else
{
for( int i = 0; i < aPoints; i++ )
tmp[i] = 20 * log( tmp[i] ) / log( 10.0 ); // convert to dB
}
}
t->SetData( std::vector<double>( aX, aX + aPoints ), tmp );
if( aFlags & SPT_AC_PHASE || aFlags & SPT_CURRENT )
t->SetScale( m_axis_x, m_axis_y2 );
else
t->SetScale( m_axis_x, m_axis_y1 );
t->SetFlags( aFlags );
UpdateAll();
return addedNewEntry;
}
bool SIM_PLOT_PANEL::DeleteTrace( const wxString& aName )
{
auto it = m_traces.find( aName );
if( it != m_traces.end() )
{
m_traces.erase( it );
TRACE* trace = it->second;
if( CURSOR* cursor = trace->GetCursor() )
DelLayer( cursor, true );
DelLayer( trace, true, true );
ResetScales();
return true;
}
return false;
}
void SIM_PLOT_PANEL::DeleteAllTraces()
{
for( auto& t : m_traces )
{
DeleteTrace( t.first );
}
m_colorIdx = 0;
m_traces.clear();
}
bool SIM_PLOT_PANEL::HasCursorEnabled( const wxString& aName ) const
{
TRACE* t = GetTrace( aName );
return t ? t->HasCursor() : false;
}
void SIM_PLOT_PANEL::EnableCursor( const wxString& aName, bool aEnable )
{
TRACE* t = GetTrace( aName );
if( t == nullptr || t->HasCursor() == aEnable )
return;
if( aEnable )
{
CURSOR* c = new CURSOR( t );
int plotCenter = GetMarginLeft() + ( GetXScreen() - GetMarginLeft() - GetMarginRight() ) / 2;
c->SetX( plotCenter );
t->SetCursor( c );
AddLayer( c );
}
else
{
CURSOR* c = t->GetCursor();
t->SetCursor( NULL );
DelLayer( c, true );
}
// Notify the parent window about the changes
wxQueueEvent( GetParent(), new wxCommandEvent( EVT_SIM_CURSOR_UPDATE ) );
}
void SIM_PLOT_PANEL::ResetScales()
{
if( m_axis_x )
m_axis_x->ResetDataRange();
if( m_axis_y1 )
m_axis_y1->ResetDataRange();
if( m_axis_y2 )
m_axis_y2->ResetDataRange();
for( auto t : m_traces )
t.second->UpdateScales();
}
wxColour SIM_PLOT_PANEL::generateColor()
{
/// @todo have a look at:
/// http://stanford.edu/~mwaskom/software/seaborn/tutorial/color_palettes.html
/// https://github.com/Gnuplotting/gnuplot-palettes
const unsigned long colors[] = { 0x0000ff, 0x00ff00, 0xff0000, 0x00ffff, 0xff00ff, 0xffff000, 0xffffff };
//const unsigned long colors[] = { 0xe3cea6, 0xb4781f, 0x8adfb2, 0x2ca033, 0x999afb, 0x1c1ae3, 0x6fbffd, 0x007fff, 0xd6b2ca, 0x9a3d6a };
// hls
//const unsigned long colors[] = { 0x0f1689, 0x0f7289, 0x35890f, 0x0f8945, 0x89260f, 0x890f53, 0x89820f, 0x630f89 };
// pastels, good for dark background
//const unsigned long colors[] = { 0x2fd8fe, 0x628dfa, 0x53d8a6, 0xa5c266, 0xb3b3b3, 0x94c3e4, 0xca9f8d, 0xac680e };
const unsigned int colorCount = sizeof(colors) / sizeof(unsigned long);
/// @todo generate shades to avoid repeating colors
return wxColour( colors[m_colorIdx++ % colorCount] );
}
wxDEFINE_EVENT( EVT_SIM_CURSOR_UPDATE, wxCommandEvent );

View File

@ -0,0 +1,261 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __SIM_PLOT_PANEL_H
#define __SIM_PLOT_PANEL_H
#include <widgets/mathplot.h>
#include <map>
#include "sim_types.h"
class TRACE;
///> Cursor attached to a trace to follow its values:
class CURSOR : public mpInfoLayer
{
public:
CURSOR( const TRACE* aTrace )
: mpInfoLayer( wxRect( 0, 0, DRAG_MARGIN, DRAG_MARGIN ), wxTRANSPARENT_BRUSH ),
m_trace( aTrace ), m_updateRequired( true ), m_updateRef( false ),
m_coords( 0.0, 0.0 ), m_window( nullptr )
{
SetDrawOutsideMargins( false );
}
void Plot( wxDC& aDC, mpWindow& aWindow ) override;
void SetX( int aX )
{
m_reference.x = 0;
m_updateRef = true;
Move( wxPoint( aX, 0 ) );
}
void Update()
{
m_updateRequired = true;
}
bool Inside( wxPoint& aPoint ) override;
void Move( wxPoint aDelta ) override
{
Update();
mpInfoLayer::Move( aDelta );
}
void UpdateReference();
const wxRealPoint& GetCoords() const
{
return m_coords;
}
private:
const TRACE* m_trace;
bool m_updateRequired, m_updateRef;
wxRealPoint m_coords;
mpWindow* m_window;
const int DRAG_MARGIN = 10;
};
class TRACE : public mpFXYVector
{
public:
TRACE( const wxString& aName ) :
mpFXYVector( aName ), m_cursor( nullptr ), m_flags( 0 )
{
SetContinuity( true );
SetDrawOutsideMargins( false );
ShowName( false );
}
/**
* @brief Assigns new data set for the trace. aX and aY need to have the same length.
* @param aX are the X axis values.
* @param aY are the Y axis values.
*/
void SetData( const std::vector<double>& aX, const std::vector<double>& aY ) override
{
if( m_cursor )
m_cursor->Update();
mpFXYVector::SetData( aX, aY );
}
const std::vector<double>& GetDataX() const
{
return m_xs;
}
const std::vector<double>& GetDataY() const
{
return m_ys;
}
bool HasCursor() const
{
return m_cursor != nullptr;
}
void SetCursor( CURSOR* aCursor )
{
m_cursor = aCursor;
}
CURSOR* GetCursor() const
{
return m_cursor;
}
void SetFlags( int aFlags )
{
m_flags = aFlags;
}
int GetFlags() const
{
return m_flags;
}
protected:
CURSOR* m_cursor;
int m_flags;
};
class SIM_PLOT_PANEL : public mpWindow
{
public:
SIM_PLOT_PANEL( SIM_TYPE aType, wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxPanelNameStr );
~SIM_PLOT_PANEL();
SIM_TYPE GetType() const
{
return m_type;
}
static bool IsPlottable( SIM_TYPE aSimType );
wxString GetLabelX() const
{
return m_axis_x ? m_axis_x->GetName() : "";
}
wxString GetLabelY1() const
{
return m_axis_y1 ? m_axis_y1->GetName() : "";
}
wxString GetLabelY2() const
{
return m_axis_y2 ? m_axis_y2->GetName() : "";
}
bool AddTrace( const wxString& aName, int aPoints,
const double* aX, const double* aY, SIM_PLOT_TYPE aFlags );
bool DeleteTrace( const wxString& aName );
void DeleteAllTraces();
bool IsShown( const wxString& aName ) const
{
return m_traces.count( aName ) > 0;
}
const std::map<wxString, TRACE*>& GetTraces() const
{
return m_traces;
}
TRACE* GetTrace( const wxString& aName ) const
{
auto trace = m_traces.find( aName );
return trace == m_traces.end() ? NULL : trace->second;
}
void ShowGrid( bool aEnable )
{
m_axis_x->SetTicks( !aEnable );
m_axis_y1->SetTicks( !aEnable );
m_axis_y2->SetTicks( !aEnable );
UpdateAll();
}
bool IsGridShown() const
{
assert( m_axis_x->GetTicks() == m_axis_y1->GetTicks() );
return !m_axis_x->GetTicks();
}
void ShowLegend( bool aEnable )
{
m_legend->SetVisible( aEnable );
UpdateAll();
}
bool IsLegendShown() const
{
return m_legend->IsVisible();
}
///> Returns true if the trace has cursor shown.
bool HasCursorEnabled( const wxString& aName ) const;
///> Toggles cursor for a particular trace.
void EnableCursor( const wxString& aName, bool aEnable );
///> Resets scale ranges to fit the current traces
void ResetScales();
private:
///> Returns a new color from the palette
wxColour generateColor();
// Color index to get a new color from the palette
unsigned int m_colorIdx;
// Traces to be plotted
std::map<wxString, TRACE*> m_traces;
mpScaleXBase* m_axis_x;
mpScaleY* m_axis_y1;
mpScaleY* m_axis_y2;
mpInfoLegend* m_legend;
std::vector<mpLayer*> m_topLevel;
const SIM_TYPE m_type;
};
wxDECLARE_EVENT( EVT_SIM_CURSOR_UPDATE, wxCommandEvent );
#endif

49
eeschema/sim/sim_types.h Normal file
View File

@ -0,0 +1,49 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef SIM_TYPES_H
#define SIM_TYPES_H
///> Possible simulation types
enum SIM_TYPE {
ST_UNKNOWN, ST_AC, ST_DC, ST_DISTORTION, ST_NOISE, ST_OP,
ST_POLE_ZERO, ST_SENSITIVITY, ST_TRANS_FUNC, ST_TRANSIENT
};
///> Possible plot types
enum SIM_PLOT_TYPE {
// Y axis
SPT_VOLTAGE = 0x01,
SPT_CURRENT = 0x02,
SPT_AC_PHASE = 0x04,
SPT_AC_MAG = 0x08,
// X axis
SPT_TIME = 0x10,
SPT_LIN_FREQUENCY = 0x20,
SPT_LOG_FREQUENCY = 0x20,
SPT_SWEEP = 0x40
};
#endif /* SIM_TYPES_H */

142
eeschema/sim/simulate.cpp Normal file
View File

@ -0,0 +1,142 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <kiway.h>
#include <schframe.h>
#include "sim_plot_frame.h"
void SCH_EDIT_FRAME::OnSimulate( wxCommandEvent& event )
{
SIM_PLOT_FRAME* simFrame = (SIM_PLOT_FRAME*) Kiway().Player( FRAME_SIMULATOR, true );
simFrame->Show( true );
// On Windows, Raise() does not bring the window on screen, when iconized
if( simFrame->IsIconized() )
simFrame->Iconize( false );
simFrame->Raise();
}
// I apologize for the following lines, but this is more or less what wxWidgets
// authors suggest (http://docs.wxwidgets.org/trunk/classwx_cursor.html)
static const unsigned char cursor_probe[] = {
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70,
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x04,
0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x84, 0x00,
0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x80, 0x10, 0x00,
0x00, 0x40, 0x08, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x10, 0x02, 0x00,
0x00, 0x08, 0x01, 0x00, 0x80, 0x85, 0x00, 0x00, 0x40, 0x42, 0x00, 0x00,
0x20, 0x21, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00,
0x20, 0x16, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00,
0x44, 0x07, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
static const unsigned char cursor_probe_mask[] {
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70,
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x07,
0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xfc, 0x00,
0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x1f, 0x00,
0x00, 0xc0, 0x0f, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00,
0x00, 0xf8, 0x01, 0x00, 0x80, 0xfd, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00,
0xe0, 0x3f, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00,
0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00,
0x7c, 0x07, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
static const unsigned char cursor_tune[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x0f,
0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f,
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x01,
0x00, 0x80, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00,
0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00,
0x00, 0xfc, 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
0x00, 0xea, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00,
0x40, 0x01, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
0x2c, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
static const unsigned char cursor_tune_mask[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x0f,
0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f,
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x01,
0x00, 0x80, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00,
0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00,
0x00, 0xfc, 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
0x00, 0xee, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00,
0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
#if defined(__WXMSW__) or defined(__WXMAC__)
struct SIM_CURSORS_INIT
{
public:
static wxImage& GetProbeImage()
{
static wxImage* probe_image = NULL;
if( probe_image == NULL )
{
wxBitmap probe_bitmap( (const char*) cursor_probe, 32, 32 );
wxBitmap probe_mask_bitmap( (const char*) cursor_probe_mask, 32, 32 );
probe_bitmap.SetMask( new wxMask( probe_mask_bitmap ) );
probe_image = new wxImage( probe_bitmap.ConvertToImage() );
probe_image->SetMaskColour( 255, 255, 255 );
probe_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, 0 );
probe_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, 31 );
}
return *probe_image;
}
static wxImage& GetTuneImage()
{
static wxImage* tune_image = NULL;
if( tune_image == NULL )
{
wxBitmap tune_bitmap( (const char*) cursor_tune, 32, 32 );
wxBitmap tune_mask_bitmap( (const char*) cursor_tune_mask, 32, 32 );
tune_bitmap.SetMask( new wxMask( tune_mask_bitmap ) );
tune_image = new wxImage( tune_bitmap.ConvertToImage() );
tune_image->SetMaskColour( 255, 255, 255 );
tune_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, 0 );
tune_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, 31 );
}
return *tune_image;
}
};
const wxCursor SCH_EDIT_FRAME::CURSOR_PROBE( SIM_CURSORS_INIT::GetProbeImage() );
const wxCursor SCH_EDIT_FRAME::CURSOR_TUNE( SIM_CURSORS_INIT::GetTuneImage() );
#elif defined(__WXGTK__) or defined(__WXMOTIF__)
const wxCursor SCH_EDIT_FRAME::CURSOR_PROBE( (const char*) cursor_probe, 32, 32, 0, 31, (const char*) cursor_probe_mask );
const wxCursor SCH_EDIT_FRAME::CURSOR_TUNE( (const char*) cursor_tune, 32, 32, 1, 30, (const char*) cursor_tune_mask );
#endif

View File

@ -0,0 +1,51 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef SPICE_REPORTER_H
#define SPICE_REPORTER_H
#include <reporter.h>
class SPICE_SIMULATOR;
enum SIM_STATE
{
SIM_IDLE,
SIM_RUNNING
};
/**
* @brief Interface to receive simulation updates from SPICE_SIMULATOR class.
*/
class SPICE_REPORTER : public REPORTER
{
public:
virtual ~SPICE_REPORTER()
{
}
virtual void OnSimStateChange( SPICE_SIMULATOR* aObject, SIM_STATE aNewState ) = 0;
};
#endif /* SPICE_REPORTER_H */

View File

@ -0,0 +1,42 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "ngspice.h"
#include <confirm.h>
SPICE_SIMULATOR* SPICE_SIMULATOR::CreateInstance( const std::string& )
{
try
{
return new NGSPICE;
}
catch( std::exception& e )
{
DisplayError( NULL, e.what() );
}
return NULL;
}

View File

@ -0,0 +1,132 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef SPICE_SIMULATOR_H
#define SPICE_SIMULATOR_H
#include "sim_types.h"
#include <string>
#include <vector>
#include <complex>
class SPICE_REPORTER;
typedef std::complex<double> COMPLEX;
class SPICE_SIMULATOR
{
public:
SPICE_SIMULATOR() : m_reporter( NULL ) {}
virtual ~SPICE_SIMULATOR() {}
///> Creates a simulator instance of particular type (currently only ngspice is handled)
static SPICE_SIMULATOR* CreateInstance( const std::string& aName );
///> Intializes the simulator
virtual void Init() = 0;
/*
* @brief Loads a netlist for the simulation.
* @return True in case of success, false otherwise.
*/
virtual bool LoadNetlist( const std::string& aNetlist ) = 0;
/**
* @brief Executes the simulation with currently loaded netlist.
* @return True in case of success, false otherwise.
*/
virtual bool Run() = 0;
/**
* @brief Halts the simulation.
* @return True in case of success, false otherwise.
*/
virtual bool Stop() = 0;
/**
* @brief Checks if simulation is running at the moment.
* @return True if simulation is currently executed.
*/
virtual bool IsRunning() = 0;
/**
* @brief Executes a Spice command as if it was typed into console.
* @param aCmd is the command to be issued.
*/
virtual bool Command( const std::string& aCmd ) = 0;
///> Returns X axis name for a given simulation type
virtual std::string GetXAxis( SIM_TYPE aType ) const = 0;
///> Sets a SPICE_REPORTER object to receive the simulation log.
virtual void SetReporter( SPICE_REPORTER* aReporter )
{
m_reporter = aReporter;
}
/**
* @brief Returns a requested vector with complex values. If the vector is real, then
* the imaginary part is set to 0 in all values.
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
* @return Requested vector. It might be empty if there is no vector with requested name.
*/
virtual std::vector<COMPLEX> GetPlot( const std::string& aName, int aMaxLen = -1 ) = 0;
/**
* @brief Returns a requested vector with real values. If the vector is complex, then
* the real part is returned.
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
* @return Requested vector. It might be empty if there is no vector with requested name.
*/
virtual std::vector<double> GetRealPlot( const std::string& aName, int aMaxLen = -1 ) = 0;
/**
* @brief Returns a requested vector with imaginary values. If the vector is complex, then
* the imaginary part is returned. If the vector is reql, then only zeroes are returned.
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
* @return Requested vector. It might be empty if there is no vector with requested name.
*/
virtual std::vector<double> GetImagPlot( const std::string& aName, int aMaxLen = -1 ) = 0;
/**
* @brief Returns a requested vector with magnitude values.
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
* @return Requested vector. It might be empty if there is no vector with requested name.
*/
virtual std::vector<double> GetMagPlot( const std::string& aName, int aMaxLen = -1 ) = 0;
/**
* @brief Returns a requested vector with phase values.
* @param aName is the vector named in Spice convention (e.g. V(3), I(R1)).
* @return Requested vector. It might be empty if there is no vector with requested name.
*/
virtual std::vector<double> GetPhasePlot( const std::string& aName, int aMaxLen = -1 ) = 0;
protected:
///> Reporter object to receive simulation log
SPICE_REPORTER* m_reporter;
};
#endif /* SPICE_SIMULATOR_H */

View File

@ -0,0 +1,265 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "spice_value.h"
#include <stdexcept>
#include <cmath>
#include <wx/textentry.h>
#include <confirm.h>
SPICE_VALUE::SPICE_VALUE( const wxString& aString )
{
char buf[8] = { 0, };
if( aString.IsEmpty() )
throw std::invalid_argument( "Spice value cannot be empty" );
if( sscanf( (const char*) aString.c_str(), "%lf%7s", &m_base, buf ) == 0 )
throw std::invalid_argument( "Invalid Spice value string" );
if( *buf == 0 )
{
m_prefix = PFX_NONE;
m_spiceStr = false;
Normalize();
return;
}
m_spiceStr = true;
for( char* bufPtr = buf; *bufPtr; ++bufPtr )
*bufPtr = tolower( *bufPtr );
if( !strcmp( buf, "meg" ) )
{
m_prefix = PFX_MEGA;
}
else
{
switch( buf[0] )
{
case 'f': m_prefix = PFX_FEMTO; break;
case 'p': m_prefix = PFX_PICO; break;
case 'n': m_prefix = PFX_NANO; break;
case 'u': m_prefix = PFX_MICRO; break;
case 'm': m_prefix = PFX_MILI; break;
case 'k': m_prefix = PFX_KILO; break;
case 'g': m_prefix = PFX_GIGA; break;
case 't': m_prefix = PFX_TERA; break;
default:
throw std::invalid_argument( "Invalid unit prefix" );
}
}
Normalize();
}
void SPICE_VALUE::Normalize()
{
while( std::fabs( m_base ) >= 1000.0 )
{
m_base *= 0.001;
m_prefix = (UNIT_PREFIX)( m_prefix + 3 );
}
while( m_base != 0.0 && std::fabs( m_base ) < 1.000 )
{
m_base *= 1000.0;
m_prefix = (UNIT_PREFIX)( m_prefix - 3 );
}
}
double SPICE_VALUE::ToDouble() const
{
double res = m_base;
if( m_prefix != PFX_NONE )
res *= std::pow( 10, (int) m_prefix );
return res;
}
wxString SPICE_VALUE::ToString() const
{
wxString res( wxString::Format( "%.3f", ToDouble() ) );
stripZeros( res );
return res;
}
wxString SPICE_VALUE::ToSpiceString() const
{
wxString res = wxString::FromCDouble( m_base );
stripZeros( res );
switch( m_prefix )
{
case PFX_FEMTO: res += "f"; break;
case PFX_PICO: res += "p"; break;
case PFX_NANO: res += "n"; break;
case PFX_MICRO: res += "u"; break;
case PFX_MILI: res += "m"; break;
case PFX_NONE: break;
case PFX_KILO: res += "k"; break;
case PFX_MEGA: res += "Meg"; break;
case PFX_GIGA: res += "G"; break;
case PFX_TERA: res += "T"; break;
}
return res;
}
SPICE_VALUE SPICE_VALUE::operator+( const SPICE_VALUE& aOther ) const
{
int prefixDiff = m_prefix - aOther.m_prefix;
SPICE_VALUE res;
res.m_spiceStr = m_spiceStr || aOther.m_spiceStr;
// Convert both numbers to a common prefix
if( prefixDiff > 0 )
{
// Switch to the aOther prefix
res.m_base = ( m_base * std::pow( 10, prefixDiff ) ) + aOther.m_base;
res.m_prefix = aOther.m_prefix;
}
else if( prefixDiff < 0 )
{
// Use the current prefix
res.m_base = m_base + ( aOther.m_base * std::pow( 10, -prefixDiff ) );
res.m_prefix = m_prefix;
}
else
{
res.m_base = m_base + aOther.m_base;
res.m_prefix = m_prefix; // == aOther.m_prefix
}
res.Normalize();
return res;
}
SPICE_VALUE SPICE_VALUE::operator-( const SPICE_VALUE& aOther ) const
{
int prefixDiff = m_prefix - aOther.m_prefix;
SPICE_VALUE res;
res.m_spiceStr = m_spiceStr || aOther.m_spiceStr;
// Convert both numbers to a common prefix
if( prefixDiff > 0 )
{
// Switch to the aOther prefix
res.m_base = m_base * std::pow( 10, prefixDiff ) - aOther.m_base;
res.m_prefix = aOther.m_prefix;
}
else if( prefixDiff < 0 )
{
// Use the current prefix
res.m_base = m_base - aOther.m_base * std::pow( 10, -prefixDiff );
res.m_prefix = m_prefix;
}
else
{
res.m_base = m_base - aOther.m_base;
res.m_prefix = m_prefix; // == aOther.m_prefix
}
res.Normalize();
return res;
}
SPICE_VALUE SPICE_VALUE::operator*( const SPICE_VALUE& aOther ) const
{
SPICE_VALUE res( m_base * aOther.m_base, (UNIT_PREFIX)( m_prefix + aOther.m_prefix ) );
res.m_spiceStr = m_spiceStr || aOther.m_spiceStr;
res.Normalize();
return res;
}
SPICE_VALUE SPICE_VALUE::operator/( const SPICE_VALUE& aOther ) const
{
SPICE_VALUE res( m_base / aOther.m_base, (UNIT_PREFIX)( m_prefix - aOther.m_prefix ) );
res.m_spiceStr = m_spiceStr || aOther.m_spiceStr;
res.Normalize();
return res;
}
void SPICE_VALUE::stripZeros( wxString& aString )
{
if ( aString.Find( ',' ) >= 0 || aString.Find( '.' ) >= 0 )
{
while( aString.EndsWith( '0' ) )
aString.RemoveLast();
if( aString.EndsWith( '.' ) || aString.EndsWith( ',' ) )
aString.RemoveLast();
}
}
bool SPICE_VALIDATOR::Validate( wxWindow* aParent )
{
wxTextEntry* const text = GetTextEntry();
if( !text )
return false;
if( text->IsEmpty() )
{
if( m_emptyAllowed )
return true;
DisplayError( aParent, wxString::Format( wxT( "Fill required fields" ) ) );
return false;
}
try
{
// If SPICE_VALUE can be constructed, then it is a valid Spice value
SPICE_VALUE val( text->GetValue() );
}
catch( ... )
{
DisplayError( aParent,
wxString::Format( wxT( "'%s' is not a valid Spice value" ), text->GetValue() ) );
return false;
}
return true;
}

166
eeschema/sim/spice_value.h Normal file
View File

@ -0,0 +1,166 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef SPICE_VALUE_H
#define SPICE_VALUE_H
#include <wx/string.h>
#include <wx/valtext.h>
///> Helper class to handle Spice way of expressing values (e.g. 10.5 Meg)
class SPICE_VALUE
{
public:
enum UNIT_PREFIX
{
PFX_FEMTO = -15,
PFX_PICO = -12,
PFX_NANO = -9,
PFX_MICRO = -6,
PFX_MILI = -3,
PFX_NONE = 0,
PFX_KILO = 3,
PFX_MEGA = 6,
PFX_GIGA = 9,
PFX_TERA = 12
};
SPICE_VALUE()
: m_base( 0 ), m_prefix( PFX_NONE ), m_spiceStr( false )
{
}
///> Parses the string to create a Spice value (e.g. 100n)
SPICE_VALUE( const wxString& aString );
SPICE_VALUE( int aInt, UNIT_PREFIX aPrefix = PFX_NONE )
: m_base( aInt ), m_prefix( aPrefix ), m_spiceStr( false )
{
Normalize();
}
SPICE_VALUE( double aDouble, UNIT_PREFIX aPrefix = PFX_NONE )
: m_base( aDouble ), m_prefix( aPrefix ), m_spiceStr( false )
{
Normalize();
}
/**
* @brief Normalizes the value. The unit prefix is picked so the base is (0.001 <= base < 1000).
*/
void Normalize();
double ToDouble() const;
/**
* @brief Returns string value as when converting double to string (e.g. 123456.789).
*/
wxString ToString() const;
/**
* @brief Returns string value in Spice format (e.g. 123.3456789k).
*/
wxString ToSpiceString() const;
/**
* @brief Returns either a normal string or Spice format string, depending on the original
* value format.
*/
wxString ToOrigString() const
{
return m_spiceStr ? ToSpiceString() : ToString();
}
/**
* Returns true if the object was initiated with a Spice formatted string value.
*/
bool IsSpiceString() const
{
return m_spiceStr;
}
bool operator==( const SPICE_VALUE& aOther ) const
{
return ( m_prefix == aOther.m_prefix && m_base == aOther.m_base );
}
bool operator>( const SPICE_VALUE& aOther ) const
{
return this->ToDouble() > aOther.ToDouble();
}
bool operator<( const SPICE_VALUE& aOther ) const
{
return this->ToDouble() < aOther.ToDouble();
}
bool operator>=( const SPICE_VALUE& aOther ) const
{
return ( *this == aOther || *this > aOther );
}
bool operator<=( const SPICE_VALUE& aOther ) const
{
return ( *this == aOther || *this < aOther );
}
SPICE_VALUE operator-( const SPICE_VALUE& aOther ) const;
SPICE_VALUE operator+( const SPICE_VALUE& aOther ) const;
SPICE_VALUE operator*( const SPICE_VALUE& aOther ) const;
SPICE_VALUE operator/( const SPICE_VALUE& aOther ) const;
private:
double m_base;
UNIT_PREFIX m_prefix;
///> Was the value defined using the Spice notation?
bool m_spiceStr;
///> Removes redundant zeros from the end of a string.
static void stripZeros( wxString& aString );
};
///> Helper class to recognize Spice formatted values
class SPICE_VALIDATOR : public wxTextValidator
{
public:
SPICE_VALIDATOR( bool aEmptyAllowed = false )
: m_emptyAllowed( aEmptyAllowed )
{
}
wxObject* Clone() const override
{
return new SPICE_VALIDATOR( *this );
}
bool Validate( wxWindow* aParent ) override;
private:
///> Is it valid to get an empty value?
bool m_emptyAllowed;
};
#endif /* SPICE_VALUE_H */

View File

@ -0,0 +1,209 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "tuner_slider.h"
#include <sim/sim_plot_frame.h>
#include <sch_component.h>
#include <template_fieldnames.h>
#include <netlist_exporters/netlist_exporter_pspice.h>
TUNER_SLIDER::TUNER_SLIDER( SIM_PLOT_FRAME* aFrame, wxWindow* aParent, SCH_COMPONENT* aComponent )
: TUNER_SLIDER_BASE( aParent ), m_component( aComponent ),
m_min( 0.0 ), m_max( 0.0 ), m_value( 0.0 ), m_frame ( aFrame )
{
const wxString compName = aComponent->GetField( REFERENCE )->GetText();
m_name->SetLabel( compName );
m_value = SPICE_VALUE( aComponent->GetField( VALUE )->GetText() );
m_changed = false;
// Generate Spice component name
char prim = NETLIST_EXPORTER_PSPICE::GetSpiceField( SF_PRIMITIVE, aComponent, 0 )[0];
m_spiceName = wxString( prim + compName ).Lower();
// Call Set*() methods to update fields and slider
m_max = SPICE_VALUE( 2.0 ) * m_value;
m_min = SPICE_VALUE( 0.5 ) * m_value;
m_minText->SetValue( m_min.ToOrigString() );
m_maxText->SetValue( m_max.ToOrigString() );
updateValueText();
updateSlider();
m_simTimer.SetOwner( this );
Connect( wxEVT_TIMER, wxTimerEventHandler( TUNER_SLIDER::onSimTimer ), NULL, this );
}
bool TUNER_SLIDER::SetValue( const SPICE_VALUE& aVal )
{
// Get the value into the current range boundaries
if( aVal > m_max )
m_value = m_max;
else if( aVal < m_min )
m_value = m_min;
else
m_value = aVal;
updateValueText();
updateSlider();
updateComponentValue();
return true;
}
bool TUNER_SLIDER::SetMin( const SPICE_VALUE& aVal )
{
if( aVal >= m_max )
return false;
m_min = aVal;
if( m_value < aVal ) // Limit the curent value
SetValue( aVal );
m_minText->SetValue( aVal.ToOrigString() );
updateSlider();
return true;
}
bool TUNER_SLIDER::SetMax( const SPICE_VALUE& aVal )
{
if( aVal <= m_min )
return false;
m_max = aVal;
if( m_value > aVal ) // Limit the current value
SetValue( aVal );
m_maxText->SetValue( aVal.ToOrigString() );
updateSlider();
return true;
}
void TUNER_SLIDER::updateComponentValue()
{
// Start simulation in 100 ms, if the value does not change meanwhile
m_simTimer.StartOnce( 100 );
}
void TUNER_SLIDER::updateSlider()
{
assert( m_max >= m_value && m_value >= m_min );
m_slider->SetValue( ( ( m_value - m_min ) / ( m_max - m_min ) ).ToDouble() * 100.0 );
}
void TUNER_SLIDER::updateValueText()
{
bool spiceString = m_min.IsSpiceString() || m_max.IsSpiceString();
m_valueText->SetValue( spiceString ? m_value.ToSpiceString() : m_value.ToString() );
}
void TUNER_SLIDER::onClose( wxCommandEvent& event )
{
m_frame->RemoveTuner( this );
}
void TUNER_SLIDER::onSave( wxCommandEvent& event )
{
/// @todo it will crash when component is removed; completely remove m_component
m_component->GetField( VALUE )->SetText( m_value.ToOrigString() );
}
void TUNER_SLIDER::onSliderChanged( wxScrollEvent& event )
{
m_value = m_min + ( m_max - m_min ) * SPICE_VALUE( m_slider->GetValue() / 100.0 );
updateValueText();
updateComponentValue();
m_changed = true;
}
void TUNER_SLIDER::onMaxTextEnter( wxCommandEvent& event )
{
try
{
SPICE_VALUE newMax( m_maxText->GetValue() );
SetMax( newMax );
}
catch( std::exception& e )
{
// Restore the previous value
m_maxText->SetValue( m_max.ToOrigString() );
}
}
void TUNER_SLIDER::onValueTextEnter( wxCommandEvent& event )
{
try
{
SPICE_VALUE newCur( m_valueText->GetValue() );
SetValue( newCur );
m_changed = true;
}
catch( std::exception& e )
{
// Restore the previous value
m_valueText->SetValue( m_value.ToOrigString() );
}
}
void TUNER_SLIDER::onMinTextEnter( wxCommandEvent& event )
{
try
{
SPICE_VALUE newMin( m_minText->GetValue() );
SetMin( newMin );
}
catch( std::exception& e )
{
// Restore the previous value
m_minText->SetValue( m_min.ToOrigString() );
}
}
void TUNER_SLIDER::onSimTimer( wxTimerEvent& event )
{
if(m_changed)
{
wxQueueEvent( m_frame, new wxCommandEvent( EVT_SIM_UPDATE ) );
m_changed = false;
}
}

View File

@ -0,0 +1,102 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* https://www.gnu.org/licenses/gpl-3.0.html
* or you may search the http://www.gnu.org website for the version 3 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef TUNER_SLIDER_H
#define TUNER_SLIDER_H
#include "tuner_slider_base.h"
#include <sim/spice_value.h>
#include <wx/timer.h>
class SIM_PLOT_FRAME;
class SCH_COMPONENT;
/**
* @brief Custom widget to handle quick component values modification and simulation on the fly.
*/
class TUNER_SLIDER : public TUNER_SLIDER_BASE
{
public:
TUNER_SLIDER( SIM_PLOT_FRAME *aFrame, wxWindow* aParent, SCH_COMPONENT* aComponent );
wxString GetComponentName() const
{
return m_name->GetLabel();
}
const wxString& GetSpiceName() const
{
return m_spiceName;
}
const SPICE_VALUE& GetValue() const
{
return m_value;
}
const SPICE_VALUE& GetMin() const
{
return m_min;
}
const SPICE_VALUE& GetMax() const
{
return m_max;
}
bool SetValue( const SPICE_VALUE& aVal );
bool SetMin( const SPICE_VALUE& aVal );
bool SetMax( const SPICE_VALUE& aVal );
private:
void updateComponentValue();
void updateSlider();
void updateValueText();
void onClose( wxCommandEvent& event ) override;
void onSave( wxCommandEvent& event ) override;
void onSliderChanged( wxScrollEvent& event ) override;
void onMaxTextEnter( wxCommandEvent& event ) override;
void onValueTextEnter( wxCommandEvent& event ) override;
void onMinTextEnter( wxCommandEvent& event ) override;
void onSimTimer( wxTimerEvent& event );
wxString m_spiceName;
///> Timer that restarts the simulation after the slider value has changed
wxTimer m_simTimer;
SCH_COMPONENT* m_component;
SPICE_VALUE m_min, m_max, m_value;
bool m_changed;
SIM_PLOT_FRAME *m_frame;
};
#endif /* TUNER_SLIDER_H */

View File

@ -0,0 +1,108 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "tuner_slider_base.h"
///////////////////////////////////////////////////////////////////////////
TUNER_SLIDER_BASE::TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxHORIZONTAL );
m_name = new wxStaticText( this, wxID_ANY, _("Name"), wxDefaultPosition, wxDefaultSize, 0 );
m_name->Wrap( -1 );
bSizer2->Add( m_name, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_closeBtn = new wxButton( this, wxID_ANY, _(" X "), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
bSizer2->Add( m_closeBtn, 0, wxALL, 5 );
bSizer1->Add( bSizer2, 0, wxALL|wxEXPAND, 5 );
wxBoxSizer* bSizer3;
bSizer3 = new wxBoxSizer( wxHORIZONTAL );
wxBoxSizer* bSizer4;
bSizer4 = new wxBoxSizer( wxVERTICAL );
m_slider = new wxSlider( this, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_INVERSE|wxSL_LEFT|wxSL_VERTICAL );
bSizer4->Add( m_slider, 1, 0, 5 );
bSizer3->Add( bSizer4, 0, wxEXPAND, 5 );
wxGridSizer* gSizer1;
gSizer1 = new wxGridSizer( 0, 1, 0, 0 );
m_maxText = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
m_maxText->SetMinSize( wxSize( 70,-1 ) );
gSizer1->Add( m_maxText, 0, wxALIGN_TOP|wxALL, 5 );
m_valueText = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
m_valueText->SetMinSize( wxSize( 70,-1 ) );
gSizer1->Add( m_valueText, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
m_minText = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
m_minText->SetMinSize( wxSize( 70,-1 ) );
gSizer1->Add( m_minText, 0, wxALIGN_BOTTOM|wxALL, 5 );
bSizer3->Add( gSizer1, 1, wxEXPAND, 5 );
bSizer1->Add( bSizer3, 1, wxEXPAND, 5 );
m_saveBtn = new wxButton( this, wxID_ANY, _("Save"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer1->Add( m_saveBtn, 0, wxALL, 5 );
this->SetSizer( bSizer1 );
this->Layout();
// Connect Events
m_closeBtn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onClose ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_TOP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_BOTTOM, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_LINEUP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_LINEDOWN, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_PAGEUP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_PAGEDOWN, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Connect( wxEVT_SCROLL_CHANGED, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_maxText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMaxTextEnter ), NULL, this );
m_valueText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onValueTextEnter ), NULL, this );
m_minText->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMinTextEnter ), NULL, this );
m_saveBtn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onSave ), NULL, this );
}
TUNER_SLIDER_BASE::~TUNER_SLIDER_BASE()
{
// Disconnect Events
m_closeBtn->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onClose ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_TOP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_BOTTOM, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_LINEUP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_LINEDOWN, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_PAGEUP, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_PAGEDOWN, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_slider->Disconnect( wxEVT_SCROLL_CHANGED, wxScrollEventHandler( TUNER_SLIDER_BASE::onSliderChanged ), NULL, this );
m_maxText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMaxTextEnter ), NULL, this );
m_valueText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onValueTextEnter ), NULL, this );
m_minText->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onMinTextEnter ), NULL, this );
m_saveBtn->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onSave ), NULL, this );
}

View File

@ -0,0 +1,776 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="13" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">tuner_slider_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">1</property>
<property name="name">TUNER_SLIDER_BASE</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Panel" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">TUNER_SLIDER_BASE</property>
<property name="pos"></property>
<property name="size">97,283</property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer1</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizer2</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
<property name="proportion">1</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Name</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_name</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label"> X </property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_closeBtn</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxBU_EXACTFIT</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">onClose</event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizer3</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizer4</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag"></property>
<property name="proportion">1</property>
<object class="wxSlider" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maxValue">100</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="minValue">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_slider</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxSL_AUTOTICKS|wxSL_INVERSE|wxSL_LEFT|wxSL_VERTICAL</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">50</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCommandScroll"></event>
<event name="OnCommandScrollBottom"></event>
<event name="OnCommandScrollChanged"></event>
<event name="OnCommandScrollLineDown"></event>
<event name="OnCommandScrollLineUp"></event>
<event name="OnCommandScrollPageDown"></event>
<event name="OnCommandScrollPageUp"></event>
<event name="OnCommandScrollThumbRelease"></event>
<event name="OnCommandScrollThumbTrack"></event>
<event name="OnCommandScrollTop"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnScroll">onSliderChanged</event>
<event name="OnScrollBottom"></event>
<event name="OnScrollChanged"></event>
<event name="OnScrollLineDown"></event>
<event name="OnScrollLineUp"></event>
<event name="OnScrollPageDown"></event>
<event name="OnScrollPageUp"></event>
<event name="OnScrollThumbRelease"></event>
<event name="OnScrollThumbTrack"></event>
<event name="OnScrollTop"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxGridSizer" expanded="0">
<property name="cols">1</property>
<property name="hgap">0</property>
<property name="minimum_size"></property>
<property name="name">gSizer1</property>
<property name="permission">none</property>
<property name="rows">0</property>
<property name="vgap">0</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_TOP|wxALL</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">70,-1</property>
<property name="moveable">1</property>
<property name="name">m_maxText</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxTE_PROCESS_ENTER</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter">onMaxTextEnter</event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">70,-1</property>
<property name="moveable">1</property>
<property name="name">m_valueText</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxTE_PROCESS_ENTER</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter">onValueTextEnter</event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_BOTTOM|wxALL</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">70,-1</property>
<property name="moveable">1</property>
<property name="name">m_minText</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxTE_PROCESS_ENTER</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter">onMinTextEnter</event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Save</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_saveBtn</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick">onSave</event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -0,0 +1,61 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 24 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __TUNER_SLIDER_BASE_H__
#define __TUNER_SLIDER_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/button.h>
#include <wx/sizer.h>
#include <wx/slider.h>
#include <wx/textctrl.h>
#include <wx/panel.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class TUNER_SLIDER_BASE
///////////////////////////////////////////////////////////////////////////////
class TUNER_SLIDER_BASE : public wxPanel
{
private:
protected:
wxStaticText* m_name;
wxButton* m_closeBtn;
wxSlider* m_slider;
wxTextCtrl* m_maxText;
wxTextCtrl* m_valueText;
wxTextCtrl* m_minText;
wxButton* m_saveBtn;
// Virtual event handlers, overide them in your derived class
virtual void onClose( wxCommandEvent& event ) { event.Skip(); }
virtual void onSliderChanged( wxScrollEvent& event ) { event.Skip(); }
virtual void onMaxTextEnter( wxCommandEvent& event ) { event.Skip(); }
virtual void onValueTextEnter( wxCommandEvent& event ) { event.Skip(); }
virtual void onMinTextEnter( wxCommandEvent& event ) { event.Skip(); }
virtual void onSave( wxCommandEvent& event ) { event.Skip(); }
public:
TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 97,283 ), long style = wxTAB_TRAVERSAL );
~TUNER_SLIDER_BASE();
};
#endif //__TUNER_SLIDER_BASE_H__

View File

@ -570,5 +570,11 @@ EXTERN_BITMAP( zoom_xpm )
EXTERN_BITMAP( tune_diff_pair_length_legend_xpm )
EXTERN_BITMAP( tune_diff_pair_skew_legend_xpm )
EXTERN_BITMAP( tune_single_track_length_legend_xpm )
EXTERN_BITMAP( sim_run_xpm )
EXTERN_BITMAP( sim_stop_xpm )
EXTERN_BITMAP( sim_tune_xpm )
EXTERN_BITMAP( sim_probe_xpm )
EXTERN_BITMAP( sim_add_signal_xpm )
EXTERN_BITMAP( sim_settings_xpm )
#endif // BITMAPS_H_

Some files were not shown because too many files have changed in this diff Show More