Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove dependence of compiler on runtime #353

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion compiler/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -15,7 +15,6 @@ plugins {

dependencies {
implementation(project(":shared"))
implementation(project(":runtime"))

// Data structures
implementation("com.uchuhimo:kotlinx-bimap:1.2")
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package edu.cornell.cs.apl.viaduct.backends.cleartext

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.MemberName
import com.squareup.kotlinpoet.ParameterizedTypeName
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.asClassName
import edu.cornell.cs.apl.viaduct.analysis.NameAnalysis
import edu.cornell.cs.apl.viaduct.analysis.TypeAnalysis
import edu.cornell.cs.apl.viaduct.codegeneration.AbstractCodeGenerator
@@ -13,9 +13,6 @@ import edu.cornell.cs.apl.viaduct.codegeneration.UnsupportedOperatorException
import edu.cornell.cs.apl.viaduct.codegeneration.receiveReplicated
import edu.cornell.cs.apl.viaduct.codegeneration.typeTranslator
import edu.cornell.cs.apl.viaduct.codegeneration.valueClass
import edu.cornell.cs.apl.viaduct.runtime.EquivocationException
import edu.cornell.cs.apl.viaduct.runtime.commitment.Commitment
import edu.cornell.cs.apl.viaduct.runtime.commitment.Committed
import edu.cornell.cs.apl.viaduct.selection.CommunicationEvent
import edu.cornell.cs.apl.viaduct.selection.ProtocolCommunication
import edu.cornell.cs.apl.viaduct.syntax.BinaryOperator
@@ -37,6 +34,12 @@ import edu.cornell.cs.apl.viaduct.syntax.operators.Minimum
import edu.cornell.cs.apl.viaduct.syntax.types.MutableCellType
import edu.cornell.cs.apl.viaduct.syntax.types.VectorType

private const val runtimePackage = "edu.cornell.cs.apl.viaduct.runtime"
private const val commitmentPackage = "edu.cornell.cs.apl.viaduct.runtime.commitment"
private val EquivocationException = ClassName(runtimePackage, "EquivocationException")
private val Commitment = ClassName(commitmentPackage, "Commitment")
private val Committed = ClassName(commitmentPackage, "Committed")

class CleartextCodeGenerator(context: CodeGeneratorContext) : AbstractCodeGenerator(context) {
private val typeAnalysis = TypeAnalysis.get(context.program)
private val nameAnalysis = NameAnalysis.get(context.program)
@@ -221,7 +224,7 @@ class CleartextCodeGenerator(context: CodeGeneratorContext) : AbstractCodeGenera
for (host in hostsToCheckWith) {
receiveBuilder.addStatement(
"%T.%N(%N, %L, %L, %L)",
EquivocationException::class,
EquivocationException,
"assertEquals",
clearTextTemp,
context.codeOf(cleartextInputs.first().send.host),
@@ -262,9 +265,7 @@ class CleartextCodeGenerator(context: CodeGeneratorContext) : AbstractCodeGenera
clearTextCommittedTemp,
receiveDispatcher(
cleartextCommitmentInputs.first(),
Committed::class.asClassName().parameterizedBy(
typeTranslator((typeAnalysis.type(sender)))
)
Committed.parameterizedBy(typeTranslator((typeAnalysis.type(sender))))
)
)

@@ -273,9 +274,7 @@ class CleartextCodeGenerator(context: CodeGeneratorContext) : AbstractCodeGenera
"%L.%N(%N)",
receiveDispatcher(
hashSendEvent,
Commitment::class.asClassName().parameterizedBy(
typeTranslator((typeAnalysis.type(sender)))
)
Commitment.parameterizedBy(typeTranslator((typeAnalysis.type(sender))))
),
"open",
clearTextCommittedTemp
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package edu.cornell.cs.apl.viaduct.backends.commitment

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.MemberName
import com.squareup.kotlinpoet.asClassName
import edu.cornell.cs.apl.viaduct.analysis.TypeAnalysis
import edu.cornell.cs.apl.viaduct.codegeneration.AbstractCodeGenerator
import edu.cornell.cs.apl.viaduct.codegeneration.CodeGeneratorContext
import edu.cornell.cs.apl.viaduct.codegeneration.receiveReplicated
import edu.cornell.cs.apl.viaduct.runtime.commitment.Committed
import edu.cornell.cs.apl.viaduct.selection.CommunicationEvent
import edu.cornell.cs.apl.viaduct.selection.ProtocolCommunication
import edu.cornell.cs.apl.viaduct.syntax.Host
@@ -18,6 +17,9 @@ import edu.cornell.cs.apl.viaduct.syntax.intermediate.ExpressionNode
import edu.cornell.cs.apl.viaduct.syntax.intermediate.LetNode
import edu.cornell.cs.apl.viaduct.syntax.intermediate.LiteralNode

private const val commitmentPackage = "edu.cornell.cs.apl.viaduct.runtime.commitment"
private val Committed = ClassName(commitmentPackage, "Committed")

internal class CommitmentCreatorGenerator(
context: CodeGeneratorContext
) : AbstractCodeGenerator(context) {
@@ -29,7 +31,7 @@ internal class CommitmentCreatorGenerator(
when (expr) {
is LiteralNode -> CodeBlock.of(
"%T.%N(%L)",
Committed::class,
Committed,
"fake",
value(expr.value)
)
@@ -108,7 +110,7 @@ internal class CommitmentCreatorGenerator(
receiveBuilder.addStatement(
"val %N = %T(%L)",
context.kotlinName(sender.temporary.value, receiveProtocol),
Committed::class,
Committed,
receiveReplicated(
sender,
sendProtocol,
@@ -123,7 +125,7 @@ internal class CommitmentCreatorGenerator(
"val %N = %N.%M()",
commitmentTemp,
context.kotlinName(sender.temporary.value, receiveProtocol),
MemberName(Committed.Companion::class.asClassName(), "commitment")
MemberName(Committed.nestedClass("Companion"), "commitment")
)

for (hashHost in hashHosts) {
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package edu.cornell.cs.apl.viaduct.backends.commitment

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.MemberName
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.asClassName
import edu.cornell.cs.apl.viaduct.analysis.TypeAnalysis
import edu.cornell.cs.apl.viaduct.codegeneration.AbstractCodeGenerator
import edu.cornell.cs.apl.viaduct.codegeneration.CodeGeneratorContext
import edu.cornell.cs.apl.viaduct.codegeneration.UnsupportedOperatorException
import edu.cornell.cs.apl.viaduct.codegeneration.receiveReplicated
import edu.cornell.cs.apl.viaduct.codegeneration.typeTranslator
import edu.cornell.cs.apl.viaduct.runtime.commitment.Commitment
import edu.cornell.cs.apl.viaduct.runtime.commitment.Committed
import edu.cornell.cs.apl.viaduct.selection.CommunicationEvent
import edu.cornell.cs.apl.viaduct.selection.ProtocolCommunication
import edu.cornell.cs.apl.viaduct.syntax.Protocol
@@ -22,6 +20,10 @@ import edu.cornell.cs.apl.viaduct.syntax.intermediate.LetNode
import edu.cornell.cs.apl.viaduct.syntax.intermediate.LiteralNode
import edu.cornell.cs.apl.viaduct.backends.commitment.Commitment as CommitmentProtocol

private const val commitmentPackage = "edu.cornell.cs.apl.viaduct.runtime.commitment"
private val CommitmentClass = ClassName(commitmentPackage, "Commitment")
private val Committed = ClassName(commitmentPackage, "Committed")

internal class CommitmentHolderGenerator(
context: CodeGeneratorContext
) : AbstractCodeGenerator(context) {
@@ -34,10 +36,10 @@ internal class CommitmentHolderGenerator(
when (expr) {
is LiteralNode -> CodeBlock.of(
"%T.%N(%L).%M()",
Committed::class,
Committed,
"fake",
value(expr.value),
MemberName(Committed.Companion::class.asClassName(), "commitment")
MemberName(Committed.nestedClass("Companion"), "commitment")
)

else -> super.exp(protocol, expr)
@@ -109,9 +111,7 @@ internal class CommitmentHolderGenerator(
"val %N = %L",
context.kotlinName(sender.temporary.value, receiveProtocol),
context.receive(
Commitment::class.asClassName().parameterizedBy(
typeTranslator(typeAnalysis.type(sender))
),
CommitmentClass.parameterizedBy(typeTranslator(typeAnalysis.type(sender))),
events.first().send.host
)
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package edu.cornell.cs.apl.viaduct.codegeneration

import com.squareup.kotlinpoet.AnnotationSpec
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.FunSpec
@@ -16,9 +17,6 @@ import com.squareup.kotlinpoet.joinToCode
import edu.cornell.cs.apl.prettyprinting.joined
import edu.cornell.cs.apl.viaduct.analysis.NameAnalysis
import edu.cornell.cs.apl.viaduct.analysis.ProtocolAnalysis
import edu.cornell.cs.apl.viaduct.runtime.Boxed
import edu.cornell.cs.apl.viaduct.runtime.ViaductGeneratedProgram
import edu.cornell.cs.apl.viaduct.runtime.ViaductRuntime
import edu.cornell.cs.apl.viaduct.selection.ProtocolCommunication
import edu.cornell.cs.apl.viaduct.selection.ProtocolComposer
import edu.cornell.cs.apl.viaduct.syntax.Host
@@ -43,6 +41,13 @@ import edu.cornell.cs.apl.viaduct.syntax.intermediate.StatementNode
import edu.cornell.cs.apl.viaduct.util.FreshNameGenerator
import javax.annotation.processing.Generated

private const val runtimePackage = "edu.cornell.cs.apl.viaduct.runtime"
private val Boxed = ClassName(runtimePackage, "Boxed")
private val ViaductGeneratedProgram = ClassName(runtimePackage, "ViaductGeneratedProgram")
private val ViaductRuntime = ClassName(runtimePackage, "ViaductRuntime")
private val ViaductRuntimeReceive = MemberName(runtimePackage, "receive")
private val ViaductRuntimeSend = MemberName(runtimePackage, "send")

private class BackendCodeGenerator(
val program: ProgramNode,
val host: Host,
@@ -60,10 +65,10 @@ private class BackendCodeGenerator(
host.name.replaceFirstChar { it.uppercase() }
).primaryConstructor(
FunSpec.constructorBuilder()
.addParameter("runtime", ViaductRuntime::class)
.addParameter("runtime", ViaductRuntime)
.build()
).addProperty(
PropertySpec.builder("runtime", ViaductRuntime::class)
PropertySpec.builder("runtime", ViaductRuntime)
.initializer("runtime")
.addModifiers(KModifier.PRIVATE)
.build()
@@ -152,7 +157,7 @@ private class BackendCodeGenerator(
hostFunctionBuilder.addStatement(
"var %L = %T",
context.kotlinName(outObjectDeclarations[i].name.value),
Boxed::class.asClassName()
Boxed
)

// add out parameter for declared object
@@ -230,9 +235,6 @@ private class BackendCodeGenerator(
private var tempMap: MutableMap<Pair<Temporary, Protocol>, String> = mutableMapOf()
private var varMap: MutableMap<ObjectVariable, String> = mutableMapOf()

private val receiveMember = MemberName(ViaductRuntime::class.java.packageName, "receive")
private val sendMember = MemberName(ViaductRuntime::class.java.packageName, "send")

private val freshNameGenerator: FreshNameGenerator = FreshNameGenerator().apply {
this.getFreshName("runtime")
}
@@ -259,10 +261,10 @@ private class BackendCodeGenerator(
hostDeclarations.reference(host)

override fun receive(type: TypeName, sender: Host): CodeBlock =
CodeBlock.of("%N.%M<%T>(%L)", "runtime", receiveMember, type, codeOf(sender))
CodeBlock.of("%N.%M<%T>(%L)", "runtime", ViaductRuntimeReceive, type, codeOf(sender))

override fun send(value: CodeBlock, receiver: Host): CodeBlock =
CodeBlock.of("%N.%M(%L, %L)", "runtime", sendMember, value, codeOf(receiver))
CodeBlock.of("%N.%M(%L, %L)", "runtime", ViaductRuntimeSend, value, codeOf(receiver))

override fun url(host: Host): CodeBlock =
CodeBlock.of("%N.url(%L)", "runtime", codeOf(host))
@@ -314,15 +316,15 @@ fun ProgramNode.compileToKotlin(
)

// Create an object wrapping all generated code.
val objectBuilder = TypeSpec.objectBuilder(fileName).addSuperinterface(ViaductGeneratedProgram::class)
val objectBuilder = TypeSpec.objectBuilder(fileName).addSuperinterface(ViaductGeneratedProgram)

// Add host declarations to wrapper object.
val hostDeclarations = hostDeclarations(this)
objectBuilder.addType(hostDeclarations)

// Expose set of all hosts.
objectBuilder.addProperty(
PropertySpec.builder(ViaductGeneratedProgram::hosts.name, SET.parameterizedBy(Host::class.asClassName()))
PropertySpec.builder("hosts", SET.parameterizedBy(Host::class.asClassName()))
.initializer(
CodeBlock.of(
"%M(%L)",
@@ -344,7 +346,7 @@ fun ProgramNode.compileToKotlin(
val main = with(FunSpec.builder("main")) {
addModifiers(KModifier.OVERRIDE)
addParameter("host", Host::class)
addParameter("runtime", ViaductRuntime::class)
addParameter("runtime", ViaductRuntime)

// Dispatch to correct class based on host.
beginControlFlow("when (host)")