Merge pull request #8 from fzeder/master
Please see the individual commits
This commit is contained in:
310
README.md
310
README.md
@@ -1,54 +1,53 @@
|
||||
de.uni-kl.ems.dram.vp.system
|
||||
============================
|
||||
|
||||
Generic DRAM controller simulator and debug tools related to it.
|
||||
Generic DRAM controller simulator **DRAMSys** [1] and related tools.
|
||||
|
||||
# Basic Setup
|
||||
## Basic Setup
|
||||
|
||||
In a terminal window execute the commands that follow.
|
||||
|
||||
Go to your home directory.
|
||||
|
||||
```
|
||||
``` bash
|
||||
$ cd
|
||||
```
|
||||
|
||||
Create a directory for your projects.
|
||||
|
||||
```
|
||||
``` bash
|
||||
$ mkdir projects
|
||||
```
|
||||
|
||||
Clone the repository.
|
||||
|
||||
It is possible that you will work with a **fork** of the official codebase. A
|
||||
fork is a copy of a repository. In that case, after pushing changes into your
|
||||
copy you should create a **pull request** in order to your supervisor check
|
||||
and possibly bring your changes to the official codebase.
|
||||
|
||||
In case of doubts about which repository you should clone ask your supervisor.
|
||||
|
||||
```
|
||||
$ git clone https://<user>@git.rhrk.uni-kl.de/<user>/dram.vp.system.git
|
||||
``` bash
|
||||
$ git clone --recursive https://<user>@git.rhrk.uni-kl.de/EIT-Wehn/dram.vp.system.git
|
||||
```
|
||||
|
||||
Go to the project directory.
|
||||
The *--recursive* flag tells git to initialize all submodules within the
|
||||
repository. **DRAMPower** [2] and **tinyxml** are examples third party
|
||||
repositories that were embedded within the source tree as submodules.
|
||||
|
||||
It is possible to work with a copy of the official codebase. The copy is
|
||||
called **fork**. In that case, after pushing changes into your fork you should
|
||||
create a **pull request** in order to your supervisor check and possibly bring
|
||||
your changes to the official codebase.
|
||||
|
||||
``` bash
|
||||
$ git clone --recursive https://<user>@git.rhrk.uni-kl.de/<user>/dram.vp.system.git
|
||||
```
|
||||
|
||||
After cloning go to the project directory.
|
||||
|
||||
``` bash
|
||||
$ cd dram.vp.system
|
||||
```
|
||||
|
||||
Execute the script below.
|
||||
|
||||
```
|
||||
$ ./install_prerequisites.sh
|
||||
```
|
||||
|
||||
|
||||
## With QTCreator
|
||||
### With QTCreator
|
||||
Execute the *QTCreator*.
|
||||
|
||||
```
|
||||
``` bash
|
||||
$ qtcreator &
|
||||
```
|
||||
|
||||
@@ -63,13 +62,25 @@ Repeat the procedure above and build the trace analyser project.
|
||||
|
||||
**File -> Open Project -> dram.vp.sys/analyser/analyser/traceAnalizer.pro**
|
||||
|
||||
To speedup the building process one can use the additional **make** option
|
||||
**-j[jobs]**. The command line below returns a good number to be passed to
|
||||
make as the number of jobs that can run simultaneously to improve the building
|
||||
time.
|
||||
|
||||
## Without QTCreator
|
||||
``` bash
|
||||
$ cat /proc/cpuinfo | grep processor | wc -l
|
||||
```
|
||||
|
||||
In the left bar go to **Projects -> Build & Run -> Build Steps -> Make**.
|
||||
Click in **Details** then **Make arguments** and add **-j** followed by the
|
||||
number you got.
|
||||
|
||||
### Without QTCreator
|
||||
|
||||
In case you prefer a command line interface to the QTCreator GUI you can also
|
||||
use **qmake** to generate a Makefile and then compile the project.
|
||||
|
||||
```
|
||||
``` bash
|
||||
$ cd dram
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
@@ -83,130 +94,175 @@ The **dramSys** executable supports one argument which is a XML file that
|
||||
contains configurable aspects of the desired simulation. If no argument is
|
||||
passed through the command line a default configuration file will be loaded.
|
||||
|
||||
The XML code below shows a typical simulation configuration:
|
||||
The XML code below shows a typic configuration:
|
||||
|
||||
```
|
||||
``` xml
|
||||
<simulation>
|
||||
<simconfig>
|
||||
<Debug value="1" />
|
||||
<DatabaseRecording value="1" />
|
||||
<PowerAnalysys value="1" />
|
||||
</simconfig>
|
||||
<memspecs>
|
||||
<memspec src="../resources/configs/memspecs/WideIO.xml"></memspec>
|
||||
</memspecs>
|
||||
<addressmappings>
|
||||
<addressmapping src="../resources/configs/amconfigs/am_wideio.xml"></addressmapping>
|
||||
</addressmappings>
|
||||
<memconfigs>
|
||||
<memconfig src="../resources/configs/memconfigs/fifo.xml"/>
|
||||
</memconfigs>
|
||||
|
||||
<tracesetups>
|
||||
<tracesetup id="fifo">
|
||||
<device clkMhz="200">voco2.stl</device>
|
||||
</tracesetup>
|
||||
</tracesetups>
|
||||
<simconfig>
|
||||
<Debug value="1" />
|
||||
<DatabaseRecording value="1" />
|
||||
<PowerAnalysis value="1" />
|
||||
</simconfig>
|
||||
|
||||
<memspecs>
|
||||
<memspec src="../resources/configs/memspecs/WideIO.xml"></memspec>
|
||||
</memspecs>
|
||||
|
||||
<addressmappings>
|
||||
<addressmapping src="../resources/configs/amconfigs/am_wideio.xml"></addressmapping>
|
||||
</addressmappings>
|
||||
|
||||
<memconfigs>
|
||||
<memconfig src="../resources/configs/memconfigs/fifo.xml"/>
|
||||
</memconfigs>
|
||||
|
||||
<tracesetups>
|
||||
<tracesetup id="fifo">
|
||||
<device clkMhz="200">voco2.stl</device>
|
||||
</tracesetup>
|
||||
</tracesetups>
|
||||
|
||||
</simulation>
|
||||
```
|
||||
|
||||
Some configuration fields reference other XML files which contain more
|
||||
specialized chunks of the configuration, e.g. memory specification and address
|
||||
mapping.
|
||||
specialized chunks of the configuration like memory specification, address
|
||||
mapping and memory configurations.
|
||||
|
||||
The XML configuration files are parsed by the program and the configuration
|
||||
details extracted are assigned to the correspondent attributes of the internal
|
||||
configuration structure.
|
||||
|
||||
|
||||
#### Configuration File Sections
|
||||
|
||||
The main configuration file is divided into self-contained sections, each of
|
||||
these sections is a set of logically related configuration aspects for the
|
||||
simulation.
|
||||
|
||||
The list below, which is not intended to be exhaustive, present the
|
||||
configuration sections and possible configuration fields.
|
||||
Below are listed the configuration sections and configuration fields.
|
||||
|
||||
- Simulator configuration
|
||||
- Database recording
|
||||
- Power analysis
|
||||
- Debug mode
|
||||
- **Simulator configuration**
|
||||
- *Debug* (boolean)
|
||||
- "1": enables debug output on console
|
||||
- "0": disables debug output
|
||||
- *DatabaseRecording* (boolean)
|
||||
- "1": enables trace file recording for the trace analyser tool
|
||||
- "0": disables trace file recording
|
||||
- *PowerAnalysis* (boolean)
|
||||
- "1": enables live power analysis with the DRAMPower tool
|
||||
- "0": disables power analysis
|
||||
|
||||
- Memory specification
|
||||
- Memory ID: JEDEC_256Mb_WIDEIO_SDR-200_128bit,
|
||||
MICRON_4Gb_DDR4-2400_8bit_A, ...
|
||||
- Memory type: WIDEIO_SD, DDR4, ...
|
||||
- **Memory specification**
|
||||
|
||||
- Memory Architecture Specification
|
||||
- Width
|
||||
- Number of Banks
|
||||
- Number of Ranks
|
||||
- Number of Columns
|
||||
- Number of Rows
|
||||
- Data Rate
|
||||
- Burst Length
|
||||
A file with memory specifications. This information comes from datasheet and
|
||||
usually does not change.
|
||||
|
||||
- Memory Timing Specification (memory dependent)
|
||||
- Clock in MHz
|
||||
- RC
|
||||
- RCD
|
||||
- RL
|
||||
- RP
|
||||
- RFC
|
||||
- RAS
|
||||
- WL
|
||||
- AL
|
||||
- DQSCK
|
||||
- RTP
|
||||
- WR
|
||||
- XP
|
||||
- XPDLL
|
||||
- XS
|
||||
- XSDLL
|
||||
- REFI
|
||||
- CL
|
||||
- TAW
|
||||
- RRD
|
||||
- CCD
|
||||
- WTR
|
||||
- CKE
|
||||
- CKESR
|
||||
- **Address Mapping**
|
||||
|
||||
- Memory Power Specification
|
||||
XML files describe the address mapping to be used in the simulation.
|
||||
|
||||
- Address Mapping
|
||||
- Length: address length in bits
|
||||
- Row: bits used for the row
|
||||
- Bank: bits used for the bank
|
||||
- Column: bits used for the column
|
||||
The file [am_wideio.xml](dram/resources/configs/amconfigs/am_wideio.xml) is
|
||||
a good example.
|
||||
|
||||
- Memory Configuration
|
||||
- Bankwise Logic
|
||||
- Open Page Policy
|
||||
- Maximum Number of Transactions
|
||||
- Scheduler
|
||||
- Capacitor size
|
||||
- Powerdown Mode
|
||||
- Powerdown Timeout
|
||||
- Chip seed
|
||||
- CSV file
|
||||
- Storage Mode value
|
||||
``` xml
|
||||
<addressmapping>
|
||||
<channel from="27" to="28"/>
|
||||
<row from="14" to="26"/>
|
||||
<column from="7" to="13"/>
|
||||
<bank from="4" to="6" />
|
||||
<bytes from="0" to="3" />
|
||||
</addressmapping>
|
||||
```
|
||||
|
||||

|
||||
|
||||
``` xml
|
||||
<addressmapping>
|
||||
<channel from="27" to="28"/>
|
||||
<column from="20" to="26"/>
|
||||
<row from="7" to="19"/>
|
||||
<bank from="4" to="6" />
|
||||
<bytes from="0" to="3" />
|
||||
</addressmapping>
|
||||
```
|
||||
|
||||

|
||||
|
||||
- **Memory Configuration**
|
||||
|
||||
The content of [fifo.xml](dram/resources/configs/memconfigs/fifo.xml) is
|
||||
presented below as an example.
|
||||
|
||||
``` xml
|
||||
<memconfig>
|
||||
<BankwiseLogic value="0"/>
|
||||
<OpenPagePolicy value="1"/>
|
||||
<MaxNrOfTransactions value="8"/>
|
||||
<Scheduler value="FIFO_STRICT"/>
|
||||
<Capsize value="5"/>
|
||||
<PowerDownMode value="TimeoutSREF"/>
|
||||
<PowerDownTimeout value="100"/>
|
||||
<!-- Error Modelling -->
|
||||
<ErrorChipSeed value="42"/>
|
||||
<ErrorCSVFile value="../src/error/error_new.csv"/>
|
||||
<ErrorStoreMode value="NoStorage"/>
|
||||
</memconfig>
|
||||
```
|
||||
|
||||
- *BankwiseLogic* (boolean)
|
||||
- "1": perform bankwise-refresh [3] and bankwise-powerdown [4]
|
||||
- "0": do not perform bankwise operations
|
||||
- *OpenPagePolicy* (boolean)
|
||||
- "1": use open page precharge policy
|
||||
- "0": do not use open page precharge policy
|
||||
- *MaxNrOfTransactions* (unsigned int)
|
||||
- Maximum number of transactions.
|
||||
- *Scheduler* (string)
|
||||
- "FIFO": first in, first out
|
||||
- "FIFO_STRICT": out-of-order treatment of queue elements not allowed
|
||||
- "FR_FCFS": first-come, first-served
|
||||
- *Capsize* (unsigned int)
|
||||
- Capacitor cell size.
|
||||
- *PowerDownMode* (enum EPowerDownMode)
|
||||
- "NoPowerDown": no power down mode (active idle)
|
||||
- "Staggered": staggered power down policy [5]
|
||||
- "TimeoutPDN": precharge idle
|
||||
- "TimeoutSREF": self refresh
|
||||
- *Buswidth* (unsigned int)
|
||||
- Bus width in bits.
|
||||
- *ReadWriteGrouping* (boolean)
|
||||
- "1": enable read writing grouping
|
||||
- "0": disable read writing grouping
|
||||
- *ReorderBuffer* (boolean)
|
||||
- "1": use reordering buffer
|
||||
- "0": do not use reordering buffer
|
||||
- *ErrorChipSeed* (unsigned int)
|
||||
- Seed to initialize the random error generator.
|
||||
- *ErrorCSVFile* (string)
|
||||
- CSV file with error injection information.
|
||||
- *ErrorStoreMode* (enum ErrorStorageMode)
|
||||
- "NoStorage": no storage
|
||||
- "Store": store data without error model
|
||||
- "ErrorModel": store data with error model [6]
|
||||
|
||||
- **Trace setups**
|
||||
- *id*
|
||||
- trace setup id
|
||||
- *clkMhz*
|
||||
- speed of the trace player
|
||||
|
||||
Some attributes are self-explanatory while others require some previous
|
||||
knowhow of memory technologies or some knowledge of the simulator source code.
|
||||
|
||||
## DRAMSys Resources
|
||||
Resources of the simulator are available in the **resources** directory its
|
||||
sub-directories.
|
||||
|
||||
Some resources of the simulator are available in the **resources** directory
|
||||
its sub-directories.
|
||||
|
||||
```
|
||||
``` bash
|
||||
$ cd /projects/dram.vp.system/dram/resources
|
||||
```
|
||||
|
||||
A short description of the content each directory follows.
|
||||
A description of the content each directory follows.
|
||||
|
||||
- **resources**
|
||||
- **configs**: XML files used for configure specific details of the simulation.
|
||||
@@ -220,3 +276,27 @@ A short description of the content each directory follows.
|
||||
- **traces**: trace files for simulations. They contain accesses to memory
|
||||
in certain known scenarios.
|
||||
|
||||
#### References
|
||||
|
||||
[1] TLM Modelling of 3D Stacked Wide I/O DRAM Subsystems, A Virtual Platform for Memory Controller Design Space Exploration
|
||||
M. Jung, C. Weis, N. Wehn, K. Chandrasekar. International Conference on High-Performance and Embedded Architectures and Compilers 2013 (HiPEAC), Workshop on: Rapid Simulation and Performance Evaluation: Methods and Tools (RAPIDO), January, 2013, Berlin.
|
||||
|
||||
[2] DRAMPower: Open-source DRAM Power & Energy Estimation Tool
|
||||
Karthik Chandrasekar, Christian Weis, Yonghui Li, Sven Goossens, Matthias Jung, Omar Naji, Benny Akesson, Norbert Wehn, and Kees Goossens
|
||||
URL: http://www.drampower.info
|
||||
|
||||
[3] Energy Optimization in 3D MPSoCs with Wide-I/O DRAM
|
||||
M. Sadri, M. Jung, C. Weis, N. Wehn, L. Benini. Conference Design, Automation and Test in Europe (DATE), March, 2014, Dresden, Germany.
|
||||
|
||||
[4] DRAMSys: A flexible DRAM Subsystem Design Space Exploration Framework
|
||||
M. Jung, C. Weis, N. Wehn. Accepted for publication, IPSJ Transactions on System LSI Design Methodology (T-SLDM), October, 2015.
|
||||
|
||||
[5] Optimized Active and Power-Down Mode Refresh Control in 3D-DRAMs
|
||||
M. Jung, M. Sadri, C. Weis, N. Wehn, L. Benini., VLSI-SoC, October, 2014, Playa del Carmen, Mexico.
|
||||
|
||||
[6] Retention Time Measurements and Modelling of Bit Error Rates of WIDE-I/O DRAM in MPSoCs
|
||||
C. Weis, M. Jung, P. Ehses, C. Santos, P. Vivet, S. Goossens, M. Koedam, N. Wehn. Accepted for publication, IEEE Conference Design, Automation and Test in Europe (DATE), March, 2015, Grenoble, France
|
||||
|
||||
[7] http://www.uni-kl.de/3d-dram/publications/
|
||||
|
||||
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
#define TIMESPAN_H
|
||||
#include <QString>
|
||||
#include "tracetime.h"
|
||||
#include "thirdParty/eng_format.h"
|
||||
|
||||
class Timespan
|
||||
{
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
#ifndef TRACETIME_H
|
||||
#define TRACETIME_H
|
||||
#include <QString>
|
||||
#include "thirdParty/eng_format.h"
|
||||
|
||||
//time in nanoseconds
|
||||
typedef long long traceTime;
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
#define ENGINEERINGSCALEDRAW_H
|
||||
#include <qwt_scale_draw.h>
|
||||
#include <QString>
|
||||
#include "thirdParty/eng_format.h"
|
||||
#include "businessObjects/tracetime.h"
|
||||
|
||||
class EngineeringScaleDraw : public QwtScaleDraw
|
||||
|
||||
262
analyzer/analyzer/thirdParty/eng_formant.cpp
vendored
262
analyzer/analyzer/thirdParty/eng_formant.cpp
vendored
@@ -1,262 +0,0 @@
|
||||
// Copyright (C) 2005-2009 by Jukka Korpela
|
||||
// Copyright (C) 2009-2013 by David Hoerl
|
||||
// Copyright (C) 2013 by Martin Moene
|
||||
//
|
||||
// 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 THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
#include "eng_format.h"
|
||||
|
||||
#include <iomanip>
|
||||
#include <limits>
|
||||
#include <sstream>
|
||||
|
||||
#include <float.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/*
|
||||
* Note: using fabs() and other math functions in global namespace for
|
||||
* best compiler coverage.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Note: micro, µ, may not work everywhere, so you can define a glyph yourself:
|
||||
*/
|
||||
#ifndef ENG_FORMAT_MICRO_GLYPH
|
||||
# define ENG_FORMAT_MICRO_GLYPH "µ"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Note: if not using signed at the computation of prefix_end below,
|
||||
* VC2010 -Wall issues a warning about unsigned and addition overflow.
|
||||
* Hence the cast to signed int here.
|
||||
*/
|
||||
#define ENG_FORMAT_DIMENSION_OF(a) ( static_cast<int>( sizeof(a) / sizeof(0[a]) ) )
|
||||
|
||||
eng_prefixed_t eng_prefixed;
|
||||
eng_exponential_t eng_exponential;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
char const * const prefixes[/*exp*/][2][9] =
|
||||
{
|
||||
{
|
||||
{ "", "m", ENG_FORMAT_MICRO_GLYPH
|
||||
, "n", "p", "f", "a", "z", "y", },
|
||||
{ "", "k", "M", "G", "T", "P", "E", "Z", "Y", },
|
||||
},
|
||||
{
|
||||
{ "e0", "e-3", "e-6", "e-9", "e-12", "e-15", "e-18", "e-21", "e-24", },
|
||||
{ "e0", "e3", "e6", "e9", "e12", "e15", "e18", "e21", "e24", },
|
||||
},
|
||||
};
|
||||
|
||||
const int prefix_count = ENG_FORMAT_DIMENSION_OF( prefixes[false][false] );
|
||||
|
||||
#if defined( _MSC_VER )
|
||||
|
||||
template <typename T>
|
||||
long lrint( T const x )
|
||||
{
|
||||
return static_cast<long>( x );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int sign( int const value )
|
||||
{
|
||||
return value == 0 ? +1 : value / abs( value );
|
||||
}
|
||||
|
||||
bool is_zero( double const value )
|
||||
{
|
||||
#if __cplusplus >= 201103L
|
||||
return FP_ZERO == fpclassify( value );
|
||||
#else
|
||||
// deliberately compare literally:
|
||||
return 0.0 == value;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool is_nan( double const value )
|
||||
{
|
||||
#if __cplusplus >= 201103L
|
||||
return isnan( value );
|
||||
#else
|
||||
// deliberately return false for now:
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool is_inf( double const value )
|
||||
{
|
||||
#if __cplusplus >= 201103L
|
||||
return isinf( value );
|
||||
#else
|
||||
// deliberately return false for now:
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
long degree_of( double const value )
|
||||
{
|
||||
return is_zero( value ) ? 0 : lrint( floor( log10( fabs( value ) ) / 3) );
|
||||
}
|
||||
|
||||
int precision( double const scaled, int const digits )
|
||||
{
|
||||
// MSVC6 requires -2 * DBL_EPSILON;
|
||||
// g++ 4.8.1: ok with -1 * DBL_EPSILON
|
||||
|
||||
return is_zero( scaled ) ? digits - 1 : digits - log10( fabs( scaled ) ) - 2 * DBL_EPSILON;
|
||||
}
|
||||
|
||||
std::string prefix_or_exponent( bool const exponential, int const degree )
|
||||
{
|
||||
return std::string( exponential || 0 == degree ? "" : " " ) + prefixes[ exponential ][ sign(degree) > 0 ][ abs( degree ) ];
|
||||
}
|
||||
|
||||
std::string exponent( int const degree )
|
||||
{
|
||||
std::ostringstream os;
|
||||
os << "e" << 3 * degree;
|
||||
return os.str();
|
||||
}
|
||||
|
||||
/*
|
||||
* engineering to exponent notation conversion.
|
||||
*/
|
||||
std::string engineering_to_exponent( std::string text );
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
/**
|
||||
* convert real number to prefixed or exponential notation, optionally followed by a unit.
|
||||
*/
|
||||
std::string
|
||||
to_engineering_string( double const value, int const digits, bool exponential, std::string const unit /*= ""*/ )
|
||||
{
|
||||
if ( is_nan( value ) ) return "NaN";
|
||||
else if ( is_inf( value ) ) return "INFINITE";
|
||||
|
||||
const int degree = degree_of( value );
|
||||
|
||||
std::string factor;
|
||||
|
||||
if ( abs( degree ) < prefix_count )
|
||||
{
|
||||
factor = prefix_or_exponent( exponential, degree );
|
||||
}
|
||||
else
|
||||
{
|
||||
exponential = true;
|
||||
factor = exponent( degree );
|
||||
}
|
||||
|
||||
std::ostringstream os;
|
||||
|
||||
const double scaled = value * pow( 1000.0, -degree );
|
||||
|
||||
const std::string space = ( 0 == degree || exponential ) && unit.length() ? " ":"";
|
||||
|
||||
os << std::fixed << std::setprecision( precision( scaled, digits ) ) << scaled << factor << space << unit;
|
||||
|
||||
return os.str();
|
||||
}
|
||||
|
||||
/**
|
||||
* convert the output of to_engineering_string() into a double.
|
||||
*/
|
||||
double from_engineering_string( std::string const text )
|
||||
{
|
||||
return strtod( engineering_to_exponent( text ).c_str(), NULL );
|
||||
}
|
||||
|
||||
/**
|
||||
* step a value by the smallest possible increment.
|
||||
*/
|
||||
std::string step_engineering_string( std::string const text, int digits, bool const exponential, bool const positive )
|
||||
{
|
||||
const double value = from_engineering_string( text );
|
||||
|
||||
if ( digits < 3 )
|
||||
{
|
||||
digits = 3;
|
||||
}
|
||||
|
||||
// correctly round to desired precision
|
||||
const int expof10 = is_zero(value) ? 0 : lrint( floor( log10( value ) ) );
|
||||
const int power = expof10 + 1 - digits;
|
||||
|
||||
const double inc = pow( 10.0, power ) * ( positive ? +1 : -1 );
|
||||
const double ret = value + inc;
|
||||
|
||||
return to_engineering_string( ret, digits, exponential );
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
/*
|
||||
* "k" => "1e3"
|
||||
*/
|
||||
std::string prefix_to_exponent( std::string const pfx )
|
||||
{
|
||||
for ( int i = 0; i < 2; ++i )
|
||||
{
|
||||
for( int k = 0; k < prefix_count; ++k )
|
||||
{
|
||||
if ( pfx == prefixes[0][i][k] )
|
||||
{
|
||||
return prefixes[1][i][k] ;
|
||||
}
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert engineering presentation to presentation with exponent.
|
||||
*
|
||||
* The engineering presentation should not contain a unit, as the first letter
|
||||
* is interpreted as an SI prefix, e.g. "1 T" is 1e12, not 1 (Tesla).
|
||||
*
|
||||
* "1.23 M" => 1.23e+6
|
||||
* "1.23 kPa" => 1.23e+3 (ok, but not recommended)
|
||||
* "1.23 Pa" => 1.23e+12 (not what's intended!)
|
||||
*/
|
||||
std::string engineering_to_exponent( std::string const text )
|
||||
{
|
||||
std::string::size_type pos = text.find( ' ' );
|
||||
|
||||
if ( std::string::npos == pos )
|
||||
{
|
||||
return text;
|
||||
}
|
||||
|
||||
const std::string magnitude = text.substr( 0, pos );
|
||||
const std::string prefix = text.substr( pos + 1, 1 );
|
||||
|
||||
return magnitude + prefix_to_exponent( prefix );
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
// end of file
|
||||
115
analyzer/analyzer/thirdParty/eng_format.h
vendored
115
analyzer/analyzer/thirdParty/eng_format.h
vendored
@@ -1,115 +0,0 @@
|
||||
// Copyright (C) 2005-2009 by Jukka Korpela
|
||||
// Copyright (C) 2009-2013 by David Hoerl
|
||||
// Copyright (C) 2013 by Martin Moene
|
||||
//
|
||||
// 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 THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
#ifndef ENG_FORMAT_H_INCLUDED
|
||||
#define ENG_FORMAT_H_INCLUDED
|
||||
|
||||
#include <string>
|
||||
|
||||
/**
|
||||
* convert a double to the specified number of digits in SI (prefix) or
|
||||
* exponential notation, optionally followed by a unit.
|
||||
*/
|
||||
std::string
|
||||
to_engineering_string( double value, int digits, bool exponential, std::string unit = "" );
|
||||
|
||||
/**
|
||||
* convert the output of to_engineering_string() into a double.
|
||||
*/
|
||||
double
|
||||
from_engineering_string( std::string text );
|
||||
|
||||
/**
|
||||
* step a value by the smallest possible increment.
|
||||
*/
|
||||
std::string
|
||||
step_engineering_string( std::string text, int digits, bool exponential, bool increment );
|
||||
|
||||
//
|
||||
// Extended interface:
|
||||
//
|
||||
|
||||
/**
|
||||
* \var eng_prefixed
|
||||
* \brief select SI (prefix) presentation: to_engineering_string(), step_engineering_string().
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var eng_exponential
|
||||
* \brief select exponential presentation: to_engineering_string(), step_engineering_string().
|
||||
*/
|
||||
|
||||
extern struct eng_prefixed_t {} eng_prefixed;
|
||||
extern struct eng_exponential_t {} eng_exponential;
|
||||
|
||||
/**
|
||||
* \var eng_increment
|
||||
* \brief let step_engineering_string() make a postive step.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var eng_decrement
|
||||
* \brief let step_engineering_string() make a negative step.
|
||||
*/
|
||||
|
||||
const bool eng_increment = true;
|
||||
const bool eng_decrement = false;
|
||||
|
||||
/**
|
||||
* convert a double to the specified number of digits in SI (prefix) notation,
|
||||
* optionally followed by a unit.
|
||||
*/
|
||||
inline std::string
|
||||
to_engineering_string( double value, int digits, eng_prefixed_t, std::string unit = "" )
|
||||
{
|
||||
return to_engineering_string( value, digits, false, unit );
|
||||
}
|
||||
|
||||
/**
|
||||
* convert a double to the specified number of digits in exponential notation,
|
||||
* optionally followed by a unit.
|
||||
*/
|
||||
inline std::string
|
||||
to_engineering_string( double value, int digits, eng_exponential_t, std::string unit = "" )
|
||||
{
|
||||
return to_engineering_string( value, digits, true, unit );
|
||||
}
|
||||
|
||||
/**
|
||||
* step a value by the smallest possible increment, using SI notation.
|
||||
*/
|
||||
inline std::string
|
||||
step_engineering_string( std::string text, int digits, eng_prefixed_t, bool increment )
|
||||
{
|
||||
return step_engineering_string( text, digits, false, increment );
|
||||
}
|
||||
|
||||
/**
|
||||
* step a value by the smallest possible increment, using exponential notation.
|
||||
*/
|
||||
inline std::string
|
||||
step_engineering_string( std::string text, int digits, eng_exponential_t, bool increment )
|
||||
{
|
||||
return step_engineering_string( text, digits, true, increment );
|
||||
}
|
||||
|
||||
#endif // ENG_FORMAT_H_INCLUDED
|
||||
@@ -31,7 +31,6 @@ SOURCES += main.cpp\
|
||||
presentation/traceplotitem.cpp \
|
||||
gototimedialog.cpp \
|
||||
presentation/traceplot.cpp \
|
||||
thirdParty/eng_formant.cpp \
|
||||
tracefiletab.cpp \
|
||||
presentation/pornotracescroller.cpp \
|
||||
traceanalyzer.cpp \
|
||||
@@ -63,7 +62,6 @@ HEADERS += businessObjects/transaction.h \
|
||||
presentation/traceplotitem.h \
|
||||
gototimedialog.h \
|
||||
presentation/traceplot.h \
|
||||
thirdParty/eng_format.h \
|
||||
tracefiletab.h \
|
||||
presentation/pornotracescroller.h \
|
||||
traceanalyzer.h \
|
||||
|
||||
1809
docs/images/am_sample1.svg
Normal file
1809
docs/images/am_sample1.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 169 KiB |
1868
docs/images/am_sample2.svg
Normal file
1868
docs/images/am_sample2.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 171 KiB |
@@ -2,7 +2,7 @@
|
||||
<BankwiseLogic value="0"/>
|
||||
<OpenPagePolicy value="1" />
|
||||
<MaxNrOfTransactions value="8" />
|
||||
<Scheduler value="FR_FCFS" />
|
||||
<Scheduler value="FIFO_STRICT" />
|
||||
<Capsize value="5" />
|
||||
<PowerDownMode value="TimeoutSREF" />
|
||||
<PowerDownTimeout value="100" />
|
||||
|
||||
@@ -112,6 +112,7 @@ ControllerCore::~ControllerCore()
|
||||
{
|
||||
delete commandChecker[Command::Activate];
|
||||
delete commandChecker[Command::Precharge];
|
||||
delete commandChecker[Command::PrechargeAll];
|
||||
delete commandChecker[Command::Read];
|
||||
delete commandChecker[Command::Write];
|
||||
delete commandChecker[Command::AutoRefresh];
|
||||
|
||||
@@ -106,11 +106,6 @@ void Configuration::setParameter(std::string name, std::string value)
|
||||
Buswidth = string2int(value);
|
||||
else if(name == "ReadWriteGrouping")
|
||||
ReadWriteGrouping = string2bool(value);
|
||||
//removed because of Peters error model TODO clean up!
|
||||
//else if(name == "ModelStorage")
|
||||
// ModelStorage = string2bool(value);
|
||||
//else if(name == "ModelErrorInjection")
|
||||
// ModelErrorInjection = string2bool(value);
|
||||
else if(name == "ReorderBuffer")
|
||||
ReorderBuffer = string2bool(value);
|
||||
|
||||
|
||||
@@ -66,8 +66,6 @@ struct Configuration
|
||||
EPowerDownMode PowerDownMode = EPowerDownMode::Staggered;
|
||||
unsigned int Buswidth = 128;
|
||||
bool ReadWriteGrouping = false;
|
||||
bool ModelStorage = false;
|
||||
bool ModelErrorInjection = false;
|
||||
bool ReorderBuffer = false;
|
||||
|
||||
//SimConfig
|
||||
|
||||
Reference in New Issue
Block a user