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

Subversion Repositories sv_dir_tb

[/] [sv_dir_tb/] [trunk/] [tb_gen/] [tb_gen.tcl] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 sckoarn
#! /usr/bin/env wish
2
##-------------------------------------------------------------------------------
3
##                     Copyright 2014 Ken Campbell
4
##
5
##   Licensed under the Apache License, Version 2.0 (the "License");
6
##   you may not use this file except in compliance with the License.
7
##   You may obtain a copy of the License at
8
##
9
##     http://www.apache.org/licenses/LICENSE-2.0
10
##
11
##   Unless required by applicable law or agreed to in writing, software
12
##   distributed under the License is distributed on an "AS IS" BASIS,
13
##   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
##   See the License for the specific language governing permissions and
15
##   limitations under the License.
16
##-------------------------------------------------------------------------------
17
##-- $Author:  $ Ken Campbell
18
##--
19
##-- $Date:  $ June 26 2014
20
##--
21
##-- $Id:  $
22
##--
23
##-- $Source:  $
24
##--
25
##-- Description :
26
##--      This application takes a text file containing the definition of a Verilog
27
##           module, produces a file set for the SV Directed Test Bench.
28
##--
29
##------------------------------------------------------------------------------
30
 
31
## package requires
32
package require Iwidgets 4.0
33
 
34
## set the current version info
35
set version "Beta 1.0"
36
## put up a title on the main window boarder
37
wm title . "SV TB Gen $version"
38
 
39
## the location of the template by default
40
set template "./tb_mod_template.sv"
41
 
42
set use_list 0
43
 
44
##  Working Directory or vhdl directory
45
set workd [frame .wdf]
46
set ent_dir [iwidgets::entryfield $workd.cen1 -labeltext "Working Directory"]
47
button $workd.br0 -text "Browse" -command {fill_list}
48
pack $workd.br0 -side right
49
pack $ent_dir -fill x
50
pack $workd -fill x -pady 6
51
 
52
##  Output directory
53
set tlist [frame .lstf]
54
set odir [iwidgets::entryfield $tlist.ent1 -labeltext "Output Directory"]
55
set lbut [button $tlist.br1 -text "Browse" -command {browsed_from_set $odir $odir}]
56
pack $lbut -side right
57
pack $odir -fill x
58
pack $tlist -fill x
59
 
60
##  Template location
61
set tdirf [frame .tmpf]
62
set tdir [iwidgets::entryfield $tdirf.ent2 -width 60 -labeltext "Template Location"]
63
set tbut [button $tdirf.br2 -text "Browse" -command {browse_set_entry $tdir}]
64
pack $tbut -side right
65
pack $tdir -fill x
66
pack $tdirf -fill x -pady 6
67
$tdir delete 0 end
68
$tdir insert end $template
69
$tdir configure -state readonly
70
 
71
## type spec
72
set tsf [frame .tsfr]
73
set load_but [button $tsf.bt1 -text "Generate" -command ttb_gen]
74
set mo_sel [iwidgets::optionmenu $tsf.mode -labeltext "Mode"]
75
set gbatv 0
76
#set gbat [checkbutton $tsf.chb1 -text "Gen Build Script" -variable gbatv]
77
set cpakv 0
78
#set cpak [checkbutton $tsf.chb2 -text "Copy Package" -variable cpakv]
79
##$mo_sel insert end Work Recurse List
80
$mo_sel insert end "No mod" "Gen mod"
81
set p_view [iwidgets::feedback $tsf.fb1 -labeltext "Generation Status" -barheight 10]
82
set statsVar ""
83
##set stat_txt [label $tsf.lb1 -textvariable statsVar]
84
set stat_txt [label .lb1 -textvariable statsVar]
85
 
86
##   about button
87
button $tsf.bout1 -text "About" -command show_about
88
 
89
#pack $cpak -side left
90
#pack $gbat -side left
91
pack $mo_sel -side left
92
pack $load_but -side left -padx 20
93
pack $p_view -side left
94
pack $tsf.bout1 -side right
95
pack $tsf -fill x
96
pack $stat_txt -fill x
97
 
