pub function dispatch_binary::<N: p32, T: type> (
sel : input logic<selector_pkg::calc_binary_select_width(N)>,
data : input T ,
default_data: input T ,
) -> T<N> {
var result: T<N>;
for i in 0..N {
result[i] = default_data;
}
result[sel] = data;
return result;
}
pub function dispatch_vector::<N: p32, T: type> (
sel : input logic<N>,
data : input T ,
default_data: input T ,
) -> T<N> {
var result: T<N>;
for i in 0..N {
if sel[i] {
result[i] = data;
} else {
result[i] = default_data;
}
}
return result;
}
pub function dispatch::<KIND: selector_pkg::selector_kind, N: p32, T: type> (
sel : input logic<selector_pkg::calc_select_width(N, KIND)>,
data : input T ,
default_data: input T ,
) -> T<N> {
const BINARY_SEL_WIDTH: u32 = selector_pkg::calc_binary_select_width(N);
if KIND == selector_pkg::selector_kind::BINARY {
return dispatch_binary::<N, T>(sel as BINARY_SEL_WIDTH, data, default_data);
} else {
return dispatch_vector::<N, T>(sel as N, data, default_data);
}
}
pub module demux #(
param WIDTH : u32 = 1 ,
param DATA_TYPE : type = logic<WIDTH> ,
param DEFUALT_DATA: DATA_TYPE = 0 as DATA_TYPE ,
param ENTRIES : u32 = 2 ,
param KIND : selector_kind = selector_kind::BINARY ,
param SELECT_WIDTH: u32 = calc_select_width(ENTRIES, KIND),
) (
i_select: input logic <SELECT_WIDTH>,
i_data : input DATA_TYPE ,
o_data : output DATA_TYPE<ENTRIES> ,
) {
import selector_pkg::*;
always_comb {
o_data = dispatch::<KIND, ENTRIES, DATA_TYPE>(i_select, i_data, DEFUALT_DATA);
}
}