use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct FkcFrontMatter {
pub fkc_version: u32,
pub provider: FkcProvider,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FkcProvider {
pub name: String,
pub backend: String,
pub kernel_source: String,
#[serde(default)]
pub link_registry: Option<String>,
#[serde(default)]
pub revision_base: Option<String>,
}
#[derive(Debug, Clone)]
pub struct FkcFile {
pub front_matter: FkcFrontMatter,
pub kernels: Vec<FkcKernel>,
}
fn default_registrable() -> bool {
true
}
#[derive(Debug, Clone, Deserialize)]
pub struct FkcKernel {
pub kernel: String,
#[serde(default = "default_registrable")]
pub registrable: bool,
#[serde(default)]
pub op_kind: Option<String>,
#[serde(default)]
pub fused_op: Option<String>,
#[serde(default)]
pub blurb: Option<String>,
#[serde(default)]
pub backend: Option<String>,
#[serde(default)]
pub kernel_source: Option<String>,
#[serde(default)]
pub entry_point: Option<String>,
#[serde(default)]
pub kernel_revision_hash: Option<String>,
#[serde(default)]
pub variant: Option<String>,
#[serde(default)]
pub accept: Option<AcceptBlock>,
#[serde(rename = "return", default)]
pub return_: Option<ReturnBlock>,
#[serde(default)]
pub caps: Option<CapsBlock>,
#[serde(default)]
pub cost: Option<CostBlock>,
#[serde(default)]
pub precision: Option<PrecisionBlock>,
#[serde(default)]
pub determinism: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct AcceptBlock {
#[serde(default)]
pub inputs: Vec<TensorDesc>,
#[serde(default)]
pub op_params: Option<OpParamsSchema>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpParamsSchema {
#[serde(default)]
pub variant: Option<String>,
#[serde(default)]
pub fields: std::collections::BTreeMap<String, OpParamFieldSpec>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpParamFieldSpec {
#[serde(default)]
pub kind: Option<String>,
#[serde(default)]
pub constraint: Option<String>,
#[serde(default)]
pub note: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ReturnBlock {
#[serde(default)]
pub outputs: Vec<OutputDesc>,
#[serde(default)]
pub bundle: Option<serde_yaml_ng::Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OutputDesc {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub dtype_rule: Option<String>,
#[serde(default)]
pub shape_rule: Option<String>,
#[serde(default)]
pub layout_guarantee: Option<String>,
#[serde(default)]
pub aliasing: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TensorDesc {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub optional: bool,
#[serde(default)]
pub dtypes: Vec<String>,
#[serde(default)]
pub dtype_class: Option<String>,
#[serde(default)]
pub layout: Option<LayoutSpec>,
#[serde(default)]
pub rank: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub shape_constraint: Option<String>,
#[serde(default)]
pub fdx: Option<FdxSpec>,
#[serde(default)]
pub device: Option<String>,
#[serde(default)]
pub substrate: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct LayoutSpec {
#[serde(default)]
pub contiguous: Option<String>,
#[serde(default)]
pub strided: Option<String>,
#[serde(default)]
pub broadcast_stride0: Option<String>,
#[serde(default)]
pub broadcast_axes: Option<Vec<i64>>,
#[serde(default)]
pub start_offset: Option<String>,
#[serde(default)]
pub reverse_strides: Option<String>,
#[serde(default)]
pub awkward_layout_strategy: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct FdxSpec {
#[serde(default)]
pub requires_ext: Option<bool>,
#[serde(default)]
pub quant: Option<QuantSpec>,
#[serde(default)]
pub sub_byte: Option<String>,
#[serde(default)]
pub symbolic_extent: Option<String>,
#[serde(default)]
pub extent_kind: Option<String>,
#[serde(default)]
pub gather: Option<GatherSpec>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct QuantSpec {
#[serde(default)]
pub family: Option<String>,
#[serde(default)]
pub ggml_dtype: Option<String>,
#[serde(default)]
pub granularity: Option<String>,
#[serde(default)]
pub block_shape: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub role: Option<String>,
#[serde(default)]
pub scale_operand: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct GatherSpec {
#[serde(default)]
pub kind: Option<String>,
#[serde(default)]
pub block_table: Option<String>,
#[serde(default)]
pub context_lens: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CapsBlock {
#[serde(default)]
pub awkward_layout_strategy: Option<String>,
#[serde(default)]
pub fast_paths: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub in_place: Option<bool>,
#[serde(default)]
pub alignment_bytes: Option<u64>,
#[serde(default)]
pub access_granularity_bits: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CostBlock {
#[serde(default)]
pub provenance: Option<String>,
#[serde(default)]
pub class: Option<String>,
#[serde(default)]
pub cost_fn: Option<String>,
#[serde(default)]
pub flops: Option<String>,
#[serde(default)]
pub bytes_moved: Option<String>,
#[serde(default)]
pub overhead_ns: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub memory: Option<CostMemory>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CostMemory {
#[serde(default)]
pub device_bytes: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub host_bytes: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub disk_bytes: Option<serde_yaml_ng::Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PrecisionBlock {
#[serde(default)]
pub bit_stable_on_same_hardware: Option<bool>,
#[serde(default)]
pub max_ulp: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub max_relative: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub max_absolute: Option<serde_yaml_ng::Value>,
#[serde(default)]
pub audited: Option<bool>,
#[serde(default)]
pub notes: Option<String>,
}