98
## create paned window
99
set win [iwidgets::panedwindow .pw -width 200 -height 300 ]
100
$win add top -margin 4 -minimum 100
101
$win add middle -margin 4 -minimum 100
102
$win configure -orient vertical
103
$win fraction 80 20
104
$win paneconfigure 1 -minimum 60
105
## create two locations for objects
106
set wtop [$win childsite 0]
107
set wbot [$win childsite 1]
108
pack $win -fill both -expand yes
109
## create two object boxes
110
set list_win [iwidgets::selectionbox $wtop.sb -margin 2 -itemscommand load_ent_file \
111
    -itemslabel "SV Files" -selectionlabel "Selected SV File"]
112
set view_win [iwidgets::scrolledtext $wbot.rts -borderwidth 2 -wrap none]
113
pack $list_win -fill both -expand yes
114
pack $view_win -fill both -expand yes
115
 
116
##  some tags for the view window
117
##$view_win tag configure highlite -background #a0b7ce
118
$view_win tag configure highlite -background grey80
119
 
120
###########################################################################
121
##  some debug and help procs
122
##    Message Error, terminate
123
proc msg_error { msg } {
124
  tk_messageBox -message $msg -type ok
125
  exit
126
}
127
###########################################################################
128
##  Message, continue
129
proc dbg_msg { msg } {
130
  tk_messageBox -message $msg -type ok
131
}
132
#########################################################################
133
##  browse and get directory
134
##    Using extfileselectiondialog get a directory and update the
135
##    field passed to it
136
proc browsed_from_set { src dest } {
137
    set wdir [$src get]
138
    if {$wdir == ""} {
139
        iwidgets::extfileselectiondialog .dsb -modality application -fileson false
140
    } else {
141
        iwidgets::extfileselectiondialog .dsb -modality application -fileson false \
142
        -directory $wdir
143
    }
144
 
145
  if {[.dsb activate]} {
146
      set dchoice [.dsb get]
147
      $dest configure -state normal
148
      $dest delete 0 end
149
      $dest insert 0 "$dchoice"
150
      $dest configure -state readonly
151
  }
152
  destroy .dsb
153
}
154
#########################################################################
155
##  browse and get file name
156
##    Using extfileselectiondialog get a directory and update the
157
##    field passed to it
158
proc browse_set_entry { dest } {
159
iwidgets::extfileselectiondialog .dsb -modality application
160
 
161
  if {[.dsb activate]} {
162
      set dchoice [.dsb get]
163
      $dest configure -state normal
164
      $dest delete 0 end
165
      $dest insert 0 "$dchoice"
166
      $dest configure -state readonly
167
  }
168
  destroy .dsb
169
}
170
##########################################################################
171
##  proc pars_pindef
172
proc pars_pindef { pins } {
173
    set pdef  {}
174
    set def_lst  {}
175
    set lc 0
176
 
177
    set logic_lst {}
178
    set dut_modport {}
179
    set names_lst {}
180
 
181
    foreach l $pins {
182
        set is_mult [string first "," $l]
183
        set is_bv   [string first "\[" $l]
184
        set l [string trim $l "\;"]
185
        ##  if is a vector def
186
        #puts $l
187
        #puts "is_bv:  $is_bv"
188
        if {$is_bv > 0} {
189
            set is_cbv [string first "\]" $l]
190
            set bv_spec [string range $l $is_bv $is_cbv]
191
            set type [string range $l 0 $is_bv-1]
192
            set names [string range $l $is_cbv+1 end]
193
            set snames [split $names ","]
194
            foreach n $snames {
195
                ##set n [string trim $n "\;"]
196
                lappend names_lst [string trim $n]
197
                if {$type != "inout"} {
198
                    set tmp "logic "
199
                } else {
200
                    set tmp "wire "
201
                }
202
                append tmp $bv_spec " [string trim $n]\;"
203
                lappend logic_lst $tmp
204
                set tmp [string trim $type]
205
                append tmp " [string trim $n],"
206
                lappend dut_modport $tmp
207
                #puts "$type $bv_spec [string trim $n]\;"
208
            }
209
        } else {
210
            set sl [split $l ","]
211
            set frst [split [lindex $sl 0]]
212
            set type [string trim [lindex $frst 0]]
213
            set fname [string trim [lindex $frst end]]
214
            set sl [lrange $sl 1 end]
215
            lappend names_lst [string trim $fname]
216
            if {$type != "inout"} {
217
                set tmp "logic "
218
            } else {
219
                set tmp "wire "
220
            }
221
            #set tmp "logic "
222
            append tmp "$fname\;"
223
            lappend logic_lst $tmp
224
            set tmp $type
225
            append tmp " $fname,"
226
            lappend dut_modport $tmp
227
            foreach n $sl {
228
                lappend names_lst [string trim $n]
229
                if {$type != "inout"} {
230
                    set tmp "logic "
231
                } else {
232
                    set tmp "wire "
233
                }
234
                append tmp "[string trim $n]\;"
235
                lappend logic_lst $tmp
236
                set tmp $type
237
                append tmp " [string trim $n],"
238
                lappend dut_modport $tmp
239
            }
240
        }
241
    }
242
 
243
    lappend def_lst $logic_lst
244
    lappend def_lst $dut_modport
245
    lappend def_lst $names_lst
246
 
247
    return $def_lst
248
}
249
##  end pars_pindef
250
 
