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

Subversion Repositories openmsp430

[/] [openmsp430/] [trunk/] [tools/] [bin/] [openmsp430-gdbproxy.tcl] - Blame information for rev 186

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 olivier.gi
#!/usr/bin/tclsh
2
#------------------------------------------------------------------------------
3
# Copyright (C) 2001 Authors
4
#
5
# This source file may be used and distributed without restriction provided
6
# that this copyright statement is not removed from the file and that any
7
# derivative work contains the original copyright notice and the associated
8
# disclaimer.
9
#
10
# This source file is free software; you can redistribute it and/or modify
11
# it under the terms of the GNU Lesser General Public License as published
12
# by the Free Software Foundation; either version 2.1 of the License, or
13
# (at your option) any later version.
14
#
15
# This source is distributed in the hope that it will be useful, but WITHOUT
16
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18
# License for more details.
19
#
20
# You should have received a copy of the GNU Lesser General Public License
21
# along with this source; if not, write to the Free Software Foundation,
22
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
23
#
24
#------------------------------------------------------------------------------
25
# 
26
# File Name: openmsp430-gdbproxy.tcl
27
# 
28 14 olivier.gi
# Author(s):
29
#             - Olivier Girard,    olgirard@gmail.com
30
#
31 2 olivier.gi
#------------------------------------------------------------------------------
32 14 olivier.gi
# $Rev: 172 $
33
# $LastChangedBy: olivier.girard $
34
# $LastChangedDate: 2012-12-28 00:06:56 +0100 (Fri, 28 Dec 2012) $
35
#------------------------------------------------------------------------------
36 2 olivier.gi
 
37
###############################################################################
38
#                                                                             #
39
#                            SOURCE LIBRARIES                                 #
40
#                                                                             #
41
###############################################################################
42
 
43
# Get library path
44
set current_file [info script]
45
if {[file type $current_file]=="link"} {
46
    set current_file [file readlink $current_file]
47
}
48
set lib_path [file dirname $current_file]/../lib/tcl-lib
49
 
50
# Source library
51
source $lib_path/dbg_functions.tcl
52 158 olivier.gi
source $lib_path/dbg_utils.tcl
53 2 olivier.gi
 
54
# Source remaining files
55
source [file dirname $current_file]/../openmsp430-gdbproxy/server.tcl
56
source [file dirname $current_file]/../openmsp430-gdbproxy/commands.tcl
57
 
58
 
59
###############################################################################
60
#                                                                             #
61 158 olivier.gi
#                            GLOBAL VARIABLES                                 #
62
#                                                                             #
63
###############################################################################
64
 
65
global omsp_conf
66
global omsp_info
67
 
68
global omsp_nr
69
 
70 172 olivier.gi
global mem_mapping
71
 
72 158 olivier.gi
global gui_dbg_if
73
global gui_adapter
74
global clients
75
global server
76
global verbose
77
global shell
78 172 olivier.gi
global breakSelect
79 158 olivier.gi
 
80
# Initialize to default values
81 172 olivier.gi
set omsp_nr                1
82 158 olivier.gi
set omsp_conf(interface)  uart_generic
83
set omsp_conf(device)     [lindex [utils::uart_port_list] end]
84
set omsp_conf(baudrate)   [lindex [GetAllowedSpeeds] 1]
85
set omsp_conf(0,cpuaddr)  50
86
set omsp_conf(1,cpuaddr)  51
87
set omsp_conf(2,cpuaddr)  52
88
set omsp_conf(3,cpuaddr)  53
89
 
90 172 olivier.gi
set server(0,port)      2000
91
set server(1,port)      2001
92
set server(2,port)      2002
93
set server(3,port)      2003
94 158 olivier.gi
 
95 172 olivier.gi
set mem_mapping(0)         0
96
set mem_mapping(1)         0
97
set mem_mapping(2)         0
98
set mem_mapping(3)         0
99 158 olivier.gi
 
100 172 olivier.gi
set breakSelect            0
101
 
102
set shell                  0
103
set verbose                0
104
 
105 158 olivier.gi
###############################################################################
106
#                                                                             #
107 2 olivier.gi
#                            PARAMETER CHECK                                  #
108
#                                                                             #
109
###############################################################################
110
 
111
proc help {} {
112
    puts ""
113 158 olivier.gi
    puts "USAGE   : openmsp430-gdbproxy.tcl \[-device   <communication port>\]"
114
    puts "                                  \[-adaptor  <adaptor type>\]"
115
    puts "                                  \[-speed    <communication speed>\]"
116
    puts "                                  \[-i2c_addr <cpu address>\]"
117 2 olivier.gi
    puts "                                  \[-port     <server port>\]"
118
    puts "                                  \[-shell]"
119
    puts "                                  \[-verbose\]"
120
    puts "                                  \[-help\]"
121
    puts ""
122 158 olivier.gi
    puts "Examples: openmsp430-gdbproxy.tcl -device /dev/ttyUSB0 -adaptor uart_generic -speed  115200  -port 2000"
123
    puts "          openmsp430-gdbproxy.tcl -device COM2:        -adaptor i2c_usb-iss  -speed  I2C_S_100KHZ -i2c_addr 75 -port 2000"
124 2 olivier.gi
    puts ""
125
}
126
 
127
# Parse arguments
128
for {set i 0} {$i < $argc} {incr i} {
129
    switch -exact -- [lindex $argv $i] {
130 158 olivier.gi
        -device   {set omsp_conf(device)    [lindex $argv [expr $i+1]]; incr i}
131
        -adaptor  {set omsp_conf(interface) [lindex $argv [expr $i+1]]; incr i}
132
        -speed    {set omsp_conf(baudrate)  [lindex $argv [expr $i+1]]; incr i}
133
        -i2c_addr {set omsp_conf(0,cpuaddr) [lindex $argv [expr $i+1]]; incr i}
134 172 olivier.gi
        -port     {set server(0,port)       [lindex $argv [expr $i+1]]; incr i}
135 158 olivier.gi
        -shell    {set shell   1}
136
        -verbose  {set verbose 1}
137
        -h        {help; exit 0}
138
        -help     {help; exit 0}
139
        default   {}
140 2 olivier.gi
    }
141
}
142
 
