| INSTALL NOTES FOR SystemC Release 2.3 |
| ------------------------------------- |
| |
| Contents: |
| |
| 1. Installation Notes for Unix |
| |
| 2. Installation Notes for Windows |
| |
| 3. SystemC Library Configuration Switches |
| |
| |
| 1. Installation Notes for Unix |
| ------------------------------ |
| |
| |
| System Requirements |
| =================== |
| |
| SystemC can be installed on the following UNIX, or UNIX-like platforms: |
| |
| o Linux |
| * Architectures |
| - x86 (32-bit) |
| - x86_64 (64-bit) |
| - x86 (32-bit) application running on x86_64 (64-bit) kernel |
| (../configure --host=i686-linux-gnu) |
| * Compilers |
| - GNU C++ compiler |
| - Clang C++ compiler |
| - or compatible |
| |
| o Mac OS X |
| * Architectures |
| - x86 (32-bit) |
| - x86_64 (64-bit) |
| - powerpc (32-bit) [deprecated] |
| - powerpc64 (64-bit) [deprecated] |
| * Compilers |
| - GNU C++ compiler |
| - Clang C++ compiler |
| - or compatible |
| |
| o Solaris |
| * Architectures |
| - SPARC (32-bit) |
| * Compilers |
| - GNU C++ compiler |
| - Sun/Solaris Studio |
| |
| o BSD |
| * Architectures |
| - x86 (32-bit) |
| - x86_64 (64-bit) |
| * Compilers |
| - GNU C++ compiler |
| - Clang C++ compiler |
| - or compatible |
| |
| o Windows |
| * Compatibility layer |
| - Cygwin |
| - MinGW / MSYS |
| * Architectures |
| - x86 (32-bit) |
| - x86_64 (64-bit) |
| * Compilers |
| - GNU C++ compiler |
| - or compatible |
| |
| Note: Not all combinations are equally well-tested and some combinations |
| may not work as expected. Please report your findings by following |
| the instructions in the README file. |
| |
| The README file contains a list of detailed platforms, architectures, |
| and compiler versions that have been used for testing this release. |
| |
| |
| Sources for Compilers and Related Tools |
| ======================================= |
| |
| To build, install, and use SystemC on UNIX platforms, you need |
| the following tools: |
| |
| 1. GNU C++ compiler, version 3.4 or later |
| or |
| Clang C++ compiler version 3.0 or later |
| |
| 2. GNU Make (gmake) |
| |
| GCC, Clang, and gmake are free software that you can |
| obtain from the following sources: |
| |
| GCC http://www.gnu.org/software/gcc/gcc.html |
| |
| Clang http://clang.llvm.org/ |
| |
| gmake http://www.gnu.org/software/make/make.html |
| |
| |
| Basic SystemC Installation |
| ========================== |
| |
| To install SystemC on a UNIX system, do the following steps: |
| |
| 1. Change to the top level directory (systemc-2.3.1) |
| |
| 2. Create a temporary directory, e.g., |
| |
| > mkdir objdir |
| |
| 3. Change to the temporary directory, e.g., |
| |
| > cd objdir |
| |
| 4. Choose your compiler by setting the CXX environment variable |
| (the configure script tries to guess the default compiler, if |
| this step is omitted): |
| |
| If you use a POSIX-compatible shell (e.g. bash): |
| |
| > export CXX="<compiler>" |
| |
| e.g. for GCC compilers |
| |
| > export CXX=g++ |
| |
| The Clang compiler is usually named 'clang++', thus e.g. |
| |
| > export CXX=clang++ |
| |
| When using a C shell (e.g. csh/tcsh), the syntax to set the |
| environment variable is different: |
| |
| > setenv CXX g++ |
| |
| For the Sun/Solaris Studio compilers, use |
| |
| > setenv CXX CC |
| |
| You can also specify an absolute path to the compiler of your choice. |
| |
| See also the Section "Compilation and Linking Options" below. |
| |
| |
| 5. Configure the package for your system, e.g., |
| (The configure script is explained below.) |
| |
| > ../configure |
| |
| While the 'configure' script is running, which takes a few moments, |
| it prints messages to inform you of the features it is checking. |
| It also detects the platform. |
| |
| Note for System V users: |
| If you are using `csh' on an older version of System V, you might |
| need to use the `sh ../configure' command instead of '../configure'. |
| Otherwise, `csh' will attempt to `configure' itself. |
| |
| SystemC 2.3 includes a fixed-point package that is always built. |
| When compiling your applications with fixed-point types, you still have |
| to use compiler flag -DSC_INCLUDE_FX. Note that compile times increase |
| significantly when using this compiler flag. |
| |
| In case you want to install the package in another place than the |
| top level directory (systemc-2.3.1), configure the package e.g. as |
| follows: |
| |
| > ../configure --prefix=/usr/local/systemc-2.3.1 |
| |
| Note: make sure you have created the target directory before installing |
| the package. Do _not_ use /usr/local as a prefix, unless you |
| follow the Unix/FHS directory layouts (see below). |
| |
| A fine grained configuration of the installation directories can |
| be achieved via additional options, given to the configure script. |
| |
| By default, the files are installed directly to the PREFIX directory |
| root and the library is installed to PREFIX/lib-<TARGETARCH>, |
| depending on the current target architecture. This may be undesired |
| in cases where the package is meant to be installed in a system-wide |
| location as part of shared (default) library and include hierarchies |
| (e.g. /usr/local, /usr, /opt, ...). To follow the Unix/FHS directory |
| standards, you can use the following options: |
| |
| --with-unix-layout use Unix directory layout for installation |
| [default=no] |
| when "yes", the following (fine-grained) settings will be used: |
| |
| --includedir=DIR C++ header files [PREFIX/include] |
| --libdir=DIR object code libraries [EPREFIX/lib] |
| --docdir=DIR documentation root [DATAROOTDIR/doc/systemc] |
| |
| The library destination itself can be further and separately configured |
| by using the following option: |
| |
| --with-arch-suffix add suffix to library installation directory |
| [default=-<TARGETARCH>] |
| |
| With this option, one can easily follow e.g. the "multi-arch" |
| conventions on some platforms: |
| |
| ../configure --with-arch-suffix=32 # lib32 |
| ../configure --with-arch-suffix=/x86_64-linux-gnu # lib/x86_64-linux-gnu |
| |
| |
| |
| Several options are available to the configure script to modify |
| the compiler configuration and the selection of certain features: |
| |
| --disable-shared do not build shared library (libsystemc.so) |
| --enable-debug include debugging symbols |
| --disable-optimize disable compiler optimization |
| --disable-async-updates disable request_async_update support |
| --enable-pthreads use POSIX threads for SystemC processes |
| --enable-phase-callbacks |
| enable simulation phase callbacks (experimental) |
| |
| |
| See the section on the general usage of the configure script and |
| "../configure --help" for more information. |
| |
| Note: If you change the configuration after having compiled the |
| package already, you should run a "gmake clean" before |
| recompiling. |
| |
| 6. Compile the package. |
| |
| > gmake |
| |
| Note: The explicit gmake targets "opt" and "debug", etc. have |
| been removed in this package. Use the corresponding |
| options to the configure script instead. |
| |
| 7. At this point you may wish to verify the compiled package by |
| testing the example suite. |
| |
| > gmake check |
| |
| This will compile and run the examples in the subdirectory |
| examples. |
| |
| 8. Install the package. |
| |
| > gmake install |
| |
| 9. You can now remove the temporary directory, .e.g, |
| |
| > cd .. |
| > rm -rf objdir |
| |
| Alternatively, you can keep the temporary directory to allow you to: |
| |
| a) Experiment with the examples. |
| |
| b) Later uninstall the package. To clean up the temporary |
| directory, enter: |
| |
| > gmake clean |
| |
| To uninstall the package, enter: |
| |
| > gmake uninstall |
| |
| |
| Running the Examples |
| ==================== |
| |
| Copies of the examples reside in the temporary directory - see |
| instruction 7 above for details on building and running them. |
| |
| In addition, a copy of the example code resides in the directory |
| examples at the highest level of the installation (or in the |
| shared documentation install directory). |
| |
| Use the makefiles provided in the 'examples' directory as templates |
| for makefiles you need for compiling your own examples. |
| |
| |
| Using the Configure Script |
| ========================== |
| |
| The `configure' shell script tries to determine the correct values for |
| various system-dependent variables used during compilation. It uses |
| these values to create a `Makefile' in each directory of the package. |
| It also creates one or more `.h' files containing system-dependent |
| definitions if needed. Then, it creates the following files: |
| |
| config.status A shell script that you can run at another time to |
| recreate the current configuration. |
| |
| config.cache A file in which the configure test results are |
| saved to speed up reconfiguration. |
| |
| Data is appended to the config.cache file. |
| You can remove unwanted data. |
| |
| config.log A file in which compiler output is saved. |
| This is used to debug the configure script. |
| |
| If you need to use other commands to successfully compile the package |
| on your system, please try to determine if the configure script can be used |
| for these commands. Then, send either a diff file or instructions about |
| the commands you used to the email address provided in the README file. |
| This information will be used to improve the installation process in |
| the next release. |
| |
| The `configure.ac' file is provided in case you want to change or regenerate |
| the `configure' script, for example to use a newer version of `autoconf'. |
| The `configure.ac' file is used by the `autoconf' program to create the |
| `configure' script. |
| |
| Note for (key) developers: |
| |
| In case you have changed the `configure.ac' file or one of the |
| `Makefile.am' files: |
| |
| - Use the `config/distclean' script to remove the generated `configure' |
| script, the generated `aclocal.m4' file and the generated `Makefile.in' |
| files. |
| |
| - Use the `config/bootstrap' script to generate the `configure' script |
| and the necessary `Makefile.in' files. This script makes use of the |
| GNU auto-tools `aclocal', `automake', and `autoconf'. |
| |
| |
| Compilation and Linking Options |
| =============================== |
| |
| Some systems require compilation or linking options that the `configure' |
| script does not define. You can define the initial values for these |
| options by setting them in your environment before running the |
| `configure' script. |
| |
| Instead of passing the variables via the environment, it is preferred |
| to pass the values as options to the configure script: |
| |
| > ../configure CXX=g++-4.4 LIBS=-lposix |
| |
| |
| Specifying the System Type |
| ========================== |
| |
| Some features cannot be automatically determined by `configure' unless |
| it can detect the host type on which the package will run. |
| If it prints a message that it cannot determine the host type, |
| use the `--host=TYPE' option to define it. TYPE can either be a |
| short system name, such as `sun4', or a canonical name with three fields: |
| |
| CPU-COMPANY-SYSTEM |
| |
| See the `config.sub' file for details about the values of each field. If |
| the `config.sub' file is not included in the package, the package does not |
| need to know the host type. |
| |
| If you are building compiler tools for cross-compiling, you can also |
| use the `--target=TYPE' option to select the type of system for which |
| the code is produced and the `--build=TYPE' option to select the type of |
| system on which you are compiling the package. |
| |
| |
| Sharing Defaults |
| ================ |
| |
| You can set the default values that `configure' scripts share by |
| creating a site shell script called `config.site'. This file contains the |
| default values for variables like `CC', `cache_file', and `prefix'. |
| The `configure' script looks for the `config.site' file in the following |
| search precedence: |
| |
| 1. PREFIX/share/config.site |
| |
| 2. PREFIX/etc/config.site |
| |
| Alternatively, you can set the `CONFIG_SITE' environment variable to the |
| site script path. |
| |
| Note: The `configure' script for some systems does not look for a site script. |
| |
| |
| Operation Controls |
| ================== |
| |
| The `configure' script recognizes the following additional options to control |
| its operation: |
| |
| `--cache-file=FILE' |
| Use and save the test results in FILE instead of |
| `./config.cache'. Set FILE to `/dev/null' to disable caching |
| when debugging `configure'. |
| |
| `--help' |
| Print a summary of `configure' options and exit. |
| |
| `--quiet' |
| `--silent' |
| `-q' |
| Do not print messages about checks being made. |
| To suppress all normal output, redirect it to `/dev/null'. |
| Error messages continue to print. |
| |
| `--srcdir=DIR' |
| Look for the package's source code in directory DIR. |
| Typically `configure' determines the directory automatically. |
| |
| `--version' |
| Print the version of `autoconf' used to generate the `configure' |
| script and exit. |
| |
| Other options that are rarely used are available in the `configure' script. |
| Use the `--help' option to print a list. |
| |
| |
| |
| 2. Installation Notes for Windows |
| --------------------------------- |
| |
| This release has been tested on Visual C++ versions 2005 through 2013, |
| running on Windows 7. |
| |
| |
| Note: This section covers the installation based on Microsoft Visual C++. |
| For Cygwin or MinGW-based installations, see Section 1. |
| |
| |
| Note: If you experience spurious errors about missing files in the |
| downloaded archive, please make sure to either download the |
| ZIP archive from accellera.org or use a reliable archive software, |
| fully supporting modern tar archive versions. |
| |
| Some paths in the SystemC archive are longer than the historical |
| 99 character limit, and several Windows archivers (e.g. WinZip) |
| have been reported to trip over this. The open source archiver |
| 7-zip (http://7-zip.org) is known to work. |
| |
| |
| Microsoft Visual C++ 2005 (compiler version 8.0) or later |
| --------------------------------------------------------- |
| |
| The download directory contains two subdirectories: 'msvc80' and |
| 'examples'. |
| |
| The 'msvc80' directory contains the project and workspace files to |
| compile the 'systemc.lib' library. Double-click on the 'SystemC.sln' |
| file to launch Visual C++ 2005 with the workspace file. The workspace file |
| will have the proper switches set to compile for Visual C++ 2005. |
| Select `Build SystemC' under the Build menu or press F7 to build |
| `systemc.lib'. |
| |
| The `examples' directory contains the project and workspace files to |
| compile the SystemC examples. Go to one of the examples subdirectories |
| and double-click on the .vcproj file to launch Visual C++ with the |
| workspace file. The workspace file will have the proper switches set |
| to compile for Visual C++ 2005. Select 'Build <example>.exe' under the |
| Build menu or press F7 to build the example executable. |
| |
| For convenience, a combined solution file 'SystemC-examples.sln' with |
| all example projects can be found in the 'msvc80' directory. A similar |
| solution file for the TLM examples is located in 'examples/tlm/build-msvc'. |
| |
| The provided project files are prepared for both the 32-bit 'Win32' and |
| 64-bit 'x64' configurations. Please refer to the Microsoft Visual Studio |
| documentation for details about 64-bit builds. |
| |
| |
| Creating SystemC Applications |
| ----------------------------- |
| |
| 1. Start Visual Studio. From the Start Page select New Project and Win32 |
| Console Project. Type the project name and select a suitable location |
| then click OK. |
| |
| 2. Select the Application Settings page of the Win32 Application Wizard |
| and make sure the 'Empty project' box is ticked. Click 'Finish' to |
| complete the wizard. |
| |
| 3. Add new/existing C++ files to the project and edit code. |
| |
| 4. Display the project Property Pages by selecting 'Properties...' from |
| the Project menu. |
| |
| 5. From the C/C++ tab, select the General properties and set |
| 'Detect 64-bit Portability Issues' to No |
| |
| 6. From the C/C++ tab, select the Language properties and set |
| 'Enable Run-Time Type Info' to Yes |
| |
| 7. From the C/C++ tab, select the Command Line properties and add /vmg |
| to the 'Additional Options:' box. |
| |
| 8. From the Linker tab, select the Input properties and type 'systemc.lib' |
| in the 'Additional Dependencies' box. |
| |
| 9. Click OK |
| |
| |
| Also make sure that the compiler and linker can find the SystemC header |
| and library files respectively. There are two ways to do this: |
| |
| To update the include file and library directory search paths for all |
| projects: |
| |
| 1. Select Tools -> Options... and the Projects -> VC++ Directories tab |
| |
| 2. Select show directories for: Library files |
| |
| 3. Select the 'New' icon and browse to: C:\systemc-2.3.1\msvc80\systemc\debug |
| |
| 4. Select show directories for: Include files |
| |
| 5. Select the 'New' icon and browse to: C:\systemc-2.3.1\src |
| |
| To add the include file and library directory search paths for the current |
| project only: |
| |
| 1. Display the project Property Pages by selecting 'Properties...' from |
| the Project menu. |
| |
| 2. From the C/C++ tab, select the General properties and type the path to the |
| SystemC 'src' directory in the text entry field labeled |
| 'Additional include directories' (e.g. the examples use '..\..\..\src'). |
| |
| 3. From the Linker tab, select the General properties and type the path to |
| the SystemC library: ...\systemc-2.3.1\msvc80\systemc\debug'systemc.lib' |
| in the 'Additional Library Directories:' box. |
| |
| 9. Click OK |
| |
| |
| |
| |
| 3. SystemC Library Configuration Switches |
| ----------------------------------------- |
| |
| In addition to the explicitly selectable feature given as options to |
| the `configure' script (see 1.), some aspects of the library |
| implementation can be controlled via |
| |
| - preprocessor switches given during library build |
| - preprocessor switches added while building a SystemC application |
| - environment variables |
| |
| The currently supported switches are documented in this section. |
| |
| Preprocessor switches |
| ===================== |
| |
| Additional preprocessor switches for the library build can be passed |
| to the configure script via the CXXFLAGS variable: |
| |
| ../configure CXXFLAGS="-DSC_OVERRIDE_DEFAULT_STACK_SIZE=0x80000" |
| |
| In Visual C++, the preprocessor symbols can be added to the project |
| configuration via the 'C/C++' tab under the 'Preprocessor' properties |
| in the 'Preprocessor definitions' setting. |
| |
| |
| * SC_DEFAULT_WRITER_POLICY=<sc_writer_policy> - |
| Override default value for the signal writer policy |
| |
| This setting allows deactivating the multiple writer checks for |
| sc_signals at (application) compile time. This mechanism supersedes |
| the old environment variable SC_SIGNAL_WRITE_CHECK (see below). |
| |
| Supported values: |
| SC_ONE_WRITER (default) |
| SC_MANY_WRITERS (allow multiple writers in different deltas) |
| SC_UNCHECKED_WRITERS (non-standard, disable all checks) |
| |
| Note: Only effective when building an application. |
| |
| Note: This setting needs to be consistently set across all |
| translation units of an application. |
| |
| |
| * SC_DISABLE_ASYNC_UPDATES - |
| Exclude the "async_request_update" support |
| |
| Note: This option is usually set by the `configure` option |
| --disable-async-update, or |
| --enable-async-update=no |
| |
| On non-Automake platforms (e.g. Visual C++), this preprocessor |
| symbol can be used to manually build the library with this feature. |
| |
| Note: Only effective during library build. |
| |
| |
| * SC_DISABLE_VIRTUAL_BIND - |
| Keep the "bind" function of sc_ports non-virtual |
| |
| When this symbol is defined, the "bind" function in sc_ports is |
| kept non-virtual (although it is required to be 'virtual' since |
| IEEE 1666-2011). |
| |
| Note: This symbol needs to be consistently defined in the library |
| and any application linking against the built library. |
| |
| |
| * SC_DISABLE_COPYRIGHT_MESSAGE - |
| Do not print the copyright message when starting the application |
| |
| Note: This does not remove the copyright from the binary. |
| sc_core::sc_copyright() still works as expected. |
| Note: Only effective during library build. |
| See : Environment variable SC_COPYRIGHT_MESSAGE |
| |
| |
| * SC_ENABLE_IMMEDIATE_SELF_NOTIFICATIONS - |
| Allow a process to trigger itself immediately |
| |
| Allow a method process to trigger itself immediately by using |
| next_trigger( ev ); // or a static sensitivity |
| ev.notify(); |
| |
| This behaviour has been disabled by default in IEEE 1666-2011 and |
| can be reenabled by this option. |
| |
| Note: Only effective during library build. |
| |
| |
| * SC_ENABLE_EARLY_MAXTIME_CREATION - |
| Allow creation of sc_time objects with a value of sc_max_time() |
| before finalizing the time resolution |
| |
| In IEEE 1666-2011, it is not allowed to create sc_time objects with |
| a non-SC_ZERO_TIME value before setting/changing the time resolution. |
| |
| This preprocessor switch activates an extension to allow the |
| initialization of sc_time variables with sc_max_time() while |
| still accepting changes to the time resolution afterwards. |
| |
| sc_time t = sc_max_time(); |
| sc_set_time_resolution( 1, SC_NS ); // OK, with this extension |
| |
| The time resolution will still be fixed, once you have explicitly or |
| implicitly relied on the physical value (i.e. the relation to seconds) |
| of any sc_time object. |
| |
| Note: Only effective during library build. |
| |
| |
| * SC_ENABLE_SIMULATION_PHASE_CALLBACKS (experimental) |
| SC_ENABLE_SIMULATION_PHASE_CALLBACKS_TRACING (experimental) - |
| Enable a generic simulation phase callback mechanism. |
| |
| Note: This option is usually set by the `configure` option |
| --enable-phase-callbacks, or |
| --enable-phase-callbacks=tracing |
| |
| See the RELEASENOTES for more information about this feature. |
| |
| The *_TRACING variant of this flag enables the sc_trace |
| implementation use these callbacks, instead of hard-coded updates |
| from the main simulator loop. |
| |
| Note: Setting tracing flag includes the generic phase callback |
| infrastructure automatically. |
| Note: Only effective during library build. |
| |
| |
| * SC_INCLUDE_DYNAMIC_PROCESSES - |
| Enable dynamic process support (sc_spawn, sc_bind) |
| |
| To improve compilation times, the functions for spawing dynamic |
| processes are not included by default in an SystemC application. |
| |
| Define this symbol before including the SystemC header in your |
| application, if you want to use dynamically spawned processes. |
| |
| Note: Can be optionally set per translation unit in an application. |
| |
| Note: Some TLM convenience sockets require this feature and define |
| the symbol for you if needed. |
| |
| |
| * SC_INCLUDE_FX - |
| Enable SystemC fix-point datatypes |
| |
| To improve compilation times, the fixpoint datatypes are not enabled |
| by default in an SystemC application. |
| |
| Define this symbol before including the SystemC header in your |
| application, if you want to use the SystemC fixpoint types. |
| |
| Note: Is by default always defined during the library build to enable |
| later use of the fixpoint datatypes in an application. |
| |
| Note: Can be optionally set per translation unit in an application. |
| |
| |
| * SC_INCLUDE_STRSTREAM - |
| Include (deprecated) <strstream> header from <systemc.h> |
| |
| Pre-standard C++ compilers had support for an old stringstream |
| implementation called 'strstream'. In the unlikely case that your |
| application still relies on this deprecated class and that <systemc.h> |
| includes this header for you automatically, you now need to define this |
| symbol when building your application. |
| |
| Note: Only effective when building an application. |
| |
| |
| * SC_INCLUDE_WINDOWS_H - |
| Explicitly include <windows.h> header from <systemc> header |
| |
| Previous versions of SystemC always included the full <windows.h> |
| header on all Windows platforms. This adds unnecessary bloat to |
| many SystemC applications, reducing compilation times. |
| |
| If you rely on the inclusion of the <windows.h> header in your |
| application, you can add this symbol to the list of preprocessor |
| switches for your compiler. |
| |
| Note: Only effective when building an application. |
| |
| |
| * SC_OVERRIDE_DEFAULT_STACK_SIZE=<size> - |
| Define the default stack size used for SystemC (thread) processes |
| |
| Note: Only effective during library build. |
| |
| |
| * SC_USE_SC_STRING_OLD / SC_USE_STD_STRING - |
| Define 'sc_string' symbol. |
| |
| Pre-IEEE-1666 versions of SystemC included an 'sc_string' class for |
| string objects. This class has been superseeded by 'std::string' these |
| days. |
| |
| If your application still relies on 'sc_string' being available, set one |
| of the two supported preprocessor switches to provide it: |
| |
| SC_USE_SC_STRING_OLD - |
| Uses old implementation `sc_string_old' to provide `sc_string': |
| typedef sc_string_old sc_string; |
| |
| SC_USE_STD_STRING - |
| Provide `sc_string' as an alias to `std::string': |
| typedef std::string sc_string; |
| |
| |
| Influential environment variables |
| ================================= |
| |
| Currently, three environment variables are checked at library load time |
| and influence the SystemC library's behaviour: |
| |
| 1) SC_COPYRIGHT_MESSAGE=DISABLE - |
| Run-time alternative to SC_DISABLE_COPYRIGHT_MESSAGE (see above). |
| |
| 2) SC_SIGNAL_WRITE_CHECK=DISABLE |
| Run-time alternative to SC_DEFAULT_WRITER_POLICY=SC_UNCHECKED_WRITERS |
| (see above) |
| |
| 3) SC_DEPRECATION_WARNINGS=DISABLE |
| Do not issue warnings about using deprecated features as of |
| IEEE 1666-2011. |
| |
| Usually, it is not recommended to use any of these variables in new or |
| on-going projects. They have been added to simplify the transition of |
| legacy code. |
| |
| |
| // Taf! |