# Lab 9
Name: Aarya
Roll No.: CS22B018
---
## Question 1
**Code and TestBench**
```verilog=
module ALU(input [31:0]a, input [31:0]b,input [1:0]c,output [31:0]o);
wire [31:0]_W1;
wire [31:0]_W2;
wire [31:0]_W3;
wire [31:0]_W4;
assign _W3=a+b;
assign _W4=a-b;
assign _W1=a&b;
assign _W2=a|b;
assign o = (c[0]==1'b0) ? ((c[1]==1'b0) ? _W1 : _W2 ) :
((c[1]==1'b0) ? _W3 : _W4 );
endmodule
module ALU_TB();
//Select Lines : 00 - AND, 01 - OR, 10 - ADD, 11 - SUB
reg [31:0]a; reg [31:0]b;
reg [1:0]s;
wire [31:0]out;
ALU Q(.a(a), .b(b), .c(s) , .o(out));
initial
begin
$monitor("a = %d, b = %d, selectlines : s0 = %b , s1 = %b, Output = %d ",a,b,s[0],s[1], out);
a = 8'd5; b = 8'd7; s[1] = 0; s[0] = 0;
#10
a = 8'd3; b = 8'd9; s[1] = 0; s[0] = 1;
#10
a = 8'd6; b = 8'd3; s[1] = 1; s[0] = 0;
#10
a = 8'd9; b = 8'd2; s[1] = 1; s[0] = 1;
#10
a = 8'd9; b = 8'd7; s[1] = 1; s[0] = 0;
#10
a = 8'd10; b = 8'd8; s[1] = 0; s[0] = 1;
#10
a = 8'd11; b = 8'd3; s[1] = 0; s[0] = 0;
#10
a = 8'd5; b = 8'd2; s[1] = 1; s[0] = 1;
end
endmodule
```
**Output**

## Question 2
**Code and TestBench**
```verilog=
module simpleProcessor(input [7:0] ins,
output reg [7:0]_Out);
reg [7:0]loc;
reg [2:0]off;
reg [7:0] memory [255:0]; // 256 bytes of memory
reg [7:0] regFile [15:0]; // 16 general purpose 8-bit registers
always@(*)
begin
regFile[0]=8'b00000000;
regFile[2]=8'b00000111;
memory[1]=8'b00000011;
memory[0]=8'b00000010;
regFile[1]=8'b00000000;
if(ins[7] == 1'b0)
begin
loc = regFile[ins[1:0]];
off = ins[4:2];
regFile[ins[6:5]] = memory[loc + off];
_Out = regFile[ins[6:5]];
end
else
begin
loc = regFile[ins[1:0]];
off = ins[4:2];
memory[loc + off] = regFile[ins[6:5]];
_Out = memory[loc + off];
end
end
endmodule
module Q2bench();
wire [7:0]_Out;
reg [7:0]ins;
simpleProcessor Dut(.ins(ins), ._Out(_Out));
initial
begin
$monitor(" Output : %b ",_Out);
ins = 8'b00000000;
#5
ins = 8'b11000001;
end
endmodule
```
**Output**

---
## Question 3
**Content of inscount0.log**
```
Count 724514
```
**Code in inscount0.cpp**
```c=
/*
* Copyright (C) 2004-2021 Intel Corporation.
* SPDX-License-Identifier: MIT
*/
#include <iostream>
#include <fstream>
#include "pin.H"
using std::cerr;
using std::endl;
using std::ios;
using std::ofstream;
using std::string;
ofstream OutFile;
// The running count of instructions is kept here
// make it static to help the compiler optimize docount
static UINT64 icount = 0;
// This function is called before every instruction is executed
VOID docount() { icount++; }
// Pin calls this function every time a new instruction is encountered
VOID Instruction(INS ins, VOID* v)
{
// Insert a call to docount before every instruction, no arguments are passed
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_END);
}
KNOB< string > KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "inscount.out", "specify output file name");
// This function is called when the application exits
VOID Fini(INT32 code, VOID* v)
{
// Write to a file since cout and cerr maybe closed by the application
OutFile.setf(ios::showbase);
OutFile << "Count " << icount << endl;
OutFile.close();
}
/* ===================================================================== */
/* Print Help Message */
/* ===================================================================== */
INT32 Usage()
{
cerr << "This tool counts the number of dynamic instructions executed" << endl;
cerr << endl << KNOB_BASE::StringKnobSummary() << endl;
return -1;
}
/* ===================================================================== */
/* Main */
/* ===================================================================== */
/* argc, argv are the entire command line: pin -t <toolname> -- ... */
/* ===================================================================== */
int main(int argc, char* argv[])
{
// Initialize pin
if (PIN_Init(argc, argv)) return Usage();
OutFile.open(KnobOutputFile.Value().c_str());
// Register Instruction to be called to instrument instructions
INS_AddInstrumentFunction(Instruction, 0);
// Register Fini to be called when the application exits
PIN_AddFiniFunction(Fini, 0);
// Start the program, never returns
PIN_StartProgram();
return 0;
}
```
**C language Code**
```c=
#include<stdio.h>
int main()
{
int a[5];
int eveCount=0;
for(int i=0;i<5;i++)
{
a[i]=i+1;
}
for(int i=0;i<5;i++)
{
if(a[i]%2==0)
{
eveCount++;
}
}
printf("%d\n",eveCount);
}
```
**Content of inscount0.log for code**
```
Count 134339