143 158 olivier.gi
# Make sure the selected adptor is valid
144
if {![string eq $omsp_conf(interface) "uart_generic"] &
145
    ![string eq $omsp_conf(interface) "i2c_usb-iss"]} {
146
    puts "\nERROR: Specified adaptor is not valid (should be \"uart_generic\" or \"i2c_usb-iss\")"
147
    help
148
    exit 1
149
}
150
 
151
# Make sure the I2C address is an integer
152
if {![string is integer $omsp_conf(0,cpuaddr)]} {
153
    puts "\nERROR: Specified I2C address is not an integer"
154
    help
155
    exit 1
156
}
157
 
158
# Make sure the I2C address is valid
159
if {($omsp_conf(0,cpuaddr)<8) | ($omsp_conf(0,cpuaddr)>119)} {
160
    puts "\nERROR: Specified I2C address should lay between 7 and 120"
161
    help
162
    exit 1
163
}
164
 
165
# If the selected interface is a UART, make sure the selected speed is an integer
166
if {[string eq $omsp_conf(interface) "uart_generic"]} {
167
    if {![string is integer $omsp_conf(baudrate)]} {
168
        puts "\nERROR: Specified UART communication speed is not an integer"
169
        help
170
        exit 1
171
    }
172
} elseif {[string eq $omsp_conf(interface) "i2c_usb-iss"]} {
173
    if {[lsearch [lindex [GetAllowedSpeeds] 2] $omsp_conf(baudrate)]==-1} {
174
        puts "\nERROR: Specified I2C communication speed is not valid."
175
        puts "         Allowed values are:"
176
        foreach allowedVal [lindex [GetAllowedSpeeds] 2] {
177
            puts "                              - $allowedVal"
178
        }
179
        puts ""
180
        exit 1
181
    }
182
}
183
 
184 2 olivier.gi
# Source additional library for graphical interface
185
if {!$shell} {
186
    source $lib_path/combobox.tcl
187
    package require combobox 2.3
188
    catch {namespace import combobox::*}
189
}
190
 
191
# Small functions to display messages
192
proc putsLog {string {nonewline 0}} {
193
    global server
194
    global shell
195
    if {$shell} {
196 158 olivier.gi
        if {$nonewline} {
197
            puts -nonewline $string
198
        } else {
199
            puts $string
200
        }
201 2 olivier.gi
    } else {
202 158 olivier.gi
        if {$nonewline} {
203
            $server(log) insert end "$string"
204
        } else {
205
            $server(log) insert end "$string\n"
206
        }
207
        $server(log) see end
208 2 olivier.gi
    }
209
}
210
proc putsVerbose {string} {
211
    global verbose
212
    if {$verbose} {
213 158 olivier.gi
        putsLog "$string"
214 2 olivier.gi
    }
215
}
216
 
217
###############################################################################
218
#                               SHELL MODE                                    #
219
###############################################################################
220
if {$shell} {
221
 
222
    # Connect to device
223 172 olivier.gi
    if {![GetDevice 0]} {
224 158 olivier.gi
        puts "ERROR: Could not open $omsp_conf(device)
225
        puts "INFO:  Available serial ports are:"
226
        foreach port [utils::uart_port_list] {
227
            puts "INFO:                               -  $port"
228
        }
229
        if {[string eq $omsp_conf(interface) "i2c_usb-iss"]} {
230
            puts "\nMake sure the specified I2C device address is correct: $omsp_conf(0,cpuaddr)\n"
231
        }
232
        exit 1
233 2 olivier.gi
    }
234
 
235
    # Display info
236 172 olivier.gi
    if {$omsp_info(0,alias)==""} {
237 158 olivier.gi
        puts "INFO: Sucessfully connected with the openMSP430 target."
238 110 olivier.gi
    } else {
239 172 olivier.gi
        puts "INFO: Sucessfully connected with the openMSP430 target ($omsp_info(0,alias))."
240 110 olivier.gi
    }
241 172 olivier.gi
    set sizes [GetCPU_ID_SIZE 0]
242
    if {$omsp_info(0,asic)} {
243
        puts "INFO: CPU Version              - $omsp_info(0,cpu_ver) / ASIC"
244 110 olivier.gi
    } else {
245 172 olivier.gi
        puts "INFO: CPU Version              - $omsp_info(0,cpu_ver) / FPGA"
246 110 olivier.gi
    }
247 172 olivier.gi
    puts "INFO: User Version             - $omsp_info(0,user_ver)"
248
    if {$omsp_info(0,cpu_ver)==1} {
249 158 olivier.gi
        puts "INFO: Hardware Multiplier      - --"
250 172 olivier.gi
    } elseif {$omsp_info(0,mpy)} {
251 158 olivier.gi
        puts "INFO: Hardware Multiplier      - Yes"
252 110 olivier.gi
    } else {
253 158 olivier.gi
        puts "INFO: Hardware Multiplier      - No"
254 110 olivier.gi
    }
255 172 olivier.gi
    puts "INFO: Program Memory Size      - $omsp_info(0,pmem_size) B"
256
    puts "INFO: Data Memory Size         - $omsp_info(0,dmem_size) B"
257
    puts "INFO: Peripheral Address Space - $omsp_info(0,per_size) B"
258
    puts "INFO: $omsp_info(0,hw_break) Hardware Brea/Watch-point unit(s) detected"
259 2 olivier.gi
    puts ""
260
 
261
    # Reset & Stop CPU
262 172 olivier.gi
    ExecutePOR_Halt 0
263 2 olivier.gi
 
264
    # Start server for GDB
265 172 olivier.gi
    if {![startServer 0]} {
266 158 olivier.gi
        exit 1
267 2 olivier.gi
    }
268
 
269
    vwait forever
270
}
271
 
272 158 olivier.gi
proc getConfiguration {} {
273 2 olivier.gi
 
274 158 olivier.gi
    global gui_dbg_if
275
    global gui_adapter
276
    global omsp_conf
277
 
278
    regexp {(.+)_(.+)} $omsp_conf(interface) whole_match tmp_if tmp_adapter
279
 
280
    set gui_dbg_if  [string toupper $tmp_if]
281
    set gui_adapter [string toupper $tmp_adapter]
282
 
283
    return 1
284
}
285
 
