/*
* Copyright (c) 2011, IRISA
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of IRISA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package net.sf.orcc.backends.llvm.tta.architecture.impl;
import java.util.Map;
import net.sf.orcc.backends.llvm.tta.architecture.ArchitectureFactory;
import net.sf.orcc.backends.llvm.tta.architecture.ArchitecturePackage;
import net.sf.orcc.backends.llvm.tta.architecture.Bridge;
import net.sf.orcc.backends.llvm.tta.architecture.Bus;
import net.sf.orcc.backends.llvm.tta.architecture.Component;
import net.sf.orcc.backends.llvm.tta.architecture.Design;
import net.sf.orcc.backends.llvm.tta.architecture.Element;
import net.sf.orcc.backends.llvm.tta.architecture.ExprBinary;
import net.sf.orcc.backends.llvm.tta.architecture.ExprFalse;
import net.sf.orcc.backends.llvm.tta.architecture.ExprTrue;
import net.sf.orcc.backends.llvm.tta.architecture.ExprUnary;
import net.sf.orcc.backends.llvm.tta.architecture.Extension;
import net.sf.orcc.backends.llvm.tta.architecture.FuPort;
import net.sf.orcc.backends.llvm.tta.architecture.FunctionUnit;
import net.sf.orcc.backends.llvm.tta.architecture.GlobalControlUnit;
import net.sf.orcc.backends.llvm.tta.architecture.Guard;
import net.sf.orcc.backends.llvm.tta.architecture.Implementation;
import net.sf.orcc.backends.llvm.tta.architecture.Memory;
import net.sf.orcc.backends.llvm.tta.architecture.OpBinary;
import net.sf.orcc.backends.llvm.tta.architecture.OpUnary;
import net.sf.orcc.backends.llvm.tta.architecture.Operation;
import net.sf.orcc.backends.llvm.tta.architecture.Port;
import net.sf.orcc.backends.llvm.tta.architecture.Processor;
import net.sf.orcc.backends.llvm.tta.architecture.ProcessorConfiguration;
import net.sf.orcc.backends.llvm.tta.architecture.Reads;
import net.sf.orcc.backends.llvm.tta.architecture.RegisterFile;
import net.sf.orcc.backends.llvm.tta.architecture.Resource;
import net.sf.orcc.backends.llvm.tta.architecture.Segment;
import net.sf.orcc.backends.llvm.tta.architecture.ShortImmediate;
import net.sf.orcc.backends.llvm.tta.architecture.Signal;
import net.sf.orcc.backends.llvm.tta.architecture.Socket;
import net.sf.orcc.backends.llvm.tta.architecture.SocketType;
import net.sf.orcc.backends.llvm.tta.architecture.Term;
import net.sf.orcc.backends.llvm.tta.architecture.TermBool;
import net.sf.orcc.backends.llvm.tta.architecture.TermUnit;
import net.sf.orcc.backends.llvm.tta.architecture.Writes;
import net.sf.orcc.graph.Vertex;
import net.sf.orcc.util.util.EcoreHelper;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.impl.EFactoryImpl;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
/**
* <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!--
* end-user-doc -->
* @generated
*/
public class ArchitectureFactoryImpl extends EFactoryImpl implements
ArchitectureFactory {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @deprecated
* @generated
*/
@Deprecated
public static ArchitecturePackage getPackage() {
return ArchitecturePackage.eINSTANCE;
}
/**
* Creates the default factory implementation.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
*/
public static ArchitectureFactory init() {
try {
ArchitectureFactory theArchitectureFactory = (ArchitectureFactory) EPackage.Registry.INSTANCE
.getEFactory("http://orcc.sf.net/backends/tta/architecture/TTA_architecture");
if (theArchitectureFactory != null) {
return theArchitectureFactory;
}
} catch (Exception exception) {
EcorePlugin.INSTANCE.log(exception);
}
return new ArchitectureFactoryImpl();
}
/**
* Creates an instance of the factory.
* <!-- begin-user-doc --> <!--
* end-user-doc -->
* @generated
*/
public ArchitectureFactoryImpl() {
super();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public String convertExtensionToString(EDataType eDataType,
Object instanceValue) {
return instanceValue == null ? null : instanceValue.toString();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public String convertOpBinaryToString(EDataType eDataType,
Object instanceValue) {
return instanceValue == null ? null : instanceValue.toString();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public String convertOpUnaryToString(EDataType eDataType,
Object instanceValue) {
return instanceValue == null ? null : instanceValue.toString();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public String convertProcessorConfigurationToString(EDataType eDataType,
Object instanceValue) {
return instanceValue == null ? null : instanceValue.toString();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public String convertSocketTypeToString(EDataType eDataType,
Object instanceValue) {
return instanceValue == null ? null : instanceValue.toString();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public String convertToString(EDataType eDataType, Object instanceValue) {
switch (eDataType.getClassifierID()) {
case ArchitecturePackage.PROCESSOR_CONFIGURATION:
return convertProcessorConfigurationToString(eDataType,
instanceValue);
case ArchitecturePackage.SOCKET_TYPE:
return convertSocketTypeToString(eDataType, instanceValue);
case ArchitecturePackage.EXTENSION:
return convertExtensionToString(eDataType, instanceValue);
case ArchitecturePackage.OP_UNARY:
return convertOpUnaryToString(eDataType, instanceValue);
case ArchitecturePackage.OP_BINARY:
return convertOpBinaryToString(eDataType, instanceValue);
default:
throw new IllegalArgumentException("The datatype '"
+ eDataType.getName() + "' is not a valid classifier");
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public EObject create(EClass eClass) {
switch (eClass.getClassifierID()) {
case ArchitecturePackage.DESIGN:
return createDesign();
case ArchitecturePackage.SIGNAL:
return createSignal();
case ArchitecturePackage.COMPONENT:
return createComponent();
case ArchitecturePackage.PORT:
return createPort();
case ArchitecturePackage.MEMORY:
return createMemory();
case ArchitecturePackage.PROCESSOR:
return createProcessor();
case ArchitecturePackage.BUS:
return createBus();
case ArchitecturePackage.BRIDGE:
return createBridge();
case ArchitecturePackage.SEGMENT:
return createSegment();
case ArchitecturePackage.GLOBAL_CONTROL_UNIT:
return createGlobalControlUnit();
case ArchitecturePackage.FUNCTION_UNIT:
return createFunctionUnit();
case ArchitecturePackage.REGISTER_FILE:
return createRegisterFile();
case ArchitecturePackage.FU_PORT:
return createFuPort();
case ArchitecturePackage.SOCKET:
return createSocket();
case ArchitecturePackage.OPERATION:
return createOperation();
case ArchitecturePackage.READS:
return createReads();
case ArchitecturePackage.WRITES:
return createWrites();
case ArchitecturePackage.RESOURCE:
return createResource();
case ArchitecturePackage.SHORT_IMMEDIATE:
return createShortImmediate();
case ArchitecturePackage.EXPR_UNARY:
return createExprUnary();
case ArchitecturePackage.EXPR_BINARY:
return createExprBinary();
case ArchitecturePackage.EXPR_TRUE:
return createExprTrue();
case ArchitecturePackage.EXPR_FALSE:
return createExprFalse();
case ArchitecturePackage.TERM_BOOL:
return createTermBool();
case ArchitecturePackage.TERM_UNIT:
return createTermUnit();
case ArchitecturePackage.IMPLEMENTATION:
return createImplementation();
case ArchitecturePackage.TYPE_TO_IMPL_MAP_ENTRY:
return (EObject) createTypeToImplMapEntry();
case ArchitecturePackage.PORT_TO_INDEX_MAP_ENTRY:
return (EObject) createPortToIndexMapEntry();
default:
throw new IllegalArgumentException("The class '" + eClass.getName()
+ "' is not a valid classifier");
}
}
public FunctionUnit createAlu2Unit(Processor tta, String name) {
FunctionUnitImpl functionUnit = new FunctionUnitImpl();
functionUnit.setName(name);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket i1 = createInputSocket(name + "_i1", segments);
Socket i2 = createInputSocket(name + "_i2", segments);
Socket o1 = createOutputSocket(name + "_o1", segments);
Socket o2 = createOutputSocket(name + "_o2", segments);
// Port
FuPort in1t = createFuPort("in1t", 32, true, true);
FuPort in2 = createFuPort("in2", 32, false, false);
FuPort out1 = createFuPort("out1", 32, false, false);
FuPort out2 = createFuPort("out2", 32, false, false);
in1t.connect(i1);
in2.connect(i2);
out1.connect(o1);
out2.connect(o2);
functionUnit.getPorts().add(in1t);
functionUnit.getPorts().add(in2);
functionUnit.getPorts().add(out1);
functionUnit.getPorts().add(out2);
functionUnit.setImplementation("ALU");
// Operations (Shift operations use inverse binding)
String[] oneInputOps = { "abs", "sxhw", "sxqw", "neg" };
String[] twoInputOps = { "add", "and", "andn", "eq", "gt", "gtu", "lt",
"ltu", "ior", "sub", "xor" };
String[] twoInputOutputOps = { "addsub" };
String[] shiftOps = { "shl", "shr", "shru" };
for (String operation : oneInputOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in1t, out1));
}
for (String operation : twoInputOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in1t, in2, out1));
}
for (String operation : twoInputOutputOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in1t, in2, out1, out2));
}
for (String operation : shiftOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in2, in1t, out1));
}
return functionUnit;
}
public FunctionUnit createOrccFU(Processor tta) {
FunctionUnitImpl functionUnit = new FunctionUnitImpl();
String name = "ORCC_FU";
functionUnit.setName(name);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket i1 = createInputSocket(name + "_i1", segments);
Socket i2 = createInputSocket(name + "_i2", segments);
Socket o1 = createOutputSocket(name + "_o1", segments);
// Port
FuPort in1t = createFuPort("in1t", 32, true, true);
FuPort in2 = createFuPort("in2", 32, false, false);
FuPort out = createFuPort("out", 32, false, false);
in1t.connect(i1);
in2.connect(i2);
out.connect(o1);
functionUnit.getPorts().add(in1t);
functionUnit.getPorts().add(in2);
functionUnit.getPorts().add(out);
functionUnit.setImplementation(name);
String[] oneInputOneOutputOps = { "source_readbyte",
"source_sizeoffile", "display_getnbframes" };
String[] oneInputOps = { "source_init", "source_rewind",
"source_decrementnbloops", "print_cyclecount", "fpsprintinit",
"fpsprintnewpicdecoded" };
String[] twoInputOps = { "source_exit", "display_checksum",
"throw_away" };
for (String operation : oneInputOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in1t));
}
for (String operation : oneInputOneOutputOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in1t, out));
}
for (String operation : twoInputOps) {
functionUnit.getOperations().add(
createOperationDefault2(operation, in1t, in2));
}
return functionUnit;
}
public FunctionUnit createIoFU(Processor tta) {
FunctionUnitImpl functionUnit = new FunctionUnitImpl();
String name = "IO";
functionUnit.setName(name);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket i1 = createInputSocket(name + "_i1", segments);
// Port
FuPort in1t = createFuPort("T", 8, true, true);
in1t.connect(i1);
functionUnit.getPorts().add(in1t);
functionUnit.setImplementation(name);
functionUnit.getOperations()
.add(createOperationDefault("stdout", in1t));
functionUnit.setImplementation("IO");
return functionUnit;
}
@Override
public FunctionUnit createAluUnit(Processor tta, String name) {
FunctionUnitImpl functionUnit = new FunctionUnitImpl();
functionUnit.setName(name);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket i1 = createInputSocket(name + "_i1", segments);
Socket i2 = createInputSocket(name + "_i2", segments);
Socket o1 = createOutputSocket(name + "_o1", segments);
// Port
FuPort in1t = createFuPort("in1t", 32, true, true);
FuPort in2 = createFuPort("in2", 32, false, false);
FuPort out1 = createFuPort("out1", 32, false, false);
in1t.connect(i1);
in2.connect(i2);
out1.connect(o1);
functionUnit.getPorts().add(in1t);
functionUnit.getPorts().add(in2);
functionUnit.getPorts().add(out1);
functionUnit.setImplementation("ALU");
// Operations (Shift operations use inverse binding)
String[] oneInputOps = { "sxqw", "sxhw" };
String[] twoInputOps = { "add", "and", "eq", "gt", "gtu", "ior", "sub",
"xor" };
String[] shiftOps = { "shl", "shr", "shru" };
for (String operation : oneInputOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in1t, out1));
}
for (String operation : twoInputOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in1t, in2, out1));
}
for (String operation : shiftOps) {
functionUnit.getOperations().add(
createOperationDefault(operation, in2, in1t, out1));
}
return functionUnit;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Bridge createBridge() {
BridgeImpl bridge = new BridgeImpl();
return bridge;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Bus createBus() {
BusImpl bus = new BusImpl();
return bus;
}
@Override
public Bus createBus(int index, int width) {
BusImpl bus = new BusImpl();
bus.setName("Bus" + index);
bus.setWidth(width);
return bus;
}
@Override
public Bus createBusDefault(int index, int width) {
Bus bus = createBus(index, width);
bus.getSegments().add(createSegment("segment0"));
bus.setShortImmediate(createShortImmediate(width, Extension.ZERO));
return bus;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Component createComponent() {
ComponentImpl component = new ComponentImpl();
return component;
}
@Override
public Component createComponent(String name) {
ComponentImpl component = new ComponentImpl();
component.setName(name);
return component;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public Design createDesign() {
DesignImpl design = new DesignImpl();
EMap<String, Implementation> hwDb = design.getHardwareDatabase();
hwDb.put("ALU", createImplementation("asic_130nm_1.5V.hdb", 375));
hwDb.put("RF", createImplementation("asic_130nm_1.5V.hdb", 96));
hwDb.put("LSU", createImplementation("stratixII.hdb", 2));
hwDb.put("MUL", createImplementation("asic_130nm_1.5V.hdb", 88));
hwDb.put("LU", createImplementation("asic_130nm_1.5V.hdb", 22));
hwDb.put("SIG_OUT", createImplementation("stratixIII.hdb", 2));
hwDb.put("IO", createImplementation("altera_jtag_uart.hdb", 1));
return design;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ExprBinary createExprBinary() {
ExprBinaryImpl exprBinary = new ExprBinaryImpl();
return exprBinary;
}
@Override
public ExprBinary createExprBinary(OpBinary op, ExprUnary e1, ExprUnary e2) {
ExprBinaryImpl exprBinary = new ExprBinaryImpl();
exprBinary.setE1(e1);
exprBinary.setE2(e2);
exprBinary.setOperator(op);
return exprBinary;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ExprFalse createExprFalse() {
ExprFalseImpl exprFalse = new ExprFalseImpl();
return exprFalse;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ExprTrue createExprTrue() {
ExprTrueImpl exprTrue = new ExprTrueImpl();
return exprTrue;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ExprUnary createExprUnary() {
ExprUnaryImpl exprUnary = new ExprUnaryImpl();
return exprUnary;
}
@Override
public ExprUnary createExprUnary(boolean isInverted, Term term) {
ExprUnaryImpl exprUnary = new ExprUnaryImpl();
if (isInverted) {
exprUnary.setOperator(OpUnary.INVERTED);
} else {
exprUnary.setOperator(OpUnary.SIMPLE);
}
exprUnary.setTerm(term);
return exprUnary;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Extension createExtensionFromString(EDataType eDataType,
String initialValue) {
Extension result = Extension.get(initialValue);
if (result == null)
throw new IllegalArgumentException("The value '" + initialValue
+ "' is not a valid enumerator of '" + eDataType.getName()
+ "'");
return result;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public Object createFromString(EDataType eDataType, String initialValue) {
switch (eDataType.getClassifierID()) {
case ArchitecturePackage.PROCESSOR_CONFIGURATION:
return createProcessorConfigurationFromString(eDataType,
initialValue);
case ArchitecturePackage.SOCKET_TYPE:
return createSocketTypeFromString(eDataType, initialValue);
case ArchitecturePackage.EXTENSION:
return createExtensionFromString(eDataType, initialValue);
case ArchitecturePackage.OP_UNARY:
return createOpUnaryFromString(eDataType, initialValue);
case ArchitecturePackage.OP_BINARY:
return createOpBinaryFromString(eDataType, initialValue);
default:
throw new IllegalArgumentException("The datatype '"
+ eDataType.getName() + "' is not a valid classifier");
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public FunctionUnit createFunctionUnit() {
FunctionUnitImpl functionUnit = new FunctionUnitImpl();
return functionUnit;
}
@Override
public FunctionUnit createFunctionUnit(Processor tta, String name,
String type) {
FunctionUnitImpl functionUnit = new FunctionUnitImpl();
functionUnit.setName(name);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket i1 = createInputSocket(name + "_i1", segments);
Socket i2 = createInputSocket(name + "_i2", segments);
Socket o1 = createOutputSocket(name + "_o1", segments);
// Port
FuPort in1t = createFuPort("in1t", 32, true, true);
FuPort in2 = createFuPort("in2", 32, false, false);
FuPort out1 = createFuPort("out1", 32, false, false);
in1t.connect(i1);
in2.connect(i2);
out1.connect(o1);
functionUnit.getPorts().add(in1t);
functionUnit.getPorts().add(in2);
functionUnit.getPorts().add(out1);
functionUnit.setImplementation(type);
return functionUnit;
}
@Override
public FunctionUnit createFunctionUnit(Processor tta, String name,
String[] operations1, String[] operations2, String type) {
FunctionUnit functionUnit = createFunctionUnit(tta, name, type);
EList<FuPort> ports = functionUnit.getPorts();
// Operations
if (operations1 != null) {
for (String operation : operations1) {
functionUnit.getOperations().add(
createOperationDefault(operation, ports.get(0),
ports.get(2)));
}
}
if (operations2 != null) {
for (String operation : operations2) {
functionUnit.getOperations().add(
createOperationDefault(operation, ports.get(0),
ports.get(1), ports.get(2)));
}
}
return functionUnit;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public FuPort createFuPort() {
FuPortImpl fuPort = new FuPortImpl();
return fuPort;
}
@Override
public FuPort createFuPort(String name) {
FuPortImpl port = new FuPortImpl();
port.setName(name);
return port;
}
@Override
public FuPort createFuPort(String name, int width,
boolean isOpcodeSelector, boolean isTrigger) {
FuPort port = createFuPort(name);
port.setWidth(width);
port.setOpcodeSelector(isOpcodeSelector);
port.setTrigger(isTrigger);
return port;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public GlobalControlUnit createGlobalControlUnit() {
GlobalControlUnitImpl globalControlUnit = new GlobalControlUnitImpl();
return globalControlUnit;
}
@Override
public GlobalControlUnit createGlobalControlUnit(int delaySlots,
int guardLatency) {
GlobalControlUnitImpl globalControlUnit = new GlobalControlUnitImpl();
globalControlUnit.setDelaySlots(delaySlots);
globalControlUnit.setGuardLatency(guardLatency);
return globalControlUnit;
}
@Override
public GlobalControlUnit createGlobalControlUnitDefault(Processor tta,
Memory program) {
GlobalControlUnit gcu = createGlobalControlUnit(3, 1);
gcu.setName("gcu");
gcu.setAddressSpace(program);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket gcu_i1 = createInputSocket("gcu_i1", segments);
Socket gcu_i2 = createInputSocket("gcu_i2", segments);
Socket gcu_o1 = createOutputSocket("gcu_o1", segments);
// Ports
FuPort pc = createFuPort("pc", 32, true, true);
pc.connect(gcu_i1);
FuPort ra = createFuPort("ra", 32, false, false);
ra.connect(gcu_i2);
ra.connect(gcu_o1);
gcu.setReturnAddress(ra);
gcu.getPorts().add(pc);
// Control operations
gcu.getOperations().add(createOperationCtrl("jump", pc));
gcu.getOperations().add(createOperationCtrl("call", pc));
return gcu;
}
@Override
public EList<Guard> createGuardsDefault(RegisterFile register) {
EList<Guard> guards = new BasicEList<Guard>();
guards.add(createExprTrue());
guards.add(createExprUnary(false, createTermBool(register, 0)));
guards.add(createExprUnary(true, createTermBool(register, 0)));
guards.add(createExprUnary(false, createTermBool(register, 1)));
guards.add(createExprUnary(true, createTermBool(register, 1)));
return guards;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Implementation createImplementation() {
ImplementationImpl implementation = new ImplementationImpl();
return implementation;
}
@Override
public Implementation createImplementation(String hdbFile, int id) {
ImplementationImpl implementation = new ImplementationImpl();
implementation.setHdbFile(hdbFile);
implementation.setId(id);
return implementation;
}
@Override
public Socket createInputSocket(String name, EList<Segment> segments) {
Socket socket = createSocket(name, segments);
socket.setType(SocketType.INPUT);
return socket;
}
@Override
public FunctionUnit createLSU(int id, Processor tta, Memory addressSpace) {
FunctionUnit LSU = createFunctionUnit(tta, "LSU_" + id, "LSU");
// Operations
EList<FuPort> ports = LSU.getPorts();
String[] loadOperations = { "ldw", "ldq", "ldh", "ldqu", "ldhu" };
for (String loadOperation : loadOperations) {
LSU.getOperations().add(
createOperationLoad(loadOperation, ports.get(0),
ports.get(2)));
}
String[] storeOperations = { "stw", "stq", "sth" };
for (String storeOperation : storeOperations) {
LSU.getOperations().add(
createOperationStore(storeOperation, ports.get(0),
ports.get(1)));
}
LSU.setAddressSpace(addressSpace);
return LSU;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Memory createMemory() {
MemoryImpl memory = new MemoryImpl();
return memory;
}
@Override
public Memory createMemory(String name) {
Memory addressSpace = new MemoryImpl();
addressSpace.setName(name);
return addressSpace;
}
@Override
public FunctionUnit createMultiplier(String name, Processor tta) {
FunctionUnit multiplier = createFunctionUnit(tta, name, "MUL");
multiplier.getOperations().add(
createOperationMul("mul", multiplier.getPorts().get(0),
multiplier.getPorts().get(1), multiplier.getPorts()
.get(2)));
return multiplier;
}
public FunctionUnit createMultiplier2(String name, Processor tta) {
FunctionUnit multiplier = createFunctionUnit(tta, name, "MUL");
multiplier.getOperations().add(
createOperationMul("mul", multiplier.getPorts().get(0),
multiplier.getPorts().get(1), multiplier.getPorts()
.get(2)));
return multiplier;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public OpBinary createOpBinaryFromString(EDataType eDataType,
String initialValue) {
OpBinary result = OpBinary.get(initialValue);
if (result == null)
throw new IllegalArgumentException("The value '" + initialValue
+ "' is not a valid enumerator of '" + eDataType.getName()
+ "'");
return result;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Operation createOperation() {
OperationImpl operation = new OperationImpl();
return operation;
}
@Override
public Operation createOperation(String name) {
OperationImpl operation = new OperationImpl();
operation.setName(name);
return operation;
}
@Override
public Operation createOperationCtrl(String name, FuPort port) {
Operation operation = new OperationImpl();
operation.setName(name);
operation.setControl(true);
operation.getPipeline().add(createReads(port, 0, 1));
operation.getPortToIndexMap().put(port, 1);
return operation;
}
private Operation createOperationDefault(String name, FuPort in1,
FuPort out1) {
Operation operation = createOperation(name);
operation.setControl(false);
operation.getPipeline().add(createReads(in1, 0, 1));
operation.getPipeline().add(createWrites(out1, 0, 1));
return operation;
}
private Operation createOperationDefault(String name, FuPort in1) {
Operation operation = createOperation(name);
operation.setControl(false);
operation.getPipeline().add(createReads(in1, 0, 1));
return operation;
}
private Operation createOperationDefault(String name, FuPort in1,
FuPort in2, FuPort out1) {
Operation operation = createOperation(name);
operation.setControl(false);
operation.getPipeline().add(createReads(in1, 0, 1));
operation.getPipeline().add(createReads(in2, 0, 1));
operation.getPipeline().add(createWrites(out1, 0, 1));
return operation;
}
private Operation createOperationDefault2(String name, FuPort in1,
FuPort in2) {
Operation operation = createOperation(name);
operation.setControl(false);
operation.getPipeline().add(createReads(in1, 0, 1));
operation.getPipeline().add(createReads(in2, 0, 1));
return operation;
}
private Operation createOperationDefault(String name, FuPort in1,
FuPort in2, FuPort out1, FuPort out2) {
Operation operation = createOperation(name);
operation.setControl(false);
operation.getPipeline().add(createReads(in1, 0, 1));
operation.getPipeline().add(createReads(in2, 0, 1));
operation.getPipeline().add(createWrites(out1, 0, 1));
operation.getPipeline().add(createWrites(out2, 0, 1));
return operation;
}
private Operation createOperationDefault(String name, FuPort port1,
int startCycle1, int cycle1, boolean isReads1, FuPort port2,
int startCycle2, int cycle2, boolean isReads2) {
Operation operation = createOperation(name);
operation.setControl(false);
Element element1, element2;
if (isReads1) {
element1 = createReads(port1, startCycle1, cycle1);
} else {
element1 = createWrites(port1, startCycle1, cycle1);
}
if (isReads2) {
element2 = createReads(port2, startCycle2, cycle2);
} else {
element2 = createWrites(port2, startCycle2, cycle2);
}
operation.getPipeline().add(element1);
operation.getPipeline().add(element2);
return operation;
}
private Operation createOperationLoad(String name, FuPort in, FuPort out) {
return createOperationDefault(name, in, 0, 1, true, out, 2, 1, false);
}
private Operation createOperationMul(String name, FuPort in1, FuPort in2,
FuPort out) {
Operation operation = createOperation(name);
operation.setControl(false);
operation.getPipeline().add(createReads(in1, 0, 1));
operation.getPipeline().add(createReads(in2, 0, 1));
operation.getPipeline().add(createWrites(out, 1, 1));
return operation;
}
private Operation createOperationStore(String name, FuPort in1, FuPort in2) {
return createOperationDefault(name, in1, 0, 1, true, in2, 0, 1, true);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public OpUnary createOpUnaryFromString(EDataType eDataType,
String initialValue) {
OpUnary result = OpUnary.get(initialValue);
if (result == null)
throw new IllegalArgumentException("The value '" + initialValue
+ "' is not a valid enumerator of '" + eDataType.getName()
+ "'");
return result;
}
@Override
public FunctionUnit createOutputSignalUnit(Processor tta, String signalName) {
FunctionUnitImpl functionUnit = new FunctionUnitImpl();
String name = "SIG_OUT_" + signalName;
functionUnit.setName(name);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket i1 = createInputSocket(name + "_i1", segments);
// Port
FuPort in1t = createFuPort("in1t", 8, true, true);
in1t.connect(i1);
functionUnit.getPorts().add(in1t);
// Operation
Operation write = createOperation("leds");
write.setControl(false);
write.getPipeline().add(createReads(in1t, 0, 1));
functionUnit.getOperations().add(write);
functionUnit.setImplementation("SIG_OUT");
return functionUnit;
}
@Override
public Socket createOutputSocket(String name, EList<Segment> segments) {
Socket socket = createSocket(name, segments);
socket.setType(SocketType.OUTPUT);
return socket;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Port createPort() {
PortImpl port = new PortImpl();
return port;
}
@Override
public Port createPort(net.sf.orcc.df.Port oldPort) {
PortImpl port = new PortImpl();
port.setName(oldPort.getName());
port.addAttribute("native");
port.setAttribute("size", oldPort.getType().getSizeInBits());
return port;
}
@Override
public Port createPort(String name) {
PortImpl port = new PortImpl();
port.setName(name);
port.addAttribute("native");
return port;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Map.Entry<FuPort, Integer> createPortToIndexMapEntry() {
PortToIndexMapEntryImpl portToIndexMapEntry = new PortToIndexMapEntryImpl();
return portToIndexMapEntry;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Processor createProcessor() {
ProcessorImpl processor = new ProcessorImpl();
return processor;
}
@Override
public Processor createProcessor(String name, ProcessorConfiguration conf,
int ramSize) {
Processor processor = null;
processor = createProcessor();
// Address spaces
Memory program = createMemory("instructions");
Memory data = createMemory("data");
processor.setROM(program);
processor.getLocalRAMs().add(data);
// Buses
for (int i = 0; i < conf.getBusNb(); i++) {
Bus bus = createBusDefault(i, 32);
processor.getBuses().add(bus);
}
// Global Control Unit
processor.setGcu(createGlobalControlUnitDefault(processor, program));
// Register files
RegisterFile bool = createRegisterFileDefault(processor, "BOOL",
conf.getBoolRfSize(), 1);
processor.getRegisterFiles().add(bool);
for (int i = 0; i < conf.getIntRfNb(); i++) {
RegisterFile rf = createRegisterFileDefault(processor, "RF_" + i,
conf.getIntRfSize(), 32);
processor.getRegisterFiles().add(rf);
}
// Guards
for (Bus bus : processor.getBuses()) {
bus.getGuards().addAll(createGuardsDefault(bool));
}
// Functional units
EList<FunctionUnit> units = processor.getFunctionUnits();
// * ALU
for (int i = 0; i < conf.getAluNb(); i++) {
FunctionUnit alu = createAluUnit(processor, "ALU_" + i);
units.add(alu);
}
// * LSU
for (int i = 0; i < conf.getLsuNb(); i++) {
units.add(createLSU(i, processor, data));
}
// * Mul
for (int i = 0; i < conf.getMulNb(); i++) {
units.add(createMultiplier("Mul_" + i, processor));
}
processor.setName(name);
return processor;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ProcessorConfiguration createProcessorConfigurationFromString(
EDataType eDataType, String initialValue) {
ProcessorConfiguration result = ProcessorConfiguration
.get(initialValue);
if (result == null)
throw new IllegalArgumentException("The value '" + initialValue
+ "' is not a valid enumerator of '" + eDataType.getName()
+ "'");
return result;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Reads createReads() {
ReadsImpl reads = new ReadsImpl();
return reads;
}
@Override
public Reads createReads(FuPort port, int startCycle, int cycle) {
ReadsImpl reads = new ReadsImpl();
reads.setPort(port);
reads.setStartCycle(startCycle);
reads.setCycles(cycle);
return reads;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public RegisterFile createRegisterFile() {
RegisterFileImpl registerFile = new RegisterFileImpl();
return registerFile;
}
@Override
public RegisterFile createRegisterFile(String name, int size, int width,
int maxReads, int maxWrites) {
RegisterFileImpl registerFile = new RegisterFileImpl();
registerFile.setName(name);
registerFile.setSize(size);
registerFile.setWidth(width);
registerFile.setMaxReads(maxReads);
registerFile.setMaxWrites(maxWrites);
registerFile.setImplementation("RF");
return registerFile;
}
@Override
public RegisterFile createRegisterFileDefault(Processor tta, String name,
int size, int width) {
RegisterFile registerFile = createRegisterFile(name, size, width, 1, 1);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket i1 = createInputSocket(name + "_i1", segments);
Socket o1 = createOutputSocket(name + "_o1", segments);
// Ports
FuPort wr = createFuPort("wr");
wr.connect(o1);
FuPort rd = createFuPort("rd");
rd.connect(i1);
registerFile.getPorts().add(wr);
registerFile.getPorts().add(rd);
return registerFile;
}
public RegisterFile createRegisterFileDefault2(Processor tta, String name,
int size, int width) {
RegisterFile registerFile = createRegisterFile(name, size, width, 2, 1);
// Sockets
EList<Segment> segments = getAllSegments(tta.getBuses());
Socket i1 = createInputSocket(name + "_i1", segments);
Socket o1 = createOutputSocket(name + "_o1", segments);
Socket o2 = createOutputSocket(name + "_o2", segments);
// Ports
FuPort wr = createFuPort("wr");
wr.connect(o1);
FuPort wr2 = createFuPort("wr2");
wr2.connect(o2);
FuPort rd = createFuPort("rd");
rd.connect(i1);
registerFile.getPorts().add(wr);
registerFile.getPorts().add(rd);
registerFile.getPorts().add(wr2);
return registerFile;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Resource createResource() {
ResourceImpl resource = new ResourceImpl();
return resource;
}
@Override
public Resource createResource(String name, int startCycle, int cycles) {
ResourceImpl resource = new ResourceImpl();
resource.setName(name);
resource.setStartCycle(startCycle);
resource.setCycles(cycles);
return resource;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Segment createSegment() {
SegmentImpl segment = new SegmentImpl();
return segment;
}
@Override
public Segment createSegment(String name) {
SegmentImpl segment = new SegmentImpl();
segment.setName(name);
return segment;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ShortImmediate createShortImmediate() {
ShortImmediateImpl shortImmediate = new ShortImmediateImpl();
return shortImmediate;
}
@Override
public ShortImmediate createShortImmediate(int width, Extension extension) {
ShortImmediateImpl shortImmediate = new ShortImmediateImpl();
shortImmediate.setWidth(width);
shortImmediate.setExtension(extension);
return shortImmediate;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Signal createSignal() {
SignalImpl signal = new SignalImpl();
return signal;
}
@Override
public Signal createSignal(String name, int size, Vertex source,
Vertex target, Port sourcePort, Port targetPort) {
SignalImpl signal = new SignalImpl();
signal.setLabel(name);
signal.setSize(size);
signal.setSourcePort(sourcePort);
signal.setTargetPort(targetPort);
signal.setSource(source);
signal.setTarget(target);
return signal;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Socket createSocket() {
SocketImpl socket = new SocketImpl();
return socket;
}
@Override
public Socket createSocket(String name, EList<Segment> segments) {
SocketImpl socket = new SocketImpl();
socket.setName(name);
socket.getConnectedSegments().addAll(segments);
EcoreHelper.getContainerOfType(segments.get(0), Processor.class)
.getSockets().add(socket);
return socket;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public SocketType createSocketTypeFromString(EDataType eDataType,
String initialValue) {
SocketType result = SocketType.get(initialValue);
if (result == null)
throw new IllegalArgumentException("The value '" + initialValue
+ "' is not a valid enumerator of '" + eDataType.getName()
+ "'");
return result;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public TermBool createTermBool() {
TermBoolImpl termBool = new TermBoolImpl();
return termBool;
}
@Override
public TermBool createTermBool(RegisterFile register, int index) {
TermBoolImpl termBool = new TermBoolImpl();
termBool.setRegister(register);
termBool.setIndex(index);
return termBool;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public TermUnit createTermUnit() {
TermUnitImpl termUnit = new TermUnitImpl();
return termUnit;
}
@Override
public TermUnit createTermUnit(FunctionUnit unit, FuPort port) {
TermUnitImpl termUnit = new TermUnitImpl();
termUnit.setFunctionUnit(unit);
termUnit.setPort(port);
return termUnit;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Map.Entry<String, Implementation> createTypeToImplMapEntry() {
TypeToImplMapEntryImpl typeToImplMapEntry = new TypeToImplMapEntryImpl();
return typeToImplMapEntry;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public Writes createWrites() {
WritesImpl writes = new WritesImpl();
return writes;
}
@Override
public Writes createWrites(FuPort port, int startCycle, int cycle) {
WritesImpl writes = new WritesImpl();
writes.setPort(port);
writes.setStartCycle(startCycle);
writes.setCycles(cycle);
return writes;
}
private EList<Segment> getAllSegments(EList<Bus> buses) {
EList<Segment> segments = new BasicEList<Segment>();
for (Bus bus : buses) {
segments.addAll(bus.getSegments());
}
return segments;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
public ArchitecturePackage getArchitecturePackage() {
return (ArchitecturePackage) getEPackage();
}
} // ArchitectureFactoryImpl