251
##--------------------------------------------------------------------------------
252
##  Write header to file passed
253
proc write_header { handle } {
254
    global version
255
    ##global scan_date
256
    set raw_date [clock scan now]
257
    set scan_date [clock format $raw_date -format "%d %b %Y %T"]
258
 
259
    ## so CVS will not modify selections, they have to be chopped up
260
    set auth "// \$Auth"
261
    append auth "or:  \$"
262
 
263
    puts $handle "///////////////////////////////////////////////////////////////////////////////"
264
    puts $handle "//             Copyright ///////////////////////////////////"
265
    puts $handle "//                        All Rights Reserved"
266
    puts $handle "///////////////////////////////////////////////////////////////////////////////"
267
    puts $handle "$auth"
268
    puts $handle "//"
269
    puts $handle "//"
270
    puts $handle "// Description :"
271
    puts $handle "//          This file was generated by SV TB Gen $version"
272
    puts $handle "//            on $scan_date"
273
    puts $handle "//////////////////////////////////////////////////////////////////////////////"
274
    puts $handle "// This software contains concepts confidential to ////////////////"
275
    puts $handle "// /////////. and is only made available within the terms of a written"
276
    puts $handle "// agreement."
277
    puts $handle "///////////////////////////////////////////////////////////////////////////////"
278
    puts $handle ""
279
  }
280
 
281
#####################################################################
282
##  A directory has been selected now fill the list win with *V files
283
proc fill_list {} {
284
    global ent_dir odir
285
    global tlist_ent use_list list_win ts_ent statsVar
286
    global view_win mo_sel
287
 
288
    ## get the user selection
289
    browsed_from_set $ent_dir $ent_dir
290
    ## as a default make output dir = input dir
291
    set tmp_dir [$ent_dir get]
292
    $odir delete 0 end
293
    $odir insert end $tmp_dir
294
    $odir configure -state readonly
295
 
296
    ## clear the list window and selection
297
    $list_win clear items
298
    $list_win clear selection
299
    $view_win clear
300
    ## get the working directory
301
    set dir [$ent_dir get]
302
    ## get the list of VHDL files in working directory
303
    set ftype ".*v"
304
    set file_lst ""
305
    set file_lst [glob -directory $dir *$ftype]
306
 
307
    ##  for each of the files in the file_lst
308
    foreach l $file_lst {
309
        ## creat string that is just the file name: no path
310
        set testt $l
311
        set nstart [string last "/" $l]
312
        incr nstart
313
        set name_str [string range $l $nstart end]
314
        ## insert item on list
315
        $list_win insert items 1 $name_str
316
    }
317
}
318
 