286
proc updateConfiguration {{w ""} {sel ""}} {
287
 
288
    global gui_dbg_if
289
    global gui_adapter
290
    global omsp_conf
291
    global omsp_nr
292
 
293
    if {$sel=="UART"} {
294 172 olivier.gi
        eval .connect.cfg.if.config2.adapter.p2 list delete 0 end
295
        eval .connect.cfg.if.config2.adapter.p2 list insert   end [list "GENERIC"]
296
        set gui_adapter "GENERIC"
297
        set omsp_conf(interface)  uart_generic
298 158 olivier.gi
 
299
    } elseif {$sel=="I2C"} {
300
 
301 172 olivier.gi
        eval .connect.cfg.if.config2.adapter.p2 list delete 0 end
302
        eval .connect.cfg.if.config2.adapter.p2 list insert   end [list "USB-ISS"]
303
        set gui_adapter "USB-ISS"
304
        set omsp_conf(interface)  i2c_usb-iss
305 158 olivier.gi
    }
306
 
307
    if {$gui_dbg_if=="UART"} {
308 172 olivier.gi
        set omsp_nr 1
309
        .connect.cfg.ad.i2c_nr.l        configure -state disabled
310
        .connect.cfg.ad.i2c_nr.s        configure -state disabled
311
        .connect.cfg.ad.i2c_addr.l      configure -state disabled
312
        .connect.cfg.ad.i2c_addr.s0     configure -state disabled
313
        .connect.cfg.ad.i2c_addr.s1     configure -state disabled
314
        .connect.cfg.ad.i2c_addr.s2     configure -state disabled
315
        .connect.cfg.ad.i2c_addr.s3     configure -state disabled
316
        .connect.cfg.ad.arrow.l0        configure -state disabled
317
        .connect.cfg.ad.arrow.l1        configure -state disabled
318
        .connect.cfg.ad.arrow.l2        configure -state disabled
319
        .connect.cfg.ad.arrow.l3        configure -state disabled
320
        .connect.cfg.ad.server_port.p0  configure -state normal
321
        .connect.cfg.ad.server_port.p1  configure -state disabled
322
        .connect.cfg.ad.server_port.p2  configure -state disabled
323
        .connect.cfg.ad.server_port.p3  configure -state disabled
324
        .connect.cfg.ad.core_nr.l0      configure -state disabled
325
        .connect.cfg.ad.core_nr.l1      configure -state disabled
326
        .connect.cfg.ad.core_nr.l2      configure -state disabled
327
        .connect.cfg.ad.core_nr.l3      configure -state disabled
328
        .connect.cfg.ad.i2c_nr.f.soft.b configure -state disabled
329
        if {[winfo exists .omsp_sft_brk]} {
330
            updateSoftBreakpoints
331
        }
332
 
333 158 olivier.gi
    } elseif {$gui_dbg_if=="I2C"} {
334 172 olivier.gi
        .connect.cfg.ad.core_nr.l0      configure -state normal
335
        .connect.cfg.ad.i2c_nr.l        configure -state normal
336
        .connect.cfg.ad.i2c_nr.s        configure -state normal
337
        .connect.cfg.ad.i2c_addr.l      configure -state normal
338
        .connect.cfg.ad.i2c_addr.s0     configure -state normal
339
        .connect.cfg.ad.arrow.l0        configure -state normal
340
        .connect.cfg.ad.server_port.p0  configure -state normal
341 158 olivier.gi
 
342 172 olivier.gi
        if {$omsp_nr < 2} {
343
            .connect.cfg.ad.core_nr.l1      configure -state disabled
344
            .connect.cfg.ad.server_port.p1  configure -state disabled
345
            .connect.cfg.ad.arrow.l1        configure -state disabled
346
            .connect.cfg.ad.i2c_addr.s1     configure -state disabled
347
            .connect.cfg.ad.i2c_nr.f.soft.b configure -state disabled
348
        } else            {
349
            .connect.cfg.ad.core_nr.l1      configure -state normal
350
            .connect.cfg.ad.server_port.p1  configure -state normal
351
            .connect.cfg.ad.arrow.l1        configure -state normal
352
            .connect.cfg.ad.i2c_addr.s1     configure -state normal
353
            .connect.cfg.ad.i2c_nr.f.soft.b configure -state normal
354
        }
355 158 olivier.gi
 
356 172 olivier.gi
        if {$omsp_nr < 3} {
357
            .connect.cfg.ad.core_nr.l2      configure -state disabled
358
            .connect.cfg.ad.server_port.p2  configure -state disabled
359
            .connect.cfg.ad.arrow.l2        configure -state disabled
360
            .connect.cfg.ad.i2c_addr.s2     configure -state disabled
361
        } else            {
362
            .connect.cfg.ad.core_nr.l2      configure -state normal
363
            .connect.cfg.ad.server_port.p2  configure -state normal
364
            .connect.cfg.ad.arrow.l2        configure -state normal
365
            .connect.cfg.ad.i2c_addr.s2     configure -state normal
366
        }
367 158 olivier.gi
 
368 172 olivier.gi
        if {$omsp_nr < 4} {
369
            .connect.cfg.ad.core_nr.l3      configure -state disabled
370
            .connect.cfg.ad.server_port.p3  configure -state disabled
371
            .connect.cfg.ad.arrow.l3        configure -state disabled
372
            .connect.cfg.ad.i2c_addr.s3     configure -state disabled
373
        } else            {
374
            .connect.cfg.ad.core_nr.l3      configure -state normal
375
            .connect.cfg.ad.server_port.p3  configure -state normal
376
            .connect.cfg.ad.arrow.l3        configure -state normal
377
            .connect.cfg.ad.i2c_addr.s3     configure -state normal
378
        }
379
        updateSoftBreakpoints
380 158 olivier.gi
    }
381
 
382
    .connect.cfg.if.config2.serial_port.p2 configure -editable  1
383
    eval .connect.cfg.if.config2.serial_port.p2  list delete 0 end
384
    eval .connect.cfg.if.config2.serial_port.p2  list insert   end [lindex [GetAllowedSpeeds] 2]
385
    set omsp_conf(baudrate) [lindex [GetAllowedSpeeds] 1];
386
    .connect.cfg.if.config2.serial_port.p2 configure -editable  [lindex [GetAllowedSpeeds] 0];
387
 
388
}
389
 
390 2 olivier.gi
###############################################################################
391
#                                 GUI MODE                                    #
392
###############################################################################
393
 
394
####################################
395
#   CREATE & PLACE MAIN WIDGETS    #
396
####################################
397
 
