Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
E
EPICS support for Wishbone peripherals
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
EPICS support for Wishbone peripherals
Commits
5ad30783
Commit
5ad30783
authored
Jun 15, 2015
by
Benoit Rat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
WBField: improve signess,floating points, etc.
parent
3dc44ee5
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
52 additions
and
22 deletions
+52
-22
WBNode.cpp
src/WBNode.cpp
+22
-11
WBNode.h
src/WBNode.h
+30
-11
No files found.
src/WBNode.cpp
View file @
5ad30783
...
...
@@ -47,39 +47,49 @@ std::string string_format(const std::string &fmt, ...) {
* If pReg is valid it will automatically append this WBField to a WBReg only if
* the bit mask of WBField is not already used in WBReg.
*
* \todo WBField::WBF_32I annd WBField::WBF_32FP are not taken into account
*
* \param[in] pReg Belonging WBReg
* \param[in] name Name of the field
* \param[in] mask Bit mask of the field on the register
* \param[in] shift how many bit we need to shift
* \param[in] mode The access mode to the register given by \ref WBAccMode
* \param[in] nfb Number of fractional bit, when 0 we create a WBField::WBF_32U type,
* otherwise it will be WBField::WBF_32F2C type.
* \param[in] desc Optional description
* \param[in] signess Which type of signess we want to use WBField::TMask
* \param[in] nfb Number of fractional bit.
* \param[in] iniVal Value to setup field at creation,
* if set to "inf" we keep 0 as default value. Does nothing when pReg is NULL.
*/
WBField
::
WBField
(
WBReg
*
pReg
,
const
std
::
string
&
name
,
uint32_t
mask
,
uint8_t
shift
,
uint8_t
mode
,
uint8_t
nfb
,
const
std
::
string
&
desc
)
uint8_t
shift
,
uint8_t
mode
,
const
std
::
string
&
desc
,
uint8_t
signess
,
uint8_t
nfb
,
double
iniVal
)
{
this
->
pReg
=
pReg
;
this
->
name
=
name
;
this
->
mask
=
mask
;
this
->
shift
=
shift
;
this
->
mode
=
mode
;
if
(
nfb
==
0
)
this
->
type
=
WBF_32U
;
else
this
->
type
=
WBF_32F2C
;
this
->
type
=
(
signess
&
WBF_TM_SIGNESS
)
;
if
(
nfb
>
0
)
this
->
type
|=
WBF_TM_FIXED_POINT
;
this
->
nfb
=
nfb
;
this
->
desc
=
desc
;
this
->
checkOverflow
=
true
;
TRACE_P_DEBUG
(
"%s type=0x%0x nfb=%d, dVal=%f"
,
name
.
c_str
(),
type
,
nfb
,
iniVal
);
int
i
=
1
;
for
(;
mask
;
mask
>>=
1
,
i
++
)
this
->
width
=
i
-
shift
;
this
->
width
=
i
-
shift
;
if
(
pReg
)
pReg
->
addField
(
this
);
if
(
pReg
)
{
if
(
isinf
(
iniVal
))
pReg
->
addField
(
this
);
else
{
float
dVal32
=
(
float
)
iniVal
;
this
->
convert
(
&
dVal32
,
false
);
pReg
->
addField
(
this
,
true
);
}
}
}
/**
...
...
@@ -154,7 +164,8 @@ bool WBField::regCvt(float *value, uint32_t *reg_data, bool to_value) const
ret
=
this
->
regCvt
(
&
fixed
,
reg_data
,
to_value
);
}
break
;
case
WBF_32FP
:
//Signed Fixed point conversion
case
WBF_TM_FIXED_POINT
:
//Unsigned Fixed point conversion
case
WBF_32FP
:
//Signed Fixed point conversion
if
(
to_value
)
{
ret
=
this
->
regCvt
(
&
fixed
,
reg_data
,
to_value
);
...
...
src/WBNode.h
View file @
5ad30783
...
...
@@ -50,6 +50,7 @@
#include <string>
#include <vector>
#include <map>
#include <cfloat>
//! Generate field preprocessor variable name for wbgen2 header
#define WB2_TOKENPASTING_FIELD(periphname,regname,fieldname,type) \
...
...
@@ -70,17 +71,18 @@
WB2_TOKENPASTING_FIELD(pname,rname,fname,_MASK),\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_SHIFT),\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_ACCESS),\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_NBFP),\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_DESC)
WB2_TOKENPASTING_FIELD(pname,rname,fname,_DESC), \
(WB2_TOKENPASTING_FIELD(pname,rname,fname,_NBFP)==0)?0:2,\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_NBFP)
//! Shortcut for WBField constructor arguments
#define WB2_FIELD_ARGS_
NBFP(pname,rname,fname,nfb
) \
#define WB2_FIELD_ARGS_
VA(pname,rname,fname,...
) \
WB2_TOKENPASTING_FIELD(pname,rname,fname,_PREFIX),\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_MASK),\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_SHIFT),\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_ACCESS),\
nfb
,\
WB2_TOKENPASTING_FIELD(pname,rname,fname,_DESC)
WB2_TOKENPASTING_FIELD(pname,rname,fname,_DESC)
,\
__VA_ARGS__
class
WBField
;
...
...
@@ -89,7 +91,7 @@ class WBNode;
class
WBMemCon
;
//! Access mode for a WB Register or Field
enum
WBAccMode
{
WB_AM_R
=
0x
01
,
WB_AM_W
=
0x10
,
WB_AM_RW
=
0x11
};
enum
WBAccMode
{
WB_AM_R
=
0x
1
,
WB_AM_W
=
0x2
,
WB_AM_RW
=
0x3
};
#define WB_NODE_MEMBCK_OWNADDR 0xFFFFFFFF //!< Used by WBNode::sync()
...
...
@@ -101,22 +103,39 @@ enum WBAccMode { WB_AM_R=0x01, WB_AM_W=0x10, WB_AM_RW=0x11 };
* We use a mask to show which bits correspond to this WBField in
* the linked WBReg.
*
* \todo Verify the all the combination of regCvt() according to type !!!
*
* \ref WBReg
*/
class
WBField
{
public
:
//! Type Mask for WBField type
enum
TMask
{
WBF_TM_SIGN_MSB
=
0x1
,
WBF_TM_SIGN_2COMP
=
0x2
,
WBF_TM_SIGNESS
=
0x3
,
WBF_TM_FIXED_POINT
=
0x4
,
};
//! Type of WBField available
enum
Type
{
WBF_32U
,
//!< Unsigned integer field
WBF_32I
,
//!< Signed integer field
WBF_32FP
,
//!< Fixed point field with highest bit signed
WBF_32F2C
//!< Fixed point field with 2'complements signed
//! Automatic Type
WBF_AUTO
=
0xFF
,
//! Unsigned integer field
WBF_32U
=
0
,
//! Signed integer field
WBF_32I
=
1
,
//! Fixed point field with highest bit signed
WBF_32FP
=
(
WBF_TM_FIXED_POINT
|
WBF_TM_SIGN_MSB
),
//! Fixed point field with 2'complements signed
WBF_32F2C
=
(
WBF_TM_FIXED_POINT
|
WBF_TM_SIGN_2COMP
)
};
friend
std
::
ostream
&
operator
<<
(
std
::
ostream
&
output
,
const
WBField
&
n
);
WBField
(
WBReg
*
pReg
,
const
std
::
string
&
name
,
uint32_t
mask
,
uint8_t
shift
,
uint8_t
mode
=
WB_AM_RW
,
const
std
::
string
&
desc
=
""
,
uint8_t
signess
=
0
,
uint8_t
nfb
=
0
,
double
defVal
=
(
1
.
0
/
0
.
0
));
WBField
(
WBReg
*
pReg
,
const
std
::
string
&
name
,
uint32_t
mask
,
uint8_t
shift
,
uint8_t
mode
=
WB_AM_RW
,
uint8_t
nfb
=
0
,
const
std
::
string
&
desc
=
""
);
virtual
~
WBField
();
bool
regCvt
(
uint32_t
*
value
,
uint32_t
*
regdata
,
bool
from_data
)
const
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment