Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / api / pfe / src / SS_PythonAsiReg.h
/*
* ========== Copyright Header Begin ==========================================
*
* OpenSPARC T2 Processor File: SS_PythonAsiReg.h
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
*
* The above named program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License version 2 as published by the Free Software Foundation.
*
* The above named 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*
* ========== Copyright Header End ============================================
*/
#ifndef __SS_PythonAsiReg_h__
#define __SS_PythonAsiReg_h__
#include "SS_AsiCtrReg.h"
#include <stdio.h>
class SS_Node;
class SS_PythonAsiReg
{
public:
SS_PythonAsiReg()
:
py_ld64(0),
py_st64(0),
py_rd64(0),
py_wr64(0)
{}
static SS_AsiSpace::Error ld64( SS_Node* obj, void* reg, SS_Strand* s, SS_Vaddr va, uint64_t* data )
{
SS_PythonAsiReg* py_reg = (SS_PythonAsiReg*)reg;
PyObject *func, *args, *rslt;
func = (PyObject*)py_reg->py_ld64;
if (func)
{
args = Py_BuildValue((char*)"i",va);
rslt = PyEval_CallObject(func,args);
Py_DECREF(args);
if (rslt)
{
SS_AsiSpace::Error err;
uint64_t val;
if (PyArg_ParseTuple(rslt,(char*)"(ii)",&err,&val))
{
if (!err) *data = val;
Py_DECREF(rslt);
return err;
}
}
}
return SS_AsiSpace::NO_ASI;
}
static SS_AsiSpace::Error st64( SS_Node* obj, void* reg, SS_Strand* s, SS_Vaddr va, uint64_t data )
{
return SS_AsiSpace::NO_ASI;
}
static SS_AsiSpace::Error rd64( SS_Node* obj, void* reg, SS_Strand* s, SS_Vaddr va, uint64_t* data )
{
return SS_AsiSpace::NO_ASI;
}
static SS_AsiSpace::Error wr64( SS_Node* obj, void* reg, SS_Strand* s, SS_Vaddr va, uint64_t data )
{
return SS_AsiSpace::NO_ASI;
}
void set_ld64( PyObject* func )
{
Py_INCREF(func);
if (py_ld64)
Py_DECREF(py_ld64);
py_ld64 = func;
}
void clr_ld64()
{
if (py_ld64)
Py_DECREF(py_ld64);
py_ld64 = 0;
}
void set_st64( PyObject* func )
{
Py_INCREF(func);
if (py_st64)
Py_DECREF(py_st64);
py_st64 = func;
}
void clr_st64()
{
if (py_st64)
Py_DECREF(py_st64);
py_st64 = 0;
}
void set_rd64( PyObject* func )
{
Py_INCREF(func);
if (py_rd64)
Py_DECREF(py_rd64);
py_rd64 = func;
}
void clr_rd64()
{
if (py_rd64)
Py_DECREF(py_rd64);
py_rd64 = 0;
}
void set_wr64( PyObject* func )
{
Py_INCREF(func);
if (py_wr64)
Py_DECREF(py_wr64);
py_wr64 = func;
}
void clr_wr64()
{
if (py_wr64)
Py_DECREF(py_wr64);
py_wr64 = 0;
}
protected:
PyObject* py_ld64;
PyObject* py_st64;
PyObject* py_rd64;
PyObject* py_wr64;
};
#endif