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 3

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 3 sckoarn
set version "Beta 1.1"
36 2 sckoarn
## 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 3 sckoarn
    $p_view step
606 2 sckoarn
############################################################################
607
##  generate the interface file.
608
    set ifn $destin_text
609
    append ifn "/dut_if.sv"
610
    set ifh [open $ifn w]
611
 
612
    write_header $ifh
613
    puts $ifh "interface dut_if\(\)\;"
614
    puts $ifh ""
615
    foreach l $log_lst {
616
        puts $ifh "  $l"
617
    }
618
 
619
    puts $ifh ""
620
    puts $ifh "  modport dut_conn\("
621
    set llen [llength $mod_lst]
622
    set idx 1
623
    foreach p $mod_lst {
624
        if {$idx < $llen} {
625
            puts $ifh "    $p"
626
        } else {
627
            puts $ifh "    [string trim $p ","]"
628
        }
629
        incr idx
630
    }
631
    puts $ifh "  \)\;"
632
    puts $ifh ""
633
    puts $ifh "  modport tb_conn\("
634
    set idx 1
635
    foreach p $mod_lst {
636
        set in [string first "input" $p]
637
        set out [string first "output" $p]
638
        if {$in >= 0} {
639
            set type "output  "
640
        } elseif {$out >= 0} {
641
            set type "input   "
642
        } else {
643
            set type "inout   "
644
        }
645
 
646
        set sp [split $p]
647
        if {$idx < $llen} {
648
            puts $ifh "    $type [lindex $sp end]"
649
        } else {
650
            puts $ifh "    $type [string trim [lindex $sp end] ","]"
651
        }
652
        incr idx
653
    }
654
    puts $ifh "  \)\;"
655
    puts $ifh ""
656
    puts $ifh "endinterface"
657
    close $ifh
658
 
659 3 sckoarn
    $p_view step
660 2 sckoarn
##########################################################################
661
##   generate the tb_prg  file from template.
662
    set prg_gen [$mo_sel get]
663
    if {$prg_gen == "No mod"} {
664 3 sckoarn
        $p_view step
665
        $p_view step
666
                return
667
    }
668 2 sckoarn
    set tpl_fh [open $template r]
669
    set tpl_lst {}
670
    set hfound 0
671
    while {![eof $tpl_fh]} {
672
        set rline [gets $tpl_fh]
673
        if {$hfound == 0} {
674
            set head [string first ">>header" $rline]
675
            if {$head == 0} {
676
                set hfound 1
677
            }
678
        } else {
679
            lappend tpl_lst $rline
680
        }
681
    }
682
 
683
    #foreach l $tpl_lst {
684
    #    puts  $l
685
    #}
686
 
687
    set pfn $destin_text
688
    append pfn "/tb_mod.sv"
689
    set pfh [open $pfn w]
690
 
691
    set idx 0
692
    foreach l $tpl_lst {
693
        set ent_pt [string first ">>insert sigs" $l]
694
        if {$ent_pt == 0} {
695
            set tpl_lst [lreplace $tpl_lst $idx $idx]
696
            foreach l $log_lst {
697
                set tpl_lst [linsert $tpl_lst $idx "  $l"]
698
                incr $idx
699
            }
700
            break
701
        }
702
        incr idx
703
    }
704
 
705 3 sckoarn
    #foreach l $tpl_lst {
706
    #    puts  $l
707
    #}
708
 
709
 
710
    $p_view step
711 2 sckoarn
    set idx 0
712
    foreach l $tpl_lst {
713
        set ent_pt [string first ">>drive sigs" $l]
714
        if {$ent_pt == 0} {
715
            set tpl_lst [lreplace $tpl_lst $idx $idx]
716
            set midx 0
717
            foreach l $name_lst {
718
                set dir [lindex $mod_lst $midx]
719
                #puts $dir
720
                set idir [string first "input" $dir]
721
                if {$idir >= 0} {
722
                    set tmp "  assign tif."
723
                    append tmp "$l = $l\;"
724
                    set tpl_lst [linsert $tpl_lst $idx $tmp]
725
                } else {
726
                    set tmp "  assign $l"
727
                    append tmp " = tif.$l\;"
728
                    set tpl_lst [linsert $tpl_lst $idx $tmp]
729
                }
730
                incr idx
731
                incr midx
732
            }
733
            break
734
        }
735
        incr idx
736
    }
737
 
738
    write_header $pfh
739 3 sckoarn
    foreach l $tpl_lst {
740
        puts $pfh $l
741
    }
742 2 sckoarn
 
743 3 sckoarn
    $p_view step
744 2 sckoarn
    close $pfh
745
}
746
## end ttb_gen
747
#################################################
748
##  show  about message
749
proc show_about {} {
750
    global version
751 3 sckoarn
 
752 2 sckoarn
                set msg "Copyright 2014 Ken Campbell\n
753
Version $version\n
754
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
755
http://www.apache.org/licenses/LICENSE-2.0\n
756
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.
757
See the License for the specific language governing permissions and limitations under the License."
758
 
759
    dbg_msg $msg
760
}
761
 
762
## enable pop up console for debug
763
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.