319
######################################################################
320
##  load the vhdl file that has just been selected from list_win
321
proc load_ent_file {} {
322
    global ent_dir list_win view_win statsVar
323
 
324
    ## update selection with selected item
325
    $list_win selectitem
326
    set sel_dx [$list_win curselection]
327
    if {$sel_dx == ""} {
328
        return
329
    }
330
    ## recover the selected item
331
    set ln [$list_win get]
332
    ##  Get the working directory
333
    #puts $ln
334
    set lp [$ent_dir get]
335
    ##  append the file name
336
    append lp "/" $ln
337
    ## if the file does not exist  return
338
    set fexist [file exist $lp]
339
    if {$fexist == 0} {
340
        return
341
    }
342
    set ent_file [open $lp r]
343
    ## clear the view_win
344
    $view_win clear
345
    set file_list {}
346
    ## load file to memory
347
    while {![eof $ent_file]} {
348
        ##  Get a line
349
        set rline [gets $ent_file]
350
        lappend file_list $rline
351
    }
352
    close $ent_file
353
    ## put file in text window and highlite the entity part
354
    set ent_found 0
355
    set in_ent 0
356
    set statsVar ""
357
    foreach l $file_list {
358
        if {$in_ent == 0} {
359
            set ent_def [string first module $l]
360
            if {$ent_def >= 0} {
361
                set ent_name [lindex $l 1]
362
                set statsVar "Module:  $ent_name found"
363
                set ent_found 1
364
                set in_ent 1
365
                $view_win insert end "$l\n" highlite
366
            } else {
367
                $view_win insert end "$l\n"
368
        }
369
    } else {
370
        set ent_def [string first "endmodule" $l]
371
        if {$ent_def >= 0} {
372
            set end_name [lindex $l 1]
373
            set end_found 1
374
            set in_ent 0
375
            $view_win insert end "$l\n" highlite
376
        } else {
377
                $view_win insert end "$l\n" highlite
378
        }
379
    }
380
    }
381
    if {$ent_found == 0} {
382
        set statsVar "No Module found!!"
383
    }
384
    ##$view_win import $lp
385
    ##$view_win yview moveto 1
386
    ##puts $lp
387
}
388
 
