use crate::{lanes_x_row, AirSlot};
use zisk_pil::{
BinaryAddHiHugeTrace, BinaryAddHiLargeTrace, BinaryAddHiTrace, BinaryAddHugeTrace,
BinaryAddLargeTrace, BinaryAddTrace, BinaryExtensionLargeTrace, BinaryExtensionTrace,
BinaryHugeTrace, BinaryLargeTrace, BinaryTrace,
};
pub const ADD_KINDS: usize = 5;
pub const KIND_BASIC: usize = 0;
pub const KIND_ADD_HI: usize = 1;
pub const KIND_ADD_FULL: usize = 2;
pub const KIND_SH3ADD_HI: usize = 3;
pub const KIND_SH3ADD_ADD: usize = 4;
pub const EXT_KINDS: usize = 1;
pub const KIND_EXT: usize = 0;
pub const ADD_AIRS: usize = 9;
pub const EXT_AIRS: usize = 2;
pub fn add_family(instances: [u64; ADD_AIRS]) -> [AirSlot<ADD_KINDS>; ADD_AIRS] {
let packed = |airgroup_id, air_id, ops_per_instance, instances| AirSlot {
airgroup_id,
air_id,
ops_per_instance,
proves: [false, true, false, true, false],
sees: [false, true, true, true, true],
instances,
};
let add = |airgroup_id, air_id, ops_per_instance, instances| AirSlot {
airgroup_id,
air_id,
ops_per_instance,
proves: [false, true, true, true, true],
sees: [false, true, true, true, true],
instances,
};
let basic = |airgroup_id, air_id, ops_per_instance, instances| AirSlot {
airgroup_id,
air_id,
ops_per_instance,
proves: [true, true, true, true, true],
sees: [true, true, true, true, true],
instances,
};
let ops = |rows: usize, lanes: usize| (rows * lanes) as u64;
[
packed(
BinaryAddHiHugeTrace::<()>::AIRGROUP_ID,
BinaryAddHiHugeTrace::<()>::AIR_ID,
ops(BinaryAddHiHugeTrace::<()>::NUM_ROWS, lanes_x_row::ADD_HI_HUGE),
instances[0],
),
packed(
BinaryAddHiLargeTrace::<()>::AIRGROUP_ID,
BinaryAddHiLargeTrace::<()>::AIR_ID,
ops(BinaryAddHiLargeTrace::<()>::NUM_ROWS, lanes_x_row::ADD_HI_LARGE),
instances[1],
),
packed(
BinaryAddHiTrace::<()>::AIRGROUP_ID,
BinaryAddHiTrace::<()>::AIR_ID,
ops(BinaryAddHiTrace::<()>::NUM_ROWS, lanes_x_row::ADD_HI),
instances[2],
),
add(
BinaryAddHugeTrace::<()>::AIRGROUP_ID,
BinaryAddHugeTrace::<()>::AIR_ID,
ops(BinaryAddHugeTrace::<()>::NUM_ROWS, lanes_x_row::ADD_HUGE),
instances[3],
),
add(
BinaryAddLargeTrace::<()>::AIRGROUP_ID,
BinaryAddLargeTrace::<()>::AIR_ID,
ops(BinaryAddLargeTrace::<()>::NUM_ROWS, lanes_x_row::ADD_LARGE),
instances[4],
),
add(
BinaryAddTrace::<()>::AIRGROUP_ID,
BinaryAddTrace::<()>::AIR_ID,
ops(BinaryAddTrace::<()>::NUM_ROWS, lanes_x_row::ADD),
instances[5],
),
basic(
BinaryHugeTrace::<()>::AIRGROUP_ID,
BinaryHugeTrace::<()>::AIR_ID,
ops(BinaryHugeTrace::<()>::NUM_ROWS, lanes_x_row::BASIC_HUGE),
instances[6],
),
basic(
BinaryLargeTrace::<()>::AIRGROUP_ID,
BinaryLargeTrace::<()>::AIR_ID,
ops(BinaryLargeTrace::<()>::NUM_ROWS, lanes_x_row::BASIC_LARGE),
instances[7],
),
basic(
BinaryTrace::<()>::AIRGROUP_ID,
BinaryTrace::<()>::AIR_ID,
ops(BinaryTrace::<()>::NUM_ROWS, lanes_x_row::BASIC),
instances[8],
),
]
}
pub fn ext_family(instances: [u64; EXT_AIRS]) -> [AirSlot<EXT_KINDS>; EXT_AIRS] {
let ext = |airgroup_id, air_id, rows: usize, lanes: usize, instances| AirSlot {
airgroup_id,
air_id,
ops_per_instance: (rows * lanes) as u64,
proves: [true],
sees: [true],
instances,
};
[
ext(
BinaryExtensionLargeTrace::<()>::AIRGROUP_ID,
BinaryExtensionLargeTrace::<()>::AIR_ID,
BinaryExtensionLargeTrace::<()>::NUM_ROWS,
lanes_x_row::EXT_LARGE,
instances[0],
),
ext(
BinaryExtensionTrace::<()>::AIRGROUP_ID,
BinaryExtensionTrace::<()>::AIR_ID,
BinaryExtensionTrace::<()>::NUM_ROWS,
lanes_x_row::EXT,
instances[1],
),
]
}