398
wm title    . "openMSP430 GDB Proxy"
399
wm iconname . "openMSP430 GDB Proxy"
400
 
401 110 olivier.gi
# Create the Main Menu frame
402 2 olivier.gi
frame  .menu
403
pack   .menu   -side top -padx 10 -pady 10 -fill x
404
 
405 110 olivier.gi
# Create the Connection frame
406
frame  .connect -bd 2 -relief ridge    ;# solid
407
pack   .connect -side top -padx 10 -pady {5 0} -fill x
408 2 olivier.gi
 
409 110 olivier.gi
# Create the Info frame
410
frame  .info    -bd 2 -relief ridge    ;# solid
411
pack   .info    -side top -padx 10 -pady {10 0} -fill x
412 2 olivier.gi
 
413 110 olivier.gi
# Create the Server frame
414
frame  .server -bd 2 -relief ridge    ;# solid
415
pack   .server -side top -padx 10 -pady {10 0} -fill x
416
 
417 87 olivier.gi
# Create the TCL script field
418 110 olivier.gi
frame  .tclscript -bd 2 -relief ridge    ;# solid
419 87 olivier.gi
pack   .tclscript -side top -padx 10 -pady 10 -fill x
420 2 olivier.gi
 
421 87 olivier.gi
 
422 2 olivier.gi
####################################
423
#  CREATE THE REST                 #
424
####################################
425
 
426
# Exit button
427 172 olivier.gi
button .menu.exit -text "Exit" -command {stopAllServers; exit 0}
428 2 olivier.gi
pack   .menu.exit -side left
429
 
430 110 olivier.gi
# openMSP430 label
431
label  .menu.omsp      -text "openMSP430 GDB proxy" -anchor center -fg "\#6a5acd" -font {-weight bold -size 14}
432
pack   .menu.omsp      -side right -padx 20
433 2 olivier.gi
 
434 110 olivier.gi
# Create the Configuration, Start & Info frames
435 158 olivier.gi
getConfiguration
436
frame  .connect.cfg
437
pack   .connect.cfg    -side left   -padx  0 -pady  0 -fill x -expand true
438
frame  .connect.cfg.if -bd 2 -relief ridge
439
pack   .connect.cfg.if -side top    -padx 10 -pady {10 0} -fill x -expand true
440
frame  .connect.cfg.ad -bd 2 -relief ridge
441
pack   .connect.cfg.ad -side top    -padx 10 -pady 10 -fill both -expand true
442 110 olivier.gi
frame  .connect.start
443
pack   .connect.start  -side right  -padx 10 -pady 0 -fill x -expand true
444
 
445 158 olivier.gi
frame  .connect.cfg.if.config1
446
pack   .connect.cfg.if.config1 -side left   -padx 0 -pady 0 -fill x -expand true
447
frame  .connect.cfg.if.config2
448
pack   .connect.cfg.if.config2 -side left   -padx 0 -pady 0 -fill x -expand true
449 110 olivier.gi
 
450 158 olivier.gi
# Interface & Adapter selection
451
frame    .connect.cfg.if.config1.adapter
452
pack     .connect.cfg.if.config1.adapter         -side top  -padx 5 -pady {10 0} -fill x
453
label    .connect.cfg.if.config1.adapter.l1      -text "Serial Debug Interface:" -anchor w
454
pack     .connect.cfg.if.config1.adapter.l1      -side left -padx 5
455
combobox .connect.cfg.if.config1.adapter.p1      -textvariable gui_dbg_if -editable false -width 15 -command {updateConfiguration}
456
eval     .connect.cfg.if.config1.adapter.p1      list insert end [list "UART" "I2C"]
457
pack     .connect.cfg.if.config1.adapter.p1      -side right -padx 10
458 2 olivier.gi
 
459 158 olivier.gi
frame    .connect.cfg.if.config2.adapter
460
pack     .connect.cfg.if.config2.adapter         -side top  -padx 5 -pady {10 0} -fill x
461
label    .connect.cfg.if.config2.adapter.l2      -text "Adapter selection:" -anchor w
462
pack     .connect.cfg.if.config2.adapter.l2      -side left -padx 5
463
combobox .connect.cfg.if.config2.adapter.p2      -textvariable gui_adapter -editable false -width 15
464
eval     .connect.cfg.if.config2.adapter.p2      list insert end [list "GENERIC"]
465
pack     .connect.cfg.if.config2.adapter.p2      -side right -padx 5
466 2 olivier.gi
 
467 158 olivier.gi
# Device port & Speed selection
468
frame    .connect.cfg.if.config1.serial_port
469
pack     .connect.cfg.if.config1.serial_port     -side top   -padx 5 -pady {10 10} -fill x
470
label    .connect.cfg.if.config1.serial_port.l1  -text "Device Port:"  -anchor w
471
pack     .connect.cfg.if.config1.serial_port.l1  -side left  -padx 5
472
combobox .connect.cfg.if.config1.serial_port.p1  -textvariable omsp_conf(device) -editable true -width 15
473
eval     .connect.cfg.if.config1.serial_port.p1  list insert end [utils::uart_port_list]
474
pack     .connect.cfg.if.config1.serial_port.p1  -side right -padx 10
475 2 olivier.gi
 
476 158 olivier.gi
frame    .connect.cfg.if.config2.serial_port
477
pack     .connect.cfg.if.config2.serial_port     -side top   -padx 5 -pady {10 10} -fill x
478
label    .connect.cfg.if.config2.serial_port.l2  -text "Speed:" -anchor w
479
pack     .connect.cfg.if.config2.serial_port.l2  -side left  -padx 5
480
combobox .connect.cfg.if.config2.serial_port.p2  -textvariable omsp_conf(baudrate) -editable [lindex [GetAllowedSpeeds] 0] -width 15
481
eval     .connect.cfg.if.config2.serial_port.p2  list insert end [lindex [GetAllowedSpeeds] 2]
482
pack     .connect.cfg.if.config2.serial_port.p2  -side right -padx 5
483
 
