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

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 AssemblyFormat[format <: String]

Attributes

Supertypes
class Object
trait Matchable
class Any
Known subtypes
class Yield
class Constant
class Constant
class Return
class Load
class Poison
class Dealloc
class ReduceOp
class YieldOp
Show all
trait AttrDefs[T <: Attribute] extends AttributeCompanion[T]

Attributes

Companion
object
Supertypes
class Object
trait Matchable
class Any
object AttrDefs

Attributes

Companion
trait
Supertypes
class Object
trait Matchable
class Any
Self type
AttrDefs.type

Attributes

Supertypes
class Object
trait Matchable
class Any
Known subtypes
transparent trait DerivedAttribute[name <: String] extends ParametrizedAttribute

Attributes

Supertypes
trait Attribute
class Object
trait Matchable
class Any
Known subtypes
transparent trait DerivedOperation[name <: String] extends Operation

Attributes

Supertypes
trait Operation
trait IRNode
class Object
trait Matchable
class Any
Show all
Known subtypes
class Apply
class For
class If
class Load
class Min
class Parallel
class Store
class Yield
class AddF
class AddI
class AndI
class BitCast
class CeilDivSi
class CeilDivUi
class CmpF
class CmpI
class Constant
class DivF
class DivSI
class DivUI
class ExtF
class ExtSI
class ExtUI
class FPToSI
class FPToUI
class FloorDivSI
class IndexCast
class IndexCastUI
class MaxNumF
class MaxSI
class MaxUI
class MaximumF
class MinNumF
class MinSI
class MinUI
class MinimumF
class MulF
class MulI
class NegF
class OrI
class RemF
class RemSI
class RemUI
class SIToFP
class ScalingExtF
class SelectOp
class ShLI
class ShRSI
class ShRUI
class SubF
class SubI
class TruncF
class TruncI
class UIToFP
class XOrI
class ModuleOp
class Mul
class Norm
class Abs
class Add
class Constant
class Create
class Div
class Im
class Mul
class Neg
class Re
class Sub
class Call
class CallIndirect
class Constant
class Func
class Return
class Any
class Attribute
class Attributes
class Dialect
class Operands
class Operation
class Parameters
class Results
class Type
class AggrFn
class Aggregation
class BaseTable
class CountRows
class CrossProduct
class DBAdd
class DBAnd
class DBCast
class DBCompare
class DBConstant
class DBDiv
class DBMul
class DBNot
class DBOr
class DBSub
class GetCol
class InnerJoin
class Limit
class MapOp
class Materialize
class Projection
class QueryReturn
class RelAlgQuery
class Selection
class SetResult
class Sort
class TuplesReturn
class AShr
class Add
class Alloca
class And
class Br
class Call
class CallIndirect
class CondBr
class Constant
class ExtractValue
class FAdd
class FCmp
class FDiv
class FMul
class FNeg
class FPExt
class FPToSI
class FPTrunc
class FRem
class FSub
class Func
class ICmp
class InsertValue
class IntToPtr
class LShr
class Load
class Mul
class Or
class Poison
class PtrToInt
class Return
class SDiv
class SExt
class SIToFP
class SRem
class Select
class Shl
class Store
class Sub
class Trunc
class Unreachable
class XOr
class ZExt
class Zero
class AbsfOp
class FPowIOp
class Alloc
class Dealloc
class Dim
class Load
class Store
class Condition
class ForOp
class ForallOp
class IfOp
class InParallelOp
class ParallelOp
class ReduceOp
class WhileOp
class YieldOp
Show all
object OpDefs

Attributes

Companion
trait
Supertypes
class Object
trait Matchable
class Any
Self type
OpDefs.type
trait OpDefs[T <: Operation] extends OperationCompanion[T]

Attributes

Companion
object
Supertypes
class Object
trait Matchable
class Any
Self type
OpDefs[T]

Value members

Concrete methods

inline def summonAttributeCompanions[T <: Tuple]: Seq[AttributeCompanion[_]]
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[_]]]
inline def summonDialect[Attributes <: Tuple, Operations <: Tuple]: Dialect
inline def summonOperationCompanions[T <: Tuple]: Seq[OperationCompanion[_]]
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[_]]]