OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [orpsocv2/] [bench/] [sysc/] [src/] [MpHash.cpp] - Rev 673

Go to most recent revision | Compare with Previous | Blame | View Log

// ----------------------------------------------------------------------------
 
// Matchpoint hash table: definition
 
// Copyright (C) 2008  Embecosm Limited <info@embecosm.com>
 
// Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
 
// This file is part of the cycle accurate model of the OpenRISC 1000 based
// system-on-chip, ORPSoC, built using Verilator.
 
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or (at your
// option) any later version.
 
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
// License for more details.
 
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
// ----------------------------------------------------------------------------
 
// $Id: MpHash.cpp 331 2009-03-12 17:01:48Z jeremy $
 
#include <cstdlib>
 
#include "MpHash.h"
 
//! Constructor
 
//! Allocate the hash table
//! @param[in] size  Number of slots in the  hash table. Defaults to
//!                  DEFAULT_MP_HASH_SIZE.
MpHash::MpHash(int _size):
size(_size)
{
	// Allocate and clear the hash table
	hashTab = new MpEntry *[size];
 
	for (int i = 0; i < size; i++) {
		hashTab[i] = NULL;
	}
}				// MpHash ()
 
//! Destructor
 
//! Free the hash table
MpHash::~MpHash()
{
	delete[]hashTab;
 
}				// ~MpHash ()
 
//! Add an entry to the hash table
 
//! Add the entry if it wasn't already there. If it was there do nothing. The
//! match just be on type and addr. The instr need not match, since if this is
//! a duplicate insertion (perhaps due to a lost packet) they will be
//! different.
 
//! @note This method allocates memory. Care must be taken to delete it when
//! done.
 
//! @param[in] type   The type of matchpoint
//! @param[in] addr   The address of the matchpoint
//! @para[in]  instr  The instruction to associate with the address
void
 MpHash::add(MpType type, uint32_t addr, uint32_t instr)
{
	int hv = addr % size;
	MpEntry *curr;
 
	// See if we already have the entry
	for (curr = hashTab[hv]; NULL != curr; curr = curr->next) {
		if ((type == curr->type) && (addr == curr->addr)) {
			return;	// We already have the entry
		}
	}
 
	// Insert the new entry at the head of the chain
	curr = new MpEntry();
 
	curr->type = type;
	curr->addr = addr;
	curr->instr = instr;
	curr->next = hashTab[hv];
 
	hashTab[hv] = curr;
 
}				// add ()
 
//!Look up an entry in the matchpoint hash table
 
//! The match must be on type AND addr.
 
//! @param[in] type   The type of matchpoint
//! @param[in] addr   The address of the matchpoint
 
//! @return  The entry found, or NULL if the entry was not found
MpEntry *MpHash::lookup(MpType type, uint32_t addr)
{
	int hv = addr % size;
 
	// Search
	for (MpEntry * curr = hashTab[hv]; NULL != curr; curr = curr->next) {
		if ((type == curr->type) && (addr == curr->addr)) {
			return curr;	// The entry found
		}
	}
 
	return NULL;		// Not found
 
}				// lookup ()
 
//! Delete an entry from the matchpoint hash table
 
//! If it is there the entry is deleted from the hash table. If it is not
//! there, no action is taken. The match must be on type AND addr. The entry
//! (MpEntry::) is itself deleted
 
//! The usual fun and games tracking the previous entry, so we can delete
//! things.
 
//! @param[in]  type   The type of matchpoint
//! @param[in]  addr   The address of the matchpoint
//! @param[out] instr  Location to place the instruction found. If NULL (the
//!                    default) then the instruction is not written back.
 
//! @return  TRUE if an entry was found and deleted
bool MpHash::remove(MpType type, uint32_t addr, uint32_t * instr)
{
	int hv = addr % size;
	MpEntry *prev = NULL;
	MpEntry *curr;
 
	// Search
	for (curr = hashTab[hv]; NULL != curr; curr = curr->next) {
		if ((type == curr->type) && (addr == curr->addr)) {
			// Found - delete. Method depends on whether we are the head of
			// chain.
			if (NULL == prev) {
				hashTab[hv] = curr->next;
			} else {
				prev->next = curr->next;
			}
 
			if (NULL != instr) {
				*instr = curr->instr;	// Return the found instruction
			}
 
			delete curr;
			return true;	// Success
		}
 
		prev = curr;
	}
 
	return false;		// Not found
 
}				// remove ()
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.