484
# Server Port field & I2C address selection
485
frame    .connect.cfg.ad.core_nr
486 172 olivier.gi
pack     .connect.cfg.ad.core_nr     -side left -padx 5 -pady {0 20} -fill y
487 158 olivier.gi
label    .connect.cfg.ad.core_nr.l3  -text "Core 3:" -anchor w
488
pack     .connect.cfg.ad.core_nr.l3  -side bottom  -padx {25 0} -pady {10 10}
489
label    .connect.cfg.ad.core_nr.l2  -text "Core 2:" -anchor w
490
pack     .connect.cfg.ad.core_nr.l2  -side bottom  -padx {25 0} -pady {10 2}
491
label    .connect.cfg.ad.core_nr.l1  -text "Core 1:" -anchor w
492
pack     .connect.cfg.ad.core_nr.l1  -side bottom  -padx {25 0} -pady {10 2}
493
label    .connect.cfg.ad.core_nr.l0  -text "Core 0:" -anchor w
494
pack     .connect.cfg.ad.core_nr.l0  -side bottom  -padx {25 0} -pady {10 2}
495
 
496
frame    .connect.cfg.ad.server_port
497 172 olivier.gi
pack     .connect.cfg.ad.server_port    -side left -padx 5 -pady {0 20} -fill y
498
entry    .connect.cfg.ad.server_port.p3 -textvariable server(3,port) -relief sunken -width 10
499 158 olivier.gi
pack     .connect.cfg.ad.server_port.p3 -side bottom  -padx 5 -pady {10 10}
500 172 olivier.gi
entry    .connect.cfg.ad.server_port.p2 -textvariable server(2,port) -relief sunken -width 10
501 158 olivier.gi
pack     .connect.cfg.ad.server_port.p2 -side bottom  -padx 5 -pady {10 0}
502 172 olivier.gi
entry    .connect.cfg.ad.server_port.p1 -textvariable server(1,port) -relief sunken -width 10
503 158 olivier.gi
pack     .connect.cfg.ad.server_port.p1 -side bottom  -padx 5 -pady {10 0}
504 172 olivier.gi
entry    .connect.cfg.ad.server_port.p0 -textvariable server(0,port) -relief sunken -width 10
505 158 olivier.gi
pack     .connect.cfg.ad.server_port.p0 -side bottom  -padx 5 -pady {10 0}
506
label    .connect.cfg.ad.server_port.l  -text "Proxy Server Port" -anchor w
507
pack     .connect.cfg.ad.server_port.l  -side bottom  -padx 5 -pady {10 0}
508
 
509
frame    .connect.cfg.ad.arrow
510 172 olivier.gi
pack     .connect.cfg.ad.arrow     -side left -padx 5 -pady {0 20} -fill y
511 158 olivier.gi
label    .connect.cfg.ad.arrow.l3  -text "==>" -anchor w
512
pack     .connect.cfg.ad.arrow.l3  -side bottom  -padx 5 -pady {10 10}
513
label    .connect.cfg.ad.arrow.l2  -text "==>" -anchor w
514
pack     .connect.cfg.ad.arrow.l2  -side bottom  -padx 5 -pady {10 2}
515
label    .connect.cfg.ad.arrow.l1  -text "==>" -anchor w
516
pack     .connect.cfg.ad.arrow.l1  -side bottom  -padx 5 -pady {10 2}
517
label    .connect.cfg.ad.arrow.l0  -text "==>" -anchor w
518
pack     .connect.cfg.ad.arrow.l0  -side bottom  -padx 5 -pady {10 2}
519
 
520
frame    .connect.cfg.ad.i2c_addr
521 172 olivier.gi
pack     .connect.cfg.ad.i2c_addr     -side left -padx 5 -pady {0 20} -fill y
522 158 olivier.gi
spinbox  .connect.cfg.ad.i2c_addr.s3  -from 8 -to 119 -textvariable omsp_conf(3,cpuaddr) -width 4
523
pack     .connect.cfg.ad.i2c_addr.s3  -side bottom    -padx 5 -pady {10 10}
524
spinbox  .connect.cfg.ad.i2c_addr.s2  -from 8 -to 119 -textvariable omsp_conf(2,cpuaddr) -width 4
525
pack     .connect.cfg.ad.i2c_addr.s2  -side bottom    -padx 5 -pady {10 0}
526
spinbox  .connect.cfg.ad.i2c_addr.s1  -from 8 -to 119 -textvariable omsp_conf(1,cpuaddr) -width 4
527
pack     .connect.cfg.ad.i2c_addr.s1  -side bottom    -padx 5 -pady {10 0}
528
spinbox  .connect.cfg.ad.i2c_addr.s0  -from 8 -to 119 -textvariable omsp_conf(0,cpuaddr) -width 4
529
pack     .connect.cfg.ad.i2c_addr.s0  -side bottom    -padx 5 -pady {10 0}
530
label    .connect.cfg.ad.i2c_addr.l   -text "I2C Address" -anchor w
531
pack     .connect.cfg.ad.i2c_addr.l   -side bottom    -padx 5 -pady {10 0}
532
 
533
frame    .connect.cfg.ad.i2c_nr
534
pack     .connect.cfg.ad.i2c_nr     -side right -padx 5 -fill y
535
label    .connect.cfg.ad.i2c_nr.l   -text "Number of cores" -anchor w
536
pack     .connect.cfg.ad.i2c_nr.l   -side top    -padx 50 -pady {10 0}
537
spinbox  .connect.cfg.ad.i2c_nr.s   -from 1 -to 4 -textvariable omsp_nr -state readonly -width 4 -command {updateConfiguration}
538
pack     .connect.cfg.ad.i2c_nr.s   -side top    -padx 50 -pady {10 10}
539
 
540 172 olivier.gi
frame       .connect.cfg.ad.i2c_nr.f   -bd 2 -relief ridge
541
pack        .connect.cfg.ad.i2c_nr.f   -side top -padx 10 -pady {5 5} -fill x
542
label       .connect.cfg.ad.i2c_nr.f.l2  -text "Breakpoint configuration" -anchor w
543
pack        .connect.cfg.ad.i2c_nr.f.l2  -side top    -padx 0 -pady {5 10}
544
 
545
frame       .connect.cfg.ad.i2c_nr.f.soft
546
pack        .connect.cfg.ad.i2c_nr.f.soft   -side top -padx 0 -fill x
547
radiobutton .connect.cfg.ad.i2c_nr.f.soft.r -value "0" -text "" -state normal -variable breakSelect -command {updateSoftBreakpoints}
548
pack        .connect.cfg.ad.i2c_nr.f.soft.r -side left -padx {10 0}  -pady {0 0}
549
label       .connect.cfg.ad.i2c_nr.f.soft.l -text "Soft" -anchor w
550
pack        .connect.cfg.ad.i2c_nr.f.soft.l -side left -padx {5 10} -pady {3 0}
551
button      .connect.cfg.ad.i2c_nr.f.soft.b -text "Config." -state disabled -command {configSoftBreakpoints}
552
pack        .connect.cfg.ad.i2c_nr.f.soft.b -side right -padx {0 20}
553
 
554
frame       .connect.cfg.ad.i2c_nr.f.hard
555
pack        .connect.cfg.ad.i2c_nr.f.hard   -side top -padx 0 -pady {0 10} -fill x
556
radiobutton .connect.cfg.ad.i2c_nr.f.hard.r -value "1" -text "" -state normal -variable breakSelect -command {updateSoftBreakpoints}
557
pack        .connect.cfg.ad.i2c_nr.f.hard.r -side left -padx {10 0}  -pady {0 0}
558
label       .connect.cfg.ad.i2c_nr.f.hard.l -text "Hard" -anchor w
559
pack        .connect.cfg.ad.i2c_nr.f.hard.l -side left -padx {5 10} -pady {3 0}
560
 
561 158 olivier.gi
# Update according to default values
562
updateConfiguration
563
 
564 110 olivier.gi
# Connect to CPU & start proxy server
565 158 olivier.gi
button .connect.start.but -text "Connect to CPU(s)\n and \nStart Proxy Server(s)" -command {startServerGUI}
566 110 olivier.gi
pack   .connect.start.but -side right -padx 30
567
 
568
 
569
# CPU Info
570
frame  .info.cpu
571
pack   .info.cpu      -side top   -padx 10 -pady {5 0} -fill x
572
label  .info.cpu.l    -text "CPU Info:"       -anchor w
573
pack   .info.cpu.l    -side left -padx {10 10}
574
label  .info.cpu.con  -text "Disconnected"    -anchor w -fg Red
575
pack   .info.cpu.con  -side left
576
button .info.cpu.more -text "More..."         -width 9 -command {displayMore} -state disabled
577
pack   .info.cpu.more -side right -padx {0 30}
578
 
579
 
580
# Server Info
581
frame  .info.server
582
pack   .info.server     -side top   -padx 10 -pady {0 10} -fill x
583
label  .info.server.l   -text "Server Info:"       -anchor w
584
pack   .info.server.l   -side left -padx {10 10}
585
label  .info.server.con -text "Not running"    -anchor w -fg Red
586
pack   .info.server.con -side left
587
 
588
 
589 2 olivier.gi
# Create the text widget to log received messages
590
frame  .server.t
591
pack   .server.t     -side top -padx 10 -pady 10 -fill x
592 110 olivier.gi
set server(log) [text   .server.t.log -width 80 -height 15 -borderwidth 2  \
593 2 olivier.gi
                          -setgrid true -yscrollcommand {.server.t.scroll set}]
594
pack   .server.t.log -side left  -fill both -expand true
595
scrollbar .server.t.scroll -command {.server.t.log yview}
596 87 olivier.gi
pack   .server.t.scroll -side right -fill both
597 2 olivier.gi
 
598
 
599
# Log commands
600
frame  .server.cmd
601 110 olivier.gi
pack   .server.cmd   -side top  -pady {0 10} -fill x
602 2 olivier.gi
button .server.cmd.clear -text "Clear log" -command {$server(log) delete 1.0 end}
603
pack   .server.cmd.clear -side left -padx 10
604
checkbutton .server.cmd.verbose -text "Verbose" -variable verbose
605
pack   .server.cmd.verbose -side right -padx 10
606 87 olivier.gi
 
607
 
608
# Load TCL script fields
609
frame  .tclscript.ft
610 110 olivier.gi
pack   .tclscript.ft        -side top  -padx 10  -pady 10 -fill x
611 87 olivier.gi
label  .tclscript.ft.l      -text "TCL script:" -state disabled
612
pack   .tclscript.ft.l      -side left -padx "0 10"
613
entry  .tclscript.ft.file   -width 58 -relief sunken -textvariable tcl_file_name -state disabled
614
pack   .tclscript.ft.file   -side left -padx 10
615
button .tclscript.ft.browse -text "Browse" -state disabled -command {set tcl_file_name [tk_getOpenFile -filetypes {{{TCL Files} {.tcl}} {{All Files} *}}]}
616
pack   .tclscript.ft.browse -side left -padx 5
617
frame  .tclscript.fb
618
pack   .tclscript.fb        -side top -fill x
619
button .tclscript.fb.read   -text "Source TCL script !" -state disabled -command {if {[file exists $tcl_file_name]} {source $tcl_file_name}}
620 110 olivier.gi
pack   .tclscript.fb.read   -side left -padx 20  -pady {0 10} -fill x
621 87 olivier.gi
 
622 110 olivier.gi
wm resizable . 0 0
623 172 olivier.gi
 
624
 
625
 
626
#####################################
627
#  Breakpoint configuration window  #
628
#####################################
629
 
