init for assignment-3

This commit is contained in:
karthikmurakonda 2022-09-17 21:34:42 +05:30
parent d130a8756e
commit 5067f03322
113 changed files with 3344 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.zip

Binary file not shown.

View File

@ -0,0 +1,40 @@
.data
a:
70
80
40
20
10
30
50
60
n:
8
.text
main:
load %x0, $n, %x3
load %x0, $n, %x9
init:
subi %x9, 1, %x9
addi %x0, 0, %x4
loopi:
addi %x0, 0, %x5
loopj:
addi %x5, 1, %x6
load %x6, $a, %x8
load %x5, $a, %x7
addi %x5, 1, %x5
check:
beq %x5, %x3, loopout
blt %x8, %x7, loopj
subi %x5, 1, %x30
addi %x30, 1, %x29
store %x8, $a, %x30
store %x7, $a, %x29
jmp loopj
loopout:
addi %x4, 1, %x4
beq %x4, %x9, escape
jmp loopi
escape:
end

View File

@ -0,0 +1,13 @@
.data
a:
11
.text
main:
load 0, $a, %x3
divi %x3, 2, %x3
beq %x31, 0, even
addi %x0, 1, %x10
end
even:
subi %x0, 1, %x10
end

View File

@ -0,0 +1,30 @@
.data
n:
10
.text
main:
addi %x0, 65535, %x10
load %x0, $n, %x11
addi %x0, 0, %x12
addi %x0, 0, %x13
addi %x0, 1, %x14
addi %x12, 1, %x12
add %x13, %x14, %x8
store %x13, $n, %x10
subi %x10, 1, %x10
beq %x11, %x12, endl
addi %x12, 1, %x12
store %x14, $n, %x10
subi %x10, 1, %x10
beq %x11, %x12, endl
forloop:
store %x8, $n, %x10
subi %x10, 1, %x10
addi %x12, 1, %x12
beq %x11, %x12, endl
addi %x14, 0, %x13
addi %x8, 0, %x14
add %x13, %x14, %x8
jmp forloop
endl:
end

View File

@ -0,0 +1,32 @@
.data
a:
177771
.text
main:
load %x0, $a, %x3
init:
addi %x3, 0, %x11
addi %x3, 0, %x17
addi %x0, 1, %x15
addi %x0, 0, %x17
forloop:
divi %x3, 10, %x3
muli %x15, 10, %x15
beq %x3, 0, end1
jmp forloop
end1:
divi %x15, 10, %x15
forloop1:
divi %x11, 10, %x11
mul %x31, %x15, %x3
add %x17, %x3, %x17
divi %x15, 10, %x15
beq %x11, 0, end2
jmp forloop1
end2:
beq %x17, %x17, write1
subi %x10, 1, %x10
end
write1:
addi %x10, 1, %x10
end

View File

@ -0,0 +1,23 @@
.data
a:
20
.text
main:
addi %x0, 2, $x3
load %x0, $a, %x11
blt %x11, 2, notAnswer
camparision:
beq %x11, 2, Answer
beq %x11, 3, Answer
round:
div %x11, %x3, %x12
check:
beq %x31, 0, notAnswer
addi %x3, 1, %x3
blt %x3, %x4, round
Answer:
addi %x0, 1, %x10
end
notAnswer:
subi %x0, 1, %x10
end

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Configuration>
<FunctionalUnits>
<ALU>
<Count>2</Count>
<Latency>1</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</ALU>
<Multiplier>
<Count>1</Count>
<Latency>4</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Multiplier>
<Divider>
<Count>1</Count>
<Latency>10</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Divider>
</FunctionalUnits>
<L1iCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1iCache>
<L1dCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1dCache>
<L2Cache>
<NumberOfLines>2048</NumberOfLines>
<Latency>10</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L2Cache>
<MainMemoryLatency>40</MainMemoryLatency>
</Configuration>

View File

@ -0,0 +1 @@
{"name":"Local: Simulator","url":"c:\\Users\\karth\\OneDrive\\Desktop\\new\\src\\generic\\Simulator.java","tests":[{"id":1662603879409,"input":"","output":""},{"id":1662603899098,"input":"","output":""}],"interactive":false,"memoryLimit":1024,"timeLimit":3000,"srcPath":"c:\\Users\\karth\\OneDrive\\Desktop\\new\\src\\generic\\Simulator.java","group":"local","local":true}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Eclipse auto-generated file.
Any modifications will be overwritten.
To include a user specific buildfile here, simply create one in the same
directory with the processing instruction <?eclipse.ant.import?>
as the first entry and export the buildfile again. --><project basedir="." default="build" name="CustomISAAssembler">
<property environment="env"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.8"/>
<property name="source" value="1.8"/>
<path id="CustomISAAssembler.classpath">
<pathelement location="bin"/>
</path>
<target name="init">
<mkdir dir="bin"/>
<copy includeemptydirs="false" todir="bin">
<fileset dir="src">
<exclude name="**/*.launch"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="clean">
<delete dir="bin"/>
</target>
<target depends="clean" name="cleanall"/>
<target depends="build-subprojects,build-project" name="build"/>
<target name="build-subprojects"/>
<target depends="init" name="build-project">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}">
<src path="src"/>
<classpath refid="CustomISAAssembler.classpath"/>
</javac>
</target>
<target name="make-jar" depends="build">
<mkdir dir="jars"/>
<jar destfile="jars/assembler.jar" basedir="bin">
<manifest>
<attribute name="Main-Class" value="main.Main"/>
</manifest>
</jar>
</target>
</project>

View File

@ -0,0 +1,116 @@
package configuration;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import generic.Misc;
public class Configuration {
public static int ALU_count;
public static int ALU_latency;
public static int ALU_reciprocal_of_throughput;
public static int multiplier_count;
public static int multiplier_latency;
public static int multiplier_reciprocal_of_throughput;
public static int divider_count;
public static int divider_latency;
public static int divider_reciprocal_of_throughput;
public static int L1i_numberOfLines;
public static int L1i_latency;
public static int L1i_associativity;
public static String L1i_replacementPolicy;
public static int L1d_numberOfLines;
public static int L1d_latency;
public static int L1d_associativity;
public static String L1d_replacementPolicy;
public static int L2_numberOfLines;
public static int L2_latency;
public static int L2_associativity;
public static String L2_replacementPolicy;
public static int mainMemoryLatency;
public static void parseConfiguratioFile(String configFileName)
{
Document doc = null;
try
{
File file = new File(configFileName);
DocumentBuilderFactory DBFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder DBuilder = DBFactory.newDocumentBuilder();
doc = DBuilder.parse(file);
doc.getDocumentElement().normalize();
}
catch(Exception e)
{
e.printStackTrace();
Misc.printErrorAndExit("Error in reading config file : " + e);
}
NodeList nodeLst = doc.getElementsByTagName("ALU");
Element elmnt = (Element) nodeLst.item(0);
ALU_count = Integer.parseInt(getImmediateString("Count", elmnt));
ALU_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
ALU_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("Multiplier");
elmnt = (Element) nodeLst.item(0);
multiplier_count = Integer.parseInt(getImmediateString("Count", elmnt));
multiplier_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
multiplier_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("Divider");
elmnt = (Element) nodeLst.item(0);
divider_count = Integer.parseInt(getImmediateString("Count", elmnt));
divider_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
divider_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("L1iCache");
elmnt = (Element) nodeLst.item(0);
L1i_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L1i_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L1i_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L1i_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("L1dCache");
elmnt = (Element) nodeLst.item(0);
L1d_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L1d_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L1d_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L1d_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("L2Cache");
elmnt = (Element) nodeLst.item(0);
L2_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L2_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L2_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L2_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("Configuration");
elmnt = (Element) nodeLst.item(0);
mainMemoryLatency = Integer.parseInt(getImmediateString("MainMemoryLatency", elmnt));
}
private static String getImmediateString(String tagName, Element parent) // Get the immediate string value of a particular tag name under a particular parent tag
{
NodeList nodeLst = parent.getElementsByTagName(tagName);
if (nodeLst.item(0) == null)
{
Misc.printErrorAndExit("XML Configuration error : Item \"" + tagName + "\" not found inside the \"" + parent.getTagName() + "\" tag in the configuration file!!");
}
Element NodeElmnt = (Element) nodeLst.item(0);
NodeList resultNode = NodeElmnt.getChildNodes();
return ((Node) resultNode.item(0)).getNodeValue();
}
}

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Configuration>
<FunctionalUnits>
<ALU>
<Count>2</Count>
<Latency>1</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</ALU>
<Multiplier>
<Count>1</Count>
<Latency>4</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Multiplier>
<Divider>
<Count>1</Count>
<Latency>10</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Divider>
</FunctionalUnits>
<L1iCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1iCache>
<L1dCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1dCache>
<L2Cache>
<NumberOfLines>2048</NumberOfLines>
<Latency>10</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L2Cache>
<MainMemoryLatency>40</MainMemoryLatency>
</Configuration>

View File

@ -0,0 +1 @@
{"name":"Local: Simulator","url":"c:\\Users\\karth\\OneDrive\\Desktop\\new\\src\\generic\\Simulator.java","tests":[{"id":1662603879409,"input":"","output":""},{"id":1662603899098,"input":"","output":""}],"interactive":false,"memoryLimit":1024,"timeLimit":3000,"srcPath":"c:\\Users\\karth\\OneDrive\\Desktop\\new\\src\\generic\\Simulator.java","group":"local","local":true}

