Skip to content

Commit

Permalink
tvm
Browse files Browse the repository at this point in the history
Signed-off-by: andreypfau <[email protected]>
  • Loading branch information
andreypfau committed Feb 19, 2025
1 parent 98f3d7d commit 846a9ed
Show file tree
Hide file tree
Showing 10 changed files with 1,186 additions and 0 deletions.
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ submodule("liteapi-tl")
submodule("adnl")
submodule("liteclient")
submodule("contract")
submodule("vm")

//include(":ton-kotlin-adnl")
//include(":ton-kotlin-api")
Expand Down
14 changes: 14 additions & 0 deletions vm/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
plugins {
id("multiplatform")
}

kotlin {
sourceSets {
commonMain {
dependencies {
api(projects.tonKotlinLiteclient)
api(projects.tonKotlinContract)
}
}
}
}
58 changes: 58 additions & 0 deletions vm/src/Continuation.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package org.ton.kotlin.tvm

/*
class ControlRegs(
val c: Array<TvmContinuation?> = arrayOfNulls(4),
val d: Array<Cell?> = arrayOfNulls(2),
val c7: List<Any?> = emptyList()
)
class ControlData(
val stack: Stack = Stack(),
val stackDepth: Int = 0,
val save: ControlRegs = ControlRegs(),
val nargs: Int = 0,
val cp: Int = 0
)
class TvmContinuation private constructor(
val tag: Byte,
val data: ControlData = ControlData(),
val code: CellSlice = CellSlice(BitString.empty()),
val value: Long = 0,
val condition: TvmContinuation? = null,
val body: TvmContinuation? = null,
val next: TvmContinuation? = null,
) {
companion object {
val ORD_TAG = 0b00.toByte()
val ORD_EXT_TAG = 0b01.toByte()
val QUIT_TAG = 0b1000.toByte()
val QUIT_EXC_TAG = 0b1001.toByte()
val REPEAT_TAG = 0b10100.toByte()
val UNTIL_TAG = 0b110000.toByte()
val AGAIN_TAG = 0b110001.toByte()
val WHILE_COND_TAG = 0b110010.toByte()
val WHILE_BODY_TAG = 0b110011.toByte()
val PUSHINT_TAG = 0b1111.toByte()
fun ordinary() =
TvmContinuation(tag = ORD_TAG)
fun ordinary(code: CellSlice, cp: Int) =
TvmContinuation(tag = ORD_TAG, code = code, data = ControlData(cp = cp))
fun ordinary(code: CellSlice, cp: Int, stack: List<Any>, nargs: Int = -1) =
TvmContinuation(
tag = ORD_TAG,
code = code,
data = ControlData(
cp = cp,
stackDepth = stack.size,
stack = Stack(stack),
nargs = nargs,
)
)
}
}
*/
13 changes: 13 additions & 0 deletions vm/src/GasConsumer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.ton.kotlin.tvm

import kotlin.math.max

public interface GasCalculator {
public fun calculateOperationCost(bitCount: Int): Long

public fun calculateRollCost(elements: Int): Long = max(elements - 255L, 0L)
}

public object FreeGasCalculator : GasCalculator {
override fun calculateOperationCost(bitCount: Int): Long = 0
}
116 changes: 116 additions & 0 deletions vm/src/OpCodes.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package org.ton.kotlin.tvm

