You've already forked gitified_old_clb_svn
93 lines
3.4 KiB
Tcl
93 lines
3.4 KiB
Tcl
###############################################################################
|
|
# mem2ldr.tcl 03-Dec-2012
|
|
# $1 The first paramter is the filename to be used for input and output
|
|
|
|
# The names of the input MEM file and the output LDR file:
|
|
puts "MEM input file name = [set mem_file "$1.mem"]"
|
|
puts "LDR output file name = [set ldr_file "$1.ldr"]"
|
|
|
|
# The format used by the White Rabbit community (memory_loader_pkg.vhd)
|
|
# is "write addr data" for example:
|
|
# write 0 2F2F204D
|
|
# write 1 454D2066
|
|
# write 2 696C652E
|
|
|
|
puts "LDR file word length = [set wordlength 32] bits"
|
|
|
|
###############################################################################
|
|
|
|
set addr_ptr 0
|
|
|
|
if {[file exists $mem_file]} {
|
|
set mem_fileptr [open $mem_file]
|
|
set ldr_fileptr [open $ldr_file w]
|
|
set lineCount 0
|
|
while {[gets $mem_fileptr line] >= 0} {
|
|
set lineElements [llength $line]
|
|
# Skip empty and comment lines (preceeded by "//")
|
|
if { $lineElements != 0 && [lindex $line 0] != "//"} {
|
|
for {set x 0} {$x < $lineElements} {incr x} {
|
|
set lineElem [lindex $line $x]
|
|
|
|
# Addresses are preceeded with a "@" character
|
|
if { [string index $lineElem 0] == "@"} {
|
|
set addr [scan $lineElem "@%x"]
|
|
# If the LDR file address pointer did not yet reach the addresses value
|
|
# in the MEM file yhen fill the LDR file with "0" until the LDR file
|
|
# address pointer is lined up.
|
|
while {$addr_ptr < $addr} {
|
|
set ldrline "write "
|
|
append ldrline [format "%x" $addr_ptr]
|
|
append ldrline " "
|
|
append ldrline [format "%08x" 0]
|
|
puts $ldr_fileptr $ldrline
|
|
incr addr_ptr
|
|
}
|
|
|
|
} else {
|
|
|
|
# Scan a byte from the MEM file
|
|
# every modulo wordlength/8 bytes a new address is written
|
|
if { $x % int($wordlength/8) == 0} {
|
|
set ldrline "write "
|
|
append ldrline [format "%x" $addr_ptr]
|
|
append ldrline " "
|
|
}
|
|
append ldrline [format "%02x" [scan $lineElem "%x"]]
|
|
|
|
# If this is the last line element then...
|
|
if { $x == $lineElements - 1} {
|
|
# check wether all bytes were read from the LDR line
|
|
# i.e. the byte pointer points to the last byte of the word
|
|
if { $x % int($wordlength/8) != int($wordlength/8)- 1} {
|
|
puts $ldr_fileptr "Warning: word length and bytes per line ($lineElements) are inconsistent!"
|
|
puts "Warning: word length and bytes per line ($lineElements) are inconsistent!"
|
|
}
|
|
}
|
|
# when all bytes are scanned then write them to file
|
|
if { $x % int($wordlength/8) == int($wordlength/8)- 1} {
|
|
puts $ldr_fileptr $ldrline
|
|
incr addr_ptr
|
|
}
|
|
}
|
|
}
|
|
# # Check wether there are bytes read but the last word is not yet complete
|
|
# # and the left-over bytes should be padded with eight "0" bits
|
|
# if {$byte_ptr != 0} {
|
|
# for {set padding $byte_ptr} {$padding < [expr (int($wordlength/8))]} {incr padding} {
|
|
# append ldrline "00000000"
|
|
# }
|
|
# puts $ldr_fileptr $ldrline
|
|
# set addr_ptr [expr ($addr_ptr + int($wordlength/8))]
|
|
# }
|
|
}
|
|
}
|
|
close $mem_fileptr
|
|
close $ldr_fileptr
|
|
} else {
|
|
puts "WARNING $mem_file not found..."
|
|
}
|
|
|
|
###############################################################################
|
|
|