MicroVM.scala 1.82 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
  val trapManager = new TrapManager(this)
26 27 28
  val clientAgents = new HashSet[ClientAgent]()
  
  val irReader = new UIRTextReader(new IDFactory())
29 30 31 32 33 34 35 36 37 38 39
  
  {
    // The µVM allocates stacks on the heap in the large object space. It is represented as a bug chunk of byte array.
    // So the GC must know about this type because the GC looks up the globalBundle for types.
    globalBundle.allNs.add(InternalTypes.VOID)
    globalBundle.typeNs.add(InternalTypes.VOID)
    globalBundle.allNs.add(InternalTypes.BYTE)
    globalBundle.typeNs.add(InternalTypes.BYTE)
    globalBundle.allNs.add(InternalTypes.BYTE_ARRAY)
    globalBundle.typeNs.add(InternalTypes.BYTE_ARRAY)
  }
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

  /**
   * 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)

}