View File

@ -0,0 +1,96 @@
package generic;
public class Instruction {
public enum OperationType {add, addi, sub, subi, mul, muli, div, divi, and, andi, or, ori, xor, xori, slt, slti, sll, slli, srl, srli, sra, srai, load, store, jmp, beq, bne, blt, bgt, end};
int programCounter;
OperationType operationType;
Operand sourceOperand1;
Operand sourceOperand2;
Operand destinationOperand;
public int getProgramCounter() {
return programCounter;
}
public void setProgramCounter(int programCounter) {
this.programCounter = programCounter;
}
public OperationType getOperationType() {
return operationType;
}
public void setOperationType(OperationType operationType) {
this.operationType = operationType;
}
public Operand getSourceOperand1() {
return sourceOperand1;
}
public void setSourceOperand1(Operand sourceOperand1) {
this.sourceOperand1 = sourceOperand1;
}
public Operand getSourceOperand2() {
return sourceOperand2;
}
public void setSourceOperand2(Operand sourceOperand2) {
this.sourceOperand2 = sourceOperand2;
}
public Operand getDestinationOperand() {
return destinationOperand;
}
public void setDestinationOperand(Operand destinationOperand) {
this.destinationOperand = destinationOperand;
}
public String toString()
{
if(sourceOperand1 != null)
{
if(sourceOperand2 != null)
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\t" + sourceOperand2 + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\t" + sourceOperand2 + "\tnull" + "\n";
}
}
else
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\tnull" + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\tnull" + "\tnull" + "\n";
}
}
}
else
{
if(sourceOperand2 != null)
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\t" + sourceOperand2 + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\t" + sourceOperand2 + "\tnull" + "\n";
}
}
else
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\tnull" + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\tnull" + "\tnull" + "\n";
}
}
}
}
}

Binary file not shown.

View File

@ -0,0 +1,10 @@
package generic;
public class Misc {
public static void printErrorAndExit(String message)
{
System.err.println(message);
System.exit(1);
}
}

View File

@ -0,0 +1,41 @@
package generic;
public class Operand {
public enum OperandType {Register, Immediate, Label};
OperandType operandType;
int value;
String labelValue; //only applicable for Label type;
//Note that Label type is only applicable for functional emulation of assembly file
public OperandType getOperandType() {
return operandType;
}
public void setOperandType(OperandType operandType) {
this.operandType = operandType;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public String getLabelValue() {
return labelValue;
}
public void setLabelValue(String labelValue) {
this.labelValue = labelValue;
}
public String toString()
{
if(operandType == OperandType.Register || operandType == OperandType.Immediate)
{
return "[" + operandType.toString() + ":" + value + "]";
}
else
{
return "[" + operandType.toString() + ":" + labelValue + "]";
}
}
}

View File

@ -0,0 +1,268 @@
package generic;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
import java.util.regex.Pattern;
import generic.Instruction.OperationType;
import generic.Operand.OperandType;
public class ParsedProgram {
static ArrayList<Instruction> code = new ArrayList<Instruction>();
static int mainFunctionAddress;
static int firstCodeAddress;
static ArrayList<Integer> data = new ArrayList<Integer>();
public static void setMainFunctionAddress(int addr)
{
mainFunctionAddress = addr;
}
public static void setFirstCodeAddress(int addr)
{
firstCodeAddress = addr;
}
public static Instruction getInstructionAt(int programCounter)
{
return code.get(programCounter - firstCodeAddress);
}
static HashMap<String, Integer> symtab = new HashMap<String,Integer>();
public static int parseDataSection(String assemblyProgramFile)
{
FileInputStream inputStream = null;
try
{
inputStream = new FileInputStream(assemblyProgramFile);
}
catch(FileNotFoundException e) {
Misc.printErrorAndExit(e.toString());
}
Scanner sc=new Scanner(inputStream);
int address = 0; //Store data staring from 1st memory location. At 0th location we denote the start of the code section.
while(sc.hasNextLine()) //TODO 3 loops?
{
String line=sc.nextLine();
if(line.contains(".data")) //Processing the .data section
{
line=sc.next();
do
{
if(Pattern.matches("[a-zA-Z]+([0-9]*)(:)", line))
{
ParsedProgram.symtab.put(line.replaceAll("[^a-zA-Z]",""), address);//TODO removed statements that were adding data to the code arraylist
while(Pattern.matches("-?\\d+", line=sc.next()))
{
data.add(Integer.parseInt(line));
address++;
}
}
}while(!line.contains(".text"));
break;
}
}
sc.close();
setFirstCodeAddress(address);
return address;
}
public static void parseCodeSection(String assemblyProgramFile, int firstCodeAddress)
{
FileInputStream inputStream = null;
try
{
inputStream = new FileInputStream(assemblyProgramFile);
}
catch(FileNotFoundException e) {
Misc.printErrorAndExit(e.toString());
}
Scanner sc=new Scanner(inputStream);
int address = firstCodeAddress;
while(sc.hasNextLine())
{
String line=sc.nextLine();
if(line.contains(".text"))
{
break;
}
}
while(sc.hasNextLine())
{
String line;
if(Pattern.matches("[a-zA-Z]+([0-9]*)(:)", line=sc.nextLine()))
{
ParsedProgram.symtab.put(line.replaceAll(":",""), address);
if(line.replaceAll(":","").compareTo("main") == 0)
{
ParsedProgram.setMainFunctionAddress(address);
}
}
else
{
ParsedProgram.code.add(address-firstCodeAddress, getInstructionFromString(line, address));
address++;
}
}
sc.close();
}
private static Instruction getInstructionFromString(String line, int address)
{
Instruction newInstruction = new Instruction();
newInstruction.setProgramCounter(address);
Scanner sc = new Scanner(line);
newInstruction.setOperationType(OperationType.valueOf(sc.next()));
switch(newInstruction.getOperationType())
{
//R3I type
case add :
case sub :
case mul :
case div :
case and :
case or :
case xor :
case slt :
case sll :
case srl :
case sra : {
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next()));
newInstruction.setSourceOperand2(getRegisterOperandFromString(sc.next()));
newInstruction.setDestinationOperand(getRegisterOperandFromString(sc.next()));
break;
}
//R2I type
case addi :
case subi :
case muli :
case divi :
case andi :
case ori :
case xori :
case slti :
case slli :
case srli :
case srai :
case load :
case store : {
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next()));
String str = sc.next();
if(Pattern.matches("-?\\d+(,)",str))
{
//absolute immediate
newInstruction.setSourceOperand2(getImmediateOperandFromString(str));
}
else
{
//label / symbol
newInstruction.setSourceOperand2(getLabelOperandFromString(str));
}
newInstruction.setDestinationOperand(getRegisterOperandFromString(sc.next()));
break;
}
case beq :
case bne :
case blt :
case bgt : {
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next()));
newInstruction.setSourceOperand2(getRegisterOperandFromString(sc.next()));
String str = sc.next();
if(Pattern.matches("[0-9]+(,)",str))
{
//absolute immediate
newInstruction.setDestinationOperand(getImmediateOperandFromString(str));
}
else
{
//label / symbol
newInstruction.setDestinationOperand(getLabelOperandFromString(str));
}
break;
}
//RI type :
case jmp : {
String str = sc.next();
if(Pattern.matches("[0-9]+(,)",str))
{
//absolute immediate
newInstruction.setDestinationOperand(getImmediateOperandFromString(str));
}
else if(Pattern.matches("%x([0-9]{1,2})",str)) {
newInstruction.setDestinationOperand(getRegisterOperandFromString(str));
}
else
{
//label / symbol
newInstruction.setDestinationOperand(getLabelOperandFromString(str));
}
break;
}
case end : break;
default: Misc.printErrorAndExit("unknown instruction!!");
}
sc.close();
return newInstruction;
}
private static Operand getRegisterOperandFromString(String str)
{
Operand operand = new Operand();
operand.setOperandType(OperandType.Register);
operand.setValue(Integer.parseInt(str.replaceAll("[^0-9]", "")));
return operand;
}
private static Operand getImmediateOperandFromString(String str)
{
Operand operand = new Operand();
operand.setOperandType(OperandType.Immediate);
operand.setValue(Integer.parseInt(str.replaceAll("[^-?\\d+]","")));
return operand;
}
private static Operand getLabelOperandFromString(String str)
{
Operand operand = new Operand();
operand.setOperandType(OperandType.Label);
operand.setLabelValue(str.replaceAll("[$,]", ""));
return operand;
}
static void printState()
{
System.out.println("Symbol Table :");
System.out.println(Arrays.asList(symtab));
System.out.println("\nParsed instructions :");
System.out.println(Arrays.asList(code));
}
}

View File

