
## Relevant classes
```
PhaseDependenciesTracker
├── ConfigurationFactory
│   └── ConfigurationBase
│       ├── DBPhaseEntryBase
│       └── DRAMTimeDependenciesBase
│           ├── DependencyMap
│           │   └── PhaseTimeDependencies
│           └── PoolControllerMap
└── DBDependencyEntry
```

#### PhaseDependenciesTracker
Responsible for the whole execution. Instantiates a configuration class through the ConfigurationFactory, loads the selected phases into memory, calculates the time dependencies between phases and saves into the database file.

#### ConfigurationFactory
Creates a configuration object given its name.

#### ConfigurationBase
Interface and common functionality of configuration classes. These include creating DBPhaseEntryBase objects from the database for the given device and delegate methods.

#### DBPhaseEntryBase
Interfaces to device specific phase entries. Specificities include object data, construction and dependency logic.

#### DRAMTimeDependenciesBase
Interfaces to device's time dependencies descriptor class.

#### DependencyMap
A STL map using auxiliar objects. Maps phases to their PhaseTimeDependencies.

#### PhaseTimeDependencies
An auxiliar class with initializer list constructor. Contains a vector of TimeDependency objects and its maximum time value.

#### PoolControllerMap
Maps pool names to PoolController objects. Pools keep track of all potential dependencies of a given phase.

#### DBDependencyEntry
Contains the data to be written to the database.


## Suggested steps for creating a device:
1. Create a time dependencies class inheriting from the DRAMTimeDependenciesBase object.
2. Create the phase entry object inheriting from DBPhaseEntryBase. The object must determine the relevant data to be used and how phases may be correlated.
3. Create a configuration class for your object inheriting from ConfigurationBase. This will contain the dependencies maps and instantiate the specialized DBPhaseEntryBase object.
4. Add the newly created device to the functions of the ConfigurationFactory class. The device name is taken from the database.

#### Example
For instance, we have the necessary objects for calculating DDR3 device dependencies implemented in the following files:
1. deviceDependencies/specialized/TimeDependenciesInfoDDR3.(h/cpp)
2. dbEntries/specialized/DDR3dbphaseentry.(h/cpp)
3. configurations/specialized/DDR3Configuration.(h/cpp)
