/*
 * branch_predictor.java
 *
 * Copyright (c) 2004 Rutgers, The State University of New Jersey
 *
 * Daniel A. Jiménez
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy,
 * modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT.  IN NO EVENT SHALL RUTGERS, THE STATE UNIVERSITY
 * OF NEW JERSEY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 */

/*
 * This file contains declarations for the abstract branch_predictor type.
 */

import java.io.*;
import java.net.*;

public class branch_predictor {

	long    n_misses,               // number of mispredictions
		n_branches;             // total number of branches

	final void reset () {
		n_misses = 0;
		n_branches = 0;
	}

	// constructor: initalize counters

	branch_predictor () {
		reset ();
	}

	// predict a branch at a certain address

	branch_update predict (int address) { 
		branch_update u = new branch_update();
		u.set_prediction (false);
		return u;
	}

	// update the prediction; the branch was taken if 'taken' is true,
	// not taken otherwise

	void update (branch_update u, boolean taken) { }

	// call update and keep statistics

	final void update_and_measure (branch_update u, boolean taken) {
		if (taken != u.get_prediction()) n_misses++;
		n_branches++;
		update (u, taken);
	}

	// return the misprediction rate

	final double miss_rate () {
		return n_misses / (double) n_branches;
	}

};
