📄 pm5337_eos_eapo.tcl
字号:
set addr_0xE808 [dec2hex [expr 0xE808 + ($dir * 0x200)]]
set addr_0xE809 [dec2hex [expr 0xE809 + ($dir * 0x200)]]
set addr_0xE80A [dec2hex [expr 0xE80A + ($dir * 0x200)]]
set addr_0xE80B [dec2hex [expr 0xE80B + ($dir * 0x200)]]
set addr_0xE869 [dec2hex [expr 0xE869 + ($dir * 0x200)]]
set addr_0xE86A [dec2hex [expr 0xE86A + ($dir * 0x200)]]
set addr_0xE86B [dec2hex [expr 0xE86B + ($dir * 0x200)]]
set addr_0xE86C [dec2hex [expr 0xE86C + ($dir * 0x200)]]
set addr_0xE86D [dec2hex [expr 0xE86D + ($dir * 0x200)]]
### Configure header filters start position and mask ###
# a) Write value to indirect data register
# Set dst2 + hfindex2 + src2 + value2[47:39] to IND_DATA3 (Bit 127 to 96)
set word [expr ($dst2<< 15)|(0x1<<13)|($hfindex2<<12)|($src2<<9)|[imask $value2 47 39]]
admwr $devID $addr_0xE869 $word
# Set value2[38:7] to IND_DATA2(Bit 95 to 64)
admwr $devID $addr_0xE86A [imask $value2 38 7]
# Set value2[6:0] + dst1 + hfindex1 + src1 + value1[47:32] to IND_DATA1 (Bit 63 to 32)
set word [expr ([imask $value2 6 0] << 25)|($dst1<<22)|(0x1<<20)|($hfindex1<<19)|($src1<<16)|[imask $value1 47 32]]
admwr $devID $addr_0xE86B $word
# Set value1[31:0] to IND_DATA0 (Bit 31 to 0)
admwr $devID $addr_0xE86C [imask $value1 31 0]
# b) Write value to indirect address register
set BUSY_ING 1
set BUSY_EGR 0
set RWB 0
set IND_ADDR [expr 0x0A0 + 0x1 * ($index_n - 1) ]
set iaddr [expr ($BUSY_ING << 31)|($BUSY_EGR << 30)|($RWB << 29)|$IND_ADDR]
set iaddr [dec2hex $iaddr]
admwr $devID $addr_0xE86D $iaddr
#c) Poll BUSY bit until low
Poll_BUSY_Bit $devID $addr_0xE86D 31
}
#------------------------------------------------------------------------------
# SCRIPT NAME: EOS_Aggregation_Demo
#
# DESCRIPTION: The procedure provides an example on how to configure the
# aggregation feature in the EAPO-E.
#
# PARAMETERS: devID - This parameter is used to specify the device
# under configuration
#
# dir - 0 (Drop direction),
# 1 (Add direction)
#
# incoming - 0 to 7
#
# outgoing - 0 to 7
#
# NOTE:
#
#------------------------------------------------------------------------------
proc EOS_Aggregation_Demo {devID dir incoming outgoing} {
set addr1 [dec2hex [expr 0xE85B + (0x200*$dir)]]
set addr2 [dec2hex [expr 0xE85C + (0x200*$dir)]]
if {$incoming == 0} {
set init_value [rd adm $addr1]
set value [expr ($init_value & 0x7FFFFFF8) | $outgoing ]
set value [dec2hex $value]
admwr $devID $addr1 $value
}
if {$incoming == 1} {
set init_value [rd adm $addr1]
set value [expr ($init_value & 0x7FFFFF1F) | ($outgoing << 5)]
set value [dec2hex $value]
admwr $devID $addr1 $value
}
if {$incoming == 2} {
set init_value [rd adm $addr1]
set value [expr ($init_value & 0x7FFFE3FF) | ($outgoing << 10) ]
set value [dec2hex $value]
admwr $devID $addr1 $value
}
if {$incoming == 3} {
set init_value [rd adm $addr1]
set value [expr ($init_value & 0x7FFA7FFF) | ($outgoing << 15)]
set value [dec2hex $value]
admwr $devID $addr1 $value
}
if {$incoming == 4} {
set init_value [rd adm $addr1]
set value [expr ($init_value & 0x7F8FFFFF) | ($outgoing << 20)]
set value [dec2hex $value]
admwr $devID $addr1 $value
}
if {$incoming == 5} {
set init_value [rd adm $addr1]
set value [expr ($init_value & 0x71FFFFFF) | ($outgoing << 25)]
set value [dec2hex $value]
admwr $devID $addr1 $value
}
if {$incoming == 6} {
set init_value [rd adm $addr2]
set value [expr ($init_value & 0x7FFFFFF8) | $outgoing ]
set value [dec2hex $value]
admwr $devID $addr2 $value
}
if {$incoming == 7} {
set init_value [rd adm $addr2]
set value [expr ($init_value & 0x7FFFFF1F) | ($outgoing << 5)]
set value [dec2hex $value]
admwr $devID $addr2 $value
}
}
#------------------------------------------------------------------------------
# SCRIPT NAME: EAPO_Counter
#
# DESCRIPTION: The procedure provides an example on how use the programmable
# counter in the EAPO block.
#
# PARAMETERS: devID - This parameter is used to specify the device
# under configuration
#
# NOTE:
#
#------------------------------------------------------------------------------
proc EAPO_Counter {devID} {
######################
# EAPO counter
# Configure programmable counter 1
admwr $devID 0xEA62 0x60
# initialize transfer
admwr $devID 0xea68 0x0
# Read counter value
set n 1 ;# counter 1
set indreg [expr 0x190 + 0x1*($n-1)]
set indreg [dec2hex $indreg]
set busy_ing 1
set busy_eg 0
set rwb 1
set addrvalue [expr ($busy_ing << 31)|($busy_eg << 30)|($rwb << 29)|$indreg]
set addrvalue [dec2hex $addrvalue]
admwr $devID 0xEA6D $addrvalue
puts "IND_DATA0 = [admrd $devID 0xEA6C]"
puts "IND_DATA1 = [admrd $devID 0xEA6B]"
puts "IND_DATA2 = [admrd $devID 0xEA6A]"
puts "IND_DATA3 = [admrd $devID 0xEA69]"
}
#------------------------------------------------------------------------------
# SCRIPT NAME: imask
#
# DESCRIPTION: This procedure filter a 64-bit value to a 32-bit value using a
# programmable 32-bit windows.
#
# PARAMETERS: input - 0x0000000000000000 to 0xFFFFFFFFFFFFFFFF
#
# msbpos - Window upper bound: 0 to 63
#
# lsbpos - Window lower bound: 0 to 63
#
# NOTES: The size of the window must be 32-bit.
#
#------------------------------------------------------------------------------
proc imask {input msbpos lsbpos} {
# Check mask size within 32 bit
set masksize [expr $msbpos - $lsbpos]
if {$masksize > 31 || $masksize < 0} {
puts "Error invalid mask size"
}
# Count the number of hex character
set hex_char 1
for {set i 2} {$i <= 17} {incr i} {
set input_i [string index $input $i]
if {$input_i != ""} {
incr hex_char
}
}
# Convert 64 bits input to the mask size
if {$hex_char <= 9} {
set msb 0x0
set lsb $input
}
if {$hex_char == 10} {
# Assign input HEX value to a separate variable
set i2 [string index $input 2]
set i3 [string index $input 3]
set i4 [string index $input 4]
set i5 [string index $input 5 ]
set i6 [string index $input 6 ]
set i7 [string index $input 7 ]
set i8 [string index $input 8 ]
set i9 [string index $input 9 ]
set i10 [string index $input 10]
set lsb "0x$i3$i4$i5$i6$i7$i8$i9$i10"
set msb "0x$i2"
}
if {$hex_char == 11} {
# Assign input HEX value to a separate variable
set i2 [string index $input 2]
set i3 [string index $input 3]
set i4 [string index $input 4]
set i5 [string index $input 5 ]
set i6 [string index $input 6 ]
set i7 [string index $input 7 ]
set i8 [string index $input 8 ]
set i9 [string index $input 9 ]
set i10 [string index $input 10]
set i11 [string index $input 11]
set lsb "0x$i4$i5$i6$i7$i8$i9$i10$i11"
set msb "0x$i2$i3"
}
if {$hex_char == 12} {
# Assign input HEX value to a separate variable
set i2 [string index $input 2]
set i3 [string index $input 3]
set i4 [string index $input 4]
set i5 [string index $input 5]
set i6 [string index $input 6]
set i7 [string index $input 7]
set i8 [string index $input 8]
set i9 [string index $input 9]
set i10 [string index $input 10]
set i11 [string index $input 11]
set i12 [string index $input 12]
set lsb "0x$i5$i6$i7$i8$i9$i10$i11$i12"
set msb "0x$i2$i3$i4"
}
if {$hex_char == 13} {
# Assign input HEX value to a separate variable
set i2 [string index $input 2]
set i3 [string index $input 3]
set i4 [string index $input 4]
set i5 [string index $input 5 ]
set i6 [string index $input 6 ]
set i7 [string index $input 7 ]
set i8 [string index $input 8 ]
set i9 [string index $input 9 ]
set i10 [string index $input 10]
set i11 [string index $input 11]
set i12 [string index $input 12]
set i13 [string index $input 13]
set lsb "0x$i6$i7$i8$i9$i10$i11$i12$i13"
set msb "0x$i2$i3$i4$i5"
}
if {$hex_char == 14} {
# Assign input HEX value to a separate variable
set i2 [string index $input 2]
set i3 [string index $input 3]
set i4 [string index $input 4]
set i5 [string index $input 5 ]
set i6 [string index $input 6 ]
set i7 [string index $input 7 ]
set i8 [string index $input 8 ]
set i9 [string index $input 9 ]
set i10 [string index $input 10]
set i11 [string index $input 11]
set i12 [string index $input 12]
set i13 [string index $input 13]
set i14 [string index $input 14]
set lsb "0x$i7$i8$i9$i10$i11$i12$i13$i14"
set msb "0x$i2$i3$i4$i5$i6"
}
if {$hex_char == 15} {
# Assign input HEX value to a separate variable
set i2 [string index $input 2]
set i3 [string index $input 3]
set i4 [string index $input 4]
set i5 [string index $input 5 ]
set i6 [string index $input 6 ]
set i7 [string index $input 7 ]
set i8 [string index $input 8 ]
set i9 [string index $input 9 ]
set i10 [string index $input 10]
set i11 [string index $input 11]
set i12 [string index $input 12]
set i13 [string index $input 13]
set i14 [string index $input 14]
set i15 [string index $input 15]
set lsb "0x$i8$i9$i10$i11$i12$i13$i14$i15"
set msb "0x$i2$i3$i4$i5$i6$i7"
}
if {$hex_char == 16} {
# Assign input HEX value to a separate variable
set i2 [string index $input 2]
set i3 [string index $input 3]
set i4 [string index $input 4]
set i5 [string index $input 5 ]
set i6 [string index $input 6 ]
set i7 [string index $input 7 ]
set i8 [string index $input 8 ]
set i9 [string index $input 9 ]
set i10 [string index $input 10]
set i11 [string index $input 11]
set i12 [string index $input 12]
set i13 [string index $input 13]
set i14 [string index $input 14]
set i15 [string index $input 15]
set i16 [string index $input 16]
set lsb "0x$i9$i10$i11$i12$i13$i14$i15$i16"
set msb "0x$i2$i3$i4$i5$i6$i7$i8"
}
if {$hex_char == 17} {
# Assign input HEX value to a separate variable
set i2 [string index $input 2]
set i3 [string index $input 3]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -