⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cacheview.cpp

📁 计算机体系结构中cache实现原理及解决方案的模拟程序.
💻 CPP
字号:
// CacheView.cpp : implementation of the CCacheView class
//

#include "stdafx.h"
#include "Cache.h"

#include "CacheDoc.h"
#include "CacheView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCacheView

IMPLEMENT_DYNCREATE(CCacheView, CView)

BEGIN_MESSAGE_MAP(CCacheView, CView)
	//{{AFX_MSG_MAP(CCacheView)
	ON_WM_TIMER()
	ON_COMMAND(ID_Continu, Oncontinu)
	ON_COMMAND(ID_STOP, OnStop)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCacheView construction/destruction

CCacheView::CCacheView()
{
	// TODO: add construction code here

}

CCacheView::~CCacheView()
{
}

BOOL CCacheView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCacheView drawing

void CCacheView::OnDraw(CDC* pDC)
{
	CCacheDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if(pDoc->m_draw)
	{
		//pDC->Rectangle(100,100,400,400);
		//pDC->TextOut(10,10,"2456");
		a.Format("Block_Size is %d kb",pDoc->NewBlock.CBlock_Size);
		pDC->TextOut(10,30,a);
		a.Format("Set_Size is %d",pDoc->NewBlock.CSet_Size);
		pDC->TextOut(10,50,a);
		a.Format("Way_Size is %d",pDoc->NewBlock.CWay_Size);
		pDC->TextOut(10,70,a);
		a.Format("Cache_Size is %d kb",pDoc->NewBlock.CCache_Size);
		pDC->TextOut(10,90,a);
		if(pDoc->m_hit==0)
		{
			pDC->TextOut(10,110,"Miss");
			pDoc->m_missnum++;
			a.Format("Set NO. is %d",pDoc->Set_Num);
			pDC->TextOut(10,130,a);
			a.Format("Tag NO. is %ld",pDoc->CCache[pDoc->Set_Num][pDoc->Count].tag);
			pDC->TextOut(10,150,a);
		}
		else
		{
			pDC->TextOut(10,110,"Hit");
			pDoc->m_hitnum++;
			a.Format("Set NO. is %d",pDoc->Set_Num);
			pDC->TextOut(10,130,a);
			a.Format("Tag NO. is %ld",pDoc->CCache[pDoc->Set_Num][pDoc->Count].tag);
			pDC->TextOut(10,150,a);
		}
		a.Format("Dirty %d",pDoc->CCache[pDoc->Set_Num][pDoc->Count].dirty);
		pDC->TextOut(10,170,a);

		a.Format("Way NO. %d",pDoc->Count);
		pDC->TextOut(10,190,a);

		a.Format("Instruction Exicute %c,%ld",pDoc->buffer[pDoc->I_count],pDoc->Add_buffer[pDoc->J_count]);
		pDC->TextOut(10,210,a);

		//打印命令行

		for(int nu=0;nu<10&&(pDoc->buffer[pDoc->I_count+nu]!='e');nu++)
		{
			a.Format("Instructions %c,%ld",pDoc->buffer[pDoc->I_count+nu],pDoc->Add_buffer[pDoc->J_count+nu]);
			pDC->TextOut(10,230+20*nu,a);
		}
			
		//开始画图
		//矩形
		pDC->Rectangle(300,10,684,650);
		//开始画竖线
		for(int ii=1;ii<pDoc->NewBlock.CSet_Size;ii++)
		{
			pDC->MoveTo(300+384/(pDoc->NewBlock.CSet_Size)*ii,10);
			pDC->LineTo(300+384/(pDoc->NewBlock.CSet_Size)*ii,650);
		}
		//开始画横线
		for(int jj=1;jj<pDoc->NewBlock.CWay_Size;jj++)
		{
			pDC->MoveTo(300,10+640/(pDoc->NewBlock.CWay_Size)*jj);
			pDC->LineTo(684,10+640/(pDoc->NewBlock.CWay_Size)*jj);
		}
		//开始画已经被写的cache
		for(int iii=0;iii<pDoc->NewBlock.CSet_Size;iii++)
			for(int jjj=0;jjj<pDoc->NewBlock.CWay_Size;jjj++)
			{
				if(pDoc->CCache[iii][jjj].valid==1)
				{
					CBrush brush(RGB(49,21,200));
					pDC->SelectObject(&brush);
					CRect rect(300+384/(pDoc->NewBlock.CSet_Size)*iii,10+640/(pDoc->NewBlock.CWay_Size)*jjj,300+384/(pDoc->NewBlock.CSet_Size)*(iii+1),10+640/(pDoc->NewBlock.CWay_Size)*(jjj+1));
					pDC->Ellipse(rect);
				}
				if(pDoc->CCache[iii][jjj].dirty==1)
				{
					CBrush brush(RGB(255,0,0));
					pDC->SelectObject(&brush);
					CRect rect(300+384/(pDoc->NewBlock.CSet_Size)*iii,10+640/(pDoc->NewBlock.CWay_Size)*jjj,300+384/(pDoc->NewBlock.CSet_Size)*(iii+1),10+640/(pDoc->NewBlock.CWay_Size)*(jjj+1));
					pDC->Ellipse(rect);
				}
			}
		//开始指令cache
		//开始画图
		//矩形
		CBrush brush(RGB(255,255,255));
		pDC->SelectObject(&brush);
		pDC->Rectangle(700,10,1020,650);
		//开始画竖线
		for(int iiii=1;iiii<pDoc->NewBlock.CSet_Size;iiii++)
		{
			pDC->MoveTo(700+320/(pDoc->NewBlock.CSet_Size)*iiii,10);
			pDC->LineTo(700+320/(pDoc->NewBlock.CSet_Size)*iiii,650);
		}
		//开始画横线
		for(int jjjj=1;jjjj<pDoc->NewBlock.CWay_Size;jjjj++)
		{
			pDC->MoveTo(700,10+640/(pDoc->NewBlock.CWay_Size)*jjjj);
			pDC->LineTo(1020,10+640/(pDoc->NewBlock.CWay_Size)*jjjj);
		}
		a.Format("Instruction Pointer to %d",pDoc->Ins_pointer);
		pDC->TextOut(10,430,a);

		a.Format("Hit Times%f",pDoc->m_hitnum);
		pDC->TextOut(10,450,a);

		a.Format("Miss Times%f",pDoc->m_missnum);
		pDC->TextOut(10,470,a);

		pDoc->m_missrate=pDoc->m_missnum/(pDoc->m_hitnum+pDoc->m_missnum);

		a.Format("Miss Rate%f",pDoc->m_missrate);
		pDC->TextOut(10,490,a);

		//开始指令的椭圆
		pDoc->NewBlock.CSet_Size;
		
		for(int iiiii=0;iiiii<pDoc->NewBlock.CSet_Size;iiiii++)
			for(int jjjjj=0;jjjjj<pDoc->NewBlock.CWay_Size;jjjjj++)
			{
				if(pDoc->CIns_Cache[iiiii][jjjjj].valid==1)
				{
					CBrush brush(RGB(49,21,200));
					pDC->SelectObject(&brush);
					CRect rect(700+320/(pDoc->NewBlock.CSet_Size)*iiiii,10+640/(pDoc->NewBlock.CWay_Size)*jjjjj,700+320/(pDoc->NewBlock.CSet_Size)*(iiiii+1),10+640/(pDoc->NewBlock.CWay_Size)*(jjjjj+1));
					pDC->Ellipse(rect);
				}
				if(pDoc->CIns_Cache[iiiii][jjjjj].dirty==1)
				{
					CBrush brush(RGB(255,0,0));
					pDC->SelectObject(&brush);
					CRect rect(700+320/(pDoc->NewBlock.CSet_Size)*iiiii,10+640/(pDoc->NewBlock.CWay_Size)*jjjjj,700+320/(pDoc->NewBlock.CSet_Size)*(iiiii+1),10+640/(pDoc->NewBlock.CWay_Size)*(jjjjj+1));
					pDC->Ellipse(rect);
				}
			}

	}
	
}

/////////////////////////////////////////////////////////////////////////////
// CCacheView printing

BOOL CCacheView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CCacheView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CCacheView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CCacheView diagnostics

#ifdef _DEBUG
void CCacheView::AssertValid() const
{
	CView::AssertValid();
}

void CCacheView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CCacheDoc* CCacheView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCacheDoc)));
	return (CCacheDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCacheView message handlers

void CCacheView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CCacheDoc* pDoc1 = GetDocument();

	ASSERT_VALID(pDoc1);
	pDoc1->a1();
	
	CView::OnTimer(nIDEvent);
}
void CCacheView::Oncontinu()
{
	SetTimer(2,200,NULL);

}


void CCacheView::OnStop() 
{
	// TODO: Add your command handler code here
	KillTimer(2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -