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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.61/] [tools/] [tcl/] [rutil/] [util.tcl] - Blame information for rev 26

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 25 wfjm
# $Id: util.tcl 569 2014-07-13 14:36:32Z mueller $
2 10 wfjm
#
3 25 wfjm
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4 10 wfjm
#
5
# This program is free software; you may redistribute and/or modify it under
6
# the terms of the GNU General Public License as published by the Free
7
# Software Foundation, either version 2, or at your option any later version.
8
#
9
# This program is distributed in the hope that it will be useful, but
10
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
# for complete details.
13
#
14
#  Revision History:
15
# Date         Rev Version  Comment
16 25 wfjm
# 2014-07-12   569   1.0.2  add sxt16 and sxt32
17 21 wfjm
# 2013-05-09   517   1.0.1  add optlist2arr
18 10 wfjm
# 2011-03-27   374   1.0    Initial version
19
# 2011-03-19   372   0.1    First draft
20
#
21
 
22
package provide rutil 1.0
23
 
24
package require rutiltpp
25
 
26
namespace eval rutil {
27
  #
28 25 wfjm
  # optlist2arr: process options arguments given as key value list -----------
29 21 wfjm
  #
30
  proc optlist2arr {outarrname refarrname optlist} {
31
    upvar $outarrname outarr
32
    upvar $refarrname refarr
33
    array set outarr [array get refarr]
34
    foreach {key value} $optlist {
35
      if {[info exists outarr($key)]} {
36
        set outarr($key) $value
37
      } else {
38
        error "key $key not valid in optlist"
39
      }
40
    }
41
    return ""
42
  }
43
 
44
  #
45 25 wfjm
  # regdsc: setup a register descriptor --------------------------------------
46 10 wfjm
  #
47
  proc regdsc {name args} {
48
    upvar $name rdsc
49
    set fbegmax -1
50
    set mskftot 0
51
 
52
    foreach arg $args {
53
      set nopt [llength $arg]
54
      if {$nopt < 2} {
55
        error "wrong number of elements in field dsc \"$arg\""
56
      }
57
      set fnam [lindex $arg 0]
58
      set fbeg [lindex $arg 1]
59
      set flen [lindex $arg 2]
60
      if {$nopt < 3} { set flen 1 }
61
      set popt [lindex $arg 3]
62
      if {$nopt < 4} { set popt "b" }
63
 
64
      if {( $flen - 1 ) > $fbeg} {
65
        error "error in field dsc \"$arg\": length > start position"
66
      }
67
 
68 21 wfjm
      set mskb [expr {( 1 << $flen ) - 1}]
69
      set mskf [expr {$mskb << ( $fbeg - ( $flen - 1 ) )}]
70 10 wfjm
      set rdsc($fnam) [list $fbeg $flen $mskb $mskf $popt]
71
 
72
      if {$fbegmax < $fbeg} {set fbegmax $fbeg}
73 21 wfjm
      set mskftot [expr {$mskftot | $mskf}]
74 10 wfjm
    }
75
 
76
    set rdsc(-n) [lsort -decreasing -command regdsc_sort \
77
                    [array names rdsc -regexp {^[^-]}] ]
78
 
79 21 wfjm
    set rdsc(-w) [expr {$fbegmax + 1}]
80 10 wfjm
    set rdsc(-m) $mskftot
81
 
82
    return ""
83
  }
84
 
85
  #
86 25 wfjm
  # regdsc_print: print register descriptor ----------------------------------
87 10 wfjm
  #
88
  proc regdsc_print {name} {
89
    upvar $name rdsc
90
    set rval ""
91
    if {! [info exists rdsc]} {
92
      error "can't access \"$name\": variable doesn't exist"
93
    }
94
 
95
    set rsize $rdsc(-w)
96
 
97
    append rval "     field   bits  bitmask"
98
 
99
    foreach fnam $rdsc(-n) {
100
      set fdsc  $rdsc($fnam)
101
      set fbeg  [lindex $fdsc 0]
102
      set flen  [lindex $fdsc 1]
103
      set fmskf [lindex $fdsc 3]
104
      set line "  "
105
      append line [format "%8s" $fnam]
106
      if {$flen > 1} {
107 21 wfjm
        append line [format "  %2d:%2d" $fbeg [expr {$fbeg - $flen + 1}]]
108 10 wfjm
      } else {
109
        append line [format "     %2d" $fbeg]
110
      }
111
      append line "  "
112
      append line [pbvi "b${rsize}" $fmskf]
113
      append rval "\n$line"
114
    }
115
    return $rval
116
  }
117
 
118
  proc regdsc_sort {a b} {
119
    upvar rdsc urdsc
120 21 wfjm
    return [expr {[lindex $urdsc($a) 0] - [lindex $urdsc($b) 0] }]
121 10 wfjm
  }
122
 
123
  #
124 25 wfjm
  # regbld: build a register value from a list of fields ---------------------
125 10 wfjm
  #
126
  proc regbld {name args} {
127
    upvar $name rdsc
128
    set rval 0
129
    foreach arg $args {
130
      if {[llength $arg] < 1 || [llength $arg] > 2} {
131
        error "error in field specifier \"$arg\": must be 'name [val]'"
132
      }
133
      set fnam [lindex $arg 0]
134
      if {! [info exists rdsc($fnam)] } {
135
        error "error in field specifier \"$arg\": field unknown"
136
      }
137
      set fbeg [lindex $rdsc($fnam) 0]
138
      set flen [lindex $rdsc($fnam) 1]
139
 
140
      if {[llength $arg] == 1} {
141
        if {$flen > 1} {
142
          error "error in field specifier \"$arg\": no value and flen>1"
143
        }
144
        set mskf [lindex $rdsc($fnam) 3]
145 21 wfjm
        set rval [expr {$rval | $mskf}]
146 10 wfjm
 
147
      } else {
148
        set fval [lindex $arg 1]
149
        set mskb [lindex $rdsc($fnam) 2]
150
        if {$fval >= 0} {
151
          if {$fval > $mskb} {
152
            error "error in field specifier \"$arg\": value > $mskb"
153
          }
154
        } else {
155 21 wfjm
          if {$fval < [expr {- $mskb}]} {
156 10 wfjm
            error "error in field specifier \"$arg\": value < [expr -$mskb]"
157
          }
158 21 wfjm
          set fval [expr {$fval & $mskb}]
159 10 wfjm
        }
160 21 wfjm
        set rval [expr {$rval | $fval << ( $fbeg - ( $flen - 1 ) )}]
161 10 wfjm
      }
162
 
163
    }
164
    return $rval
165
  }
166
 
167
  #
168 25 wfjm
  # regget: extract field from a register value ------------------------------
169 10 wfjm
  #
170
  proc regget {name val} {
171
    upvar $name fdsc
172
    set fbeg [lindex $fdsc 0]
173
    set flen [lindex $fdsc 1]
174
    set mskb [lindex $fdsc 2]
175 21 wfjm
    return [expr {( $val >> ( $fbeg - ( $flen - 1 ) ) ) & $mskb}]
176 10 wfjm
  }
177
 
178
  #
179 25 wfjm
  # regtxt: convert register value to a text string --------------------------
180 10 wfjm
  #
181
  proc regtxt {name val} {
182
    upvar $name rdsc
183
    set rval ""
184
 
185
    foreach fnam $rdsc(-n) {
186
      set popt [lindex $rdsc($fnam) 4]
187
      set fval [regget rdsc($fnam) $val]
188
      if {$popt ne "-"} {
189
        if {$rval ne ""} {append rval " "}
190
        append rval "${fnam}:"
191
        if {$popt eq "b"} {
192
          set flen [lindex $rdsc($fnam) 1]
193
          append rval [pbvi b${flen} $fval]
194
        } else {
195
          append rval [format "%${popt}" $fval]
196
        }
197
      }
198
    }
199
    return $rval
200
  }
201
  #
202 25 wfjm
  # errcnt2txt: returns "PASS" if 0 and "FAIL" otherwise ---------------------
203 10 wfjm
  #
204
  proc errcnt2txt {errcnt} {
205
    if {$errcnt} {return "FAIL"}
206
    return "PASS"
207
  }
208 25 wfjm
  #
209
  # sxt16: 16 bit sign extend ------------------------------------------------
210
  #
211
  proc sxt16 {val} {
212
    if {$val & 0x8000} {                    # bit 15 set ?
213
      set val [expr $val | ~ 077777];       # --> set bits 15 and higher
214
    }
215
    return $val
216
  }
217 10 wfjm
 
218 25 wfjm
  #
219
  # sxt32: 32 bit sign extend ------------------------------------------------
220
  #
221
  proc sxt32 {val} {
222
    if {$val & 0x80000000} {                # bit 31 set ?
223
      set val [expr $val | ~ 017777777777]; # --> set bits 31 and higher
224
    }
225
    return $val
226
  }
227
 
228
  #
229
  # ! export reg... procs to global scope ------------------------------------
230
  #
231
 
232 10 wfjm
  namespace export regdsc
233
  namespace export regdsc_print
234
  namespace export regbld
235
  namespace export regget
236
  namespace export regtxt
237
}
238
 
239
namespace import rutil::regdsc
240
namespace import rutil::regdsc_print
241
namespace import rutil::regbld
242
namespace import rutil::regget
243
namespace import rutil::regtxt

powered by: WebSVN 2.1.0

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