389
#########################################################################
390
proc ttb_gen {} {
391
    global mo_sel template ent_dir list_win odir p_view tdir
392
    global cpakv gbatv
393
 
394
    set template [$tdir get]
395
 
396
    $p_view configure -steps 7
397
    $p_view reset
398
    ## recover the selected item
399
    set ln [$list_win get]
400
    ##  Get the working directory
401
    #puts $ln
402
    set lp [$ent_dir get]
403
    ##  append the file name
404
    append lp "/" $ln
405
 
406
    set path_text $lp
407
    set destin_text [$odir get]
408
    set infile [open $path_text r]
409
    set file_list {}
410
 
411
 
412
##################################################################
413
##  Read in the file and strip comments as we do
414
    while {![eof $infile]} {
415
        ##  Get a line
416
        set rline [gets $infile]
417
        #puts $rline
418
        ## get rid of white space
419
        set rline [string trim $rline]
420
        ##  Find comment if there
421
        set cindex [string first "//" $rline]
422
        ## if a comment was found at the start of the line
423
        if {$cindex == 0 || $rline == ""} {
424
            continue
425
        ## else was not found so put line in list
426
        } elseif {$cindex > 0} {
427
            #  get rid of trailing comments and trim off spaces
428
            set rline [string trim [string range $rline 0 $cindex-1]]
429
            lappend file_list $rline
430
        } else {
431
            lappend file_list $rline
432
        }
433
    }
434
    close $infile
435
 
436
    $p_view step
437
    ## check for the module def
438
    set mod_name ""
439
    foreach l $file_list {
440
        set mod_def [string first module $l]
441
        if {$mod_def >= 0} {
442
            set ml [split $l]
443
            set mod_name [lindex $l 1]
444
            break
445
        }
446
    }
447
 
448
    #puts "Module name is: $mod_name"
449
    ## if no ent  die
450
    if {$mod_def < 0} {
451
        dbg_msg "A module definition was not found in the file provided."
452
        return
453
        ##  exit
454
    }
455
    $p_view step
456
    set mod_list {}
457
    ## check for end module
458
    foreach l $file_list {
459
        lappend mod_list $l
460
        set end_def [string first endmodule $l]
461
        if {$end_def >= 0} {
462
            break
463
        }
464
    }
465
    ## if no end die
466
    if {$end_def < 0} {
467
        dbg_msg "no endmodule statement found for this module"
468
        return
469
        ##  exit
470
    }
471
    ####
472
    ## collect the parameters if there are.
473
    set parameter_list {}
474
    set p_found 0
475
    foreach l $mod_list {
476
        set p_found [string first "parameter" $l]
477
        if {$p_found >= 0} {
478
            lappend $parameter_list $l
479
        }
480
    }
481
 
482
    #foreach l $mod_list {
483
    #    puts $l
484
    #}
485
    ####################################################################
486
    ##  a few checks have been done, and non-relevant stuff stripped off.
487
    ##  now create an arrry of just the pin names and related info
488
    set port_lst {}
489
    set lc 0
490
    foreach l $mod_list {
491
        ## make lines that are continued, one line.
492
        set cont [string first "\;" $l]
493
        if {$cont < 0 && $lc == 0} {
494
            set tmp $l
495
            set lc 1
496
            continue
497
        } elseif {$cont < 0 && $lc == 1} {
498
            append tmp $l
499
            continue
500
        } elseif {$lc == 1} {
501
            append tmp $l
502
            set lc 0
503
            set l $tmp
504
        }
505
 
506
        ## look for the port statements
507
        set inp [string first "input" $l]
508
        if {$inp >= 0} {
509
            lappend port_lst $l
510
        }
511
        set onp [string first "output" $l]
512
        if {$onp >= 0} {
513
            lappend port_lst $l
514
        }
515
        set ionp [string first "inout" $l]
516
        if {$ionp >= 0} {
517
            lappend port_lst $l
518
        }
519
    }
520
 
521
    #foreach p $port_lst {
522
    #    puts $p
523
    #}
524
    ##  Change the port list into a pin info list
525
    set io_pins [pars_pindef $port_lst]
526
 
527
    set log_lst [lindex $io_pins 0]
528
    set mod_lst [lindex $io_pins 1]
529
    set name_lst [lindex $io_pins 2]
530
 
531
    #foreach r $log_lst {
532
    #    puts $r
533
    #}
534
    #foreach r $mod_lst {
535
    #    puts $r
536
    #}
537
    #foreach r $name_lst {
538
    #    puts $r
539
    #}
540
 
541
 
542
    # dbg_msg $split_pin
543
    ## calculate the longest pin name in characters
544
    set name_length 0
545
    foreach l $name_lst {
546
        set temp_length [string length $l]
547
        if {$temp_length > $name_length} {
548
            set name_length $temp_length
549
        }
550
    }
551
    #dbg_msg $name_length
552
    ##  Make the name length one bigger
553
    incr name_length
554
 
555
    $p_view step
556
#########################################################################
557
## Generate the tb top.
558
    set tfn $destin_text
559
    append tfn "/tb_top.sv"
560
    set tfh [open $tfn w]
561
 
562
    write_header $tfh
563
    puts $tfh "`include \"../sv/tb_prg.sv\""
564
    puts $tfh ""
565
    puts $tfh "module tb_top \(\)\;"
566
    puts $tfh ""
567
    puts $tfh "  string STM_FILE = \"../stm/stimulus_file.stm\"\;"
568
    puts $tfh "  string tmp_fn"
569
    puts $tfh ""
570
    puts $tfh "  //  Handle plus args"
571
    puts $tfh "  initial begin : file_select"
572
    puts $tfh "    if\(\$value\$plusargs\(\"STM_FILE=%s\", tmp_fn\)\) begin"
573
    puts $tfh "      stm_file = tmp_fn\;"
574
    puts $tfh "    end"
575
    puts $tfh "  end"
576
    puts $tfh ""
577
    puts $tfh "  dut_if theif\(\)\;"
578
    puts $tfh ""
579
    puts $tfh "  $mod_name u1 \("
580
 
581
    set llen [llength $name_lst]
582
    set idx 1
583
    foreach n $name_lst {
584
        set ln $n
585
        set len [string length $ln]
586
        while {$len < $name_length} {
587
            append ln " "
588
            set len [string length $ln]
589
        }
590
        if {$idx < $llen} {
591
            puts $tfh "    .$ln \(theif.$n\),"
592
        } else {
593
            puts $tfh "    .$ln \(theif.$n\)"
594
        }
595
        incr idx
596
    }
597
 
598
    puts $tfh "  \)\;"
599
    puts $tfh ""
600
    puts $tfh "  tb_mod prg_inst\(theif\)\;"
601
    puts $tfh ""
602
    puts $tfh "endmodule"
603
 
604
    close $tfh
605
############################################################################
606
##  generate the interface file.
607
    set ifn $destin_text
608
    append ifn "/dut_if.sv"
609
    set ifh [open $ifn w]
610
 
611
    write_header $ifh
612
    puts $ifh "interface dut_if\(\)\;"
613
    puts $ifh ""
614
    foreach l $log_lst {
615
        puts $ifh "  $l"
616
    }
617
 
618
    puts $ifh ""
619
    puts $ifh "  modport dut_conn\("
620
    set llen [llength $mod_lst]
621
    set idx 1
622
    foreach p $mod_lst {
623
        if {$idx < $llen} {
624
            puts $ifh "    $p"
625
        } else {
626
            puts $ifh "    [string trim $p ","]"
627
        }
628
        incr idx
629
    }
630
    puts $ifh "  \)\;"
631
    puts $ifh ""
632
    puts $ifh "  modport tb_conn\("
633
    set idx 1
634
    foreach p $mod_lst {
635
        set in [string first "input" $p]
636
        set out [string first "output" $p]
637
        if {$in >= 0} {
638
            set type "output  "
639
        } elseif {$out >= 0} {
640
            set type "input   "
641
        } else {
642
            set type "inout   "
643
        }
644
 
645
        set sp [split $p]
646
        if {$idx < $llen} {
647
            puts $ifh "    $type [lindex $sp end]"
648
        } else {
649
            puts $ifh "    $type [string trim [lindex $sp end] ","]"
650
        }
651
        incr idx
652
    }
653
    puts $ifh "  \)\;"
654
    puts $ifh ""
655
    puts $ifh "endinterface"
656
    close $ifh
657
 
658
##########################################################################
659
##   generate the tb_prg  file from template.
660
    set prg_gen [$mo_sel get]
661
    if {$prg_gen == "No mod"} {
662
                    return
663
                }
664
    set tpl_fh [open $template r]
665
    set tpl_lst {}
666
    set hfound 0
667
    while {![eof $tpl_fh]} {
668
        set rline [gets $tpl_fh]
669
        if {$hfound == 0} {
670
            set head [string first ">>header" $rline]
671
            if {$head == 0} {
672
                set hfound 1
673
            }
674
        } else {
675
            lappend tpl_lst $rline
676
        }
677
    }
678
 
679
    #foreach l $tpl_lst {
680
    #    puts  $l
681
    #}
682
 
683
    set pfn $destin_text
684
    append pfn "/tb_mod.sv"
685
    set pfh [open $pfn w]
686
 
687
    set idx 0
688
    foreach l $tpl_lst {
689
        set ent_pt [string first ">>insert sigs" $l]
690
        if {$ent_pt == 0} {
691
            set tpl_lst [lreplace $tpl_lst $idx $idx]
692
            foreach l $log_lst {
693
                set tpl_lst [linsert $tpl_lst $idx "  $l"]
694
                incr $idx
695
            }
696
            break
697
        }
698
        incr idx
699
    }
700
 
701
    set idx 0
702
    foreach l $tpl_lst {
703
        set ent_pt [string first ">>drive sigs" $l]
704
        if {$ent_pt == 0} {
705
            set tpl_lst [lreplace $tpl_lst $idx $idx]
706
            set midx 0
707
            foreach l $name_lst {
708
                set dir [lindex $mod_lst $midx]
709
                #puts $dir
710
                set idir [string first "input" $dir]
711
                if {$idir >= 0} {
712
                    set tmp "  assign tif."
713
                    append tmp "$l = $l\;"
714
                    set tpl_lst [linsert $tpl_lst $idx $tmp]
715
                } else {
716
                    set tmp "  assign $l"
717
                    append tmp " = tif.$l\;"
718
                    set tpl_lst [linsert $tpl_lst $idx $tmp]
719
                }
720
                incr idx
721
                incr midx
722
            }
723
            break
724
        }
725
        incr idx
726
    }
727
 
728
    write_header $pfh
729
    #foreach l $tpl_lst {
730
    #    puts $pfh $l
731
    #}
732
 
733
    close $pfh
734
}
735
## end ttb_gen
736
#################################################
737
##  show  about message
738
proc show_about {} {
739
    global version
740
 
741
                set msg "Copyright 2014 Ken Campbell\n
742
Version $version\n
743
Licensed under the Apache License, Version 2.0 (the \"License\"); You may not use this file except in compliance with the License. You may obtain a copy of the License at\n
744
http://www.apache.org/licenses/LICENSE-2.0\n
745
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
746
See the License for the specific language governing permissions and limitations under the License."
747
 
748
    dbg_msg $msg
749
}
750
 
751
## enable pop up console for debug
752
bind . <F12> {catch {console show}}

powered by: WebSVN 2.1.0

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