Skip to content

Commit

Permalink
monolithic commit. type inference now uses Z3
Browse files Browse the repository at this point in the history
  • Loading branch information
Charles Sherk committed Feb 14, 2022
1 parent 11c29e3 commit bf83440
Show file tree
Hide file tree
Showing 16 changed files with 572 additions and 117 deletions.
4 changes: 3 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ libraryDependencies ++= Seq(
"org.scalactic" %% "scalactic" % "3.2.2",
)

scalacOptions += "-language:implicitConversions"

//Deployment Options
assemblyJarName in assembly := "pdl.jar"
test in assembly := {}
mainClass in assembly := Some("pipedsl.Main")
mainClass in assembly := Some("pipedsl.Main")
59 changes: 0 additions & 59 deletions generic_funcs_pass.pdl

This file was deleted.

2 changes: 2 additions & 0 deletions src/main/scala/pipedsl/Main.scala
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,11 @@ object Main {
val canonProg2 = new CanonicalizePass().run(verifProg)
//new PrettyPrinter(None).printProgram(canonProg2)
val canonProg1 = new TypeInference(autocast).checkProgram(canonProg2)

val canonProg = canonProg1//LockOpTranslationPass.run(canonProg1)
//new PrettyPrinter(None).printProgram(canonProg)
val basetypes = BaseTypeChecker.check(canonProg, None)
FunctionConstraintChecker.check(canonProg)
val nprog = new BindModuleTypes(basetypes).run(canonProg)
MarkNonRecursiveModulePass.run(nprog)
val recvProg = SimplifyRecvPass.run(nprog)
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/pipedsl/Parser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ class Parser(rflockImpl: String) extends RegexParsers with PackratParsers {

lazy val indexAtom :P[EIndex] = dlog(positioned
{
iden ^^ { id => EIndVar(id).setType(TInteger()) } |
iden ^^ { id => EIndVar(Id(generic_type_prefix + id.v)).setType(TInteger()) } |
posint ^^ { n => EIndConst(n).setType(TInteger()) }

})("index atom")
Expand Down
8 changes: 5 additions & 3 deletions src/main/scala/pipedsl/codegen/bsv/BSVPrettyPrinter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ object BSVPrettyPrinter {
mkExprString(toBSVTypeStr(v.typ), v.name)
}

private def toProvisoString(name: String, p: Proviso): String = p match {
def toProvisoString(name: String, p: Proviso): String = p match {
case PBits(szName) => "Bits#(" + name + "," + szName +")"
case PAdd(num1, num2, sum) => s"Add#($num1, $num2, $sum)"
case PMin(name, min) => s"Min#($name, $min, $min)"
case PMax(num1, num2, max) => s"Max#($num1, $num2, $max)"
case PEq(num1, num2) => s"Add#($num1, 0, $num2)"
}

private def getTypeParams(typ: BSVType): Set[BTypeParam] = typ match {
Expand Down Expand Up @@ -277,9 +279,9 @@ object BSVPrettyPrinter {
func.name, "(", paramstr, ")",
if(func.provisos.nonEmpty)
{
" provisos(" +
"\n\tprovisos(" +
func.provisos.tail.foldLeft(toProvisoString("", func.provisos.head))((str, proviso) =>
str + ", " + toProvisoString("", proviso)) +
str + ",\n\t\t" + toProvisoString("", proviso)) +
")"
} else ""
))
Expand Down
11 changes: 8 additions & 3 deletions src/main/scala/pipedsl/codegen/bsv/BSVSyntax.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package pipedsl.codegen.bsv

import pipedsl.codegen.Translations.Translator
import pipedsl.codegen.bsv.ConstraintsToBluespec.to_provisos
import pipedsl.common.Errors.{MissingType, UnexpectedBSVType, UnexpectedCommand, UnexpectedExpr, UnexpectedType}
import pipedsl.common.{LockImplementation, Syntax}
import pipedsl.common.LockImplementation.LockInterface
import pipedsl.common.Syntax.Latency.{Asynchronous, Combinational}
import pipedsl.common.Syntax._
import pipedsl.common.Utilities.generic_type_prefix

object BSVSyntax {

Expand All @@ -18,6 +20,8 @@ object BSVSyntax {
case class PBits(szName: String) extends Proviso
case class PAdd(num1 :String, num2 :String, sum :String) extends Proviso
case class PMin(name :String, min :Int) extends Proviso
case class PMax(num1 :String, num2 :String, max :String) extends Proviso
case class PEq(num1 :String, num2 :String) extends Proviso

sealed trait BSVType
case class BNumericType(sz: Int) extends BSVType
Expand Down Expand Up @@ -145,7 +149,7 @@ object BSVSyntax {
case EIndConst(v) => BIndConst(v)
case EIndAdd(l, r) => BIndAdd(toBSVIndex(l), toBSVIndex(r))
case EIndSub(l, r) => BIndSub(toBSVIndex(l), toBSVIndex(r))
case EIndVar(id) => BIndVar(id.v)
case EIndVar(id) => BIndVar("val" + id.v)
}

def toExpr(e: Expr): BExpr = e match {
Expand Down Expand Up @@ -318,15 +322,16 @@ object BSVSyntax {
private def getProvisos(b :FuncDef) :List[Proviso] =
{
val tmp = (b.adds.toList.map(pairid => PAdd(pairid._1._1, pairid._1._2, pairid._2.v)) ++
b.mins.toList.map(pair => PMin(pair._1, pair._2))).distinct
b.mins.toList.map(pair => PMin(pair._1, pair._2))).distinct ++
to_provisos(b.constraints)
tmp
}

private def getFuncGenIntDecls(b :FuncDef): List[BStatement] =
{
b.templateTypes.map(id =>
{
val tmp = Id(id.v + "_val")
val tmp = Id("val" + id.v)
tmp.typ = Some(TInteger())
BDecl(toVar(tmp),
Some(BValueOf(id.v)))
Expand Down
88 changes: 88 additions & 0 deletions src/main/scala/pipedsl/codegen/bsv/ConstraintsToBluespec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package pipedsl.codegen.bsv

import pipedsl.common.Constraints._
import pipedsl.codegen.bsv.BSVSyntax.{PAdd, PEq, PMax, Proviso}
import pipedsl.common.Syntax.Id

/**
* code to turn a list of constraints into a list of Bluespec Provisos
*/
object ConstraintsToBluespec
{

var globl_cnt = 1

def freshVar() :Id =
{
globl_cnt += 1;
Id("_proviso_fresh" + globl_cnt)
}

def collect_vars(e :IntExpr) :Set[Id] = e match
{
case IntConst(v) => Set()
case IntVar(id) => Set(id)
case IntAdd(a, b) => collect_vars(a).union(collect_vars(b))
case IntSub(a, b) => collect_vars(a).union(collect_vars(b))
case IntMax(a, b) => collect_vars(a).union(collect_vars(b))
}

def collect_vars(c :Constraint) : Set[Id] = c match
{
case RelLt(a, b) => collect_vars(a).union(collect_vars(b))
case ReGe(a, b) => collect_vars(a).union(collect_vars(b))
case ReEq(a, b) => collect_vars(a).union(collect_vars(b))
}

def tile_one(c :IntExpr) : (List[Proviso], IntValue) =
{
def helper(a :IntExpr, b :IntExpr, tp :(String, String, String) => Proviso) =
{
val frsh = freshVar()
val (prov_left, left_dest) = tile_one(a)
val (prov_right, right_dest) = tile_one(b)
((prov_left ++ prov_right).prepended(tp(left_dest.toString, right_dest.toString, frsh.v)),
IntVar(frsh))
}
c match
{
case c :IntConst=> (List(), c)
case c :IntVar => (List(), c)
case IntAdd(a, b) => helper(a, b, PAdd)
case IntSub(a, b) => helper(a, b, (left, right, dest) => PAdd(right, dest, left))
case IntMax(a, b) => helper(a, b, PMax)
}
}

def to_provisos_one(c :Constraint) :List[Proviso] =
{
c match
{
//max(a, b) = b <=> b >= a
//b > a <=> b >= a + 1)
//a < b <=> a + 1 <= b
//a + 1 <= b <=> (max (1+ a) b) = b
case RelLt(a, b) =>
val (provs_left, left) = tile_one(a)
val (provs_right, right) = tile_one(b)
val frsh = freshVar()
val one_p_left = PAdd("1", left.toString, frsh.v)
val prov = PMax(frsh.v, right.toString, right.toString)
(provs_left ++ provs_right).prependedAll(List(one_p_left, prov))
case ReGe(a, b) =>
val (provs_left, left) = tile_one(a)
val (provs_right, right) = tile_one(b)
val prov = PMax(left.toString, right.toString, left.toString)
(provs_left ++ provs_right).prepended(prov)
case ReEq(a, b) =>
val (provs_left, left) = tile_one(a)
val (provs_right, right) = tile_one(b)
val prov = PEq(left.toString, right.toString)
(provs_left ++ provs_right).prepended(prov)
}
}

def to_provisos(cstrts :List[Constraint]) :List[Proviso] =
cstrts.flatMap(to_provisos_one).distinct

}
Loading

0 comments on commit bf83440

Please sign in to comment.