630
proc configSoftBreakpoints  { } {
631
 
632
    global omsp_nr
633
 
634
    # Destroy windows if already existing
635
    if {[lsearch -exact [winfo children .] .omsp_sft_brk]!=-1} {
636
        destroy .omsp_sft_brk
637
    }
638
 
639
    # Create master window
640
    set title "Software Breakpoint Configuration"
641
    toplevel     .omsp_sft_brk
642
    wm title     .omsp_sft_brk $title
643
    wm geometry  .omsp_sft_brk +380+200
644
    wm resizable .omsp_sft_brk 0 0
645
 
646
    # Title
647
    label  .omsp_sft_brk.title  -text "$title"   -anchor center -fg "\#6a5acd" -font {-weight bold -size 16}
648
    pack   .omsp_sft_brk.title  -side top -padx {20 20} -pady {20 10}
649
 
650
    # Create global frame
651
    frame     .omsp_sft_brk.map
652
    pack      .omsp_sft_brk.map   -side top  -padx {10 10} -pady {0 0}
653
 
654
    # Create frame for buttons
655
    frame       .omsp_sft_brk.map.b  -bd 2 -relief ridge
656
    pack        .omsp_sft_brk.map.b  -side top  -padx 10  -pady {10 0} -fill x -expand true
657
 
658
    button      .omsp_sft_brk.map.b.share -text "Shared Program Memory"    -command {setMemMapping 0 0 0 0}
659
    pack        .omsp_sft_brk.map.b.share -side left  -padx {20 15} -pady {10 10}
660
 
661
    button      .omsp_sft_brk.map.b.dedic -text "Dedicated Program Memory" -command {setMemMapping 0 1 2 3}
662
    pack        .omsp_sft_brk.map.b.dedic -side right -padx {15 20} -pady {10 10}
663
 
664
 
665
    # Create fram for radio-buttons
666
    frame       .omsp_sft_brk.map.r  -bd 2 -relief ridge
667
    pack        .omsp_sft_brk.map.r  -side top  -padx 10  -pady {10 20} -fill x -expand true
668
 
669
    frame       .omsp_sft_brk.map.r.core_nr
670
    pack        .omsp_sft_brk.map.r.core_nr     -side left -padx 5 -pady {0 20} -fill y
671
    label       .omsp_sft_brk.map.r.core_nr.l3  -text "Core 3:" -anchor w
672
    pack        .omsp_sft_brk.map.r.core_nr.l3  -side bottom  -padx {25 0} -pady {10 10}
673
    label       .omsp_sft_brk.map.r.core_nr.l2  -text "Core 2:" -anchor w
674
    pack        .omsp_sft_brk.map.r.core_nr.l2  -side bottom  -padx {25 0} -pady {10 2}
675
    label       .omsp_sft_brk.map.r.core_nr.l1  -text "Core 1:" -anchor w
676
    pack        .omsp_sft_brk.map.r.core_nr.l1  -side bottom  -padx {25 0} -pady {10 2}
677
    label       .omsp_sft_brk.map.r.core_nr.l0  -text "Core 0:" -anchor w
678
    pack        .omsp_sft_brk.map.r.core_nr.l0  -side bottom  -padx {25 0} -pady {10 2}
679
 
680
    frame       .omsp_sft_brk.map.r.pmem0
681
    pack        .omsp_sft_brk.map.r.pmem0    -side left -padx 5 -pady {0 20} -fill y
682
    radiobutton .omsp_sft_brk.map.r.pmem0.p3 -value "0" -text "" -state normal -variable mem_mapping(3)
683
    pack        .omsp_sft_brk.map.r.pmem0.p3 -side bottom  -padx 5 -pady {10 10}
684
    radiobutton .omsp_sft_brk.map.r.pmem0.p2 -value "0" -text "" -state normal -variable mem_mapping(2)
685
    pack        .omsp_sft_brk.map.r.pmem0.p2 -side bottom  -padx 5 -pady {10 0}
686
    radiobutton .omsp_sft_brk.map.r.pmem0.p1 -value "0" -text "" -state normal -variable mem_mapping(1)
687
    pack        .omsp_sft_brk.map.r.pmem0.p1 -side bottom  -padx 5 -pady {10 0}
688
    radiobutton .omsp_sft_brk.map.r.pmem0.p0 -value "0" -text "" -state normal -variable mem_mapping(0)
689
    pack        .omsp_sft_brk.map.r.pmem0.p0 -side bottom  -padx 5 -pady {10 0}
690
    label       .omsp_sft_brk.map.r.pmem0.l  -text "Program\nMemory 0" -anchor w
691
    pack        .omsp_sft_brk.map.r.pmem0.l  -side bottom  -padx 5 -pady {10 0}
692
 
693
    frame       .omsp_sft_brk.map.r.pmem1
694
    pack        .omsp_sft_brk.map.r.pmem1    -side left -padx 5 -pady {0 20} -fill y
695
    radiobutton .omsp_sft_brk.map.r.pmem1.p3 -value "1" -text "" -state normal -variable mem_mapping(3)
696
    pack        .omsp_sft_brk.map.r.pmem1.p3 -side bottom  -padx 5 -pady {10 10}
697
    radiobutton .omsp_sft_brk.map.r.pmem1.p2 -value "1" -text "" -state normal -variable mem_mapping(2)
698
    pack        .omsp_sft_brk.map.r.pmem1.p2 -side bottom  -padx 5 -pady {10 0}
699
    radiobutton .omsp_sft_brk.map.r.pmem1.p1 -value "1" -text "" -state normal -variable mem_mapping(1)
700
    pack        .omsp_sft_brk.map.r.pmem1.p1 -side bottom  -padx 5 -pady {10 0}
701
    radiobutton .omsp_sft_brk.map.r.pmem1.p0 -value "1" -text "" -state disable -variable mem_mapping(0)
702
    pack        .omsp_sft_brk.map.r.pmem1.p0 -side bottom  -padx 5 -pady {10 0}
703
    label       .omsp_sft_brk.map.r.pmem1.l  -text "Program\nMemory 1" -anchor w
704
    pack        .omsp_sft_brk.map.r.pmem1.l  -side bottom  -padx 5 -pady {10 0}
705
 
706
    frame       .omsp_sft_brk.map.r.pmem2
707
    pack        .omsp_sft_brk.map.r.pmem2    -side left -padx 5 -pady {0 20} -fill y
708
    radiobutton .omsp_sft_brk.map.r.pmem2.p3 -value "2" -text "" -state normal -variable mem_mapping(3)
709
    pack        .omsp_sft_brk.map.r.pmem2.p3 -side bottom  -padx 5 -pady {10 10}
710
    radiobutton .omsp_sft_brk.map.r.pmem2.p2 -value "2" -text "" -state normal -variable mem_mapping(2)
711
    pack        .omsp_sft_brk.map.r.pmem2.p2 -side bottom  -padx 5 -pady {10 0}
712
    radiobutton .omsp_sft_brk.map.r.pmem2.p1 -value "2" -text "" -state disable -variable mem_mapping(1)
713
    pack        .omsp_sft_brk.map.r.pmem2.p1 -side bottom  -padx 5 -pady {10 0}
714
    radiobutton .omsp_sft_brk.map.r.pmem2.p0 -value "2" -text "" -state disable -variable mem_mapping(0)
715
    pack        .omsp_sft_brk.map.r.pmem2.p0 -side bottom  -padx 5 -pady {10 0}
716
    label       .omsp_sft_brk.map.r.pmem2.l  -text "Program\nMemory 2" -anchor w
717
    pack        .omsp_sft_brk.map.r.pmem2.l  -side bottom  -padx 5 -pady {10 0}
718
 
719
    frame       .omsp_sft_brk.map.r.pmem3
720
    pack        .omsp_sft_brk.map.r.pmem3    -side left -padx 5 -pady {0 20} -fill y
721
    radiobutton .omsp_sft_brk.map.r.pmem3.p3 -value "3" -text "" -state normal -variable mem_mapping(3)
722
    pack        .omsp_sft_brk.map.r.pmem3.p3 -side bottom  -padx 5 -pady {10 10}
723
    radiobutton .omsp_sft_brk.map.r.pmem3.p2 -value "3" -text "" -state disable -variable mem_mapping(2)
724
    pack        .omsp_sft_brk.map.r.pmem3.p2 -side bottom  -padx 5 -pady {10 0}
725
    radiobutton .omsp_sft_brk.map.r.pmem3.p1 -value "3" -text "" -state disable -variable mem_mapping(1)
726
    pack        .omsp_sft_brk.map.r.pmem3.p1 -side bottom  -padx 5 -pady {10 0}
727
    radiobutton .omsp_sft_brk.map.r.pmem3.p0 -value "3" -text "" -state disable -variable mem_mapping(0)
728
    pack        .omsp_sft_brk.map.r.pmem3.p0 -side bottom  -padx 5 -pady {10 0}
729
    label       .omsp_sft_brk.map.r.pmem3.l  -text "Program\nMemory 3" -anchor w
730
    pack        .omsp_sft_brk.map.r.pmem3.l  -side bottom  -padx 5 -pady {10 0}
731
 
732
    # Create OK button
733
    button .omsp_sft_brk.okay -text "OK" -font {-weight bold}  -command {destroy .omsp_sft_brk}
734
    pack   .omsp_sft_brk.okay -side bottom -expand true -fill x -padx 5 -pady {0 10}
735
 
736
    # Update according to number of cores
737
    updateSoftBreakpoints
738
}
739
 