@ -0,0 +1,196 @@
package generic;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.nio.ByteBuffer;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class Simulator {
static FileInputStream inputcodeStream = null;
public static Map<Instruction.OperationType, String> mapping = new HashMap<Instruction.OperationType, String>();
static {
mapping.put(Instruction.OperationType.add, "00000");
mapping.put(Instruction.OperationType.addi, "00001");
mapping.put(Instruction.OperationType.sub, "00010");
mapping.put(Instruction.OperationType.subi, "00011");
mapping.put(Instruction.OperationType.mul, "00100");
mapping.put(Instruction.OperationType.muli, "00101");
mapping.put(Instruction.OperationType.div, "00110");
mapping.put(Instruction.OperationType.divi, "00111");
mapping.put(Instruction.OperationType.and, "01000");
mapping.put(Instruction.OperationType.andi, "01001");
mapping.put(Instruction.OperationType.or, "01010");
mapping.put(Instruction.OperationType.ori, "01011");
mapping.put(Instruction.OperationType.xor, "01100");
mapping.put(Instruction.OperationType.xori, "01101");
mapping.put(Instruction.OperationType.slt, "01110");
mapping.put(Instruction.OperationType.slti, "01111");
mapping.put(Instruction.OperationType.sll, "10000");
mapping.put(Instruction.OperationType.slli, "10001");
mapping.put(Instruction.OperationType.srl, "10010");
mapping.put(Instruction.OperationType.srli, "10011");
mapping.put(Instruction.OperationType.sra, "10100");
mapping.put(Instruction.OperationType.srai, "10101");
mapping.put(Instruction.OperationType.load, "10110");
mapping.put(Instruction.OperationType.end, "11101");
mapping.put(Instruction.OperationType.beq, "11001");
mapping.put(Instruction.OperationType.jmp, "11000");
mapping.put(Instruction.OperationType.bne, "11010");
mapping.put(Instruction.OperationType.blt, "11011");
mapping.put(Instruction.OperationType.bgt, "11100");
}
public static void setupSimulation(String assemblyProgramFile) {
int firstCodeAddress = ParsedProgram.parseDataSection(assemblyProgramFile);
ParsedProgram.parseCodeSection(assemblyProgramFile, firstCodeAddress);
ParsedProgram.printState();
}
private static String toBinaryOfSpecificPrecision(int num, int lenOfTargetString) {
String binary = String.format("%" + lenOfTargetString + "s", Integer.toBinaryString(num)).replace(' ', '0');
return binary;
}
private static int toSignedInteger(String binary) {
int n = 32 - binary.length();
char[] sign_ext = new char[n];
Arrays.fill(sign_ext, binary.charAt(0));
int signedInteger = (int) Long.parseLong(new String(sign_ext) + binary, 2);
return signedInteger;
}
private static String toBinaryString(int n) {
// Remove this conditional statement
// if (n >= 0) return String.valueOf(n);
Stack<Integer> bits = new Stack<>();
do {
bits.push(n % 2);
n /= 2;
} while (n != 0);
StringBuilder builder = new StringBuilder();
while (!bits.isEmpty()) {
builder.append(bits.pop());
}
return " " + builder.toString();
}
private static String convert(Operand inst, int precision) {
if (inst == null)
return toBinaryOfSpecificPrecision(0, precision);
if (inst.getOperandType() == Operand.OperandType.Label)
return toBinaryOfSpecificPrecision(ParsedProgram.symtab.get(inst.getLabelValue()), precision);
// write logic for converting to binary/ hex
return toBinaryOfSpecificPrecision(inst.getValue(), precision);
// check if inst is a label, in that case, use its value
// return String.valueOf(inst.getValue());
}
public static void assemble(String objectProgramFile) {
FileOutputStream file;
try {
//1. open the objectProgramFile in binary mode
file = new FileOutputStream(objectProgramFile);
BufferedOutputStream bfile = new BufferedOutputStream(file);
//2. write the firstCodeAddress to the file
byte[] addressCode = ByteBuffer.allocate(4).putInt(ParsedProgram.firstCodeAddress).array();
bfile.write(addressCode);
//3. write the data to the file
for (int value: ParsedProgram.data) {
byte[] dataValue = ByteBuffer.allocate(4).putInt(value).array();
bfile.write(dataValue);
}
//4. assemble one instruction at a time, and write to the file
for (Instruction inst: ParsedProgram.code) {
/**
* inst.getSourceOperand().getValue() will be passed to a function as f()
* that will change decimal to binary and then will return the string
* form of the binary. It will also check if the value is a label,
* in case it is a label, it would call ParsedProgram.symtab.get()
* to get the address corresponding to the label
*/
String binaryRep = "";
// print operation type, use toBinaryString() instead of convert()
// file.write(mapping.get(inst.getOperationType()));
binaryRep += mapping.get(inst.getOperationType());
int opCode = Integer.parseInt(binaryRep, 2);
// System.out.println(inst.getOperationType() + " " + mapping.get(inst.getOperationType()));
// System.out.println(mapping);
// System.out.println(inst.getProgramCounter());
int pc = inst.getProgramCounter();
if (opCode <= 20 && opCode % 2 == 0) {
// R3 Type
binaryRep += convert(inst.getSourceOperand1(), 5);
binaryRep += convert(inst.getSourceOperand2(), 5);
binaryRep += convert(inst.getDestinationOperand(), 5);
binaryRep += toBinaryOfSpecificPrecision(0, 12);
}
else if (opCode == 24) {
// RI Type
if (inst.destinationOperand.getOperandType() == Operand.OperandType.Register) {
binaryRep += convert(inst.getDestinationOperand(), 5);
binaryRep += toBinaryOfSpecificPrecision(0, 22);
}
else {
binaryRep += toBinaryOfSpecificPrecision(0, 5);
int value = Integer.parseInt(convert(inst.getDestinationOperand(), 5), 2) - pc;
String bin = toBinaryOfSpecificPrecision(value, 22);
binaryRep += bin.substring(bin.length() - 22);
}
}
else if (opCode == 29) {
binaryRep += toBinaryOfSpecificPrecision(0, 27);
}
else {
// R2I Type
if (opCode >= 25 && opCode <= 28) {
int value = Integer.parseInt(convert(inst.getDestinationOperand(), 5), 2) - pc;
binaryRep += convert(inst.getSourceOperand1(), 5);
binaryRep += convert(inst.getSourceOperand2(), 5);
String bin = toBinaryOfSpecificPrecision(value, 17);
binaryRep += bin.substring(bin.length() - 17);
}
else {
binaryRep += convert(inst.getSourceOperand1(), 5);
binaryRep += convert(inst.getDestinationOperand(), 5);
binaryRep += convert(inst.getSourceOperand2(), 17);
}
}
int instInteger = (int) Long.parseLong(binaryRep, 2);
byte[] instBinary = ByteBuffer.allocate(4).putInt(instInteger).array();
bfile.write(instBinary);
// System.out.println(instInteger);
// if (inst.getSourceOperand1() != null)
// file.write(convert(inst.getSourceOperand1()));
// if (inst.getSourceOperand2() != null)
// file.write(convert(inst.getSourceOperand2()));
// if (inst.getDestinationOperand() != null)
// file.write(convert(inst.getDestinationOperand()));
// file.write(inst.toString());
}
//5. close the file
bfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,13 @@
package generic;
public class Statistics {
// TODO add your statistics here
// TODO write functions to update statistics
public static void printStatistics(String statFile)
{
// TODO add code here to print statistics in the output file
}
}

Binary file not shown.

View File

@ -0,0 +1,19 @@
package main;
import configuration.Configuration;
import generic.Misc;
import generic.Statistics;
import generic.Simulator;
public class Main {
public static void main(String[] args) {
if(args.length != 2)
{
Misc.printErrorAndExit("usage: java -jar <path-to-jar-file> <path-to-assembly-program> <path-to-object-file>\n");
}
Simulator.setupSimulation(args[0]);
Simulator.assemble(args[1]);
}
}

View File

@ -0,0 +1,9 @@
.data
a:
10
b:
20
.text
main:
load %x0, $a, %x4
end

Binary file not shown.

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Configuration>
<FunctionalUnits>
<ALU>
<Count>2</Count>
<Latency>1</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</ALU>
<Multiplier>
<Count>1</Count>
<Latency>4</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Multiplier>
<Divider>
<Count>1</Count>
<Latency>10</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Divider>
</FunctionalUnits>
<L1iCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1iCache>
<L1dCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1dCache>
<L2Cache>
<NumberOfLines>2048</NumberOfLines>
<Latency>10</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L2Cache>
<MainMemoryLatency>40</MainMemoryLatency>
</Configuration>

View File

@ -0,0 +1 @@
{"name":"Local: Simulator","url":"c:\\Users\\karth\\OneDrive\\Desktop\\new\\src\\generic\\Simulator.java","tests":[{"id":1662603879409,"input":"","output":""},{"id":1662603899098,"input":"","output":""}],"interactive":false,"memoryLimit":1024,"timeLimit":3000,"srcPath":"c:\\Users\\karth\\OneDrive\\Desktop\\new\\src\\generic\\Simulator.java","group":"local","local":true}

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Eclipse auto-generated file.
Any modifications will be overwritten.
To include a user specific buildfile here, simply create one in the same
directory with the processing instruction <?eclipse.ant.import?>
as the first entry and export the buildfile again. --><project basedir="." default="build" name="CustomISAAssembler">
<property environment="env"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.8"/>
<property name="source" value="1.8"/>
<path id="CustomISAAssembler.classpath">
<pathelement location="bin"/>
</path>
<target name="init">
<mkdir dir="bin"/>
<copy includeemptydirs="false" todir="bin">
<fileset dir="src">
<exclude name="**/*.launch"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="clean">
<delete dir="bin"/>
</target>
<target depends="clean" name="cleanall"/>
<target depends="build-subprojects,build-project" name="build"/>
<target name="build-subprojects"/>
<target depends="init" name="build-project">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}">
<src path="src"/>
<classpath refid="CustomISAAssembler.classpath"/>
</javac>
</target>
<target name="make-jar" depends="build">
<mkdir dir="jars"/>
<jar destfile="jars/assembler.jar" basedir="bin">
<manifest>
<attribute name="Main-Class" value="main.Main"/>
</manifest>
</jar>
</target>
</project>

View File

@ -0,0 +1,9 @@
.data
a:
10
b:
20
.text
main:
load %x0, $a, %x4
end

Binary file not shown.

View File

@ -0,0 +1 @@
/Configuration.class

View File

@ -0,0 +1,116 @@
package configuration;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import generic.Misc;
public class Configuration {
public static int ALU_count;
public static int ALU_latency;
public static int ALU_reciprocal_of_throughput;
public static int multiplier_count;
public static int multiplier_latency;
public static int multiplier_reciprocal_of_throughput;
public static int divider_count;
public static int divider_latency;
public static int divider_reciprocal_of_throughput;
public static int L1i_numberOfLines;
public static int L1i_latency;
public static int L1i_associativity;
public static String L1i_replacementPolicy;
public static int L1d_numberOfLines;
public static int L1d_latency;
public static int L1d_associativity;
public static String L1d_replacementPolicy;
public static int L2_numberOfLines;
public static int L2_latency;
public static int L2_associativity;
public static String L2_replacementPolicy;
public static int mainMemoryLatency;
public static void parseConfiguratioFile(String configFileName)
{
Document doc = null;
try
{
File file = new File(configFileName);
DocumentBuilderFactory DBFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder DBuilder = DBFactory.newDocumentBuilder();
doc = DBuilder.parse(file);
doc.getDocumentElement().normalize();
}
catch(Exception e)
{
e.printStackTrace();
Misc.printErrorAndExit("Error in reading config file : " + e);
}
NodeList nodeLst = doc.getElementsByTagName("ALU");
Element elmnt = (Element) nodeLst.item(0);
ALU_count = Integer.parseInt(getImmediateString("Count", elmnt));
ALU_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
ALU_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("Multiplier");
elmnt = (Element) nodeLst.item(0);
multiplier_count = Integer.parseInt(getImmediateString("Count", elmnt));
multiplier_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
multiplier_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("Divider");
elmnt = (Element) nodeLst.item(0);
divider_count = Integer.parseInt(getImmediateString("Count", elmnt));
divider_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
divider_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("L1iCache");
elmnt = (Element) nodeLst.item(0);
L1i_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L1i_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L1i_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L1i_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("L1dCache");
elmnt = (Element) nodeLst.item(0);
L1d_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L1d_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L1d_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L1d_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("L2Cache");
elmnt = (Element) nodeLst.item(0);
L2_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L2_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L2_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L2_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("Configuration");
elmnt = (Element) nodeLst.item(0);
mainMemoryLatency = Integer.parseInt(getImmediateString("MainMemoryLatency", elmnt));
}
private static String getImmediateString(String tagName, Element parent) // Get the immediate string value of a particular tag name under a particular parent tag
{
NodeList nodeLst = parent.getElementsByTagName(tagName);
if (nodeLst.item(0) == null)
{
Misc.printErrorAndExit("XML Configuration error : Item \"" + tagName + "\" not found inside the \"" + parent.getTagName() + "\" tag in the configuration file!!");
}
Element NodeElmnt = (Element) nodeLst.item(0);
NodeList resultNode = NodeElmnt.getChildNodes();
return ((Node) resultNode.item(0)).getNodeValue();
}
}

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Configuration>
<FunctionalUnits>
<ALU>
<Count>2</Count>
<Latency>1</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</ALU>
<Multiplier>
<Count>1</Count>
<Latency>4</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Multiplier>
<Divider>
<Count>1</Count>
<Latency>10</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Divider>
</FunctionalUnits>
<L1iCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1iCache>
<L1dCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1dCache>
<L2Cache>
<NumberOfLines>2048</NumberOfLines>
<Latency>10</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L2Cache>
<MainMemoryLatency>40</MainMemoryLatency>
</Configuration>

View File

@ -0,0 +1 @@
{"name":"Local: Simulator","url":"c:\\Users\\karth\\OneDrive\\Desktop\\new\\src\\generic\\Simulator.java","tests":[{"id":1662603879409,"input":"","output":""},{"id":1662603899098,"input":"","output":""}],"interactive":false,"memoryLimit":1024,"timeLimit":3000,"srcPath":"c:\\Users\\karth\\OneDrive\\Desktop\\new\\src\\generic\\Simulator.java","group":"local","local":true}

View File

@ -0,0 +1,8 @@
/Instruction$OperationType.class
/Instruction.class
/Misc.class
/Operand$OperandType.class
/Operand.class
/ParsedProgram.class
/Simulator.class
/Statistics.class

View File

@ -0,0 +1,96 @@
package generic;
public class Instruction {
public enum OperationType {add, addi, sub, subi, mul, muli, div, divi, and, andi, or, ori, xor, xori, slt, slti, sll, slli, srl, srli, sra, srai, load, store, jmp, beq, bne, blt, bgt, end};
int programCounter;
OperationType operationType;
Operand sourceOperand1;
Operand sourceOperand2;
Operand destinationOperand;
public int getProgramCounter() {
return programCounter;
}
public void setProgramCounter(int programCounter) {
this.programCounter = programCounter;
}
public OperationType getOperationType() {
return operationType;
}
public void setOperationType(OperationType operationType) {
this.operationType = operationType;
}
public Operand getSourceOperand1() {
return sourceOperand1;
}
public void setSourceOperand1(Operand sourceOperand1) {
this.sourceOperand1 = sourceOperand1;
}
public Operand getSourceOperand2() {
return sourceOperand2;
}
public void setSourceOperand2(Operand sourceOperand2) {
this.sourceOperand2 = sourceOperand2;
}
public Operand getDestinationOperand() {
return destinationOperand;
}
public void setDestinationOperand(Operand destinationOperand) {
this.destinationOperand = destinationOperand;
}
public String toString()
{
if(sourceOperand1 != null)
{
if(sourceOperand2 != null)
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\t" + sourceOperand2 + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\t" + sourceOperand2 + "\tnull" + "\n";
}
}
else
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\tnull" + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\tnull" + "\tnull" + "\n";
}
}
}
else
{
if(sourceOperand2 != null)
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\t" + sourceOperand2 + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\t" + sourceOperand2 + "\tnull" + "\n";
}
}
else
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\tnull" + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\tnull" + "\tnull" + "\n";
}
}
}
}
}

View File

@ -0,0 +1,10 @@
package generic;
public class Misc {
public static void printErrorAndExit(String message)
{
System.err.println(message);
System.exit(1);
}
}

View File

@ -0,0 +1,41 @@
package generic;
public class Operand {
public enum OperandType {Register, Immediate, Label};
OperandType operandType;
int value;
String labelValue; //only applicable for Label type;
//Note that Label type is only applicable for functional emulation of assembly file
public OperandType getOperandType() {
return operandType;
}
public void setOperandType(OperandType operandType) {
this.operandType = operandType;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public String getLabelValue() {
return labelValue;
}
public void setLabelValue(String labelValue) {
this.labelValue = labelValue;
}
public String toString()
{
if(operandType == OperandType.Register || operandType == OperandType.Immediate)
{
return "[" + operandType.toString() + ":" + value + "]";
}
else
{
return "[" + operandType.toString() + ":" + labelValue + "]";
}
}
}

View File

@ -0,0 +1,268 @@
package generic;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
import java.util.regex.Pattern;
import generic.Instruction.OperationType;
import generic.Operand.OperandType;
public class ParsedProgram {
static ArrayList<Instruction> code = new ArrayList<Instruction>();
static int mainFunctionAddress;
static int firstCodeAddress;
static ArrayList<Integer> data = new ArrayList<Integer>();
public static void setMainFunctionAddress(int addr)
{
mainFunctionAddress = addr;
}
public static void setFirstCodeAddress(int addr)
{
firstCodeAddress = addr;
}
public static Instruction getInstructionAt(int programCounter)
{
return code.get(programCounter - firstCodeAddress);
}
static HashMap<String, Integer> symtab = new HashMap<String,Integer>();
public static int parseDataSection(String assemblyProgramFile)
{
FileInputStream inputStream = null;
try
{
inputStream = new FileInputStream(assemblyProgramFile);
}
catch(FileNotFoundException e) {
Misc.printErrorAndExit(e.toString());
}
Scanner sc=new Scanner(inputStream);
int address = 0; //Store data staring from 1st memory location. At 0th location we denote the start of the code section.
while(sc.hasNextLine()) //TODO 3 loops?
{
String line=sc.nextLine();
if(line.contains(".data")) //Processing the .data section
{
line=sc.next();
do
{
if(Pattern.matches("[a-zA-Z]+([0-9]*)(:)", line))
{
ParsedProgram.symtab.put(line.replaceAll("[^a-zA-Z]",""), address);//TODO removed statements that were adding data to the code arraylist
while(Pattern.matches("-?\\d+", line=sc.next()))
{
data.add(Integer.parseInt(line));
address++;
}
}
}while(!line.contains(".text"));
break;
}
}
sc.close();
setFirstCodeAddress(address);
return address;
}
public static void parseCodeSection(String assemblyProgramFile, int firstCodeAddress)
{
FileInputStream inputStream = null;
try
{
inputStream = new FileInputStream(assemblyProgramFile);
}
catch(FileNotFoundException e) {
Misc.printErrorAndExit(e.toString());
}
Scanner sc=new Scanner(inputStream);
int address = firstCodeAddress;
while(sc.hasNextLine())
{
String line=sc.nextLine();
if(line.contains(".text"))
{
break;
}
}
while(sc.hasNextLine())
{
String line;
if(Pattern.matches("[a-zA-Z]+([0-9]*)(:)", line=sc.nextLine()))
{
ParsedProgram.symtab.put(line.replaceAll(":",""), address);
if(line.replaceAll(":","").compareTo("main") == 0)
{
ParsedProgram.setMainFunctionAddress(address);
}
}
else
{
ParsedProgram.code.add(address-firstCodeAddress, getInstructionFromString(line, address));
address++;
}
}
sc.close();
}
private static Instruction getInstructionFromString(String line, int address)
{
Instruction newInstruction = new Instruction();
newInstruction.setProgramCounter(address);
Scanner sc = new Scanner(line);
newInstruction.setOperationType(OperationType.valueOf(sc.next()));
switch(newInstruction.getOperationType())
{
//R3I type
case add :
case sub :
case mul :
case div :
case and :
case or :
case xor :
case slt :
case sll :
case srl :
case sra : {
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next()));
newInstruction.setSourceOperand2(getRegisterOperandFromString(sc.next()));
newInstruction.setDestinationOperand(getRegisterOperandFromString(sc.next()));
break;
}
//R2I type
case addi :
case subi :
case muli :
case divi :
case andi :
case ori :
case xori :
case slti :
case slli :
case srli :
case srai :
case load :
case store : {
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next()));
String str = sc.next();
if(Pattern.matches("-?\\d+(,)",str))
{
//absolute immediate
newInstruction.setSourceOperand2(getImmediateOperandFromString(str));
}
else
{
//label / symbol
newInstruction.setSourceOperand2(getLabelOperandFromString(str));
}
newInstruction.setDestinationOperand(getRegisterOperandFromString(sc.next()));
break;
}
case beq :
case bne :
case blt :
case bgt : {
newInstruction.setSourceOperand1(getRegisterOperandFromString(sc.next()));
newInstruction.setSourceOperand2(getRegisterOperandFromString(sc.next()));
String str = sc.next();
if(Pattern.matches("[0-9]+(,)",str))
{
//absolute immediate
newInstruction.setDestinationOperand(getImmediateOperandFromString(str));
}
else
{
//label / symbol
newInstruction.setDestinationOperand(getLabelOperandFromString(str));
}
break;
}
//RI type :
case jmp : {
String str = sc.next();
if(Pattern.matches("[0-9]+(,)",str))
{
//absolute immediate
newInstruction.setDestinationOperand(getImmediateOperandFromString(str));
}
else if(Pattern.matches("%x([0-9]{1,2})",str)) {
newInstruction.setDestinationOperand(getRegisterOperandFromString(str));
}
else
{
//label / symbol
newInstruction.setDestinationOperand(getLabelOperandFromString(str));
}
break;
}
case end : break;
default: Misc.printErrorAndExit("unknown instruction!!");
}
sc.close();
return newInstruction;
}
private static Operand getRegisterOperandFromString(String str)
{
Operand operand = new Operand();
operand.setOperandType(OperandType.Register);
operand.setValue(Integer.parseInt(str.replaceAll("[^0-9]", "")));
return operand;
}
private static Operand getImmediateOperandFromString(String str)
{
Operand operand = new Operand();
operand.setOperandType(OperandType.Immediate);
operand.setValue(Integer.parseInt(str.replaceAll("[^-?\\d+]","")));
return operand;
}
private static Operand getLabelOperandFromString(String str)
{
Operand operand = new Operand();
operand.setOperandType(OperandType.Label);
operand.setLabelValue(str.replaceAll("[$,]", ""));
return operand;
}
static void printState()
{
System.out.println("Symbol Table :");
System.out.println(Arrays.asList(symtab));
System.out.println("\nParsed instructions :");
System.out.println(Arrays.asList(code));
}
}

