scair.clair
package scair.clair
Clair is a Scala library for creating custom IRs. It provides the end-user with a way to define custom IRs packaged in a Dialect (MLIR word for DSL) using Scala syntax and then generate the IR code in a target language (currently limited to Scala).
To define a custom Dialect, the user needs to define an IR and package it into a Dialect object as shown in the code below with the Sample dialect example:
import scair.ir.*
import scair.clair.macros.*
import scair.dialects.builtin.*
import scair.dialects.cmath.*
import scair.enums.I32Enum
import fastparse.*
import scair.parse.*
/*≡≡=---=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=---=≡≡*\
|| defining a custom I32 enum attribute ||
\*≡==----=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=----==≡*/
enum Color(name: String) extends I32Enum(name):
case Red extends Color("red")
case Green extends Color("green")
case Blue extends Color("blue")
case class EnumOperation(
val color: Color
) extends DerivedOperation["arith.enum_op"] derives OpDefs
/*≡≡=---=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=---=≡≡*\
|| defining a custom data attribute ||
\*≡==----=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=----==≡*/
given AttributeCompanion[SampleData]:
override def name: String = "sample"
override def parse[$: P](using Parser) =
"#sample<" ~ CharsWhile(_ != '>').!.map(SampleData.apply) ~ ">"
case class SampleData(val d: String)
extends DataAttribute[String]("sample", d)
/*≡≡=---=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=---=≡≡*\
|| defining a custom attribute ||
\*≡==----=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=----==≡*/
case class SampleAttr(
val value: FloatType
) extends DerivedAttribute["sample.sample_attr"] derives AttrDefs
/*≡≡=---=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=---=≡≡*\
|| defining a custom type attribute ||
\*≡==----=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=----==≡*/
case class SampleType(
val value: FloatType
) extends DerivedAttribute["sample.sample_type"]
with TypeAttribute derives AttrDefs
/*≡≡=---=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=---=≡≡*\
|| defining custom operations ||
\*≡==----=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=----==≡*/
case class SampOp1(
e1: Seq[Operand[IntegerAttr]],
e2: Result[Attribute],
e3: Region,
) extends DerivedOperation["sample.sampop1"] derives OpDefs
case class SampOp2(
e1: Seq[Operand[Complex]],
e2: Result[Attribute],
) extends DerivedOperation["sample.sampop2"] derives OpDefs
/*≡≡=---=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=---=≡≡*\
|| constraints over operation components ||
\*≡==----=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=----==≡*/
import scair.constraints.{*, given}
type T = Var["T"]
val i32 = IntegerType(IntData(32), Signless)
case class MulIEq(
lhs: Operand[IntegerType !> EqAttr[i32.type]],
rhs: Operand[IntegerType !> EqAttr[i32.type]],
result: Result[IntegerType],
) extends DerivedOperation["samplecnstr.mulieq"] derives OpDefs
case class MulIVar(
lhs: Operand[IntegerType !> T],
rhs: Operand[IntegerType !> T],
result: Result[IntegerType],
) extends DerivedOperation["samplecnstr.mulivar"] derives OpDefs
/*≡≡=---=≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡=---=≡≡*\
|| packaging into a dialect ||
\*≡==----=≡≡≡≡≡≡≡≡≡≡≡≡≡≡=----==≡*/
val Sample =
summonDialect[(SampleAttr, SampleType, SampleData), (SampOp1, SampOp1)]
To include the defined Dialect in ScaIR, the user should put the file into the dialects directory in the scair project, and package it appropriately.
Attributes
- See also
-
scair.dialects.cmathgen
Members list
Packages
package scair.clair.macros
package scair.clair.mirrored
This package contains the mirrored logic for the front-end of the Clair library.
This package contains the mirrored logic for the front-end of the Clair library.
Attributes
Type members
Classlikes
trait AttrDefs[T <: Attribute] extends AttributeCompanion[T]
Attributes
- Companion
- object
- Supertypes
object AttrDefs
Attributes
- Supertypes
-
class Objecttrait Matchableclass Any
- Known subtypes
transparent trait DerivedAttribute[name <: String] extends ParametrizedAttribute
Attributes
- Supertypes
- Known subtypes
-
class ComplexTypeclass DenseIntOrFPElementsAttrclass Float128Typeclass Float16Typeclass Float32Typeclass Float64Typeclass Float80Typeclass FloatAttrclass IndexTypeclass IntegerAttrclass IntegerTypeclass UnrankedMemrefTypeclass UnrankedTensorTypeclass VectorTypeclass Complexclass ComplexAttrclass AttributeTypeclass RegionTypeclass PtrShow all
transparent trait DerivedOperation[name <: String] extends Operation
Attributes
- Supertypes
-
trait Operationtrait IntrusiveNode[Operation]trait IRNodeclass Objecttrait Matchableclass AnyShow all
- Known subtypes
-
class Applyclass Forclass Ifclass Loadclass Minclass Parallelclass Storeclass Yieldclass AddFclass AddIclass AddUIExtendedOpclass AndIclass BitCastclass CeilDivSiclass CeilDivUiclass CmpFclass CmpIclass Constantclass DivFclass DivSIclass DivUIclass ExtFclass ExtSIclass ExtUIclass FPToSIclass FPToUIclass FloorDivSIclass IndexCastclass IndexCastUIclass MaxNumFclass MaxSIclass MaxUIclass MaximumFclass MinNumFclass MinSIclass MinUIclass MinimumFclass MulFclass MulIclass MulSIExtendedclass MulUIExtendedclass NegFclass OrIclass RemFclass RemSIclass RemUIclass SIToFPclass ScalingExtFclass ScalingTruncFclass SelectOpclass ShLIclass ShRSIclass ShRUIclass SubFclass SubIclass TruncFclass TruncIclass UIToFPclass XOrIclass ModuleOpclass Mulclass Normclass Absclass Addclass Constantclass Createclass Divclass Imclass Mulclass Negclass Reclass Subclass Callclass CallIndirectclass Constantclass Funcclass Returnclass Anyclass Attributeclass Attributesclass Dialectclass Operandsclass Operationclass Parametersclass Resultsclass Typeclass AggrFnclass Aggregationclass BaseTableclass CountRowsclass CrossProductclass DBAddclass DBAndclass DBCastclass DBCompareclass DBConstantclass DBDivclass DBMulclass DBNotclass DBOrclass DBSubclass GetColclass InnerJoinclass Limitclass MapOpclass Materializeclass Projectionclass QueryReturnclass RelAlgQueryclass Selectionclass SetResultclass Sortclass TuplesReturnclass AShrclass Addclass Allocaclass Andclass Brclass Callclass CallIndirectclass CondBrclass Constantclass ExtractValueclass FAddclass FCmpclass FDivclass FMulclass FNegclass FPExtclass FPToSIclass FPTruncclass FRemclass FSubclass Funcclass GetElementPtrclass ICmpclass InsertValueclass IntToPtrclass LShrclass Loadclass Mulclass Orclass Poisonclass PtrToIntclass Returnclass SDivclass SExtclass SIToFPclass SRemclass Selectclass Shlclass Storeclass Subclass Truncclass Unreachableclass XOrclass ZExtclass Zeroclass AbsfOpclass FPowIOpclass Allocclass Deallocclass Dimclass Loadclass Storeclass Conditionclass ExecuteRegionOpclass ForOpclass ForallOpclass IfOpclass InParallelOpclass IndexSwitchOpclass ParallelOpclass ReduceOpclass ReduceReturnOpclass WhileOpclass YieldOpShow all
object OpDefs
trait OpDefs[T <: Operation] extends OperationCompanion[T]
Attributes
Attributes
- Supertypes
-
class Objecttrait Matchableclass Any
- Known subtypes
-
Show all
Value members
Concrete methods
def summonAttributeCompanionsMacro[T <: Tuple](using evidence$1: Type[T], Quotes): Expr[Seq[AttributeCompanion[_]]]
def summonAttributeCompanionsMacroRec[T <: Tuple](using evidence$1: Type[T], Quotes): Seq[Expr[AttributeCompanion[_]]]
def summonOperationCompanionsMacro[T <: Tuple](using evidence$1: Type[T], Quotes): Expr[Seq[OperationCompanion[_]]]
def summonOperationCompanionsMacroRec[T <: Tuple](using evidence$1: Type[T], Quotes): Seq[Expr[OperationCompanion[_]]]
In this article