//请根据你的包路径修改
//package ustc.qyq;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.Reader;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.text.StyledEditorKit.ForegroundAction;
import org.omg.CORBA.PUBLIC_MEMBER;
import com.sun.org.apache.xml.internal.resolver.helpers.PublicId;
import jdk.internal.dynalink.beans.StaticClass;
/**
* @author yanqing.qyq 2012-2015@USTC
* 模板说明:该模板主要提供依赖Swing组件提供的JPanle,JFrame,JButton等提供的GUI。使用“监听器”模式监听各个Button的事件,从而根据具体事件执行不同方法。
* Tomasulo算法核心需同学们自行完成,见说明(4)
* 对于界面必须修改部分,见说明(1),(2),(3)
*
* (1)说明:根据你的设计完善指令设置中的下拉框内容
* (2)说明:请根据你的设计指定各个面板(指令状态,保留站,Load部件,寄存器部件)的大小
* (3)说明:设置界面默认指令
* (4)说明: Tomasulo算法实现
*/
public class Tomasulo extends JFrame implements ActionListener{
/*
* 界面上有六个面板:
* panel1 : 指令设置 (已设置)
* panel2 : 执行时间设置 (已设置)
* panel3 : 指令状态
* panel4 : 保留站状态
* panel5 : Load部件
* panel6 : 寄存器状态
*/
private JPanel panel1,panel2,panel3,panel4,panel5,panel6;
/*
* 四个操作按钮:步进,进5步,重置,执行
*/
private JButton stepbut,step5but,resetbut,startbut;
/*
* 指令选择框
*/
private JComboBox instbox[]=new JComboBox[24];
/*
* 每个面板的名称
*/
private JLabel instl, timel, tl1,tl2,tl3,tl4,resl,regl,ldl,insl,stepsl;
private int time[]=new int[4];
/*
* 部件执行时间的输入框
*/
private JTextField tt1,tt2,tt3,tt4;
private int intv[][]=new int[6][4],instnow=0;
int cnow;
private int cal[][]={{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0}};
private int ld[][]={{0,0},{0,0},{0,0}};
private int ff[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/*
* (1)说明:根据你的设计完善指令设置中的下拉框内容
* inst: 指令下拉框内容:"NOP","L.D","ADD.D","SUB.D","MULT.D","DIV.D"…………
* fx: 目的寄存器下拉框内容:"F0","F2","F4","F6","F8" …………
* rx: 源操作数寄存器内容:"R0","R1","R2","R3","R4","R5","R6","R7","R8","R9" …………
* ix: 立即数下拉框内容:"0","1","2","3","4","5","6","7","8","9" …………
*/
public static int m=0;
private String inst[]={"NOP","L.D","ADD.D","SUB.D","MULT.D","DIV.D"},
fx[]={"F0","F2","F4","F6","F8","F10","F12","F14","F16","F18","F20","F22","F24","F26","F28","F30"},
rx[]={"R0","R1","R2","R3","R4","R5","R6"},
ix[]={"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"};
/*
* (2)说明:请根据你的设计指定各个面板(指令状态,保留站,Load部件,寄存器部件)的大小
* 指令状态 面板
* 保留站 面板
* Load部件 面板
* 寄存器 面板
* 的大小
*/
/*instst:指令状态列表(7行4列)
*resst:保留站列表(6行8列)
*ldst:load缓存列表(4行4列)
*regst:寄存器列表(3行17列)
* */
private String instst[][]=new String[7][4], resst[][]=new String[6][8],
ldst[][]=new String[4][4], regst[][]=new String[3][17];
private String culinstst[][]=new String[7][4], culresst[][]=new String[6][8],
culldst[][]=new String[4][4], culregst[][]=new String[3][17];
/*将以上String值加入到列表框中*/
private JLabel instjl[][]=new JLabel[7][4], resjl[][]=new JLabel[6][8],
ldjl[][]=new JLabel[4][4], regjl[][]=new JLabel[3][17];
/**
* 初始化指令队列,指令状态集,保留站,Load缓存站,寄存器站
*/
private Instruction instruction[] = new Instruction[6];
private InstructionStation IS[] = new InstructionStation[6];
private ReservationStation RS[] = new ReservationStation[5];
private LoadStation LS[] = new LoadStation[3];
private RegisterStation RegS[] = new RegisterStation[16];
//构造方法
public Tomasulo(){
super("Tomasulo Simulator");
//设置布局
Container cp=getContentPane();
FlowLayout layout=new FlowLayout();
cp.setLayout(layout);
//指令设置。GridLayout(int 指令条数, int 操作码+操作数, int hgap, int vgap)
instl = new JLabel("指令设置");
panel1 = new JPanel(new GridLayout(6,4,0,0));
panel1.setPreferredSize(new Dimension(350, 150));
panel1.setBorder(new EtchedBorder(EtchedBorder.RAISED));
//操作按钮:执行,重设,步进,步进5步
timel = new JLabel("执行时间设置");
panel2 = new JPanel(new GridLayout(2,4,0,0));
panel2.setPreferredSize(new Dimension(280, 80));
panel2.setBorder(new EtchedBorder(EtchedBorder.RAISED));
//指令状态
insl = new JLabel("指令状态");
panel3 = new JPanel(new GridLayout(7,4,0,0));
panel3.setPreferredSize(new Dimension(420, 175));
panel3.setBorder(new EtchedBorder(EtchedBorder.RAISED));
//保留站
resl = new JLabel("保留站");
panel4 = new JPanel(new GridLayout(6,7,0,0));
panel4.setPreferredSize(new Dimension(420, 150));
panel4.setBorder(new EtchedBorder(EtchedBorder.RAISED));
//Load部件
ldl = new JLabel("Load部件");
panel5 = new JPanel(new GridLayout(4,4,0,0));
panel5.setPreferredSize(new Dimension(200, 100));
panel5.setBorder(new EtchedBorder(EtchedBorder.RAISED));
//寄存器状态
regl = new JLabel("寄存器");
panel6 = new JPanel(new GridLayout(3,17,0,0));
panel6.setPreferredSize(new Dimension(740, 75));
panel6.setBorder(new EtchedBorder(EtchedBorder.RAISED));
tl1 = new JLabel("Load");
tl2 = new JLabel("加/减");
tl3 = new JLabel("乘法");
tl4 = new JLabel("除法");
//操作按钮:执行,重设,步进,步进5步
stepsl = new JLabel();
stepsl.setPreferredSize(new Dimension(200, 30));
stepsl.setHorizontalAlignment(SwingConstants.CENTER);
stepsl.setBorder(new EtchedBorder(EtchedBorder.RAISED));
stepbut = new JButton("步进");
stepbut.addActionListener(this);
step5but = new JButton("步进5步");
step5but.addActionListener(this);
startbut = new JButton("执行");
startbut.addActionListener(this);
resetbut= new JButton("重设");
resetbut.addActionListener(this);
/*设置执行周期初始值*/
tt1 = new JTextField("2");
tt2 = new JTextField("2");
tt3 = new JTextField("10");
tt4 = new JTextField("40");
//指令设置
/*
* 设置指令选择框(操作码,操作数,立即数等)的default选择
*/
for (int i=0;i<2;i++)
for (int j=0;j<4;j++){
if (j==0){
instbox[i*4+j]=new JComboBox(inst);
}
else if (j==1){
instbox[i*4+j]=new JComboBox(fx);
}
else if (j==2){
instbox[i*4+j]=new JComboBox(ix);
}
else {
instbox[i*4+j]=new JComboBox(rx);
}
instbox[i*4+j].addActionListener(this);
panel1.add(instbox[i*4+j]);
}
for (int i=2;i<6;i++)
for (int j=0;j<4;j++){
if (j==0){
instbox[i*4+j]=new JComboB
- 1
- 2
前往页