View File

@ -0,0 +1,153 @@
package generic;
import java.io.FileInputStream;
import generic.Operand.OperandType;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.io.ByteArrayInputStream;
import java.nio.ByteBuffer;
public class Simulator {
static FileInputStream inputcodeStream = null;
public static Map<String, String> map = new HashMap<>() {
{
put("add", "00000");
put("sub", "00010");
put("mul", "00100");
put("div", "00110");
put("and", "01000");
put("or", "01010");
put("xor", "01100");
put("slt", "01110");
put("sll", "10000");
put("srl", "10010");
put("sra", "10100");
put("beq", "11001");
put("bne", "11010");
put("blt", "11011");
put("bgt", "11100");
put("load", "10110");
put("store", "10111");
put("jmp", "11000");
put("addi", "00001");
put("subi", "00011");
put("muli", "00101");
put("divi", "00111");
put("andi", "01001");
put("ori", "01011");
put("xori", "01101");
put("slti", "01111");
put("slli", "10001");
put("srli", "10011");
put("srai", "10101");
put("end", "11101");
}
};
private static String toBinaryOfSpecificPrecision(int num, int lenOfTargetString) {
String binary = String.format("%" + lenOfTargetString + "s", Integer.toBinaryString(num)).replace(' ', '0');
return binary;
}
private static String convert_1(Operand inst, int precision) {
return toBinaryOfSpecificPrecision(inst.getValue(), precision);
}
private static String convert(Operand inst, int precision) {
if (inst == null)
return toBinaryOfSpecificPrecision(0, precision);
if (inst.getOperandType() == Operand.OperandType.Label)
return toBinaryOfSpecificPrecision(ParsedProgram.symtab.get(inst.getLabelValue()), precision);
return toBinaryOfSpecificPrecision(inst.getValue(), precision);
}
public static void setupSimulation(String assemblyProgramFile)
{
int firstCodeAddress = ParsedProgram.parseDataSection(assemblyProgramFile);
ParsedProgram.parseCodeSection(assemblyProgramFile, firstCodeAddress);
ParsedProgram.printState();
}
public static void assemble(String objectProgramFile)
{
FileOutputStream file;
try {
file = new FileOutputStream(objectProgramFile);
//write the firstCodeAddress to the file
file.write(ByteBuffer.allocate(4).putInt(ParsedProgram.firstCodeAddress).array());
//write the data to the file
for (var value : ParsedProgram.data) {
byte[] dataValue = ByteBuffer.allocate(4).putInt(value).array();
file.write(dataValue);
}
//assemble one instruction at a time, and write to the file
for (var instruction : ParsedProgram.code) {
String line = "";
String optype=(instruction.operationType).toString();
line += map.get(optype);
// int op = Integer.parseInt(line, 2);
int op=Integer.parseInt(map.get(optype),2);
int pc = instruction.getProgramCounter();
if (op <= 20 && op % 2 == 0) {
// R3 Type
line += convert_1(instruction.getSourceOperand1(), 5);
line += convert_1(instruction.getSourceOperand2(), 5);
line += convert_1(instruction.getDestinationOperand(), 5);
line += toBinaryOfSpecificPrecision(0, 12);
}
else if (op == 29) {
line += toBinaryOfSpecificPrecision(0, 27);
}
else if (op == 24) {
// RI Type
if (instruction.destinationOperand.getOperandType() == Operand.OperandType.Register) {
line += convert(instruction.getDestinationOperand(), 5);
line += toBinaryOfSpecificPrecision(0, 22);
} else {
line += toBinaryOfSpecificPrecision(0, 5);
int value = Integer.parseInt(convert(instruction.getDestinationOperand(), 5), 2) - pc;
String bin = toBinaryOfSpecificPrecision(value, 22);
line += bin.substring(bin.length() - 22);
}
}
else {
// R2I Type
if (op >= 25 && op <= 28) {
int value = Integer.parseInt(convert(instruction.getDestinationOperand(), 5), 2) - pc;
line += convert(instruction.getSourceOperand1(), 5);
line += convert(instruction.getSourceOperand2(), 5);
String bin = toBinaryOfSpecificPrecision(value, 17);
line += bin.substring(bin.length() - 17);
} else {
line += convert(instruction.getSourceOperand1(), 5);
line += convert(instruction.getDestinationOperand(), 5);
line += convert(instruction.getSourceOperand2(), 17);
}
}
int instInteger = (int) Long.parseLong(line, 2);
byte[] instBinary = ByteBuffer.allocate(4).putInt(instInteger).array();
file.write(instBinary);
}
file.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,13 @@
package generic;
public class Statistics {
// TODO add your statistics here
// TODO write functions to update statistics
public static void printStatistics(String statFile)
{
// TODO add code here to print statistics in the output file
}
}

View File

@ -0,0 +1 @@
/Main.class

View File

@ -0,0 +1,19 @@
package main;
import configuration.Configuration;
import generic.Misc;
import generic.Statistics;
import generic.Simulator;
public class Main {
public static void main(String[] args) {
if(args.length != 2)
{
Misc.printErrorAndExit("usage: java -jar <path-to-jar-file> <path-to-assembly-program> <path-to-object-file>\n");
}
Simulator.setupSimulation(args[0]);
Simulator.assemble(args[1]);
}
}

View File

@ -0,0 +1,398 @@
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 14 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 14 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 12 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Symbol Table :
[{a=0, b=1, main=2}]
Parsed instructions :
[[PC=2 load [Register:0] [Label:a] [Register:4]
, PC=3 end null null null
]]
Symbol Table :
[{prime=11, a=0, for=6, main=1, notprime=14}]
Parsed instructions :
[[PC=1 load [Register:0] [Label:a] [Register:3]
, PC=2 sub [Register:4] [Register:4] [Register:4]
, PC=3 divi [Register:3] [Immediate:2] [Register:4]
, PC=4 sub [Register:6] [Register:6] [Register:6]
, PC=5 addi [Register:6] [Immediate:2] [Register:6]
, PC=6 bgt [Register:6] [Register:4] [Label:prime]
, PC=7 div [Register:3] [Register:6] [Register:7]
, PC=8 beq [Register:0] [Register:31] [Label:notprime]
, PC=9 addi [Register:6] [Immediate:1] [Register:6]
, PC=10 jmp null null [Label:for]
, PC=11 sub [Register:10] [Register:10] [Register:10]
, PC=12 addi [Register:10] [Immediate:1] [Register:10]
, PC=13 end null null null
, PC=14 sub [Register:10] [Register:10] [Register:10]
, PC=15 subi [Register:10] [Immediate:1] [Register:10]
, PC=16 end null null null
]]
Symbol Table :
[{a=0, palindrome=13, loop=3, main=1}]
Parsed instructions :
[[PC=1 load [Register:0] [Label:a] [Register:3]
, PC=2 sub [Register:7] [Register:7] [Register:7]
, PC=3 divi [Register:3] [Immediate:10] [Register:4]
, PC=4 muli [Register:7] [Immediate:10] [Register:7]
, PC=5 add [Register:7] [Register:31] [Register:7]
, PC=6 divi [Register:3] [Immediate:10] [Register:3]
, PC=7 bgt [Register:3] [Register:0] [Label:loop]
, PC=8 load [Register:0] [Label:a] [Register:5]
, PC=9 beq [Register:5] [Register:7] [Label:palindrome]
, PC=10 sub [Register:10] [Register:10] [Register:10]
, PC=11 subi [Register:10] [Immediate:1] [Register:10]
, PC=12 end null null null
, PC=13 sub [Register:10] [Register:10] [Register:10]
, PC=14 addi [Register:10] [Immediate:1] [Register:10]
, PC=15 end null null null
]]
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 14 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 12 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Symbol Table :
[{a=0, b=1, main=2}]
Parsed instructions :
[[PC=2 load [Register:0] [Label:a] [Register:4]
, PC=3 end null null null
]]
Symbol Table :
[{prime=11, a=0, for=6, main=1, notprime=14}]
Parsed instructions :
[[PC=1 load [Register:0] [Label:a] [Register:3]
, PC=2 sub [Register:4] [Register:4] [Register:4]
, PC=3 divi [Register:3] [Immediate:2] [Register:4]
, PC=4 sub [Register:6] [Register:6] [Register:6]
, PC=5 addi [Register:6] [Immediate:2] [Register:6]
, PC=6 bgt [Register:6] [Register:4] [Label:prime]
, PC=7 div [Register:3] [Register:6] [Register:7]
, PC=8 beq [Register:0] [Register:31] [Label:notprime]
, PC=9 addi [Register:6] [Immediate:1] [Register:6]
, PC=10 jmp null null [Label:for]
, PC=11 sub [Register:10] [Register:10] [Register:10]
, PC=12 addi [Register:10] [Immediate:1] [Register:10]
, PC=13 end null null null
, PC=14 sub [Register:10] [Register:10] [Register:10]
, PC=15 subi [Register:10] [Immediate:1] [Register:10]
, PC=16 end null null null
]]
Symbol Table :
[{a=0, palindrome=13, loop=3, main=1}]
Parsed instructions :
[[PC=1 load [Register:0] [Label:a] [Register:3]
, PC=2 sub [Register:7] [Register:7] [Register:7]
, PC=3 divi [Register:3] [Immediate:10] [Register:4]
, PC=4 muli [Register:7] [Immediate:10] [Register:7]
, PC=5 add [Register:7] [Register:31] [Register:7]
, PC=6 divi [Register:3] [Immediate:10] [Register:3]
, PC=7 bgt [Register:3] [Register:0] [Label:loop]
, PC=8 load [Register:0] [Label:a] [Register:5]
, PC=9 beq [Register:5] [Register:7] [Label:palindrome]
, PC=10 sub [Register:10] [Register:10] [Register:10]
, PC=11 subi [Register:10] [Immediate:1] [Register:10]
, PC=12 end null null null
, PC=13 sub [Register:10] [Register:10] [Register:10]
, PC=14 addi [Register:10] [Immediate:1] [Register:10]
, PC=15 end null null null
]]
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 12 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Symbol Table :
[{a=0, b=1, main=2}]
Parsed instructions :
[[PC=2 load [Register:0] [Label:a] [Register:4]
, PC=3 end null null null
]]
Symbol Table :
[{prime=11, a=0, for=6, main=1, notprime=14}]
Parsed instructions :
[[PC=1 load [Register:0] [Label:a] [Register:3]
, PC=2 sub [Register:4] [Register:4] [Register:4]
, PC=3 divi [Register:3] [Immediate:2] [Register:4]
, PC=4 sub [Register:6] [Register:6] [Register:6]
, PC=5 addi [Register:6] [Immediate:2] [Register:6]
, PC=6 bgt [Register:6] [Register:4] [Label:prime]
, PC=7 div [Register:3] [Register:6] [Register:7]
, PC=8 beq [Register:0] [Register:31] [Label:notprime]
, PC=9 addi [Register:6] [Immediate:1] [Register:6]
, PC=10 jmp null null [Label:for]
, PC=11 sub [Register:10] [Register:10] [Register:10]
, PC=12 addi [Register:10] [Immediate:1] [Register:10]
, PC=13 end null null null
, PC=14 sub [Register:10] [Register:10] [Register:10]
, PC=15 subi [Register:10] [Immediate:1] [Register:10]
, PC=16 end null null null
]]
Symbol Table :
[{a=0, palindrome=13, loop=3, main=1}]
Parsed instructions :
[[PC=1 load [Register:0] [Label:a] [Register:3]
, PC=2 sub [Register:7] [Register:7] [Register:7]
, PC=3 divi [Register:3] [Immediate:10] [Register:4]
, PC=4 muli [Register:7] [Immediate:10] [Register:7]
, PC=5 add [Register:7] [Register:31] [Register:7]
, PC=6 divi [Register:3] [Immediate:10] [Register:3]
, PC=7 bgt [Register:3] [Register:0] [Label:loop]
, PC=8 load [Register:0] [Label:a] [Register:5]
, PC=9 beq [Register:5] [Register:7] [Label:palindrome]
, PC=10 sub [Register:10] [Register:10] [Register:10]
, PC=11 subi [Register:10] [Immediate:1] [Register:10]
, PC=12 end null null null
, PC=13 sub [Register:10] [Register:10] [Register:10]
, PC=14 addi [Register:10] [Immediate:1] [Register:10]
, PC=15 end null null null
]]
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 12 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Symbol Table :
[{a=0, b=1, main=2}]
Parsed instructions :
[[PC=2 load [Register:0] [Label:a] [Register:4]
, PC=3 end null null null
]]
Symbol Table :
[{prime=11, a=0, for=6, main=1, notprime=14}]
Parsed instructions :
[[PC=1 load [Register:0] [Label:a] [Register:3]
, PC=2 sub [Register:4] [Register:4] [Register:4]
, PC=3 divi [Register:3] [Immediate:2] [Register:4]
, PC=4 sub [Register:6] [Register:6] [Register:6]
, PC=5 addi [Register:6] [Immediate:2] [Register:6]
, PC=6 bgt [Register:6] [Register:4] [Label:prime]
, PC=7 div [Register:3] [Register:6] [Register:7]
, PC=8 beq [Register:0] [Register:31] [Label:notprime]
, PC=9 addi [Register:6] [Immediate:1] [Register:6]
, PC=10 jmp null null [Label:for]
, PC=11 sub [Register:10] [Register:10] [Register:10]
, PC=12 addi [Register:10] [Immediate:1] [Register:10]
, PC=13 end null null null
, PC=14 sub [Register:10] [Register:10] [Register:10]
, PC=15 subi [Register:10] [Immediate:1] [Register:10]
, PC=16 end null null null
]]
Symbol Table :
[{a=0, palindrome=13, loop=3, main=1}]
Parsed instructions :
[[PC=1 load [Register:0] [Label:a] [Register:3]
, PC=2 sub [Register:7] [Register:7] [Register:7]
, PC=3 divi [Register:3] [Immediate:10] [Register:4]
, PC=4 muli [Register:7] [Immediate:10] [Register:7]
, PC=5 add [Register:7] [Register:31] [Register:7]
, PC=6 divi [Register:3] [Immediate:10] [Register:3]
, PC=7 bgt [Register:3] [Register:0] [Label:loop]
, PC=8 load [Register:0] [Label:a] [Register:5]
, PC=9 beq [Register:5] [Register:7] [Label:palindrome]
, PC=10 sub [Register:10] [Register:10] [Register:10]
, PC=11 subi [Register:10] [Immediate:1] [Register:10]
, PC=12 end null null null
, PC=13 sub [Register:10] [Register:10] [Register:10]
, PC=14 addi [Register:10] [Immediate:1] [Register:10]
, PC=15 end null null null
]]
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 14 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 17 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Buildfile: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build-subprojects:
init:
[copy] Copying 17 files to /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/bin
build-project:
[echo] CustomISAAssembler: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/build.xml
build:
make-jar:
[jar] Building jar: /home/chasingcar/acad/sem-5/ca/cs311-lab/assignment-2/supporting_files/submissions/jars/assembler.jar
BUILD SUCCESSFUL
Total time: 0 seconds
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0
Error: LinkageError occurred while loading main class main.Main
java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 62.0), this version of the Java Runtime only recognizes class file versions up to 61.0

View File

@ -0,0 +1,9 @@
.data
a:
10
b:
20
.text
main:
load %x0, $a, %x4
end

Binary file not shown.

View File

@ -0,0 +1,22 @@
.data
a:
12321
.text
main:
load %x0, $a, %x3
sub %x7, %x7, %x7
loop:
divi %x3, 10, %x4
muli %x7, 10, %x7
add %x7, %x31, %x7
divi %x3, 10, %x3
bgt %x3, %x0, loop
load %x0, $a, %x5
beq %x5, %x7, palindrome
sub %x10, %x10, %x10
subi %x10, 1, %x10
end
palindrome:
sub %x10, %x10, %x10
addi %x10, 1, %x10
end

Binary file not shown.

View File

@ -0,0 +1,24 @@
.data
a:
11
.text
main:
load %x0, $a, %x3
sub %x4, %x4, %x4
divi %x3, 2, %x4
sub %x6, %x6, %x6
addi %x6, 2, %x6
for:
bgt %x6, %x4, prime
div %x3, %x6, %x7
beq %x0, %x31, notprime
addi %x6, 1, %x6
jmp for
prime:
sub %x10, %x10, %x10
addi %x10, 1, %x10
end
notprime:
sub %x10, %x10, %x10
subi %x10, 1, %x10
end

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,76 @@
#!/bin/python
import sys
import os
import zipfile
import shutil
import filecmp
import subprocess
from threading import Timer
zip_file = sys.argv[1]
l = len(zip_file.split("/"))
print("Students :\t" + zip_file.split("/")[l-1].split("_")[0] + " and " + zip_file.split("/")[l-1].split("_")[1].split(".")[0])
print("")
submissions_temp_dir = "./submissions/"
if not os.path.exists(submissions_temp_dir):
os.mkdir(submissions_temp_dir)
zip_ref = zipfile.ZipFile(zip_file, 'r')
zip_ref.extractall(submissions_temp_dir)
zip_ref.close()
shutil.copyfile("build.xml", submissions_temp_dir + "/build.xml")
os.chdir(submissions_temp_dir)
stdout_file = open("./tmp.output", 'a')
popen_args = ["ant", "make-jar"]
proc = subprocess.Popen(popen_args, stdout = stdout_file, stderr = stdout_file)
timer = Timer(5, proc.kill)
try:
timer.start()
stdout, stderr = proc.communicate()
finally:
timer.cancel()
stdout_file.close()
if not os.path.exists("jars/assembler.jar"):
print("compilation failed. jar file not created")
sys.exit(0)
test_cases_dir = "../test_cases"
total_marks = 0
scored_marks = 0
for testcase in os.listdir(test_cases_dir):
if ".asm" in testcase:
total_marks = total_marks + 1
stdout_file = open("./tmp.output", 'a')
popen_args = ["java", "-Xmx1g", "-jar", "jars/assembler.jar", test_cases_dir + "/" + testcase, "./" + testcase.split(".")[0] + ".observedoutput"]
proc = subprocess.Popen(popen_args, stdout = stdout_file, stderr = stdout_file)
timer = Timer(5, proc.kill)
try:
timer.start()
stdout, stderr = proc.communicate()
finally:
timer.cancel()
stdout_file.close()
if os.path.exists("./" + testcase.split(".")[0] + ".observedoutput"):
if filecmp.cmp(test_cases_dir + "/" + testcase.split(".")[0] + ".out", "./" + testcase.split(".")[0] + ".observedoutput") == True:
scored_marks = scored_marks + 1
print(testcase + " : PASS!")
else:
print(testcase + " : fail - incorrect object file contents")
else:
print(testcase + " : fail - file not created")
os.chdir("..")
# shutil.rmtree(submissions_temp_dir)
print("\ntotal score = " + str(scored_marks) + " out of " + str(total_marks))

View File

@ -0,0 +1,116 @@
package configuration;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import generic.Misc;
public class Configuration {
public static int ALU_count;
public static int ALU_latency;
public static int ALU_reciprocal_of_throughput;
public static int multiplier_count;
public static int multiplier_latency;
public static int multiplier_reciprocal_of_throughput;
public static int divider_count;
public static int divider_latency;
public static int divider_reciprocal_of_throughput;
public static int L1i_numberOfLines;
public static int L1i_latency;
public static int L1i_associativity;
public static String L1i_replacementPolicy;
public static int L1d_numberOfLines;
public static int L1d_latency;
public static int L1d_associativity;
public static String L1d_replacementPolicy;
public static int L2_numberOfLines;
public static int L2_latency;
public static int L2_associativity;
public static String L2_replacementPolicy;
public static int mainMemoryLatency;
public static void parseConfiguratioFile(String configFileName)
{
Document doc = null;
try
{
File file = new File(configFileName);
DocumentBuilderFactory DBFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder DBuilder = DBFactory.newDocumentBuilder();
doc = DBuilder.parse(file);
doc.getDocumentElement().normalize();
}
catch(Exception e)
{
e.printStackTrace();
Misc.printErrorAndExit("Error in reading config file : " + e);
}
NodeList nodeLst = doc.getElementsByTagName("ALU");
Element elmnt = (Element) nodeLst.item(0);
ALU_count = Integer.parseInt(getImmediateString("Count", elmnt));
ALU_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
ALU_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("Multiplier");
elmnt = (Element) nodeLst.item(0);
multiplier_count = Integer.parseInt(getImmediateString("Count", elmnt));
multiplier_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
multiplier_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("Divider");
elmnt = (Element) nodeLst.item(0);
divider_count = Integer.parseInt(getImmediateString("Count", elmnt));
divider_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
divider_reciprocal_of_throughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", elmnt));
nodeLst = doc.getElementsByTagName("L1iCache");
elmnt = (Element) nodeLst.item(0);
L1i_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L1i_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L1i_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L1i_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("L1dCache");
elmnt = (Element) nodeLst.item(0);
L1d_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L1d_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L1d_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L1d_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("L2Cache");
elmnt = (Element) nodeLst.item(0);
L2_numberOfLines = Integer.parseInt(getImmediateString("NumberOfLines", elmnt));
L2_latency = Integer.parseInt(getImmediateString("Latency", elmnt));
L2_associativity = Integer.parseInt(getImmediateString("Associativity", elmnt));
L2_replacementPolicy = getImmediateString("ReplacementPolicy", elmnt);
nodeLst = doc.getElementsByTagName("Configuration");
elmnt = (Element) nodeLst.item(0);
mainMemoryLatency = Integer.parseInt(getImmediateString("MainMemoryLatency", elmnt));
}
private static String getImmediateString(String tagName, Element parent) // Get the immediate string value of a particular tag name under a particular parent tag
{
NodeList nodeLst = parent.getElementsByTagName(tagName);
if (nodeLst.item(0) == null)
{
Misc.printErrorAndExit("XML Configuration error : Item \"" + tagName + "\" not found inside the \"" + parent.getTagName() + "\" tag in the configuration file!!");
}
Element NodeElmnt = (Element) nodeLst.item(0);
NodeList resultNode = NodeElmnt.getChildNodes();
return ((Node) resultNode.item(0)).getNodeValue();
}
}

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Configuration>
<FunctionalUnits>
<ALU>
<Count>2</Count>
<Latency>1</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</ALU>
<Multiplier>
<Count>1</Count>
<Latency>4</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Multiplier>
<Divider>
<Count>1</Count>
<Latency>10</Latency>
<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
</Divider>
</FunctionalUnits>
<L1iCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1iCache>
<L1dCache>
<NumberOfLines>256</NumberOfLines>
<Latency>2</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L1dCache>
<L2Cache>
<NumberOfLines>2048</NumberOfLines>
<Latency>10</Latency>
<Associativity>4</Associativity>
<ReplacementPolicy>LRU</ReplacementPolicy>
</L2Cache>
<MainMemoryLatency>40</MainMemoryLatency>
</Configuration>

View File

@ -0,0 +1,96 @@
package generic;
public class Instruction {
public enum OperationType {add, addi, sub, subi, mul, muli, div, divi, and, andi, or, ori, xor, xori, slt, slti, sll, slli, srl, srli, sra, srai, load, store, jmp, beq, bne, blt, bgt, end};
int programCounter;
OperationType operationType;
Operand sourceOperand1;
Operand sourceOperand2;
Operand destinationOperand;
public int getProgramCounter() {
return programCounter;
}
public void setProgramCounter(int programCounter) {
this.programCounter = programCounter;
}
public OperationType getOperationType() {
return operationType;
}
public void setOperationType(OperationType operationType) {
this.operationType = operationType;
}
public Operand getSourceOperand1() {
return sourceOperand1;
}
public void setSourceOperand1(Operand sourceOperand1) {
this.sourceOperand1 = sourceOperand1;
}
public Operand getSourceOperand2() {
return sourceOperand2;
}
public void setSourceOperand2(Operand sourceOperand2) {
this.sourceOperand2 = sourceOperand2;
}
public Operand getDestinationOperand() {
return destinationOperand;
}
public void setDestinationOperand(Operand destinationOperand) {
this.destinationOperand = destinationOperand;
}
public String toString()
{
if(sourceOperand1 != null)
{
if(sourceOperand2 != null)
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\t" + sourceOperand2 + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\t" + sourceOperand2 + "\tnull" + "\n";
}
}
else
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\tnull" + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\t" + sourceOperand1 + "\tnull" + "\tnull" + "\n";
}
}
}
else
{
if(sourceOperand2 != null)
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\t" + sourceOperand2 + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\t" + sourceOperand2 + "\tnull" + "\n";
}
}
else
{
if(destinationOperand != null)
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\tnull" + "\t" + destinationOperand + "\n";
}
else
{
return "PC="+ programCounter + "\t" + operationType + "\tnull" + "\tnull" + "\tnull" + "\n";
}
}
}
}
}

