# +-----------------------------------
# | module avalon_stream_splitter
# | 
set_module_property DESCRIPTION "Stream Splitter"
set_module_property NAME avalon_stream_splitter
set_module_property VERSION 1.0
set_module_property INTERNAL false
set_module_property GROUP "IP Cores"
set_module_property AUTHOR "GW"
set_module_property DISPLAY_NAME avalon_stream_splitter
set_module_property LIBRARIES {ieee.std_logic_1164.all ieee.numeric_std.all std.standard.all}
set_module_property TOP_LEVEL_HDL_FILE avalon_stream_splitter.vhd
set_module_property TOP_LEVEL_HDL_MODULE avalon_stream_splitter
set_module_property INSTANTIATE_IN_SYSTEM_MODULE true
set_module_property EDITABLE true

set_module_property VALIDATION_CALLBACK my_validation_callback
set_module_property ELABORATION_CALLBACK my_elaboration_callback
# | 
# +-----------------------------------

# +-----------------------------------
# | files
# | 
add_file avalon_stream_splitter.vhd {SYNTHESIS SIMULATION}
# | 
# +-----------------------------------

# +-----------------------------------
# | parameters
# | 

add_parameter BitsPerSymbol NATURAL 8 "Bits Per Symbol"
set_parameter_property BitsPerSymbol DISPLAY_NAME "Bits Per Symbol"
set_parameter_property BitsPerSymbol UNITS None
set_parameter_property BitsPerSymbol DISPLAY_HINT ""
set_parameter_property BitsPerSymbol AFFECTS_GENERATION true
set_parameter_property BitsPerSymbol IS_HDL_PARAMETER true

add_parameter SymbolsPerBeat NATURAL 3 "Symbols Per Beat"
set_parameter_property SymbolsPerBeat DISPLAY_NAME "Symbols Per Beat"
set_parameter_property SymbolsPerBeat UNITS None
set_parameter_property SymbolsPerBeat DISPLAY_HINT ""
set_parameter_property SymbolsPerBeat AFFECTS_GENERATION true
set_parameter_property SymbolsPerBeat IS_HDL_PARAMETER true

add_parameter PIXEL_BW POSITIVE 8
set_parameter_property PIXEL_BW DISPLAY_NAME PIXEL_BW
set_parameter_property PIXEL_BW UNITS None
set_parameter_property PIXEL_BW DISPLAY_HINT ""
set_parameter_property PIXEL_BW AFFECTS_GENERATION false
set_parameter_property PIXEL_BW IS_HDL_PARAMETER true
set_parameter_property PIXEL_BW ENABLED false

add_parameter NUM_OUTPUTS POSITIVE 3
set_parameter_property NUM_OUTPUTS DISPLAY_NAME NUM_OUTPUTS
set_parameter_property NUM_OUTPUTS UNITS None
set_parameter_property NUM_OUTPUTS DISPLAY_HINT ""
set_parameter_property NUM_OUTPUTS AFFECTS_GENERATION false
set_parameter_property NUM_OUTPUTS IS_HDL_PARAMETER true


# | 
# +-----------------------------------

# +-----------------------------------
# | connection point clock_reset
# | 
add_interface clock_reset clock end
set_interface_property clock_reset ptfSchematicName ""

set_interface_property clock_reset ENABLED true

add_interface_port clock_reset csi_reset reset Input 1
add_interface_port clock_reset csi_clk clk Input 1
# | 
# +-----------------------------------

# +-----------------------------------
# | connection point avalon_streaming_sink_0
# | 
add_interface avalon_streaming_sink_0 avalon_streaming end
set_interface_property avalon_streaming_sink_0 errorDescriptor ""
set_interface_property avalon_streaming_sink_0 maxChannel 0
set_interface_property avalon_streaming_sink_0 readyLatency 1

set_interface_property avalon_streaming_sink_0 ASSOCIATED_CLOCK clock_reset
set_interface_property avalon_streaming_sink_0 ENABLED true

add_interface_port avalon_streaming_sink_0 asi_ready ready Output 1
add_interface_port avalon_streaming_sink_0 asi_valid valid Input 1
add_interface_port avalon_streaming_sink_0 asi_startofpacket startofpacket Input 1
add_interface_port avalon_streaming_sink_0 asi_endofpacket endofpacket Input 1
# | 
# +-----------------------------------

# +-----------------------------------
# | connection point avalon_streaming_source_0
# | 
##add_interface avalon_streaming_source_0 avalon_streaming start
##set_interface_property avalon_streaming_source_0 dataBitsPerSymbol 8
##set_interface_property avalon_streaming_source_0 errorDescriptor ""
##set_interface_property avalon_streaming_source_0 maxChannel 0
##set_interface_property avalon_streaming_source_0 readyLatency 1
##set_interface_property avalon_streaming_source_0 symbolsPerBeat 1

##set_interface_property avalon_streaming_source_0 ASSOCIATED_CLOCK clock_reset
##set_interface_property avalon_streaming_source_0 ENABLED true

##add_interface_port avalon_streaming_source_0 aso_ready ready Input -1
##add_interface_port avalon_streaming_source_0 aso_valid valid Output -1
##add_interface_port avalon_streaming_source_0 aso_data data Output -1
##add_interface_port avalon_streaming_source_0 aso_startofpacket startofpacket Output -1
##add_interface_port avalon_streaming_source_0 aso_endofpacket endofpacket Output -1
# | 
# +-----------------------------------

proc my_validation_callback {} {
    set bps [get_parameter_value BitsPerSymbol]
    set spb [get_parameter_value SymbolsPerBeat]

    set_parameter_value PIXEL_BW [expr $bps * $spb]

}

proc my_elaboration_callback {} {
    # Get the current value of parameters we care about
    set pbw [get_parameter_value PIXEL_BW]
    set bps [get_parameter_value BitsPerSymbol]
    set spb [get_parameter_value SymbolsPerBeat]

    add_interface_port avalon_streaming_sink_0 asi_data data Input $pbw
    set_interface_property avalon_streaming_sink_0 symbolsPerBeat $spb
    set_interface_property avalon_streaming_sink_0 dataBitsPerSymbol $bps

    set no [get_parameter_value NUM_OUTPUTS]
    set prefix "avalon_streaming_source_"


    for { set i 0 } { $i < $no } { incr i } {
	set name [list $prefix$i]
	add_interface $name avalon_streaming start
	set_interface_property $name dataBitsPerSymbol $bps
	set_interface_property $name errorDescriptor ""
	set_interface_property $name maxChannel 0
	set_interface_property $name readyLatency 1
	set_interface_property $name symbolsPerBeat $spb
    
	set_interface_property $name ASSOCIATED_CLOCK clock_reset
	set_interface_property $name ENABLED true

	set upper [expr (($i + 1) * $pbw) - 1]
	set lower [expr $i * $pbw]
	add_interface_port $name [list "aso_ready(" $i ")"] ready Input 1
	add_interface_port $name [list "aso_valid(" $i ")"] valid Output 1
	add_interface_port $name [list "aso_data(" $upper "downto" $lower ")"] data Output $pbw
	add_interface_port $name [list "aso_startofpacket(" $i ")"] startofpacket Output 1
	add_interface_port $name [list "aso_endofpacket(" $i ")"] endofpacket Output 1
    }
}
