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
Show file tree
Hide file tree
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
Expand Up @@ -15,7 +15,6 @@ plugins {

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

// Data structures
implementation("com.uchuhimo:kotlinx-bimap:1.2")
Expand Down
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
Expand All @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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))))
)
)

Expand All @@ -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
Expand Down
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
Expand All @@ -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) {
Expand All @@ -29,7 +31,7 @@ internal class CommitmentCreatorGenerator(
when (expr) {
is LiteralNode -> CodeBlock.of(
"%T.%N(%L)",
Committed::class,
Committed,
"fake",
value(expr.value)
)
Expand Down Expand Up @@ -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,
Expand All @@ -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) {
Expand Down
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
Expand All @@ -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) {
Expand All @@ -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)
Expand Down Expand Up @@ -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
)
)
Expand Down
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
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -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()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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")
}
Expand All @@ -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))
Expand Down Expand Up @@ -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)",
Expand All @@ -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)")
Expand Down