public object OpCodes {
public const val NOP: Int = 0x00
public const val SWAP: Int = 0x01
public const val XCHG_0_2: Int = 0x02
public const val XCHG_0_3: Int = 0x03
public const val XCHG_0_4: Int = 0x04
public const val XCHG_0_5: Int = 0x05
public const val XCHG_0_6: Int = 0x06
public const val XCHG_0_7: Int = 0x07
public const val XCHG_0_8: Int = 0x08
public const val XCHG_0_9: Int = 0x09
public const val XCHG_0_10: Int = 0x0A
public const val XCHG_0_11: Int = 0x0B
public const val XCHG_0_12: Int = 0x0C
public const val XCHG_0_13: Int = 0x0D
public const val XCHG_0_14: Int = 0x0E
public const val XCHG_0_15: Int = 0x0F
public const val XCHG: Int = 0x10
public const val XCHG_0: Int = 0x11
public const val XCHG_1_2: Int = 0x12
public const val XCHG_1_3: Int = 0x13
public const val XCHG_1_4: Int = 0x14
public const val XCHG_1_5: Int = 0x15
public const val XCHG_1_6: Int = 0x16
public const val XCHG_1_7: Int = 0x17
public const val XCHG_1_8: Int = 0x18
public const val XCHG_1_9: Int = 0x19
public const val XCHG_1_10: Int = 0x1A
public const val XCHG_1_11: Int = 0x1B
public const val XCHG_1_12: Int = 0x1C
public const val XCHG_1_13: Int = 0x1D
public const val XCHG_1_14: Int = 0x1E
public const val XCHG_1_15: Int = 0x1F
public const val DUP: Int = 0x20
public const val OVER: Int = 0x21
public const val PUSH_2: Int = 0x22
public const val PUSH_3: Int = 0x23
public const val PUSH_4: Int = 0x24
public const val PUSH_5: Int = 0x25
public const val PUSH_6: Int = 0x26
public const val PUSH_7: Int = 0x27
public const val PUSH_8: Int = 0x28
public const val PUSH_9: Int = 0x29
public const val PUSH_10: Int = 0x2A
public const val PUSH_11: Int = 0x2B
public const val PUSH_12: Int = 0x2C
public const val PUSH_13: Int = 0x2D
public const val PUSH_14: Int = 0x2E
public const val PUSH_15: Int = 0x2F
public const val DROP: Int = 0x30
public const val NIP: Int = 0x31
public const val POP_2: Int = 0x32
public const val POP_3: Int = 0x33
public const val POP_4: Int = 0x34
public const val POP_5: Int = 0x35
public const val POP_6: Int = 0x36
public const val POP_7: Int = 0x37
public const val POP_8: Int = 0x38
public const val POP_9: Int = 0x39
public const val POP_10: Int = 0x3A
public const val POP_11: Int = 0x3B
public const val POP_12: Int = 0x3C
public const val POP_13: Int = 0x3D
public const val POP_14: Int = 0x3E
public const val POP_15: Int = 0x3F

public const val XCHG3_0: Int = 0x40
public const val XCHG3_1: Int = 0x41
public const val XCHG3_2: Int = 0x42
public const val XCHG3_3: Int = 0x43
public const val XCHG3_4: Int = 0x44
public const val XCHG3_5: Int = 0x45
public const val XCHG3_6: Int = 0x46
public const val XCHG3_7: Int = 0x47
public const val XCHG3_8: Int = 0x48
public const val XCHG3_9: Int = 0x49
public const val XCHG3_10: Int = 0x4A
public const val XCHG3_11: Int = 0x4B
public const val XCHG3_12: Int = 0x4C
public const val XCHG3_13: Int = 0x4D
public const val XCHG3_14: Int = 0x4E
public const val XCHG3_15: Int = 0x4F
public const val XCHG2: Int = 0x50
public const val XCPU: Int = 0x51
public const val PUXC: Int = 0x52
public const val PUSH2: Int = 0x53

public const val XCHG_PUSH_SUBSET: Int = 0x54

public const val BLKSWAP: Int = 0x55
public const val PUSH_L: Int = 0x56
public const val POP_L: Int = 0x57
public const val ROT: Int = 0x58
public const val ROTREV: Int = 0x59
public const val SWAP2: Int = 0x5A
public const val DROP2: Int = 0x5B
public const val DUP2: Int = 0x5C
public const val OVER2: Int = 0x5D
public const val REVERSE: Int = 0x5E
public const val BLK_SUBSET: Int = 0x5F
public const val PICK: Int = 0x60
public const val ROLLX: Int = 0x61
public const val ROLLREV: Int = 0x62
public const val BLKSWX: Int = 0x63
public const val REVX: Int = 0x64
public const val DROPX: Int = 0x65
public const val TUCK: Int = 0x66
public const val XCHGX: Int = 0x67
public const val DEPTH: Int = 0x68
public const val CHKDEPTH: Int = 0x69
public const val ONLYTOPX: Int = 0x6A
public const val ONLYX: Int = 0x6B
public const val BLKDROP2: Int = 0x6C
}
Loading

0 comments on commit 846a9ed

Please sign in to comment.