Added annotation that can be added to architectures, to mark them as not requiring memory (e.g. to allow assembling MCUs with CPUs configured to those architectures without memory being present). Closes #1201.

This commit is contained in:
Florian Nücke 2015-06-07 11:25:21 +02:00
parent bc29a0b70d
commit a028beadec
2 changed files with 29 additions and 3 deletions

View File

@ -148,7 +148,22 @@ public interface Architecture {
*/ */
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
static @interface Name { @interface Name {
String value(); String value();
} }
/**
* Architectures flagged with this annotation can potentially run without
* any additional memory installed in the computer.
* <p/>
* Use this to allow assembly of devices such as microcontrollers without
* any memory being installed in them while your architecture is being
* used by the CPU being installed. Note to actually make the machine
* start up you only need to always return <tt>true</tt> from
* {@link #recomputeMemory}.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface NoMemoryRequirements {
}
} }

View File

@ -9,6 +9,7 @@ import li.cil.oc.api.driver.item.Container
import li.cil.oc.api.driver.item.Inventory import li.cil.oc.api.driver.item.Inventory
import li.cil.oc.api.driver.item.Memory import li.cil.oc.api.driver.item.Memory
import li.cil.oc.api.driver.item.Processor import li.cil.oc.api.driver.item.Processor
import li.cil.oc.api.machine.Architecture
import li.cil.oc.common.Slot import li.cil.oc.common.Slot
import li.cil.oc.common.Tier import li.cil.oc.common.Tier
import net.minecraft.inventory.IInventory import net.minecraft.inventory.IInventory
@ -40,10 +41,11 @@ abstract class Template {
val hasCase = caseTier(inventory) != Tier.None val hasCase = caseTier(inventory) != Tier.None
val hasCPU = this.hasCPU(inventory) val hasCPU = this.hasCPU(inventory)
val hasRAM = this.hasRAM(inventory) val hasRAM = this.hasRAM(inventory)
val requiresRAM = this.requiresRAM(inventory)
val complexity = this.complexity(inventory) val complexity = this.complexity(inventory)
val maxComplexity = this.maxComplexity(inventory) val maxComplexity = this.maxComplexity(inventory)
val valid = hasCase && hasCPU && hasRAM && complexity <= maxComplexity val valid = hasCase && hasCPU && (hasRAM || !requiresRAM) && complexity <= maxComplexity
val progress = val progress =
if (!hasCPU) Localization.Assembler.InsertCPU if (!hasCPU) Localization.Assembler.InsertCPU
@ -56,7 +58,7 @@ abstract class Template {
warnings += Localization.Assembler.Warning(name) warnings += Localization.Assembler.Warning(name)
} }
} }
if (warnings.length > 0) { if (warnings.nonEmpty) {
warnings.prepend(Localization.Assembler.Warnings) warnings.prepend(Localization.Assembler.Warnings)
} }
@ -80,6 +82,15 @@ abstract class Template {
case _ => false case _ => false
}) })
protected def requiresRAM(inventory: IInventory) = !(0 until inventory.getSizeInventory).
map(inventory.getStackInSlot).
exists(stack => api.Driver.driverFor(stack, hostClass) match {
case driver: Processor =>
val architecture = driver.architecture(stack)
architecture != null && architecture.getAnnotation(classOf[Architecture.NoMemoryRequirements]) != null
case _ => false
})
protected def hasComponent(name: String)(inventory: IInventory) = exists(inventory, stack => Option(api.Items.get(stack)) match { protected def hasComponent(name: String)(inventory: IInventory) = exists(inventory, stack => Option(api.Items.get(stack)) match {
case Some(descriptor) => descriptor.name == name case Some(descriptor) => descriptor.name == name
case _ => false case _ => false