MicroVM.scala 1.47 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
package uvm.refimpl

import uvm._
import uvm.refimpl.itpr._
import uvm.refimpl.mem._
import uvm.refimpl.mem.TypeSizes.Word
import scala.collection.mutable.HashSet
import uvm.ir.textinput.UIRTextReader
import uvm.ir.textinput.IDFactory

object MicroVM {
  val DEFAULT_HEAP_SIZE: Word = 4L * 1024L * 1024L; // 4MiB
  val DEFAULT_GLOBAL_SIZE: Word = 1L * 1024L * 1024L; // 1MiB
  val DEFAULT_STACK_SIZE: Word = 63L * 1024L; // 60KiB per stack
}

class MicroVM(heapSize: Word = MicroVM.DEFAULT_HEAP_SIZE,
  globalSize: Word = MicroVM.DEFAULT_GLOBAL_SIZE,
  stackSize: Word = MicroVM.DEFAULT_STACK_SIZE) {

  val globalBundle = new Bundle()
  val constantPool = new ConstantPool(this)
  val memoryManager = new MemoryManager(heapSize, globalSize, stackSize, this)
Kunshan Wang's avatar
Kunshan Wang committed
24
  val threadStackManager = new ThreadStackManager(this)
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
  //val trapManager = new TrapManager(this)
  val clientAgents = new HashSet[ClientAgent]()
  
  val irReader = new UIRTextReader(new IDFactory())

  /**
   * Add things from a bundle to the Micro VM.
   */
  def addBundle(bundle: Bundle) {
    globalBundle.merge(bundle);

    for (gc <- bundle.globalCellNs.all) {
      memoryManager.globalMemory.addGlobalCell(gc)
    }
    for (g <- bundle.globalVarNs.all) {
      constantPool.addGlobalVar(g)
    }
  }
  
  def newClientAgent(): ClientAgent = new ClientAgent(this)

  def addClientAgent(ca: ClientAgent): Unit = {
    clientAgents.add(ca)
  }
  
  def removeClientAgent(ca: ClientAgent): Unit = {
    clientAgents.remove(ca)
  }
}