# ========== Copyright Header Begin ==========================================
# OpenSPARC T2 Processor File: SS_State.py
# 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 ============================================
def old__init__(self
,name
,start
,end
,access
,init
):
self
.width
= end
- start
+ 1
def __init__(self
,nseai
):
self
.width
= self
.end
- self
.start
+ 1
if self
.end
< self
.start
:
raise RuntimeError, "end < start in field "+self
.name
if self
.width
== self
.reg
.size
:
self
.mask
= '~('+self
.reg
.type+')0'
self
.mask
= '(('+self
.reg
.type+'(1) << '+str(self
.width
)+') - 1)'
msk
= '('+self
.mask
+' << '+ofs
+')'
set = '{ '+self
.reg
.type+' m = '+msk
+'; _data = (_data &~ m) | ((v << '+ofs
+') & m); return *this; }'
get
= '{ return (_data >> '+ofs
+') & '+self
.mask
+'; }'
' '+self
.reg
.type+'\t'+self
.name
+'()\t\t\t'+get
,
' '+self
.reg
.class_name
+'&\t'+self
.name
+'( '+self
.reg
.type+' v )\t'+set,
' const static uint64_t\t\tOFFSET_'+self
.name
.upper()+' = '+ofs
+';',
' const static uint64_t\t\tWIDTH_'+self
.name
.upper()+' = '+str(self
.width
)+';',
return '('+self
.mask
+' << '+str(self
.start
)+')'
return '('+self
.mask
+' << '+str(self
.start
)+')'
return '('+self
.mask
+' << '+str(self
.start
)+')'
return '('+self
.mask
+' << '+str(self
.start
)+')'
return '(('+self
.reg
.type+')('+str(self
.init
)+') << '+str(self
.start
)+')'
# Coding conventions have it that members and variables are all lower
# case with underscore(underbar) as spacer and types are capitalized
# with no underscores. capitalize_variable() converts member name to that
def capitalize_variable(name
):
name
= name
[:us
] + capitalize_variable(name
[us
+1:])
def __init__(self
,class_prefix
,name
,table
,index
,access
,size
,fields
):
self
.class_prefix
= class_prefix
self
.fields
= map(SS_Field
,fields
)
self
.class_name
= self
.class_prefix
+'_'+capitalize_variable(self
.name
)
self
.type = 'uint' + str(self
.size
) + '_t'
for i
,field
in enumerate(self
.fields
):
rw_mask
=rw_mask
+' | '+field
.rw_mask()
w1c_mask
=w1c_mask
+' | '+field
.w1c_mask()
rw_mask
=rw_mask
+'\n | '+field
.rw_mask()
w1c_mask
=w1c_mask
+'\n | '+field
.w1c_mask()
file.write('class %s /*{{{*/\n' % self
.class_name
)
file.write(' %s()\n' % self
.class_name
)
file.write(' :_data(0)\n')
file.write(' ,_mask(%s)\n' % rw_mask
)
file.write(' %s( %s d, %s m, %s i )\n' % (self
.class_name
,self
.type,self
.type,self
.type))
file.write(' %s( %s d )\n' % (self
.class_name
,self
.type))
file.write(' :_data(d)\n')
file.write(' ,_mask(m)\n')
file.write(' void reset() \t\t{ _data = 0; }\n')
file.write(' void reset() \t\t{}\n')
file.write(' void snapshot( SS_SnapShot& ss )\t{ ss.val(&_data); }\n')
file.write(' const char* name() \t\t{ return "%s"; }\n' % self
.name
)
file.write(' %s operator()() \t\t{ return _data; }\n' % self
.type)
file.write(' %s& operator=( %s v )\t{ _data = v; return *this; }\n' % (self
.class_name
,self
.type))
file.write(' void set( %s v )\t{ _data = v; }\n' % (self
.type))
file.write(' void set( %s v )\t{ _data = (_data &~ _mask) | (v & _mask); }\n' % (self
.type))
for field
in self
.fields
:
file.write(' protected:\n')
file.write(' %s _data;\n' % self
.type)
file.write(' %s _mask;\n' % self
.type)
if self
.table
.has_key(index
):
#============================================================================
# SS_AsiCtrReg(prefix,name,fields)
#============================================================================
SHARED
='SS_SharedAsiCtrReg'
def __init__(self
,prefix
,name
,inheritance
,fields
,code
=[],constructor_code
=[]):
self
.class_prefix
= prefix
self
.inheritance
= inheritance
self
.fields
= map(SS_Field
,fields
)
self
.class_name
= self
.class_prefix
+'_'+capitalize_variable(self
.name
)
self
.constructor_code
= constructor_code
ro_mask
='\n , uint64_t(0)'
rw_mask
='\n , uint64_t(0)'
r1c_mask
='\n , uint64_t(0)'
w1c_mask
='\n , uint64_t(0)'
for i
,field
in enumerate(self
.fields
):
ro_mask
=ro_mask
+ '\n | '+field
.ro_mask()
rw_mask
=rw_mask
+ '\n | '+field
.rw_mask()
r1c_mask
=r1c_mask
+'\n | '+field
.r1c_mask()
w1c_mask
=w1c_mask
+'\n | '+field
.w1c_mask()
init
=init
+ '\n | '+field
.init_val()
'class '+self
.class_name
+' : public '+self
.inheritance
+' /*{{{*/',
' '+self
.class_name
+'()\n',
' '+self
.inheritance
+'("'+self
.name
+'"'+ro_mask
+r1c_mask
+rw_mask
+w1c_mask
+init
+')\n',
if self
.constructor_code
!= []:
for line
in self
.constructor_code
:
file.write(' %s\n' % line
)
' uint64_t operator()()\t\t{ return get(); }',
' '+self
.class_name
+'& operator=( uint64_t v )\t{ set(v); return *this; }',
for field
in self
.fields
:
file.write(' %s\n' % line
)
def __init__(self
,class_prefix
,name
,table
,index
,access
,size
,fields
,code
=[]):
self
.class_prefix
= class_prefix
self
.fields
= map(SS_Field
,fields
)
self
.class_name
= self
.class_prefix
+'_'+capitalize_variable(self
.name
)
self
.type = 'uint' + str(self
.size
) + '_t'
for i
,field
in enumerate(self
.fields
):
mask
=mask
+' | '+field
.rw_mask()
mask
=mask
+'\n | '+field
.rw_mask()
file.write('class %s /*{{{*/\n' % self
.class_name
)
file.write(' %s()\n' % self
.class_name
)
file.write(' :_data(0)\n')
file.write(' ,_mask(%s)\n' % mask
)
file.write(' %s( %s d, %s m, %s i )\n' % (self
.class_name
,self
.type,self
.type,self
.type))
file.write(' %s( %s d )\n' % (self
.class_name
,self
.type))
file.write(' :_data(d)\n')
file.write(' ,_mask(m)\n')
file.write(' void reset() \t\t{ _data = 0; }\n')
file.write(' void reset() \t\t{}\n')
file.write(' void snapshot( SS_SnapShot& ss )\t{ ss.val(&_data); }\n')
file.write(' const char* name() \t\t{ return "%s"; }\n' % self
.name
)
file.write(' %s operator()() \t\t{ return _data; }\n' % self
.type)
file.write(' %s& operator=( %s v )\t{ _data = v; return *this; }\n' % (self
.class_name
,self
.type))
file.write(' void set( %s v )\t{ _data = v; }\n' % (self
.type))
file.write(' void set( %s v )\t{ _data = (_data &~ _mask) | (v & _mask); }\n' % (self
.type))
for field
in self
.fields
:
file.write(' const static uint8_t bit_size_%s = %s;\n' % (field
.name
,field
.width
))
file.write(' %s;\n' % line
)
file.write(' protected:\n')
file.write(' %s _data;\n' % self
.type)
file.write(' %s _mask;\n' % self
.type)