View File

@ -0,0 +1,10 @@
package generic;
public class Misc {
public static void printErrorAndExit(String message)
{
System.err.println(message);
System.exit(1);
}
}

View File

@ -0,0 +1,41 @@
package generic;
public class Operand {
public enum OperandType {Register, Immediate, Label};
OperandType operandType;
int value;
String labelValue; //only applicable for Label type;
//Note that Label type is only applicable for functional emulation of assembly file
public OperandType getOperandType() {
return operandType;
}
public void setOperandType(OperandType operandType) {
this.operandType = operandType;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public String getLabelValue() {
return labelValue;
}
public void setLabelValue(String labelValue) {
this.labelValue = labelValue;
}
public String toString()
{
if(operandType == OperandType.Register || operandType == OperandType.Immediate)
{
return "[" + operandType.toString() + ":" + value + "]";
}
else
{
return "[" + operandType.toString() + ":" + labelValue + "]";
}
}
}

View File

@ -0,0 +1,57 @@
package generic;
import processor.Clock;
import processor.Processor;
public class Simulator {
static Processor processor;
static boolean simulationComplete;
public static void setupSimulation(String assemblyProgramFile, Processor p)
{
Simulator.processor = p;
loadProgram(assemblyProgramFile);
simulationComplete = false;
}
static void loadProgram(String assemblyProgramFile)
{
/*
* TODO
* 1. load the program into memory according to the program layout described
* in the ISA specification
* 2. set PC to the address of the first instruction in the main
* 3. set the following registers:
* x0 = 0
* x1 = 65535
* x2 = 65535
*/
}
public static void simulate()
{
while(simulationComplete == false)
{
processor.getIFUnit().performIF();
Clock.incrementClock();
processor.getOFUnit().performOF();
Clock.incrementClock();
processor.getEXUnit().performEX();
Clock.incrementClock();
processor.getMAUnit().performMA();
Clock.incrementClock();
processor.getRWUnit().performRW();
Clock.incrementClock();
}
// TODO
// set statistics
}
public static void setSimulationComplete(boolean value)
{
simulationComplete = value;
}
}

View File

@ -0,0 +1,39 @@
package generic;
import java.io.PrintWriter;
public class Statistics {
// TODO add your statistics here
static int numberOfInstructions;
static int numberOfCycles;
public static void printStatistics(String statFile)
{
try
{
PrintWriter writer = new PrintWriter(statFile);
writer.println("Number of instructions executed = " + numberOfInstructions);
writer.println("Number of cycles taken = " + numberOfCycles);
// TODO add code here to print statistics in the output file
writer.close();
}
catch(Exception e)
{
Misc.printErrorAndExit(e.getMessage());
}
}
// TODO write functions to update statistics
public void setNumberOfInstructions(int numberOfInstructions) {
Statistics.numberOfInstructions = numberOfInstructions;
}
public void setNumberOfCycles(int numberOfCycles) {
Statistics.numberOfCycles = numberOfCycles;
}
}

View File

@ -0,0 +1,50 @@
package main;
import java.util.ArrayList;
import configuration.Configuration;
import generic.Misc;
import generic.Statistics;
import processor.Processor;
import processor.memorysystem.MainMemory;
import processor.pipeline.RegisterFile;
import generic.Simulator;
public class Main {
public static void main(String[] args) {
if(args.length != 3)
{
Misc.printErrorAndExit("usage: java -jar <path-to-jar-file> <path-to-config-file> <path-to-stat-file> <path-to-object-file>\n");
}
Configuration.parseConfiguratioFile(args[0]);
Processor processor = new Processor();
Simulator.setupSimulation(args[2], processor);
Simulator.simulate();
processor.printState(0, 30); // ((0, 0) refers to the range of main memory addresses we wish to print. this is an empty set.
Statistics.printStatistics(args[1]);
System.out.println("Hash of the Processor State = "+getHashCode(processor.getRegisterFile(), processor.getMainMemory()));
}
static int getHashCode(RegisterFile registerState, MainMemory memoryState) {
ArrayList<Integer> hash = new ArrayList<Integer>();
hash.add(registerState.getProgramCounter());
for(int i=0;i<32;i++) {
hash.add(registerState.getValue(i));
}
for(int i=0;i<65536;i++) {
hash.add(memoryState.getWord(i));
}
return hash.hashCode();
}
}

View File

@ -0,0 +1,15 @@
package processor;
public class Clock {
static long currentTime = 0;
public static void incrementClock()
{
currentTime++;
}
public static long getCurrentTime()
{
return currentTime;
}
}

View File

@ -0,0 +1,97 @@
package processor;
import processor.memorysystem.MainMemory;
import processor.pipeline.EX_IF_LatchType;
import processor.pipeline.EX_MA_LatchType;
import processor.pipeline.Execute;
import processor.pipeline.IF_EnableLatchType;
import processor.pipeline.IF_OF_LatchType;
import processor.pipeline.InstructionFetch;
import processor.pipeline.MA_RW_LatchType;
import processor.pipeline.MemoryAccess;
import processor.pipeline.OF_EX_LatchType;
import processor.pipeline.OperandFetch;
import processor.pipeline.RegisterFile;
import processor.pipeline.RegisterWrite;
public class Processor {
RegisterFile registerFile;
MainMemory mainMemory;
IF_EnableLatchType IF_EnableLatch;
IF_OF_LatchType IF_OF_Latch;
OF_EX_LatchType OF_EX_Latch;
EX_MA_LatchType EX_MA_Latch;
EX_IF_LatchType EX_IF_Latch;
MA_RW_LatchType MA_RW_Latch;
InstructionFetch IFUnit;
OperandFetch OFUnit;
Execute EXUnit;
MemoryAccess MAUnit;
RegisterWrite RWUnit;
public Processor()
{
registerFile = new RegisterFile();
mainMemory = new MainMemory();
IF_EnableLatch = new IF_EnableLatchType();
IF_OF_Latch = new IF_OF_LatchType();
OF_EX_Latch = new OF_EX_LatchType();
EX_MA_Latch = new EX_MA_LatchType();
EX_IF_Latch = new EX_IF_LatchType();
MA_RW_Latch = new MA_RW_LatchType();
IFUnit = new InstructionFetch(this, IF_EnableLatch, IF_OF_Latch, EX_IF_Latch);
OFUnit = new OperandFetch(this, IF_OF_Latch, OF_EX_Latch);
EXUnit = new Execute(this, OF_EX_Latch, EX_MA_Latch, EX_IF_Latch);
MAUnit = new MemoryAccess(this, EX_MA_Latch, MA_RW_Latch);
RWUnit = new RegisterWrite(this, MA_RW_Latch, IF_EnableLatch);
}
public void printState(int memoryStartingAddress, int memoryEndingAddress)
{
System.out.println(registerFile.getContentsAsString());
System.out.println(mainMemory.getContentsAsString(memoryStartingAddress, memoryEndingAddress));
}
public RegisterFile getRegisterFile() {
return registerFile;
}
public void setRegisterFile(RegisterFile registerFile) {
this.registerFile = registerFile;
}
public MainMemory getMainMemory() {
return mainMemory;
}
public void setMainMemory(MainMemory mainMemory) {
this.mainMemory = mainMemory;
}
public InstructionFetch getIFUnit() {
return IFUnit;
}
public OperandFetch getOFUnit() {
return OFUnit;
}
public Execute getEXUnit() {
return EXUnit;
}
public MemoryAccess getMAUnit() {
return MAUnit;
}
public RegisterWrite getRWUnit() {
return RWUnit;
}
}

View File

@ -0,0 +1,35 @@
package processor.memorysystem;
public class MainMemory {
int[] memory;
public MainMemory()
{
memory = new int[65536];
}
public int getWord(int address)
{
return memory[address];
}
public void setWord(int address, int value)
{
memory[address] = value;
}
public String getContentsAsString(int startingAddress, int endingAddress)
{
if(startingAddress == endingAddress)
return "";
StringBuilder sb = new StringBuilder();
sb.append("\nMain Memory Contents:\n\n");
for(int i = startingAddress; i <= endingAddress; i++)
{
sb.append(i + "\t\t: " + memory[i] + "\n");
}
sb.append("\n");
return sb.toString();
}
}

Some files were not shown because too many files have changed in this diff Show More