740
proc updateSoftBreakpoints  { } {
741
 
742
    global omsp_nr
743
    global breakSelect
744
 
745
    if {[winfo exists .omsp_sft_brk]} {
746
        if {$breakSelect==0} {
747
            .omsp_sft_brk.map.r.core_nr.l0  configure -state normal
748
            .omsp_sft_brk.map.r.pmem0.p0    configure -state normal
749
            if {$omsp_nr < 2} {
750
                .omsp_sft_brk.map.r.core_nr.l1  configure -state disabled
751
                .omsp_sft_brk.map.r.pmem0.p1    configure -state disabled
752
                .omsp_sft_brk.map.r.pmem1.p1    configure -state disabled
753
            } else {
754
                .omsp_sft_brk.map.r.core_nr.l1  configure -state normal
755
                .omsp_sft_brk.map.r.pmem0.p1    configure -state normal
756
                .omsp_sft_brk.map.r.pmem1.p1    configure -state normal
757
            }
758
 
759
            if {$omsp_nr < 3} {
760
                .omsp_sft_brk.map.r.core_nr.l2  configure -state disabled
761
                .omsp_sft_brk.map.r.pmem0.p2    configure -state disabled
762
                .omsp_sft_brk.map.r.pmem1.p2    configure -state disabled
763
                .omsp_sft_brk.map.r.pmem2.p2    configure -state disabled
764
            } else {
765
                .omsp_sft_brk.map.r.core_nr.l2  configure -state normal
766
                .omsp_sft_brk.map.r.pmem0.p2    configure -state normal
767
                .omsp_sft_brk.map.r.pmem1.p2    configure -state normal
768
                .omsp_sft_brk.map.r.pmem2.p2    configure -state normal
769
            }
770
 
771
            if {$omsp_nr < 4} {
772
                .omsp_sft_brk.map.r.core_nr.l3  configure -state disabled
773
                .omsp_sft_brk.map.r.pmem0.p3    configure -state disabled
774
                .omsp_sft_brk.map.r.pmem1.p3    configure -state disabled
775
                .omsp_sft_brk.map.r.pmem2.p3    configure -state disabled
776
                .omsp_sft_brk.map.r.pmem3.p3    configure -state disabled
777
            } else {
778
                .omsp_sft_brk.map.r.core_nr.l3  configure -state normal
779
                .omsp_sft_brk.map.r.pmem0.p3    configure -state normal
780
                .omsp_sft_brk.map.r.pmem1.p3    configure -state normal
781
                .omsp_sft_brk.map.r.pmem2.p3    configure -state normal
782
                .omsp_sft_brk.map.r.pmem3.p3    configure -state normal
783
            }
784
        } else {
785
            .omsp_sft_brk.map.r.core_nr.l0  configure -state disabled
786
            .omsp_sft_brk.map.r.pmem0.p0    configure -state disabled
787
            .omsp_sft_brk.map.r.core_nr.l1  configure -state disabled
788
            .omsp_sft_brk.map.r.pmem0.p1    configure -state disabled
789
            .omsp_sft_brk.map.r.pmem1.p1    configure -state disabled
790
            .omsp_sft_brk.map.r.core_nr.l2  configure -state disabled
791
            .omsp_sft_brk.map.r.pmem0.p2    configure -state disabled
792
            .omsp_sft_brk.map.r.pmem1.p2    configure -state disabled
793
            .omsp_sft_brk.map.r.pmem2.p2    configure -state disabled
794
            .omsp_sft_brk.map.r.core_nr.l3  configure -state disabled
795
            .omsp_sft_brk.map.r.pmem0.p3    configure -state disabled
796
            .omsp_sft_brk.map.r.pmem1.p3    configure -state disabled
797
            .omsp_sft_brk.map.r.pmem2.p3    configure -state disabled
798
            .omsp_sft_brk.map.r.pmem3.p3    configure -state disabled
799
        }
800
    }
801
}
802
 
803
proc setMemMapping {core0 core1 core2 core3} {
804
 
805
    global mem_mapping
806
    global omsp_nr
807
 
808
    set mem_mapping(0) $core0
809
    if {$omsp_nr > 1} {
810
        set mem_mapping(1) $core1
811
    }
812
    if {$omsp_nr > 2} {
813
        set mem_mapping(2) $core2
814
    }
815
    if {$omsp_nr > 3} {
816
        set mem_mapping(3) $core3
817
    }
818
}

powered by: WebSVN 2.1.0

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