ForSyDe (empty) → 3.0
raw patch · 138 files changed
+33170/−0 lines, 138 filesdep +basedep +containersdep +directorybuild-type:Customsetup-changedbinary-added
Dependencies added: base, containers, directory, filepath, mtl, old-time, packedstring, parameterized-data, pretty, process, random, regex-posix, template-haskell, type-level
Files
- ForSyDe.cabal +182/−0
- INSTALL +29/−0
- LICENSE +26/−0
- README +20/−0
- Setup.hs +115/−0
- dist/build/autogen/Paths_ForSyDe.hs +3/−0
- doc/www/files/tutorial/figures/SeqAddFour.svg +801/−0
- doc/www/files/tutorial/figures/VHDLTree.svg +853/−0
- doc/www/files/tutorial/figures/compflow.svg +521/−0
- doc/www/files/tutorial/figures/delaySY.svg +2150/−0
- doc/www/files/tutorial/figures/encoder.svg +228/−0
- doc/www/files/tutorial/figures/fullAdderMealy.svg +163/−0
- doc/www/files/tutorial/figures/fullAdderMoore.svg +144/−0
- doc/www/files/tutorial/figures/layout.png binary
- doc/www/files/tutorial/figures/mapSY.svg +1997/−0
- doc/www/files/tutorial/figures/piecewise_sin.svg +136/−0
- doc/www/files/tutorial/figures/portConstraints1.png binary
- doc/www/files/tutorial/figures/portConstraints2.png binary
- doc/www/files/tutorial/figures/processbox.svg +2235/−0
- doc/www/files/tutorial/figures/processcons.svg +2590/−0
- doc/www/files/tutorial/figures/processfun.svg +156/−0
- doc/www/files/tutorial/figures/sourceSY.svg +2524/−0
- doc/www/files/tutorial/figures/sourceSY_counterProc1.svg +41/−0
- doc/www/files/tutorial/figures/sourceSY_counterProc2.svg +45/−0
- doc/www/files/tutorial/fptools.css +39/−0
- doc/www/files/tutorial/tutorial.html +1492/−0
- doc/www/files/tutorial/tutorial.pdf binary
- examples/ALU.hs +343/−0
- examples/ALU_Shallow.hs +185/−0
- examples/BitVector.hs +19/−0
- examples/ButtonEncoder.hs +43/−0
- examples/CarrySelectAdder.hs +386/−0
- examples/Counter.hs +20/−0
- examples/DeepShallow.hs +22/−0
- examples/Equalizer_Shallow/AudioAnalyzer.lhs +55/−0
- examples/Equalizer_Shallow/AudioFilter.lhs +34/−0
- examples/Equalizer_Shallow/ButtonControl.lhs +140/−0
- examples/Equalizer_Shallow/DistortionControl.lhs +61/−0
- examples/Equalizer_Shallow/Equalizer.lhs +55/−0
- examples/Equalizer_Shallow/EqualizerTypes.lhs +21/−0
- examples/Equalizer_Shallow/README +6/−0
- examples/Equalizer_Shallow/Test/AudioIn.mat +1/−0
- examples/Equalizer_Shallow/TestAnalyzer.lhs +30/−0
- examples/Equalizer_Shallow/TestButtonControl.lhs +38/−0
- examples/Equalizer_Shallow/TestDFT.lhs +17/−0
- examples/Equalizer_Shallow/TestDistortionControl.lhs +30/−0
- examples/Equalizer_Shallow/TestEqualizer.lhs +94/−0
- examples/Equalizer_Shallow/TestFIR.lhs +10/−0
- examples/Equalizer_Shallow/TestFilter.lhs +82/−0
- examples/LFSR.hs +58/−0
- examples/Multiplexer.hs +57/−0
- examples/Multiplexer_FSVector.hs +45/−0
- examples/Null.hs +20/−0
- examples/ParAddFour.hs +43/−0
- examples/SeqAddFour.hs +45/−0
- examples/ZipTwist.hs +36/−0
- lib/forsyde.vhd +158/−0
- src/Data/Traversable/GenericZipWith.hs +71/−0
- src/Data/Typeable/TypeRepLib.hs +31/−0
- src/ForSyDe.hs +36/−0
- src/ForSyDe/AbsentExt.hs +100/−0
- src/ForSyDe/Backend.hs +24/−0
- src/ForSyDe/Backend/GraphML.hs +45/−0
- src/ForSyDe/Backend/GraphML/AST.hs +44/−0
- src/ForSyDe/Backend/GraphML/FileIO.hs +27/−0
- src/ForSyDe/Backend/GraphML/Ppr.hs +325/−0
- src/ForSyDe/Backend/GraphML/Traverse.hs +139/−0
- src/ForSyDe/Backend/GraphML/Traverse/GraphMLM.hs +247/−0
- src/ForSyDe/Backend/Ppr.hs +107/−0
- src/ForSyDe/Backend/Simulate.hs +248/−0
- src/ForSyDe/Backend/VHDL.hs +90/−0
- src/ForSyDe/Backend/VHDL/AST.hs +712/−0
- src/ForSyDe/Backend/VHDL/Constants.hs +338/−0
- src/ForSyDe/Backend/VHDL/FileIO.hs +30/−0
- src/ForSyDe/Backend/VHDL/Generate.hs +713/−0
- src/ForSyDe/Backend/VHDL/GlobalNameTable.hs +107/−0
- src/ForSyDe/Backend/VHDL/GlobalNameTable.hs-boot +7/−0
- src/ForSyDe/Backend/VHDL/Modelsim.hs +169/−0
- src/ForSyDe/Backend/VHDL/Ppr.hs +480/−0
- src/ForSyDe/Backend/VHDL/Quartus.hs +116/−0
- src/ForSyDe/Backend/VHDL/TestBench.hs +220/−0
- src/ForSyDe/Backend/VHDL/Translate.hs +827/−0
- src/ForSyDe/Backend/VHDL/Traverse.hs +239/−0
- src/ForSyDe/Backend/VHDL/Traverse/VHDLM.hs +557/−0
- src/ForSyDe/Bit.hs +169/−0
- src/ForSyDe/Config.hs +23/−0
- src/ForSyDe/DFT.hs +79/−0
- src/ForSyDe/FIR.hs +63/−0
- src/ForSyDe/ForSyDeErr.hs +457/−0
- src/ForSyDe/Ids.hs +23/−0
- src/ForSyDe/Netlist.hs +251/−0
- src/ForSyDe/Netlist/Traverse.hs +194/−0
- src/ForSyDe/OSharing.hs +207/−0
- src/ForSyDe/OSharing/UDynamic.hs +54/−0
- src/ForSyDe/Process.hs +24/−0
- src/ForSyDe/Process/ProcFun.hs +163/−0
- src/ForSyDe/Process/ProcType.hs +196/−0
- src/ForSyDe/Process/ProcType/Instances.hs +116/−0
- src/ForSyDe/Process/ProcVal.hs +48/−0
- src/ForSyDe/Process/SynchProc.hs +875/−0
- src/ForSyDe/Shallow.hs +43/−0
- src/ForSyDe/Shallow/AbsentExt.hs +88/−0
- src/ForSyDe/Shallow/AdaptivityLib.hs +26/−0
- src/ForSyDe/Shallow/BitVector.hs +122/−0
- src/ForSyDe/Shallow/CTLib.hs +1040/−0
- src/ForSyDe/Shallow/CoreLib.hs +37/−0
- src/ForSyDe/Shallow/DFT.hs +71/−0
- src/ForSyDe/Shallow/DomainInterfaces.hs +130/−0
- src/ForSyDe/Shallow/FIR.hs +36/−0
- src/ForSyDe/Shallow/FilterLib.hs +314/−0
- src/ForSyDe/Shallow/Gaussian.hs +68/−0
- src/ForSyDe/Shallow/Memory.hs +64/−0
- src/ForSyDe/Shallow/MoCLib.hs +38/−0
- src/ForSyDe/Shallow/PolyArith.hs +106/−0
- src/ForSyDe/Shallow/Queue.hs +98/−0
- src/ForSyDe/Shallow/Signal.hs +224/−0
- src/ForSyDe/Shallow/StochasticLib.hs +255/−0
- src/ForSyDe/Shallow/SynchronousLib.hs +349/−0
- src/ForSyDe/Shallow/SynchronousProcessLib.hs +115/−0
- src/ForSyDe/Shallow/UntimedLib.hs +200/−0
- src/ForSyDe/Shallow/UtilityLib.hs +54/−0
- src/ForSyDe/Shallow/Vector.hs +398/−0
- src/ForSyDe/Signal.hs +30/−0
- src/ForSyDe/System.hs +24/−0
- src/ForSyDe/System/Instantiate.hs +44/−0
- src/ForSyDe/System/SysDef.hs +405/−0
- src/ForSyDe/System/SysDef.hs-boot +19/−0
- src/ForSyDe/System/SysFun.hs +312/−0
- src/ForSyDe/System/SysFun/Instances.hs +81/−0
- src/Language/Haskell/TH/Lift.hs +101/−0
- src/Language/Haskell/TH/LiftInstances.hs +90/−0
- src/Language/Haskell/TH/TypeLib.hs +203/−0
- tests/Install.hs +47/−0
- tests/Main.hs +68/−0
- tests/properties/Main.hs +20/−0
- tests/properties/Shallow.hs +7/−0
- tests/properties/Shallow/SynchronousMoC.hs +14/−0
- tests/properties/VHDLBackend.hs +194/−0
+ ForSyDe.cabal view
@@ -0,0 +1,182 @@+name: ForSyDe+version: 3.0+cabal-version: >= 1.2+build-type: Custom+license: BSD3+license-file: LICENSE+author: SAM group, KTH/ICT/ECS+copyright: Copyright (c) 2003-2008 SAM group, KTH/ICT/ECS+maintainer: forsyde-dev@ict.kth.se+homepage: http://www.ict.kth.se/org/ict/ecs/sam/projects/forsyde/www/+stability: alpha+synopsis: + ForSyDe's Haskell-embedded Domain Specific Language.+description: + The ForSyDe (Formal System Design) methodology has been developed with the objective to move system design to a higher level of abstraction and to bridge the abstraction gap by transformational design refinement. + + This library provides ForSyDe's implementation as a Haskell-embedded Domain Specific Language (DSL). For more information, please see ForSyDe's website: <http://www.ict.kth.se/org/ict/ecs/sam/projects/forsyde/www/>.+category: Language+tested-with: GHC==6.8.1, GHC==6.8.2+data-files: lib/forsyde.vhd+-- In order to include all this files with sdist+extra-source-files: LICENSE,+ README,+ INSTALL,+ doc/www/files/tutorial/tutorial.pdf,+ doc/www/files/tutorial/tutorial.html,+ doc/www/files/tutorial/fptools.css,+ doc/www/files/tutorial/figures/SeqAddFour.svg+ doc/www/files/tutorial/figures/VHDLTree.svg,+ doc/www/files/tutorial/figures/compflow.svg,+ doc/www/files/tutorial/figures/delaySY.svg,+ doc/www/files/tutorial/figures/encoder.svg,+ doc/www/files/tutorial/figures/fullAdderMealy.svg,+ doc/www/files/tutorial/figures/fullAdderMoore.svg,+ doc/www/files/tutorial/figures/layout.png,+ doc/www/files/tutorial/figures/mapSY.svg,+ doc/www/files/tutorial/figures/piecewise_sin.svg,+ doc/www/files/tutorial/figures/portConstraints1.png,+ doc/www/files/tutorial/figures/portConstraints2.png,+ doc/www/files/tutorial/figures/processbox.svg,+ doc/www/files/tutorial/figures/processcons.svg,+ doc/www/files/tutorial/figures/processfun.svg,+ doc/www/files/tutorial/figures/sourceSY.svg,+ doc/www/files/tutorial/figures/sourceSY_counterProc1.svg,+ doc/www/files/tutorial/figures/sourceSY_counterProc2.svg,+ examples/ALU.hs,+ examples/ALU_Shallow.hs,+ examples/BitVector.hs,+ examples/ButtonEncoder.hs,+ examples/CarrySelectAdder.hs,+ examples/Counter.hs,+ examples/DeepShallow.hs,+ examples/LFSR.hs,+ examples/Multiplexer.hs,+ examples/Multiplexer_FSVector.hs,+ examples/Null.hs,+ examples/ParAddFour.hs,+ examples/SeqAddFour.hs,+ examples/ZipTwist.hs,+ examples/Equalizer_Shallow/README,+ examples/Equalizer_Shallow/AudioAnalyzer.lhs,+ examples/Equalizer_Shallow/AudioFilter.lhs,+ examples/Equalizer_Shallow/ButtonControl.lhs,+ examples/Equalizer_Shallow/DistortionControl.lhs,+ examples/Equalizer_Shallow/Equalizer.lhs,+ examples/Equalizer_Shallow/EqualizerTypes.lhs,+ examples/Equalizer_Shallow/Test/AudioIn.mat,+ examples/Equalizer_Shallow/TestAnalyzer.lhs,+ examples/Equalizer_Shallow/TestButtonControl.lhs,+ examples/Equalizer_Shallow/TestDFT.lhs,+ examples/Equalizer_Shallow/TestDistortionControl.lhs,+ examples/Equalizer_Shallow/TestEqualizer.lhs,+ examples/Equalizer_Shallow/TestFilter.lhs,+ examples/Equalizer_Shallow/TestFIR.lhs,+ tests/Main.hs,+ tests/Install.hs,+ tests/properties/Main.hs,+ tests/properties/Shallow/SynchronousMoC.hs,+ tests/properties/Shallow.hs,+ tests/properties/VHDLBackend.hs,+-- due to a bug in cabal 1.2, sdist does not include hs-boot files+ src/ForSyDe/Backend/VHDL/GlobalNameTable.hs-boot,+ src/ForSyDe/System/SysDef.hs-boot+++Library+ build-depends: type-level,+ parameterized-data,+ containers,+ packedstring,+ base, + regex-posix, + mtl, + pretty, + template-haskell > 2.0,+ process,+ directory,+ filepath,+ old-time,+ random++ hs-source-dirs: src, dist/build/autogen+ exposed-modules: Language.Haskell.TH.Lift,+ Language.Haskell.TH.LiftInstances,+ ForSyDe,+ ForSyDe.Ids,+ ForSyDe.System,+ ForSyDe.AbsentExt,+ ForSyDe.Bit,+ ForSyDe.DFT,+ ForSyDe.FIR,+ ForSyDe.Signal,+ ForSyDe.Process,+ ForSyDe.Process.SynchProc,+ ForSyDe.Backend,+ ForSyDe.Backend.Simulate,+ ForSyDe.Backend.VHDL,+ ForSyDe.Backend.GraphML,+ ForSyDe.Shallow,+ ForSyDe.Shallow.AbsentExt,+ ForSyDe.Shallow.MoCLib,+ ForSyDe.Shallow.AdaptivityLib,+ ForSyDe.Shallow.PolyArith,+ ForSyDe.Shallow.BitVector,+ ForSyDe.Shallow.Queue,+ ForSyDe.Shallow.CTLib,+ ForSyDe.Shallow.Signal,+ ForSyDe.Shallow.CoreLib,+ ForSyDe.Shallow.StochasticLib,+ ForSyDe.Shallow.DFT,+ ForSyDe.Shallow.SynchronousLib,+ ForSyDe.Shallow.DomainInterfaces,+ ForSyDe.Shallow.SynchronousProcessLib,+ ForSyDe.Shallow.FIR,+ ForSyDe.Shallow.UntimedLib,+ ForSyDe.Shallow.FilterLib,+ ForSyDe.Shallow.UtilityLib,+ ForSyDe.Shallow.Gaussian,+ ForSyDe.Shallow.Vector,+ ForSyDe.Shallow.Memory++ + other-modules: Paths_ForSyDe,+ Language.Haskell.TH.TypeLib,+ Data.Typeable.TypeRepLib,+ Data.Traversable.GenericZipWith,+ ForSyDe.Config,+ ForSyDe.ForSyDeErr,+ ForSyDe.Netlist,+ ForSyDe.Netlist.Traverse,+ ForSyDe.OSharing,+ ForSyDe.OSharing.UDynamic,+ ForSyDe.System.SysFun,+ ForSyDe.System.SysFun.Instances,+ ForSyDe.System.SysDef,+ ForSyDe.System.Instantiate,+ ForSyDe.Process.ProcFun,+ ForSyDe.Process.ProcVal, + ForSyDe.Process.ProcType,+ ForSyDe.Process.ProcType.Instances,+ ForSyDe.Backend.Ppr,+ ForSyDe.Backend.VHDL.GlobalNameTable,+ ForSyDe.Backend.VHDL.AST,+ ForSyDe.Backend.VHDL.Ppr,+ ForSyDe.Backend.VHDL.Constants,+ ForSyDe.Backend.VHDL.FileIO,+ ForSyDe.Backend.VHDL.Traverse,+ ForSyDe.Backend.VHDL.Traverse.VHDLM,+ ForSyDe.Backend.VHDL.Translate,+ ForSyDe.Backend.VHDL.Generate,+ ForSyDe.Backend.VHDL.TestBench,+ ForSyDe.Backend.VHDL.Quartus,+ ForSyDe.Backend.VHDL.Modelsim,+ ForSyDe.Backend.GraphML.AST,+ ForSyDe.Backend.GraphML.Ppr,+ ForSyDe.Backend.GraphML.FileIO,+ ForSyDe.Backend.GraphML.Traverse,+ ForSyDe.Backend.GraphML.Traverse.GraphMLM+ +++ ghc-options: -Wall -fno-warn-name-shadowing -fno-warn-orphans
+ INSTALL view
@@ -0,0 +1,29 @@+DEPENDENCIES+ + ForSyDe depends on GHC >= 6.8.2 due to the use of numerous extensions,+ namely Template Haskell (TH).++ It depends on the type-level and parameterized-data packages and some+ others normally bundled with GHC distributions.++INSTALLATION++See http://www.haskell.org/haskellwiki/Cabal/How_to_install_a_Cabal_package++Here is a summary on how to install ForSyDe manually:++To install globally, for the whole system (requires admin permissions):++$ ./Setup.hs configure+$ ./Setup.hs build+$ ./Setup.hs haddock # generate documentation, optional, + # requires Haddock > 2.0 due to the use of TH+$ sudo ./Setup.hs install++To install locally and just for your own user:++$ ./Setup.hs configure --user --prefix=The/selected/local/directory+$ ./Setup.hs build+$ ./Setup.hs haddock # generate documentation, optional, + # requires Haddock > 2.0 due to the use of TH+$ ./Setup.hs install
+ LICENSE view
@@ -0,0 +1,26 @@+ Copyright (c) 2003-2008, SAM Group at the School of Information and + Communication Technology, (Royal Institute of Technology, Stockholm, Sweden)++ All rights reserved.++ Redistribution and use in source and binary forms, with or without+ modification, are permitted provided that the following conditions are met:+ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+ * Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.+ * Neither the name of the SAM Group nor the+ names of its contributors may be used to endorse or promote products+ derived from this software without specific prior written permission.++ THIS SOFTWARE IS PROVIDED BY THE SAM GROUP ``AS IS'' AND ANY+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+ DISCLAIMED. IN NO EVENT SHALL The ForSyDe TEAM BE LIABLE FOR ANY+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README view
@@ -0,0 +1,20 @@+ ForSyDe's Haskell-embedded Domain Specific Language.+ ====================================================++DESCRIPTION++ The ForSyDe (Formal System Design) methodology has been developed+ with the objective to move system design to a higher level of+ abstraction and to bridge the abstraction gap by transformational+ design refinement.+ + This library provides ForSyDe's implementation as a Haskell-embedded+ Domain Specific Language (DSL). ++ For more information, please see ForSyDe's website:+ <http://www.ict.kth.se/org/ict/ecs/sam/projects/forsyde/www/>.+++INSTALLATION++ For information on how to install ForSyDe see the INSTALL file.
+ Setup.hs view
@@ -0,0 +1,115 @@+#! /usr/bin/env runhaskell+module Main (main) where++import Control.Monad (liftM, when)+import Data.List (intersperse)+import Distribution.Simple+import Distribution.Simple.Setup+import Distribution.Simple.LocalBuildInfo+import Distribution.PackageDescription+import System.Process+import System.Exit+import System.Directory+import System.FilePath++main :: IO ()+main = defaultMainWithHooks simpleUserHooks{runTests=forsydeTests,+ postInst=forsydePostInst,+ postCopy=forsydePostCopy}++forsydeTests :: Args -> Bool -> PackageDescription -> LocalBuildInfo -> IO ()+forsydeTests _ _ _ _ = do + e <- runCommandMsg "runghc" + ["-itests/properties", "-iexamples", "tests/properties/Main.hs"] + when (not e) exitFailure++forsydePostInst :: Args -> InstallFlags -> PackageDescription -> + LocalBuildInfo -> IO () +forsydePostInst _ _ = compile_forsyde_vhd NoCopyDest++forsydePostCopy :: Args -> CopyFlags -> PackageDescription -> + LocalBuildInfo -> IO ()+forsydePostCopy _ cf = compile_forsyde_vhd (copyDest cf)+++-- NOTE: Most of this code is duplicated from ForSyDe.Backend.VHDL.Modelsim,+-- however, it allows Setup.hs to be selfcontained++-- Compile forsyde.vhd if possible, showing what's going on to the end user+compile_forsyde_vhd :: CopyDest -> PackageDescription -> LocalBuildInfo + -> IO ()+compile_forsyde_vhd cd pd lbi = do+ putStrLn "Compiling ForSyDe's VHDL library with Modelsim ..." + (ifNot isModelsimInstalled + (modelsimError "Modelsim executables could not be found.")) <&&>+ (ifNot (do_compile_forsyde_vhd forsyde_vhd_dir)+ ( modelsimError "Compilation failed.")) <&&>+ (putStrLn "Compilation succeded." >> return True) + return ()+ where + forsyde_vhd_dir = (datadir $ absoluteInstallDirs pd lbi cd) </> + "lib"+ modelsimError err = putStrLn $ + "Error: " ++ err ++ "\n" +++ " ForSyDe will work, but you will not be able to automatically\n" +++ " simulate the ForSyDe-generated VHDL models with Modelsim\n" +++ " (see function ForSyDe.Backend.VHDL.writeAndSimulateVHDL).\n\n" +++ " In order to fix this, make sure that the Modelsim executables " ++ + " can be found in PATH and reinstall ForSyDe"++-- Look for modelsim executables+isModelsimInstalled :: IO Bool+isModelsimInstalled = executablePresent "vlib" <&&> + executablePresent "vmap" <&&> + executablePresent "vcom"+ where executablePresent = (liftM (maybe False (\_-> True))) .findExecutable+ +-- Create a modelsim library for forsyde.vhd +-- in the same directory in which forsyde.vhd was copied+do_compile_forsyde_vhd :: FilePath -- ^ absolute directory which + -- forsyde.vhd was copied into + -> IO Bool+do_compile_forsyde_vhd dir = + (runCommandMsg "vlib" [dir </> "modelsim"]) <&&> + (runCommandMsg+ "vcom" ["-93", "-quiet", "-nologo", "-work", dir </> "modelsim", + dir </> "forsyde.vhd"])+ where runWait :: String -> FilePath -> [String] -> IO Bool+ runWait msg proc args = do+ putStrLn msg + h <- runProcess proc args (Just dir) Nothing Nothing Nothing Nothing+ code <- waitForProcess h+ return $ code == ExitSuccess ++-- | run a command showing what's being run+runCommandMsg :: String -- ^ Command to execute + -> [String] -- ^ Command arguments+ -> IO Bool+runCommandMsg command args = runWait msg command args+ where msg = "Running: " ++ command ++ " " ++ (concat $ intersperse " " args)+++-- | Run a process, previously announcing a message and waiting for it+-- to finnish its execution.+runWait :: String -- ^ message to show+ -> FilePath -- ^ command to execute + -> [String] -- ^ command arguments+ -> IO Bool -- ^ Did the execution end succesfully?+runWait msg proc args = do+ putStrLn msg + h <- runProcess proc args Nothing Nothing Nothing Nothing Nothing+ code <- waitForProcess h+ return $ code == ExitSuccess +++-- | short-circuit and for monads+(<&&>) :: Monad m => m Bool -> m Bool -> m Bool+x <&&> y = do p <- x+ if p then y else return False++-- | execute an action when the argument is False+-- and return the boolean value+ifNot :: Monad m => m Bool -> m () -> m Bool+ifNot x a = do p <- x+ when (not p) a+ return p
+ dist/build/autogen/Paths_ForSyDe.hs view
@@ -0,0 +1,3 @@+-- Phony file to hush HackageDB, see http://groups.google.com/group/fa.haskell/browse_thread/thread/58994ec169aba9d0/ebcaf29a3b56c0dc?lnk=raot+-- The solution is simply to require Cabal >= 1.4 once it is included with GHC+-- and which allows to remove Paths_ForSyDe from ForSyDe.cabal
+ doc/www/files/tutorial/figures/SeqAddFour.svg view
@@ -0,0 +1,801 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="567pt"+ height="113pt"+ viewBox="0 0 567 113"+ version="1.1"+ id="svg2"+ sodipodi:version="0.32"+ inkscape:version="0.46"+ sodipodi:docname="SeqAddFour.svg"+ inkscape:output_extension="org.inkscape.output.svg.inkscape">+ <metadata+ id="metadata363">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <sodipodi:namedview+ inkscape:window-height="701"+ inkscape:window-width="640"+ inkscape:pageshadow="2"+ inkscape:pageopacity="0.0"+ guidetolerance="10.0"+ gridtolerance="10.0"+ objecttolerance="10.0"+ borderopacity="1.0"+ bordercolor="#666666"+ pagecolor="#ffffff"+ id="base"+ showgrid="false"+ inkscape:zoom="0.76613757"+ inkscape:cx="566.89321"+ inkscape:cy="70.625"+ inkscape:window-x="0"+ inkscape:window-y="22"+ inkscape:current-layer="svg2" />+ <defs+ id="defs4">+ <inkscape:perspective+ sodipodi:type="inkscape:persp3d"+ inkscape:vp_x="0 : 70.625 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_z="708.75 : 70.625 : 1"+ inkscape:persp3d-origin="354.375 : 47.083333 : 1"+ id="perspective365" />+ <g+ id="g6">+ <symbol+ overflow="visible"+ id="glyph1-0">+ <path+ style="stroke: none;"+ d="M 0.703125 2.46875 L 0.703125 -9.875 L 7.703125 -9.875 L 7.703125 2.46875 L 0.703125 2.46875 Z M 1.484375 1.703125 L 6.921875 1.703125 L 6.921875 -9.078125 L 1.484375 -9.078125 L 1.484375 1.703125 Z M 1.484375 1.703125 "+ id="path9" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-1">+ <path+ style="stroke: none;"+ d="M 2.203125 -0.234375 C 2.179688 -0.0351562 2.128906 0.101562 2.046875 0.1875 C 1.960938 0.269531 1.832031 0.3125 1.65625 0.3125 C 1.46875 0.3125 1.328125 0.253906 1.234375 0.140625 C 1.140625 0.0234375 1.082031 -0.15625 1.0625 -0.40625 L 0.984375 -1.984375 L 0.984375 -2.109375 C 0.984375 -2.328125 1.023438 -2.484375 1.109375 -2.578125 C 1.191406 -2.671875 1.332031 -2.71875 1.53125 -2.71875 C 1.800781 -2.71875 1.992188 -2.519531 2.109375 -2.125 C 2.160156 -1.925781 2.210938 -1.78125 2.265625 -1.6875 C 2.429688 -1.363281 2.6875 -1.113281 3.03125 -0.9375 C 3.375 -0.769531 3.785156 -0.6875 4.265625 -0.6875 C 4.847656 -0.6875 5.320312 -0.820312 5.6875 -1.09375 C 6.050781 -1.375 6.234375 -1.734375 6.234375 -2.171875 C 6.234375 -2.523438 6.117188 -2.8125 5.890625 -3.03125 C 5.671875 -3.25 5.347656 -3.390625 4.921875 -3.453125 L 3.90625 -3.59375 C 2.957031 -3.726562 2.265625 -3.976562 1.828125 -4.34375 C 1.398438 -4.707031 1.1875 -5.21875 1.1875 -5.875 C 1.1875 -6.570312 1.472656 -7.15625 2.046875 -7.625 C 2.628906 -8.101562 3.351562 -8.34375 4.21875 -8.34375 C 4.46875 -8.34375 4.726562 -8.3125 5 -8.25 C 5.28125 -8.1875 5.597656 -8.082031 5.953125 -7.9375 C 5.960938 -8.070312 6 -8.160156 6.0625 -8.203125 C 6.125 -8.253906 6.234375 -8.28125 6.390625 -8.28125 C 6.585938 -8.28125 6.722656 -8.25 6.796875 -8.1875 C 6.878906 -8.132812 6.929688 -7.992188 6.953125 -7.765625 L 7.046875 -6.34375 L 7.046875 -6.28125 C 7.046875 -6.113281 7 -5.984375 6.90625 -5.890625 C 6.8125 -5.804688 6.679688 -5.765625 6.515625 -5.765625 C 6.273438 -5.765625 6.09375 -5.9375 5.96875 -6.28125 C 5.894531 -6.46875 5.828125 -6.609375 5.765625 -6.703125 C 5.617188 -6.929688 5.40625 -7.109375 5.125 -7.234375 C 4.84375 -7.359375 4.519531 -7.421875 4.15625 -7.421875 C 3.601562 -7.421875 3.15625 -7.28125 2.8125 -7 C 2.46875 -6.726562 2.296875 -6.375 2.296875 -5.9375 C 2.296875 -5.59375 2.421875 -5.316406 2.671875 -5.109375 C 2.929688 -4.910156 3.328125 -4.773438 3.859375 -4.703125 L 4.953125 -4.5625 C 5.742188 -4.457031 6.335938 -4.210938 6.734375 -3.828125 C 7.140625 -3.453125 7.34375 -2.941406 7.34375 -2.296875 C 7.34375 -1.535156 7.054688 -0.921875 6.484375 -0.453125 C 5.921875 0.00390625 5.164062 0.234375 4.21875 0.234375 C 3.882812 0.234375 3.554688 0.191406 3.234375 0.109375 C 2.910156 0.0351562 2.566406 -0.078125 2.203125 -0.234375 Z M 2.203125 -0.234375 "+ id="path12" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-2">+ <path+ style="stroke: none;"+ d="M 3.5625 -8.28125 C 3.5625 -8.78125 3.601562 -9.09375 3.6875 -9.21875 C 3.78125 -9.34375 3.972656 -9.40625 4.265625 -9.40625 C 4.554688 -9.40625 4.742188 -9.347656 4.828125 -9.234375 C 4.921875 -9.128906 4.96875 -8.878906 4.96875 -8.484375 C 4.96875 -8.085938 4.925781 -7.84375 4.84375 -7.75 C 4.757812 -7.65625 4.566406 -7.609375 4.265625 -7.609375 C 3.972656 -7.609375 3.78125 -7.648438 3.6875 -7.734375 C 3.601562 -7.828125 3.5625 -8.007812 3.5625 -8.28125 Z M 4.828125 -0.96875 L 7.03125 -0.96875 C 7.207031 -0.96875 7.335938 -0.925781 7.421875 -0.84375 C 7.503906 -0.769531 7.546875 -0.65625 7.546875 -0.5 C 7.546875 -0.3125 7.503906 -0.179688 7.421875 -0.109375 C 7.347656 -0.0351562 7.203125 0 6.984375 0 L 1.6875 0 C 1.5 0 1.359375 -0.0390625 1.265625 -0.125 C 1.179688 -0.207031 1.140625 -0.332031 1.140625 -0.5 C 1.140625 -0.65625 1.1875 -0.769531 1.28125 -0.84375 C 1.375 -0.925781 1.515625 -0.96875 1.703125 -0.96875 L 3.796875 -0.96875 L 3.796875 -5.34375 L 2.46875 -5.34375 C 2.28125 -5.34375 2.132812 -5.382812 2.03125 -5.46875 C 1.9375 -5.550781 1.890625 -5.675781 1.890625 -5.84375 C 1.890625 -6 1.929688 -6.113281 2.015625 -6.1875 C 2.109375 -6.269531 2.25 -6.3125 2.4375 -6.3125 L 4.4375 -6.3125 C 4.5625 -6.3125 4.65625 -6.285156 4.71875 -6.234375 C 4.789062 -6.191406 4.828125 -6.125 4.828125 -6.03125 L 4.828125 -0.96875 Z M 4.828125 -0.96875 "+ id="path15" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-3">+ <path+ style="stroke: none;"+ d="M 4 -5.3125 C 3.40625 -5.3125 2.914062 -5.125 2.53125 -4.75 C 2.15625 -4.382812 1.96875 -3.90625 1.96875 -3.3125 C 1.96875 -2.738281 2.15625 -2.265625 2.53125 -1.890625 C 2.914062 -1.515625 3.40625 -1.328125 4 -1.328125 C 4.59375 -1.328125 5.078125 -1.515625 5.453125 -1.890625 C 5.835938 -2.265625 6.03125 -2.738281 6.03125 -3.3125 C 6.03125 -3.894531 5.835938 -4.375 5.453125 -4.75 C 5.078125 -5.125 4.59375 -5.3125 4 -5.3125 Z M 6.96875 -0.359375 C 6.96875 0.273438 6.9375 0.722656 6.875 0.984375 C 6.8125 1.253906 6.703125 1.492188 6.546875 1.703125 C 6.296875 2.035156 5.9375 2.289062 5.46875 2.46875 C 5.007812 2.644531 4.46875 2.734375 3.84375 2.734375 C 3.320312 2.734375 2.941406 2.679688 2.703125 2.578125 C 2.472656 2.472656 2.359375 2.3125 2.359375 2.09375 C 2.359375 1.957031 2.414062 1.832031 2.53125 1.71875 C 2.644531 1.613281 2.78125 1.5625 2.9375 1.5625 C 3.0625 1.5625 3.25 1.578125 3.5 1.609375 C 3.757812 1.648438 3.957031 1.671875 4.09375 1.671875 C 4.757812 1.671875 5.234375 1.515625 5.515625 1.203125 C 5.804688 0.890625 5.953125 0.359375 5.953125 -0.390625 L 5.953125 -1.21875 C 5.671875 -0.894531 5.359375 -0.65625 5.015625 -0.5 C 4.679688 -0.351562 4.296875 -0.28125 3.859375 -0.28125 C 3.003906 -0.28125 2.296875 -0.5625 1.734375 -1.125 C 1.179688 -1.695312 0.90625 -2.414062 0.90625 -3.28125 C 0.90625 -4.15625 1.191406 -4.878906 1.765625 -5.453125 C 2.335938 -6.035156 3.050781 -6.328125 3.90625 -6.328125 C 4.257812 -6.328125 4.601562 -6.257812 4.9375 -6.125 C 5.269531 -6 5.609375 -5.804688 5.953125 -5.546875 L 5.953125 -6.03125 C 5.953125 -6.132812 5.976562 -6.207031 6.03125 -6.25 C 6.09375 -6.289062 6.191406 -6.3125 6.328125 -6.3125 L 7.359375 -6.3125 C 7.546875 -6.3125 7.679688 -6.269531 7.765625 -6.1875 C 7.859375 -6.113281 7.90625 -6 7.90625 -5.84375 C 7.90625 -5.65625 7.847656 -5.523438 7.734375 -5.453125 C 7.617188 -5.378906 7.40625 -5.34375 7.09375 -5.34375 L 6.96875 -5.34375 L 6.96875 -0.359375 Z M 6.96875 -0.359375 "+ id="path18" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-4">+ <path+ style="stroke: none;"+ d="M 1.65625 -0.96875 L 1.65625 -5.34375 L 1.53125 -5.34375 C 1.21875 -5.34375 1.003906 -5.378906 0.890625 -5.453125 C 0.773438 -5.523438 0.71875 -5.65625 0.71875 -5.84375 C 0.71875 -6.007812 0.765625 -6.128906 0.859375 -6.203125 C 0.953125 -6.273438 1.101562 -6.3125 1.3125 -6.3125 L 1.640625 -6.3125 L 2.296875 -6.3125 C 2.421875 -6.3125 2.515625 -6.285156 2.578125 -6.234375 C 2.648438 -6.191406 2.6875 -6.125 2.6875 -6.03125 L 2.6875 -5.578125 C 3.019531 -5.878906 3.347656 -6.101562 3.671875 -6.25 C 3.992188 -6.40625 4.332031 -6.484375 4.6875 -6.484375 C 5.375 -6.484375 5.914062 -6.269531 6.3125 -5.84375 C 6.707031 -5.414062 6.90625 -4.820312 6.90625 -4.0625 L 6.90625 -0.96875 L 7.21875 -0.96875 C 7.445312 -0.96875 7.613281 -0.925781 7.71875 -0.84375 C 7.820312 -0.769531 7.875 -0.65625 7.875 -0.5 C 7.875 -0.3125 7.816406 -0.179688 7.703125 -0.109375 C 7.597656 -0.0351562 7.410156 0 7.140625 0 L 5.625 0 C 5.332031 0 5.144531 -0.03125 5.0625 -0.09375 C 4.976562 -0.164062 4.9375 -0.300781 4.9375 -0.5 C 4.9375 -0.675781 4.984375 -0.796875 5.078125 -0.859375 C 5.179688 -0.929688 5.363281 -0.96875 5.625 -0.96875 L 5.859375 -0.96875 L 5.859375 -3.8125 C 5.859375 -4.34375 5.738281 -4.75 5.5 -5.03125 C 5.257812 -5.3125 4.910156 -5.453125 4.453125 -5.453125 C 3.984375 -5.453125 3.570312 -5.289062 3.21875 -4.96875 C 2.863281 -4.65625 2.6875 -4.269531 2.6875 -3.8125 L 2.6875 -0.96875 L 2.921875 -0.96875 C 3.203125 -0.96875 3.390625 -0.929688 3.484375 -0.859375 C 3.578125 -0.796875 3.625 -0.675781 3.625 -0.5 C 3.625 -0.300781 3.582031 -0.164062 3.5 -0.09375 C 3.414062 -0.03125 3.21875 0 2.90625 0 L 1.65625 0 L 1.28125 0 C 1.09375 0 0.953125 -0.0351562 0.859375 -0.109375 C 0.765625 -0.191406 0.71875 -0.320312 0.71875 -0.5 C 0.71875 -0.675781 0.769531 -0.796875 0.875 -0.859375 C 0.988281 -0.929688 1.203125 -0.96875 1.515625 -0.96875 L 1.65625 -0.96875 Z M 1.65625 -0.96875 "+ id="path21" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-5">+ <path+ style="stroke: none;"+ d="M 5.71875 -3.015625 C 5.46875 -3.097656 5.222656 -3.160156 4.984375 -3.203125 C 4.753906 -3.242188 4.519531 -3.265625 4.28125 -3.265625 C 3.582031 -3.265625 3.03125 -3.144531 2.625 -2.90625 C 2.21875 -2.664062 2.015625 -2.347656 2.015625 -1.953125 C 2.015625 -1.640625 2.140625 -1.378906 2.390625 -1.171875 C 2.648438 -0.972656 2.972656 -0.875 3.359375 -0.875 C 3.941406 -0.875 4.476562 -1.023438 4.96875 -1.328125 C 5.46875 -1.640625 5.71875 -1.957031 5.71875 -2.28125 L 5.71875 -3.015625 Z M 5.765625 -0.875 C 5.390625 -0.53125 4.984375 -0.269531 4.546875 -0.09375 C 4.109375 0.0820312 3.65625 0.171875 3.1875 0.171875 C 2.507812 0.171875 1.960938 -0.015625 1.546875 -0.390625 C 1.128906 -0.773438 0.921875 -1.269531 0.921875 -1.875 C 0.921875 -2.59375 1.195312 -3.148438 1.75 -3.546875 C 2.300781 -3.941406 3.082031 -4.140625 4.09375 -4.140625 C 4.351562 -4.140625 4.617188 -4.125 4.890625 -4.09375 C 5.160156 -4.0625 5.4375 -4.007812 5.71875 -3.9375 L 5.71875 -3.984375 C 5.71875 -4.503906 5.59375 -4.890625 5.34375 -5.140625 C 5.09375 -5.390625 4.703125 -5.515625 4.171875 -5.515625 C 3.816406 -5.515625 3.421875 -5.414062 2.984375 -5.21875 C 2.546875 -5.03125 2.253906 -4.9375 2.109375 -4.9375 C 1.984375 -4.9375 1.875 -4.988281 1.78125 -5.09375 C 1.695312 -5.207031 1.65625 -5.347656 1.65625 -5.515625 C 1.65625 -5.785156 1.90625 -6.015625 2.40625 -6.203125 C 2.914062 -6.390625 3.5625 -6.484375 4.34375 -6.484375 C 5.144531 -6.484375 5.75 -6.273438 6.15625 -5.859375 C 6.570312 -5.453125 6.78125 -4.851562 6.78125 -4.0625 L 6.78125 -0.96875 L 7.109375 -0.96875 C 7.429688 -0.96875 7.644531 -0.929688 7.75 -0.859375 C 7.863281 -0.796875 7.921875 -0.675781 7.921875 -0.5 C 7.921875 -0.332031 7.875 -0.207031 7.78125 -0.125 C 7.695312 -0.0390625 7.5625 0 7.375 0 L 6.296875 0 C 6.171875 0 6.066406 -0.0351562 5.984375 -0.109375 C 5.898438 -0.191406 5.847656 -0.304688 5.828125 -0.453125 L 5.765625 -0.875 Z M 5.765625 -0.875 "+ id="path24" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-6">+ <path+ style="stroke: none;"+ d="M 3.734375 -7.96875 L 2.578125 -7.96875 C 2.140625 -7.96875 1.863281 -8 1.75 -8.0625 C 1.632812 -8.132812 1.578125 -8.265625 1.578125 -8.453125 C 1.578125 -8.617188 1.625 -8.742188 1.71875 -8.828125 C 1.8125 -8.910156 1.945312 -8.953125 2.125 -8.953125 L 4.375 -8.953125 C 4.5 -8.953125 4.59375 -8.925781 4.65625 -8.875 C 4.726562 -8.820312 4.765625 -8.753906 4.765625 -8.671875 L 4.765625 -0.96875 L 6.921875 -0.96875 C 7.085938 -0.96875 7.210938 -0.925781 7.296875 -0.84375 C 7.378906 -0.769531 7.421875 -0.65625 7.421875 -0.5 C 7.421875 -0.3125 7.378906 -0.179688 7.296875 -0.109375 C 7.222656 -0.0351562 7.078125 0 6.859375 0 L 1.8125 0 C 1.632812 0 1.5 -0.0390625 1.40625 -0.125 C 1.3125 -0.207031 1.265625 -0.332031 1.265625 -0.5 C 1.265625 -0.65625 1.3125 -0.769531 1.40625 -0.84375 C 1.507812 -0.925781 1.65625 -0.96875 1.84375 -0.96875 L 3.734375 -0.96875 L 3.734375 -7.96875 Z M 3.734375 -7.96875 "+ id="path27" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-7">+ <path+ style="stroke: none;"+ d=""+ id="path30" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-8">+ <path+ style="stroke: none;"+ d="M 6.28125 -0.96875 C 6.625 -0.96875 6.84375 -0.929688 6.9375 -0.859375 C 7.039062 -0.796875 7.09375 -0.675781 7.09375 -0.5 C 7.09375 -0.3125 7.039062 -0.179688 6.9375 -0.109375 C 6.84375 -0.0351562 6.625 0 6.28125 0 L 2.125 0 L 1.8125 0 C 1.644531 0 1.515625 -0.0390625 1.421875 -0.125 C 1.335938 -0.207031 1.296875 -0.332031 1.296875 -0.5 C 1.296875 -0.675781 1.34375 -0.796875 1.4375 -0.859375 C 1.539062 -0.929688 1.769531 -0.96875 2.125 -0.96875 L 3.671875 -0.96875 L 3.671875 -7.125 L 2.125 -7.125 C 1.78125 -7.125 1.554688 -7.15625 1.453125 -7.21875 C 1.347656 -7.289062 1.296875 -7.421875 1.296875 -7.609375 C 1.296875 -7.785156 1.335938 -7.910156 1.421875 -7.984375 C 1.515625 -8.066406 1.644531 -8.109375 1.8125 -8.109375 L 2.125 -8.109375 L 6.28125 -8.109375 L 6.59375 -8.109375 C 6.757812 -8.109375 6.882812 -8.066406 6.96875 -7.984375 C 7.050781 -7.898438 7.09375 -7.773438 7.09375 -7.609375 C 7.09375 -7.421875 7.039062 -7.289062 6.9375 -7.21875 C 6.832031 -7.15625 6.613281 -7.125 6.28125 -7.125 L 4.734375 -7.125 L 4.734375 -0.96875 L 6.28125 -0.96875 Z M 6.28125 -0.96875 "+ id="path33" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-9">+ <path+ style="stroke: none;"+ d="M 6.0625 -5.9375 C 6.289062 -5.9375 6.453125 -5.894531 6.546875 -5.8125 C 6.648438 -5.738281 6.703125 -5.617188 6.703125 -5.453125 C 6.703125 -5.285156 6.65625 -5.160156 6.5625 -5.078125 C 6.46875 -5.003906 6.320312 -4.96875 6.125 -4.96875 L 3.359375 -4.96875 L 3.359375 -2.6875 C 3.359375 -1.9375 3.453125 -1.441406 3.640625 -1.203125 C 3.835938 -0.972656 4.175781 -0.859375 4.65625 -0.859375 C 5.0625 -0.859375 5.550781 -0.976562 6.125 -1.21875 C 6.707031 -1.457031 7.070312 -1.578125 7.21875 -1.578125 C 7.34375 -1.578125 7.445312 -1.53125 7.53125 -1.4375 C 7.625 -1.351562 7.671875 -1.242188 7.671875 -1.109375 C 7.671875 -0.953125 7.613281 -0.816406 7.5 -0.703125 C 7.382812 -0.597656 7.195312 -0.492188 6.9375 -0.390625 C 6.488281 -0.210938 6.082031 -0.0820312 5.71875 0 C 5.363281 0.0820312 5.03125 0.125 4.71875 0.125 C 4.1875 0.125 3.738281 0.0390625 3.375 -0.125 C 3.007812 -0.300781 2.738281 -0.554688 2.5625 -0.890625 C 2.46875 -1.054688 2.398438 -1.25 2.359375 -1.46875 C 2.328125 -1.6875 2.3125 -2.019531 2.3125 -2.46875 L 2.3125 -2.6875 L 2.3125 -4.96875 L 1.15625 -4.96875 C 0.957031 -4.96875 0.816406 -5.003906 0.734375 -5.078125 C 0.648438 -5.160156 0.609375 -5.285156 0.609375 -5.453125 C 0.609375 -5.640625 0.664062 -5.765625 0.78125 -5.828125 C 0.894531 -5.898438 1.144531 -5.9375 1.53125 -5.9375 L 2.3125 -5.9375 L 2.3125 -7.328125 L 2.3125 -7.703125 C 2.3125 -7.890625 2.351562 -8.03125 2.4375 -8.125 C 2.519531 -8.21875 2.648438 -8.265625 2.828125 -8.265625 C 3.023438 -8.265625 3.160156 -8.207031 3.234375 -8.09375 C 3.316406 -7.988281 3.359375 -7.734375 3.359375 -7.328125 L 3.359375 -5.9375 L 6.0625 -5.9375 Z M 6.0625 -5.9375 "+ id="path36" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-10">+ <path+ style="stroke: none;"+ d="M 2.859375 -4.90625 C 2.859375 -5.257812 2.984375 -5.550781 3.234375 -5.78125 C 3.484375 -6.007812 3.804688 -6.125 4.203125 -6.125 C 4.609375 -6.125 4.929688 -6.007812 5.171875 -5.78125 C 5.421875 -5.5625 5.546875 -5.269531 5.546875 -4.90625 C 5.546875 -4.539062 5.421875 -4.242188 5.171875 -4.015625 C 4.921875 -3.796875 4.597656 -3.6875 4.203125 -3.6875 C 3.796875 -3.6875 3.46875 -3.796875 3.21875 -4.015625 C 2.976562 -4.242188 2.859375 -4.539062 2.859375 -4.90625 Z M 2.859375 -1.125 C 2.859375 -1.476562 2.984375 -1.769531 3.234375 -2 C 3.484375 -2.226562 3.804688 -2.34375 4.203125 -2.34375 C 4.609375 -2.34375 4.929688 -2.226562 5.171875 -2 C 5.421875 -1.78125 5.546875 -1.488281 5.546875 -1.125 C 5.546875 -0.757812 5.421875 -0.460938 5.171875 -0.234375 C 4.921875 -0.015625 4.597656 0.09375 4.203125 0.09375 C 3.796875 0.09375 3.46875 -0.015625 3.21875 -0.234375 C 2.976562 -0.460938 2.859375 -0.757812 2.859375 -1.125 Z M 2.859375 -1.125 "+ id="path39" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-0">+ <path+ style="stroke: none;"+ d="M 0.578125 0 L 0.578125 -12.90625 L 10.828125 -12.90625 L 10.828125 0 L 0.578125 0 Z M 9.21875 -1.625 L 9.21875 -11.296875 L 2.203125 -11.296875 L 2.203125 -1.625 L 9.21875 -1.625 Z M 9.21875 -1.625 "+ id="path42" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-1">+ <path+ style="stroke: none;"+ d="M 8 -5.296875 L 6.03125 -11 L 3.953125 -5.296875 L 8 -5.296875 Z M 5.125 -12.90625 L 7.109375 -12.90625 L 11.78125 0 L 9.875 0 L 8.5625 -3.875 L 3.453125 -3.875 L 2.0625 0 L 0.265625 0 L 5.125 -12.90625 Z M 6.03125 -12.90625 L 6.03125 -12.90625 Z M 6.03125 -12.90625 "+ id="path45" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-2">+ <path+ style="stroke: none;"+ d="M 2.15625 -4.59375 C 2.15625 -3.582031 2.367188 -2.738281 2.796875 -2.0625 C 3.234375 -1.382812 3.921875 -1.046875 4.859375 -1.046875 C 5.585938 -1.046875 6.1875 -1.359375 6.65625 -1.984375 C 7.132812 -2.617188 7.375 -3.523438 7.375 -4.703125 C 7.375 -5.890625 7.128906 -6.769531 6.640625 -7.34375 C 6.160156 -7.914062 5.5625 -8.203125 4.84375 -8.203125 C 4.039062 -8.203125 3.390625 -7.894531 2.890625 -7.28125 C 2.398438 -6.675781 2.15625 -5.78125 2.15625 -4.59375 Z M 4.546875 -9.578125 C 5.265625 -9.578125 5.867188 -9.425781 6.359375 -9.125 C 6.640625 -8.945312 6.957031 -8.640625 7.3125 -8.203125 L 7.3125 -12.953125 L 8.828125 -12.953125 L 8.828125 0 L 7.40625 0 L 7.40625 -1.3125 C 7.039062 -0.726562 6.601562 -0.304688 6.09375 -0.046875 C 5.59375 0.203125 5.019531 0.328125 4.375 0.328125 C 3.320312 0.328125 2.410156 -0.109375 1.640625 -0.984375 C 0.878906 -1.867188 0.5 -3.046875 0.5 -4.515625 C 0.5 -5.878906 0.847656 -7.0625 1.546875 -8.0625 C 2.242188 -9.070312 3.242188 -9.578125 4.546875 -9.578125 Z M 4.546875 -9.578125 "+ id="path48" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-3">+ <path+ style="stroke: none;"+ d="M 1.53125 -12.90625 L 10.5 -12.90625 L 10.5 -11.328125 L 3.28125 -11.328125 L 3.28125 -7.40625 L 9.625 -7.40625 L 9.625 -5.875 L 3.28125 -5.875 L 3.28125 0 L 1.53125 0 L 1.53125 -12.90625 Z M 1.53125 -12.90625 "+ id="path51" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-4">+ <path+ style="stroke: none;"+ d="M 4.890625 -1.015625 C 5.941406 -1.015625 6.660156 -1.410156 7.046875 -2.203125 C 7.441406 -3.003906 7.640625 -3.890625 7.640625 -4.859375 C 7.640625 -5.734375 7.5 -6.445312 7.21875 -7 C 6.769531 -7.875 6 -8.3125 4.90625 -8.3125 C 3.945312 -8.3125 3.242188 -7.941406 2.796875 -7.203125 C 2.359375 -6.460938 2.140625 -5.570312 2.140625 -4.53125 C 2.140625 -3.53125 2.359375 -2.691406 2.796875 -2.015625 C 3.242188 -1.347656 3.941406 -1.015625 4.890625 -1.015625 Z M 4.953125 -9.6875 C 6.171875 -9.6875 7.195312 -9.28125 8.03125 -8.46875 C 8.875 -7.664062 9.296875 -6.476562 9.296875 -4.90625 C 9.296875 -3.382812 8.925781 -2.128906 8.1875 -1.140625 C 7.445312 -0.148438 6.300781 0.34375 4.75 0.34375 C 3.445312 0.34375 2.414062 -0.09375 1.65625 -0.96875 C 0.894531 -1.84375 0.515625 -3.019531 0.515625 -4.5 C 0.515625 -6.082031 0.914062 -7.34375 1.71875 -8.28125 C 2.519531 -9.21875 3.597656 -9.6875 4.953125 -9.6875 Z M 4.90625 -9.640625 L 4.90625 -9.640625 Z M 4.90625 -9.640625 "+ id="path54" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-5">+ <path+ style="stroke: none;"+ d="M 2.75 -9.40625 L 2.75 -3.171875 C 2.75 -2.679688 2.820312 -2.285156 2.96875 -1.984375 C 3.25 -1.421875 3.773438 -1.140625 4.546875 -1.140625 C 5.648438 -1.140625 6.398438 -1.632812 6.796875 -2.625 C 7.015625 -3.144531 7.125 -3.867188 7.125 -4.796875 L 7.125 -9.40625 L 8.703125 -9.40625 L 8.703125 0 L 7.203125 0 L 7.21875 -1.390625 C 7.019531 -1.035156 6.765625 -0.734375 6.453125 -0.484375 C 5.859375 0.00390625 5.128906 0.25 4.265625 0.25 C 2.921875 0.25 2.003906 -0.195312 1.515625 -1.09375 C 1.253906 -1.570312 1.125 -2.210938 1.125 -3.015625 L 1.125 -9.40625 L 2.75 -9.40625 Z M 4.90625 -9.640625 L 4.90625 -9.640625 Z M 4.90625 -9.640625 "+ id="path57" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-6">+ <path+ style="stroke: none;"+ d="M 1.203125 -9.40625 L 2.703125 -9.40625 L 2.703125 -7.78125 C 2.828125 -8.101562 3.128906 -8.488281 3.609375 -8.9375 C 4.085938 -9.394531 4.644531 -9.625 5.28125 -9.625 C 5.300781 -9.625 5.347656 -9.617188 5.421875 -9.609375 C 5.492188 -9.609375 5.613281 -9.597656 5.78125 -9.578125 L 5.78125 -7.90625 C 5.6875 -7.925781 5.597656 -7.9375 5.515625 -7.9375 C 5.441406 -7.945312 5.359375 -7.953125 5.265625 -7.953125 C 4.460938 -7.953125 3.847656 -7.695312 3.421875 -7.1875 C 2.992188 -6.675781 2.78125 -6.085938 2.78125 -5.421875 L 2.78125 0 L 1.203125 0 L 1.203125 -9.40625 Z M 1.203125 -9.40625 "+ id="path60" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-0">+ <path+ style="stroke: none;"+ d="M 2.25 0 L 2.25 -11.25 L 11.25 -11.25 L 11.25 0 L 2.25 0 Z M 2.53125 -0.28125 L 10.96875 -0.28125 L 10.96875 -10.96875 L 2.53125 -10.96875 L 2.53125 -0.28125 Z M 2.53125 -0.28125 "+ id="path63" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-1">+ <path+ style="stroke: none;"+ d="M 2.859375 -11.078125 L 3.234375 -12.890625 L 4.8125 -12.890625 L 4.4375 -11.078125 L 2.859375 -11.078125 Z M 0.53125 0 L 2.484375 -9.328125 L 4.078125 -9.328125 L 2.125 0 L 0.53125 0 Z M 0.53125 0 "+ id="path66" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-2">+ <path+ style="stroke: none;"+ d="M 0.59375 0 L 2.546875 -9.328125 L 3.984375 -9.328125 L 3.640625 -7.703125 C 4.273438 -8.347656 4.863281 -8.816406 5.40625 -9.109375 C 5.945312 -9.398438 6.503906 -9.546875 7.078125 -9.546875 C 7.828125 -9.546875 8.414062 -9.335938 8.84375 -8.921875 C 9.28125 -8.515625 9.5 -7.96875 9.5 -7.28125 C 9.5 -6.9375 9.421875 -6.394531 9.265625 -5.65625 L 8.09375 0 L 6.5 0 L 7.734375 -5.921875 C 7.859375 -6.492188 7.921875 -6.914062 7.921875 -7.1875 C 7.921875 -7.5 7.8125 -7.75 7.59375 -7.9375 C 7.382812 -8.132812 7.078125 -8.234375 6.671875 -8.234375 C 5.859375 -8.234375 5.132812 -7.941406 4.5 -7.359375 C 3.863281 -6.773438 3.394531 -5.769531 3.09375 -4.34375 L 2.1875 0 L 0.59375 0 Z M 0.59375 0 "+ id="path69" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-3">+ <path+ style="stroke: none;"+ d="M 4.328125 0 L 6.375 -9.734375 C 5.488281 -9.035156 4.25 -8.476562 2.65625 -8.0625 L 2.96875 -9.515625 C 3.757812 -9.828125 4.535156 -10.238281 5.296875 -10.75 C 6.066406 -11.257812 6.648438 -11.703125 7.046875 -12.078125 C 7.273438 -12.316406 7.492188 -12.601562 7.703125 -12.9375 L 8.625 -12.9375 L 5.9375 0 L 4.328125 0 Z M 4.328125 0 "+ id="path72" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-4">+ <path+ style="stroke: none;"+ d=""+ id="path75" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-5">+ <path+ style="stroke: none;"+ d="M 0.875 -3.546875 C 0.875 -5.367188 1.410156 -6.875 2.484375 -8.0625 C 3.367188 -9.050781 4.53125 -9.546875 5.96875 -9.546875 C 7.09375 -9.546875 8 -9.191406 8.6875 -8.484375 C 9.375 -7.785156 9.71875 -6.835938 9.71875 -5.640625 C 9.71875 -4.566406 9.5 -3.566406 9.0625 -2.640625 C 8.632812 -1.722656 8.019531 -1.015625 7.21875 -0.515625 C 6.414062 -0.0234375 5.570312 0.21875 4.6875 0.21875 C 3.96875 0.21875 3.304688 0.0625 2.703125 -0.25 C 2.109375 -0.5625 1.65625 -1 1.34375 -1.5625 C 1.03125 -2.132812 0.875 -2.796875 0.875 -3.546875 Z M 2.46875 -3.703125 C 2.46875 -2.816406 2.675781 -2.144531 3.09375 -1.6875 C 3.519531 -1.238281 4.0625 -1.015625 4.71875 -1.015625 C 5.050781 -1.015625 5.382812 -1.082031 5.71875 -1.21875 C 6.050781 -1.363281 6.359375 -1.578125 6.640625 -1.859375 C 6.929688 -2.140625 7.175781 -2.457031 7.375 -2.8125 C 7.582031 -3.175781 7.75 -3.566406 7.875 -3.984375 C 8.050781 -4.566406 8.140625 -5.125 8.140625 -5.65625 C 8.140625 -6.5 7.925781 -7.148438 7.5 -7.609375 C 7.082031 -8.078125 6.550781 -8.3125 5.90625 -8.3125 C 5.40625 -8.3125 4.945312 -8.191406 4.53125 -7.953125 C 4.125 -7.722656 3.753906 -7.378906 3.421875 -6.921875 C 3.097656 -6.460938 2.859375 -5.925781 2.703125 -5.3125 C 2.546875 -4.707031 2.46875 -4.171875 2.46875 -3.703125 Z M 2.46875 -3.703125 "+ id="path78" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-6">+ <path+ style="stroke: none;"+ d="M 6.96875 -1.6875 C 5.851562 -0.414062 4.707031 0.21875 3.53125 0.21875 C 2.8125 0.21875 2.226562 0.0078125 1.78125 -0.40625 C 1.34375 -0.820312 1.125 -1.328125 1.125 -1.921875 C 1.125 -2.316406 1.222656 -2.992188 1.421875 -3.953125 L 2.546875 -9.328125 L 4.140625 -9.328125 L 2.890625 -3.359375 C 2.785156 -2.867188 2.734375 -2.484375 2.734375 -2.203125 C 2.734375 -1.847656 2.835938 -1.570312 3.046875 -1.375 C 3.265625 -1.1875 3.582031 -1.09375 4 -1.09375 C 4.445312 -1.09375 4.878906 -1.195312 5.296875 -1.40625 C 5.722656 -1.625 6.085938 -1.914062 6.390625 -2.28125 C 6.703125 -2.65625 6.957031 -3.097656 7.15625 -3.609375 C 7.28125 -3.929688 7.429688 -4.492188 7.609375 -5.296875 L 8.453125 -9.328125 L 10.03125 -9.328125 L 8.09375 0 L 6.625 0 L 6.96875 -1.6875 Z M 6.96875 -1.6875 "+ id="path81" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-7">+ <path+ style="stroke: none;"+ d="M 4.3125 -1.296875 L 4.046875 0.015625 C 3.671875 0.109375 3.300781 0.15625 2.9375 0.15625 C 2.3125 0.15625 1.8125 0 1.4375 -0.3125 C 1.15625 -0.539062 1.015625 -0.859375 1.015625 -1.265625 C 1.015625 -1.472656 1.085938 -1.945312 1.234375 -2.6875 L 2.375 -8.109375 L 1.109375 -8.109375 L 1.375 -9.328125 L 2.625 -9.328125 L 3.109375 -11.625 L 4.9375 -12.734375 L 4.21875 -9.328125 L 5.78125 -9.328125 L 5.515625 -8.109375 L 3.96875 -8.109375 L 2.890625 -2.9375 C 2.753906 -2.28125 2.6875 -1.890625 2.6875 -1.765625 C 2.6875 -1.578125 2.738281 -1.429688 2.84375 -1.328125 C 2.945312 -1.234375 3.125 -1.1875 3.375 -1.1875 C 3.726562 -1.1875 4.039062 -1.222656 4.3125 -1.296875 Z M 4.3125 -1.296875 "+ id="path84" />+ </symbol>+ </g>+ <mask+ id="mask0">+ <image+ width="386"+ height="113"+ transform="matrix(1.002591,0,0,1,91.5,0.5)"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYIAAABxCAAAAAD94PtWAAAAAmJLR0QA/4ePzL8AAAAHdElNRQfYCRETNxxNaoc7AAADnUlEQVR4nO3dy24bORBG4bqQlGTn/d80UTfJqpoFW3YSJLvh1CD5v4Vg2F40eFA0zU0TAfzt+Oev+Te/CP+W+PhYXivOTMzESLBfEAVFUFwZ1oozk7AwCzES7BZBHuHhV4RCRMTMIqKiLGsUYJugCA9zc/a1H10JRFWrqoow5mCriHA3s2FG/pGASbSUWpsWVUGCrSLcbFqXwUTGcSUQ0dJu7VZrVREk2CncbYyhyhQRHq+NSLTe7o/7rbWiItlP+Udzt9n7WYTC3YleU6C1tseXt8e9tYIEW7nP3o9nITdfDV5T0G73ty/vj3urio1op7DRj6Y0p82155d1JFVtt8f7l/dHa4op2Mmt96ZkZz9VmDnWRsSipdzuj/f3t3stSLCTz3EIWb89y3X6vDYi0Vrb/f72dm8VCXby0YWsPz8Pn2X9QFRLbbfb/dGqZj7hH8+KkvVWi752/M8LCi2ltXZrBQl2MmEbrZTPi4g1BauBaqmlYAq2EvJafrgKWiciXhd1IqKK/812cnJdK30te9AvlhsFNsJ6/x8hQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQTokSIcE6ZAgHRKkQ4J0SJAOCdIhQbpfJPD//in+Hr9Y3EIUi7u7u5mgwU5mtlb6WvbXy3Yjwt3M5qgosJfNOaaZuUcEEV0JVoE5e68ajvcd72Sj997n/GxwvXjdzeboZ1Oyib/QO/nox3n2Mc2u7WZNgbuN0Y+m5KMgwU4+x/HtOPoY5v4xBRFuc55HU/LeFAl2cuv9+fV5nHOaR9DrRORm/XwqWW9VOfsp/2hhox/Pr8+zm/nniSjcupZC1p+tCKZgJ/fZ+/H8dpzdvtuI3Iao0DxbK4oEW7nb7P08nn2M1eA1BYPJ51mrimAj2mkdfcbZz/HDFLAxhZkWVWEk2CnCzab1MeZ1JCpEFOxE4T5VRRgJtnpdRAwzc/rciMgp3EVZmAkJdgqK8DA393UmvdabmYSFWQgzsF0EeYSH0/cJiJhpDQAS7BZrFK4AP644//wN2CE+PgBg+Qe+zMOS3LjseQAAAABJRU5ErkJggg=="+ id="image87" />+ </mask>+ <mask+ id="mask1">+ <image+ width="90"+ height="68"+ transform="matrix(1.011111,0,0,1,106.5,29.7336)"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAAAAAAkH301AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfYCRETNxxNaoc7AAACTklEQVRYhe2Y3W6kMAyF/ZcAM33/N+1CnNjei0CHVl2tlJlKuxK+QEjAx8E4iHMA/sfCr/v4hxP/WvGx+YJGBETA59ABERAHHg8wISES4Dg6wCM8/IBLJyMRMTFSlz6iOcLD3Bx978uOJmZOzEyEY7ojwt3Mqhn4A41ALJJSZmGmUbSbNVOqCGAYB5qIJU95Sikx0Rja3WqtzAgR4QcakDhN8zJPOQsTjaDdrakWIQh3B/hQzSnl5e22zDnLKLqpbquAm+/sQ3We5tvbfZlz4rGGWNUtM7RmbW+p9NFjztNyf7svOfOYalPNDFa0MCFi7A1BYpFpXu7325xkDN3qRmA6rXIM2d4Q4pTyPN9uc05j6KoEputpxqQfIWZJeZrmJSceQZswmOYk/NHQx0JnkZzzlGUMTWg1i5zWc1fd2cySRMZUE3iSz1+KPiHYP1BExDy0ZhycO2CnBcA3mJHX+N01Q+MwfrsLfaEv9IW+0Bf6Ql/oC/1voH0A8901AhC93N3dzWiIbWYdsNPg+HU/HHaraYwM1lptZuYeR2ohD3JrqonDxwxHVVVt7cTebZKbtaolM1gbdWBbKVqb2fHUXbW71e5WvY77xl/bprWa+0N1hFtrZcsMrk+43fV93Upr5nHkIRHhZlrW7vye8Ojr+1rUzE8TEm7KImC6Ppks/NqK2rkhbpWYoJWn85Bt1Vp39qG6IngrT6c4RUv9rBoNIcxekD3V2o4REQAIdIBwb69JzOyUmEGAQ7i/JufzffZ+Mp388Uz1tP+6JPiqL/UbHXrDNhvuT7QAAAAASUVORK5CYII="+ id="image90" />+ </mask>+ <mask+ id="mask2">+ <image+ width="90"+ height="68"+ transform="matrix(1,0,0,1,197.5,29.7336)"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAAAAAAkH301AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfYCRETNxxNaoc7AAACSUlEQVRYhe2Y3W6kMAyF/ZcAM33/N20hTmzvRaDTVq1WClNpV8IXCAn4OBgHcQ7A/1j4dR9/OPHvFe+bz2hEQAQ8iQ6IgIiPaEQgJEQCPIEO8AgP3+HSyUhETIzUpQ9pjvAwN0fvfdnRxMyJmYlwUHdEuJtZNQN/RyMQi6SUWZhpGO1mzZQqAhjGjiZiyVOeUkpMNIh2t1orM0JEeBwNIU7TvMxTzsJEQ2h3a6pFCMLdAQ7VnFJeXm7LnLMMo5vqtgq4eWcfqvM0317uy5wTDzbEqm6ZoTVrvafSR485T8v95b7kzIOqTTUzWNHChIjRG4LEItO83O+3OckgutWNwHRaZZ+yvSHEKeV5vt3mnAbRVQlM18eQST9AzJLyNM1LTjyENmEwzUn46OhjobNIznnKMogmtJpFHgu6q+5sZkkig6oJPMmnT0WfEOwfKCJiHlszDs6dsOMCvsEMvcZncYbvdqEv9IW+0Bf6Ql/oC32h/xG0j3C+uUgAope7u7sZjbHNrBN23PHrfhjsVtMgGay12szMPfbUQh7k1lQThw8ajqqq2tqDvdskN2tVS2awNuzAtlK0NrP9sbtqd6vdrHo94Rvftk1rNfd31RFurZUtM7iecbvr67qV1sxjz0Miws20rN34nfHo6+ta1MwfExJuyiJgup5NFt62ovahIW6VmKCV83nItmqtnX2orgjeyvkUp2ipn1SjIYTZM7KnWts+IgIAgQ4Q7u1JiZk9EjMIcAj3J+V83mfvN9PJX89UP+w/Lwm+6kv9AdLpwzZlzGe+AAAAAElFTkSuQmCC"+ id="image93" />+ </mask>+ <mask+ id="mask3">+ <image+ width="90"+ height="68"+ transform="matrix(1.011111,0,0,1,287.5,29.7336)"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAAAAAAkH301AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfYCRETNxxNaoc7AAACTklEQVRYhe2Y3W6kMAyF/ZcAM33/N+1CnNjei0CHVl2tlJlKuxK+QEjAx8E4iHMA/sfCr/v4hxP/WvGx+YJGBETA59ABERAHHg8wISES4Dg6wCM8/IBLJyMRMTFSlz6iOcLD3Bx978uOJmZOzEyEY7ojwt3Mqhn4A41ALJJSZmGmUbSbNVOqCGAYB5qIJU95Sikx0Rja3WqtzAgR4QcakDhN8zJPOQsTjaDdrakWIQh3B/hQzSnl5e22zDnLKLqpbquAm+/sQ3We5tvbfZlz4rGGWNUtM7RmbW+p9NFjztNyf7svOfOYalPNDFa0MCFi7A1BYpFpXu7325xkDN3qRmA6rXIM2d4Q4pTyPN9uc05j6KoEputpxqQfIWZJeZrmJSceQZswmOYk/NHQx0JnkZzzlGUMTWg1i5zWc1fd2cySRMZUE3iSz1+KPiHYP1BExDy0ZhycO2CnBcA3mJHX+N01Q+MwfrsLfaEv9IW+0Bf6Ql/oC/1voH0A8901AhC93N3dzWiIbWYdsNPg+HU/HHaraYwM1lptZuYeR2ohD3JrqonDxwxHVVVt7cTebZKbtaolM1gbdWBbKVqb2fHUXbW71e5WvY77xl/bprWa+0N1hFtrZcsMrk+43fV93Upr5nHkIRHhZlrW7vye8Ojr+1rUzE8TEm7KImC6Ppks/NqK2rkhbpWYoJWn85Bt1Vp39qG6IngrT6c4RUv9rBoNIcxekD3V2o4REQAIdIBwb69JzOyUmEGAQ7i/JufzffZ+Mp388Uz1tP+6JPiqL/UbHXrDNhvuT7QAAAAASUVORK5CYII="+ id="image96" />+ </mask>+ <mask+ id="mask4">+ <image+ width="90"+ height="68"+ transform="matrix(1.011111,0,0,1,377.5,29.7336)"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAAAAAAkH301AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfYCRETNxxNaoc7AAACTklEQVRYhe2Y3W6kMAyF/ZcAM33/N+1CnNjei0CHVl2tlJlKuxK+QEjAx8E4iHMA/sfCr/v4hxP/WvGx+YJGBETA59ABERAHHg8wISES4Dg6wCM8/IBLJyMRMTFSlz6iOcLD3Bx978uOJmZOzEyEY7ojwt3Mqhn4A41ALJJSZmGmUbSbNVOqCGAYB5qIJU95Sikx0Rja3WqtzAgR4QcakDhN8zJPOQsTjaDdrakWIQh3B/hQzSnl5e22zDnLKLqpbquAm+/sQ3We5tvbfZlz4rGGWNUtM7RmbW+p9NFjztNyf7svOfOYalPNDFa0MCFi7A1BYpFpXu7325xkDN3qRmA6rXIM2d4Q4pTyPN9uc05j6KoEputpxqQfIWZJeZrmJSceQZswmOYk/NHQx0JnkZzzlGUMTWg1i5zWc1fd2cySRMZUE3iSz1+KPiHYP1BExDy0ZhycO2CnBcA3mJHX+N01Q+MwfrsLfaEv9IW+0Bf6Ql/oC/1voH0A8901AhC93N3dzWiIbWYdsNPg+HU/HHaraYwM1lptZuYeR2ohD3JrqonDxwxHVVVt7cTebZKbtaolM1gbdWBbKVqb2fHUXbW71e5WvY77xl/bprWa+0N1hFtrZcsMrk+43fV93Upr5nHkIRHhZlrW7vye8Ojr+1rUzE8TEm7KImC6Ppks/NqK2rkhbpWYoJWn85Bt1Vp39qG6IngrT6c4RUv9rBoNIcxekD3V2o4REQAIdIBwb69JzOyUmEGAQ7i/JufzffZ+Mp388Uz1tP+6JPiqL/UbHXrDNhvuT7QAAAAASUVORK5CYII="+ id="image99" />+ </mask>+ <clipPath+ id="clip1">+ <path+ d="M 124.214844 59.378906 L 178.316406 59.378906 L 178.316406 45.0625 L 124.214844 45.0625 L 124.214844 59.378906 Z M 124.214844 59.378906 "+ id="path102" />+ </clipPath>+ <clipPath+ id="clip2">+ <path+ d="M 136.78125 73.695312 L 165.550781 73.695312 L 165.550781 59.378906 L 136.78125 59.378906 L 136.78125 73.695312 Z M 136.78125 73.695312 "+ id="path105" />+ </clipPath>+ <clipPath+ id="clip3">+ <path+ d="M 214.503906 59.378906 L 268.523438 59.378906 L 268.523438 45.0625 L 214.503906 45.0625 L 214.503906 59.378906 Z M 214.503906 59.378906 "+ id="path108" />+ </clipPath>+ <clipPath+ id="clip4">+ <path+ d="M 227.074219 73.695312 L 255.566406 73.695312 L 255.566406 59.378906 L 227.074219 59.378906 L 227.074219 73.695312 Z M 227.074219 73.695312 "+ id="path111" />+ </clipPath>+ <clipPath+ id="clip5">+ <path+ d="M 304.792969 59.378906 L 358.523438 59.378906 L 358.523438 45.0625 L 304.792969 45.0625 L 304.792969 59.378906 Z M 304.792969 59.378906 "+ id="path114" />+ </clipPath>+ <clipPath+ id="clip6">+ <path+ d="M 317.363281 73.695312 L 346.328125 73.695312 L 346.328125 59.378906 L 317.363281 59.378906 L 317.363281 73.695312 Z M 317.363281 73.695312 "+ id="path117" />+ </clipPath>+ <clipPath+ id="clip7">+ <path+ d="M 394.84375 59.378906 L 448.523438 59.378906 L 448.523438 45.0625 L 394.84375 45.0625 L 394.84375 59.378906 Z M 394.84375 59.378906 "+ id="path120" />+ </clipPath>+ <clipPath+ id="clip8">+ <path+ d="M 407.414062 73.695312 L 436.375 73.695312 L 436.375 59.378906 L 407.414062 59.378906 L 407.414062 73.695312 Z M 407.414062 73.695312 "+ id="path123" />+ </clipPath>+ </defs>+ <image+ id="image128"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAIAAACOFrW+AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH2AkREzccTWqHOwAAAClJREFUeJztwTEBAAAAwqD1T20LL6AAAAAAAAAAAAAAAAAAAAAAAICnAUf8AAG9NsVZAAAAAElFTkSuQmCC"+ mask="url(#mask1)"+ transform="matrix(1.011111,0,0,1,106.5,29.7336)"+ height="68"+ width="90" />+ <image+ id="image130"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAIAAACOFrW+AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH2AkREzccTWqHOwAAAClJREFUeJztwTEBAAAAwqD1T20LL6AAAAAAAAAAAAAAAAAAAAAAAICnAUf8AAG9NsVZAAAAAElFTkSuQmCC"+ mask="url(#mask2)"+ transform="translate(197.5,29.7336)"+ height="68"+ width="90" />+ <image+ id="image132"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAIAAACOFrW+AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH2AkREzccTWqHOwAAAClJREFUeJztwTEBAAAAwqD1T20LL6AAAAAAAAAAAAAAAAAAAAAAAICnAUf8AAG9NsVZAAAAAElFTkSuQmCC"+ mask="url(#mask3)"+ transform="matrix(1.011111,0,0,1,287.5,29.7336)"+ height="68"+ width="90" />+ <image+ id="image134"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAIAAACOFrW+AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH2AkREzccTWqHOwAAAClJREFUeJztwTEBAAAAwqD1T20LL6AAAAAAAAAAAAAAAAAAAAAAAICnAUf8AAG9NsVZAAAAAElFTkSuQmCC"+ mask="url(#mask4)"+ transform="matrix(1.011111,0,0,1,377.5,29.7336)"+ height="68"+ width="90" />+ <path+ id="path136"+ d="M 102.29688,99 L 467.29687,99 L 467.29687,7 L 102.29688,7 L 102.29688,99 z"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path138"+ d="M 102.29688,7 L 467.29687,7 L 467.29687,99 L 102.29688,99 L 102.29688,7 z"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path140"+ d="M 117.66797,82.664062 L 185.86328,82.664062 L 185.86328,36.234375 L 117.66797,36.234375 L 117.66797,82.664062 z"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path142"+ d="M 117.66797,36.23437 L 185.86328,36.23437 L 185.86328,82.66406 L 117.66797,82.66406 L 117.66797,36.23437 z"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <g+ id="g144"+ clip-rule="nonzero"+ clip-path="url(#clip1)">+ <path+ id="path146"+ d="M 126.5625,52.898438 C 126.64844,52.550781 126.75,52.214844 126.83594,51.867188 C 127.05859,51.089844 127.05859,51.058594 127.26563,50.726562 C 127.76172,49.933594 128.5,49.011719 129.6875,49.011719 C 130.47656,49.011719 130.47656,49.820312 130.47656,50.058594 C 130.47656,50.488281 130.35547,50.945312 130.32031,51.089844 L 129.20703,55.214844 C 129.17187,55.308594 129.15234,55.386719 129.15234,55.4375 C 129.15234,55.609375 129.28906,55.847656 129.63281,55.847656 C 129.83984,55.847656 130.13281,55.738281 130.25391,55.4375 L 130.9375,52.898438 C 131.02344,52.550781 131.12891,52.214844 131.21484,51.867188 C 131.4375,51.089844 131.4375,51.058594 131.64453,50.726562 C 132.14062,49.933594 132.87891,49.011719 134.0625,49.011719 C 134.85547,49.011719 134.85547,49.820312 134.85547,50.058594 C 134.85547,51.042969 134.08984,52.929688 133.84375,53.5625 C 133.61719,54.101562 133.56641,54.246094 133.56641,54.578125 C 133.56641,55.277344 134.04687,55.847656 134.87109,55.847656 C 136.47266,55.847656 137.05469,53.488281 137.05469,53.410156 C 137.05469,53.25 136.91797,53.25 136.79687,53.25 C 136.57422,53.25 136.57422,53.285156 136.50391,53.519531 C 136.36719,53.945312 135.90234,55.496094 134.90234,55.496094 C 134.53906,55.496094 134.51953,55.257812 134.51953,55.035156 C 134.51953,54.636719 134.70703,54.226562 134.85547,53.847656 C 135.19922,53.003906 135.90625,51.230469 135.90625,50.308594 C 135.90625,48.976562 134.91016,48.65625 134.10156,48.65625 C 132.89844,48.65625 132.03906,49.363281 131.52734,50.070312 C 131.38672,48.960938 130.49609,48.65625 129.72266,48.65625 C 128.69141,48.65625 127.85156,49.1875 127.26563,49.929688 C 127.14453,49.140625 126.5625,48.65625 125.82422,48.65625 C 125.20313,48.65625 124.86328,49.023438 124.58594,49.503906 C 124.26172,50.140625 124.03516,51.082031 124.03516,51.113281 C 124.03516,51.273438 124.20703,51.273438 124.29297,51.273438 C 124.51563,51.273438 124.53516,51.257812 124.62109,50.90625 C 124.92969,49.792969 125.25781,49.011719 125.78906,49.011719 C 126.23438,49.011719 126.23438,49.472656 126.23438,49.648438 C 126.23438,49.898438 126.18359,50.203125 126.11328,50.457031 L 124.82422,55.214844 C 124.79297,55.308594 124.77344,55.386719 124.77344,55.4375 C 124.77344,55.609375 124.91016,55.847656 125.25391,55.847656 C 125.46094,55.847656 125.75391,55.738281 125.87109,55.4375"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path148"+ d="M 144.96094,49.722656 C 145.02734,49.5 145.02734,49.46875 145.02734,49.390625 C 145.02734,49.054688 144.73828,48.976562 144.56641,48.976562 C 144.01953,48.976562 143.89844,49.515625 143.88281,49.59375 C 143.55469,48.914062 143.00781,48.65625 142.46094,48.65625 C 140.55859,48.65625 138.53906,51.070312 138.53906,53.390625 C 138.53906,54.738281 139.32813,55.847656 140.60937,55.847656 C 141.22656,55.847656 141.98047,55.515625 142.66406,54.738281 C 142.85547,55.515625 143.48828,55.847656 144.08594,55.847656 C 144.71875,55.847656 145.07812,55.453125 145.33594,54.960938 C 145.64453,54.359375 145.85156,53.441406 145.85156,53.410156 C 145.85156,53.25 145.71094,53.25 145.59375,53.25 C 145.38672,53.25 145.37109,53.269531 145.26562,53.617188 C 145.02734,54.5 144.70312,55.496094 144.12109,55.496094 C 143.67578,55.496094 143.67578,55.066406 143.67578,54.84375 C 143.67578,54.734375 143.67578,54.480469 143.79297,54.035156 L 144.96094,49.722656 z M 142.77734,53.703125 C 142.64062,54.210938 141.57422,55.496094 140.63281,55.496094 C 139.82422,55.496094 139.6875,54.558594 139.6875,54.085938 C 139.6875,53.292969 140.21875,51.4375 140.52734,50.769531 C 140.95703,49.804688 141.74609,49.011719 142.45312,49.011719 C 143.20703,49.011719 143.63672,49.835938 143.63672,50.503906 C 143.63672,50.535156 143.62109,50.613281 143.58594,50.707031"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path150"+ d="M 146.96875,57.71875 C 146.83203,58.210938 146.69531,58.257812 146.02734,58.277344 C 145.87109,58.277344 145.66406,58.277344 145.66406,58.574219 C 145.66406,58.683594 145.75,58.761719 145.87109,58.761719 C 146.33594,58.761719 146.83203,58.714844 147.3125,58.714844 C 147.86328,58.714844 148.44531,58.761719 148.97656,58.761719 C 149.08203,58.761719 149.30469,58.761719 149.30469,58.464844 C 149.30469,58.277344 149.13281,58.277344 148.89062,58.277344 C 148.01562,58.277344 148.01562,58.179688 148.01562,58.019531 C 148.01562,57.925781 148.13672,57.511719 148.20703,57.257812 L 148.82422,54.929688 C 148.94531,55.199219 149.37109,55.847656 150.26562,55.847656 C 152.13672,55.847656 154.17969,53.5 154.17969,51.136719 C 154.17969,49.4375 153.14844,48.65625 152.11719,48.65625 C 151.27734,48.65625 150.53906,49.238281 150.04297,49.785156 C 149.83594,48.851562 149.0625,48.65625 148.63672,48.65625 C 148.01562,48.65625 147.67578,49.023438 147.39844,49.503906 C 147.07422,50.140625 146.85156,51.082031 146.85156,51.113281 C 146.85156,51.273438 147.02344,51.273438 147.10937,51.273438 C 147.33203,51.273438 147.34766,51.257812 147.43359,50.90625 C 147.74219,49.792969 148.07031,49.011719 148.60156,49.011719 C 149.04687,49.011719 149.04687,49.472656 149.04687,49.648438 C 149.04687,49.742188 149.04687,49.996094 148.92578,50.441406 L 146.96875,57.71875 z M 149.9375,50.804688 C 150.07422,50.265625 151.14062,49.011719 152.08594,49.011719 C 152.85938,49.011719 153.03125,49.914062 153.03125,50.421875 C 153.03125,51.085938 152.56641,52.976562 152.06641,53.988281 C 151.86328,54.386719 151.125,55.496094 150.24609,55.496094 C 149.25,55.496094 149.07812,54.148438 149.07812,54.019531 C 149.07812,53.972656 149.09766,53.925781 149.13281,53.800781"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path152"+ d="M 164.98438,44.890625 C 165,44.828125 165.01953,44.734375 165.01953,44.667969 C 165.01953,44.636719 165,44.511719 164.82813,44.511719 C 164.74609,44.511719 164.72656,44.527344 164.57422,44.703125 L 163.80469,45.59375 C 163.14062,44.527344 161.92578,44.511719 161.58594,44.511719 C 159.48438,44.511719 157.62109,46.460938 157.62109,48.28125 C 157.62109,49.105469 158,49.945312 158.99219,50.375 C 159.09375,50.421875 159.46875,50.515625 159.72656,50.578125 L 160.56641,50.800781 C 161.45703,51.039062 161.59375,51.085938 161.88281,51.371094 C 162.07031,51.59375 162.26172,51.941406 162.26172,52.511719 C 162.26172,53.953125 160.91797,55.539062 159.38672,55.539062 C 158.09766,55.539062 156.80859,54.96875 156.80859,53.316406 C 156.80859,52.953125 156.89453,52.523438 156.94531,52.351562 C 156.94531,52.320312 156.96094,52.285156 156.96094,52.253906 C 156.96094,52.078125 156.80859,52.078125 156.70312,52.078125 C 156.49609,52.078125 156.46484,52.113281 156.39453,52.347656 L 155.5,55.660156 C 155.46484,55.769531 155.44922,55.820312 155.44922,55.867188 C 155.44922,55.960938 155.53516,56.023438 155.63672,56.023438 C 155.75781,56.023438 155.77344,55.992188 155.91016,55.835938 C 156.10156,55.644531 156.54687,55.136719 156.71875,54.929688 C 157.35156,55.785156 158.44922,56.023438 159.34375,56.023438 C 161.50391,56.023438 163.41016,53.902344 163.41016,51.90625 C 163.41016,51.445312 163.28906,50.796875 162.84375,50.289062 C 162.41797,49.796875 162.21094,49.75 160.58594,49.308594 C 160.26172,49.226562 159.73047,49.085938 159.64453,49.054688 C 159.0625,48.816406 158.76953,48.308594 158.76953,47.660156 C 158.76953,46.359375 160.08984,44.949219 161.54687,44.949219 C 163.15625,44.949219 163.63281,46.03125 163.63281,47.203125 C 163.63281,47.617188 163.61719,47.726562 163.54687,48.074219 L 163.53125,48.296875 C 163.53125,48.457031 163.70312,48.457031 163.78906,48.457031 C 163.97656,48.457031 164.02734,48.441406 164.09375,48.171875"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path154"+ d="M 176.20312,46.648438 C 177.01172,45.746094 177.66406,45.414062 178.48438,45.347656 C 178.64062,45.332031 178.8125,45.332031 178.8125,45.035156 C 178.8125,45.019531 178.8125,44.863281 178.60547,44.863281 C 178.19531,44.863281 177.73047,44.910156 177.30078,44.910156 C 176.76953,44.910156 176.22266,44.863281 175.70703,44.863281 C 175.60547,44.863281 175.39844,44.863281 175.39844,45.160156 C 175.39844,45.332031 175.55078,45.347656 175.65625,45.347656 C 175.94922,45.367188 176.1875,45.460938 176.1875,45.714844 C 176.1875,45.984375 175.79297,46.410156 175.75781,46.457031 L 172,50.6875 L 170.37109,45.933594 C 170.30078,45.777344 170.30078,45.746094 170.30078,45.730469 C 170.30078,45.363281 171.03906,45.347656 171.26172,45.347656 C 171.45312,45.347656 171.64062,45.347656 171.64062,45.050781 C 171.64062,44.863281 171.46875,44.863281 171.40234,44.863281 C 170.75,44.863281 170.0625,44.910156 169.39453,44.910156 C 168.80859,44.910156 168.17578,44.863281 167.60937,44.863281 C 167.50781,44.863281 167.28125,44.863281 167.28125,45.160156 C 167.28125,45.347656 167.45312,45.347656 167.69531,45.347656 C 168.5,45.347656 168.67187,45.460938 168.79297,45.824219 L 170.61328,51.117188 C 170.64453,51.195312 170.67969,51.289062 170.67969,51.355469 C 170.67969,51.433594 169.97656,53.953125 169.89062,54.253906 C 169.66797,55.125 169.65234,55.171875 168.37891,55.1875 C 168.14062,55.1875 167.95312,55.1875 167.95312,55.484375 C 167.95312,55.671875 168.14062,55.671875 168.19141,55.671875 C 168.84375,55.671875 169.53125,55.625 170.18359,55.625 C 170.85156,55.625 171.57031,55.671875 172.22266,55.671875 C 172.32813,55.671875 172.55078,55.671875 172.55078,55.375 C 172.55078,55.1875 172.41406,55.1875 172.08594,55.1875 C 171.55469,55.1875 171.08984,55.1875 171.08984,54.917969 C 171.08984,54.792969 171.29687,54.03125 171.41797,53.570312 C 171.625,52.8125 171.77734,52.289062 171.94922,51.621094 C 172.03516,51.351562 172.03516,51.320312 172.15625,51.195312"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ </g>+ <g+ id="g156"+ clip-rule="nonzero"+ clip-path="url(#clip2)">+ <path+ id="path158"+ d="M 139.79297,72.984375 C 139.79297,72.941406 139.79297,72.910156 139.51953,72.664062 C 137.5,70.832031 136.98438,68.078125 136.98438,65.855469 C 136.98438,63.320312 137.59766,60.789062 139.58203,58.972656 C 139.79297,58.796875 139.79297,58.769531 139.79297,58.722656 C 139.79297,58.621094 139.72656,58.574219 139.63281,58.574219 C 139.46875,58.574219 138.01562,59.566406 137.0625,61.417969 C 136.23828,63.015625 136.04297,64.632812 136.04297,65.855469 C 136.04297,66.988281 136.22266,68.75 137.10937,70.394531 C 138.08203,72.183594 139.46875,73.128906 139.63281,73.128906 C 139.72656,73.128906 139.79297,73.085938 139.79297,72.984375"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path160"+ d="M 147.32813,66.117188 L 151.79687,66.117188 C 152.01953,66.117188 152.32422,66.117188 152.32422,65.832031 C 152.32422,65.546875 152.01953,65.546875 151.79687,65.546875 L 147.32813,65.546875 L 147.32813,61.484375 C 147.32813,61.28125 147.32813,61.007812 147.01562,61.007812 C 146.70312,61.007812 146.70312,61.28125 146.70312,61.484375 L 146.70312,65.546875 L 142.17969,65.546875 C 141.95312,65.546875 141.64453,65.546875 141.64453,65.832031 C 141.64453,66.117188 141.95312,66.117188 142.17969,66.117188 L 146.70312,66.117188 L 146.70312,70.214844 C 146.70312,70.417969 146.70312,70.695312 147.01562,70.695312 C 147.32813,70.695312 147.32813,70.417969 147.32813,70.214844"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path162"+ d="M 157.98438,60.171875 C 157.98438,59.820312 157.98438,59.789062 157.61328,59.789062 C 156.60937,60.722656 155.1875,60.722656 154.66797,60.722656 L 154.66797,61.167969 C 154.98828,61.167969 155.9375,61.167969 156.77734,60.800781 L 156.77734,68.335938 C 156.77734,68.859375 156.72656,69.035156 155.28125,69.035156 L 154.76562,69.035156 L 154.76562,69.480469 C 155.32813,69.4375 156.72266,69.4375 157.36719,69.4375 C 158.00781,69.4375 159.40625,69.4375 159.96875,69.480469 L 159.96875,69.035156 L 159.46094,69.035156 C 158.03125,69.035156 157.98438,68.875 157.98438,68.335938"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path164"+ d="M 165.91016,65.851562 C 165.91016,64.71875 165.73047,62.957031 164.84375,61.3125 C 163.87891,59.523438 162.49219,58.574219 162.33203,58.574219 C 162.23437,58.574219 162.16797,58.636719 162.16797,58.722656 C 162.16797,58.765625 162.16797,58.796875 162.47656,59.058594 C 164.05078,60.5 164.96875,62.8125 164.96875,65.851562 C 164.96875,68.339844 164.375,70.902344 162.37891,72.734375 C 162.16797,72.910156 162.16797,72.941406 162.16797,72.984375 C 162.16797,73.070312 162.23437,73.128906 162.33203,73.128906 C 162.49219,73.128906 163.94141,72.140625 164.89453,70.292969 C 165.71484,68.691406 165.91016,67.074219 165.91016,65.851562"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ </g>+ <path+ id="path166"+ d="M 207.95703,82.664062 L 276.15234,82.664062 L 276.15234,36.234375 L 207.95703,36.234375 L 207.95703,82.664062 z"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path168"+ d="M 207.95703,36.23437 L 276.15234,36.23437 L 276.15234,82.66406 L 207.95703,82.66406 L 207.95703,36.23437 z"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <g+ id="g170"+ clip-rule="nonzero"+ clip-path="url(#clip3)">+ <path+ id="path172"+ d="M 216.5625,52.898438 C 216.64844,52.550781 216.75,52.21875 216.83594,51.867188 C 217.05859,51.089844 217.05859,51.058594 217.26562,50.726562 C 217.76172,49.933594 218.5,49.011719 219.6875,49.011719 C 220.47656,49.011719 220.47656,49.820312 220.47656,50.058594 C 220.47656,50.488281 220.35547,50.945312 220.32031,51.089844 L 219.20703,55.214844 C 219.17187,55.308594 219.15234,55.386719 219.15234,55.4375 C 219.15234,55.609375 219.28906,55.847656 219.63281,55.847656 C 219.83984,55.847656 220.13281,55.738281 220.25391,55.4375 L 220.9375,52.898438 C 221.02344,52.550781 221.12891,52.214844 221.21484,51.867188 C 221.4375,51.089844 221.4375,51.058594 221.64453,50.726562 C 222.14062,49.933594 222.87891,49.011719 224.0625,49.011719 C 224.85547,49.011719 224.85547,49.820312 224.85547,50.058594 C 224.85547,51.042969 224.08984,52.929688 223.84375,53.5625 C 223.61719,54.101562 223.56641,54.246094 223.56641,54.578125 C 223.56641,55.277344 224.04687,55.847656 224.87109,55.847656 C 226.47266,55.847656 227.05469,53.488281 227.05469,53.410156 C 227.05469,53.25 226.91797,53.25 226.79687,53.25 C 226.57422,53.25 226.57422,53.285156 226.50391,53.519531 C 226.36719,53.945312 225.90234,55.496094 224.90234,55.496094 C 224.53906,55.496094 224.51953,55.257812 224.51953,55.035156 C 224.51953,54.640625 224.70703,54.226562 224.85547,53.847656 C 225.19922,53.003906 225.90625,51.230469 225.90625,50.308594 C 225.90625,48.976562 224.91016,48.65625 224.10156,48.65625 C 222.89844,48.65625 222.03906,49.363281 221.52734,50.070312 C 221.38672,48.964844 220.49609,48.65625 219.72266,48.65625 C 218.69141,48.65625 217.85156,49.1875 217.26562,49.929688 C 217.14453,49.140625 216.5625,48.65625 215.82422,48.65625 C 215.20312,48.65625 214.86328,49.023438 214.58594,49.503906 C 214.26172,50.140625 214.03516,51.082031 214.03516,51.113281 C 214.03516,51.273438 214.20703,51.273438 214.29297,51.273438 C 214.51562,51.273438 214.53516,51.257812 214.62109,50.90625 C 214.92969,49.792969 215.25781,49.011719 215.78906,49.011719 C 216.23437,49.011719 216.23437,49.472656 216.23437,49.648438 C 216.23437,49.902344 216.18359,50.203125 216.11328,50.457031 L 214.82422,55.214844 C 214.79297,55.308594 214.77344,55.390625 214.77344,55.4375 C 214.77344,55.613281 214.91016,55.847656 215.25391,55.847656 C 215.46094,55.847656 215.75391,55.738281 215.87109,55.4375"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path174"+ d="M 234.96094,49.722656 C 235.02734,49.5 235.02734,49.46875 235.02734,49.390625 C 235.02734,49.054688 234.73828,48.976562 234.56641,48.976562 C 234.01953,48.976562 233.89844,49.515625 233.88281,49.59375 C 233.55469,48.914062 233.00781,48.660156 232.46094,48.660156 C 230.55859,48.660156 228.53906,51.070312 228.53906,53.390625 C 228.53906,54.738281 229.32813,55.847656 230.60937,55.847656 C 231.22656,55.847656 231.98047,55.515625 232.66406,54.738281 C 232.85547,55.515625 233.48828,55.847656 234.08594,55.847656 C 234.71875,55.847656 235.07812,55.453125 235.33594,54.960938 C 235.64453,54.359375 235.85156,53.441406 235.85156,53.410156 C 235.85156,53.25 235.71094,53.25 235.59375,53.25 C 235.38672,53.25 235.37109,53.269531 235.26562,53.617188 C 235.02734,54.5 234.70312,55.496094 234.12109,55.496094 C 233.67578,55.496094 233.67578,55.066406 233.67578,54.847656 C 233.67578,54.734375 233.67578,54.480469 233.79297,54.035156 L 234.96094,49.722656 z M 232.77734,53.703125 C 232.64062,54.210938 231.57422,55.496094 230.63281,55.496094 C 229.82422,55.496094 229.6875,54.5625 229.6875,54.085938 C 229.6875,53.292969 230.21875,51.4375 230.52734,50.769531 C 230.95703,49.804688 231.74609,49.011719 232.45312,49.011719 C 233.20703,49.011719 233.63672,49.835938 233.63672,50.503906 C 233.63672,50.535156 233.62109,50.613281 233.58594,50.707031"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path176"+ d="M 236.96875,57.71875 C 236.83203,58.210938 236.69531,58.261719 236.02734,58.277344 C 235.87109,58.277344 235.66406,58.277344 235.66406,58.574219 C 235.66406,58.683594 235.75,58.761719 235.87109,58.761719 C 236.33594,58.761719 236.83203,58.714844 237.3125,58.714844 C 237.86328,58.714844 238.44531,58.761719 238.97656,58.761719 C 239.08203,58.761719 239.30469,58.761719 239.30469,58.464844 C 239.30469,58.277344 239.13281,58.277344 238.89062,58.277344 C 238.01562,58.277344 238.01562,58.179688 238.01562,58.019531 C 238.01562,57.925781 238.13672,57.511719 238.20703,57.257812 L 238.82422,54.929688 C 238.94531,55.199219 239.37109,55.847656 240.26562,55.847656 C 242.13672,55.847656 244.17969,53.5 244.17969,51.136719 C 244.17969,49.4375 243.14844,48.660156 242.11719,48.660156 C 241.27734,48.660156 240.53906,49.238281 240.04297,49.785156 C 239.83594,48.851562 239.0625,48.660156 238.63672,48.660156 C 238.01562,48.660156 237.67578,49.023438 237.39844,49.503906 C 237.07422,50.140625 236.85156,51.082031 236.85156,51.113281 C 236.85156,51.273438 237.02344,51.273438 237.10937,51.273438 C 237.33203,51.273438 237.34766,51.257812 237.43359,50.90625 C 237.74219,49.792969 238.07031,49.011719 238.60156,49.011719 C 239.04687,49.011719 239.04687,49.472656 239.04687,49.648438 C 239.04687,49.742188 239.04687,50 238.92578,50.445312 L 236.96875,57.71875 z M 239.9375,50.804688 C 240.07422,50.265625 241.14062,49.011719 242.08594,49.011719 C 242.85938,49.011719 243.03125,49.914062 243.03125,50.421875 C 243.03125,51.089844 242.56641,52.976562 242.06641,53.988281 C 241.86328,54.386719 241.125,55.496094 240.24609,55.496094 C 239.25,55.496094 239.07812,54.148438 239.07812,54.023438 C 239.07812,53.972656 239.09766,53.925781 239.13281,53.800781"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path178"+ d="M 254.98438,44.890625 C 255,44.828125 255.01953,44.734375 255.01953,44.667969 C 255.01953,44.636719 255,44.511719 254.82813,44.511719 C 254.74609,44.511719 254.72656,44.527344 254.57422,44.703125 L 253.80469,45.59375 C 253.14062,44.527344 251.92578,44.511719 251.58594,44.511719 C 249.48438,44.511719 247.62109,46.460938 247.62109,48.28125 C 247.62109,49.105469 248,49.945312 248.99219,50.375 C 249.09375,50.421875 249.46875,50.515625 249.72656,50.578125 L 250.56641,50.800781 C 251.45703,51.039062 251.59375,51.085938 251.88281,51.371094 C 252.07031,51.59375 252.26172,51.941406 252.26172,52.511719 C 252.26172,53.953125 250.91797,55.539062 249.38672,55.539062 C 248.09766,55.539062 246.80859,54.96875 246.80859,53.320312 C 246.80859,52.953125 246.89453,52.523438 246.94531,52.351562 C 246.94531,52.320312 246.96094,52.285156 246.96094,52.253906 C 246.96094,52.078125 246.80859,52.078125 246.70312,52.078125 C 246.49609,52.078125 246.46484,52.113281 246.39453,52.351562 L 245.5,55.660156 C 245.46484,55.773438 245.44922,55.820312 245.44922,55.867188 C 245.44922,55.960938 245.53516,56.023438 245.63672,56.023438 C 245.75781,56.023438 245.77344,55.992188 245.91016,55.835938 C 246.10156,55.644531 246.54687,55.136719 246.71875,54.929688 C 247.35156,55.785156 248.44922,56.023438 249.34375,56.023438 C 251.50391,56.023438 253.41016,53.902344 253.41016,51.90625 C 253.41016,51.445312 253.28906,50.796875 252.84375,50.289062 C 252.41797,49.800781 252.21094,49.75 250.58594,49.308594 C 250.26172,49.230469 249.73047,49.085938 249.64453,49.054688 C 249.0625,48.816406 248.76953,48.308594 248.76953,47.660156 C 248.76953,46.359375 250.08984,44.949219 251.54687,44.949219 C 253.15625,44.949219 253.63281,46.03125 253.63281,47.203125 C 253.63281,47.617188 253.61719,47.726562 253.54687,48.074219 L 253.53125,48.296875 C 253.53125,48.457031 253.70312,48.457031 253.78906,48.457031 C 253.97656,48.457031 254.02734,48.441406 254.09375,48.171875"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path180"+ d="M 266.20312,46.648438 C 267.01172,45.746094 267.66406,45.414062 268.48828,45.347656 C 268.64063,45.332031 268.8125,45.332031 268.8125,45.035156 C 268.8125,45.019531 268.8125,44.863281 268.60547,44.863281 C 268.19531,44.863281 267.73047,44.910156 267.30078,44.910156 C 266.76953,44.910156 266.22266,44.863281 265.70703,44.863281 C 265.60547,44.863281 265.39844,44.863281 265.39844,45.160156 C 265.39844,45.332031 265.55078,45.347656 265.65625,45.347656 C 265.94922,45.367188 266.1875,45.460938 266.1875,45.714844 C 266.1875,45.984375 265.79297,46.410156 265.75781,46.457031 L 262,50.6875 L 260.37109,45.9375 C 260.30078,45.777344 260.30078,45.746094 260.30078,45.730469 C 260.30078,45.367188 261.03906,45.347656 261.26172,45.347656 C 261.45312,45.347656 261.64063,45.347656 261.64063,45.050781 C 261.64063,44.863281 261.46875,44.863281 261.40234,44.863281 C 260.75,44.863281 260.0625,44.910156 259.39453,44.910156 C 258.80859,44.910156 258.17578,44.863281 257.60938,44.863281 C 257.50781,44.863281 257.28125,44.863281 257.28125,45.160156 C 257.28125,45.347656 257.45312,45.347656 257.69531,45.347656 C 258.5,45.347656 258.67188,45.460938 258.79297,45.824219 L 260.61328,51.117188 C 260.64453,51.195312 260.67969,51.289062 260.67969,51.355469 C 260.67969,51.433594 259.97656,53.953125 259.89062,54.253906 C 259.66797,55.125 259.65234,55.171875 258.37891,55.1875 C 258.14063,55.1875 257.95312,55.1875 257.95312,55.484375 C 257.95312,55.671875 258.14063,55.671875 258.19141,55.671875 C 258.84375,55.671875 259.53125,55.625 260.18359,55.625 C 260.85156,55.625 261.57031,55.671875 262.22266,55.671875 C 262.32812,55.671875 262.55078,55.671875 262.55078,55.375 C 262.55078,55.1875 262.41406,55.1875 262.08594,55.1875 C 261.55469,55.1875 261.08984,55.1875 261.08984,54.917969 C 261.08984,54.792969 261.29687,54.03125 261.41797,53.570312 C 261.625,52.8125 261.77734,52.289062 261.94922,51.621094 C 262.03516,51.351562 262.03516,51.320312 262.15625,51.195312"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ </g>+ <g+ id="g182"+ clip-rule="nonzero"+ clip-path="url(#clip4)">+ <path+ id="path184"+ d="M 230.66797,72.984375 C 230.66797,72.941406 230.66797,72.910156 230.40234,72.664062 C 228.44922,70.832031 227.95312,68.078125 227.95312,65.855469 C 227.95312,63.320312 228.54297,60.789062 230.46484,58.972656 C 230.66797,58.796875 230.66797,58.769531 230.66797,58.722656 C 230.66797,58.621094 230.60547,58.574219 230.51172,58.574219 C 230.35547,58.574219 228.94922,59.566406 228.02734,61.417969 C 227.23047,63.015625 227.04297,64.632812 227.04297,65.855469 C 227.04297,66.988281 227.21484,68.75 228.07422,70.394531 C 229.01172,72.183594 230.35547,73.128906 230.51172,73.128906 C 230.60547,73.128906 230.66797,73.085938 230.66797,72.984375"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path186"+ d="M 237.94922,66.117188 L 242.26953,66.117188 C 242.48438,66.117188 242.78125,66.117188 242.78125,65.832031 C 242.78125,65.546875 242.48438,65.546875 242.26953,65.546875 L 237.94922,65.546875 L 237.94922,61.484375 C 237.94922,61.28125 237.94922,61.007812 237.64844,61.007812 C 237.34375,61.007812 237.34375,61.28125 237.34375,61.484375 L 237.34375,65.546875 L 232.97266,65.546875 C 232.75391,65.546875 232.45703,65.546875 232.45703,65.832031 C 232.45703,66.117188 232.75391,66.117188 232.97266,66.117188 L 237.34375,66.117188 L 237.34375,70.214844 C 237.34375,70.417969 237.34375,70.695312 237.64844,70.695312 C 237.94922,70.695312 237.94922,70.417969 237.94922,70.214844"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path188"+ d="M 248.25391,60.171875 C 248.25391,59.820312 248.25391,59.789062 247.89453,59.789062 C 246.92188,60.722656 245.54687,60.722656 245.04687,60.722656 L 245.04687,61.167969 C 245.35547,61.167969 246.27344,61.167969 247.08203,60.800781 L 247.08203,68.335938 C 247.08203,68.859375 247.03516,69.035156 245.63672,69.035156 L 245.14062,69.035156 L 245.14062,69.480469 C 245.68359,69.4375 247.03125,69.4375 247.65234,69.4375 C 248.27344,69.4375 249.625,69.4375 250.16797,69.480469 L 250.16797,69.035156 L 249.67969,69.035156 C 248.29687,69.035156 248.25391,68.875 248.25391,68.335938"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path190"+ d="M 255.91406,65.851562 C 255.91406,64.71875 255.74219,62.957031 254.88281,61.3125 C 253.94922,59.523438 252.60937,58.574219 252.45312,58.574219 C 252.35938,58.574219 252.29687,58.636719 252.29687,58.722656 C 252.29687,58.765625 252.29687,58.796875 252.59375,59.058594 C 254.11719,60.5 255.00391,62.8125 255.00391,65.851562 C 255.00391,68.339844 254.42578,70.902344 252.5,72.734375 C 252.29687,72.910156 252.29687,72.941406 252.29687,72.984375 C 252.29687,73.070312 252.35938,73.128906 252.45312,73.128906 C 252.60937,73.128906 254.01172,72.140625 254.92969,70.292969 C 255.72656,68.691406 255.91406,67.074219 255.91406,65.851562"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ </g>+ <path+ id="path192"+ d="M 298.24609,82.664062 L 366.44141,82.664062 L 366.44141,36.234375 L 298.24609,36.234375 L 298.24609,82.664062 z"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path194"+ d="M 298.24609,36.23437 L 366.44141,36.23437 L 366.44141,82.66406 L 298.24609,82.66406 L 298.24609,36.23437 z"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <g+ id="g196"+ clip-rule="nonzero"+ clip-path="url(#clip5)">+ <path+ id="path198"+ d="M 306.5625,52.898438 C 306.64844,52.550781 306.75,52.21875 306.83594,51.867188 C 307.05859,51.089844 307.05859,51.058594 307.26562,50.726562 C 307.76172,49.933594 308.5,49.011719 309.6875,49.011719 C 310.47656,49.011719 310.47656,49.820312 310.47656,50.058594 C 310.47656,50.488281 310.35547,50.945312 310.32031,51.089844 L 309.20703,55.214844 C 309.17188,55.308594 309.15234,55.386719 309.15234,55.4375 C 309.15234,55.609375 309.28906,55.847656 309.63281,55.847656 C 309.83984,55.847656 310.13281,55.738281 310.25391,55.4375 L 310.9375,52.898438 C 311.02344,52.550781 311.12891,52.214844 311.21484,51.867188 C 311.4375,51.089844 311.4375,51.058594 311.64453,50.726562 C 312.14063,49.933594 312.87891,49.011719 314.0625,49.011719 C 314.85547,49.011719 314.85547,49.820312 314.85547,50.058594 C 314.85547,51.042969 314.08984,52.929688 313.84375,53.5625 C 313.61719,54.101562 313.56641,54.246094 313.56641,54.578125 C 313.56641,55.277344 314.04688,55.847656 314.87109,55.847656 C 316.47266,55.847656 317.05469,53.488281 317.05469,53.410156 C 317.05469,53.25 316.91797,53.25 316.79687,53.25 C 316.57422,53.25 316.57422,53.285156 316.50391,53.519531 C 316.36719,53.945312 315.90234,55.496094 314.90234,55.496094 C 314.53906,55.496094 314.51953,55.257812 314.51953,55.035156 C 314.51953,54.640625 314.70703,54.226562 314.85547,53.847656 C 315.19922,53.003906 315.90625,51.230469 315.90625,50.308594 C 315.90625,48.976562 314.91016,48.65625 314.10156,48.65625 C 312.89844,48.65625 312.03906,49.363281 311.52734,50.070312 C 311.38672,48.964844 310.49609,48.65625 309.72266,48.65625 C 308.69141,48.65625 307.85156,49.1875 307.26562,49.929688 C 307.14453,49.140625 306.5625,48.65625 305.82422,48.65625 C 305.20312,48.65625 304.86328,49.023438 304.58594,49.503906 C 304.26172,50.140625 304.03516,51.082031 304.03516,51.113281 C 304.03516,51.273438 304.20703,51.273438 304.29297,51.273438 C 304.51562,51.273438 304.53516,51.257812 304.62109,50.90625 C 304.92969,49.792969 305.25781,49.011719 305.78906,49.011719 C 306.23437,49.011719 306.23437,49.472656 306.23437,49.648438 C 306.23437,49.902344 306.18359,50.203125 306.11328,50.457031 L 304.82422,55.214844 C 304.79297,55.308594 304.77344,55.390625 304.77344,55.4375 C 304.77344,55.613281 304.91016,55.847656 305.25391,55.847656 C 305.46094,55.847656 305.75391,55.738281 305.87109,55.4375"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path200"+ d="M 324.96094,49.722656 C 325.02734,49.5 325.02734,49.46875 325.02734,49.390625 C 325.02734,49.054688 324.73828,48.976562 324.56641,48.976562 C 324.01953,48.976562 323.89844,49.515625 323.88281,49.59375 C 323.55469,48.914062 323.00781,48.660156 322.46094,48.660156 C 320.55859,48.660156 318.53906,51.070312 318.53906,53.390625 C 318.53906,54.738281 319.32812,55.847656 320.60938,55.847656 C 321.22656,55.847656 321.98047,55.515625 322.66406,54.738281 C 322.85547,55.515625 323.48828,55.847656 324.08594,55.847656 C 324.71875,55.847656 325.07812,55.453125 325.33594,54.960938 C 325.64453,54.359375 325.85156,53.441406 325.85156,53.410156 C 325.85156,53.25 325.71094,53.25 325.59375,53.25 C 325.38672,53.25 325.37109,53.269531 325.26562,53.617188 C 325.02734,54.5 324.70312,55.496094 324.12109,55.496094 C 323.67578,55.496094 323.67578,55.066406 323.67578,54.847656 C 323.67578,54.734375 323.67578,54.480469 323.79297,54.035156 L 324.96094,49.722656 z M 322.77734,53.703125 C 322.64063,54.210938 321.57422,55.496094 320.63281,55.496094 C 319.82422,55.496094 319.6875,54.5625 319.6875,54.085938 C 319.6875,53.292969 320.21875,51.4375 320.52734,50.769531 C 320.95703,49.804688 321.74609,49.011719 322.45312,49.011719 C 323.20703,49.011719 323.63672,49.835938 323.63672,50.503906 C 323.63672,50.535156 323.62109,50.613281 323.58594,50.707031"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path202"+ d="M 326.96875,57.71875 C 326.83203,58.210938 326.69531,58.261719 326.02734,58.277344 C 325.87109,58.277344 325.66406,58.277344 325.66406,58.574219 C 325.66406,58.683594 325.75,58.761719 325.87109,58.761719 C 326.33594,58.761719 326.83203,58.714844 327.3125,58.714844 C 327.86328,58.714844 328.44531,58.761719 328.97656,58.761719 C 329.08203,58.761719 329.30469,58.761719 329.30469,58.464844 C 329.30469,58.277344 329.13281,58.277344 328.89062,58.277344 C 328.01562,58.277344 328.01562,58.179688 328.01562,58.019531 C 328.01562,57.925781 328.13672,57.511719 328.20703,57.257812 L 328.82422,54.929688 C 328.94531,55.199219 329.37109,55.847656 330.26562,55.847656 C 332.13672,55.847656 334.17969,53.5 334.17969,51.136719 C 334.17969,49.4375 333.14844,48.660156 332.11719,48.660156 C 331.27734,48.660156 330.53906,49.238281 330.04297,49.785156 C 329.83594,48.851562 329.0625,48.660156 328.63672,48.660156 C 328.01562,48.660156 327.67578,49.023438 327.39844,49.503906 C 327.07422,50.140625 326.85156,51.082031 326.85156,51.113281 C 326.85156,51.273438 327.02344,51.273438 327.10938,51.273438 C 327.33203,51.273438 327.34766,51.257812 327.43359,50.90625 C 327.74219,49.792969 328.07031,49.011719 328.60156,49.011719 C 329.04688,49.011719 329.04688,49.472656 329.04688,49.648438 C 329.04688,49.742188 329.04688,50 328.92578,50.445312 L 326.96875,57.71875 z M 329.9375,50.804688 C 330.07422,50.265625 331.14063,49.011719 332.08594,49.011719 C 332.85938,49.011719 333.03125,49.914062 333.03125,50.421875 C 333.03125,51.089844 332.56641,52.976562 332.06641,53.988281 C 331.86328,54.386719 331.125,55.496094 330.24609,55.496094 C 329.25,55.496094 329.07812,54.148438 329.07812,54.023438 C 329.07812,53.972656 329.09766,53.925781 329.13281,53.800781"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path204"+ d="M 344.98437,44.890625 C 345,44.828125 345.01953,44.734375 345.01953,44.667969 C 345.01953,44.636719 345,44.511719 344.82812,44.511719 C 344.74609,44.511719 344.72656,44.527344 344.57422,44.703125 L 343.80469,45.59375 C 343.14063,44.527344 341.92578,44.511719 341.58594,44.511719 C 339.48437,44.511719 337.62109,46.460938 337.62109,48.28125 C 337.62109,49.105469 338,49.945312 338.99219,50.375 C 339.09375,50.421875 339.46875,50.515625 339.72656,50.578125 L 340.56641,50.800781 C 341.45703,51.039062 341.59375,51.085938 341.88281,51.371094 C 342.07031,51.59375 342.26172,51.941406 342.26172,52.511719 C 342.26172,53.953125 340.91797,55.539062 339.38672,55.539062 C 338.09766,55.539062 336.80859,54.96875 336.80859,53.320312 C 336.80859,52.953125 336.89453,52.523438 336.94531,52.351562 C 336.94531,52.320312 336.96094,52.285156 336.96094,52.253906 C 336.96094,52.078125 336.80859,52.078125 336.70312,52.078125 C 336.49609,52.078125 336.46484,52.113281 336.39453,52.351562 L 335.5,55.660156 C 335.46484,55.773438 335.44922,55.820312 335.44922,55.867188 C 335.44922,55.960938 335.53516,56.023438 335.63672,56.023438 C 335.75781,56.023438 335.77344,55.992188 335.91016,55.835938 C 336.10156,55.644531 336.54688,55.136719 336.71875,54.929688 C 337.35156,55.785156 338.44922,56.023438 339.34375,56.023438 C 341.50391,56.023438 343.41016,53.902344 343.41016,51.90625 C 343.41016,51.445312 343.28906,50.796875 342.84375,50.289062 C 342.41797,49.800781 342.21094,49.75 340.58594,49.308594 C 340.26172,49.230469 339.73047,49.085938 339.64453,49.054688 C 339.0625,48.816406 338.76953,48.308594 338.76953,47.660156 C 338.76953,46.359375 340.08984,44.949219 341.54688,44.949219 C 343.15625,44.949219 343.63281,46.03125 343.63281,47.203125 C 343.63281,47.617188 343.61719,47.726562 343.54688,48.074219 L 343.53125,48.296875 C 343.53125,48.457031 343.70312,48.457031 343.78906,48.457031 C 343.97656,48.457031 344.02734,48.441406 344.09375,48.171875"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path206"+ d="M 356.20312,46.648438 C 357.01172,45.746094 357.66406,45.414062 358.48828,45.347656 C 358.64063,45.332031 358.8125,45.332031 358.8125,45.035156 C 358.8125,45.019531 358.8125,44.863281 358.60547,44.863281 C 358.19531,44.863281 357.73047,44.910156 357.30078,44.910156 C 356.76953,44.910156 356.22266,44.863281 355.70703,44.863281 C 355.60547,44.863281 355.39844,44.863281 355.39844,45.160156 C 355.39844,45.332031 355.55078,45.347656 355.65625,45.347656 C 355.94922,45.367188 356.1875,45.460938 356.1875,45.714844 C 356.1875,45.984375 355.79297,46.410156 355.75781,46.457031 L 352,50.6875 L 350.37109,45.9375 C 350.30078,45.777344 350.30078,45.746094 350.30078,45.730469 C 350.30078,45.367188 351.03906,45.347656 351.26172,45.347656 C 351.45312,45.347656 351.64063,45.347656 351.64063,45.050781 C 351.64063,44.863281 351.46875,44.863281 351.40234,44.863281 C 350.75,44.863281 350.0625,44.910156 349.39453,44.910156 C 348.80859,44.910156 348.17578,44.863281 347.60938,44.863281 C 347.50781,44.863281 347.28125,44.863281 347.28125,45.160156 C 347.28125,45.347656 347.45312,45.347656 347.69531,45.347656 C 348.5,45.347656 348.67188,45.460938 348.79297,45.824219 L 350.61328,51.117188 C 350.64453,51.195312 350.67969,51.289062 350.67969,51.355469 C 350.67969,51.433594 349.97656,53.953125 349.89062,54.253906 C 349.66797,55.125 349.65234,55.171875 348.37891,55.1875 C 348.14063,55.1875 347.95312,55.1875 347.95312,55.484375 C 347.95312,55.671875 348.14063,55.671875 348.19141,55.671875 C 348.84375,55.671875 349.53125,55.625 350.18359,55.625 C 350.85156,55.625 351.57031,55.671875 352.22266,55.671875 C 352.32812,55.671875 352.55078,55.671875 352.55078,55.375 C 352.55078,55.1875 352.41406,55.1875 352.08594,55.1875 C 351.55469,55.1875 351.08984,55.1875 351.08984,54.917969 C 351.08984,54.792969 351.29687,54.03125 351.41797,53.570312 C 351.625,52.8125 351.77734,52.289062 351.94922,51.621094 C 352.03516,51.351562 352.03516,51.320312 352.15625,51.195312"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ </g>+ <g+ id="g208"+ clip-rule="nonzero"+ clip-path="url(#clip6)">+ <path+ id="path210"+ d="M 320.79297,72.984375 C 320.79297,72.941406 320.79297,72.910156 320.51953,72.664062 C 318.5,70.832031 317.98437,68.078125 317.98437,65.855469 C 317.98437,63.320312 318.59766,60.789062 320.58203,58.972656 C 320.79297,58.796875 320.79297,58.769531 320.79297,58.722656 C 320.79297,58.621094 320.72656,58.574219 320.63281,58.574219 C 320.46875,58.574219 319.01562,59.566406 318.0625,61.417969 C 317.23828,63.015625 317.04297,64.632812 317.04297,65.855469 C 317.04297,66.988281 317.22266,68.75 318.10938,70.394531 C 319.08203,72.183594 320.46875,73.128906 320.63281,73.128906 C 320.72656,73.128906 320.79297,73.085938 320.79297,72.984375"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path212"+ d="M 328.32812,66.117188 L 332.79687,66.117188 C 333.01953,66.117188 333.32422,66.117188 333.32422,65.832031 C 333.32422,65.546875 333.01953,65.546875 332.79687,65.546875 L 328.32812,65.546875 L 328.32812,61.484375 C 328.32812,61.28125 328.32812,61.007812 328.01562,61.007812 C 327.70312,61.007812 327.70312,61.28125 327.70312,61.484375 L 327.70312,65.546875 L 323.17969,65.546875 C 322.95312,65.546875 322.64453,65.546875 322.64453,65.832031 C 322.64453,66.117188 322.95312,66.117188 323.17969,66.117188 L 327.70312,66.117188 L 327.70312,70.214844 C 327.70312,70.417969 327.70312,70.695312 328.01562,70.695312 C 328.32812,70.695312 328.32812,70.417969 328.32812,70.214844"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path214"+ d="M 338.98437,60.171875 C 338.98437,59.820312 338.98437,59.789062 338.61328,59.789062 C 337.60938,60.722656 336.1875,60.722656 335.66797,60.722656 L 335.66797,61.167969 C 335.98828,61.167969 336.9375,61.167969 337.77734,60.800781 L 337.77734,68.335938 C 337.77734,68.859375 337.72656,69.035156 336.28125,69.035156 L 335.76562,69.035156 L 335.76562,69.480469 C 336.32812,69.4375 337.72266,69.4375 338.36719,69.4375 C 339.00781,69.4375 340.40625,69.4375 340.96875,69.480469 L 340.96875,69.035156 L 340.46094,69.035156 C 339.03125,69.035156 338.98437,68.875 338.98437,68.335938"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path216"+ d="M 346.91016,65.851562 C 346.91016,64.71875 346.73047,62.957031 345.84375,61.3125 C 344.87891,59.523438 343.49219,58.574219 343.33203,58.574219 C 343.23437,58.574219 343.16797,58.636719 343.16797,58.722656 C 343.16797,58.765625 343.16797,58.796875 343.47656,59.058594 C 345.05078,60.5 345.96875,62.8125 345.96875,65.851562 C 345.96875,68.339844 345.375,70.902344 343.37891,72.734375 C 343.16797,72.910156 343.16797,72.941406 343.16797,72.984375 C 343.16797,73.070312 343.23437,73.128906 343.33203,73.128906 C 343.49219,73.128906 344.94141,72.140625 345.89453,70.292969 C 346.71484,68.691406 346.91016,67.074219 346.91016,65.851562"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ </g>+ <path+ id="path218"+ d="M 185.86328,59.87891 L 197.55469,59.78906"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path220"+ d="M 205.55469,59.72656 L 197.53125,56.78906 L 197.57812,62.78906 L 205.55469,59.72656 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path222"+ d="M 276.39453,59.18359 L 288.10547,59.09375"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path224"+ d="M 296.10547,59.035156 L 288.08203,56.09375 L 288.12891,62.09375 L 296.10547,59.035156 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path226"+ d="M 296.10547,59.03125 L 288.08203,56.09375 L 288.12891,62.09375 L 296.10547,59.03125 z"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path228"+ d="M 366.68359,59.18359 L 378.39453,59.09375"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path230"+ d="M 386.39453,59.035156 L 378.37109,56.09375 L 378.41797,62.09375 L 386.39453,59.035156 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path232"+ d="M 386.39453,59.03125 L 378.37109,56.09375 L 378.41797,62.09375 L 386.39453,59.03125 z"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path234"+ d="M 388.29687,82.664062 L 456.49219,82.664062 L 456.49219,36.234375 L 388.29687,36.234375 L 388.29687,82.664062 z"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path236"+ d="M 388.29687,36.23437 L 456.49219,36.23437 L 456.49219,82.66406 L 388.29687,82.66406 L 388.29687,36.23437 z"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <g+ id="g238"+ clip-rule="nonzero"+ clip-path="url(#clip7)">+ <path+ id="path240"+ d="M 396.5625,52.898438 C 396.64844,52.550781 396.75,52.21875 396.83594,51.867188 C 397.05859,51.089844 397.05859,51.058594 397.26562,50.726562 C 397.76172,49.933594 398.5,49.011719 399.6875,49.011719 C 400.47656,49.011719 400.47656,49.820312 400.47656,50.058594 C 400.47656,50.488281 400.35547,50.945312 400.32031,51.089844 L 399.20703,55.214844 C 399.17188,55.308594 399.15234,55.386719 399.15234,55.4375 C 399.15234,55.609375 399.28906,55.847656 399.63281,55.847656 C 399.83984,55.847656 400.13281,55.738281 400.25391,55.4375 L 400.9375,52.898438 C 401.02344,52.550781 401.12891,52.214844 401.21484,51.867188 C 401.4375,51.089844 401.4375,51.058594 401.64453,50.726562 C 402.14063,49.933594 402.87891,49.011719 404.0625,49.011719 C 404.85547,49.011719 404.85547,49.820312 404.85547,50.058594 C 404.85547,51.042969 404.08984,52.929688 403.84375,53.5625 C 403.61719,54.101562 403.56641,54.246094 403.56641,54.578125 C 403.56641,55.277344 404.04688,55.847656 404.87109,55.847656 C 406.47266,55.847656 407.05469,53.488281 407.05469,53.410156 C 407.05469,53.25 406.91797,53.25 406.79687,53.25 C 406.57422,53.25 406.57422,53.285156 406.50391,53.519531 C 406.36719,53.945312 405.90234,55.496094 404.90234,55.496094 C 404.53906,55.496094 404.51953,55.257812 404.51953,55.035156 C 404.51953,54.640625 404.70703,54.226562 404.85547,53.847656 C 405.19922,53.003906 405.90625,51.230469 405.90625,50.308594 C 405.90625,48.976562 404.91016,48.65625 404.10156,48.65625 C 402.89844,48.65625 402.03906,49.363281 401.52734,50.070312 C 401.38672,48.964844 400.49609,48.65625 399.72266,48.65625 C 398.69141,48.65625 397.85156,49.1875 397.26562,49.929688 C 397.14453,49.140625 396.5625,48.65625 395.82422,48.65625 C 395.20312,48.65625 394.86328,49.023438 394.58594,49.503906 C 394.26172,50.140625 394.03516,51.082031 394.03516,51.113281 C 394.03516,51.273438 394.20703,51.273438 394.29297,51.273438 C 394.51562,51.273438 394.53516,51.257812 394.62109,50.90625 C 394.92969,49.792969 395.25781,49.011719 395.78906,49.011719 C 396.23437,49.011719 396.23437,49.472656 396.23437,49.648438 C 396.23437,49.902344 396.18359,50.203125 396.11328,50.457031 L 394.82422,55.214844 C 394.79297,55.308594 394.77344,55.390625 394.77344,55.4375 C 394.77344,55.613281 394.91016,55.847656 395.25391,55.847656 C 395.46094,55.847656 395.75391,55.738281 395.87109,55.4375"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path242"+ d="M 414.96094,49.722656 C 415.02734,49.5 415.02734,49.46875 415.02734,49.390625 C 415.02734,49.054688 414.73828,48.976562 414.56641,48.976562 C 414.01953,48.976562 413.89844,49.515625 413.88281,49.59375 C 413.55469,48.914062 413.00781,48.660156 412.46094,48.660156 C 410.55859,48.660156 408.53906,51.070312 408.53906,53.390625 C 408.53906,54.738281 409.32812,55.847656 410.60938,55.847656 C 411.22656,55.847656 411.98047,55.515625 412.66406,54.738281 C 412.85547,55.515625 413.48828,55.847656 414.08594,55.847656 C 414.71875,55.847656 415.07812,55.453125 415.33594,54.960938 C 415.64453,54.359375 415.85156,53.441406 415.85156,53.410156 C 415.85156,53.25 415.71094,53.25 415.59375,53.25 C 415.38672,53.25 415.37109,53.269531 415.26562,53.617188 C 415.02734,54.5 414.70312,55.496094 414.12109,55.496094 C 413.67578,55.496094 413.67578,55.066406 413.67578,54.847656 C 413.67578,54.734375 413.67578,54.480469 413.79297,54.035156 L 414.96094,49.722656 z M 412.77734,53.703125 C 412.64063,54.210938 411.57422,55.496094 410.63281,55.496094 C 409.82422,55.496094 409.6875,54.5625 409.6875,54.085938 C 409.6875,53.292969 410.21875,51.4375 410.52734,50.769531 C 410.95703,49.804688 411.74609,49.011719 412.45312,49.011719 C 413.20703,49.011719 413.63672,49.835938 413.63672,50.503906 C 413.63672,50.535156 413.62109,50.613281 413.58594,50.707031"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path244"+ d="M 416.96875,57.71875 C 416.83203,58.210938 416.69531,58.261719 416.02734,58.277344 C 415.87109,58.277344 415.66406,58.277344 415.66406,58.574219 C 415.66406,58.683594 415.75,58.761719 415.87109,58.761719 C 416.33594,58.761719 416.83203,58.714844 417.3125,58.714844 C 417.86328,58.714844 418.44531,58.761719 418.97656,58.761719 C 419.08203,58.761719 419.30469,58.761719 419.30469,58.464844 C 419.30469,58.277344 419.13281,58.277344 418.89062,58.277344 C 418.01562,58.277344 418.01562,58.179688 418.01562,58.019531 C 418.01562,57.925781 418.13672,57.511719 418.20703,57.257812 L 418.82422,54.929688 C 418.94531,55.199219 419.37109,55.847656 420.26562,55.847656 C 422.13672,55.847656 424.17969,53.5 424.17969,51.136719 C 424.17969,49.4375 423.14844,48.660156 422.11719,48.660156 C 421.27734,48.660156 420.53906,49.238281 420.04297,49.785156 C 419.83594,48.851562 419.0625,48.660156 418.63672,48.660156 C 418.01562,48.660156 417.67578,49.023438 417.39844,49.503906 C 417.07422,50.140625 416.85156,51.082031 416.85156,51.113281 C 416.85156,51.273438 417.02344,51.273438 417.10938,51.273438 C 417.33203,51.273438 417.34766,51.257812 417.43359,50.90625 C 417.74219,49.792969 418.07031,49.011719 418.60156,49.011719 C 419.04688,49.011719 419.04688,49.472656 419.04688,49.648438 C 419.04688,49.742188 419.04688,50 418.92578,50.445312 L 416.96875,57.71875 z M 419.9375,50.804688 C 420.07422,50.265625 421.14063,49.011719 422.08594,49.011719 C 422.85938,49.011719 423.03125,49.914062 423.03125,50.421875 C 423.03125,51.089844 422.56641,52.976562 422.06641,53.988281 C 421.86328,54.386719 421.125,55.496094 420.24609,55.496094 C 419.25,55.496094 419.07812,54.148438 419.07812,54.023438 C 419.07812,53.972656 419.09766,53.925781 419.13281,53.800781"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path246"+ d="M 434.98437,44.890625 C 435,44.828125 435.01953,44.734375 435.01953,44.667969 C 435.01953,44.636719 435,44.511719 434.82812,44.511719 C 434.74609,44.511719 434.72656,44.527344 434.57422,44.703125 L 433.80469,45.59375 C 433.14063,44.527344 431.92578,44.511719 431.58594,44.511719 C 429.48437,44.511719 427.62109,46.460938 427.62109,48.28125 C 427.62109,49.105469 428,49.945312 428.99219,50.375 C 429.09375,50.421875 429.46875,50.515625 429.72656,50.578125 L 430.56641,50.800781 C 431.45703,51.039062 431.59375,51.085938 431.88281,51.371094 C 432.07031,51.59375 432.26172,51.941406 432.26172,52.511719 C 432.26172,53.953125 430.91797,55.539062 429.38672,55.539062 C 428.09766,55.539062 426.80859,54.96875 426.80859,53.320312 C 426.80859,52.953125 426.89453,52.523438 426.94531,52.351562 C 426.94531,52.320312 426.96094,52.285156 426.96094,52.253906 C 426.96094,52.078125 426.80859,52.078125 426.70312,52.078125 C 426.49609,52.078125 426.46484,52.113281 426.39453,52.351562 L 425.5,55.660156 C 425.46484,55.773438 425.44922,55.820312 425.44922,55.867188 C 425.44922,55.960938 425.53516,56.023438 425.63672,56.023438 C 425.75781,56.023438 425.77344,55.992188 425.91016,55.835938 C 426.10156,55.644531 426.54688,55.136719 426.71875,54.929688 C 427.35156,55.785156 428.44922,56.023438 429.34375,56.023438 C 431.50391,56.023438 433.41016,53.902344 433.41016,51.90625 C 433.41016,51.445312 433.28906,50.796875 432.84375,50.289062 C 432.41797,49.800781 432.21094,49.75 430.58594,49.308594 C 430.26172,49.230469 429.73047,49.085938 429.64453,49.054688 C 429.0625,48.816406 428.76953,48.308594 428.76953,47.660156 C 428.76953,46.359375 430.08984,44.949219 431.54688,44.949219 C 433.15625,44.949219 433.63281,46.03125 433.63281,47.203125 C 433.63281,47.617188 433.61719,47.726562 433.54688,48.074219 L 433.53125,48.296875 C 433.53125,48.457031 433.70312,48.457031 433.78906,48.457031 C 433.97656,48.457031 434.02734,48.441406 434.09375,48.171875"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path248"+ d="M 446.20312,46.648438 C 447.01172,45.746094 447.66406,45.414062 448.48828,45.347656 C 448.64063,45.332031 448.8125,45.332031 448.8125,45.035156 C 448.8125,45.019531 448.8125,44.863281 448.60547,44.863281 C 448.19531,44.863281 447.73047,44.910156 447.30078,44.910156 C 446.76953,44.910156 446.22266,44.863281 445.70703,44.863281 C 445.60547,44.863281 445.39844,44.863281 445.39844,45.160156 C 445.39844,45.332031 445.55078,45.347656 445.65625,45.347656 C 445.94922,45.367188 446.1875,45.460938 446.1875,45.714844 C 446.1875,45.984375 445.79297,46.410156 445.75781,46.457031 L 442,50.6875 L 440.37109,45.9375 C 440.30078,45.777344 440.30078,45.746094 440.30078,45.730469 C 440.30078,45.367188 441.03906,45.347656 441.26172,45.347656 C 441.45312,45.347656 441.64063,45.347656 441.64063,45.050781 C 441.64063,44.863281 441.46875,44.863281 441.40234,44.863281 C 440.75,44.863281 440.0625,44.910156 439.39453,44.910156 C 438.80859,44.910156 438.17578,44.863281 437.60938,44.863281 C 437.50781,44.863281 437.28125,44.863281 437.28125,45.160156 C 437.28125,45.347656 437.45312,45.347656 437.69531,45.347656 C 438.5,45.347656 438.67188,45.460938 438.79297,45.824219 L 440.61328,51.117188 C 440.64453,51.195312 440.67969,51.289062 440.67969,51.355469 C 440.67969,51.433594 439.97656,53.953125 439.89062,54.253906 C 439.66797,55.125 439.65234,55.171875 438.37891,55.1875 C 438.14063,55.1875 437.95312,55.1875 437.95312,55.484375 C 437.95312,55.671875 438.14063,55.671875 438.19141,55.671875 C 438.84375,55.671875 439.53125,55.625 440.18359,55.625 C 440.85156,55.625 441.57031,55.671875 442.22266,55.671875 C 442.32812,55.671875 442.55078,55.671875 442.55078,55.375 C 442.55078,55.1875 442.41406,55.1875 442.08594,55.1875 C 441.55469,55.1875 441.08984,55.1875 441.08984,54.917969 C 441.08984,54.792969 441.29687,54.03125 441.41797,53.570312 C 441.625,52.8125 441.77734,52.289062 441.94922,51.621094 C 442.03516,51.351562 442.03516,51.320312 442.15625,51.195312"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ </g>+ <g+ id="g250"+ clip-rule="nonzero"+ clip-path="url(#clip8)">+ <path+ id="path252"+ d="M 410.79297,72.984375 C 410.79297,72.941406 410.79297,72.910156 410.51953,72.664062 C 408.5,70.832031 407.98437,68.078125 407.98437,65.855469 C 407.98437,63.320312 408.59766,60.789062 410.58203,58.972656 C 410.79297,58.796875 410.79297,58.769531 410.79297,58.722656 C 410.79297,58.621094 410.72656,58.574219 410.63281,58.574219 C 410.46875,58.574219 409.01562,59.566406 408.0625,61.417969 C 407.23828,63.015625 407.04297,64.632812 407.04297,65.855469 C 407.04297,66.988281 407.22266,68.75 408.10938,70.394531 C 409.08203,72.183594 410.46875,73.128906 410.63281,73.128906 C 410.72656,73.128906 410.79297,73.085938 410.79297,72.984375"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path254"+ d="M 418.32812,66.117188 L 422.79687,66.117188 C 423.01953,66.117188 423.32422,66.117188 423.32422,65.832031 C 423.32422,65.546875 423.01953,65.546875 422.79687,65.546875 L 418.32812,65.546875 L 418.32812,61.484375 C 418.32812,61.28125 418.32812,61.007812 418.01562,61.007812 C 417.70312,61.007812 417.70312,61.28125 417.70312,61.484375 L 417.70312,65.546875 L 413.17969,65.546875 C 412.95312,65.546875 412.64453,65.546875 412.64453,65.832031 C 412.64453,66.117188 412.95312,66.117188 413.17969,66.117188 L 417.70312,66.117188 L 417.70312,70.214844 C 417.70312,70.417969 417.70312,70.695312 418.01562,70.695312 C 418.32812,70.695312 418.32812,70.417969 418.32812,70.214844"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path256"+ d="M 428.98437,60.171875 C 428.98437,59.820312 428.98437,59.789062 428.61328,59.789062 C 427.60938,60.722656 426.1875,60.722656 425.66797,60.722656 L 425.66797,61.167969 C 425.98828,61.167969 426.9375,61.167969 427.77734,60.800781 L 427.77734,68.335938 C 427.77734,68.859375 427.72656,69.035156 426.28125,69.035156 L 425.76562,69.035156 L 425.76562,69.480469 C 426.32812,69.4375 427.72266,69.4375 428.36719,69.4375 C 429.00781,69.4375 430.40625,69.4375 430.96875,69.480469 L 430.96875,69.035156 L 430.46094,69.035156 C 429.03125,69.035156 428.98437,68.875 428.98437,68.335938"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ <path+ id="path258"+ d="M 436.91016,65.851562 C 436.91016,64.71875 436.73047,62.957031 435.84375,61.3125 C 434.87891,59.523438 433.49219,58.574219 433.33203,58.574219 C 433.23437,58.574219 433.16797,58.636719 433.16797,58.722656 C 433.16797,58.765625 433.16797,58.796875 433.47656,59.058594 C 435.05078,60.5 435.96875,62.8125 435.96875,65.851562 C 435.96875,68.339844 435.375,70.902344 433.37891,72.734375 C 433.16797,72.910156 433.16797,72.941406 433.16797,72.984375 C 433.16797,73.070312 433.23437,73.128906 433.33203,73.128906 C 433.49219,73.128906 434.94141,72.140625 435.89453,70.292969 C 436.71484,68.691406 436.91016,67.074219 436.91016,65.851562"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />+ </g>+ <path+ id="path260"+ d="M 78.046875,52.5 L 108.14453,52.5"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path262"+ d="M 116.14453,52.5 L 108.14453,49.5 L 108.14453,55.5 L 116.14453,52.5 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ <g+ id="g264"+ style="fill:#000000;fill-opacity:1"+ transform="translate(11.486188,10.441989)">+ <use+ height="113"+ width="567"+ id="use266"+ y="46.5"+ x="39.48975"+ xlink:href="#glyph0-1" />+ <use+ height="113"+ width="567"+ id="use268"+ y="46.5"+ x="43.485748"+ xlink:href="#glyph0-2" />+ <use+ height="113"+ width="567"+ id="use270"+ y="46.5"+ x="53.493752"+ xlink:href="#glyph0-3" />+ <use+ height="113"+ width="567"+ id="use272"+ y="46.5"+ x="63.501751"+ xlink:href="#glyph0-4" />+ </g>+ <g+ id="g274"+ style="fill:#000000;fill-opacity:1">+ <use+ height="113"+ width="567"+ id="use288"+ y="76"+ x="56.893162"+ xlink:href="#glyph1-7" />+ </g>+ <g+ id="g302"+ style="fill:#000000;fill-opacity:1"+ transform="translate(2.0883978,14.618785)">+ <use+ height="113"+ width="567"+ id="use304"+ y="46.5"+ x="494.9834"+ xlink:href="#glyph0-5" />+ <use+ height="113"+ width="567"+ id="use306"+ y="46.5"+ x="504.99139"+ xlink:href="#glyph0-6" />+ <use+ height="113"+ width="567"+ id="use308"+ y="46.5"+ x="514.99939"+ xlink:href="#glyph0-7" />+ <use+ height="113"+ width="567"+ id="use310"+ y="46.5"+ x="520.00342"+ xlink:href="#glyph0-3" />+ <use+ height="113"+ width="567"+ id="use312"+ y="46.5"+ x="530.01141"+ xlink:href="#glyph0-4" />+ </g>+ <g+ id="g342"+ style="fill:#000000;fill-opacity:1">+ <use+ height="113"+ width="567"+ id="use344"+ y="26"+ x="242.72617"+ xlink:href="#glyph2-1" />+ <use+ height="113"+ width="567"+ id="use346"+ y="26"+ x="254.73216"+ xlink:href="#glyph2-2" />+ <use+ height="113"+ width="567"+ id="use348"+ y="26"+ x="264.74017"+ xlink:href="#glyph2-2" />+ <use+ height="113"+ width="567"+ id="use350"+ y="26"+ x="274.74817"+ xlink:href="#glyph2-3" />+ <use+ height="113"+ width="567"+ id="use352"+ y="26"+ x="285.74615"+ xlink:href="#glyph2-4" />+ <use+ height="113"+ width="567"+ id="use354"+ y="26"+ x="295.75415"+ xlink:href="#glyph2-5" />+ <use+ height="113"+ width="567"+ id="use356"+ y="26"+ x="305.76215"+ xlink:href="#glyph2-6" />+ </g>+ <path+ id="path358"+ d="M 456.49219,56.25 L 486.59375,56.25"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path360"+ d="M 494.59375,56.25 L 486.59375,53.25 L 486.59375,59.25 L 494.59375,56.25 z"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+</svg>
+ doc/www/files/tutorial/figures/VHDLTree.svg view
@@ -0,0 +1,853 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->+<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="250"+ height="330.17001"+ id="svg2"+ sodipodi:version="0.32"+ inkscape:version="0.46"+ sodipodi:docname="VHDLTree.svg"+ inkscape:output_extension="org.inkscape.output.svg.inkscape"+ version="1.0">+ <defs+ id="defs4">+ <inkscape:perspective+ sodipodi:type="inkscape:persp3d"+ inkscape:vp_x="0 : 526.18109 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_z="744.09448 : 526.18109 : 1"+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"+ id="perspective10" />+ <mask+ id="mask2654"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2656"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2648"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2650"+ d="M 224.7937,339.9427 L 280.85101,339.9427 L 280.85101,395.99998 L 224.7937,395.99998 L 224.7937,339.9427 z" />+ </clipPath>+ <mask+ id="mask2626"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2628"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAAAAADmVT4XAAAAAXNCSVQI5gpbmQAAAtZJREFUeJzt27tuE0EUBuB/bnuxoxT0SPS0FBRJDC0PQMVT0PMIKXgBiO2Ot6CDnj49BRJREq29c6GwKDyzq52xMxMkzinX8p5vzuzOXrSHwQvGOBecMwbm/zQeDnDOWWuts3Dx/wMgg/xCKCV3hPj8Ds4Zo7UxJlHgARi4qOqfKXv4G/r3t48/tlttjE0ReMNkXNTN/PoQAAD3/f111/dJAu6DhGpODswP9vLr23mtBE84fIJjgMtmdigAUJenSwYgvgZBBbhQzeEAyA9nsyalBvsAxsC4rI8AoLo6n6XMgl8BMC78aUkUrC5SBMEUgPEAlRYiSRBWIGkJHN7n+qKtZaTgyNGOCRZtEykYAhxbAYCvX8UKslQA4KtYQSZAvCAXAHz1OkqQDQC+jBLkA0QKMgLiBDkBUYKsgBhBXkCEIDMAfDmxHuQGTK5I2QFTgvyACUEBAPhq0Y7eJ5YAgK8X7dg9UhEA+HoxdpdWBgC+HLtPLASA/Hw+q5UIn3hLAVBdPW8rEQqKAVB9OWkqEeQrB8Dpp3ktg9cOBQF48WygBCUB1btWCb8EJQE4ayvpn4lFAU/rRwaogZWgKICp8KJYFAApuP/wXRawe/u4JygLGHj5WRrweBejHSDcVBaAcBZKAx55Cgbi/zsGCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAFiAGktkykxsOd/rwLOZa2A83fuAxyctdkA1gbDCytgjc4G0GE36H5rnwOc1ZtsgI22/iz4vYXOmr578+R0XsmEvt/JcE5v725+dWFDbAjQ3b3C9laJB8wPONN3tzf3nZ4EmL4T6O9qGXz7eEx6OKs33f1t15sJgGU9g9koGX6EfVxYo/uu2/T+OeYP8qDW74hwzlqj+94YbyUIshzU/B4B2BGs9VeiMAsDZ8Gnpw8hgHMDvfkDadjI9gcgDFyO/gA1VNQCGpJRRQAAAABJRU5ErkJggg=="+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2620"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2622"+ d="M 210.011,0.9890137 L 312.022,0.9890137 L 312.022,103.00001 L 210.011,103.00001 L 210.011,0.9890137 z" />+ </clipPath>+ <mask+ id="mask2598"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2600"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAAAAADmVT4XAAAAAXNCSVQI5gpbmQAAAtZJREFUeJzt27tuE0EUBuB/bnuxoxT0SPS0FBRJDC0PQMVT0PMIKXgBiO2Ot6CDnj49BRJREq29c6GwKDyzq52xMxMkzinX8p5vzuzOXrSHwQvGOBecMwbm/zQeDnDOWWuts3Dx/wMgg/xCKCV3hPj8Ds4Zo7UxJlHgARi4qOqfKXv4G/r3t48/tlttjE0ReMNkXNTN/PoQAAD3/f111/dJAu6DhGpODswP9vLr23mtBE84fIJjgMtmdigAUJenSwYgvgZBBbhQzeEAyA9nsyalBvsAxsC4rI8AoLo6n6XMgl8BMC78aUkUrC5SBMEUgPEAlRYiSRBWIGkJHN7n+qKtZaTgyNGOCRZtEykYAhxbAYCvX8UKslQA4KtYQSZAvCAXAHz1OkqQDQC+jBLkA0QKMgLiBDkBUYKsgBhBXkCEIDMAfDmxHuQGTK5I2QFTgvyACUEBAPhq0Y7eJ5YAgK8X7dg9UhEA+HoxdpdWBgC+HLtPLASA/Hw+q5UIn3hLAVBdPW8rEQqKAVB9OWkqEeQrB8Dpp3ktg9cOBQF48WygBCUB1btWCb8EJQE4ayvpn4lFAU/rRwaogZWgKICp8KJYFAApuP/wXRawe/u4JygLGHj5WRrweBejHSDcVBaAcBZKAx55Cgbi/zsGCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAFiAGktkykxsOd/rwLOZa2A83fuAxyctdkA1gbDCytgjc4G0GE36H5rnwOc1ZtsgI22/iz4vYXOmr578+R0XsmEvt/JcE5v725+dWFDbAjQ3b3C9laJB8wPONN3tzf3nZ4EmL4T6O9qGXz7eEx6OKs33f1t15sJgGU9g9koGX6EfVxYo/uu2/T+OeYP8qDW74hwzlqj+94YbyUIshzU/B4B2BGs9VeiMAsDZ8Gnpw8hgHMDvfkDadjI9gcgDFyO/gA1VNQCGpJRRQAAAABJRU5ErkJggg=="+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2592"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2594"+ d="M 108,0.9890137 L 210.011,0.9890137 L 210.011,103.00001 L 108,103.00001 L 108,0.9890137 z" />+ </clipPath>+ <mask+ id="mask2564"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2566"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAAAAADmVT4XAAAAAXNCSVQI5gpbmQAAAtZJREFUeJzt27tuE0EUBuB/bnuxoxT0SPS0FBRJDC0PQMVT0PMIKXgBiO2Ot6CDnj49BRJREq29c6GwKDyzq52xMxMkzinX8p5vzuzOXrSHwQvGOBecMwbm/zQeDnDOWWuts3Dx/wMgg/xCKCV3hPj8Ds4Zo7UxJlHgARi4qOqfKXv4G/r3t48/tlttjE0ReMNkXNTN/PoQAAD3/f111/dJAu6DhGpODswP9vLr23mtBE84fIJjgMtmdigAUJenSwYgvgZBBbhQzeEAyA9nsyalBvsAxsC4rI8AoLo6n6XMgl8BMC78aUkUrC5SBMEUgPEAlRYiSRBWIGkJHN7n+qKtZaTgyNGOCRZtEykYAhxbAYCvX8UKslQA4KtYQSZAvCAXAHz1OkqQDQC+jBLkA0QKMgLiBDkBUYKsgBhBXkCEIDMAfDmxHuQGTK5I2QFTgvyACUEBAPhq0Y7eJ5YAgK8X7dg9UhEA+HoxdpdWBgC+HLtPLASA/Hw+q5UIn3hLAVBdPW8rEQqKAVB9OWkqEeQrB8Dpp3ktg9cOBQF48WygBCUB1btWCb8EJQE4ayvpn4lFAU/rRwaogZWgKICp8KJYFAApuP/wXRawe/u4JygLGHj5WRrweBejHSDcVBaAcBZKAx55Cgbi/zsGCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAFiAGktkykxsOd/rwLOZa2A83fuAxyctdkA1gbDCytgjc4G0GE36H5rnwOc1ZtsgI22/iz4vYXOmr578+R0XsmEvt/JcE5v725+dWFDbAjQ3b3C9laJB8wPONN3tzf3nZ4EmL4T6O9qGXz7eEx6OKs33f1t15sJgGU9g9koGX6EfVxYo/uu2/T+OeYP8qDW74hwzlqj+94YbyUIshzU/B4B2BGs9VeiMAsDZ8Gnpw8hgHMDvfkDadjI9gcgDFyO/gA1VNQCGpJRRQAAAABJRU5ErkJggg=="+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2558"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2560"+ d="M 0.6729736,0.9890137 L 102.68407,0.9890137 L 102.68407,103.00011 L 0.6729736,103.00011 L 0.6729736,0.9890137 z" />+ </clipPath>+ <mask+ id="mask2536"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2538"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2530"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2532"+ d="M 21.55225,127.9999 L 88.7259,127.9999 L 88.7259,195.17355 L 21.55225,195.17355 L 21.55225,127.9999 z" />+ </clipPath>+ <mask+ id="mask2504"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2506"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2498"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2500"+ d="M 172.5966,127.9999 L 239.77025,127.9999 L 239.77025,195.17355 L 172.5966,195.17355 L 172.5966,127.9999 z" />+ </clipPath>+ <mask+ id="mask2480"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2482"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2474"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2476"+ d="M 108,213.8264 L 175.17365,213.8264 L 175.17365,281.00005 L 108,281.00005 L 108,213.8264 z" />+ </clipPath>+ <mask+ id="mask2450"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2452"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAAAAADmVT4XAAAAAXNCSVQI5gpbmQAAAtZJREFUeJzt27tuE0EUBuB/bnuxoxT0SPS0FBRJDC0PQMVT0PMIKXgBiO2Ot6CDnj49BRJREq29c6GwKDyzq52xMxMkzinX8p5vzuzOXrSHwQvGOBecMwbm/zQeDnDOWWuts3Dx/wMgg/xCKCV3hPj8Ds4Zo7UxJlHgARi4qOqfKXv4G/r3t48/tlttjE0ReMNkXNTN/PoQAAD3/f111/dJAu6DhGpODswP9vLr23mtBE84fIJjgMtmdigAUJenSwYgvgZBBbhQzeEAyA9nsyalBvsAxsC4rI8AoLo6n6XMgl8BMC78aUkUrC5SBMEUgPEAlRYiSRBWIGkJHN7n+qKtZaTgyNGOCRZtEykYAhxbAYCvX8UKslQA4KtYQSZAvCAXAHz1OkqQDQC+jBLkA0QKMgLiBDkBUYKsgBhBXkCEIDMAfDmxHuQGTK5I2QFTgvyACUEBAPhq0Y7eJ5YAgK8X7dg9UhEA+HoxdpdWBgC+HLtPLASA/Hw+q5UIn3hLAVBdPW8rEQqKAVB9OWkqEeQrB8Dpp3ktg9cOBQF48WygBCUB1btWCb8EJQE4ayvpn4lFAU/rRwaogZWgKICp8KJYFAApuP/wXRawe/u4JygLGHj5WRrweBejHSDcVBaAcBZKAx55Cgbi/zsGCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAFiAGktkykxsOd/rwLOZa2A83fuAxyctdkA1gbDCytgjc4G0GE36H5rnwOc1ZtsgI22/iz4vYXOmr578+R0XsmEvt/JcE5v725+dWFDbAjQ3b3C9laJB8wPONN3tzf3nZ4EmL4T6O9qGXz7eEx6OKs33f1t15sJgGU9g9koGX6EfVxYo/uu2/T+OeYP8qDW74hwzlqj+94YbyUIshzU/B4B2BGs9VeiMAsDZ8Gnpw8hgHMDvfkDadjI9gcgDFyO/gA1VNQCGpJRRQAAAABJRU5ErkJggg=="+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2444"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2446"+ d="M 211.3336,237.9982 L 288.67753,237.9982 L 288.67753,315.34207 L 211.3336,315.34207 L 211.3336,237.9982 z" />+ </clipPath>+ <mask+ id="mask2426"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image2428"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2420"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2422"+ d="M 108,299.6528 L 175.17365,299.6528 L 175.17365,366.82645 L 108,366.82645 L 108,299.6528 z" />+ </clipPath>+ <inkscape:perspective+ id="perspective2410"+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"+ inkscape:vp_z="744.09448 : 526.18109 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_x="0 : 526.18109 : 1"+ sodipodi:type="inkscape:persp3d" />+ <mask+ id="mask3228"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3230"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath3222"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path3224"+ d="M 224.7937,339.9427 L 280.85101,339.9427 L 280.85101,395.99998 L 224.7937,395.99998 L 224.7937,339.9427 z" />+ </clipPath>+ <mask+ id="mask3200"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3202"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAAAAADmVT4XAAAAAXNCSVQI5gpbmQAAAtZJREFUeJzt27tuE0EUBuB/bnuxoxT0SPS0FBRJDC0PQMVT0PMIKXgBiO2Ot6CDnj49BRJREq29c6GwKDyzq52xMxMkzinX8p5vzuzOXrSHwQvGOBecMwbm/zQeDnDOWWuts3Dx/wMgg/xCKCV3hPj8Ds4Zo7UxJlHgARi4qOqfKXv4G/r3t48/tlttjE0ReMNkXNTN/PoQAAD3/f111/dJAu6DhGpODswP9vLr23mtBE84fIJjgMtmdigAUJenSwYgvgZBBbhQzeEAyA9nsyalBvsAxsC4rI8AoLo6n6XMgl8BMC78aUkUrC5SBMEUgPEAlRYiSRBWIGkJHN7n+qKtZaTgyNGOCRZtEykYAhxbAYCvX8UKslQA4KtYQSZAvCAXAHz1OkqQDQC+jBLkA0QKMgLiBDkBUYKsgBhBXkCEIDMAfDmxHuQGTK5I2QFTgvyACUEBAPhq0Y7eJ5YAgK8X7dg9UhEA+HoxdpdWBgC+HLtPLASA/Hw+q5UIn3hLAVBdPW8rEQqKAVB9OWkqEeQrB8Dpp3ktg9cOBQF48WygBCUB1btWCb8EJQE4ayvpn4lFAU/rRwaogZWgKICp8KJYFAApuP/wXRawe/u4JygLGHj5WRrweBejHSDcVBaAcBZKAx55Cgbi/zsGCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAFiAGktkykxsOd/rwLOZa2A83fuAxyctdkA1gbDCytgjc4G0GE36H5rnwOc1ZtsgI22/iz4vYXOmr578+R0XsmEvt/JcE5v725+dWFDbAjQ3b3C9laJB8wPONN3tzf3nZ4EmL4T6O9qGXz7eEx6OKs33f1t15sJgGU9g9koGX6EfVxYo/uu2/T+OeYP8qDW74hwzlqj+94YbyUIshzU/B4B2BGs9VeiMAsDZ8Gnpw8hgHMDvfkDadjI9gcgDFyO/gA1VNQCGpJRRQAAAABJRU5ErkJggg=="+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath3194"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path3196"+ d="M 210.011,0.9890137 L 312.022,0.9890137 L 312.022,103.00001 L 210.011,103.00001 L 210.011,0.9890137 z" />+ </clipPath>+ <mask+ id="mask3172"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3174"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAAAAADmVT4XAAAAAXNCSVQI5gpbmQAAAtZJREFUeJzt27tuE0EUBuB/bnuxoxT0SPS0FBRJDC0PQMVT0PMIKXgBiO2Ot6CDnj49BRJREq29c6GwKDyzq52xMxMkzinX8p5vzuzOXrSHwQvGOBecMwbm/zQeDnDOWWuts3Dx/wMgg/xCKCV3hPj8Ds4Zo7UxJlHgARi4qOqfKXv4G/r3t48/tlttjE0ReMNkXNTN/PoQAAD3/f111/dJAu6DhGpODswP9vLr23mtBE84fIJjgMtmdigAUJenSwYgvgZBBbhQzeEAyA9nsyalBvsAxsC4rI8AoLo6n6XMgl8BMC78aUkUrC5SBMEUgPEAlRYiSRBWIGkJHN7n+qKtZaTgyNGOCRZtEykYAhxbAYCvX8UKslQA4KtYQSZAvCAXAHz1OkqQDQC+jBLkA0QKMgLiBDkBUYKsgBhBXkCEIDMAfDmxHuQGTK5I2QFTgvyACUEBAPhq0Y7eJ5YAgK8X7dg9UhEA+HoxdpdWBgC+HLtPLASA/Hw+q5UIn3hLAVBdPW8rEQqKAVB9OWkqEeQrB8Dpp3ktg9cOBQF48WygBCUB1btWCb8EJQE4ayvpn4lFAU/rRwaogZWgKICp8KJYFAApuP/wXRawe/u4JygLGHj5WRrweBejHSDcVBaAcBZKAx55Cgbi/zsGCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAFiAGktkykxsOd/rwLOZa2A83fuAxyctdkA1gbDCytgjc4G0GE36H5rnwOc1ZtsgI22/iz4vYXOmr578+R0XsmEvt/JcE5v725+dWFDbAjQ3b3C9laJB8wPONN3tzf3nZ4EmL4T6O9qGXz7eEx6OKs33f1t15sJgGU9g9koGX6EfVxYo/uu2/T+OeYP8qDW74hwzlqj+94YbyUIshzU/B4B2BGs9VeiMAsDZ8Gnpw8hgHMDvfkDadjI9gcgDFyO/gA1VNQCGpJRRQAAAABJRU5ErkJggg=="+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath3166"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path3168"+ d="M 108,0.9890137 L 210.011,0.9890137 L 210.011,103.00001 L 108,103.00001 L 108,0.9890137 z" />+ </clipPath>+ <mask+ id="mask3138"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3140"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAAAAADmVT4XAAAAAXNCSVQI5gpbmQAAAtZJREFUeJzt27tuE0EUBuB/bnuxoxT0SPS0FBRJDC0PQMVT0PMIKXgBiO2Ot6CDnj49BRJREq29c6GwKDyzq52xMxMkzinX8p5vzuzOXrSHwQvGOBecMwbm/zQeDnDOWWuts3Dx/wMgg/xCKCV3hPj8Ds4Zo7UxJlHgARi4qOqfKXv4G/r3t48/tlttjE0ReMNkXNTN/PoQAAD3/f111/dJAu6DhGpODswP9vLr23mtBE84fIJjgMtmdigAUJenSwYgvgZBBbhQzeEAyA9nsyalBvsAxsC4rI8AoLo6n6XMgl8BMC78aUkUrC5SBMEUgPEAlRYiSRBWIGkJHN7n+qKtZaTgyNGOCRZtEykYAhxbAYCvX8UKslQA4KtYQSZAvCAXAHz1OkqQDQC+jBLkA0QKMgLiBDkBUYKsgBhBXkCEIDMAfDmxHuQGTK5I2QFTgvyACUEBAPhq0Y7eJ5YAgK8X7dg9UhEA+HoxdpdWBgC+HLtPLASA/Hw+q5UIn3hLAVBdPW8rEQqKAVB9OWkqEeQrB8Dpp3ktg9cOBQF48WygBCUB1btWCb8EJQE4ayvpn4lFAU/rRwaogZWgKICp8KJYFAApuP/wXRawe/u4JygLGHj5WRrweBejHSDcVBaAcBZKAx55Cgbi/zsGCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAFiAGktkykxsOd/rwLOZa2A83fuAxyctdkA1gbDCytgjc4G0GE36H5rnwOc1ZtsgI22/iz4vYXOmr578+R0XsmEvt/JcE5v725+dWFDbAjQ3b3C9laJB8wPONN3tzf3nZ4EmL4T6O9qGXz7eEx6OKs33f1t15sJgGU9g9koGX6EfVxYo/uu2/T+OeYP8qDW74hwzlqj+94YbyUIshzU/B4B2BGs9VeiMAsDZ8Gnpw8hgHMDvfkDadjI9gcgDFyO/gA1VNQCGpJRRQAAAABJRU5ErkJggg=="+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath3132"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path3134"+ d="M 0.6729736,0.9890137 L 102.68407,0.9890137 L 102.68407,103.00011 L 0.6729736,103.00011 L 0.6729736,0.9890137 z" />+ </clipPath>+ <mask+ id="mask3110"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3112"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath3104"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path3106"+ d="M 21.55225,127.9999 L 88.7259,127.9999 L 88.7259,195.17355 L 21.55225,195.17355 L 21.55225,127.9999 z" />+ </clipPath>+ <mask+ id="mask3078"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3080"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath3072"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path3074"+ d="M 172.5966,127.9999 L 239.77025,127.9999 L 239.77025,195.17355 L 172.5966,195.17355 L 172.5966,127.9999 z" />+ </clipPath>+ <mask+ id="mask3054"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3056"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath3048"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path3050"+ d="M 108,213.8264 L 175.17365,213.8264 L 175.17365,281.00005 L 108,281.00005 L 108,213.8264 z" />+ </clipPath>+ <mask+ id="mask3024"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3026"+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAAAAADmVT4XAAAAAXNCSVQI5gpbmQAAAtZJREFUeJzt27tuE0EUBuB/bnuxoxT0SPS0FBRJDC0PQMVT0PMIKXgBiO2Ot6CDnj49BRJREq29c6GwKDyzq52xMxMkzinX8p5vzuzOXrSHwQvGOBecMwbm/zQeDnDOWWuts3Dx/wMgg/xCKCV3hPj8Ds4Zo7UxJlHgARi4qOqfKXv4G/r3t48/tlttjE0ReMNkXNTN/PoQAAD3/f111/dJAu6DhGpODswP9vLr23mtBE84fIJjgMtmdigAUJenSwYgvgZBBbhQzeEAyA9nsyalBvsAxsC4rI8AoLo6n6XMgl8BMC78aUkUrC5SBMEUgPEAlRYiSRBWIGkJHN7n+qKtZaTgyNGOCRZtEykYAhxbAYCvX8UKslQA4KtYQSZAvCAXAHz1OkqQDQC+jBLkA0QKMgLiBDkBUYKsgBhBXkCEIDMAfDmxHuQGTK5I2QFTgvyACUEBAPhq0Y7eJ5YAgK8X7dg9UhEA+HoxdpdWBgC+HLtPLASA/Hw+q5UIn3hLAVBdPW8rEQqKAVB9OWkqEeQrB8Dpp3ktg9cOBQF48WygBCUB1btWCb8EJQE4ayvpn4lFAU/rRwaogZWgKICp8KJYFAApuP/wXRawe/u4JygLGHj5WRrweBejHSDcVBaAcBZKAx55Cgbi/zsGCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAFiAGktkykxsOd/rwLOZa2A83fuAxyctdkA1gbDCytgjc4G0GE36H5rnwOc1ZtsgI22/iz4vYXOmr578+R0XsmEvt/JcE5v725+dWFDbAjQ3b3C9laJB8wPONN3tzf3nZ4EmL4T6O9qGXz7eEx6OKs33f1t15sJgGU9g9koGX6EfVxYo/uu2/T+OeYP8qDW74hwzlqj+94YbyUIshzU/B4B2BGs9VeiMAsDZ8Gnpw8hgHMDvfkDadjI9gcgDFyO/gA1VNQCGpJRRQAAAABJRU5ErkJggg=="+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath3018"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path3020"+ d="M 211.3336,237.9982 L 288.67753,237.9982 L 288.67753,315.34207 L 211.3336,315.34207 L 211.3336,237.9982 z" />+ </clipPath>+ <mask+ id="mask3000"+ height="1"+ width="1"+ y="0"+ x="0"+ maskUnits="userSpaceOnUse">+ <image+ id="image3002"+ xlink:href="data:image/png;base64,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"+ height="1"+ width="1" />+ </mask>+ <clipPath+ id="clipPath2994"+ clipPathUnits="userSpaceOnUse">+ <path+ id="path2996"+ d="M 108,299.6528 L 175.17365,299.6528 L 175.17365,366.82645 L 108,366.82645 L 108,299.6528 z" />+ </clipPath>+ <inkscape:perspective+ id="perspective2984"+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"+ inkscape:vp_z="744.09448 : 526.18109 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_x="0 : 526.18109 : 1"+ sodipodi:type="inkscape:persp3d" />+ </defs>+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="0.35"+ inkscape:cx="23.267845"+ inkscape:cy="520"+ inkscape:document-units="px"+ inkscape:current-layer="layer1"+ showgrid="false"+ inkscape:window-width="640"+ inkscape:window-height="701"+ inkscape:window-x="691"+ inkscape:window-y="193"+ units="px" />+ <metadata+ id="metadata7">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Capa 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(-311.12116,-32.062063)">+ <g+ transform="matrix(0.7870632,0,0,-0.7870632,313.78009,357.59633)"+ inkscape:label="VHDLTree"+ id="g2986">+ <g+ id="g2988" />+ <g+ id="g2990">+ <g+ clip-path="url(#clipPath2994)"+ id="g2992">+ <g+ transform="matrix(67.17364,0,0,67.17363,108,299.6528)"+ id="g2998">+ <image+ id="image3004"+ mask="url(#mask3000)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3006">+ <g+ transform="matrix(1,0,0,-1,141.5868,333.2396)"+ id="g3008">+ <text+ id="text3010"+ transform="translate(-25.2041,4)">+ <tspan+ id="tspan3012"+ sodipodi:role="line"+ y="0"+ x="0 7.1999998 14.4 21.6 28.799999 36 43.200001"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">addFour</tspan>+ </text>+ </g>+ </g>+ <g+ id="g3014">+ <g+ clip-path="url(#clipPath3018)"+ id="g3016">+ <g+ transform="matrix(77.34395,0,0,77.34389,211.3336,237.9982)"+ id="g3022">+ <image+ id="image3028"+ mask="url(#mask3024)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3030">+ <g+ transform="matrix(1,0,0,-1,250.0055,276.6701)"+ id="g3032">+ <text+ id="text3034"+ transform="translate(-32.40527,-3)">+ <tspan+ id="tspan3036"+ sodipodi:role="line"+ y="0"+ x="0 5.4000001 10.8 16.200001 21.6 27 32.400002 37.799999 43.200001 48.599998 54 59.400002"+ style="font-size:9px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">forsyde_lib.</tspan>+ </text>+ </g>+ <g+ transform="matrix(1,0,0,-1,250.0055,276.6701)"+ id="g3038">+ <text+ id="text3040"+ transform="translate(-8.101318,9)">+ <tspan+ id="tspan3042"+ sodipodi:role="line"+ y="0"+ x="0 5.4000001 10.8"+ style="font-size:9px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">vhd</tspan>+ </text>+ </g>+ </g>+ <g+ id="g3044">+ <g+ clip-path="url(#clipPath3048)"+ id="g3046">+ <g+ transform="matrix(67.17364,0,0,67.17363,108,213.8264)"+ id="g3052">+ <image+ id="image3058"+ mask="url(#mask3054)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3060">+ <g+ transform="matrix(1,0,0,-1,141.5868,247.4132)"+ id="g3062">+ <text+ id="text3064"+ transform="translate(-14.40234,4)">+ <tspan+ id="tspan3066"+ sodipodi:role="line"+ y="0"+ x="0 7.1999998 14.4 21.6"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">VHDL</tspan>+ </text>+ </g>+ </g>+ <g+ id="g3068">+ <g+ clip-path="url(#clipPath3072)"+ id="g3070">+ <g+ transform="matrix(67.17364,0,0,67.17363,172.5966,127.9999)"+ id="g3076">+ <image+ id="image3082"+ mask="url(#mask3078)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3084">+ <g+ transform="matrix(1,0,0,-1,206.1835,161.5868)"+ id="g3086">+ <text+ id="text3088"+ transform="translate(-14.40234,4)">+ <tspan+ id="tspan3090"+ sodipodi:role="line"+ y="0"+ x="0 7.1999998 14.4 21.6"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">work</tspan>+ </text>+ </g>+ <g+ transform="matrix(1,0,0,-1,-217.5,470.5)"+ id="g3092">+ <path+ id="path3094"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"+ d="M 359.5868,171.3472 L 359.5868,190" />+ </g>+ <g+ transform="matrix(1,0,0,-1,-217.5,470.5)"+ id="g3096">+ <path+ id="path3098"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"+ d="M 384.8657,257.1736 L 398.9046,275.8264" />+ </g>+ </g>+ <g+ id="g3100">+ <g+ clip-path="url(#clipPath3104)"+ id="g3102">+ <g+ transform="matrix(67.17364,0,0,67.17363,21.55225,127.9999)"+ id="g3108">+ <image+ id="image3114"+ mask="url(#mask3110)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3116">+ <g+ transform="matrix(1,0,0,-1,55.13907,161.5868)"+ id="g3118">+ <text+ id="text3120"+ transform="translate(-10.80176,4)">+ <tspan+ id="tspan3122"+ sodipodi:role="line"+ y="0"+ x="0 7.1999998 14.4"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">lib</tspan>+ </text>+ </g>+ <g+ transform="matrix(1,0,0,-1,-217.5,470.5)"+ id="g3124">+ <path+ id="path3126"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"+ d="M 326,256.9323 L 306.7259,276.0678" />+ </g>+ </g>+ <g+ id="g3128">+ <g+ clip-path="url(#clipPath3132)"+ id="g3130">+ <g+ transform="matrix(102.0111,0,0,102.0111,0.6729889,0.9890137)"+ id="g3136">+ <image+ id="image3142"+ mask="url(#mask3138)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3144">+ <g+ transform="matrix(1,0,0,-1,51.67853,51.99457)"+ id="g3146">+ <text+ id="text3148"+ transform="translate(-43.20703,-4)">+ <tspan+ id="tspan3150"+ sodipodi:role="line"+ y="0"+ x="0 7.1999998 14.4 21.6 28.799999 36 43.200001 50.400002 57.599998 64.800003 72 79.199997"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">addFour_lib.</tspan>+ </text>+ </g>+ <g+ transform="matrix(1,0,0,-1,51.67853,51.99457)"+ id="g3152">+ <text+ id="text3154"+ transform="translate(-10.80176,12)">+ <tspan+ id="tspan3156"+ sodipodi:role="line"+ y="0"+ x="0 7.1999998 14.4"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">vhd</tspan>+ </text>+ </g>+ <g+ transform="matrix(1,0,0,-1,-217.5,470.5)"+ id="g3158">+ <path+ id="path3160"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"+ d="M 272.0785,343.0001 L 271.2891,367.9999" />+ </g>+ </g>+ <g+ id="g3162">+ <g+ clip-path="url(#clipPath3166)"+ id="g3164">+ <g+ transform="matrix(102.011,0,0,102.011,108,0.9890137)"+ id="g3170">+ <image+ id="image3176"+ mask="url(#mask3172)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3178">+ <g+ transform="matrix(1,0,0,-1,159.0055,51.99451)"+ id="g3180">+ <text+ id="text3182"+ transform="translate(-39.60645,4)">+ <tspan+ id="tspan3184"+ sodipodi:role="line"+ y="0"+ x="0 7.1999998 14.4 21.6 28.799999 36 43.200001 50.400002 57.599998 64.800003 72"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">addFour.vhd</tspan>+ </text>+ </g>+ <g+ transform="matrix(1,0,0,-1,-217.5,470.5)"+ id="g3186">+ <path+ id="path3188"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"+ d="M 409.7248,343.0001 L 398.9626,368" />+ </g>+ </g>+ <g+ id="g3190">+ <g+ clip-path="url(#clipPath3194)"+ id="g3192">+ <g+ transform="matrix(102.011,0,0,102.011,210.011,0.9890137)"+ id="g3198">+ <image+ id="image3204"+ mask="url(#mask3200)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3206">+ <g+ transform="matrix(1,0,0,-1,261.0165,51.99451)"+ id="g3208">+ <text+ id="text3210"+ transform="translate(-32.40527,4)">+ <tspan+ id="tspan3212"+ sodipodi:role="line"+ y="0"+ x="0 7.1999998 14.4 21.6 28.799999 36 43.200001 50.400002 57.599998"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">plus1.vhd</tspan>+ </text>+ </g>+ <g+ transform="matrix(1,0,0,-1,-217.5,470.5)"+ id="g3214">+ <path+ id="path3216"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"+ d="M 440.9882,343.0001 L 453.4966,368" />+ </g>+ </g>+ <g+ id="g3218">+ <g+ clip-path="url(#clipPath3222)"+ id="g3220">+ <g+ transform="matrix(56.05729,0,0,56.05728,224.7937,339.9427)"+ id="g3226">+ <image+ id="image3232"+ mask="url(#mask3228)"+ xlink:href="data:image/png;base64,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"+ transform="matrix(1,0,0,-1,0,1)"+ height="1"+ width="1" />+ </g>+ </g>+ </g>+ <g+ id="g3234">+ <g+ transform="matrix(1,0,0,-1,252.8224,367.9714)"+ id="g3236">+ <text+ id="text3238"+ transform="translate(-8.101318,3)">+ <tspan+ id="tspan3240"+ sodipodi:role="line"+ y="0"+ x="0 5.4000001 10.8"+ style="font-size:9px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Monaco;-inkscape-font-specification:Monaco">lib</tspan>+ </text>+ </g>+ <g+ transform="matrix(1,0,0,-1,-217.5,470.5)"+ id="g3242">+ <path+ id="path3244"+ style="fill:none;stroke:#545454;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:16, 10;stroke-dashoffset:0;stroke-opacity:1"+ d="M 438.9781,63.17365 L 502.6666,63.17365 C 511.5031,63.17365 518.6666,70.3371 518.6666,79.17365 L 518.6666,241.1736 C 518.6666,250.0102 511.5031,257.1736 502.6666,257.1736 L 438.9781,257.1736 C 430.1416,257.1736 422.9781,250.0102 422.9781,241.1736 C 422.9781,241.1736 422.9781,241.1736 422.9781,241.1736 L 422.9781,79.17365 C 422.9781,70.3371 430.1416,63.17365 438.9781,63.17365 z" />+ </g>+ <g+ transform="matrix(1,0,0,-1,-217.5,470.5)"+ id="g3246">+ <path+ id="path3248"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"+ d="M 469.9576,131.0573 L 469.1986,155.658" />+ </g>+ </g>+ </g>+ </g>+</svg>
+ doc/www/files/tutorial/figures/compflow.svg view
@@ -0,0 +1,521 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->+<svg+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ version="1.0"+ width="528.75"+ height="563.75"+ id="svg3388"+ xml:space="preserve"><defs+ id="defs3391"><mask+ id="mask3405"><image+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJsAAAAuCAAAAAAaDTSWAAAAAXNCSVQI5gpbmQAAAlBJREFUWIXtmcuOozAQRetlA0n+/0+7wWVX1SwMTfcoI42yaLPIXSCkROLoFq4XAG+9Ivz7Hv/xx19QfF26DhREQAQczRYQAbHz4UFGSIgEOJItwCM8fKeTjoZExMRI3bwhZBDhYW6O3kO7sxEzJ2YmwlHORYS7mVUz8C82BGKRlDILM41jc7NmShUBDGNnI2LJU55SSkw0is3daq3MCBHhccSUOE3zMk85CxONYXO3plqEINwd4PCNU8rL47bMOcs4tqa6rQJu3uEO3/I03x73Zc6JR8XUqm6ZoTVr/b2SnkGY87TcH/clZx7lm6lmBitamBAxekyRWGSal/v9NicZxdbqRmA6rbIniz2mxCnleb7d5pxGsVUlMF3PXCH9B2KWlKdpXnLiMWwmDKY5CR9v1VmzWCTnPGUZxUZoNYuctan71uGYJYmM8o3Ak/wom/2cYq/2RMQ8KPk6OHeEnSfgCceYs3AZkP/Tm+01vdle05vtNT1h89+neP5UAYgud3d3MxoEZ2YdYec56ukxf7WaRqGBtVabmbnHPtjLidaaauLwUX1IVVVt7YTb+zc3a1VLZrA2rrfcStHazPbIdd/crfZJwuvInvxz27RWc//yLcKttbJlBtehs8z6sW6lNfPYdw4R4WZa1t4TD50B14+1qJmf5zTclEXAdB0+O39uRe1bTN0qMUErF9g5bKvW2uEO3yqCt3KBXU3RUn/4hoYQZpfYcdXa9oMqABDoAOHerrIbtHM3CAEO4X6Vnar3FHLpXfT1d/jf7i/07eOt1/QHe6DDDHS7qT8AAAAASUVORK5CYII="+ width="1"+ height="1"+ id="image3407" /></mask><mask+ id="mask3413"><image+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATAAAABwCAAAAAC8v3P3AAAAAXNCSVQI5gpbmQAAA19JREFUeJzt3UFv4zgMhmFKlGQn6f//pzO2JZHcg+zYyXRQEIudKbDfcwgCtIfgBRXbl5AI4L8U3t+H3/zj/5U9X4ajTwgUAgUEe2dERmZke7TRJwSKIYYQKSDYKzNSMzXdkyUiohBCjJEjhzjGDHZGZmqiokHHydyDRWbOzBxjwIxdmJmqiDQR0mewQJFTyrlwYo4IdmGmIl1qbIFIgu3BYuRUpjLlnDlGBDuZqrTWmAOZmdpxJCPnab7NUymJY/zbn/IbUZVe65YimaoSHRPGOZfbx/02l5IQ7EK117ouiVR0FDsmrEzz/eNxm0tmHMmTSatrYepd+viuSuOmgrlMt8fH41YKY8JOKrUWJtnqxjGEYONIhsgpTfPt8bjPOSHYSXtbI0mdlrTfP+xHMnLOZZ7v97lkBDtpq5GkLuftQxp/iMwpl2mabyXz3/yE34wkJqklJz6+qc5HI06plDKVhGAniUFaSel8BBoTNooxp5wSJuwikub08sg4rpJhPH7HGJlx53pSUh5d9khGn8RBryfU+fcQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZwQzAnBnBDMCcGcEMwJwZw+CaZ//lN8V5+kSEQ2qKqqikQUO4nI6LJHOn7t/Nh31FtGryvpvXURUbV9OVsiOnr1XmtmU/w8/ElarbX2fhbbNzaoSG91K0zScR04aavrttXWRfaDNyZMVdrYR6MNS1QutLf157rW1kT1OWFmKr1va2HSijU9Vyq1Lj+Wdetd1PZldmamInVbxr4QLIK6MGl1XX4sWxXR8yppKpVTIqkLVo292FeN/Vy3KpcjqdIiR+obltm92ZfZrUttbRQ7JqwF0r5hXeKbfV3iVrf2MmFBApkIFnK+OxZyttb3y2QiIgtKZKodK1/fXVa+yrnylYyUTBVLhX9xLhXWcVeBtdVfeV9bjcXoX/h8MfrlPYK9sucLwJ/wD9Auw5AWAgG3AAAAAElFTkSuQmCC"+ width="1"+ height="1"+ id="image3415" /></mask><mask+ id="mask3421"><image+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXUAAABwCAAAAADELL8TAAAAAXNCSVQI5gpbmQAAA7RJREFUeJzt3c1u6zgMhmH+SErS9v7v9IxtSSRnESdNC8xmoIJAz/csArfownhBsI43IgL4O/D3a/6PP4T/L54fp0dkZmImRvWfEEQUERSP8vfIzCQszEKM6utFUHh4+KN7ISJiZhFRERESTPtqEeFh7m5+LpqzuqhqKaoijGlfLCLc3eacRP5ZnUlUa2m1FBXFklkrKNynzdFlEDkHndVFtNbLpbVaimDFrBXkbmOOQzoFxbM6sWi5XG+3S2tFBbO+VITbHP0oQu5xb3tWL+1y+3i73VotKqk3+fu4z3Ecm5K7mzrRY8OolnZ9+/i43lopGPW1wkY/NiWbc477+i50f4Sp7Xr7eH+/XWrBrK/l1vumZL0fqsIcj+qsWtr1+v7+dq0Ve30tn2NXsr7VovJlr4uW2q7Xt7drq4LqK0WMrmRjr59PKoWIzs1e2/VyvbWG6kuFF2UbrVZVPr+D3medmFVLqa1dWtXcu/x1TNhHrUWVv806y/2lQK0VG2atEPKiRVWe0al8ee3IzCp4YF/K2fXlBRdzEAkRMTMTE/N5AT/jsyzmOgOqZ0D1DKieAdUzoHoGVM+A6hlQPQOqZ0D1DKieAdUzoHoGVM+A6hlQPQOqZ0D1DKieAdUzoHoGVM+A6hlQPQOqZ0D1DKieAdUzoHoGVM+A6hlQPQOqZ0D1DKieAdUzoHoGVM+A6hlQPQOqZ0D1DKieAdUzoHoGVM+A6hlQPQOqZ0D1DKieAdUzoHoGVM+A6hlQPQOqZ0D1DKieAdUzoHoGVM+A6hlQPQOqZ0D1DKieAdUzoHoGVM+A6hlQPYMQUUQEBUWcF/AzPsuWxw8R5BERJuRZt/UrhZuZuUcEEVE8z2inCA83szkGE07aXMvmnDbNPDzOcS9EREERZnOOXjUCJ20uFT5672NMs2f2c9bdbI6+VyWbqL5UxOjHfvQxzOJcM/dZd7c5+t6UfOC08MV8jn3b9mNMe531iDCbfb8o+agFD5NrufW+/bPtfUzz1+pu90m30UrBqK8VNvqx/dn2Pu2c9kLnVu97Iet7LThAeTH3OY5j+7MfYzq97vXZhcn61ooK9vpSEW5z9GPfjj7dXqvbPCjmUUsRwcnVSwW525jjOPqcr3vd2e4DX1SUMOtLBYX7tDn6HGafT47BTkTu8+UAd1gmItzd5nz+M318N3UK9ykihAWzXER4mLs/n9fviZlJWJgF6+UnRFB4eDh9qU7ETMzEhEn/AUFEEfFo/jUyf/8FrBHPD4C/zL+gi9VA2BMMcAAAAABJRU5ErkJggg=="+ width="1"+ height="1"+ id="image3423" /></mask><clipPath+ id="clipPath3553"><path+ d="M 66,238 L 177.135,238 L 177.135,254 L 66,254 L 66,238 z"+ id="path3555" /></clipPath><clipPath+ id="clipPath3753"><path+ d="M 37.12,85 L 148.255,85 L 148.255,101 L 37.12,101 L 37.12,85 z"+ id="path3755" /></clipPath></defs><g+ transform="matrix(1.25,0,0,-1.25,0,563.75)"+ id="g3397"><g+ id="g3399" /><g+ transform="matrix(1,0,0,-1,278.5,436)"+ id="g3427"><text+ transform="translate(-66.36621,-2.5)"+ id="text3429"><tspan+ x="0 8.6639996 12.66 19.332001 26.004 29.34 36.012001 39.348 46.02 50.015999 56.688 62.688 69.360001 75.360001 81.360001 84.695999 88.031998 94.704002 101.376 107.376 110.712 113.376 120.048 126.72"+ y="0"+ id="tspan3431"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">Create process functions</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,278.5,436)"+ id="g3433" /><g+ transform="matrix(1,0,0,-1,278.5,436)"+ id="g3435"><text+ transform="translate(-43.20703,11.5)"+ id="text3437"><tspan+ x="0 7.1999998 14.4 21.6 28.799999 36 43.200001 50.400002 57.599998 64.800003 72 79.199997"+ y="0"+ id="tspan3439"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">(newProcFun)</tspan></text>+</g><path+ d="M 128.13203,386.14157 L 262.13203,386.14157 L 262.13203,411.14157 L 128.13203,411.14157 L 128.13203,386.14157 z"+ id="path3441"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3443"><path+ d="M 146.5,170 L 280.5,170 L 280.5,195 L 146.5,195 L 146.5,170 z"+ id="path3445"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><g+ transform="matrix(1,0,0,-1,184.21736,401.17921)"+ id="g3447"><text+ transform="translate(-52.96143,4.5)"+ id="text3449"><tspan+ x="0 6 12 18 24 30 36"+ y="0"+ id="tspan3451"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">ProcFun</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3459"><path+ d="M 211.5,135 L 212.2173,160.104"+ id="path3461"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 192.9457,414.3992 L 195.716,422.4816 L 189.7185,422.3103 L 192.9457,414.3992 z"+ id="path3463"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3465"><path+ d="M 212.4457,168.1008 L 215.216,160.0184 L 209.2185,160.1897 L 212.4457,168.1008 z"+ id="path3467"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3469"><path+ d="M 211.5,195 L 212.3429,248.1013"+ id="path3471"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 192.9698,326.3997 L 195.8425,334.4464 L 189.8433,334.3511 L 192.9698,326.3997 z"+ id="path3473"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3475"><path+ d="M 212.4698,256.1003 L 215.3425,248.0536 L 209.3433,248.1489 L 212.4698,256.1003 z"+ id="path3477"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><g+ transform="matrix(1,0,0,-1,306.5,356.5)"+ id="g3479"><text+ transform="translate(-61.35938,-9.5)"+ id="text3481"><tspan+ x="0 8.6639996 12.66 19.332001 26.004 29.34 36.012001 39.348 45.348 51.348 57.348 60.683998 67.356003 77.351997 80.688004 84.024002 90.695999 97.367996 103.368 106.704 109.368 116.04"+ y="0"+ id="tspan3483"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">Create system function</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,306.5,356.5)"+ id="g3485"><text+ transform="translate(-106.377,4.5)"+ id="text3487"><tspan+ x="0 3.9960001 10.668 17.34 23.34 29.34 32.004002 38.675999 41.34 47.34 50.675999 57.348 63.348 66.012001 72.683998 79.356003 82.692001 89.363998 93.360001 100.032 106.032 112.704 118.704 124.704 128.03999 134.03999 140.71201 147.384 153.384 156.72 160.716 167.388 173.388 176.724 183.396 187.392 193.392 196.728 199.392 202.728 209.39999"+ y="0"+ id="tspan3489"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">(possibly using process constructors i.e.</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,306.5,356.5)"+ id="g3491" /><g+ transform="matrix(1,0,0,-1,306.5,356.5)"+ id="g3493"><text+ transform="translate(-33.20801,18.5)"+ id="text3495"><tspan+ x="0 7.1999998 14.4 21.6 28.799999 36"+ y="0"+ id="tspan3497"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">mapSY </tspan></text>+</g><g+ transform="matrix(1,0,0,-1,306.5,356.5)"+ id="g3499"><text+ transform="translate(9.999023,18.5)"+ id="text3501"><tspan+ x="0 6.6719999 10.008"+ y="0"+ id="tspan3503"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">etc</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,306.5,356.5)"+ id="g3505"><text+ transform="translate(26.00684,18.5)"+ id="text3507"><tspan+ x="0"+ y="0"+ id="tspan3509"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">)</tspan></text>+</g><path+ d="M 52.5,233.5 L 335.5,233.5 L 335.5,324.5 L 52.5,324.5 L 52.5,233.5 z"+ id="path3511"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3513"><path+ d="M 72,258 L 355,258 L 355,349 L 72,349 L 72,258 z"+ id="path3515"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><g+ transform="matrix(1,0,0,-1,193.5,279.5)"+ id="g3517"><text+ transform="translate(-136.5,-31.5)"+ id="text3519"><tspan+ x="0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114"+ y="0"+ id="tspan3521"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">sysF :: Signal i1 -></tspan></text>+</g><g+ transform="matrix(1,0,0,-1,193.5,279.5)"+ id="g3523"><text+ transform="translate(-88.5,-19.5)"+ id="text3525"><tspan+ x="0 6 12 18 24 30 36 42 48 54 60 66"+ y="0"+ id="tspan3527"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">Signal i2 -></tspan></text>+</g><g+ transform="matrix(1,0,0,-1,193.5,279.5)"+ id="g3529"><text+ transform="translate(-88.5,-7.5)"+ id="text3531"><tspan+ x="0 6 12"+ y="0"+ id="tspan3533"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">...</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,193.5,279.5)"+ id="g3535"><text+ transform="translate(-88.5,4.5)"+ id="text3537"><tspan+ x="0 6 12 18 24 30 36 42 48 54 60 66 72"+ y="0"+ id="tspan3539"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">Signal in -> </tspan></text>+</g><g+ transform="matrix(1,0,0,-1,193.5,279.5)"+ id="g3541"><text+ transform="translate(-88.5,16.5)"+ id="text3543"><tspan+ x="0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 144 150 156 162 168 174 180 186 192 198 204 210 216"+ y="0"+ id="tspan3545"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">(Signal o1, Signal o2, .. Signal om)</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,193.5,279.5)"+ id="g3547" /><g+ id="g3549"><g+ clip-path="url(#clipPath3553)"+ id="g3551"><path+ d="M 74.63882,252.6742 C 74.71853,252.8602 74.71853,252.938 74.71853,252.9536 C 74.71853,253.1243 74.59219,253.2643 74.40475,253.2643 C 74.20219,253.2643 74.1394,253.1091 74.07707,252.9544 L 72.75146,249.5027 L 68.00909,249.5027 L 66.69864,252.9236 C 66.6205,253.1252 66.57403,253.2649 66.35562,253.2649 C 66.19952,253.2649 66.04358,253.1243 66.04358,252.9539 C 66.04358,252.9228 66.04358,252.8762 66.12154,252.6902 L 70.03725,242.4929 C 70.11523,242.291 70.16187,242.1514 70.38064,242.1514 C 70.58337,242.1514 70.64569,242.291 70.70831,242.4618 L 74.63882,252.6742 z M 68.26308,248.8973 L 72.51431,248.8973 L 70.38844,243.3505"+ id="path3557"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 76.08958,243.4132 C 76.04292,243.1801 75.9493,242.8225 75.9493,242.7446 C 75.9493,242.4649 76.16755,242.3252 76.40162,242.3252 C 76.58853,242.3252 76.86923,242.4496 76.97871,242.7601 C 76.99435,242.7914 77.18126,243.5221 77.27492,243.911 C 77.38434,244.3775 77.50898,244.8438 77.61845,245.3103 C 77.71206,245.6524 77.80537,245.9944 77.88333,246.3521 C 77.94561,246.6162 78.07072,247.0672 78.08589,247.1296 C 78.31995,247.6113 79.1468,249.0275 80.62798,249.0275 C 81.33006,249.0275 81.47082,248.451 81.47082,247.9382 C 81.47082,246.9743 80.70203,244.9843 80.45114,244.3157 C 80.30981,243.9581 80.29417,243.7713 80.29417,243.6005 C 80.29417,242.8696 80.84418,242.3257 81.58234,242.3257 C 83.05926,242.3257 83.64061,244.5916 83.64061,244.7157 C 83.64061,244.871 83.49985,244.871 83.45317,244.871 C 83.29725,244.871 83.29725,244.8242 83.21928,244.5916 C 82.90725,243.5385 82.39244,242.6711 81.62779,242.6711 C 81.36239,242.6711 81.25344,242.8263 81.25344,243.184 C 81.25344,243.5728 81.39233,243.946 81.53144,244.288 C 81.82473,245.1118 82.47368,246.8221 82.47368,247.7086 C 82.47368,248.7504 81.80071,249.3735 80.67771,249.3735 C 79.27344,249.3735 78.50874,248.3659 78.24335,248.0034 C 78.16521,248.8851 77.5255,249.3735 76.80779,249.3735 C 76.09007,249.3735 75.79368,248.7632 75.63728,248.4821 C 75.38752,247.9507 75.1691,247.0284 75.1691,246.966 C 75.1691,246.81 75.3252,246.81 75.35619,246.81 C 75.51215,246.81 75.5278,246.8255 75.6211,247.1689 C 75.88646,248.2777 76.19819,249.0275 76.75976,249.0275 C 77.07183,249.0275 77.24306,248.8242 77.24306,248.3113 C 77.24306,247.9848 77.1966,247.8137 76.99352,247.0054"+ id="path3559"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 87.31103,242.4973 C 87.31103,243.5304 86.91777,244.1411 86.3056,244.1411 C 85.78744,244.1411 85.47318,243.753 85.47318,243.3189 C 85.47318,242.9003 85.78657,242.4973 86.30342,242.4973 C 86.49117,242.4973 86.69512,242.5591 86.85204,242.6988 C 86.89872,242.7296 86.91489,242.7451 86.93053,242.7451 C 86.94623,242.7451 86.96239,242.7287 86.96239,242.4968 C 86.96239,241.3588 86.4132,240.4358 85.89587,239.9287 C 85.72324,239.7596 85.72324,239.7289 85.72324,239.6826 C 85.72324,239.575 85.80173,239.5135 85.8807,239.5135 C 86.05315,239.5135 87.31103,240.6975 87.31103,242.4973"+ id="path3561"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 92.43505,243.4132 C 92.38808,243.1801 92.29424,242.8225 92.29424,242.7446 C 92.29424,242.4649 92.51354,242.3252 92.74796,242.3252 C 92.9357,242.3252 93.21779,242.4496 93.32709,242.7601 C 93.34291,242.7914 93.53065,243.5221 93.6243,243.911 C 93.73377,244.3775 93.85924,244.8438 93.96867,245.3103 C 94.06281,245.6524 94.15645,245.9944 94.23494,246.3521 C 94.29722,246.6162 94.42268,247.0672 94.43837,247.1296 C 94.67326,247.6113 95.50298,249.0275 96.98997,249.0275 C 97.69426,249.0275 97.83502,248.451 97.83502,247.9382 C 97.83502,247.5493 97.7252,247.1144 97.60008,246.6478 C 97.41234,245.8548 97.33385,245.5443 97.16176,244.8446 C 97.00531,244.2694 96.98966,244.176 96.84885,243.6632 C 96.78654,243.3522 96.64525,242.8238 96.64525,242.7459 C 96.64525,242.4662 96.8645,242.3265 97.09892,242.3265 C 97.58443,242.3265 97.67805,242.7149 97.80321,243.2125 C 98.02246,244.0831 98.60159,246.3529 98.74236,246.9591 C 98.78933,247.1615 99.61922,249.0279 101.3253,249.0279 C 101.9986,249.0279 102.1707,248.4982 102.1707,247.9385 C 102.1707,247.0525 101.5114,245.2801 101.1976,244.4557 C 101.0565,244.0826 100.9937,243.9113 100.9937,243.6009 C 100.9937,242.8701 101.5388,242.326 102.271,242.326 C 103.7353,242.326 104.3122,244.592 104.3122,244.7161 C 104.3122,244.8713 104.1737,244.8713 104.127,244.8713 C 103.9728,244.8713 103.9728,244.8246 103.8957,244.592 C 103.6643,243.7713 103.171,242.6716 102.3229,242.6716 C 102.0606,242.6716 101.9528,242.8269 101.9528,243.1845 C 101.9528,243.5732 102.0919,243.9465 102.231,244.2885 C 102.5246,245.0971 103.1735,246.8225 103.1735,247.709 C 103.1735,248.7196 102.5464,249.3738 101.3725,249.3738 C 100.1983,249.3738 99.39997,248.6819 98.82084,247.8492 C 98.80519,248.0535 98.75804,248.5877 98.32002,248.9652 C 97.92863,249.2951 97.42746,249.3738 97.03664,249.3738 C 95.62779,249.3738 94.8607,248.3662 94.59447,248.0039 C 94.51651,248.9012 93.85889,249.3738 93.15464,249.3738 C 92.43453,249.3738 92.13749,248.7637 91.9962,248.4826 C 91.71464,247.9357 91.51121,247.0132 91.51121,246.9666 C 91.51121,246.8103 91.66761,246.8103 91.69894,246.8103 C 91.8554,246.8103 91.87104,246.826 91.96522,247.1693 C 92.23162,248.2781 92.54453,249.0279 93.10796,249.0279 C 93.35855,249.0279 93.59349,248.9025 93.59349,248.3118 C 93.59349,247.9853 93.54633,247.814 93.34291,247.0059"+ id="path3563"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 117.7405,246.086 C 117.9584,246.086 118.2561,246.086 118.2561,246.3887 C 118.2561,246.6914 117.9584,246.6914 117.7405,246.6914 L 111.1046,246.6914 C 111.2916,248.8134 113.1293,250.2811 115.2482,250.2811 L 117.7405,250.2811 C 117.9584,250.2811 118.2561,250.2811 118.2561,250.5838 C 118.2561,250.8865 117.958,250.8865 117.7392,250.8865 L 115.1955,250.8865 C 112.6983,250.8865 110.4509,248.9929 110.4509,246.3878 C 110.4509,243.814 112.667,241.8914 115.2111,241.8914 L 117.7396,241.8914 C 117.958,241.8914 118.2565,241.8914 118.2565,242.1941 C 118.2565,242.4968 117.9589,242.4968 117.741,242.4968 L 115.2643,242.4968 C 113.0836,242.4968 111.2925,243.9944 111.1055,246.0856"+ id="path3565"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 135.6902,251.4659 C 135.8466,252.087 136.1277,252.5677 137.3784,252.6162 C 137.4564,252.6162 137.6438,252.6314 137.6438,252.9228 C 137.6438,252.9383 137.6438,253.0919 137.4408,253.0919 C 136.9248,253.0919 136.3778,253.0456 135.8618,253.0456 C 135.3306,253.0456 134.7832,253.0919 134.2677,253.0919 C 134.174,253.0919 133.9866,253.0919 133.9866,252.7848 C 133.9866,252.6162 134.1431,252.6162 134.2677,252.6162 C 135.1589,252.5993 135.3306,252.2733 135.3306,251.9321 C 135.3306,251.8855 135.2992,251.6527 135.2836,251.6061 L 133.533,244.6997 L 130.0788,252.7953 C 129.9538,253.0747 129.9381,253.0919 129.5785,253.0919 L 127.4841,253.0919 C 127.1716,253.0919 127.0308,253.0919 127.0308,252.7848 C 127.0308,252.6162 127.1716,252.6162 127.4684,252.6162 C 127.5464,252.6162 128.5313,252.6162 128.5313,252.4762 L 126.4369,244.1375 C 126.2804,243.5165 126.015,243.0192 124.749,242.973 C 124.6553,242.973 124.4832,242.9574 124.4832,242.6659 C 124.4832,242.5588 124.5612,242.4973 124.6863,242.4973 C 125.1866,242.4973 125.7335,242.5436 126.2495,242.5436 C 126.7811,242.5436 127.3438,242.4973 127.8593,242.4973 C 127.9373,242.4973 128.1408,242.4973 128.1408,242.8044 C 128.1408,242.9577 128.0001,242.9735 127.8279,242.9735 C 126.9215,243.0045 126.7964,243.3458 126.7964,243.6563 C 126.7964,243.7647 126.8121,243.8423 126.8591,244.013 L 128.9222,252.2063 C 128.985,252.1133 128.985,252.0821 129.063,251.9274 L 132.9547,242.7922 C 133.064,242.5289 133.1111,242.4978 133.2514,242.4978 C 133.4236,242.4978 133.4236,242.5439 133.5016,242.8238"+ id="path3567"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 151.1549,251.2399 C 151.1549,251.4564 151.1549,251.7519 150.8498,251.7519 C 150.5448,251.7519 150.5448,251.4556 150.5448,251.2385 L 150.5448,245.5482 C 150.5448,243.4858 148.3279,242.7573 146.8187,242.7573 C 145.3252,242.7573 143.0926,243.4708 143.0926,245.5482 L 143.0926,251.2385 C 143.0926,251.4556 143.0926,251.7519 142.7876,251.7519 C 142.4825,251.7519 142.4825,251.4569 142.4825,251.2399 L 142.4825,245.511 C 142.4825,243.2507 144.7678,242.1508 146.8182,242.1508 C 148.8687,242.1508 151.1553,243.2657 151.1553,245.511"+ id="path3569"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 159.9148,251.2255 C 159.9148,252.3429 159.9148,252.6841 160.2935,253.072 C 160.5777,253.3513 160.9403,253.7236 162.045,253.786 C 162.1239,253.8015 162.1871,253.8634 162.1871,253.9568 C 162.1871,254.1297 162.0611,254.1297 161.872,254.1297 C 160.2996,254.1297 158.8999,253.34 158.8685,252.2262 L 158.8685,249.3941 C 158.8685,247.9395 158.8685,247.6917 158.4654,247.2585 C 158.2488,247.0417 157.8304,246.624 156.8551,246.5616 C 156.7466,246.5616 156.6385,246.5461 156.6385,246.3905 C 156.6385,246.2348 156.7313,246.2348 156.886,246.2192 C 157.5519,246.1725 158.8685,245.8456 158.8685,244.2889 L 158.8685,241.2061 C 158.8685,240.3032 158.8685,239.7738 159.6861,239.1975 C 160.3624,238.7304 161.3843,238.6059 161.872,238.6059 C 162.0607,238.6059 162.1871,238.6059 162.1871,238.7789 C 162.1871,238.9361 162.0925,238.9361 161.9348,238.9519 C 160.6879,239.0292 160.1044,239.7275 159.9623,240.2863 C 159.9153,240.4571 159.9153,240.4882 159.9153,241.0314 L 159.9153,243.3588 C 159.9153,243.8245 159.9153,244.6154 159.8843,244.7706 C 159.6834,245.7946 158.695,246.198 158.0928,246.3689 C 159.9157,246.8964 159.9157,247.9983 159.9157,248.4324"+ id="path3571"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 170.5043,247.4608 C 170.5043,248.7027 170.425,249.9446 169.878,251.0936 C 169.159,252.5838 167.8773,252.8324 167.221,252.8324 C 166.2831,252.8324 165.1422,252.4285 164.5012,250.9846 C 164.0009,249.9135 163.9229,248.7027 163.9229,247.4608 C 163.9229,246.2963 163.9852,244.899 164.6262,243.7194 C 165.2987,242.4618 166.4396,242.1514 167.2053,242.1514 C 168.0494,242.1514 169.2374,242.4774 169.9251,243.952 C 170.4254,245.0231 170.5043,246.2339 170.5043,247.4608 z M 167.2057,242.4973 C 166.5991,242.4973 165.6817,242.8848 165.402,244.374 C 165.2307,245.3047 165.2307,246.7318 165.2307,247.6466 C 165.2307,248.6392 165.2307,249.6632 165.3553,250.5003 C 165.6508,252.3459 166.817,252.4865 167.2057,252.4865 C 167.7187,252.4865 168.745,252.2063 169.0404,250.6711 C 169.1965,249.8024 169.1965,248.624 169.1965,247.6466 C 169.1965,246.4835 169.1965,245.4287 169.0252,244.4363 C 168.792,242.963 167.9056,242.4978 167.2057,242.4978"+ id="path3573"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 175.56,251.5299 C 175.56,252.433 175.56,252.9616 174.752,253.5377 C 174.0844,253.9892 173.0907,254.1302 172.5939,254.1302 C 172.4388,254.1302 172.2836,254.1302 172.2836,253.9573 C 172.2836,253.7998 172.3765,253.7998 172.5312,253.7843 C 173.7545,253.7042 174.3275,253.0063 174.467,252.4477 C 174.5136,252.2767 174.5136,252.2461 174.5136,251.7029 L 174.5136,249.376 C 174.5136,248.9107 174.5136,248.1194 174.545,247.9642 C 174.7503,246.94 175.7617,246.5372 176.3784,246.3662 C 174.5136,245.8387 174.5136,244.7373 174.5136,244.3032 L 174.5136,241.511 C 174.5136,240.3939 174.5136,240.0527 174.1414,239.6649 C 173.863,239.3855 173.5065,239.0132 172.4227,238.9514 C 172.3451,238.9353 172.2832,238.8726 172.2832,238.7784 C 172.2832,238.6054 172.4384,238.6054 172.5939,238.6054 C 174.1467,238.6054 175.5286,239.3946 175.56,240.509 L 175.56,243.3411 C 175.56,244.7956 175.56,245.0431 175.9701,245.4764 C 176.191,245.6929 176.6172,246.1111 177.6113,246.173 C 177.722,246.173 177.8322,246.1885 177.8322,246.3459 C 177.8322,246.5034 177.7377,246.5034 177.5799,246.5189 C 176.9014,246.5655 175.5604,246.8926 175.5604,248.4488"+ id="path3575"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g><g+ id="g3577"><g+ transform="matrix(1,0,0,-1,278.5,202.5)"+ id="g3579"><text+ transform="translate(-66.36035,-2.5)"+ id="text3581"><tspan+ x="0 8.6639996 12.66 19.332001 26.004 29.34 36.012001 39.348 47.352001 53.352001 59.352001 62.688 69.360001 79.356003 82.692001 91.356003 98.028"+ y="0"+ id="tspan3583"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">Create System Defi</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,278.5,202.5)"+ id="g3585"><text+ transform="translate(37.67285,-2.5)"+ id="text3587"><tspan+ x="0 6.6719999 9.3360004 12.672 15.336 22.007999"+ y="0"+ id="tspan3589"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">nition</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,278.5,202.5)"+ id="g3591"><text+ transform="translate(-36.40137,11.5)"+ id="text3593"><tspan+ x="0"+ y="0"+ id="tspan3595"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">(</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,278.5,202.5)"+ id="g3597"><text+ transform="translate(-32.40527,11.5)"+ id="text3599"><tspan+ x="0 7.1999998 14.4 21.6 28.799999 36 43.200001 50.400002 57.599998"+ y="0"+ id="tspan3601"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">newSysDef</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,278.5,202.5)"+ id="g3603"><text+ transform="translate(32.40527,11.5)"+ id="text3605"><tspan+ x="0"+ y="0"+ id="tspan3607"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">)</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3609"><path+ d="M 211.5,349 L 212.3429,402.1013"+ id="path3611"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 192.9698,172.3997 L 195.8425,180.4464 L 189.8433,180.3511 L 192.9698,172.3997 z"+ id="path3613"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3615"><path+ d="M 212.4698,410.1003 L 215.3425,402.0536 L 209.3433,402.1489 L 212.4698,410.1003 z"+ id="path3617"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 26.375,79.5 L 377.5,79.5 L 377.5,170.5 L 26.375,170.5 L 26.375,79.5 z"+ id="path3619"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3621"><path+ d="M 45.875,412 L 397,412 L 397,503 L 45.875,503 L 45.875,412 z"+ id="path3623"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><g+ transform="matrix(1,0,0,-1,201.4375,125.5)"+ id="g3625"><text+ transform="translate(-170.5625,-31.5)"+ id="text3627"><tspan+ x="0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 138 144 150 156 162 168 174"+ y="0"+ id="tspan3629"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">sysDef :: SysDef (Signal i1 -></tspan></text>+</g><g+ transform="matrix(1,0,0,-1,201.4375,125.5)"+ id="g3631"><text+ transform="translate(-62.5625,-19.5)"+ id="text3633"><tspan+ x="0 6 12 18 24 30 36 42 48 54 60 66"+ y="0"+ id="tspan3635"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">Signal i2 -></tspan></text>+</g><g+ transform="matrix(1,0,0,-1,201.4375,125.5)"+ id="g3637"><text+ transform="translate(-62.5625,-7.5)"+ id="text3639"><tspan+ x="0 6 12"+ y="0"+ id="tspan3641"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">...</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,201.4375,125.5)"+ id="g3643"><text+ transform="translate(-62.5625,4.5)"+ id="text3645"><tspan+ x="0 6 12 18 24 30 36 42 48 54 60 66 72"+ y="0"+ id="tspan3647"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">Signal in -> </tspan></text>+</g><g+ transform="matrix(1,0,0,-1,201.4375,125.5)"+ id="g3649"><text+ transform="translate(-68.5625,16.5)"+ id="text3651"><tspan+ x="0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 144 150 156 162 168 174 180 186 192 198 204 210 216 222"+ y="0"+ id="tspan3653"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">(Signal o1, Signal o2, .. Signal om))</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,201.4375,125.5)"+ id="g3655" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3657"><path+ d="M 221.4375,503 L 212.5,545 L 22,546 L 22,237 L 166,237 L 204.4454,253.9969"+ id="path3659"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 192.2623,325.2683 L 186.1585,331.2469 L 183.7324,325.7593 L 192.2623,325.2683 z"+ id="path3661"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3663"><path+ d="M 211.7623,257.2317 L 205.6585,251.2531 L 203.2324,256.7407 L 211.7623,257.2317 z"+ id="path3665"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 32.57718,22.94922 L 143.57718,22.94922 L 143.57718,50.94922 L 32.57718,50.94922 L 32.57718,22.94922 z"+ id="path3667"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,87.57718,37.44922)"+ id="g3669"><text+ transform="translate(-50.36426,-2.5)"+ id="text3671"><tspan+ x="0 8.6639996 12.66 19.332001 26.004 29.34 36.012001 39.348 46.02 52.692001 56.028 58.692001 65.363998 71.363998 74.699997 81.372002 88.043999 94.043999"+ y="0"+ id="tspan3673"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">Create an instance</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,87.57718,37.44922)"+ id="g3675"><text+ transform="translate(-43.60254,11.5)"+ id="text3677"><tspan+ x="0"+ y="0"+ id="tspan3679"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">(</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,87.57718,37.44922)"+ id="g3681"><text+ transform="translate(-39.60645,11.5)"+ id="text3683"><tspan+ x="0 7.1999998 14.4 21.6 28.799999 36 43.200001 50.400002 57.599998 64.800003 72"+ y="0"+ id="tspan3685"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">instantiate</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,87.57718,37.44922)"+ id="g3687"><text+ transform="translate(39.60645,11.5)"+ id="text3689"><tspan+ x="0"+ y="0"+ id="tspan3691"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">)</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3693"><path+ d="M 221.4375,503 L 279.6874,573.3736"+ id="path3695"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 265.2885,2.963623 L 262.4985,11.03925 L 257.8764,7.21344 L 265.2885,2.963623 z"+ id="path3697"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3699"><path+ d="M 284.7885,579.5364 L 281.9985,571.4608 L 277.3764,575.2866 L 284.7885,579.5364 z"+ id="path3701"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3703"><path+ d="M 221.4375,503 L 347.319,529.929"+ id="path3705"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 335.642,50.89746 L 328.4466,55.50458 L 327.1915,49.63733 L 335.642,50.89746 z"+ id="path3707"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3709"><path+ d="M 355.142,531.6025 L 347.9466,526.9954 L 346.6915,532.8627 L 355.142,531.6025 z"+ id="path3711"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3713"><path+ d="M 221.4375,503 L 326.3107,560.256"+ id="path3715"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 313.8323,18.41046 L 308.2482,24.87708 L 305.3731,19.61084 L 313.8323,18.41046 z"+ id="path3717"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,-19.5,582.5)"+ id="g3719"><path+ d="M 333.3323,564.0895 L 327.7482,557.6229 L 324.8731,562.8892 L 333.3323,564.0895 z"+ id="path3721"+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" /></g><path+ d="M 218.5933,29.38196 L 317.5933,29.38196 L 317.5933,57.38196 L 218.5933,57.38196 L 218.5933,29.38196 z"+ id="path3723"+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g+ transform="matrix(1,0,0,-1,267.5933,43.88196)"+ id="g3725"><text+ transform="translate(-26.34961,-2.5)"+ id="text3727"><tspan+ x="0 8.0039997 14.676 20.676001 26.676001 33.348 40.02 46.692001"+ y="0"+ id="tspan3729"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">Backends</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,267.5933,43.88196)"+ id="g3731"><text+ transform="translate(-44.40527,11.5)"+ id="text3733"><tspan+ x="0"+ y="0"+ id="tspan3735"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">(</tspan></text>+</g><g+ transform="matrix(1,0,0,-1,267.5933,43.88196)"+ id="g3737"><text+ transform="translate(-40.40918,11.5)"+ id="text3739"><tspan+ x="0 7.1999998 14.4 21.6 28.799999 36 43.200001 50.400002 57.599998"+ y="0"+ id="tspan3741"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">simulate </tspan></text>+</g><g+ transform="matrix(1,0,0,-1,267.5933,43.88196)"+ id="g3743"><text+ transform="translate(24.40137,11.5)"+ id="text3745"><tspan+ x="0 6.6719999 10.008 16.007999"+ y="0"+ id="tspan3747"+ style="font-size:12px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Helvetica;-inkscape-font-specification:Helvetica">etc)</tspan></text>+</g></g><g+ id="g3749"><g+ clip-path="url(#clipPath3753)"+ id="g3751"><path+ d="M 45.63882,99.67416 C 45.71852,99.86015 45.71852,99.93799 45.71852,99.95356 C 45.71852,100.1243 45.59219,100.2643 45.40475,100.2643 C 45.20219,100.2643 45.13939,100.1091 45.07708,99.95438 L 43.75146,96.5027 L 39.0091,96.5027 L 37.69864,99.92363 C 37.6205,100.1252 37.57403,100.2649 37.35562,100.2649 C 37.19951,100.2649 37.04358,100.1243 37.04358,99.9539 C 37.04358,99.92281 37.04358,99.8762 37.12155,99.69021 L 41.03725,89.49289 C 41.11522,89.29105 41.16187,89.15135 41.38064,89.15135 C 41.58337,89.15135 41.64569,89.29105 41.70831,89.46184 L 45.63882,99.67416 z M 39.26308,95.8973 L 43.51431,95.8973 L 41.38844,90.35049"+ id="path3757"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 47.08959,90.41319 C 47.04292,90.18007 46.94931,89.82249 46.94931,89.74461 C 46.94931,89.46487 47.16755,89.32519 47.40162,89.32519 C 47.58853,89.32519 47.86923,89.44965 47.9787,89.76013 C 47.99435,89.7914 48.18126,90.52212 48.27491,90.91096 C 48.38434,91.37751 48.50898,91.84377 48.61845,92.31031 C 48.71206,92.65237 48.80537,92.99442 48.88333,93.35204 C 48.94561,93.61622 49.07072,94.06725 49.08589,94.12955 C 49.31996,94.61133 50.1468,96.02755 51.62799,96.02755 C 52.33006,96.02755 52.47082,95.45103 52.47082,94.93816 C 52.47082,93.97431 51.70203,91.98431 51.45114,91.31572 C 51.30981,90.9581 51.29416,90.77129 51.29416,90.60052 C 51.29416,89.86958 51.84418,89.32567 52.58234,89.32567 C 54.05926,89.32567 54.64061,91.59157 54.64061,91.71572 C 54.64061,91.87096 54.49985,91.87096 54.45317,91.87096 C 54.29725,91.87096 54.29725,91.82417 54.21928,91.59157 C 53.90725,90.53851 53.39244,89.67113 52.62779,89.67113 C 52.36239,89.67113 52.25344,89.82633 52.25344,90.18396 C 52.25344,90.5728 52.39233,90.94595 52.53144,91.288 C 52.82473,92.11182 53.47367,93.82214 53.47367,94.70863 C 53.47367,95.75036 52.80072,96.3735 51.67771,96.3735 C 50.27344,96.3735 49.50874,95.36588 49.24334,95.00337 C 49.16521,95.88515 48.5255,96.3735 47.80778,96.3735 C 47.09007,96.3735 46.79368,95.76316 46.63728,95.48208 C 46.38752,94.95066 46.1691,94.02837 46.1691,93.96606 C 46.1691,93.80994 46.3252,93.80994 46.35619,93.80994 C 46.51216,93.80994 46.5278,93.82552 46.62111,94.16891 C 46.88646,95.27771 47.19819,96.02755 47.75976,96.02755 C 48.07183,96.02755 48.24306,95.82417 48.24306,95.31131 C 48.24306,94.98478 48.1966,94.81367 47.99352,94.00541"+ id="path3759"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 58.31103,89.4973 C 58.31103,90.53042 57.91777,91.14106 57.3056,91.14106 C 56.78744,91.14106 56.47318,90.75304 56.47318,90.31892 C 56.47318,89.90032 56.78657,89.4973 57.30342,89.4973 C 57.49117,89.4973 57.69512,89.55914 57.85205,89.69881 C 57.89872,89.72955 57.91489,89.74508 57.93054,89.74508 C 57.94622,89.74508 57.96239,89.72874 57.96239,89.49678 C 57.96239,88.35879 57.4132,87.43581 56.89587,86.92872 C 56.72325,86.75963 56.72325,86.72889 56.72325,86.6826 C 56.72325,86.575 56.80173,86.51351 56.8807,86.51351 C 57.05314,86.51351 58.31103,87.69746 58.31103,89.4973"+ id="path3761"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 63.43505,90.41319 C 63.38807,90.18007 63.29425,89.82249 63.29425,89.74461 C 63.29425,89.46487 63.51354,89.32519 63.74795,89.32519 C 63.9357,89.32519 64.21779,89.44965 64.32709,89.76013 C 64.34291,89.7914 64.53065,90.52212 64.6243,90.91096 C 64.73377,91.37751 64.85924,91.84377 64.96867,92.31031 C 65.06281,92.65237 65.15645,92.99442 65.23494,93.35204 C 65.29722,93.61622 65.42268,94.06725 65.43837,94.12955 C 65.67326,94.61133 66.50298,96.02755 67.98997,96.02755 C 68.69426,96.02755 68.83502,95.45103 68.83502,94.93816 C 68.83502,94.54932 68.7252,94.11438 68.60008,93.64778 C 68.41234,92.85474 68.33385,92.54426 68.16176,91.84458 C 68.00531,91.26941 67.98966,91.176 67.84885,90.66318 C 67.78654,90.35222 67.64525,89.82383 67.64525,89.74595 C 67.64525,89.46621 67.8645,89.32653 68.09892,89.32653 C 68.58443,89.32653 68.67805,89.71485 68.80321,90.2125 C 69.02246,91.08311 69.60159,93.35287 69.74236,93.95914 C 69.78933,94.16147 70.61922,96.02789 72.32533,96.02789 C 72.99859,96.02789 73.17068,95.49816 73.17068,94.93851 C 73.17068,94.05254 72.51137,92.28009 72.19763,91.45574 C 72.05653,91.0826 71.99368,90.91131 71.99368,90.60087 C 71.99368,89.87009 72.53878,89.32601 73.27097,89.32601 C 74.73533,89.32601 75.31224,91.59204 75.31224,91.71606 C 75.31224,91.87127 75.17365,91.87127 75.12702,91.87127 C 74.97279,91.87127 74.97279,91.82465 74.89566,91.59204 C 74.66434,90.77129 74.17097,89.67161 73.32286,89.67161 C 73.06056,89.67161 72.95279,89.82685 72.95279,90.18448 C 72.95279,90.57314 73.0919,90.94646 73.23096,91.28852 C 73.5246,92.09712 74.17355,93.82249 74.17355,94.70897 C 74.17355,95.71961 73.54639,96.37384 72.37248,96.37384 C 71.19835,96.37384 70.39997,95.68195 69.82084,94.84917 C 69.80519,95.05354 69.75804,95.58768 69.32002,95.96519 C 68.92863,96.29509 68.42746,96.37384 68.03664,96.37384 C 66.62779,96.37384 65.8607,95.36623 65.59447,95.00389 C 65.51651,95.90119 64.85889,96.37384 64.15464,96.37384 C 63.43453,96.37384 63.13749,95.76367 62.9962,95.4826 C 62.71463,94.93565 62.51121,94.01319 62.51121,93.96658 C 62.51121,93.8103 62.66761,93.8103 62.69895,93.8103 C 62.8554,93.8103 62.87104,93.82603 62.96522,94.16926 C 63.23162,95.27805 63.54453,96.02789 64.10796,96.02789 C 64.35855,96.02789 64.59349,95.90253 64.59349,95.31183 C 64.59349,94.9853 64.54633,94.81401 64.34291,94.00593"+ id="path3763"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 88.74052,93.08597 C 88.95841,93.08597 89.25607,93.08597 89.25607,93.38867 C 89.25607,93.69138 88.95841,93.69138 88.74052,93.69138 L 82.10462,93.69138 C 82.29158,95.81336 84.12934,97.28108 86.24818,97.28108 L 88.74052,97.28108 C 88.95841,97.28108 89.25607,97.28108 89.25607,97.58379 C 89.25607,97.88649 88.95798,97.88649 88.7392,97.88649 L 86.19546,97.88649 C 83.69833,97.88649 81.45093,95.99291 81.45093,93.38785 C 81.45093,90.81401 83.66695,88.89139 86.21114,88.89139 L 88.73965,88.89139 C 88.95798,88.89139 89.2565,88.89139 89.2565,89.19409 C 89.2565,89.49678 88.95885,89.49678 88.74095,89.49678 L 86.26431,89.49678 C 84.08358,89.49678 82.29246,90.99442 82.1055,93.08562"+ id="path3765"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 106.6902,98.46586 C 106.8466,99.08701 107.1277,99.56774 108.3784,99.61622 C 108.4564,99.61622 108.6438,99.63144 108.6438,99.92281 C 108.6438,99.93834 108.6438,100.0919 108.4408,100.0919 C 107.9248,100.0919 107.3778,100.0456 106.8619,100.0456 C 106.3306,100.0456 105.7833,100.0919 105.2677,100.0919 C 105.174,100.0919 104.9866,100.0919 104.9866,99.78478 C 104.9866,99.61622 105.1431,99.61622 105.2677,99.61622 C 106.1589,99.59931 106.3306,99.2733 106.3306,98.93211 C 106.3306,98.88549 106.2992,98.65272 106.2835,98.6061 L 104.533,91.69968 L 101.0788,99.79529 C 100.9537,100.0747 100.9381,100.0919 100.5785,100.0919 L 98.48408,100.0919 C 98.17161,100.0919 98.03085,100.0919 98.03085,99.78478 C 98.03085,99.61622 98.17161,99.61622 98.46839,99.61622 C 98.5464,99.61622 99.5313,99.61622 99.5313,99.4762 L 97.43686,91.13751 C 97.2804,90.51654 97.01501,90.01924 95.74902,89.97298 C 95.65531,89.97298 95.48318,89.95745 95.48318,89.66586 C 95.48318,89.55879 95.56119,89.4973 95.68626,89.4973 C 96.18655,89.4973 96.73347,89.54357 97.24947,89.54357 C 97.78114,89.54357 98.34375,89.4973 98.8593,89.4973 C 98.93731,89.4973 99.14082,89.4973 99.14082,89.80441 C 99.14082,89.95775 99.00006,89.9735 98.82793,89.9735 C 97.92146,90.00454 97.79639,90.34577 97.79639,90.65626 C 97.79639,90.76472 97.81208,90.84225 97.85915,91.01302 L 99.92221,99.20627 C 99.98496,99.11334 99.98496,99.08208 100.063,98.92735 L 103.9547,89.79221 C 104.064,89.52886 104.1111,89.49782 104.2514,89.49782 C 104.4236,89.49782 104.4236,89.54391 104.5016,89.82383"+ id="path3767"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 122.1549,98.23987 C 122.1549,98.45644 122.1549,98.75187 121.8498,98.75187 C 121.5448,98.75187 121.5448,98.45557 121.5448,98.23853 L 121.5448,92.54815 C 121.5448,90.48579 119.3279,89.75728 117.8187,89.75728 C 116.3252,89.75728 114.0926,90.47079 114.0926,92.54815 L 114.0926,98.23853 C 114.0926,98.45557 114.0926,98.75187 113.7876,98.75187 C 113.4825,98.75187 113.4825,98.45691 113.4825,98.23987 L 113.4825,92.51096 C 113.4825,90.25068 115.7678,89.15085 117.8182,89.15085 C 119.8687,89.15085 122.1553,90.26573 122.1553,92.51096"+ id="path3769"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 130.9148,98.22552 C 130.9148,99.34292 130.9148,99.68411 131.2935,100.072 C 131.5777,100.3513 131.9403,100.7236 133.045,100.786 C 133.1239,100.8015 133.1871,100.8633 133.1871,100.9568 C 133.1871,101.1297 133.0611,101.1297 132.872,101.1297 C 131.2996,101.1297 129.8999,100.34 129.8685,99.22616 L 129.8685,96.39407 C 129.8685,94.93954 129.8685,94.69172 129.4654,94.25847 C 129.2488,94.04173 128.8304,93.624 127.8551,93.56165 C 127.7466,93.56165 127.6385,93.54612 127.6385,93.39053 C 127.6385,93.23481 127.7313,93.23481 127.886,93.21925 C 128.5519,93.17245 129.8685,92.84562 129.8685,91.28886 L 129.8685,88.20608 C 129.8685,87.30321 129.8685,86.77382 130.6861,86.19746 C 131.3624,85.73041 132.3843,85.60591 132.872,85.60591 C 133.0607,85.60591 133.1871,85.60591 133.1871,85.77888 C 133.1871,85.93615 133.0925,85.93615 132.9348,85.95186 C 131.6879,86.02922 131.1044,86.72753 130.9623,87.28632 C 130.9153,87.45709 130.9153,87.48817 130.9153,88.03142 L 130.9153,90.35879 C 130.9153,90.82448 130.9153,91.61535 130.8843,91.77059 C 130.6834,92.79459 129.695,93.19797 129.0928,93.36891 C 130.9157,93.89643 130.9157,94.99831 130.9157,95.43243"+ id="path3771"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 141.5043,94.4608 C 141.5043,95.70271 141.425,96.9446 140.878,98.09358 C 140.159,99.58379 138.8773,99.83244 138.221,99.83244 C 137.2831,99.83244 136.1422,99.42854 135.5012,97.98465 C 135.0009,96.91351 134.9229,95.70271 134.9229,94.4608 C 134.9229,93.2963 134.9852,91.89899 135.6262,90.71944 C 136.2987,89.46184 137.4396,89.15135 138.2053,89.15135 C 139.0494,89.15135 140.2374,89.47736 140.9251,90.95204 C 141.4254,92.02313 141.5043,93.23395 141.5043,94.4608 z M 138.2057,89.4973 C 137.5991,89.4973 136.6817,89.8848 136.402,91.37397 C 136.2307,92.30473 136.2307,93.73177 136.2307,94.64661 C 136.2307,95.63918 136.2307,96.66318 136.3553,97.50033 C 136.6508,99.34595 137.817,99.48649 138.2057,99.48649 C 138.7187,99.48649 139.745,99.20627 140.0404,97.67113 C 140.1965,96.80238 140.1965,95.624 140.1965,94.64661 C 140.1965,93.48346 140.1965,92.42871 140.0252,91.43633 C 139.792,89.96303 138.9056,89.49782 138.2057,89.49782"+ id="path3773"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /><path+ d="M 146.56,98.52991 C 146.56,99.43295 146.56,99.96165 145.752,100.5377 C 145.0844,100.9892 144.0907,101.1302 143.5939,101.1302 C 143.4388,101.1302 143.2836,101.1302 143.2836,100.9573 C 143.2836,100.7998 143.3765,100.7998 143.5312,100.7843 C 144.7545,100.7042 145.3275,100.0063 145.467,99.44765 C 145.5136,99.27667 145.5136,99.2461 145.5136,98.70288 L 145.5136,96.376 C 145.5136,95.91066 145.5136,95.11944 145.545,94.9642 C 145.7503,93.94003 146.7617,93.53717 147.3784,93.36623 C 145.5136,92.8387 145.5136,91.73734 145.5136,91.30322 L 145.5136,88.51098 C 145.5136,87.39392 145.5136,87.0527 145.1414,86.66486 C 144.863,86.38548 144.5065,86.01318 143.4227,85.95135 C 143.3451,85.9353 143.2832,85.87263 143.2832,85.77838 C 143.2832,85.60541 143.4384,85.60541 143.5939,85.60541 C 145.1467,85.60541 146.5286,86.39459 146.56,87.50895 L 146.56,90.34106 C 146.56,91.79559 146.56,92.04307 146.9701,92.47637 C 147.191,92.69289 147.6172,93.11114 148.6113,93.17297 C 148.722,93.17297 148.8322,93.1885 148.8322,93.34595 C 148.8322,93.5034 148.7377,93.5034 148.5799,93.51892 C 147.9014,93.56554 146.5604,93.89259 146.5604,95.44882"+ id="path3775"+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g><g+ transform="matrix(1,0,0,-1,197.43904,367.08421)"+ id="g3844"><text+ x="-22.849482"+ y="-29.68725"+ id="text3846"><tspan+ x="-22.849482"+ y="-29.68725"+ id="tspan3848"+ style="font-size:10px;font-variant:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Courier;-inkscape-font-specification:Courier">(a1 ->..-> an)</tspan></text>+</g></g></svg>
+ doc/www/files/tutorial/figures/delaySY.svg view
@@ -0,0 +1,2150 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="318"+ height="75"+ viewBox="0 0 362.835 272.126"+ version="1.0"+ id="svg2"+ sodipodi:version="0.32"+ inkscape:version="0.46"+ sodipodi:docname="delaySY.svg"+ inkscape:output_extension="org.inkscape.output.svg.inkscape">+ <metadata+ id="metadata2463">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <sodipodi:namedview+ inkscape:window-height="1054"+ inkscape:window-width="1901"+ inkscape:pageshadow="2"+ inkscape:pageopacity="0.0"+ guidetolerance="10.0"+ gridtolerance="10.0"+ objecttolerance="10.0"+ borderopacity="1.0"+ bordercolor="#666666"+ pagecolor="#ffffff"+ id="base"+ showgrid="false"+ inkscape:zoom="1.4142136"+ inkscape:cx="17.054894"+ inkscape:cy="65.938389"+ inkscape:window-x="19"+ inkscape:window-y="94"+ inkscape:current-layer="svg2" />+ <defs+ id="defs4">+ <inkscape:perspective+ sodipodi:type="inkscape:persp3d"+ inkscape:vp_x="0 : 170.07875 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_z="453.54373 : 170.07875 : 1"+ inkscape:persp3d-origin="226.77187 : 113.38583 : 1"+ id="perspective2465" />+ <g+ id="g6">+ <symbol+ overflow="visible"+ id="glyph4-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path9" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.171875,-6.265625 L 0.84375,0 L 1.859375,0 L 2.6875,-3.9375 C 2.875,-4.84375 3.6875,-5.578125 4.5,-5.578125 C 5.078125,-5.578125 5.46875,-5.25 5.46875,-4.75 C 5.46875,-4.625 5.46875,-4.46875 5.421875,-4.3125 L 4.5,0 L 5.515625,0 L 6.34375,-3.9375 C 6.53125,-4.859375 7.359375,-5.578125 8.21875,-5.578125 C 8.78125,-5.578125 9.125,-5.234375 9.125,-4.65625 C 9.125,-4.484375 9.125,-4.484375 9.03125,-4.078125 L 8.15625,0 L 9.171875,0 L 10.109375,-4.453125 C 10.140625,-4.59375 10.1875,-4.984375 10.1875,-5.109375 C 10.1875,-5.421875 10.046875,-5.765625 9.796875,-6.03125 C 9.53125,-6.328125 9.21875,-6.4375 8.671875,-6.4375 C 7.890625,-6.4375 7.203125,-6.125 6.5,-5.453125 C 6.3125,-6.125 5.84375,-6.4375 5.0625,-6.4375 C 4.25,-6.4375 3.6875,-6.203125 2.921875,-5.484375 L 3.078125,-6.265625 L 2.171875,-6.265625 z"+ id="path12" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.59375,-0.609375 C 6.484375,-0.578125 6.4375,-0.578125 6.390625,-0.578125 C 6.078125,-0.578125 5.9375,-0.6875 5.9375,-0.9375 C 5.9375,-0.984375 5.9375,-1.015625 5.953125,-1.046875 L 6.71875,-4.65625 C 6.796875,-4.96875 6.796875,-4.96875 6.796875,-5.09375 C 6.796875,-5.90625 5.96875,-6.4375 4.703125,-6.4375 C 3.046875,-6.4375 2.03125,-5.734375 1.8125,-4.40625 L 2.8125,-4.40625 C 2.921875,-4.75 3,-4.90625 3.171875,-5.078125 C 3.4375,-5.34375 3.9375,-5.515625 4.453125,-5.515625 C 5.15625,-5.515625 5.71875,-5.203125 5.71875,-4.75 C 5.71875,-4.703125 5.703125,-4.625 5.6875,-4.53125 L 5.65625,-4.3125 C 5.546875,-3.828125 5.3125,-3.6875 4.453125,-3.609375 C 2.84375,-3.46875 2.34375,-3.34375 1.75,-2.96875 C 1.140625,-2.578125 0.78125,-1.953125 0.78125,-1.25 C 0.78125,-0.296875 1.421875,0.28125 2.5,0.28125 C 2.921875,0.28125 3.421875,0.1875 3.84375,0.03125 C 4.234375,-0.09375 4.40625,-0.21875 4.90625,-0.640625 L 4.90625,-0.5625 L 4.90625,-0.515625 C 4.90625,-0.03125 5.234375,0.28125 5.8125,0.28125 C 5.9375,0.28125 5.96875,0.28125 6.28125,0.203125 C 6.296875,0.1875 6.375,0.171875 6.4375,0.171875 L 6.59375,-0.609375 z M 5.15625,-1.953125 C 5,-1.21875 3.9375,-0.578125 2.890625,-0.578125 C 2.21875,-0.578125 1.828125,-0.875 1.828125,-1.375 C 1.828125,-1.765625 2.0625,-2.15625 2.421875,-2.375 C 2.703125,-2.5625 3.0625,-2.65625 3.640625,-2.734375 C 4.765625,-2.890625 4.859375,-2.90625 5.390625,-3.078125 L 5.15625,-1.953125 z"+ id="path15" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.078125,2.546875 L 1.09375,2.546875 L 1.8125,-0.8125 C 2.171875,-0.03125 2.671875,0.28125 3.515625,0.28125 C 4.453125,0.28125 5.34375,-0.15625 5.953125,-0.90625 C 6.59375,-1.703125 7,-2.9375 7,-4.109375 C 7,-5.546875 6.203125,-6.4375 4.921875,-6.4375 C 4.40625,-6.4375 3.875,-6.28125 3.390625,-5.96875 C 3.015625,-5.734375 2.875,-5.578125 2.71875,-5.265625 L 2.921875,-6.265625 L 1.953125,-6.265625 L 0.078125,2.546875 z M 4.53125,-5.515625 C 5.421875,-5.515625 5.953125,-4.90625 5.953125,-3.875 C 5.953125,-3.234375 5.75,-2.453125 5.421875,-1.859375 C 4.984375,-1.046875 4.390625,-0.640625 3.609375,-0.640625 C 2.734375,-0.640625 2.1875,-1.25 2.1875,-2.203125 C 2.1875,-2.921875 2.390625,-3.6875 2.75,-4.3125 C 3.1875,-5.109375 3.796875,-5.515625 4.53125,-5.515625 z"+ id="path18" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 8.4375,-6.15625 C 8.515625,-6.484375 8.53125,-6.640625 8.53125,-6.828125 C 8.53125,-7.34375 8.28125,-7.890625 7.890625,-8.234375 C 7.40625,-8.671875 6.765625,-8.859375 5.828125,-8.859375 C 4.609375,-8.859375 3.640625,-8.515625 2.984375,-7.84375 C 2.5,-7.34375 2.125,-6.484375 2.125,-5.875 C 2.125,-5.125 2.65625,-4.5 3.453125,-4.265625 L 5.5,-3.6875 C 6.453125,-3.421875 6.84375,-3.078125 6.84375,-2.5 C 6.84375,-2.125 6.625,-1.671875 6.28125,-1.359375 C 5.796875,-0.921875 5.09375,-0.6875 4.140625,-0.6875 C 2.78125,-0.6875 2.15625,-1.1875 2.15625,-2.28125 C 2.15625,-2.4375 2.171875,-2.546875 2.21875,-2.765625 L 1.171875,-2.765625 C 1.09375,-2.46875 1.0625,-2.265625 1.0625,-2.015625 C 1.0625,-0.578125 2.140625,0.28125 3.9375,0.28125 C 5.203125,0.28125 6.25,-0.078125 6.953125,-0.734375 C 7.5625,-1.296875 8,-2.15625 8,-2.828125 C 8,-3.140625 7.890625,-3.484375 7.703125,-3.765625 C 7.453125,-4.1875 7.09375,-4.421875 6.53125,-4.578125 L 4.484375,-5.15625 C 3.5625,-5.421875 3.28125,-5.671875 3.28125,-6.1875 C 3.28125,-6.609375 3.453125,-6.984375 3.796875,-7.296875 C 4.25,-7.703125 4.828125,-7.890625 5.625,-7.890625 C 6.28125,-7.890625 6.796875,-7.75 7.046875,-7.515625 C 7.28125,-7.3125 7.4375,-6.9375 7.4375,-6.59375 C 7.4375,-6.484375 7.421875,-6.390625 7.390625,-6.15625 L 8.4375,-6.15625 z"+ id="path21" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.359375,-3.421875 L 9.75,-8.71875 L 8.421875,-8.71875 L 4.96875,-4.453125 L 3.34375,-8.71875 L 2.015625,-8.71875 L 4.234375,-3.421875 L 3.5,0 L 4.625,0 L 5.359375,-3.421875 z"+ id="path24" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.421875,-6.265625 L 3.390625,-6.265625 L 3.578125,-7.09375 C 3.703125,-7.6875 3.921875,-7.890625 4.4375,-7.890625 C 4.515625,-7.890625 4.59375,-7.890625 4.75,-7.859375 L 4.9375,-8.6875 C 4.71875,-8.734375 4.59375,-8.75 4.40625,-8.75 C 3.484375,-8.75 2.8125,-8.21875 2.625,-7.328125 L 2.390625,-6.265625 L 1.546875,-6.265625 L 1.390625,-5.46875 L 2.21875,-5.46875 L 1.0625,0 L 2.0625,0 L 3.234375,-5.46875 L 4.25,-5.46875 L 4.421875,-6.265625 z"+ id="path27" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.125,-6.265625 L 2.109375,-6.265625 L 0.78125,0 L 1.796875,0 L 3.125,-6.265625 z M 3.640625,-8.71875 L 2.640625,-8.71875 L 2.375,-7.484375 L 3.375,-7.484375 L 3.640625,-8.71875 z"+ id="path30" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.59375,-6.4375 C 3.484375,-6.4375 2.5,-5.9375 1.890625,-5.0625 C 1.34375,-4.296875 0.953125,-2.96875 0.953125,-1.953125 C 0.953125,-0.640625 1.875,0.28125 3.21875,0.28125 C 4.359375,0.28125 5.265625,-0.1875 5.9375,-1.109375 C 6.484375,-1.859375 6.890625,-3.171875 6.890625,-4.203125 C 6.890625,-4.84375 6.640625,-5.453125 6.234375,-5.859375 C 5.828125,-6.25 5.28125,-6.4375 4.59375,-6.4375 z M 4.4375,-5.515625 C 5.3125,-5.515625 5.828125,-4.953125 5.828125,-3.984375 C 5.828125,-3.28125 5.625,-2.5 5.3125,-1.90625 C 4.859375,-1.078125 4.203125,-0.640625 3.375,-0.640625 C 2.53125,-0.640625 2.015625,-1.25 2.015625,-2.203125 C 2.015625,-2.875 2.21875,-3.671875 2.53125,-4.265625 C 2.96875,-5.078125 3.640625,-5.515625 4.4375,-5.515625 z"+ id="path33" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.765625,-8.71875 L 6.765625,-8.71875 L 6.046875,-5.359375 C 5.671875,-6.125 5.1875,-6.4375 4.34375,-6.4375 C 2.359375,-6.4375 0.875,-4.546875 0.875,-2.03125 C 0.875,-0.640625 1.671875,0.28125 2.921875,0.28125 C 3.4375,0.28125 3.984375,0.109375 4.453125,-0.171875 C 4.8125,-0.390625 4.96875,-0.578125 5.140625,-0.90625 L 4.953125,0 L 5.921875,0 L 7.765625,-8.71875 z M 4.25,-5.515625 C 5.125,-5.515625 5.65625,-4.921875 5.65625,-3.90625 C 5.65625,-3.203125 5.46875,-2.46875 5.109375,-1.859375 C 4.640625,-1.046875 4.046875,-0.640625 3.328125,-0.640625 C 2.4375,-0.640625 1.921875,-1.25 1.921875,-2.265625 C 1.921875,-2.9375 2.125,-3.703125 2.453125,-4.3125 C 2.90625,-5.140625 3.484375,-5.515625 4.25,-5.515625 z"+ id="path36" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.734375,-2.796875 L 6.765625,-3 C 6.875,-3.578125 6.9375,-4.078125 6.9375,-4.40625 C 6.9375,-5.546875 5.9375,-6.4375 4.65625,-6.4375 C 3.609375,-6.4375 2.609375,-5.953125 2.015625,-5.15625 C 1.453125,-4.40625 1,-3.03125 1,-2.0625 C 1,-1.421875 1.28125,-0.765625 1.75,-0.328125 C 2.15625,0.078125 2.6875,0.28125 3.375,0.28125 C 4.8125,0.28125 6.03125,-0.609375 6.40625,-1.90625 L 5.40625,-1.90625 C 4.96875,-1.078125 4.34375,-0.640625 3.53125,-0.640625 C 2.59375,-0.640625 2.0625,-1.234375 2.0625,-2.25 C 2.0625,-2.5 2.0625,-2.625 2.109375,-2.796875 L 6.734375,-2.796875 z M 2.328125,-3.65625 C 2.640625,-4.75 3.53125,-5.515625 4.5,-5.515625 C 5.34375,-5.515625 5.875,-4.953125 5.875,-4.046875 C 5.875,-3.9375 5.875,-3.84375 5.84375,-3.65625 L 2.328125,-3.65625 z"+ id="path39" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.671875,-8.71875 L 2.671875,-8.71875 L 0.8125,0 L 1.8125,0 L 3.671875,-8.71875 z"+ id="path42" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.984375,-6.265625 L 3.203125,-1.40625 L 2.65625,-6.265625 L 1.578125,-6.265625 L 2.390625,0.046875 L 1.765625,1.015625 C 1.453125,1.515625 1.25,1.640625 0.8125,1.640625 C 0.6875,1.640625 0.609375,1.625 0.28125,1.59375 L 0.09375,2.484375 C 0.3125,2.578125 0.453125,2.609375 0.6875,2.609375 C 1.53125,2.609375 2.140625,2.203125 2.65625,1.3125 L 7.046875,-6.265625 L 5.984375,-6.265625 z"+ id="path45" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.140625,-4.515625 C 6.203125,-4.765625 6.21875,-4.875 6.21875,-5.03125 C 6.21875,-5.875 5.421875,-6.4375 4.25,-6.4375 C 3.40625,-6.4375 2.671875,-6.1875 2.1875,-5.71875 C 1.75,-5.3125 1.46875,-4.6875 1.46875,-4.125 C 1.46875,-3.390625 1.890625,-3.046875 3.125,-2.71875 L 4,-2.5 C 4.40625,-2.390625 4.578125,-2.3125 4.6875,-2.1875 C 4.765625,-2.078125 4.84375,-1.90625 4.84375,-1.796875 C 4.84375,-1.578125 4.65625,-1.203125 4.453125,-1.046875 C 4.15625,-0.796875 3.640625,-0.640625 3.125,-0.640625 C 2.3125,-0.640625 1.84375,-0.96875 1.84375,-1.5625 C 1.84375,-1.640625 1.859375,-1.75 1.859375,-1.859375 L 0.796875,-1.859375 C 0.734375,-1.59375 0.734375,-1.453125 0.734375,-1.25 C 0.734375,-0.296875 1.5625,0.28125 2.953125,0.28125 C 4.734375,0.28125 5.890625,-0.640625 5.890625,-2.0625 C 5.890625,-2.796875 5.5,-3.171875 4.453125,-3.4375 L 3.53125,-3.671875 C 2.875,-3.84375 2.515625,-4.078125 2.515625,-4.390625 C 2.515625,-4.625 2.671875,-4.921875 2.875,-5.125 C 3.171875,-5.40625 3.53125,-5.515625 4.046875,-5.515625 C 4.75,-5.515625 5.15625,-5.25 5.15625,-4.78125 C 5.15625,-4.703125 5.15625,-4.609375 5.140625,-4.515625 L 6.140625,-4.515625 z"+ id="path48" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path51" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.21875,-0.015625 C 2.21875,-0.734375 1.9375,-1.15625 1.515625,-1.15625 C 1.15625,-1.15625 0.9375,-0.890625 0.9375,-0.578125 C 0.9375,-0.28125 1.15625,0 1.515625,0 C 1.640625,0 1.78125,-0.046875 1.890625,-0.140625 C 1.9375,-0.15625 1.9375,-0.171875 1.953125,-0.171875 C 1.96875,-0.171875 1.96875,-0.15625 1.96875,-0.015625 C 1.96875,0.796875 1.59375,1.453125 1.234375,1.8125 C 1.109375,1.9375 1.109375,1.953125 1.109375,1.984375 C 1.109375,2.0625 1.171875,2.109375 1.21875,2.109375 C 1.34375,2.109375 2.21875,1.265625 2.21875,-0.015625 z"+ id="path54" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.09375,-0.578125 C 2.09375,-0.890625 1.828125,-1.15625 1.515625,-1.15625 C 1.203125,-1.15625 0.9375,-0.890625 0.9375,-0.578125 C 0.9375,-0.265625 1.203125,0 1.515625,0 C 1.828125,0 2.09375,-0.265625 2.09375,-0.578125 z"+ id="path57" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path60" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.90625,-2.75 C 8.0625,-2.75 8.296875,-2.75 8.296875,-2.984375 C 8.296875,-3.234375 8.0625,-3.234375 7.90625,-3.234375 L 1.390625,-3.234375 C 1.21875,-3.234375 0.984375,-3.234375 0.984375,-2.984375 C 0.984375,-2.75 1.21875,-2.75 1.390625,-2.75 L 7.90625,-2.75 z"+ id="path63" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 10.25,-2.75 C 9.359375,-2.09375 8.96875,-1.09375 8.96875,-1 C 8.96875,-0.890625 9.0625,-0.859375 9.140625,-0.859375 C 9.28125,-0.859375 9.3125,-0.9375 9.328125,-0.984375 C 9.515625,-1.390625 9.890625,-2.265625 11.09375,-2.828125 C 11.234375,-2.890625 11.265625,-2.90625 11.265625,-2.984375 C 11.265625,-3.078125 11.1875,-3.109375 11.171875,-3.109375 C 10.53125,-3.40625 9.84375,-3.84375 9.34375,-4.953125 C 9.296875,-5.0625 9.28125,-5.109375 9.140625,-5.109375 C 9.0625,-5.109375 8.96875,-5.078125 8.96875,-4.96875 C 8.96875,-4.875 9.359375,-3.890625 10.25,-3.234375 L 1.0625,-3.234375 C 0.890625,-3.234375 0.671875,-3.234375 0.671875,-2.984375 C 0.671875,-2.75 0.890625,-2.75 1.0625,-2.75 L 10.25,-2.75 z"+ id="path66" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path69" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.59375,2.375 L 1.5,2.375 L 1.5,-0.59375 C 1.984375,-0.015625 2.515625,0.25 3.265625,0.25 C 4.734375,0.25 5.703125,-0.9375 5.703125,-2.765625 C 5.703125,-4.671875 4.765625,-5.875 3.25,-5.875 C 2.46875,-5.875 1.859375,-5.53125 1.421875,-4.859375 L 1.421875,-5.71875 L 0.59375,-5.71875 L 0.59375,2.375 z M 3.09375,-5.03125 C 4.09375,-5.03125 4.75,-4.140625 4.75,-2.78125 C 4.75,-1.484375 4.09375,-0.59375 3.09375,-0.59375 C 2.140625,-0.59375 1.5,-1.46875 1.5,-2.8125 C 1.5,-4.15625 2.140625,-5.03125 3.09375,-5.03125 z"+ id="path72" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.75,-5.71875 L 0.75,0 L 1.671875,0 L 1.671875,-2.96875 C 1.671875,-3.78125 1.875,-4.3125 2.3125,-4.640625 C 2.59375,-4.84375 2.875,-4.90625 3.5,-4.921875 L 3.5,-5.84375 C 3.34375,-5.875 3.265625,-5.875 3.15625,-5.875 C 2.5625,-5.875 2.109375,-5.53125 1.59375,-4.671875 L 1.59375,-5.71875 L 0.75,-5.71875 z"+ id="path75" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-5.71875 L 0.734375,-5.71875 L 0.734375,0 L 1.640625,0 L 1.640625,-5.71875 z M 1.640625,-7.953125 L 0.71875,-7.953125 L 0.71875,-6.8125 L 1.640625,-6.8125 L 1.640625,-7.953125 z"+ id="path78" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.765625,-5.71875 L 0.765625,0 L 1.671875,0 L 1.671875,-3.59375 C 1.671875,-4.421875 2.28125,-5.078125 3.015625,-5.078125 C 3.703125,-5.078125 4.078125,-4.671875 4.078125,-3.9375 L 4.078125,0 L 5,0 L 5,-3.59375 C 5,-4.421875 5.59375,-5.078125 6.34375,-5.078125 C 7,-5.078125 7.390625,-4.65625 7.390625,-3.9375 L 7.390625,0 L 8.3125,0 L 8.3125,-4.28125 C 8.3125,-5.3125 7.71875,-5.875 6.65625,-5.875 C 5.890625,-5.875 5.4375,-5.65625 4.890625,-5 C 4.5625,-5.609375 4.09375,-5.875 3.359375,-5.875 C 2.59375,-5.875 2.09375,-5.59375 1.609375,-4.90625 L 1.609375,-5.71875 L 0.765625,-5.71875 z"+ id="path81" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.765625,-5.71875 L 1.828125,-5.71875 L 1.828125,-7.28125 L 0.921875,-7.28125 L 0.921875,-5.71875 L 0.15625,-5.71875 L 0.15625,-4.96875 L 0.921875,-4.96875 L 0.921875,-0.65625 C 0.921875,-0.078125 1.3125,0.25 2.03125,0.25 C 2.25,0.25 2.46875,0.234375 2.765625,0.171875 L 2.765625,-0.59375 C 2.65625,-0.5625 2.515625,-0.546875 2.328125,-0.546875 C 1.9375,-0.546875 1.828125,-0.65625 1.828125,-1.0625 L 1.828125,-4.96875 L 2.765625,-4.96875 L 2.765625,-5.71875 z"+ id="path84" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.109375,0 L 5.296875,-5.71875 L 4.28125,-5.71875 L 2.65625,-1.078125 L 1.140625,-5.71875 L 0.109375,-5.71875 L 2.109375,0 L 3.109375,0 z"+ id="path87" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.59375,-2.546875 C 5.59375,-3.421875 5.53125,-3.953125 5.359375,-4.375 C 5,-5.3125 4.125,-5.875 3.046875,-5.875 C 1.46875,-5.875 0.4375,-4.65625 0.4375,-2.78125 C 0.4375,-0.90625 1.421875,0.25 3.03125,0.25 C 4.34375,0.25 5.25,-0.484375 5.46875,-1.734375 L 4.5625,-1.734375 C 4.3125,-0.984375 3.796875,-0.59375 3.0625,-0.59375 C 2.484375,-0.59375 2,-0.84375 1.6875,-1.328125 C 1.46875,-1.65625 1.390625,-1.984375 1.390625,-2.546875 L 5.59375,-2.546875 z M 1.40625,-3.296875 C 1.484375,-4.359375 2.125,-5.03125 3.046875,-5.03125 C 3.9375,-5.03125 4.625,-4.296875 4.625,-3.359375 C 4.625,-3.34375 4.625,-3.3125 4.609375,-3.296875 L 1.40625,-3.296875 z"+ id="path90" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.96875,-5.875 C 1.359375,-5.875 0.390625,-4.734375 0.390625,-2.8125 C 0.390625,-0.890625 1.359375,0.25 2.984375,0.25 C 4.578125,0.25 5.5625,-0.890625 5.5625,-2.765625 C 5.5625,-4.75 4.609375,-5.875 2.96875,-5.875 z M 2.984375,-5.03125 C 4,-5.03125 4.609375,-4.203125 4.609375,-2.78125 C 4.609375,-1.4375 3.984375,-0.59375 2.984375,-0.59375 C 1.96875,-0.59375 1.34375,-1.421875 1.34375,-2.8125 C 1.34375,-4.1875 1.96875,-5.03125 2.984375,-5.03125 z"+ id="path93" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.140625,-3.796875 C 5.09375,-4.359375 4.96875,-4.71875 4.75,-5.03125 C 4.359375,-5.5625 3.671875,-5.875 2.875,-5.875 C 1.34375,-5.875 0.34375,-4.65625 0.34375,-2.765625 C 0.34375,-0.921875 1.3125,0.25 2.875,0.25 C 4.234375,0.25 5.09375,-0.5625 5.203125,-1.96875 L 4.28125,-1.96875 C 4.140625,-1.046875 3.671875,-0.59375 2.890625,-0.59375 C 1.890625,-0.59375 1.28125,-1.40625 1.28125,-2.765625 C 1.28125,-4.1875 1.875,-5.03125 2.875,-5.03125 C 3.625,-5.03125 4.109375,-4.59375 4.21875,-3.796875 L 5.140625,-3.796875 z"+ id="path96" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.78125,-4.125 C 4.765625,-5.25 4.03125,-5.875 2.703125,-5.875 C 1.375,-5.875 0.515625,-5.1875 0.515625,-4.140625 C 0.515625,-3.234375 0.96875,-2.8125 2.328125,-2.484375 L 3.171875,-2.28125 C 3.8125,-2.125 4.0625,-1.890625 4.0625,-1.484375 C 4.0625,-0.953125 3.515625,-0.59375 2.71875,-0.59375 C 2.234375,-0.59375 1.828125,-0.734375 1.59375,-0.96875 C 1.453125,-1.140625 1.390625,-1.296875 1.328125,-1.703125 L 0.375,-1.703125 C 0.421875,-0.375 1.15625,0.25 2.65625,0.25 C 4.09375,0.25 5,-0.453125 5,-1.5625 C 5,-2.40625 4.53125,-2.875 3.390625,-3.15625 L 2.515625,-3.359375 C 1.78125,-3.53125 1.46875,-3.78125 1.46875,-4.171875 C 1.46875,-4.703125 1.9375,-5.03125 2.671875,-5.03125 C 3.40625,-5.03125 3.796875,-4.71875 3.8125,-4.125 L 4.78125,-4.125 z"+ id="path99" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.09375,-3.40625 L 0.5,-3.40625 L 0.5,-2.625 L 3.09375,-2.625 L 3.09375,-3.40625 z"+ id="path102" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.765625,-5.71875 L 0.765625,0 L 1.671875,0 L 1.671875,-3.15625 C 1.671875,-4.3125 2.296875,-5.078125 3.234375,-5.078125 C 3.953125,-5.078125 4.40625,-4.640625 4.40625,-3.953125 L 4.40625,0 L 5.3125,0 L 5.3125,-4.3125 C 5.3125,-5.265625 4.609375,-5.875 3.5,-5.875 C 2.65625,-5.875 2.109375,-5.546875 1.609375,-4.75 L 1.609375,-5.71875 L 0.765625,-5.71875 z"+ id="path105" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.25,0 L 5.25,-5.71875 L 4.359375,-5.71875 L 4.359375,-2.46875 C 4.359375,-1.3125 3.734375,-0.546875 2.796875,-0.546875 C 2.078125,-0.546875 1.609375,-0.984375 1.609375,-1.671875 L 1.609375,-5.71875 L 0.703125,-5.71875 L 0.703125,-1.3125 C 0.703125,-0.359375 1.421875,0.25 2.53125,0.25 C 3.375,0.25 3.90625,-0.046875 4.4375,-0.796875 L 4.4375,0 L 5.25,0 z"+ id="path108" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path111" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.984375,-5.71875 L 0.78125,0 L 1.6875,0 L 2.453125,-3.59375 C 2.625,-4.421875 3.375,-5.09375 4.09375,-5.09375 C 4.640625,-5.09375 5,-4.78125 5,-4.34375 C 5,-4.21875 4.984375,-4.078125 4.953125,-3.9375 L 4.109375,0 L 5.03125,0 L 5.796875,-3.59375 C 5.96875,-4.4375 6.71875,-5.09375 7.5,-5.09375 C 8.015625,-5.09375 8.328125,-4.78125 8.328125,-4.25 C 8.328125,-4.09375 8.328125,-4.09375 8.234375,-3.71875 L 7.453125,0 L 8.359375,0 L 9.234375,-4.0625 C 9.265625,-4.1875 9.296875,-4.546875 9.296875,-4.671875 C 9.296875,-4.953125 9.15625,-5.25 8.9375,-5.5 C 8.703125,-5.765625 8.40625,-5.875 7.90625,-5.875 C 7.203125,-5.875 6.578125,-5.59375 5.9375,-4.96875 C 5.765625,-5.578125 5.328125,-5.875 4.609375,-5.875 C 3.875,-5.875 3.375,-5.65625 2.671875,-5 L 2.8125,-5.71875 L 1.984375,-5.71875 z"+ id="path114" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.015625,-0.5625 C 5.921875,-0.53125 5.875,-0.53125 5.828125,-0.53125 C 5.546875,-0.53125 5.421875,-0.625 5.421875,-0.84375 C 5.421875,-0.890625 5.421875,-0.921875 5.4375,-0.953125 L 6.125,-4.25 C 6.1875,-4.53125 6.1875,-4.53125 6.1875,-4.640625 C 6.1875,-5.390625 5.4375,-5.875 4.296875,-5.875 C 2.78125,-5.875 1.859375,-5.234375 1.640625,-4.03125 L 2.5625,-4.03125 C 2.65625,-4.328125 2.734375,-4.484375 2.890625,-4.640625 C 3.125,-4.875 3.59375,-5.03125 4.0625,-5.03125 C 4.71875,-5.03125 5.21875,-4.75 5.21875,-4.34375 C 5.21875,-4.296875 5.203125,-4.21875 5.1875,-4.140625 L 5.15625,-3.9375 C 5.0625,-3.484375 4.859375,-3.375 4.0625,-3.296875 C 2.59375,-3.15625 2.140625,-3.046875 1.609375,-2.71875 C 1.03125,-2.359375 0.703125,-1.78125 0.703125,-1.140625 C 0.703125,-0.265625 1.296875,0.25 2.28125,0.25 C 2.65625,0.25 3.125,0.171875 3.515625,0.03125 C 3.859375,-0.09375 4.03125,-0.203125 4.46875,-0.59375 L 4.46875,-0.515625 L 4.46875,-0.46875 C 4.46875,-0.015625 4.78125,0.25 5.296875,0.25 C 5.421875,0.25 5.453125,0.25 5.71875,0.1875 C 5.75,0.171875 5.8125,0.15625 5.875,0.15625 L 6.015625,-0.5625 z M 4.703125,-1.78125 C 4.5625,-1.109375 3.59375,-0.53125 2.640625,-0.53125 C 2.015625,-0.53125 1.671875,-0.796875 1.671875,-1.25 C 1.671875,-1.609375 1.875,-1.96875 2.203125,-2.171875 C 2.46875,-2.328125 2.796875,-2.421875 3.328125,-2.5 C 4.359375,-2.640625 4.4375,-2.65625 4.921875,-2.8125 L 4.703125,-1.78125 z"+ id="path117" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.078125,2.328125 L 1,2.328125 L 1.640625,-0.734375 C 1.984375,-0.03125 2.4375,0.25 3.203125,0.25 C 4.0625,0.25 4.875,-0.140625 5.4375,-0.828125 C 6.015625,-1.546875 6.390625,-2.6875 6.390625,-3.75 C 6.390625,-5.0625 5.65625,-5.875 4.5,-5.875 C 4.015625,-5.875 3.53125,-5.734375 3.09375,-5.453125 C 2.75,-5.234375 2.625,-5.09375 2.46875,-4.796875 L 2.671875,-5.71875 L 1.78125,-5.71875 L 0.078125,2.328125 z M 4.140625,-5.03125 C 4.953125,-5.03125 5.4375,-4.46875 5.4375,-3.53125 C 5.4375,-2.9375 5.25,-2.234375 4.953125,-1.6875 C 4.546875,-0.953125 4,-0.59375 3.296875,-0.59375 C 2.5,-0.59375 2,-1.140625 2,-2 C 2,-2.65625 2.1875,-3.375 2.515625,-3.9375 C 2.90625,-4.671875 3.453125,-5.03125 4.140625,-5.03125 z"+ id="path120" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.703125,-5.609375 C 7.765625,-5.921875 7.78125,-6.0625 7.78125,-6.234375 C 7.78125,-6.703125 7.5625,-7.203125 7.203125,-7.515625 C 6.75,-7.90625 6.171875,-8.078125 5.328125,-8.078125 C 4.203125,-8.078125 3.3125,-7.765625 2.71875,-7.15625 C 2.28125,-6.703125 1.9375,-5.921875 1.9375,-5.359375 C 1.9375,-4.671875 2.421875,-4.09375 3.15625,-3.890625 L 5.015625,-3.375 C 5.890625,-3.125 6.25,-2.796875 6.25,-2.28125 C 6.25,-1.9375 6.046875,-1.53125 5.734375,-1.25 C 5.296875,-0.84375 4.640625,-0.625 3.78125,-0.625 C 2.546875,-0.625 1.96875,-1.09375 1.96875,-2.078125 C 1.96875,-2.21875 1.984375,-2.328125 2.015625,-2.53125 L 1.0625,-2.53125 C 1,-2.25 0.96875,-2.078125 0.96875,-1.84375 C 0.96875,-0.53125 1.953125,0.25 3.59375,0.25 C 4.75,0.25 5.703125,-0.0625 6.34375,-0.671875 C 6.90625,-1.171875 7.296875,-1.96875 7.296875,-2.578125 C 7.296875,-2.875 7.203125,-3.171875 7.03125,-3.4375 C 6.796875,-3.8125 6.484375,-4.03125 5.96875,-4.171875 L 4.09375,-4.71875 C 3.25,-4.953125 2.984375,-5.171875 2.984375,-5.65625 C 2.984375,-6.03125 3.15625,-6.375 3.46875,-6.65625 C 3.875,-7.03125 4.40625,-7.203125 5.125,-7.203125 C 5.734375,-7.203125 6.1875,-7.078125 6.4375,-6.859375 C 6.640625,-6.671875 6.78125,-6.328125 6.78125,-6.015625 C 6.78125,-5.90625 6.765625,-5.828125 6.734375,-5.609375 L 7.703125,-5.609375 z"+ id="path123" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.890625,-3.125 L 8.90625,-7.953125 L 7.6875,-7.953125 L 4.53125,-4.0625 L 3.046875,-7.953125 L 1.828125,-7.953125 L 3.859375,-3.125 L 3.203125,0 L 4.21875,0 L 4.890625,-3.125 z"+ id="path126" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.03125,-5.71875 L 3.09375,-5.71875 L 3.265625,-6.46875 C 3.375,-7.015625 3.578125,-7.203125 4.046875,-7.203125 C 4.125,-7.203125 4.1875,-7.203125 4.34375,-7.171875 L 4.5,-7.921875 C 4.3125,-7.96875 4.1875,-7.984375 4.015625,-7.984375 C 3.171875,-7.984375 2.5625,-7.5 2.390625,-6.6875 L 2.1875,-5.71875 L 1.421875,-5.71875 L 1.265625,-4.984375 L 2.03125,-4.984375 L 0.96875,0 L 1.890625,0 L 2.9375,-4.984375 L 3.875,-4.984375 L 4.03125,-5.71875 z"+ id="path129" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.125,0 L 6.515625,-5.71875 L 5.53125,-5.71875 L 2.875,-1.109375 L 2.328125,-5.71875 L 1.328125,-5.71875 L 2.140625,0 L 3.125,0 z"+ id="path132" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.09375,-7.953125 L 6.171875,-7.953125 L 5.515625,-4.890625 C 5.171875,-5.59375 4.734375,-5.875 3.953125,-5.875 C 2.15625,-5.875 0.796875,-4.15625 0.796875,-1.859375 C 0.796875,-0.578125 1.53125,0.25 2.65625,0.25 C 3.125,0.25 3.625,0.09375 4.0625,-0.15625 C 4.390625,-0.359375 4.53125,-0.53125 4.6875,-0.828125 L 4.515625,0 L 5.40625,0 L 7.09375,-7.953125 z M 3.875,-5.03125 C 4.671875,-5.03125 5.15625,-4.5 5.15625,-3.5625 C 5.15625,-2.921875 4.984375,-2.25 4.65625,-1.6875 C 4.234375,-0.953125 3.703125,-0.59375 3.03125,-0.59375 C 2.21875,-0.59375 1.75,-1.140625 1.75,-2.078125 C 1.75,-2.6875 1.9375,-3.375 2.234375,-3.9375 C 2.65625,-4.6875 3.171875,-5.03125 3.875,-5.03125 z"+ id="path135" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.140625,-2.546875 L 6.171875,-2.734375 C 6.265625,-3.265625 6.328125,-3.71875 6.328125,-4.015625 C 6.328125,-5.0625 5.421875,-5.875 4.25,-5.875 C 3.296875,-5.875 2.375,-5.4375 1.828125,-4.703125 C 1.3125,-4.015625 0.921875,-2.765625 0.921875,-1.890625 C 0.921875,-1.296875 1.171875,-0.703125 1.59375,-0.296875 C 1.96875,0.078125 2.453125,0.25 3.078125,0.25 C 4.390625,0.25 5.5,-0.5625 5.84375,-1.734375 L 4.921875,-1.734375 C 4.53125,-0.984375 3.953125,-0.59375 3.234375,-0.59375 C 2.359375,-0.59375 1.875,-1.125 1.875,-2.046875 C 1.875,-2.28125 1.890625,-2.390625 1.9375,-2.546875 L 6.140625,-2.546875 z M 2.125,-3.34375 C 2.40625,-4.34375 3.21875,-5.03125 4.09375,-5.03125 C 4.875,-5.03125 5.359375,-4.515625 5.359375,-3.703125 C 5.359375,-3.59375 5.359375,-3.515625 5.328125,-3.34375 L 2.125,-3.34375 z"+ id="path138" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.34375,-7.953125 L 2.4375,-7.953125 L 0.734375,0 L 1.65625,0 L 3.34375,-7.953125 z"+ id="path141" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.46875,-5.71875 L 2.921875,-1.28125 L 2.421875,-5.71875 L 1.4375,-5.71875 L 2.1875,0.046875 L 1.609375,0.921875 C 1.3125,1.390625 1.140625,1.5 0.734375,1.5 C 0.625,1.5 0.5625,1.484375 0.265625,1.453125 L 0.09375,2.265625 C 0.28125,2.359375 0.421875,2.375 0.625,2.375 C 1.390625,2.375 1.953125,2 2.421875,1.203125 L 6.4375,-5.71875 L 5.46875,-5.71875 z"+ id="path144" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.609375,-4.125 C 5.65625,-4.359375 5.671875,-4.453125 5.671875,-4.59375 C 5.671875,-5.359375 4.9375,-5.875 3.875,-5.875 C 3.109375,-5.875 2.4375,-5.65625 2,-5.21875 C 1.609375,-4.84375 1.34375,-4.28125 1.34375,-3.765625 C 1.34375,-3.09375 1.71875,-2.78125 2.84375,-2.484375 L 3.65625,-2.28125 C 4.015625,-2.1875 4.171875,-2.109375 4.28125,-2 C 4.359375,-1.890625 4.421875,-1.734375 4.421875,-1.640625 C 4.421875,-1.4375 4.25,-1.09375 4.0625,-0.953125 C 3.796875,-0.734375 3.328125,-0.59375 2.859375,-0.59375 C 2.109375,-0.59375 1.671875,-0.890625 1.671875,-1.421875 C 1.671875,-1.5 1.6875,-1.59375 1.703125,-1.703125 L 0.734375,-1.703125 C 0.671875,-1.453125 0.671875,-1.3125 0.671875,-1.140625 C 0.671875,-0.265625 1.421875,0.25 2.6875,0.25 C 4.3125,0.25 5.375,-0.59375 5.375,-1.890625 C 5.375,-2.546875 5.015625,-2.90625 4.0625,-3.140625 L 3.234375,-3.34375 C 2.625,-3.5 2.296875,-3.71875 2.296875,-4 C 2.296875,-4.21875 2.4375,-4.5 2.625,-4.671875 C 2.890625,-4.921875 3.21875,-5.03125 3.703125,-5.03125 C 4.34375,-5.03125 4.703125,-4.78125 4.703125,-4.359375 C 4.703125,-4.28125 4.703125,-4.203125 4.6875,-4.125 L 5.609375,-4.125 z"+ id="path147" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path150" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.1875,-5.65625 C 1.671875,-5.65625 1.1875,-5.421875 0.890625,-5.03125 C 0.53125,-4.53125 0.34375,-3.78125 0.34375,-2.734375 C 0.34375,-0.828125 0.984375,0.1875 2.1875,0.1875 C 3.390625,0.1875 4.046875,-0.828125 4.046875,-2.6875 C 4.046875,-3.78125 3.859375,-4.515625 3.484375,-5.03125 C 3.203125,-5.421875 2.71875,-5.65625 2.1875,-5.65625 z M 2.1875,-5.03125 C 2.953125,-5.03125 3.328125,-4.265625 3.328125,-2.75 C 3.328125,-1.140625 2.953125,-0.390625 2.171875,-0.390625 C 1.4375,-0.390625 1.0625,-1.171875 1.0625,-2.71875 C 1.0625,-4.265625 1.4375,-5.03125 2.1875,-5.03125 z"+ id="path153" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.0625,-4.03125 L 2.0625,0 L 2.765625,0 L 2.765625,-5.65625 L 2.296875,-5.65625 C 2.0625,-4.78125 1.890625,-4.65625 0.8125,-4.53125 L 0.8125,-4.03125 L 2.0625,-4.03125 z"+ id="path156" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.03125,-0.6875 L 1.0625,-0.6875 C 1.125,-1.15625 1.390625,-1.453125 2.078125,-1.859375 L 2.875,-2.28125 C 3.671875,-2.71875 4.078125,-3.296875 4.078125,-4 C 4.078125,-4.46875 3.875,-4.90625 3.546875,-5.203125 C 3.21875,-5.5 2.796875,-5.65625 2.265625,-5.65625 C 1.546875,-5.65625 1.015625,-5.390625 0.703125,-4.921875 C 0.5,-4.609375 0.421875,-4.265625 0.390625,-3.6875 L 1.09375,-3.6875 C 1.125,-4.078125 1.171875,-4.296875 1.265625,-4.484375 C 1.453125,-4.828125 1.8125,-5.03125 2.234375,-5.03125 C 2.875,-5.03125 3.359375,-4.578125 3.359375,-3.96875 C 3.359375,-3.53125 3.09375,-3.140625 2.59375,-2.859375 L 1.859375,-2.453125 C 0.671875,-1.78125 0.328125,-1.25 0.265625,0 L 4.03125,0 L 4.03125,-0.6875 z"+ id="path159" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path162" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.359375,-5.8125 L 1.703125,-5.8125 L 0.46875,0 L 1.125,0 L 1.46875,-1.625 L 2.328125,-2.3125 L 3.234375,0 L 4,0 L 2.890625,-2.734375 L 4.65625,-4.171875 L 3.796875,-4.171875 L 1.65625,-2.4375 L 2.359375,-5.8125 z"+ id="path165" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path168" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.890625,0 L 2.890625,-3.140625 L 2.390625,-3.140625 L 2.390625,-1.359375 C 2.390625,-0.71875 2.046875,-0.296875 1.53125,-0.296875 C 1.140625,-0.296875 0.890625,-0.53125 0.890625,-0.921875 L 0.890625,-3.140625 L 0.390625,-3.140625 L 0.390625,-0.71875 C 0.390625,-0.203125 0.78125,0.140625 1.390625,0.140625 C 1.84375,0.140625 2.140625,-0.03125 2.4375,-0.4375 L 2.4375,0 L 2.890625,0 z"+ id="path171" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-3.140625 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 2.171875,-2.78125 2.421875,-2.546875 2.421875,-2.171875 L 2.421875,0 L 2.921875,0 L 2.921875,-2.375 C 2.921875,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.453125,-3.21875 1.15625,-3.046875 0.875,-2.609375 L 0.875,-3.140625 L 0.421875,-3.140625 z"+ id="path174" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.890625,-3.140625 L 0.40625,-3.140625 L 0.40625,0 L 0.890625,0 L 0.890625,-3.140625 z M 0.890625,-4.359375 L 0.390625,-4.359375 L 0.390625,-3.734375 L 0.890625,-3.734375 L 0.890625,-4.359375 z"+ id="path177" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,0 L 2.90625,-3.140625 L 2.34375,-3.140625 L 1.453125,-0.59375 L 0.625,-3.140625 L 0.0625,-3.140625 L 1.15625,0 L 1.703125,0 z"+ id="path180" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.0625,-1.40625 C 3.0625,-1.875 3.03125,-2.171875 2.9375,-2.40625 C 2.734375,-2.921875 2.265625,-3.21875 1.671875,-3.21875 C 0.796875,-3.21875 0.234375,-2.5625 0.234375,-1.53125 C 0.234375,-0.5 0.78125,0.140625 1.65625,0.140625 C 2.375,0.140625 2.875,-0.265625 3,-0.953125 L 2.5,-0.953125 C 2.359375,-0.53125 2.078125,-0.328125 1.6875,-0.328125 C 1.359375,-0.328125 1.09375,-0.46875 0.921875,-0.734375 C 0.8125,-0.90625 0.765625,-1.09375 0.765625,-1.40625 L 3.0625,-1.40625 z M 0.765625,-1.8125 C 0.8125,-2.390625 1.171875,-2.765625 1.671875,-2.765625 C 2.15625,-2.765625 2.53125,-2.359375 2.53125,-1.84375 C 2.53125,-1.828125 2.53125,-1.8125 2.53125,-1.8125 L 0.765625,-1.8125 z"+ id="path183" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.40625,-3.140625 L 0.40625,0 L 0.921875,0 L 0.921875,-1.625 C 0.921875,-2.078125 1.03125,-2.375 1.265625,-2.546875 C 1.421875,-2.65625 1.578125,-2.6875 1.921875,-2.703125 L 1.921875,-3.203125 C 1.84375,-3.21875 1.796875,-3.21875 1.734375,-3.21875 C 1.40625,-3.21875 1.15625,-3.03125 0.875,-2.5625 L 0.875,-3.140625 L 0.40625,-3.140625 z"+ id="path186" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.625,-2.265625 C 2.609375,-2.875 2.203125,-3.21875 1.484375,-3.21875 C 0.75,-3.21875 0.28125,-2.84375 0.28125,-2.265625 C 0.28125,-1.78125 0.53125,-1.546875 1.28125,-1.359375 L 1.734375,-1.25 C 2.09375,-1.171875 2.21875,-1.046875 2.21875,-0.8125 C 2.21875,-0.515625 1.9375,-0.328125 1.5,-0.328125 C 1.234375,-0.328125 1,-0.40625 0.875,-0.53125 C 0.796875,-0.625 0.765625,-0.71875 0.734375,-0.9375 L 0.203125,-0.9375 C 0.234375,-0.203125 0.640625,0.140625 1.453125,0.140625 C 2.25,0.140625 2.75,-0.25 2.75,-0.859375 C 2.75,-1.328125 2.484375,-1.578125 1.859375,-1.734375 L 1.375,-1.84375 C 0.96875,-1.9375 0.796875,-2.078125 0.796875,-2.296875 C 0.796875,-2.578125 1.0625,-2.765625 1.46875,-2.765625 C 1.859375,-2.765625 2.078125,-2.59375 2.09375,-2.265625 L 2.625,-2.265625 z"+ id="path189" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.515625,-3.140625 L 1,-3.140625 L 1,-4 L 0.515625,-4 L 0.515625,-3.140625 L 0.078125,-3.140625 L 0.078125,-2.734375 L 0.515625,-2.734375 L 0.515625,-0.359375 C 0.515625,-0.046875 0.71875,0.140625 1.109375,0.140625 C 1.234375,0.140625 1.359375,0.125 1.515625,0.09375 L 1.515625,-0.328125 C 1.453125,-0.3125 1.375,-0.296875 1.28125,-0.296875 C 1.0625,-0.296875 1,-0.359375 1,-0.578125 L 1,-2.734375 L 1.515625,-2.734375 L 1.515625,-3.140625 z"+ id="path192" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.328125,-3.140625 L 1.453125,-0.6875 L 0.65625,-3.140625 L 0.125,-3.140625 L 1.171875,0.015625 L 0.984375,0.515625 C 0.90625,0.734375 0.796875,0.8125 0.59375,0.8125 C 0.515625,0.8125 0.4375,0.796875 0.328125,0.78125 L 0.328125,1.234375 C 0.421875,1.28125 0.53125,1.296875 0.65625,1.296875 C 0.8125,1.296875 1,1.25 1.125,1.15625 C 1.28125,1.046875 1.375,0.90625 1.46875,0.65625 L 2.859375,-3.140625 L 2.328125,-3.140625 z"+ id="path195" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,-1.859375 L 0.28125,-1.859375 L 0.28125,-1.4375 L 1.703125,-1.4375 L 1.703125,-1.859375 z"+ id="path198" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.90625,-4.359375 L 0.40625,-4.359375 L 0.40625,0 L 0.90625,0 L 0.90625,-4.359375 z"+ id="path201" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-3.21875 C 0.75,-3.21875 0.21875,-2.59375 0.21875,-1.546875 C 0.21875,-0.484375 0.734375,0.140625 1.640625,0.140625 C 2.515625,0.140625 3.046875,-0.484375 3.046875,-1.515625 C 3.046875,-2.609375 2.53125,-3.21875 1.625,-3.21875 z M 1.640625,-2.765625 C 2.203125,-2.765625 2.53125,-2.296875 2.53125,-1.53125 C 2.53125,-0.796875 2.1875,-0.328125 1.640625,-0.328125 C 1.078125,-0.328125 0.734375,-0.78125 0.734375,-1.546875 C 0.734375,-2.296875 1.078125,-2.765625 1.640625,-2.765625 z"+ id="path204" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-3.140625 L 2.46875,-2.6875 C 2.21875,-3.046875 1.90625,-3.21875 1.515625,-3.21875 C 0.71875,-3.21875 0.171875,-2.53125 0.171875,-1.515625 C 0.171875,-1 0.3125,-0.578125 0.5625,-0.28125 C 0.796875,-0.015625 1.140625,0.140625 1.46875,0.140625 C 1.859375,0.140625 2.140625,-0.03125 2.421875,-0.421875 L 2.421875,-0.265625 C 2.421875,0.15625 2.359375,0.421875 2.234375,0.59375 C 2.109375,0.78125 1.84375,0.890625 1.546875,0.890625 C 1.3125,0.890625 1.109375,0.828125 0.96875,0.71875 C 0.859375,0.625 0.8125,0.546875 0.78125,0.359375 L 0.28125,0.359375 C 0.328125,0.953125 0.796875,1.296875 1.53125,1.296875 C 2,1.296875 2.390625,1.15625 2.59375,0.90625 C 2.84375,0.609375 2.921875,0.21875 2.921875,-0.515625 L 2.921875,-3.140625 L 2.46875,-3.140625 z M 1.5625,-2.765625 C 2.09375,-2.765625 2.421875,-2.3125 2.421875,-1.53125 C 2.421875,-0.78125 2.09375,-0.328125 1.5625,-0.328125 C 1.015625,-0.328125 0.6875,-0.78125 0.6875,-1.546875 C 0.6875,-2.296875 1.03125,-2.765625 1.5625,-2.765625 z"+ id="path207" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.84375,-1.3125 L 3.28125,0 L 3.90625,0 L 2.375,-4.359375 L 1.65625,-4.359375 L 0.109375,0 L 0.6875,0 L 1.15625,-1.3125 L 2.84375,-1.3125 z M 2.6875,-1.78125 L 1.296875,-1.78125 L 2.015625,-3.765625 L 2.6875,-1.78125 z"+ id="path210" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.140625,-0.625 L 0.515625,-0.625 L 0.515625,0 L 1.140625,0 L 1.140625,-0.625 z"+ id="path213" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.8125,-2.078125 C 2.796875,-2.390625 2.734375,-2.578125 2.609375,-2.765625 C 2.390625,-3.046875 2.015625,-3.21875 1.578125,-3.21875 C 0.734375,-3.21875 0.1875,-2.5625 0.1875,-1.515625 C 0.1875,-0.5 0.71875,0.140625 1.578125,0.140625 C 2.328125,0.140625 2.796875,-0.3125 2.859375,-1.078125 L 2.359375,-1.078125 C 2.265625,-0.578125 2.015625,-0.328125 1.578125,-0.328125 C 1.03125,-0.328125 0.703125,-0.765625 0.703125,-1.515625 C 0.703125,-2.296875 1.03125,-2.765625 1.578125,-2.765625 C 2,-2.765625 2.25,-2.515625 2.3125,-2.078125 L 2.8125,-2.078125 z"+ id="path216" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.203125,-0.296875 C 3.140625,-0.28125 3.125,-0.28125 3.09375,-0.28125 C 2.921875,-0.28125 2.828125,-0.375 2.828125,-0.53125 L 2.828125,-2.375 C 2.828125,-2.921875 2.421875,-3.21875 1.640625,-3.21875 C 1.1875,-3.21875 0.8125,-3.09375 0.609375,-2.859375 C 0.453125,-2.703125 0.40625,-2.515625 0.390625,-2.203125 L 0.890625,-2.203125 C 0.9375,-2.59375 1.15625,-2.765625 1.625,-2.765625 C 2.078125,-2.765625 2.328125,-2.59375 2.328125,-2.296875 L 2.328125,-2.171875 C 2.328125,-1.953125 2.203125,-1.859375 1.8125,-1.8125 C 1.09375,-1.734375 1,-1.703125 0.796875,-1.625 C 0.4375,-1.484375 0.25,-1.203125 0.25,-0.796875 C 0.25,-0.21875 0.640625,0.140625 1.28125,0.140625 C 1.671875,0.140625 2,0 2.34375,-0.328125 C 2.375,0 2.53125,0.140625 2.859375,0.140625 C 2.96875,0.140625 3.046875,0.125 3.203125,0.078125 L 3.203125,-0.296875 z M 2.328125,-0.984375 C 2.328125,-0.8125 2.28125,-0.71875 2.125,-0.578125 C 1.921875,-0.390625 1.6875,-0.296875 1.390625,-0.296875 C 1,-0.296875 0.765625,-0.484375 0.765625,-0.796875 C 0.765625,-1.125 1,-1.296875 1.53125,-1.375 C 2.046875,-1.453125 2.15625,-1.46875 2.328125,-1.546875 L 2.328125,-0.984375 z"+ id="path219" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.40625,-4.359375 C 0.8125,-3.578125 0.4375,-2.484375 0.4375,-1.546875 C 0.4375,-0.609375 0.8125,0.484375 1.40625,1.265625 L 1.734375,1.265625 C 1.21875,0.40625 0.921875,-0.59375 0.921875,-1.546875 C 0.921875,-2.5 1.21875,-3.515625 1.734375,-4.359375 L 1.40625,-4.359375 z"+ id="path222" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.03125,-1.53125 L 1.734375,-2.234375 L 3.28125,0 L 3.9375,0 L 2.140625,-2.578125 L 3.921875,-4.359375 L 3.203125,-4.359375 L 1.03125,-2.15625 L 1.03125,-4.359375 L 0.46875,-4.359375 L 0.46875,0 L 1.03125,0 L 1.03125,-1.53125 z"+ id="path225" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.125,-3.875 L 3.546875,-3.875 L 3.546875,-4.359375 L 0.125,-4.359375 L 0.125,-3.875 L 1.5625,-3.875 L 1.5625,0 L 2.125,0 L 2.125,-3.875 z"+ id="path228" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.296875,-1.984375 L 3.296875,0 L 3.859375,0 L 3.859375,-4.359375 L 3.296875,-4.359375 L 3.296875,-2.484375 L 1.046875,-2.484375 L 1.046875,-4.359375 L 0.5,-4.359375 L 0.5,0 L 1.0625,0 L 1.0625,-1.984375 L 3.296875,-1.984375 z"+ id="path231" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-22"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.5625,1.265625 C 1.15625,0.484375 1.53125,-0.609375 1.53125,-1.546875 C 1.53125,-2.484375 1.15625,-3.578125 0.5625,-4.359375 L 0.234375,-4.359375 C 0.75,-3.5 1.046875,-2.5 1.046875,-1.546875 C 1.046875,-0.59375 0.75,0.421875 0.234375,1.265625 L 0.5625,1.265625 z"+ id="path234" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-23"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,-1.984375 L 3.171875,-1.984375 L 3.171875,-2.484375 L 1.09375,-2.484375 L 1.09375,-3.875 L 3.46875,-3.875 L 3.46875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 L 1.09375,0 L 1.09375,-1.984375 z"+ id="path237" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-24"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.5625,-3.078125 C 3.5625,-3.9375 2.96875,-4.4375 1.96875,-4.4375 C 1.015625,-4.4375 0.421875,-3.9375 0.421875,-3.15625 C 0.421875,-2.625 0.703125,-2.28125 1.28125,-2.140625 L 2.359375,-1.84375 C 2.90625,-1.703125 3.15625,-1.484375 3.15625,-1.140625 C 3.15625,-0.90625 3.03125,-0.671875 2.84375,-0.53125 C 2.671875,-0.421875 2.40625,-0.359375 2.046875,-0.359375 C 1.578125,-0.359375 1.25,-0.46875 1.046875,-0.71875 C 0.875,-0.90625 0.8125,-1.125 0.8125,-1.390625 L 0.28125,-1.390625 C 0.296875,-0.984375 0.375,-0.71875 0.546875,-0.484375 C 0.84375,-0.078125 1.34375,0.140625 2.015625,0.140625 C 2.53125,0.140625 2.953125,0.015625 3.234375,-0.203125 C 3.53125,-0.4375 3.71875,-0.8125 3.71875,-1.203125 C 3.71875,-1.734375 3.375,-2.125 2.78125,-2.296875 L 1.6875,-2.578125 C 1.171875,-2.734375 0.96875,-2.890625 0.96875,-3.234375 C 0.96875,-3.671875 1.359375,-3.96875 1.953125,-3.96875 C 2.640625,-3.96875 3.03125,-3.65625 3.046875,-3.078125 L 3.5625,-3.078125 z"+ id="path240" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-25"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.53125,0 L 2.21875,0 C 3.3125,0 3.984375,-0.828125 3.984375,-2.1875 C 3.984375,-3.53125 3.328125,-4.359375 2.21875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 z M 1.09375,-0.484375 L 1.09375,-3.875 L 2.125,-3.875 C 2.984375,-3.875 3.4375,-3.296875 3.4375,-2.171875 C 3.4375,-1.078125 2.984375,-0.484375 2.125,-0.484375 L 1.09375,-0.484375 z"+ id="path243" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-26"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.796875,0 L 4.03125,-3.65625 L 4.03125,0 L 4.546875,0 L 4.546875,-4.359375 L 3.78125,-4.359375 L 2.515625,-0.5625 L 1.21875,-4.359375 L 0.453125,-4.359375 L 0.453125,0 L 0.96875,0 L 0.96875,-3.65625 L 2.21875,0 L 2.796875,0 z"+ id="path246" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-27"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-4.359375 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 1.921875,-2.78125 2.09375,-2.734375 2.203125,-2.640625 C 2.359375,-2.546875 2.40625,-2.390625 2.40625,-2.171875 L 2.40625,0 L 2.90625,0 L 2.90625,-2.375 C 2.90625,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.484375,-3.21875 1.203125,-3.09375 0.921875,-2.703125 L 0.921875,-4.359375 L 0.421875,-4.359375 z"+ id="path249" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-28"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.03125,-0.515625 L 0.796875,-0.515625 C 0.84375,-0.875 1.046875,-1.09375 1.5625,-1.390625 L 2.15625,-1.71875 C 2.75,-2.046875 3.0625,-2.484375 3.0625,-3 C 3.0625,-3.34375 2.921875,-3.6875 2.65625,-3.90625 C 2.40625,-4.140625 2.09375,-4.25 1.703125,-4.25 C 1.15625,-4.25 0.765625,-4.046875 0.53125,-3.6875 C 0.375,-3.46875 0.3125,-3.203125 0.296875,-2.765625 L 0.828125,-2.765625 C 0.84375,-3.0625 0.875,-3.234375 0.953125,-3.375 C 1.09375,-3.625 1.359375,-3.78125 1.6875,-3.78125 C 2.15625,-3.78125 2.515625,-3.4375 2.515625,-2.984375 C 2.515625,-2.65625 2.328125,-2.359375 1.9375,-2.140625 L 1.390625,-1.84375 C 0.515625,-1.328125 0.25,-0.9375 0.203125,0 L 3.03125,0 L 3.03125,-0.515625 z"+ id="path252" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-29"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.109375,-4.25 L 0.28125,-4.25 L 0.28125,-3.71875 L 2.5625,-3.71875 C 1.5625,-2.28125 1.140625,-1.390625 0.828125,0 L 1.390625,0 C 1.625,-1.359375 2.15625,-2.53125 3.109375,-3.796875 L 3.109375,-4.25 z"+ id="path255" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-30"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.515625,-0.625 L 0.515625,0 L 0.875,0 L 0.875,0.109375 C 0.875,0.515625 0.796875,0.640625 0.515625,0.65625 L 0.515625,0.875 C 0.9375,0.875 1.15625,0.609375 1.15625,0.09375 L 1.15625,-0.625 L 0.515625,-0.625 z"+ id="path258" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-31"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-4.25 C 1.25,-4.25 0.890625,-4.0625 0.671875,-3.78125 C 0.390625,-3.40625 0.25,-2.84375 0.25,-2.046875 C 0.25,-0.625 0.734375,0.140625 1.640625,0.140625 C 2.546875,0.140625 3.03125,-0.625 3.03125,-2.015625 C 3.03125,-2.84375 2.90625,-3.390625 2.625,-3.78125 C 2.40625,-4.078125 2.046875,-4.25 1.640625,-4.25 z M 1.640625,-3.78125 C 2.21875,-3.78125 2.5,-3.203125 2.5,-2.0625 C 2.5,-0.859375 2.21875,-0.296875 1.640625,-0.296875 C 1.078125,-0.296875 0.796875,-0.890625 0.796875,-2.046875 C 0.796875,-3.203125 1.078125,-3.78125 1.640625,-3.78125 z"+ id="path261" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-32"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.34375,-2.234375 C 2.78125,-2.5 2.921875,-2.703125 2.921875,-3.109375 C 2.921875,-3.78125 2.40625,-4.25 1.640625,-4.25 C 0.890625,-4.25 0.375,-3.78125 0.375,-3.109375 C 0.375,-2.71875 0.515625,-2.5 0.953125,-2.234375 C 0.453125,-2 0.21875,-1.640625 0.21875,-1.171875 C 0.21875,-0.40625 0.8125,0.140625 1.640625,0.140625 C 2.484375,0.140625 3.0625,-0.40625 3.0625,-1.171875 C 3.0625,-1.640625 2.828125,-2 2.34375,-2.234375 z M 1.640625,-3.78125 C 2.09375,-3.78125 2.375,-3.515625 2.375,-3.09375 C 2.375,-2.703125 2.09375,-2.4375 1.640625,-2.4375 C 1.203125,-2.4375 0.90625,-2.703125 0.90625,-3.109375 C 0.90625,-3.515625 1.203125,-3.78125 1.640625,-3.78125 z M 1.640625,-2 C 2.171875,-2 2.53125,-1.65625 2.53125,-1.171875 C 2.53125,-0.671875 2.171875,-0.328125 1.640625,-0.328125 C 1.125,-0.328125 0.765625,-0.671875 0.765625,-1.171875 C 0.765625,-1.65625 1.125,-2 1.640625,-2 z"+ id="path264" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-33"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.546875,-3.015625 L 1.546875,0 L 2.078125,0 L 2.078125,-4.25 L 1.734375,-4.25 C 1.546875,-3.59375 1.421875,-3.5 0.609375,-3.40625 L 0.609375,-3.015625 L 1.546875,-3.015625 z"+ id="path267" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-34"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.375,-4.359375 L -0.046875,0.125 L 0.28125,0.125 L 1.703125,-4.359375 L 1.375,-4.359375 z"+ id="path270" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-35"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.328125,-1.9375 L 1.390625,-1.9375 L 1.609375,-1.953125 C 2.1875,-1.953125 2.484375,-1.6875 2.484375,-1.171875 C 2.484375,-0.640625 2.15625,-0.328125 1.609375,-0.328125 C 1.03125,-0.328125 0.75,-0.609375 0.71875,-1.234375 L 0.1875,-1.234375 C 0.21875,-0.890625 0.28125,-0.671875 0.375,-0.484375 C 0.59375,-0.078125 1.015625,0.140625 1.59375,0.140625 C 2.46875,0.140625 3.03125,-0.390625 3.03125,-1.1875 C 3.03125,-1.71875 2.8125,-2.015625 2.3125,-2.203125 C 2.703125,-2.359375 2.90625,-2.65625 2.90625,-3.078125 C 2.90625,-3.8125 2.421875,-4.25 1.609375,-4.25 C 0.75,-4.25 0.296875,-3.78125 0.28125,-2.875 L 0.8125,-2.875 C 0.8125,-3.125 0.84375,-3.265625 0.90625,-3.40625 C 1.015625,-3.640625 1.28125,-3.78125 1.609375,-3.78125 C 2.078125,-3.78125 2.359375,-3.5 2.359375,-3.0625 C 2.359375,-2.765625 2.25,-2.578125 2.015625,-2.484375 C 1.875,-2.421875 1.6875,-2.40625 1.328125,-2.390625 L 1.328125,-1.9375 z"+ id="path273" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path276" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.015625,-1 C 5.015625,-1.25 5.015625,-1.3125 4.859375,-1.3125 C 4.203125,-1.3125 3.125,-1.40625 2.140625,-1.890625 C 0.953125,-2.46875 0.515625,-3.15625 0.234375,-3.59375 C 0.203125,-3.640625 0.140625,-3.640625 0,-3.640625 C -0.25,-3.640625 -0.265625,-3.625 -0.265625,-3.359375 L -0.265625,-3.1875 C 1.21875,-0.515625 3.671875,0 4.78125,0 C 5.015625,0 5.015625,-0.015625 5.015625,-0.3125 L 5.015625,-1 z"+ id="path279" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.171875,1.875 C 3.6875,-0.796875 1.234375,-1.3125 0.125,-1.3125 C -0.109375,-1.3125 -0.109375,-1.296875 -0.109375,-1 L -0.109375,-0.3125 C -0.109375,-0.046875 -0.109375,0 0.046875,0 C 0.703125,0.015625 1.78125,0.09375 2.765625,0.578125 C 3.953125,1.171875 4.390625,1.859375 4.671875,2.28125 C 4.703125,2.328125 4.765625,2.328125 4.90625,2.328125 C 5.15625,2.328125 5.171875,2.328125 5.171875,2.046875 L 5.171875,1.875 z"+ id="path282" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.015625,-1 C 5.015625,-1.296875 5.015625,-1.3125 4.78125,-1.3125 C 3.671875,-1.3125 1.21875,-0.78125 -0.265625,1.875 L -0.265625,2.046875 C -0.265625,2.328125 -0.25,2.328125 0,2.328125 C 0.203125,2.328125 0.21875,2.328125 0.265625,2.25 C 1.171875,0.8125 2.671875,0.046875 4.890625,0 C 5.015625,0 5.015625,-0.078125 5.015625,-0.3125 L 5.015625,-1 z"+ id="path285" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.171875,-3.359375 C 5.171875,-3.625 5.15625,-3.640625 4.90625,-3.640625 C 4.703125,-3.640625 4.6875,-3.625 4.640625,-3.5625 C 3.734375,-2.125 2.234375,-1.359375 0.015625,-1.3125 C -0.109375,-1.3125 -0.109375,-1.234375 -0.109375,-1 L -0.109375,-0.3125 C -0.109375,-0.015625 -0.109375,0 0.125,0 C 1.234375,0 3.6875,-0.53125 5.171875,-3.1875 L 5.171875,-3.359375 z"+ id="path288" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path291" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.171875,-8.96875 C 1.390625,-7.359375 0.9375,-4.9375 0.9375,-2.984375 C 0.9375,-0.890625 1.453125,1.453125 3.171875,3 L 3.890625,3 C 3.4375,2.5625 2.703125,1.640625 2.28125,0.28125 C 1.953125,-0.78125 1.84375,-1.890625 1.84375,-2.96875 C 1.84375,-6.5 3.09375,-8.21875 3.890625,-8.96875 L 3.171875,-8.96875 z"+ id="path294" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.359375,3 C 3.15625,1.40625 3.609375,-1.03125 3.609375,-2.96875 C 3.609375,-5.078125 3.09375,-7.421875 1.359375,-8.96875 L 0.640625,-8.96875 C 1.109375,-8.53125 1.84375,-7.609375 2.265625,-6.25 C 2.578125,-5.1875 2.703125,-4.078125 2.703125,-2.984375 C 2.703125,0.53125 1.453125,2.265625 0.640625,3 L 1.359375,3 z"+ id="path297" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path300" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.75,-5.71875 C 6.890625,-5.796875 6.953125,-5.828125 6.953125,-5.953125 C 6.953125,-6.09375 6.84375,-6.171875 6.734375,-6.171875 C 6.6875,-6.171875 6.59375,-6.125 6.546875,-6.109375 L 0.8125,-2.953125 C 0.671875,-2.875 0.609375,-2.84375 0.609375,-2.71875 C 0.609375,-2.59375 0.703125,-2.546875 0.8125,-2.484375 L 6.546875,0.65625 C 6.59375,0.6875 6.65625,0.71875 6.734375,0.71875 C 6.890625,0.71875 6.953125,0.59375 6.953125,0.5 C 6.953125,0.375 6.890625,0.34375 6.75,0.265625 L 1.28125,-2.71875 L 6.75,-5.71875 z M 10.078125,-5.71875 C 10.21875,-5.796875 10.28125,-5.828125 10.28125,-5.953125 C 10.28125,-6.09375 10.171875,-6.171875 10.0625,-6.171875 C 10.015625,-6.171875 9.921875,-6.125 9.875,-6.109375 L 4.140625,-2.953125 C 3.984375,-2.875 3.9375,-2.84375 3.9375,-2.71875 C 3.9375,-2.59375 4.03125,-2.546875 4.140625,-2.484375 L 9.875,0.65625 C 9.921875,0.6875 9.984375,0.71875 10.0625,0.71875 C 10.21875,0.71875 10.28125,0.59375 10.28125,0.5 C 10.28125,0.375 10.21875,0.34375 10.078125,0.265625 L 4.609375,-2.71875 L 10.078125,-5.71875 z"+ id="path303" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.09375,-2.71875 C 2.09375,-3.046875 1.828125,-3.296875 1.515625,-3.296875 C 1.203125,-3.296875 0.9375,-3.046875 0.9375,-2.71875 C 0.9375,-2.40625 1.203125,-2.15625 1.515625,-2.15625 C 1.828125,-2.15625 2.09375,-2.40625 2.09375,-2.71875 z"+ id="path306" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.765625,-2.5 C 6.90625,-2.578125 6.953125,-2.609375 6.953125,-2.71875 C 6.953125,-2.859375 6.875,-2.90625 6.765625,-2.96875 L 1.015625,-6.109375 C 0.96875,-6.125 0.890625,-6.171875 0.828125,-6.171875 C 0.734375,-6.171875 0.609375,-6.09375 0.609375,-5.953125 C 0.609375,-5.828125 0.671875,-5.796875 0.8125,-5.71875 L 6.28125,-2.71875 L 0.8125,0.265625 C 0.671875,0.34375 0.609375,0.375 0.609375,0.5 C 0.609375,0.71875 0.8125,0.71875 0.890625,0.71875 L 6.765625,-2.5 z M 10.09375,-2.5 C 10.234375,-2.578125 10.28125,-2.609375 10.28125,-2.71875 C 10.28125,-2.859375 10.203125,-2.90625 10.09375,-2.96875 L 4.34375,-6.109375 C 4.296875,-6.125 4.203125,-6.171875 4.15625,-6.171875 C 4.0625,-6.171875 3.9375,-6.09375 3.9375,-5.953125 C 3.9375,-5.828125 4,-5.796875 4.140625,-5.71875 L 9.609375,-2.71875 L 4.140625,0.265625 C 4,0.34375 3.9375,0.375 3.9375,0.5 C 3.9375,0.71875 4.140625,0.71875 4.21875,0.71875 L 10.09375,-2.5 z"+ id="path309" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path312" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.953125,-8.171875 C 2.609375,-7.859375 1.875,-7.1875 1.375,-5.84375 C 0.9375,-4.671875 0.859375,-3.515625 0.859375,-2.71875 C 0.859375,0.796875 2.4375,2.25 2.953125,2.71875 L 3.625,2.71875 C 3.09375,2.203125 1.71875,0.796875 1.71875,-2.71875 C 1.71875,-3.34375 1.75,-4.609375 2.1875,-5.90625 C 2.640625,-7.171875 3.265625,-7.8125 3.625,-8.171875 L 2.953125,-8.171875 z"+ id="path315" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.28125,2.71875 C 1.625,2.40625 2.359375,1.734375 2.859375,0.390625 C 3.296875,-0.78125 3.375,-1.9375 3.375,-2.71875 C 3.375,-6.25 1.796875,-7.703125 1.28125,-8.171875 L 0.609375,-8.171875 C 1.140625,-7.65625 2.515625,-6.25 2.515625,-2.71875 C 2.515625,-2.109375 2.484375,-0.84375 2.046875,0.453125 C 1.59375,1.71875 0.96875,2.359375 0.609375,2.71875 L 1.28125,2.71875 z"+ id="path318" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.5,-3.59375 C 7.65625,-3.59375 7.859375,-3.59375 7.859375,-3.8125 C 7.859375,-4.03125 7.65625,-4.03125 7.5,-4.03125 L 0.96875,-4.03125 C 0.8125,-4.03125 0.609375,-4.03125 0.609375,-3.8125 C 0.609375,-3.59375 0.8125,-3.59375 0.984375,-3.59375 L 7.5,-3.59375 z M 7.5,-1.421875 C 7.65625,-1.421875 7.859375,-1.421875 7.859375,-1.640625 C 7.859375,-1.859375 7.65625,-1.859375 7.5,-1.859375 L 0.984375,-1.859375 C 0.8125,-1.859375 0.609375,-1.859375 0.609375,-1.640625 C 0.609375,-1.421875 0.8125,-1.421875 0.96875,-1.421875 L 7.5,-1.421875 z"+ id="path321" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path324" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.640625,-4.4375 L 5.921875,-4.4375 C 6.734375,-4.4375 7.390625,-4.671875 7.953125,-5.171875 C 8.578125,-5.75 8.84375,-6.421875 8.84375,-7.390625 C 8.84375,-9.359375 7.6875,-10.453125 5.625,-10.453125 L 1.3125,-10.453125 L 1.3125,0 L 2.640625,0 L 2.640625,-4.4375 z M 2.640625,-5.609375 L 2.640625,-9.28125 L 5.421875,-9.28125 C 6.703125,-9.28125 7.453125,-8.59375 7.453125,-7.4375 C 7.453125,-6.296875 6.703125,-5.609375 5.421875,-5.609375 L 2.640625,-5.609375 z"+ id="path327" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.984375,-7.515625 L 0.984375,0 L 2.1875,0 L 2.1875,-3.90625 C 2.1875,-4.984375 2.46875,-5.6875 3.046875,-6.09375 C 3.40625,-6.375 3.765625,-6.453125 4.609375,-6.46875 L 4.609375,-7.6875 C 4.40625,-7.71875 4.296875,-7.734375 4.140625,-7.734375 C 3.375,-7.734375 2.78125,-7.265625 2.09375,-6.15625 L 2.09375,-7.515625 L 0.984375,-7.515625 z"+ id="path330" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.15625,-7.515625 L 0.96875,-7.515625 L 0.96875,0 L 2.15625,0 L 2.15625,-7.515625 z M 2.15625,-10.453125 L 0.953125,-10.453125 L 0.953125,-8.953125 L 2.15625,-8.953125 L 2.15625,-10.453125 z"+ id="path333" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1,-7.515625 L 1,0 L 2.203125,0 L 2.203125,-4.71875 C 2.203125,-5.8125 3,-6.6875 3.96875,-6.6875 C 4.859375,-6.6875 5.359375,-6.140625 5.359375,-5.171875 L 5.359375,0 L 6.5625,0 L 6.5625,-4.71875 C 6.5625,-5.8125 7.359375,-6.6875 8.328125,-6.6875 C 9.203125,-6.6875 9.71875,-6.125 9.71875,-5.171875 L 9.71875,0 L 10.9375,0 L 10.9375,-5.640625 C 10.9375,-6.984375 10.15625,-7.734375 8.75,-7.734375 C 7.75,-7.734375 7.140625,-7.4375 6.4375,-6.578125 C 6,-7.390625 5.390625,-7.734375 4.421875,-7.734375 C 3.40625,-7.734375 2.75,-7.359375 2.109375,-6.453125 L 2.109375,-7.515625 L 1,-7.515625 z"+ id="path336" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.640625,-7.515625 L 2.40625,-7.515625 L 2.40625,-9.578125 L 1.21875,-9.578125 L 1.21875,-7.515625 L 0.203125,-7.515625 L 0.203125,-6.546875 L 1.21875,-6.546875 L 1.21875,-0.859375 C 1.21875,-0.09375 1.734375,0.328125 2.671875,0.328125 C 2.953125,0.328125 3.234375,0.296875 3.640625,0.234375 L 3.640625,-0.78125 C 3.484375,-0.734375 3.296875,-0.71875 3.0625,-0.71875 C 2.546875,-0.71875 2.40625,-0.859375 2.40625,-1.390625 L 2.40625,-6.546875 L 3.640625,-6.546875 L 3.640625,-7.515625 z"+ id="path339" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.09375,0 L 6.96875,-7.515625 L 5.625,-7.515625 L 3.5,-1.421875 L 1.484375,-7.515625 L 0.140625,-7.515625 L 2.78125,0 L 4.09375,0 z"+ id="path342" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.359375,-3.359375 C 7.359375,-4.5 7.265625,-5.1875 7.0625,-5.75 C 6.5625,-6.984375 5.421875,-7.734375 4.015625,-7.734375 C 1.921875,-7.734375 0.578125,-6.125 0.578125,-3.65625 C 0.578125,-1.1875 1.875,0.328125 3.984375,0.328125 C 5.703125,0.328125 6.90625,-0.640625 7.203125,-2.28125 L 6,-2.28125 C 5.671875,-1.296875 4.984375,-0.78125 4.03125,-0.78125 C 3.265625,-0.78125 2.625,-1.125 2.21875,-1.75 C 1.9375,-2.1875 1.84375,-2.609375 1.828125,-3.359375 L 7.359375,-3.359375 z M 1.84375,-4.328125 C 1.953125,-5.71875 2.796875,-6.625 4,-6.625 C 5.171875,-6.625 6.078125,-5.65625 6.078125,-4.421875 C 6.078125,-4.390625 6.078125,-4.359375 6.0625,-4.328125 L 1.84375,-4.328125 z"+ id="path345" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.90625,-7.734375 C 1.796875,-7.734375 0.515625,-6.21875 0.515625,-3.703125 C 0.515625,-1.171875 1.78125,0.328125 3.921875,0.328125 C 6.03125,0.328125 7.3125,-1.171875 7.3125,-3.640625 C 7.3125,-6.234375 6.0625,-7.734375 3.90625,-7.734375 z M 3.921875,-6.625 C 5.265625,-6.625 6.0625,-5.515625 6.0625,-3.65625 C 6.0625,-1.890625 5.234375,-0.78125 3.921875,-0.78125 C 2.578125,-0.78125 1.765625,-1.875 1.765625,-3.703125 C 1.765625,-5.515625 2.578125,-6.625 3.921875,-6.625 z"+ id="path348" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.75,-4.984375 C 6.703125,-5.71875 6.546875,-6.203125 6.25,-6.609375 C 5.734375,-7.3125 4.828125,-7.734375 3.78125,-7.734375 C 1.765625,-7.734375 0.4375,-6.125 0.4375,-3.625 C 0.4375,-1.203125 1.734375,0.328125 3.765625,0.328125 C 5.5625,0.328125 6.703125,-0.75 6.84375,-2.578125 L 5.640625,-2.578125 C 5.4375,-1.375 4.8125,-0.78125 3.796875,-0.78125 C 2.484375,-0.78125 1.6875,-1.84375 1.6875,-3.625 C 1.6875,-5.515625 2.46875,-6.625 3.765625,-6.625 C 4.78125,-6.625 5.40625,-6.03125 5.546875,-4.984375 L 6.75,-4.984375 z"+ id="path351" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.28125,-5.421875 C 6.265625,-6.90625 5.296875,-7.734375 3.5625,-7.734375 C 1.8125,-7.734375 0.671875,-6.828125 0.671875,-5.4375 C 0.671875,-4.265625 1.28125,-3.703125 3.0625,-3.265625 L 4.171875,-3 C 5,-2.796875 5.328125,-2.5 5.328125,-1.953125 C 5.328125,-1.25 4.640625,-0.78125 3.578125,-0.78125 C 2.9375,-0.78125 2.390625,-0.96875 2.09375,-1.28125 C 1.90625,-1.484375 1.828125,-1.703125 1.75,-2.234375 L 0.484375,-2.234375 C 0.546875,-0.5 1.515625,0.328125 3.484375,0.328125 C 5.375,0.328125 6.578125,-0.609375 6.578125,-2.046875 C 6.578125,-3.171875 5.953125,-3.78125 4.453125,-4.140625 L 3.3125,-4.421875 C 2.34375,-4.640625 1.921875,-4.96875 1.921875,-5.5 C 1.921875,-6.1875 2.53125,-6.625 3.515625,-6.625 C 4.46875,-6.625 4.984375,-6.203125 5.015625,-5.421875 L 6.28125,-5.421875 z"+ id="path354" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.078125,-4.46875 L 0.65625,-4.46875 L 0.65625,-3.4375 L 4.078125,-3.4375 L 4.078125,-4.46875 z"+ id="path357" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 9.5,-7.21875 C 9.078125,-9.515625 7.765625,-10.625 5.46875,-10.625 C 4.0625,-10.625 2.921875,-10.1875 2.15625,-9.328125 C 1.203125,-8.296875 0.6875,-6.796875 0.6875,-5.109375 C 0.6875,-3.390625 1.21875,-1.90625 2.203125,-0.890625 C 3.015625,-0.0625 4.046875,0.328125 5.40625,0.328125 C 7.953125,0.328125 9.390625,-1.046875 9.703125,-3.8125 L 8.328125,-3.8125 C 8.21875,-3.09375 8.078125,-2.609375 7.859375,-2.1875 C 7.4375,-1.328125 6.546875,-0.84375 5.421875,-0.84375 C 3.34375,-0.84375 2.015625,-2.515625 2.015625,-5.125 C 2.015625,-7.796875 3.28125,-9.453125 5.3125,-9.453125 C 6.15625,-9.453125 6.9375,-9.1875 7.375,-8.796875 C 7.765625,-8.4375 7.96875,-7.984375 8.140625,-7.21875 L 9.5,-7.21875 z"+ id="path360" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1,-7.515625 L 1,0 L 2.203125,0 L 2.203125,-4.140625 C 2.203125,-5.6875 3.015625,-6.6875 4.25,-6.6875 C 5.1875,-6.6875 5.796875,-6.109375 5.796875,-5.203125 L 5.796875,0 L 6.984375,0 L 6.984375,-5.6875 C 6.984375,-6.921875 6.046875,-7.734375 4.609375,-7.734375 C 3.484375,-7.734375 2.765625,-7.296875 2.109375,-6.25 L 2.109375,-7.515625 L 1,-7.515625 z"+ id="path363" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.90625,0 L 6.90625,-7.515625 L 5.71875,-7.515625 L 5.71875,-3.25 C 5.71875,-1.71875 4.921875,-0.71875 3.671875,-0.71875 C 2.71875,-0.71875 2.125,-1.296875 2.125,-2.1875 L 2.125,-7.515625 L 0.9375,-7.515625 L 0.9375,-1.71875 C 0.9375,-0.46875 1.859375,0.328125 3.328125,0.328125 C 4.4375,0.328125 5.140625,-0.0625 5.84375,-1.046875 L 5.84375,0 L 6.90625,0 z"+ id="path366" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.625,-4.765625 L 8.3125,-4.765625 L 8.3125,-5.9375 L 2.625,-5.9375 L 2.625,-9.28125 L 8.53125,-9.28125 L 8.53125,-10.453125 L 1.296875,-10.453125 L 1.296875,0 L 8.796875,0 L 8.796875,-1.171875 L 2.625,-1.171875 L 2.625,-4.765625 z"+ id="path369" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.1875,-3.890625 L 6.71875,-7.515625 L 5.359375,-7.515625 L 3.5625,-4.796875 L 1.75,-7.515625 L 0.390625,-7.515625 L 2.890625,-3.828125 L 0.25,0 L 1.609375,0 L 3.515625,-2.890625 L 5.390625,0 L 6.78125,0 L 4.1875,-3.890625 z"+ id="path372" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.671875,-0.703125 C 7.546875,-0.671875 7.484375,-0.671875 7.421875,-0.671875 C 7,-0.671875 6.765625,-0.890625 6.765625,-1.265625 L 6.765625,-5.6875 C 6.765625,-7.015625 5.796875,-7.734375 3.9375,-7.734375 C 2.859375,-7.734375 1.953125,-7.421875 1.453125,-6.859375 C 1.109375,-6.46875 0.96875,-6.03125 0.9375,-5.296875 L 2.140625,-5.296875 C 2.234375,-6.203125 2.78125,-6.625 3.90625,-6.625 C 4.984375,-6.625 5.578125,-6.21875 5.578125,-5.515625 L 5.578125,-5.1875 C 5.578125,-4.6875 5.28125,-4.46875 4.328125,-4.359375 C 2.640625,-4.140625 2.375,-4.09375 1.921875,-3.90625 C 1.046875,-3.546875 0.609375,-2.875 0.609375,-1.890625 C 0.609375,-0.53125 1.546875,0.328125 3.0625,0.328125 C 4.015625,0.328125 4.78125,0 5.625,-0.78125 C 5.703125,-0.015625 6.078125,0.328125 6.859375,0.328125 C 7.09375,0.328125 7.28125,0.296875 7.671875,0.203125 L 7.671875,-0.703125 z M 5.578125,-2.359375 C 5.578125,-1.96875 5.46875,-1.71875 5.109375,-1.390625 C 4.625,-0.953125 4.03125,-0.71875 3.328125,-0.71875 C 2.390625,-0.71875 1.84375,-1.15625 1.84375,-1.921875 C 1.84375,-2.71875 2.375,-3.109375 3.65625,-3.296875 C 4.921875,-3.46875 5.171875,-3.53125 5.578125,-3.71875 L 5.578125,-2.359375 z"+ id="path375" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.78125,3.125 L 1.984375,3.125 L 1.984375,-0.78125 C 2.609375,-0.015625 3.3125,0.328125 4.28125,0.328125 C 6.21875,0.328125 7.5,-1.234375 7.5,-3.625 C 7.5,-6.15625 6.265625,-7.734375 4.28125,-7.734375 C 3.25,-7.734375 2.4375,-7.265625 1.875,-6.390625 L 1.875,-7.515625 L 0.78125,-7.515625 L 0.78125,3.125 z M 4.078125,-6.609375 C 5.390625,-6.609375 6.25,-5.453125 6.25,-3.65625 C 6.25,-1.953125 5.375,-0.78125 4.078125,-0.78125 C 2.8125,-0.78125 1.984375,-1.9375 1.984375,-3.703125 C 1.984375,-5.46875 2.8125,-6.609375 4.078125,-6.609375 z"+ id="path378" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.1875,-10.453125 L 0.96875,-10.453125 L 0.96875,0 L 2.1875,0 L 2.1875,-10.453125 z"+ id="path381" />+ </symbol>+ </g>+ <clipPath+ id="clip1">+ <path+ d="M 21.226562,68.800781 L 27.273438,68.800781 L 27.273438,62.753906 L 21.226562,62.753906 L 21.226562,68.800781 z"+ id="path384" />+ </clipPath>+ <clipPath+ id="clip2">+ <path+ d="M 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 L 146.21484,105.14453 z"+ id="path387" />+ </clipPath>+ <clipPath+ id="clip3">+ <path+ d="M 146.21484,75.144531 L 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 z M 229.14844,92.082031 L 238.66016,92.082031 L 238.66016,88.300781 L 229.14844,88.300781 L 229.14844,88.300781 L 236.70703,90.191406 L 229.14844,92.082031 z"+ id="path390" />+ </clipPath>+ <clipPath+ id="clip4">+ <path+ d="M 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 L 146.21484,105.14453 z"+ id="path393" />+ </clipPath>+ <clipPath+ id="clip5">+ <path+ d="M 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 L 146.21484,105.14453 z"+ id="path396" />+ </clipPath>+ <clipPath+ id="clip6">+ <path+ d="M 146.21484,75.144531 L 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 z M 161.12109,92.082031 L 170.63281,92.082031 L 170.63281,88.300781 L 161.12109,88.300781 L 161.12109,88.300781 L 168.67969,90.191406 L 161.12109,92.082031 z"+ id="path399" />+ </clipPath>+ <clipPath+ id="clip7">+ <path+ d="M 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 L 146.21484,105.14453 z"+ id="path402" />+ </clipPath>+ <clipPath+ id="clip8">+ <path+ d="M 21.226562,141.50781 L 27.273438,141.50781 L 27.273438,135.46094 L 21.226562,135.46094 L 21.226562,141.50781 z"+ id="path405" />+ </clipPath>+ <clipPath+ id="clip9">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path408" />+ </clipPath>+ <clipPath+ id="clip10">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path411" />+ </clipPath>+ <clipPath+ id="clip11">+ <path+ d="M 143.37891,147.84766 L 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 z"+ id="path414" />+ </clipPath>+ <clipPath+ id="clip12">+ <path+ d="M 143.37891,147.84766 L 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 z M 231.94922,164.78516 L 241.46094,164.78516 L 241.46094,161.00391 L 231.94922,161.00391 L 231.94922,161.00391 L 239.50781,162.89453 L 231.94922,164.78516 z"+ id="path417" />+ </clipPath>+ <clipPath+ id="clip13">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path420" />+ </clipPath>+ <clipPath+ id="clip14">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path423" />+ </clipPath>+ <clipPath+ id="clip15">+ <path+ d="M 143.37891,147.84766 L 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 z M 158.25,164.78516 L 167.76172,164.78516 L 167.76172,161.00391 L 158.25,161.00391 L 158.25,161.00391 L 165.80859,162.89453 L 158.25,164.78516 z"+ id="path426" />+ </clipPath>+ <clipPath+ id="clip16">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path429" />+ </clipPath>+ </defs>+ <g+ id="g6291"+ transform="matrix(3.8033086,0,0,3.8033086,-551.15055,-540.24424)">+ <g+ clip-path="url(#clip9)"+ clip-rule="nonzero"+ id="g2046">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 234.38406,7.815937 L 744.61844,7.815937 L 744.61844,291.25344 L 234.38406,291.25344 L 234.38406,7.815937 z"+ transform="matrix(0.1,0,0,-0.1,143.378,177.848)"+ id="path2048" />+ </g>+ <g+ clip-path="url(#clip10)"+ clip-rule="nonzero"+ id="g2050">+ <g+ clip-path="url(#clip11)"+ clip-rule="nonzero"+ id="g2052">+ <g+ clip-path="url(#clip12)"+ clip-rule="evenodd"+ id="g2054">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 744.61844,149.53469 L 971.37625,149.53469"+ transform="matrix(0.1,0,0,-0.1,143.378,177.848)"+ id="path2056" />+ </g>+ </g>+ </g>+ <g+ clip-path="url(#clip13)"+ clip-rule="nonzero"+ id="g2058">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 231.94922,164.78516 L 239.50781,162.89453 L 231.94922,161.00391 L 231.94922,164.78516"+ id="path2060" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 885.71219,130.62844 L 961.29813,149.53469 L 885.71219,168.44094 L 885.71219,130.62844 z"+ transform="matrix(0.1,0,0,-0.1,143.378,177.848)"+ id="path2062" />+ </g>+ <g+ clip-path="url(#clip14)"+ clip-rule="nonzero"+ id="g2064">+ <g+ clip-path="url(#clip15)"+ clip-rule="evenodd"+ id="g2066">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 7.62625,149.53469 L 234.38406,149.53469"+ transform="matrix(0.1,0,0,-0.1,143.378,177.848)"+ id="path2068" />+ </g>+ </g>+ <g+ clip-path="url(#clip16)"+ clip-rule="nonzero"+ id="g2070">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 158.25,164.78516 L 165.80859,162.89453 L 158.25,161.00391 L 158.25,164.78516"+ id="path2072" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 148.72,130.62844 L 224.30594,149.53469 L 148.72,168.44094 L 148.72,130.62844 z"+ transform="matrix(0.1,0,0,-0.1,143.378,177.848)"+ id="path2074" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2076">+ <use+ xlink:href="#glyph4-9"+ x="166.77299"+ y="160.08299"+ id="use2078"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-10"+ x="173.42009"+ y="160.08299"+ id="use2080"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-11"+ x="180.06718"+ y="160.08299"+ id="use2082"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-2"+ x="182.72124"+ y="160.08299"+ id="use2084"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2086">+ <use+ xlink:href="#glyph4-12"+ x="189.00967"+ y="160.08299"+ id="use2088"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-4"+ x="194.98727"+ y="160.08299"+ id="use2090"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-5"+ x="202.9614"+ y="160.08299"+ id="use2092"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2094">+ <use+ xlink:href="#glyph11-1"+ x="212.59599"+ y="163.097"+ id="use2096"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2098">+ <use+ xlink:href="#glyph5-1"+ x="182.321"+ y="171.422"+ id="use2100"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2102">+ <use+ xlink:href="#glyph4-13"+ x="186.873"+ y="171.422"+ id="use2104"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2106">+ <use+ xlink:href="#glyph9-1"+ x="192.851"+ y="173.215"+ id="use2108"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2110">+ <use+ xlink:href="#glyph5-2"+ x="197.78"+ y="171.422"+ id="use2112"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2114">+ <use+ xlink:href="#glyph6-1"+ x="143.51801"+ y="151.565"+ id="use2116"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2118">+ <use+ xlink:href="#glyph6-2"+ x="143.51561"+ y="151.565"+ id="use2120"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2122">+ <use+ xlink:href="#glyph4-7"+ x="147.658"+ y="160.08299"+ id="use2124"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2126">+ <use+ xlink:href="#glyph6-1"+ x="223.50999"+ y="153.69901"+ id="use2128"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2130">+ <use+ xlink:href="#glyph6-2"+ x="223.50761"+ y="153.69901"+ id="use2132"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2134">+ <use+ xlink:href="#glyph4-8"+ x="225.99001"+ y="160.08299"+ id="use2136"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2138">+ <use+ xlink:href="#glyph2-8"+ x="41.596001"+ y="194.386"+ id="use2140"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-9"+ x="47.661461"+ y="194.386"+ id="use2142"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-10"+ x="53.726917"+ y="194.386"+ id="use2144"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-2"+ x="56.148739"+ y="194.386"+ id="use2146"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2148">+ <use+ xlink:href="#glyph2-11"+ x="61.886925"+ y="194.386"+ id="use2150"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-4"+ x="67.341476"+ y="194.386"+ id="use2152"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-5"+ x="74.617844"+ y="194.386"+ id="use2154"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2156">+ <use+ xlink:href="#glyph11-1"+ x="81.892998"+ y="196.30701"+ id="use2158"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2160">+ <use+ xlink:href="#glyph7-1"+ x="87.178001"+ y="194.386"+ id="use2162"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2164">+ <use+ xlink:href="#glyph8-1"+ x="91.419998"+ y="194.386"+ id="use2166"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2168">+ <use+ xlink:href="#glyph2-7"+ x="105.359"+ y="194.386"+ id="use2170"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2172">+ <use+ xlink:href="#glyph9-1"+ x="110.814"+ y="196.30701"+ id="use2174"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2176">+ <use+ xlink:href="#glyph10-1"+ x="115.743"+ y="194.386"+ id="use2178"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2180">+ <use+ xlink:href="#glyph2-7"+ x="120.592"+ y="194.386"+ id="use2182"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2184">+ <use+ xlink:href="#glyph9-2"+ x="126.046"+ y="196.30701"+ id="use2186"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2188">+ <use+ xlink:href="#glyph10-1"+ x="130.976"+ y="194.386"+ id="use2190"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2192">+ <use+ xlink:href="#glyph2-7"+ x="135.82401"+ y="194.386"+ id="use2194"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2196">+ <use+ xlink:href="#glyph9-3"+ x="141.27901"+ y="196.30701"+ id="use2198"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2200">+ <use+ xlink:href="#glyph10-1"+ x="146.20799"+ y="194.386"+ id="use2202"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2204">+ <use+ xlink:href="#glyph8-2"+ x="151.05701"+ y="194.386"+ id="use2206"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2208">+ <use+ xlink:href="#glyph8-2"+ x="155.90936"+ y="194.386"+ id="use2210"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2212">+ <use+ xlink:href="#glyph8-2"+ x="160.75082"+ y="194.386"+ id="use2214"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2216">+ <use+ xlink:href="#glyph8-3"+ x="166.8141"+ y="194.386"+ id="use2218"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2220">+ <use+ xlink:href="#glyph7-2"+ x="177.72301"+ y="194.386"+ id="use2222"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2224">+ <use+ xlink:href="#glyph7-3"+ x="184.99828"+ y="194.386"+ id="use2226"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2228">+ <use+ xlink:href="#glyph8-1"+ x="193.481"+ y="194.386"+ id="use2230"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2232">+ <use+ xlink:href="#glyph2-12"+ x="207.42"+ y="194.386"+ id="use2234"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2236">+ <use+ xlink:href="#glyph9-1"+ x="212.875"+ y="196.30701"+ id="use2238"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2240">+ <use+ xlink:href="#glyph10-1"+ x="217.804"+ y="194.386"+ id="use2242"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2244">+ <use+ xlink:href="#glyph2-12"+ x="222.653"+ y="194.386"+ id="use2246"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2248">+ <use+ xlink:href="#glyph9-1"+ x="228.10699"+ y="196.30701"+ id="use2250"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2252">+ <use+ xlink:href="#glyph10-1"+ x="233.037"+ y="194.386"+ id="use2254"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2256">+ <use+ xlink:href="#glyph2-12"+ x="237.88499"+ y="194.386"+ id="use2258"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2260">+ <use+ xlink:href="#glyph9-1"+ x="243.34"+ y="196.30701"+ id="use2262"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2264">+ <use+ xlink:href="#glyph10-1"+ x="248.269"+ y="194.386"+ id="use2266"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2268">+ <use+ xlink:href="#glyph10-2"+ x="253.12137"+ y="194.386"+ id="use2270"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2272">+ <use+ xlink:href="#glyph10-2"+ x="257.96283"+ y="194.386"+ id="use2274"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2276">+ <use+ xlink:href="#glyph10-2"+ x="262.81519"+ y="194.386"+ id="use2278"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2280">+ <use+ xlink:href="#glyph12-1"+ x="207.42"+ y="200.80499"+ id="use2282"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ d="M 212.32813,200.80469 L 231.72266,200.80469 L 231.72266,199.49609 L 212.32813,199.49609 L 212.32813,200.80469 z"+ id="path2284" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2286">+ <use+ xlink:href="#glyph12-2"+ x="231.72301"+ y="200.80499"+ id="use2288"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph12-3"+ x="236.6321"+ y="200.80499"+ id="use2290"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"+ d="M 241.54297,200.80469 L 260.9375,200.80469 L 260.9375,199.49609 L 241.54297,199.49609 L 241.54297,200.80469 z"+ id="path2292" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2294">+ <use+ xlink:href="#glyph12-4"+ x="260.936"+ y="200.80499"+ id="use2296"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2298">+ <use+ xlink:href="#glyph11-1"+ x="234.24001"+ y="211.28999"+ id="use2300"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2302">+ <use+ xlink:href="#glyph10-1"+ x="265.845"+ y="194.386"+ id="use2304"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2306">+ <use+ xlink:href="#glyph2-7"+ x="270.69299"+ y="194.386"+ id="use2308"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2310">+ <use+ xlink:href="#glyph9-1"+ x="276.14801"+ y="196.30701"+ id="use2312"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2314">+ <use+ xlink:href="#glyph10-1"+ x="281.077"+ y="194.386"+ id="use2316"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2318">+ <use+ xlink:href="#glyph2-7"+ x="285.92599"+ y="194.386"+ id="use2320"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2322">+ <use+ xlink:href="#glyph9-2"+ x="291.38"+ y="196.30701"+ id="use2324"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2326">+ <use+ xlink:href="#glyph10-1"+ x="296.31"+ y="194.386"+ id="use2328"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2330">+ <use+ xlink:href="#glyph2-7"+ x="301.15799"+ y="194.386"+ id="use2332"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2334">+ <use+ xlink:href="#glyph9-3"+ x="306.61301"+ y="196.30701"+ id="use2336"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2338">+ <use+ xlink:href="#glyph10-1"+ x="311.54199"+ y="194.386"+ id="use2340"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2342">+ <use+ xlink:href="#glyph8-2"+ x="316.39099"+ y="194.386"+ id="use2344"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2346">+ <use+ xlink:href="#glyph8-2"+ x="321.24338"+ y="194.386"+ id="use2348"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2350">+ <use+ xlink:href="#glyph8-2"+ x="326.08484"+ y="194.386"+ id="use2352"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g2354">+ <use+ xlink:href="#glyph8-3"+ x="332.1481"+ y="194.386"+ id="use2356"+ width="362.83499"+ height="272.12601" />+ </g>+ </g>+</svg>
+ doc/www/files/tutorial/figures/encoder.svg view
@@ -0,0 +1,228 @@+<?xml version="1.0" encoding="UTF-8"?>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="260pt" height="308pt" viewBox="0 0 260 308" version="1.1">+<defs>+<g>+<symbol overflow="visible" id="glyph2-0">+<path style="stroke: none;" d="M 2.703125 0 L 2.703125 -25.90625 L 23.578125 -25.90625 L 23.578125 0 L 2.703125 0 Z M 20.34375 -3.234375 L 20.34375 -22.671875 L 5.9375 -22.671875 L 5.9375 -3.234375 L 20.34375 -3.234375 Z M 20.34375 -3.234375 "/>+</symbol>+<symbol overflow="visible" id="glyph2-1">+<path style="stroke: none;" d="M 22.8125 -9.828125 C 22.1875 -6.847656 20.960938 -4.378906 19.140625 -2.421875 C 17.316406 -0.460938 15.144531 0.515625 12.625 0.515625 C 11.039062 0.515625 9.835938 0.195312 9.015625 -0.4375 C 8.523438 -0.8125 8.046875 -1.46875 7.578125 -2.40625 L 7.0625 0 L 2.15625 0 L 7.640625 -25.875 L 12.640625 -25.875 L 10.6875 -16.671875 C 11.507812 -17.554688 12.351562 -18.234375 13.21875 -18.703125 C 14.238281 -19.285156 15.445312 -19.578125 16.84375 -19.578125 C 19.363281 -19.578125 21.140625 -18.671875 22.171875 -16.859375 C 23.210938 -15.046875 23.425781 -12.703125 22.8125 -9.828125 Z M 17.453125 -9.296875 C 17.742188 -10.660156 17.8125 -11.785156 17.65625 -12.671875 C 17.332031 -14.359375 16.273438 -15.203125 14.484375 -15.203125 C 12.671875 -15.203125 11.25 -14.378906 10.21875 -12.734375 C 9.675781 -11.847656 9.257812 -10.707031 8.96875 -9.3125 C 8.613281 -7.675781 8.6875 -6.316406 9.1875 -5.234375 C 9.6875 -4.160156 10.679688 -3.625 12.171875 -3.625 C 13.453125 -3.625 14.5625 -4.144531 15.5 -5.1875 C 16.4375 -6.226562 17.085938 -7.597656 17.453125 -9.296875 Z M 17.453125 -9.296875 "/>+</symbol>+<symbol overflow="visible" id="glyph4-0">+<path style="stroke: none;" d="M 7.703125 0 L 1.296875 0 L 1.296875 -13.640625 L 7.703125 -13.640625 L 7.703125 0 Z M 6.390625 -12.328125 L 2.609375 -12.328125 L 2.609375 -1.3125 L 6.390625 -1.3125 L 6.390625 -12.328125 Z M 6.390625 -12.328125 "/>+</symbol>+<symbol overflow="visible" id="glyph4-1">+<path style="stroke: none;" d="M 9.296875 -1.5 L 9.296875 0 L 1.921875 0 L 1.921875 -13.640625 L 3.703125 -13.640625 L 3.703125 -1.5 L 9.296875 -1.5 Z M 9.296875 -1.5 "/>+</symbol>+<symbol overflow="visible" id="glyph4-2">+<path style="stroke: none;" d="M 9.53125 -0.65625 C 8.21875 -0.03125 6.976562 0.28125 5.8125 0.28125 C 4.925781 0.28125 4.132812 0.0625 3.4375 -0.375 C 2.75 -0.8125 2.191406 -1.4375 1.765625 -2.25 C 1.347656 -3.070312 1.140625 -3.953125 1.140625 -4.890625 C 1.140625 -5.785156 1.335938 -6.644531 1.734375 -7.46875 C 2.140625 -8.289062 2.695312 -8.929688 3.40625 -9.390625 C 4.125 -9.859375 4.921875 -10.09375 5.796875 -10.09375 C 6.960938 -10.09375 7.898438 -9.675781 8.609375 -8.84375 C 9.316406 -8.007812 9.671875 -6.726562 9.671875 -5 L 9.671875 -4.640625 L 2.90625 -4.640625 C 2.90625 -3.960938 3.046875 -3.34375 3.328125 -2.78125 C 3.609375 -2.21875 3.976562 -1.796875 4.4375 -1.515625 C 4.90625 -1.234375 5.4375 -1.09375 6.03125 -1.09375 C 7.082031 -1.09375 8.25 -1.441406 9.53125 -2.140625 L 9.53125 -0.65625 Z M 3 -5.859375 L 7.890625 -5.859375 L 7.890625 -6.09375 C 7.890625 -6.894531 7.691406 -7.535156 7.296875 -8.015625 C 6.910156 -8.492188 6.390625 -8.734375 5.734375 -8.734375 C 5.066406 -8.734375 4.488281 -8.488281 4 -8 C 3.519531 -7.519531 3.1875 -6.804688 3 -5.859375 Z M 3 -5.859375 "/>+</symbol>+<symbol overflow="visible" id="glyph4-3">+<path style="stroke: none;" d="M 3.640625 0 L 3.640625 -7.640625 L 1.46875 -7.640625 L 1.46875 -9 L 3.640625 -9 L 3.640625 -9.453125 C 3.640625 -10.753906 3.785156 -11.710938 4.078125 -12.328125 C 4.378906 -12.953125 4.832031 -13.460938 5.4375 -13.859375 C 6.050781 -14.253906 6.863281 -14.453125 7.875 -14.453125 C 8.632812 -14.453125 9.410156 -14.375 10.203125 -14.21875 L 10.203125 -12.671875 C 9.347656 -12.953125 8.59375 -13.09375 7.9375 -13.09375 C 7.414062 -13.09375 6.953125 -12.992188 6.546875 -12.796875 C 6.148438 -12.597656 5.835938 -12.28125 5.609375 -11.84375 C 5.390625 -11.414062 5.28125 -10.679688 5.28125 -9.640625 L 5.28125 -9 L 9.171875 -9 L 9.171875 -7.640625 L 5.28125 -7.640625 L 5.28125 0 L 3.640625 0 Z M 3.640625 0 "/>+</symbol>+<symbol overflow="visible" id="glyph4-4">+<path style="stroke: none;" d="M 9.578125 -0.390625 C 8.804688 -0.0664062 8.25 0.117188 7.90625 0.171875 C 7.5625 0.234375 7.226562 0.265625 6.90625 0.265625 C 6.21875 0.265625 5.585938 0.132812 5.015625 -0.125 C 4.453125 -0.382812 4.023438 -0.769531 3.734375 -1.28125 C 3.441406 -1.800781 3.296875 -2.601562 3.296875 -3.6875 L 3.296875 -7.640625 L 0.84375 -7.640625 L 0.84375 -9 L 3.296875 -9 L 3.296875 -12.953125 L 4.9375 -12.953125 L 4.9375 -9 L 9.296875 -9 L 9.296875 -7.640625 L 4.9375 -7.640625 L 4.9375 -3.703125 C 4.9375 -2.910156 5.03125 -2.351562 5.21875 -2.03125 C 5.40625 -1.707031 5.65625 -1.46875 5.96875 -1.3125 C 6.28125 -1.164062 6.648438 -1.09375 7.078125 -1.09375 C 7.867188 -1.09375 8.703125 -1.34375 9.578125 -1.84375 L 9.578125 -0.390625 Z M 9.578125 -0.390625 "/>+</symbol>+<symbol overflow="visible" id="glyph4-5">+<path style="stroke: none;" d=""/>+</symbol>+<symbol overflow="visible" id="glyph4-6">+<path style="stroke: none;" d="M 4.6875 0.40625 L 4.6875 -14.046875 L 6.125 -14.046875 L 6.125 0.40625 L 4.6875 0.40625 Z M 4.6875 0.40625 "/>+</symbol>+<symbol overflow="visible" id="glyph4-7">+<path style="stroke: none;" d="M 1.359375 0 L 1.359375 -13.640625 L 4.59375 -13.640625 C 6.082031 -13.640625 7.1875 -13.378906 7.90625 -12.859375 C 8.632812 -12.335938 9.179688 -11.550781 9.546875 -10.5 C 9.910156 -9.457031 10.09375 -8.21875 10.09375 -6.78125 C 10.09375 -5.425781 9.898438 -4.234375 9.515625 -3.203125 C 9.128906 -2.171875 8.582031 -1.378906 7.875 -0.828125 C 7.175781 -0.273438 6.082031 0 4.59375 0 L 1.359375 0 Z M 3.140625 -1.5 L 4.328125 -1.5 C 5.523438 -1.5 6.378906 -1.710938 6.890625 -2.140625 C 7.410156 -2.566406 7.78125 -3.160156 8 -3.921875 C 8.21875 -4.679688 8.328125 -5.726562 8.328125 -7.0625 C 8.328125 -8.375 8.195312 -9.378906 7.9375 -10.078125 C 7.675781 -10.785156 7.304688 -11.328125 6.828125 -11.703125 C 6.347656 -12.078125 5.5625 -12.265625 4.46875 -12.265625 L 3.140625 -12.265625 L 3.140625 -1.5 Z M 3.140625 -1.5 "/>+</symbol>+<symbol overflow="visible" id="glyph4-8">+<path style="stroke: none;" d="M 5.40625 0.265625 C 4 0.265625 2.875 -0.222656 2.03125 -1.203125 C 1.1875 -2.179688 0.765625 -3.414062 0.765625 -4.90625 C 0.765625 -6.40625 1.1875 -7.644531 2.03125 -8.625 C 2.875 -9.601562 4 -10.09375 5.40625 -10.09375 C 6.800781 -10.09375 7.921875 -9.601562 8.765625 -8.625 C 9.609375 -7.644531 10.03125 -6.40625 10.03125 -4.90625 C 10.03125 -3.414062 9.609375 -2.179688 8.765625 -1.203125 C 7.921875 -0.222656 6.800781 0.265625 5.40625 0.265625 Z M 5.40625 -1.09375 C 6.28125 -1.09375 6.972656 -1.429688 7.484375 -2.109375 C 8.003906 -2.785156 8.265625 -3.71875 8.265625 -4.90625 C 8.265625 -6.09375 8.003906 -7.023438 7.484375 -7.703125 C 6.972656 -8.390625 6.28125 -8.734375 5.40625 -8.734375 C 4.53125 -8.734375 3.832031 -8.390625 3.3125 -7.703125 C 2.800781 -7.023438 2.546875 -6.09375 2.546875 -4.90625 C 2.546875 -3.71875 2.800781 -2.785156 3.3125 -2.109375 C 3.832031 -1.429688 4.53125 -1.09375 5.40625 -1.09375 Z M 5.40625 -1.09375 "/>+</symbol>+<symbol overflow="visible" id="glyph4-9">+<path style="stroke: none;" d="M 1.78125 0 L 0.171875 -9.8125 L 1.703125 -9.8125 L 2.625 -3.84375 L 2.875 -2.453125 L 3.109375 -3.84375 L 4.671875 -9.8125 L 6.140625 -9.8125 L 7.90625 -3.84375 L 8.21875 -2.453125 L 8.421875 -3.84375 L 9.359375 -9.8125 L 10.625 -9.8125 L 9.03125 0 L 7.5 0 L 5.609375 -6.3125 L 5.3125 -7.703125 L 5.28125 -7.703125 L 5 -6.328125 L 3.359375 0 L 1.78125 0 Z M 1.78125 0 "/>+</symbol>+<symbol overflow="visible" id="glyph4-10">+<path style="stroke: none;" d="M 1.359375 0 L 1.359375 -9.8125 L 3 -9.8125 L 3 -7.671875 C 3.46875 -8.429688 4.03125 -9.023438 4.6875 -9.453125 C 5.351562 -9.878906 6.019531 -10.09375 6.6875 -10.09375 C 7.257812 -10.09375 7.78125 -9.9375 8.25 -9.625 C 8.726562 -9.320312 9.0625 -8.921875 9.25 -8.421875 C 9.445312 -7.921875 9.546875 -6.941406 9.546875 -5.484375 L 9.546875 0 L 7.90625 0 L 7.90625 -5.6875 C 7.90625 -6.632812 7.859375 -7.253906 7.765625 -7.546875 C 7.679688 -7.847656 7.515625 -8.097656 7.265625 -8.296875 C 7.023438 -8.492188 6.765625 -8.59375 6.484375 -8.59375 C 5.898438 -8.59375 5.28125 -8.316406 4.625 -7.765625 C 3.96875 -7.222656 3.425781 -6.539062 3 -5.71875 L 3 0 L 1.359375 0 Z M 1.359375 0 "/>+</symbol>+<symbol overflow="visible" id="glyph4-11">+<path style="stroke: none;" d="M 3.078125 -5.796875 L 3.078125 0 L 1.3125 0 L 1.3125 -13.640625 L 4.953125 -13.640625 C 6.140625 -13.640625 7.015625 -13.515625 7.578125 -13.265625 C 8.140625 -13.023438 8.578125 -12.660156 8.890625 -12.171875 C 9.203125 -11.679688 9.359375 -11.148438 9.359375 -10.578125 C 9.359375 -10.054688 9.253906 -9.523438 9.046875 -8.984375 C 8.835938 -8.453125 8.550781 -7.976562 8.1875 -7.5625 C 7.832031 -7.144531 7.316406 -6.75 6.640625 -6.375 L 10.578125 0 L 8.46875 0 L 4.859375 -5.796875 L 3.078125 -5.796875 Z M 3.078125 -7.15625 L 5.578125 -7.15625 C 6.128906 -7.46875 6.539062 -7.78125 6.8125 -8.09375 C 7.082031 -8.40625 7.285156 -8.738281 7.421875 -9.09375 C 7.566406 -9.457031 7.640625 -9.816406 7.640625 -10.171875 C 7.640625 -10.816406 7.40625 -11.328125 6.9375 -11.703125 C 6.476562 -12.078125 5.632812 -12.265625 4.40625 -12.265625 L 3.078125 -12.265625 L 3.078125 -7.15625 Z M 3.078125 -7.15625 "/>+</symbol>+<symbol overflow="visible" id="glyph4-12">+<path style="stroke: none;" d="M 4.109375 0 L 4.109375 -8.453125 L 1.390625 -8.453125 L 1.390625 -9.8125 L 5.75 -9.8125 L 5.75 -1.359375 L 8.484375 -1.359375 L 8.484375 0 L 4.109375 0 Z M 3.84375 -13.359375 C 3.84375 -13.722656 3.96875 -13.992188 4.21875 -14.171875 C 4.46875 -14.359375 4.707031 -14.453125 4.9375 -14.453125 C 5.164062 -14.453125 5.40625 -14.359375 5.65625 -14.171875 C 5.90625 -13.992188 6.03125 -13.722656 6.03125 -13.359375 C 6.03125 -12.992188 5.90625 -12.71875 5.65625 -12.53125 C 5.40625 -12.351562 5.164062 -12.265625 4.9375 -12.265625 C 4.707031 -12.265625 4.46875 -12.351562 4.21875 -12.53125 C 3.96875 -12.71875 3.84375 -12.992188 3.84375 -13.359375 Z M 3.84375 -13.359375 "/>+</symbol>+<symbol overflow="visible" id="glyph4-13">+<path style="stroke: none;" d="M 7.921875 -2.203125 C 7.421875 -1.378906 6.820312 -0.757812 6.125 -0.34375 C 5.425781 0.0625 4.78125 0.265625 4.1875 0.265625 C 3.375 0.265625 2.640625 -0.0859375 1.984375 -0.796875 C 1.328125 -1.503906 1 -2.578125 1 -4.015625 C 1 -5.148438 1.210938 -6.164062 1.640625 -7.0625 C 2.078125 -7.957031 2.660156 -8.660156 3.390625 -9.171875 C 4.117188 -9.691406 5.019531 -9.953125 6.09375 -9.953125 C 6.40625 -9.953125 6.875 -9.921875 7.5 -9.859375 C 7.59375 -9.847656 7.734375 -9.832031 7.921875 -9.8125 L 9.5625 -9.8125 L 9.5625 -2.875 C 9.5625 -1.21875 9.539062 -0.207031 9.5 0.15625 C 9.457031 0.519531 9.382812 0.890625 9.28125 1.265625 C 9.050781 2.140625 8.515625 2.828125 7.671875 3.328125 C 6.835938 3.835938 5.832031 4.09375 4.65625 4.09375 C 3.457031 4.09375 2.25 3.785156 1.03125 3.171875 L 1.03125 1.515625 C 1.5 1.835938 2.070312 2.117188 2.75 2.359375 C 3.425781 2.597656 4.082031 2.71875 4.71875 2.71875 C 5.207031 2.71875 5.675781 2.640625 6.125 2.484375 C 6.570312 2.328125 6.929688 2.097656 7.203125 1.796875 C 7.484375 1.503906 7.671875 1.160156 7.765625 0.765625 C 7.867188 0.367188 7.921875 -0.15625 7.921875 -0.8125 L 7.921875 -2.203125 Z M 7.921875 -4.15625 L 7.921875 -8.359375 C 7.335938 -8.515625 6.796875 -8.59375 6.296875 -8.59375 C 5.296875 -8.59375 4.457031 -8.203125 3.78125 -7.421875 C 3.113281 -6.640625 2.78125 -5.578125 2.78125 -4.234375 C 2.78125 -3.265625 2.960938 -2.53125 3.328125 -2.03125 C 3.691406 -1.539062 4.109375 -1.296875 4.578125 -1.296875 C 5.085938 -1.296875 5.648438 -1.550781 6.265625 -2.0625 C 6.878906 -2.582031 7.429688 -3.28125 7.921875 -4.15625 Z M 7.921875 -4.15625 "/>+</symbol>+<symbol overflow="visible" id="glyph4-14">+<path style="stroke: none;" d="M 1.359375 0 L 1.359375 -14.1875 L 3 -14.1875 L 3 -7.671875 C 3.46875 -8.429688 4.03125 -9.023438 4.6875 -9.453125 C 5.351562 -9.878906 6.019531 -10.09375 6.6875 -10.09375 C 7.238281 -10.09375 7.742188 -9.945312 8.203125 -9.65625 C 8.660156 -9.375 8.984375 -9.03125 9.171875 -8.625 C 9.316406 -8.320312 9.414062 -7.992188 9.46875 -7.640625 C 9.519531 -7.296875 9.546875 -6.578125 9.546875 -5.484375 L 9.546875 0 L 7.90625 0 L 7.90625 -5.6875 C 7.90625 -6.632812 7.859375 -7.253906 7.765625 -7.546875 C 7.679688 -7.847656 7.515625 -8.097656 7.265625 -8.296875 C 7.023438 -8.492188 6.765625 -8.59375 6.484375 -8.59375 C 5.898438 -8.59375 5.28125 -8.316406 4.625 -7.765625 C 3.96875 -7.222656 3.425781 -6.539062 3 -5.71875 L 3 0 L 1.359375 0 Z M 1.359375 0 "/>+</symbol>+<symbol overflow="visible" id="glyph4-15">+<path style="stroke: none;" d="M 1.109375 -13.640625 L 2.890625 -13.640625 L 2.890625 -4.6875 C 2.890625 -3.507812 2.984375 -2.703125 3.171875 -2.265625 C 3.367188 -1.835938 3.671875 -1.507812 4.078125 -1.28125 C 4.484375 -1.0625 4.9375 -0.953125 5.4375 -0.953125 C 5.96875 -0.953125 6.4375 -1.070312 6.84375 -1.3125 C 7.257812 -1.550781 7.566406 -1.929688 7.765625 -2.453125 C 7.960938 -2.972656 8.0625 -3.945312 8.0625 -5.375 L 8.0625 -13.640625 L 9.6875 -13.640625 L 9.6875 -4.734375 C 9.6875 -3.460938 9.5 -2.46875 9.125 -1.75 C 8.75 -1.03125 8.253906 -0.488281 7.640625 -0.125 C 7.035156 0.226562 6.269531 0.40625 5.34375 0.40625 C 4.488281 0.40625 3.734375 0.25 3.078125 -0.0625 C 2.429688 -0.375 1.941406 -0.847656 1.609375 -1.484375 C 1.273438 -2.117188 1.109375 -3.257812 1.109375 -4.90625 L 1.109375 -13.640625 Z M 1.109375 -13.640625 "/>+</symbol>+<symbol overflow="visible" id="glyph4-16">+<path style="stroke: none;" d="M 2.875 -7.609375 C 3.375 -8.429688 3.972656 -9.050781 4.671875 -9.46875 C 5.367188 -9.882812 6.007812 -10.09375 6.59375 -10.09375 C 7.414062 -10.09375 8.15625 -9.738281 8.8125 -9.03125 C 9.46875 -8.320312 9.796875 -7.242188 9.796875 -5.796875 C 9.796875 -4.660156 9.578125 -3.644531 9.140625 -2.75 C 8.703125 -1.863281 8.117188 -1.160156 7.390625 -0.640625 C 6.671875 -0.117188 5.773438 0.140625 4.703125 0.140625 C 4.398438 0.140625 3.929688 0.109375 3.296875 0.046875 C 3.203125 0.0351562 3.0625 0.0195312 2.875 0 L 2.875 3.8125 L 1.234375 3.8125 L 1.234375 -9.8125 L 2.875 -9.8125 L 2.875 -7.609375 Z M 2.875 -5.671875 L 2.875 -1.453125 C 3.46875 -1.304688 4.015625 -1.234375 4.515625 -1.234375 C 5.503906 -1.234375 6.335938 -1.617188 7.015625 -2.390625 C 7.691406 -3.171875 8.03125 -4.234375 8.03125 -5.578125 C 8.03125 -6.554688 7.84375 -7.289062 7.46875 -7.78125 C 7.101562 -8.28125 6.6875 -8.53125 6.21875 -8.53125 C 5.707031 -8.53125 5.144531 -8.269531 4.53125 -7.75 C 3.914062 -7.238281 3.363281 -6.546875 2.875 -5.671875 Z M 2.875 -5.671875 "/>+</symbol>+<symbol overflow="visible" id="glyph3-0">+<path style="stroke: none;" d="M 1.359375 0 L 1.359375 -12.953125 L 11.78125 -12.953125 L 11.78125 0 L 1.359375 0 Z M 10.171875 -1.625 L 10.171875 -11.34375 L 2.96875 -11.34375 L 2.96875 -1.625 L 10.171875 -1.625 Z M 10.171875 -1.625 "/>+</symbol>+<symbol overflow="visible" id="glyph3-1">+<path style="stroke: none;" d="M 5.3125 -1.71875 C 6.0625 -1.71875 6.632812 -2.101562 7.03125 -2.875 C 7.425781 -3.65625 7.78125 -4.78125 8.09375 -6.25 C 8.414062 -7.78125 8.539062 -8.914062 8.46875 -9.65625 C 8.394531 -10.394531 7.988281 -10.765625 7.25 -10.765625 C 6.5 -10.765625 5.925781 -10.394531 5.53125 -9.65625 C 5.132812 -8.914062 4.773438 -7.78125 4.453125 -6.25 C 4.128906 -4.78125 4.003906 -3.65625 4.078125 -2.875 C 4.160156 -2.101562 4.570312 -1.71875 5.3125 -1.71875 Z M 10.671875 -6.25 C 10.222656 -4.144531 9.550781 -2.523438 8.65625 -1.390625 C 7.769531 -0.253906 6.515625 0.3125 4.890625 0.3125 C 3.265625 0.3125 2.242188 -0.253906 1.828125 -1.390625 C 1.421875 -2.523438 1.441406 -4.144531 1.890625 -6.25 C 2.335938 -8.351562 3.007812 -9.972656 3.90625 -11.109375 C 4.800781 -12.253906 6.0625 -12.828125 7.6875 -12.828125 C 9.300781 -12.828125 10.3125 -12.253906 10.71875 -11.109375 C 11.132812 -9.972656 11.117188 -8.351562 10.671875 -6.25 Z M 10.671875 -6.25 "/>+</symbol>+<symbol overflow="visible" id="glyph3-2">+<path style="stroke: none;" d="M 3.109375 -8.796875 L 3.46875 -10.5 C 4.269531 -10.53125 4.835938 -10.582031 5.171875 -10.65625 C 5.691406 -10.757812 6.148438 -10.984375 6.546875 -11.328125 C 6.804688 -11.546875 7.03125 -11.847656 7.21875 -12.234375 C 7.34375 -12.460938 7.414062 -12.632812 7.4375 -12.75 L 9.515625 -12.75 L 6.8125 0 L 4.25 0 L 6.109375 -8.796875 L 3.109375 -8.796875 Z M 3.109375 -8.796875 "/>+</symbol>+<symbol overflow="visible" id="glyph3-3">+<path style="stroke: none;" d="M 1.671875 -2.5 C 2.210938 -3.351562 3.25 -4.253906 4.78125 -5.203125 C 6.113281 -6.023438 6.988281 -6.617188 7.40625 -6.984375 C 8.039062 -7.535156 8.425781 -8.144531 8.5625 -8.8125 C 8.6875 -9.34375 8.632812 -9.785156 8.40625 -10.140625 C 8.1875 -10.503906 7.800781 -10.6875 7.25 -10.6875 C 6.476562 -10.6875 5.894531 -10.398438 5.5 -9.828125 C 5.269531 -9.503906 5.066406 -8.984375 4.890625 -8.265625 L 2.46875 -8.265625 C 2.726562 -9.347656 3.109375 -10.226562 3.609375 -10.90625 C 4.546875 -12.175781 5.863281 -12.8125 7.5625 -12.8125 C 8.914062 -12.8125 9.910156 -12.4375 10.546875 -11.6875 C 11.179688 -10.9375 11.367188 -9.945312 11.109375 -8.71875 C 10.910156 -7.769531 10.453125 -6.929688 9.734375 -6.203125 C 9.265625 -5.710938 8.539062 -5.171875 7.5625 -4.578125 L 6.421875 -3.875 C 5.691406 -3.425781 5.191406 -3.101562 4.921875 -2.90625 C 4.648438 -2.707031 4.40625 -2.472656 4.1875 -2.203125 L 9.75 -2.203125 L 9.296875 0 L 0.5625 0 C 0.78125 -0.914062 1.148438 -1.75 1.671875 -2.5 Z M 1.671875 -2.5 "/>+</symbol>+<symbol overflow="visible" id="glyph3-4">+<path style="stroke: none;" d=""/>+</symbol>+<symbol overflow="visible" id="glyph3-5">+<path style="stroke: none;" d="M 3.765625 -3.90625 C 3.660156 -3.394531 3.648438 -2.972656 3.734375 -2.640625 C 3.910156 -2.023438 4.398438 -1.71875 5.203125 -1.71875 C 5.691406 -1.71875 6.15625 -1.882812 6.59375 -2.21875 C 7.039062 -2.5625 7.332031 -3.050781 7.46875 -3.6875 C 7.632812 -4.519531 7.410156 -5.078125 6.796875 -5.359375 C 6.441406 -5.515625 5.847656 -5.59375 5.015625 -5.59375 L 5.390625 -7.390625 C 6.210938 -7.398438 6.800781 -7.476562 7.15625 -7.625 C 7.757812 -7.875 8.144531 -8.375 8.3125 -9.125 C 8.414062 -9.613281 8.359375 -10.007812 8.140625 -10.3125 C 7.921875 -10.613281 7.550781 -10.765625 7.03125 -10.765625 C 6.4375 -10.765625 5.960938 -10.578125 5.609375 -10.203125 C 5.253906 -9.828125 5.015625 -9.328125 4.890625 -8.703125 L 2.546875 -8.703125 C 2.703125 -9.335938 2.941406 -9.9375 3.265625 -10.5 C 3.578125 -11 3.992188 -11.460938 4.515625 -11.890625 C 4.910156 -12.179688 5.347656 -12.40625 5.828125 -12.5625 C 6.316406 -12.726562 6.890625 -12.8125 7.546875 -12.8125 C 8.765625 -12.8125 9.675781 -12.492188 10.28125 -11.859375 C 10.894531 -11.234375 11.09375 -10.390625 10.875 -9.328125 C 10.71875 -8.578125 10.359375 -7.941406 9.796875 -7.421875 C 9.441406 -7.097656 9.101562 -6.878906 8.78125 -6.765625 C 9.007812 -6.765625 9.296875 -6.566406 9.640625 -6.171875 C 10.148438 -5.585938 10.296875 -4.78125 10.078125 -3.75 C 9.847656 -2.675781 9.273438 -1.726562 8.359375 -0.90625 C 7.441406 -0.09375 6.25 0.3125 4.78125 0.3125 C 2.976562 0.3125 1.847656 -0.273438 1.390625 -1.453125 C 1.148438 -2.078125 1.117188 -2.894531 1.296875 -3.90625 L 3.765625 -3.90625 Z M 3.765625 -3.90625 "/>+</symbol>+<symbol overflow="visible" id="glyph0-0">+<path style="stroke: none;" d="M 0.78125 0 L 0.78125 -17.21875 L 14.4375 -17.21875 L 14.4375 0 L 0.78125 0 Z M 12.28125 -2.15625 L 12.28125 -15.0625 L 2.9375 -15.0625 L 2.9375 -2.15625 L 12.28125 -2.15625 Z M 12.28125 -2.15625 "/>+</symbol>+<symbol overflow="visible" id="glyph0-1">+<path style="stroke: none;" d="M 2.046875 -17.21875 L 14.609375 -17.21875 L 14.609375 -15.109375 L 4.328125 -15.109375 L 4.328125 -9.875 L 13.828125 -9.875 L 13.828125 -7.890625 L 4.328125 -7.890625 L 4.328125 -2.046875 L 14.78125 -2.046875 L 14.78125 0 L 2.046875 0 L 2.046875 -17.21875 Z M 8.421875 -17.21875 L 8.421875 -17.21875 Z M 8.421875 -17.21875 "/>+</symbol>+<symbol overflow="visible" id="glyph0-2">+<path style="stroke: none;" d="M 1.546875 -12.546875 L 3.546875 -12.546875 L 3.546875 -10.765625 C 4.140625 -11.503906 4.769531 -12.03125 5.4375 -12.34375 C 6.101562 -12.664062 6.84375 -12.828125 7.65625 -12.828125 C 9.4375 -12.828125 10.640625 -12.207031 11.265625 -10.96875 C 11.609375 -10.289062 11.78125 -9.316406 11.78125 -8.046875 L 11.78125 0 L 9.640625 0 L 9.640625 -7.90625 C 9.640625 -8.675781 9.523438 -9.296875 9.296875 -9.765625 C 8.921875 -10.546875 8.238281 -10.9375 7.25 -10.9375 C 6.75 -10.9375 6.34375 -10.882812 6.03125 -10.78125 C 5.445312 -10.613281 4.9375 -10.269531 4.5 -9.75 C 4.144531 -9.332031 3.914062 -8.90625 3.8125 -8.46875 C 3.707031 -8.03125 3.65625 -7.398438 3.65625 -6.578125 L 3.65625 0 L 1.546875 0 L 1.546875 -12.546875 Z M 6.5 -12.859375 L 6.5 -12.859375 Z M 6.5 -12.859375 "/>+</symbol>+<symbol overflow="visible" id="glyph0-3">+<path style="stroke: none;" d="M 6.390625 -12.921875 C 7.804688 -12.921875 8.957031 -12.578125 9.84375 -11.890625 C 10.726562 -11.203125 11.257812 -10.015625 11.4375 -8.328125 L 9.390625 -8.328125 C 9.265625 -9.109375 8.976562 -9.753906 8.53125 -10.265625 C 8.082031 -10.773438 7.367188 -11.03125 6.390625 -11.03125 C 5.046875 -11.03125 4.082031 -10.375 3.5 -9.0625 C 3.125 -8.207031 2.9375 -7.15625 2.9375 -5.90625 C 2.9375 -4.644531 3.203125 -3.582031 3.734375 -2.71875 C 4.265625 -1.863281 5.101562 -1.4375 6.25 -1.4375 C 7.125 -1.4375 7.816406 -1.703125 8.328125 -2.234375 C 8.835938 -2.773438 9.191406 -3.507812 9.390625 -4.4375 L 11.4375 -4.4375 C 11.207031 -2.78125 10.625 -1.566406 9.6875 -0.796875 C 8.75 -0.0234375 7.546875 0.359375 6.078125 0.359375 C 4.441406 0.359375 3.132812 -0.238281 2.15625 -1.4375 C 1.175781 -2.632812 0.6875 -4.132812 0.6875 -5.9375 C 0.6875 -8.132812 1.222656 -9.847656 2.296875 -11.078125 C 3.367188 -12.304688 4.734375 -12.921875 6.390625 -12.921875 Z M 6.0625 -12.859375 L 6.0625 -12.859375 Z M 6.0625 -12.859375 "/>+</symbol>+<symbol overflow="visible" id="glyph0-4">+<path style="stroke: none;" d="M 6.53125 -1.359375 C 7.925781 -1.359375 8.882812 -1.882812 9.40625 -2.9375 C 9.925781 -4 10.1875 -5.179688 10.1875 -6.484375 C 10.1875 -7.648438 10 -8.601562 9.625 -9.34375 C 9.03125 -10.5 8.003906 -11.078125 6.546875 -11.078125 C 5.265625 -11.078125 4.328125 -10.582031 3.734375 -9.59375 C 3.148438 -8.613281 2.859375 -7.425781 2.859375 -6.03125 C 2.859375 -4.695312 3.148438 -3.582031 3.734375 -2.6875 C 4.328125 -1.800781 5.257812 -1.359375 6.53125 -1.359375 Z M 6.609375 -12.921875 C 8.222656 -12.921875 9.585938 -12.378906 10.703125 -11.296875 C 11.828125 -10.222656 12.390625 -8.640625 12.390625 -6.546875 C 12.390625 -4.515625 11.894531 -2.835938 10.90625 -1.515625 C 9.925781 -0.203125 8.398438 0.453125 6.328125 0.453125 C 4.597656 0.453125 3.222656 -0.128906 2.203125 -1.296875 C 1.191406 -2.460938 0.6875 -4.03125 0.6875 -6 C 0.6875 -8.113281 1.222656 -9.796875 2.296875 -11.046875 C 3.367188 -12.296875 4.804688 -12.921875 6.609375 -12.921875 Z M 6.546875 -12.859375 L 6.546875 -12.859375 Z M 6.546875 -12.859375 "/>+</symbol>+<symbol overflow="visible" id="glyph0-5">+<path style="stroke: none;" d="M 2.890625 -6.125 C 2.890625 -4.78125 3.171875 -3.65625 3.734375 -2.75 C 4.304688 -1.84375 5.222656 -1.390625 6.484375 -1.390625 C 7.460938 -1.390625 8.265625 -1.8125 8.890625 -2.65625 C 9.515625 -3.5 9.828125 -4.703125 9.828125 -6.265625 C 9.828125 -7.859375 9.503906 -9.035156 8.859375 -9.796875 C 8.210938 -10.554688 7.410156 -10.9375 6.453125 -10.9375 C 5.390625 -10.9375 4.53125 -10.53125 3.875 -9.71875 C 3.21875 -8.90625 2.890625 -7.707031 2.890625 -6.125 Z M 6.0625 -12.78125 C 7.019531 -12.78125 7.820312 -12.578125 8.46875 -12.171875 C 8.84375 -11.929688 9.269531 -11.519531 9.75 -10.9375 L 9.75 -17.28125 L 11.78125 -17.28125 L 11.78125 0 L 9.875 0 L 9.875 -1.75 C 9.382812 -0.976562 8.800781 -0.414062 8.125 -0.0625 C 7.457031 0.28125 6.691406 0.453125 5.828125 0.453125 C 4.429688 0.453125 3.21875 -0.132812 2.1875 -1.3125 C 1.164062 -2.488281 0.65625 -4.054688 0.65625 -6.015625 C 0.65625 -7.835938 1.117188 -9.421875 2.046875 -10.765625 C 2.984375 -12.109375 4.320312 -12.78125 6.0625 -12.78125 Z M 6.0625 -12.78125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-6">+<path style="stroke: none;" d="M 6.78125 -12.828125 C 7.664062 -12.828125 8.523438 -12.617188 9.359375 -12.203125 C 10.203125 -11.785156 10.84375 -11.242188 11.28125 -10.578125 C 11.695312 -9.953125 11.976562 -9.21875 12.125 -8.375 C 12.25 -7.789062 12.3125 -6.867188 12.3125 -5.609375 L 3.109375 -5.609375 C 3.148438 -4.328125 3.453125 -3.300781 4.015625 -2.53125 C 4.578125 -1.769531 5.445312 -1.390625 6.625 -1.390625 C 7.726562 -1.390625 8.609375 -1.75 9.265625 -2.46875 C 9.640625 -2.894531 9.90625 -3.382812 10.0625 -3.9375 L 12.125 -3.9375 C 12.070312 -3.476562 11.890625 -2.960938 11.578125 -2.390625 C 11.273438 -1.828125 10.929688 -1.367188 10.546875 -1.015625 C 9.910156 -0.390625 9.117188 0.0351562 8.171875 0.265625 C 7.660156 0.390625 7.085938 0.453125 6.453125 0.453125 C 4.890625 0.453125 3.5625 -0.113281 2.46875 -1.25 C 1.382812 -2.394531 0.84375 -3.988281 0.84375 -6.03125 C 0.84375 -8.050781 1.390625 -9.6875 2.484375 -10.9375 C 3.578125 -12.195312 5.007812 -12.828125 6.78125 -12.828125 Z M 10.140625 -7.28125 C 10.054688 -8.195312 9.859375 -8.925781 9.546875 -9.46875 C 8.960938 -10.488281 7.992188 -11 6.640625 -11 C 5.671875 -11 4.859375 -10.644531 4.203125 -9.9375 C 3.546875 -9.238281 3.203125 -8.351562 3.171875 -7.28125 L 10.140625 -7.28125 Z M 6.578125 -12.859375 L 6.578125 -12.859375 Z M 6.578125 -12.859375 "/>+</symbol>+<symbol overflow="visible" id="glyph0-7">+<path style="stroke: none;" d="M 1.609375 -12.546875 L 3.609375 -12.546875 L 3.609375 -10.390625 C 3.773438 -10.804688 4.175781 -11.316406 4.8125 -11.921875 C 5.457031 -12.523438 6.195312 -12.828125 7.03125 -12.828125 C 7.070312 -12.828125 7.140625 -12.820312 7.234375 -12.8125 C 7.328125 -12.8125 7.488281 -12.800781 7.71875 -12.78125 L 7.71875 -10.546875 C 7.59375 -10.566406 7.472656 -10.582031 7.359375 -10.59375 C 7.253906 -10.601562 7.140625 -10.609375 7.015625 -10.609375 C 5.953125 -10.609375 5.132812 -10.265625 4.5625 -9.578125 C 4 -8.898438 3.71875 -8.113281 3.71875 -7.21875 L 3.71875 0 L 1.609375 0 L 1.609375 -12.546875 Z M 1.609375 -12.546875 "/>+</symbol>+<symbol overflow="visible" id="glyph1-0">+<path style="stroke: none;" d="M 1.15625 0 L 1.15625 -25.828125 L 21.65625 -25.828125 L 21.65625 0 L 1.15625 0 Z M 18.421875 -3.234375 L 18.421875 -22.59375 L 4.390625 -22.59375 L 4.390625 -3.234375 L 18.421875 -3.234375 Z M 18.421875 -3.234375 "/>+</symbol>+<symbol overflow="visible" id="glyph1-1">+<path style="stroke: none;" d="M 6.890625 0.09375 C 6.890625 1.894531 7.34375 3.175781 8.25 3.9375 C 9.164062 4.707031 10.171875 5.160156 11.265625 5.296875 L 11.265625 7.34375 C 9.179688 7.132812 7.457031 6.519531 6.09375 5.5 C 4.726562 4.488281 4.046875 2.828125 4.046875 0.515625 L 4.046875 -3.109375 C 4.046875 -4.390625 3.84375 -5.398438 3.4375 -6.140625 C 2.71875 -7.484375 1.328125 -8.265625 -0.734375 -8.484375 L -0.734375 -10.5 C 1.335938 -10.738281 2.726562 -11.503906 3.4375 -12.796875 C 3.84375 -13.515625 4.046875 -14.539062 4.046875 -15.875 L 4.046875 -18.734375 C 4.046875 -20.941406 4.519531 -22.6875 5.46875 -23.96875 C 6.425781 -25.257812 8.359375 -26.03125 11.265625 -26.28125 L 11.265625 -24.28125 C 9.378906 -24.113281 8.101562 -23.28125 7.4375 -21.78125 C 7.070312 -20.957031 6.890625 -19.820312 6.890625 -18.375 L 6.890625 -16.40625 C 6.890625 -14.644531 6.671875 -13.296875 6.234375 -12.359375 C 5.453125 -10.660156 3.929688 -9.707031 1.671875 -9.5 C 3.921875 -9.289062 5.441406 -8.304688 6.234375 -6.546875 C 6.671875 -5.566406 6.890625 -4.238281 6.890625 -2.5625 L 6.890625 0.09375 Z M 6.890625 0.09375 "/>+</symbol>+<symbol overflow="visible" id="glyph1-2">+<path style="stroke: none;" d="M 2.984375 3.671875 C 3.796875 3.535156 4.363281 2.96875 4.6875 1.96875 C 4.863281 1.4375 4.953125 0.925781 4.953125 0.4375 C 4.953125 0.351562 4.945312 0.28125 4.9375 0.21875 C 4.9375 0.15625 4.925781 0.0820312 4.90625 0 L 2.984375 0 L 2.984375 -3.828125 L 6.75 -3.828125 L 6.75 -0.28125 C 6.75 1.113281 6.46875 2.335938 5.90625 3.390625 C 5.34375 4.441406 4.367188 5.09375 2.984375 5.34375 L 2.984375 3.671875 Z M 2.984375 3.671875 "/>+</symbol>+<symbol overflow="visible" id="glyph1-3">+<path style="stroke: none;" d="M 10.3125 -9.5 C 8.0625 -9.707031 6.546875 -10.65625 5.765625 -12.34375 C 5.328125 -13.28125 5.109375 -14.632812 5.109375 -16.40625 L 5.109375 -18.375 C 5.109375 -19.914062 4.929688 -21.085938 4.578125 -21.890625 C 3.921875 -23.316406 2.640625 -24.113281 0.734375 -24.28125 L 0.734375 -26.28125 C 3.765625 -26.03125 5.816406 -25.09375 6.890625 -23.46875 C 7.597656 -22.425781 7.953125 -20.847656 7.953125 -18.734375 L 7.953125 -15.875 C 7.953125 -14.5625 8.148438 -13.539062 8.546875 -12.8125 C 9.273438 -11.488281 10.675781 -10.71875 12.75 -10.5 L 12.75 -8.484375 C 10.6875 -8.273438 9.285156 -7.488281 8.546875 -6.125 C 8.148438 -5.375 7.953125 -4.367188 7.953125 -3.109375 L 7.953125 0.515625 C 7.953125 2.878906 7.265625 4.550781 5.890625 5.53125 C 4.523438 6.519531 2.804688 7.125 0.734375 7.34375 L 0.734375 5.296875 C 1.992188 5.128906 3.035156 4.625 3.859375 3.78125 C 4.691406 2.945312 5.109375 1.71875 5.109375 0.09375 L 5.109375 -2.5625 C 5.109375 -4.25 5.328125 -5.578125 5.765625 -6.546875 C 6.566406 -8.304688 8.082031 -9.289062 10.3125 -9.5 Z M 10.3125 -9.5 "/>+</symbol>+</g>+<clipPath id="clip1">+ <path d="M 53.03125 82 L 175 82 L 175 0 L 53.03125 0 L 53.03125 82 Z M 53.03125 82 "/>+</clipPath>+</defs>+<g id="surface0">+ <image width="447" height="231" transform="matrix(0.333333,0,0,0.333333,61,193)" xlink:href="data:image/png;base64,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"/>+<g clip-path="url(#clip1)" clip-rule="nonzero">+<path style="fill-rule: nonzero; fill: rgb(74.805829%,74.805829%,56.055543%); fill-opacity: 1;stroke-width: 16; stroke-linecap: round; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 538.007812 2268.007812 L 938.007812 2268.007812 L 938.007812 2668.007812 L 538.007812 2668.007812 L 538.007812 2268.007812 Z M 538.007812 2268.007812 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(74.805829%,74.805829%,56.055543%); fill-opacity: 1;stroke-width: 16; stroke-linecap: round; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 939.140625 2268.007812 L 1339.140625 2268.007812 L 1339.140625 2668.007812 L 939.140625 2668.007812 L 939.140625 2268.007812 Z M 939.140625 2268.007812 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(74.805829%,74.805829%,56.055543%); fill-opacity: 1;stroke-width: 16; stroke-linecap: round; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 1338.007812 2268.007812 L 1738.007812 2268.007812 L 1738.007812 2668.007812 L 1338.007812 2668.007812 L 1338.007812 2268.007812 Z M 1338.007812 2268.007812 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(74.805829%,74.805829%,56.055543%); fill-opacity: 1;stroke-width: 16; stroke-linecap: round; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 938.007812 2668.007812 L 1338.007812 2668.007812 L 1338.007812 3068.007812 L 938.007812 3068.007812 L 938.007812 2668.007812 Z M 938.007812 2668.007812 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 12.6218; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 647.148438 2555.78125 L 724.882812 2555.78125 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: evenodd; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 12.6218; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 593.632812 2555.78125 L 641.171875 2582.617188 L 641.171875 2528.984375 L 593.632812 2555.78125 Z M 593.632812 2555.78125 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 12.6218; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 1471.367188 2555.78125 L 1393.632812 2555.78125 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: evenodd; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 12.6218; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 1524.882812 2555.78125 L 1477.304688 2582.617188 L 1477.304688 2528.984375 L 1524.882812 2555.78125 Z M 1524.882812 2555.78125 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 12.6218; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 1020.429688 2542.460938 L 1020.429688 2620.234375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: evenodd; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 12.6218; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 1020.429688 2489.023438 L 993.632812 2536.5625 L 1047.226562 2536.5625 L 1020.429688 2489.023438 Z M 1020.429688 2489.023438 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 12.6218; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 1020.429688 2966.71875 L 1020.429688 2888.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: evenodd; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 12.6218; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 4; " d="M 1020.429688 3020.234375 L 993.632812 2972.695312 L 1047.226562 2972.695312 L 1020.429688 3020.234375 Z M 1020.429688 3020.234375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+</g>+<path style="fill-rule: nonzero; fill: rgb(100%,100%,100%); fill-opacity: 1;stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 720 530 L 1990 530 L 1990 1080 L 720 1080 L 720 530 Z M 720 530 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph0-1" x="90.8047" y="236"/>+ <use xlink:href="#glyph0-2" x="106.8127" y="236"/>+ <use xlink:href="#glyph0-3" x="120.1567" y="236"/>+ <use xlink:href="#glyph0-4" x="132.1567" y="236"/>+ <use xlink:href="#glyph0-5" x="145.5007" y="236"/>+ <use xlink:href="#glyph0-6" x="158.8447" y="236"/>+ <use xlink:href="#glyph0-7" x="172.1887" y="236"/>+</g>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1540 2260 L 1540 1818.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1540 1738.984375 L 1570 1818.984375 L 1510 1818.984375 L 1540 1738.984375 Z M 1540 1738.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 720 2260 L 720 1818.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 720 1738.984375 L 750 1818.984375 L 690 1818.984375 L 720 1738.984375 Z M 720 1738.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1135.3125 2270 L 1143.515625 1818.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1144.960938 1738.984375 L 1173.515625 1819.53125 L 1113.515625 1818.4375 L 1144.960938 1738.984375 Z M 1144.960938 1738.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1920.3125 2555 L 1920.039062 1818.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1920 1738.984375 L 1950.039062 1818.984375 L 1890.039062 1819.023438 L 1920 1738.984375 Z M 1920 1738.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1920.3125 2555 L 1920 2920 L 1350 2920 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="40.4711" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="52.4945" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-1" x="74.4847" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="84.4956" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="94.4976" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-2" x="116.4878" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="126.4983" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="136.5003" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-3" x="158.4905" y="164"/>+ <use xlink:href="#glyph3-4" x="168.4985" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="173.5022" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="183.5042" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-5" x="205.4944" y="164"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-3" x="215.5053" y="164"/>+</g>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 375 1490 L 375 1310 L 2305 1320 L 2300 1490 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1350.078125 1315.039062 L 1350.039062 1188.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1350 1108.984375 L 1380.039062 1188.984375 L 1320.039062 1189.023438 L 1350 1108.984375 Z M 1350 1108.984375 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1350.078125 530 L 1350.039062 403.945312 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1350 323.945312 L 1380.039062 403.945312 L 1320.039062 403.945312 L 1350 323.945312 Z M 1350 323.945312 " transform="matrix(0.1,0,0,-0.1,0,308)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph4-1" x="0.378906" y="301"/>+ <use xlink:href="#glyph4-2" x="11.178906" y="301"/>+ <use xlink:href="#glyph4-3" x="21.978906" y="301"/>+ <use xlink:href="#glyph4-4" x="32.778906" y="301"/>+ <use xlink:href="#glyph4-5" x="43.578906" y="301"/>+ <use xlink:href="#glyph4-6" x="54.378906" y="301"/>+ <use xlink:href="#glyph4-5" x="65.178906" y="301"/>+ <use xlink:href="#glyph4-7" x="75.978906" y="301"/>+ <use xlink:href="#glyph4-8" x="86.778906" y="301"/>+ <use xlink:href="#glyph4-9" x="97.578906" y="301"/>+ <use xlink:href="#glyph4-10" x="108.378906" y="301"/>+ <use xlink:href="#glyph4-5" x="119.178906" y="301"/>+ <use xlink:href="#glyph4-6" x="129.978906" y="301"/>+ <use xlink:href="#glyph4-5" x="140.778906" y="301"/>+ <use xlink:href="#glyph4-11" x="151.578906" y="301"/>+ <use xlink:href="#glyph4-12" x="162.378906" y="301"/>+ <use xlink:href="#glyph4-13" x="173.178906" y="301"/>+ <use xlink:href="#glyph4-14" x="183.978906" y="301"/>+ <use xlink:href="#glyph4-4" x="194.778906" y="301"/>+ <use xlink:href="#glyph4-5" x="205.578906" y="301"/>+ <use xlink:href="#glyph4-6" x="216.378906" y="301"/>+ <use xlink:href="#glyph4-5" x="227.178906" y="301"/>+ <use xlink:href="#glyph4-15" x="237.978906" y="301"/>+ <use xlink:href="#glyph4-16" x="248.778906" y="301"/>+</g>+</g>+</svg>
+ doc/www/files/tutorial/figures/fullAdderMealy.svg view
@@ -0,0 +1,163 @@+<?xml version="1.0" encoding="UTF-8"?>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="385pt" height="189pt" viewBox="0 0 385 189" version="1.1">+<defs>+<g>+<symbol overflow="visible" id="glyph0-0">+<path style="stroke: none;" d="M 0.703125 0 L 0.703125 -15.78125 L 13.234375 -15.78125 L 13.234375 0 L 0.703125 0 Z M 11.265625 -1.984375 L 11.265625 -13.796875 L 2.6875 -13.796875 L 2.6875 -1.984375 L 11.265625 -1.984375 Z M 11.265625 -1.984375 "/>+</symbol>+<symbol overflow="visible" id="glyph0-1">+<path style="stroke: none;" d="M 8.328125 -16.203125 C 10.328125 -16.203125 11.875 -15.675781 12.96875 -14.625 C 14.070312 -13.570312 14.6875 -12.378906 14.8125 -11.046875 L 12.734375 -11.046875 C 12.492188 -12.054688 12.019531 -12.859375 11.3125 -13.453125 C 10.613281 -14.054688 9.625 -14.359375 8.34375 -14.359375 C 6.789062 -14.359375 5.535156 -13.8125 4.578125 -12.71875 C 3.617188 -11.625 3.140625 -9.945312 3.140625 -7.6875 C 3.140625 -5.84375 3.570312 -4.34375 4.4375 -3.1875 C 5.300781 -2.039062 6.585938 -1.46875 8.296875 -1.46875 C 9.878906 -1.46875 11.082031 -2.070312 11.90625 -3.28125 C 12.34375 -3.925781 12.664062 -4.765625 12.875 -5.796875 L 14.96875 -5.796875 C 14.78125 -4.140625 14.160156 -2.75 13.109375 -1.625 C 11.859375 -0.269531 10.171875 0.40625 8.046875 0.40625 C 6.210938 0.40625 4.671875 -0.144531 3.421875 -1.25 C 1.785156 -2.71875 0.96875 -4.988281 0.96875 -8.0625 C 0.96875 -10.382812 1.582031 -12.289062 2.8125 -13.78125 C 4.144531 -15.394531 5.984375 -16.203125 8.328125 -16.203125 Z M 7.890625 -16.203125 L 7.890625 -16.203125 Z M 7.890625 -16.203125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-2">+<path style="stroke: none;" d="M 0.90625 -7.125 L 6.3125 -7.125 L 6.3125 -5.140625 L 0.90625 -5.140625 L 0.90625 -7.125 Z M 0.90625 -7.125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-3">+<path style="stroke: none;" d="M 1.421875 -11.453125 L 3.390625 -11.453125 L 3.390625 0 L 1.421875 0 L 1.421875 -11.453125 Z M 1.421875 -15.78125 L 3.390625 -15.78125 L 3.390625 -13.59375 L 1.421875 -13.59375 L 1.421875 -15.78125 Z M 1.421875 -15.78125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-4">+<path style="stroke: none;" d="M 1.421875 -11.5 L 3.25 -11.5 L 3.25 -9.875 C 3.800781 -10.539062 4.378906 -11.019531 4.984375 -11.3125 C 5.585938 -11.613281 6.265625 -11.765625 7.015625 -11.765625 C 8.648438 -11.765625 9.753906 -11.195312 10.328125 -10.0625 C 10.640625 -9.4375 10.796875 -8.539062 10.796875 -7.375 L 10.796875 0 L 8.828125 0 L 8.828125 -7.25 C 8.828125 -7.945312 8.722656 -8.515625 8.515625 -8.953125 C 8.171875 -9.660156 7.550781 -10.015625 6.65625 -10.015625 C 6.195312 -10.015625 5.816406 -9.972656 5.515625 -9.890625 C 4.992188 -9.722656 4.53125 -9.40625 4.125 -8.9375 C 3.800781 -8.5625 3.59375 -8.171875 3.5 -7.765625 C 3.40625 -7.359375 3.359375 -6.78125 3.359375 -6.03125 L 3.359375 0 L 1.421875 0 L 1.421875 -11.5 Z M 5.96875 -11.78125 L 5.96875 -11.78125 Z M 5.96875 -11.78125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-5">+<path style="stroke: none;" d="M 12.1875 -8.828125 L 12.1875 -7.03125 L 0.984375 -7.03125 L 0.984375 -8.828125 L 12.1875 -8.828125 Z M 12.1875 -4.21875 L 12.1875 -2.390625 L 0.984375 -2.390625 L 0.984375 -4.21875 L 12.1875 -4.21875 Z M 12.1875 -4.21875 "/>+</symbol>+<symbol overflow="visible" id="glyph2-0">+<path style="stroke: none;" d="M 1.90625 0 L 1.90625 -12.09375 L 8.90625 -12.09375 L 8.90625 0 L 1.90625 0 Z M 3.03125 -1.125 L 7.78125 -1.125 L 7.78125 -10.96875 L 3.03125 -10.96875 L 3.03125 -1.125 Z M 3.03125 -1.125 "/>+</symbol>+<symbol overflow="visible" id="glyph2-1">+<path style="stroke: none;" d="M 8.421875 1.84375 L 7.890625 2.59375 C 6.578125 1.601562 5.578125 0.453125 4.890625 -0.859375 C 4.210938 -2.171875 3.875 -3.554688 3.875 -5.015625 C 3.875 -6.484375 4.210938 -7.867188 4.890625 -9.171875 C 5.566406 -10.484375 6.566406 -11.632812 7.890625 -12.625 L 8.421875 -11.859375 C 7.347656 -10.898438 6.570312 -9.894531 6.09375 -8.84375 C 5.625 -7.789062 5.390625 -6.519531 5.390625 -5.03125 C 5.390625 -3.488281 5.632812 -2.191406 6.125 -1.140625 C 6.613281 -0.0859375 7.378906 0.90625 8.421875 1.84375 Z M 8.421875 1.84375 "/>+</symbol>+<symbol overflow="visible" id="glyph2-2">+<path style="stroke: none;" d="M 8.96875 0 L 7.53125 0 L 7.53125 -6.15625 L 3.28125 -6.15625 L 3.28125 0 L 1.84375 0 L 1.84375 -12.40625 L 3.28125 -12.40625 L 3.28125 -7.421875 L 7.53125 -7.421875 L 7.53125 -12.40625 L 8.96875 -12.40625 L 8.96875 0 Z M 8.96875 0 "/>+</symbol>+<symbol overflow="visible" id="glyph2-3">+<path style="stroke: none;" d="M 5.421875 0.234375 C 5.109375 0.203125 4.851562 0.078125 4.65625 -0.140625 C 4.457031 -0.359375 4.359375 -0.601562 4.359375 -0.875 C 4.359375 -1.175781 4.453125 -1.425781 4.640625 -1.625 C 4.835938 -1.832031 5.082031 -1.9375 5.375 -1.9375 C 5.707031 -1.9375 5.992188 -1.800781 6.234375 -1.53125 C 6.472656 -1.269531 6.59375 -0.953125 6.59375 -0.578125 C 6.59375 0.566406 5.953125 1.460938 4.671875 2.109375 L 4.34375 1.484375 C 5.0625 1.128906 5.421875 0.710938 5.421875 0.234375 Z M 5.421875 0.234375 "/>+</symbol>+<symbol overflow="visible" id="glyph2-4">+<path style="stroke: none;" d="M 2.921875 -12.625 C 4.234375 -11.632812 5.226562 -10.484375 5.90625 -9.171875 C 6.582031 -7.867188 6.921875 -6.484375 6.921875 -5.015625 C 6.921875 -3.554688 6.578125 -2.171875 5.890625 -0.859375 C 5.210938 0.453125 4.222656 1.601562 2.921875 2.59375 L 2.375 1.84375 C 3.445312 0.882812 4.21875 -0.125 4.6875 -1.1875 C 5.15625 -2.257812 5.390625 -3.539062 5.390625 -5.03125 C 5.390625 -6.570312 5.144531 -7.859375 4.65625 -8.890625 C 4.175781 -9.929688 3.414062 -10.921875 2.375 -11.859375 L 2.921875 -12.625 Z M 2.921875 -12.625 "/>+</symbol>+<symbol overflow="visible" id="glyph2-5">+<path style="stroke: none;" d="M 8.5625 -12.640625 L 3.1875 0.234375 L 1.890625 0.234375 L 7.25 -12.640625 L 8.5625 -12.640625 Z M 8.5625 -12.640625 "/>+</symbol>+<symbol overflow="visible" id="glyph2-6">+<path style="stroke: none;" d="M 9 0 L 2.25 0 L 2.25 -12.40625 L 3.6875 -12.40625 L 3.6875 -1.25 L 9 -1.25 L 9 0 Z M 9 0 "/>+</symbol>+<symbol overflow="visible" id="glyph1-0">+<path style="stroke: none;" d="M 2.328125 0 L 2.328125 -14.78125 L 10.875 -14.78125 L 10.875 0 L 2.328125 0 Z M 3.703125 -1.375 L 9.5 -1.375 L 9.5 -13.40625 L 3.703125 -13.40625 L 3.703125 -1.375 Z M 3.703125 -1.375 "/>+</symbol>+<symbol overflow="visible" id="glyph1-1">+<path style="stroke: none;" d="M 11 0 L 2.75 0 L 2.75 -15.15625 L 4.515625 -15.15625 L 4.515625 -1.53125 L 11 -1.53125 L 11 0 Z M 11 0 "/>+</symbol>+<symbol overflow="visible" id="glyph1-2">+<path style="stroke: none;" d="M 10.953125 0 L 9.203125 0 L 9.203125 -7.515625 L 4 -7.515625 L 4 0 L 2.25 0 L 2.25 -15.15625 L 4 -15.15625 L 4 -9.0625 L 9.203125 -9.0625 L 9.203125 -15.15625 L 10.953125 -15.15625 L 10.953125 0 Z M 10.953125 0 "/>+</symbol>+</g>+</defs>+<g id="surface0">+ <image width="354" height="345" transform="matrix(0.333333,0,0,0.333333,224,22)" xlink:href="data:image/png;base64,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"/>+ <image width="354" height="345" transform="matrix(0.333333,0,0,0.333333,45,22)" xlink:href="data:image/png;base64,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"/>+<path style="fill-rule: nonzero; fill: rgb(100%,100%,100%); fill-opacity: 1;stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1379.414062 1463.789062 C 1566.875 1282.226562 1566.875 987.773438 1379.414062 806.210938 C 1191.953125 624.609375 888.046875 624.609375 700.585938 806.210938 C 513.125 987.773438 513.125 1282.226562 700.585938 1463.789062 C 888.046875 1645.390625 1191.953125 1645.390625 1379.414062 1463.789062 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph0-1" x="70.8066" y="83.5"/>+ <use xlink:href="#glyph0-2" x="86.6906" y="83.5"/>+ <use xlink:href="#glyph0-3" x="94.0166" y="83.5"/>+ <use xlink:href="#glyph0-4" x="98.9006" y="83.5"/>+ <use xlink:href="#glyph0-5" x="111.1326" y="83.5"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="123.9914" y="83.5"/>+</g>+<path style="fill-rule: nonzero; fill: rgb(100%,100%,100%); fill-opacity: 1;stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 3169.414062 1463.789062 C 3356.875 1282.226562 3356.875 987.773438 3169.414062 806.210938 C 2981.953125 624.609375 2678.046875 624.609375 2490.585938 806.210938 C 2303.125 987.773438 2303.125 1282.226562 2490.585938 1463.789062 C 2678.046875 1645.390625 2981.953125 1645.390625 3169.414062 1463.789062 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph0-1" x="249.807" y="83.5"/>+ <use xlink:href="#glyph0-2" x="265.691" y="83.5"/>+ <use xlink:href="#glyph0-3" x="273.017" y="83.5"/>+ <use xlink:href="#glyph0-4" x="277.901" y="83.5"/>+ <use xlink:href="#glyph0-5" x="290.133" y="83.5"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="302.9918" y="83.5"/>+</g>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 20 1140 L 456.015625 1137.851562 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 536.015625 1137.460938 L 456.132812 1167.851562 L 455.859375 1107.851562 L 536.015625 1137.460938 Z M 536.015625 1137.460938 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1452.734375 1382.03125 C 1551.796875 1441.367188 1643.789062 1528.671875 1750 1560 C 1856.210938 1591.328125 1979.140625 1600.195312 2090 1570 C 2172.421875 1547.539062 2252.148438 1488.007812 2332.1875 1432.773438 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2399.296875 1389.179688 L 2348.554688 1457.890625 L 2315.859375 1407.578125 L 2399.296875 1389.179688 Z M 2399.296875 1389.179688 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1534.648438 832.382812 C 1628.164062 768.4375 1722.890625 697.773438 1810 670 C 1923.046875 633.945312 2026.71875 636.796875 2130 670 C 2233.28125 703.203125 2329.921875 802.8125 2429.882812 869.21875 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1467.617188 876.015625 L 1518.28125 807.226562 L 1551.054688 857.5 L 1467.617188 876.015625 Z M 1467.617188 876.015625 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 904.179688 581.757812 C 896.25 553.867188 890.15625 526.328125 890 500 C 889.6875 443.867188 898.320312 378.320312 930 340 C 961.679688 301.679688 1031.679688 266.679688 1080 270 C 1128.320312 273.320312 1195 318.320312 1220 360 C 1245 401.679688 1236.796875 465.898438 1230 520 C 1223.203125 574.101562 1196.09375 629.765625 1179.140625 684.648438 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 926.484375 658.554688 L 875.351562 590.078125 L 932.96875 573.359375 L 926.484375 658.554688 Z M 926.484375 658.554688 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2674.179688 567.109375 C 2666.25 539.179688 2660.15625 511.640625 2660 485.351562 C 2659.726562 429.21875 2668.359375 363.671875 2700 325.351562 C 2731.640625 287.03125 2801.679688 251.992188 2850 255.351562 C 2898.320312 258.671875 2965 303.671875 2990 345.351562 C 3015 386.992188 3006.796875 451.25 3000 505.351562 C 2993.203125 559.453125 2966.09375 615.117188 2949.140625 670 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2696.445312 643.867188 L 2645.351562 575.429688 L 2702.96875 558.671875 L 2696.445312 643.867188 Z M 2696.445312 643.867188 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="155.694" y="16.5"/>+ <use xlink:href="#glyph2-2" x="166.494" y="16.5"/>+ <use xlink:href="#glyph2-3" x="177.294" y="16.5"/>+ <use xlink:href="#glyph2-2" x="188.094" y="16.5"/>+ <use xlink:href="#glyph2-4" x="198.894" y="16.5"/>+ <use xlink:href="#glyph2-5" x="209.694" y="16.5"/>+ <use xlink:href="#glyph2-6" x="220.494" y="16.5"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="155.694" y="148.733"/>+ <use xlink:href="#glyph2-6" x="166.494" y="148.733"/>+ <use xlink:href="#glyph2-3" x="177.294" y="148.733"/>+ <use xlink:href="#glyph2-6" x="188.094" y="148.733"/>+ <use xlink:href="#glyph2-4" x="198.894" y="148.733"/>+ <use xlink:href="#glyph2-5" x="209.694" y="148.733"/>+ <use xlink:href="#glyph2-2" x="220.494" y="148.733"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="2.194" y="134.5002"/>+ <use xlink:href="#glyph2-6" x="12.994" y="134.5002"/>+ <use xlink:href="#glyph2-3" x="23.794" y="134.5002"/>+ <use xlink:href="#glyph2-6" x="34.594" y="134.5002"/>+ <use xlink:href="#glyph2-4" x="45.394" y="134.5002"/>+ <use xlink:href="#glyph2-5" x="56.194" y="134.5002"/>+ <use xlink:href="#glyph2-6" x="66.994" y="134.5002"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="2.194" y="158.9662"/>+ <use xlink:href="#glyph2-6" x="12.994" y="158.9662"/>+ <use xlink:href="#glyph2-3" x="23.794" y="158.9662"/>+ <use xlink:href="#glyph2-2" x="34.594" y="158.9662"/>+ <use xlink:href="#glyph2-4" x="45.394" y="158.9662"/>+ <use xlink:href="#glyph2-5" x="56.194" y="158.9662"/>+ <use xlink:href="#glyph2-2" x="66.994" y="158.9662"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="309.194" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="319.994" y="183.4322"/>+ <use xlink:href="#glyph2-3" x="330.794" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="341.594" y="183.4322"/>+ <use xlink:href="#glyph2-4" x="352.394" y="183.4322"/>+ <use xlink:href="#glyph2-5" x="363.194" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="373.994" y="183.4322"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="309.194" y="158.9662"/>+ <use xlink:href="#glyph2-2" x="319.994" y="158.9662"/>+ <use xlink:href="#glyph2-3" x="330.794" y="158.9662"/>+ <use xlink:href="#glyph2-6" x="341.594" y="158.9662"/>+ <use xlink:href="#glyph2-4" x="352.394" y="158.9662"/>+ <use xlink:href="#glyph2-5" x="363.194" y="158.9662"/>+ <use xlink:href="#glyph2-6" x="373.994" y="158.9662"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="309.194" y="134.5002"/>+ <use xlink:href="#glyph2-6" x="319.994" y="134.5002"/>+ <use xlink:href="#glyph2-3" x="330.794" y="134.5002"/>+ <use xlink:href="#glyph2-2" x="341.594" y="134.5002"/>+ <use xlink:href="#glyph2-4" x="352.394" y="134.5002"/>+ <use xlink:href="#glyph2-5" x="363.194" y="134.5002"/>+ <use xlink:href="#glyph2-6" x="373.994" y="134.5002"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="2.194" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="12.994" y="183.4322"/>+ <use xlink:href="#glyph2-3" x="23.794" y="183.4322"/>+ <use xlink:href="#glyph2-6" x="34.594" y="183.4322"/>+ <use xlink:href="#glyph2-4" x="45.394" y="183.4322"/>+ <use xlink:href="#glyph2-5" x="56.194" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="66.994" y="183.4322"/>+</g>+</g>+</svg>
+ doc/www/files/tutorial/figures/fullAdderMoore.svg view
@@ -0,0 +1,144 @@+<?xml version="1.0" encoding="UTF-8"?>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="364pt" height="189pt" viewBox="0 0 364 189" version="1.1">+<defs>+<g>+<symbol overflow="visible" id="glyph1-0">+<path style="stroke: none;" d="M 2.328125 0 L 2.328125 -14.78125 L 10.875 -14.78125 L 10.875 0 L 2.328125 0 Z M 3.703125 -1.375 L 9.5 -1.375 L 9.5 -13.40625 L 3.703125 -13.40625 L 3.703125 -1.375 Z M 3.703125 -1.375 "/>+</symbol>+<symbol overflow="visible" id="glyph1-1">+<path style="stroke: none;" d="M 11 0 L 2.75 0 L 2.75 -15.15625 L 4.515625 -15.15625 L 4.515625 -1.53125 L 11 -1.53125 L 11 0 Z M 11 0 "/>+</symbol>+<symbol overflow="visible" id="glyph1-2">+<path style="stroke: none;" d="M 10.953125 0 L 9.203125 0 L 9.203125 -7.515625 L 4 -7.515625 L 4 0 L 2.25 0 L 2.25 -15.15625 L 4 -15.15625 L 4 -9.0625 L 9.203125 -9.0625 L 9.203125 -15.15625 L 10.953125 -15.15625 L 10.953125 0 Z M 10.953125 0 "/>+</symbol>+<symbol overflow="visible" id="glyph0-0">+<path style="stroke: none;" d="M 0.703125 0 L 0.703125 -15.78125 L 13.234375 -15.78125 L 13.234375 0 L 0.703125 0 Z M 11.265625 -1.984375 L 11.265625 -13.796875 L 2.6875 -13.796875 L 2.6875 -1.984375 L 11.265625 -1.984375 Z M 11.265625 -1.984375 "/>+</symbol>+<symbol overflow="visible" id="glyph0-1">+<path style="stroke: none;" d="M 8.328125 -16.203125 C 10.328125 -16.203125 11.875 -15.675781 12.96875 -14.625 C 14.070312 -13.570312 14.6875 -12.378906 14.8125 -11.046875 L 12.734375 -11.046875 C 12.492188 -12.054688 12.019531 -12.859375 11.3125 -13.453125 C 10.613281 -14.054688 9.625 -14.359375 8.34375 -14.359375 C 6.789062 -14.359375 5.535156 -13.8125 4.578125 -12.71875 C 3.617188 -11.625 3.140625 -9.945312 3.140625 -7.6875 C 3.140625 -5.84375 3.570312 -4.34375 4.4375 -3.1875 C 5.300781 -2.039062 6.585938 -1.46875 8.296875 -1.46875 C 9.878906 -1.46875 11.082031 -2.070312 11.90625 -3.28125 C 12.34375 -3.925781 12.664062 -4.765625 12.875 -5.796875 L 14.96875 -5.796875 C 14.78125 -4.140625 14.160156 -2.75 13.109375 -1.625 C 11.859375 -0.269531 10.171875 0.40625 8.046875 0.40625 C 6.210938 0.40625 4.671875 -0.144531 3.421875 -1.25 C 1.785156 -2.71875 0.96875 -4.988281 0.96875 -8.0625 C 0.96875 -10.382812 1.582031 -12.289062 2.8125 -13.78125 C 4.144531 -15.394531 5.984375 -16.203125 8.328125 -16.203125 Z M 7.890625 -16.203125 L 7.890625 -16.203125 Z M 7.890625 -16.203125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-2">+<path style="stroke: none;" d="M 0.90625 -7.125 L 6.3125 -7.125 L 6.3125 -5.140625 L 0.90625 -5.140625 L 0.90625 -7.125 Z M 0.90625 -7.125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-3">+<path style="stroke: none;" d="M 1.421875 -11.453125 L 3.390625 -11.453125 L 3.390625 0 L 1.421875 0 L 1.421875 -11.453125 Z M 1.421875 -15.78125 L 3.390625 -15.78125 L 3.390625 -13.59375 L 1.421875 -13.59375 L 1.421875 -15.78125 Z M 1.421875 -15.78125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-4">+<path style="stroke: none;" d="M 1.421875 -11.5 L 3.25 -11.5 L 3.25 -9.875 C 3.800781 -10.539062 4.378906 -11.019531 4.984375 -11.3125 C 5.585938 -11.613281 6.265625 -11.765625 7.015625 -11.765625 C 8.648438 -11.765625 9.753906 -11.195312 10.328125 -10.0625 C 10.640625 -9.4375 10.796875 -8.539062 10.796875 -7.375 L 10.796875 0 L 8.828125 0 L 8.828125 -7.25 C 8.828125 -7.945312 8.722656 -8.515625 8.515625 -8.953125 C 8.171875 -9.660156 7.550781 -10.015625 6.65625 -10.015625 C 6.195312 -10.015625 5.816406 -9.972656 5.515625 -9.890625 C 4.992188 -9.722656 4.53125 -9.40625 4.125 -8.9375 C 3.800781 -8.5625 3.59375 -8.171875 3.5 -7.765625 C 3.40625 -7.359375 3.359375 -6.78125 3.359375 -6.03125 L 3.359375 0 L 1.421875 0 L 1.421875 -11.5 Z M 5.96875 -11.78125 L 5.96875 -11.78125 Z M 5.96875 -11.78125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-5">+<path style="stroke: none;" d="M 12.1875 -8.828125 L 12.1875 -7.03125 L 0.984375 -7.03125 L 0.984375 -8.828125 L 12.1875 -8.828125 Z M 12.1875 -4.21875 L 12.1875 -2.390625 L 0.984375 -2.390625 L 0.984375 -4.21875 L 12.1875 -4.21875 Z M 12.1875 -4.21875 "/>+</symbol>+<symbol overflow="visible" id="glyph2-0">+<path style="stroke: none;" d="M 1.90625 0 L 1.90625 -12.09375 L 8.90625 -12.09375 L 8.90625 0 L 1.90625 0 Z M 3.03125 -1.125 L 7.78125 -1.125 L 7.78125 -10.96875 L 3.03125 -10.96875 L 3.03125 -1.125 Z M 3.03125 -1.125 "/>+</symbol>+<symbol overflow="visible" id="glyph2-1">+<path style="stroke: none;" d="M 8.421875 1.84375 L 7.890625 2.59375 C 6.578125 1.601562 5.578125 0.453125 4.890625 -0.859375 C 4.210938 -2.171875 3.875 -3.554688 3.875 -5.015625 C 3.875 -6.484375 4.210938 -7.867188 4.890625 -9.171875 C 5.566406 -10.484375 6.566406 -11.632812 7.890625 -12.625 L 8.421875 -11.859375 C 7.347656 -10.898438 6.570312 -9.894531 6.09375 -8.84375 C 5.625 -7.789062 5.390625 -6.519531 5.390625 -5.03125 C 5.390625 -3.488281 5.632812 -2.191406 6.125 -1.140625 C 6.613281 -0.0859375 7.378906 0.90625 8.421875 1.84375 Z M 8.421875 1.84375 "/>+</symbol>+<symbol overflow="visible" id="glyph2-2">+<path style="stroke: none;" d="M 8.96875 0 L 7.53125 0 L 7.53125 -6.15625 L 3.28125 -6.15625 L 3.28125 0 L 1.84375 0 L 1.84375 -12.40625 L 3.28125 -12.40625 L 3.28125 -7.421875 L 7.53125 -7.421875 L 7.53125 -12.40625 L 8.96875 -12.40625 L 8.96875 0 Z M 8.96875 0 "/>+</symbol>+<symbol overflow="visible" id="glyph2-3">+<path style="stroke: none;" d="M 5.421875 0.234375 C 5.109375 0.203125 4.851562 0.078125 4.65625 -0.140625 C 4.457031 -0.359375 4.359375 -0.601562 4.359375 -0.875 C 4.359375 -1.175781 4.453125 -1.425781 4.640625 -1.625 C 4.835938 -1.832031 5.082031 -1.9375 5.375 -1.9375 C 5.707031 -1.9375 5.992188 -1.800781 6.234375 -1.53125 C 6.472656 -1.269531 6.59375 -0.953125 6.59375 -0.578125 C 6.59375 0.566406 5.953125 1.460938 4.671875 2.109375 L 4.34375 1.484375 C 5.0625 1.128906 5.421875 0.710938 5.421875 0.234375 Z M 5.421875 0.234375 "/>+</symbol>+<symbol overflow="visible" id="glyph2-4">+<path style="stroke: none;" d="M 2.921875 -12.625 C 4.234375 -11.632812 5.226562 -10.484375 5.90625 -9.171875 C 6.582031 -7.867188 6.921875 -6.484375 6.921875 -5.015625 C 6.921875 -3.554688 6.578125 -2.171875 5.890625 -0.859375 C 5.210938 0.453125 4.222656 1.601562 2.921875 2.59375 L 2.375 1.84375 C 3.445312 0.882812 4.21875 -0.125 4.6875 -1.1875 C 5.15625 -2.257812 5.390625 -3.539062 5.390625 -5.03125 C 5.390625 -6.570312 5.144531 -7.859375 4.65625 -8.890625 C 4.175781 -9.929688 3.414062 -10.921875 2.375 -11.859375 L 2.921875 -12.625 Z M 2.921875 -12.625 "/>+</symbol>+<symbol overflow="visible" id="glyph2-5">+<path style="stroke: none;" d="M 9 0 L 2.25 0 L 2.25 -12.40625 L 3.6875 -12.40625 L 3.6875 -1.25 L 9 -1.25 L 9 0 Z M 9 0 "/>+</symbol>+</g>+</defs>+<g id="surface0">+ <image width="354" height="345" transform="matrix(0.333333,0,0,0.333333,224,22)" xlink:href="data:image/png;base64,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"/>+ <image width="354" height="345" transform="matrix(0.333333,0,0,0.333333,45,22)" xlink:href="data:image/png;base64,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"/>+<path style="fill-rule: nonzero; fill: rgb(100%,100%,100%); fill-opacity: 1;stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1379.414062 1463.789062 C 1566.875 1282.226562 1566.875 987.773438 1379.414062 806.210938 C 1191.953125 624.609375 888.046875 624.609375 700.585938 806.210938 C 513.125 987.773438 513.125 1282.226562 700.585938 1463.789062 C 888.046875 1645.390625 1191.953125 1645.390625 1379.414062 1463.789062 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph0-1" x="70.8066" y="83.5"/>+ <use xlink:href="#glyph0-2" x="86.6906" y="83.5"/>+ <use xlink:href="#glyph0-3" x="94.0166" y="83.5"/>+ <use xlink:href="#glyph0-4" x="98.9006" y="83.5"/>+ <use xlink:href="#glyph0-5" x="111.1326" y="83.5"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="123.9914" y="83.5"/>+</g>+<path style="fill-rule: nonzero; fill: rgb(100%,100%,100%); fill-opacity: 1;stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 3169.414062 1463.789062 C 3356.875 1282.226562 3356.875 987.773438 3169.414062 806.210938 C 2981.953125 624.609375 2678.046875 624.609375 2490.585938 806.210938 C 2303.125 987.773438 2303.125 1282.226562 2490.585938 1463.789062 C 2678.046875 1645.390625 2981.953125 1645.390625 3169.414062 1463.789062 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph0-1" x="249.807" y="83.5"/>+ <use xlink:href="#glyph0-2" x="265.691" y="83.5"/>+ <use xlink:href="#glyph0-3" x="273.017" y="83.5"/>+ <use xlink:href="#glyph0-4" x="277.901" y="83.5"/>+ <use xlink:href="#glyph0-5" x="290.133" y="83.5"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="302.9918" y="83.5"/>+</g>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 20 1140 L 456.015625 1137.851562 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 536.015625 1137.460938 L 456.132812 1167.851562 L 455.859375 1107.851562 L 536.015625 1137.460938 Z M 536.015625 1137.460938 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1452.734375 1382.03125 C 1551.796875 1441.367188 1643.789062 1528.671875 1750 1560 C 1856.210938 1591.328125 1979.140625 1600.195312 2090 1570 C 2172.421875 1547.539062 2252.148438 1488.007812 2332.1875 1432.773438 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2399.296875 1389.179688 L 2348.554688 1457.890625 L 2315.859375 1407.578125 L 2399.296875 1389.179688 Z M 2399.296875 1389.179688 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1534.648438 832.382812 C 1628.164062 768.4375 1722.890625 697.773438 1810 670 C 1923.046875 633.945312 2026.71875 636.796875 2130 670 C 2233.28125 703.203125 2329.921875 802.8125 2429.882812 869.21875 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1467.617188 876.015625 L 1518.28125 807.226562 L 1551.054688 857.5 L 1467.617188 876.015625 Z M 1467.617188 876.015625 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 904.179688 581.757812 C 896.25 553.867188 890.15625 526.328125 890 500 C 889.6875 443.867188 898.320312 378.320312 930 340 C 961.679688 301.679688 1031.679688 266.679688 1080 270 C 1128.320312 273.320312 1195 318.320312 1220 360 C 1245 401.679688 1236.796875 465.898438 1230 520 C 1223.203125 574.101562 1196.09375 629.765625 1179.140625 684.648438 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 926.484375 658.554688 L 875.351562 590.078125 L 932.96875 573.359375 L 926.484375 658.554688 Z M 926.484375 658.554688 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill: none; stroke-width: 10; stroke-linecap: round; stroke-linejoin: round; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2674.179688 567.109375 C 2666.25 539.179688 2660.15625 511.640625 2660 485.351562 C 2659.726562 429.21875 2668.359375 363.671875 2700 325.351562 C 2731.640625 287.03125 2801.679688 251.992188 2850 255.351562 C 2898.320312 258.671875 2965 303.671875 2990 345.351562 C 3015 386.992188 3006.796875 451.25 3000 505.351562 C 2993.203125 559.453125 2966.09375 615.117188 2949.140625 670 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<path style="fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;stroke-width: 10; stroke-linecap: butt; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2696.445312 643.867188 L 2645.351562 575.429688 L 2702.96875 558.671875 L 2696.445312 643.867188 Z M 2696.445312 643.867188 " transform="matrix(0.1,0,0,-0.1,0,189)"/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="166.496" y="16.5"/>+ <use xlink:href="#glyph2-2" x="177.296" y="16.5"/>+ <use xlink:href="#glyph2-3" x="188.096" y="16.5"/>+ <use xlink:href="#glyph2-2" x="198.896" y="16.5"/>+ <use xlink:href="#glyph2-4" x="209.696" y="16.5"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="166.496" y="148.733"/>+ <use xlink:href="#glyph2-5" x="177.296" y="148.733"/>+ <use xlink:href="#glyph2-3" x="188.096" y="148.733"/>+ <use xlink:href="#glyph2-5" x="198.896" y="148.733"/>+ <use xlink:href="#glyph2-4" x="209.696" y="148.733"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="23.496" y="134.5002"/>+ <use xlink:href="#glyph2-5" x="34.296" y="134.5002"/>+ <use xlink:href="#glyph2-3" x="45.096" y="134.5002"/>+ <use xlink:href="#glyph2-5" x="55.896" y="134.5002"/>+ <use xlink:href="#glyph2-4" x="66.696" y="134.5002"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="23.496" y="158.9662"/>+ <use xlink:href="#glyph2-5" x="34.296" y="158.9662"/>+ <use xlink:href="#glyph2-3" x="45.096" y="158.9662"/>+ <use xlink:href="#glyph2-2" x="55.896" y="158.9662"/>+ <use xlink:href="#glyph2-4" x="66.696" y="158.9662"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="309.496" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="320.296" y="183.4322"/>+ <use xlink:href="#glyph2-3" x="331.096" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="341.896" y="183.4322"/>+ <use xlink:href="#glyph2-4" x="352.696" y="183.4322"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="309.496" y="158.9662"/>+ <use xlink:href="#glyph2-2" x="320.296" y="158.9662"/>+ <use xlink:href="#glyph2-3" x="331.096" y="158.9662"/>+ <use xlink:href="#glyph2-5" x="341.896" y="158.9662"/>+ <use xlink:href="#glyph2-4" x="352.696" y="158.9662"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="309.496" y="134.5002"/>+ <use xlink:href="#glyph2-5" x="320.296" y="134.5002"/>+ <use xlink:href="#glyph2-3" x="331.096" y="134.5002"/>+ <use xlink:href="#glyph2-2" x="341.896" y="134.5002"/>+ <use xlink:href="#glyph2-4" x="352.696" y="134.5002"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="23.496" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="34.296" y="183.4322"/>+ <use xlink:href="#glyph2-3" x="45.096" y="183.4322"/>+ <use xlink:href="#glyph2-2" x="55.896" y="183.4322"/>+ <use xlink:href="#glyph2-4" x="66.696" y="183.4322"/>+</g>+</g>+</svg>
+ doc/www/files/tutorial/figures/layout.png view
binary file changed (absent → 76329 bytes)
+ doc/www/files/tutorial/figures/mapSY.svg view
@@ -0,0 +1,1997 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="360"+ height="66"+ viewBox="0 0 362.835 272.126"+ version="1.0"+ id="svg2"+ sodipodi:version="0.32"+ inkscape:version="0.46"+ sodipodi:docname="mapSY.svg"+ inkscape:output_extension="org.inkscape.output.svg.inkscape">+ <metadata+ id="metadata2463">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <sodipodi:namedview+ inkscape:window-height="1054"+ inkscape:window-width="1901"+ inkscape:pageshadow="2"+ inkscape:pageopacity="0.0"+ guidetolerance="10.0"+ gridtolerance="10.0"+ objecttolerance="10.0"+ borderopacity="1.0"+ bordercolor="#666666"+ pagecolor="#ffffff"+ id="base"+ showgrid="false"+ inkscape:zoom="1.4142136"+ inkscape:cx="17.054894"+ inkscape:cy="65.938389"+ inkscape:window-x="138"+ inkscape:window-y="40"+ inkscape:current-layer="svg2" />+ <defs+ id="defs4">+ <inkscape:perspective+ sodipodi:type="inkscape:persp3d"+ inkscape:vp_x="0 : 170.07875 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_z="453.54373 : 170.07875 : 1"+ inkscape:persp3d-origin="226.77187 : 113.38583 : 1"+ id="perspective2465" />+ <g+ id="g6">+ <symbol+ overflow="visible"+ id="glyph4-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path9" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.171875,-6.265625 L 0.84375,0 L 1.859375,0 L 2.6875,-3.9375 C 2.875,-4.84375 3.6875,-5.578125 4.5,-5.578125 C 5.078125,-5.578125 5.46875,-5.25 5.46875,-4.75 C 5.46875,-4.625 5.46875,-4.46875 5.421875,-4.3125 L 4.5,0 L 5.515625,0 L 6.34375,-3.9375 C 6.53125,-4.859375 7.359375,-5.578125 8.21875,-5.578125 C 8.78125,-5.578125 9.125,-5.234375 9.125,-4.65625 C 9.125,-4.484375 9.125,-4.484375 9.03125,-4.078125 L 8.15625,0 L 9.171875,0 L 10.109375,-4.453125 C 10.140625,-4.59375 10.1875,-4.984375 10.1875,-5.109375 C 10.1875,-5.421875 10.046875,-5.765625 9.796875,-6.03125 C 9.53125,-6.328125 9.21875,-6.4375 8.671875,-6.4375 C 7.890625,-6.4375 7.203125,-6.125 6.5,-5.453125 C 6.3125,-6.125 5.84375,-6.4375 5.0625,-6.4375 C 4.25,-6.4375 3.6875,-6.203125 2.921875,-5.484375 L 3.078125,-6.265625 L 2.171875,-6.265625 z"+ id="path12" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.59375,-0.609375 C 6.484375,-0.578125 6.4375,-0.578125 6.390625,-0.578125 C 6.078125,-0.578125 5.9375,-0.6875 5.9375,-0.9375 C 5.9375,-0.984375 5.9375,-1.015625 5.953125,-1.046875 L 6.71875,-4.65625 C 6.796875,-4.96875 6.796875,-4.96875 6.796875,-5.09375 C 6.796875,-5.90625 5.96875,-6.4375 4.703125,-6.4375 C 3.046875,-6.4375 2.03125,-5.734375 1.8125,-4.40625 L 2.8125,-4.40625 C 2.921875,-4.75 3,-4.90625 3.171875,-5.078125 C 3.4375,-5.34375 3.9375,-5.515625 4.453125,-5.515625 C 5.15625,-5.515625 5.71875,-5.203125 5.71875,-4.75 C 5.71875,-4.703125 5.703125,-4.625 5.6875,-4.53125 L 5.65625,-4.3125 C 5.546875,-3.828125 5.3125,-3.6875 4.453125,-3.609375 C 2.84375,-3.46875 2.34375,-3.34375 1.75,-2.96875 C 1.140625,-2.578125 0.78125,-1.953125 0.78125,-1.25 C 0.78125,-0.296875 1.421875,0.28125 2.5,0.28125 C 2.921875,0.28125 3.421875,0.1875 3.84375,0.03125 C 4.234375,-0.09375 4.40625,-0.21875 4.90625,-0.640625 L 4.90625,-0.5625 L 4.90625,-0.515625 C 4.90625,-0.03125 5.234375,0.28125 5.8125,0.28125 C 5.9375,0.28125 5.96875,0.28125 6.28125,0.203125 C 6.296875,0.1875 6.375,0.171875 6.4375,0.171875 L 6.59375,-0.609375 z M 5.15625,-1.953125 C 5,-1.21875 3.9375,-0.578125 2.890625,-0.578125 C 2.21875,-0.578125 1.828125,-0.875 1.828125,-1.375 C 1.828125,-1.765625 2.0625,-2.15625 2.421875,-2.375 C 2.703125,-2.5625 3.0625,-2.65625 3.640625,-2.734375 C 4.765625,-2.890625 4.859375,-2.90625 5.390625,-3.078125 L 5.15625,-1.953125 z"+ id="path15" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.078125,2.546875 L 1.09375,2.546875 L 1.8125,-0.8125 C 2.171875,-0.03125 2.671875,0.28125 3.515625,0.28125 C 4.453125,0.28125 5.34375,-0.15625 5.953125,-0.90625 C 6.59375,-1.703125 7,-2.9375 7,-4.109375 C 7,-5.546875 6.203125,-6.4375 4.921875,-6.4375 C 4.40625,-6.4375 3.875,-6.28125 3.390625,-5.96875 C 3.015625,-5.734375 2.875,-5.578125 2.71875,-5.265625 L 2.921875,-6.265625 L 1.953125,-6.265625 L 0.078125,2.546875 z M 4.53125,-5.515625 C 5.421875,-5.515625 5.953125,-4.90625 5.953125,-3.875 C 5.953125,-3.234375 5.75,-2.453125 5.421875,-1.859375 C 4.984375,-1.046875 4.390625,-0.640625 3.609375,-0.640625 C 2.734375,-0.640625 2.1875,-1.25 2.1875,-2.203125 C 2.1875,-2.921875 2.390625,-3.6875 2.75,-4.3125 C 3.1875,-5.109375 3.796875,-5.515625 4.53125,-5.515625 z"+ id="path18" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 8.4375,-6.15625 C 8.515625,-6.484375 8.53125,-6.640625 8.53125,-6.828125 C 8.53125,-7.34375 8.28125,-7.890625 7.890625,-8.234375 C 7.40625,-8.671875 6.765625,-8.859375 5.828125,-8.859375 C 4.609375,-8.859375 3.640625,-8.515625 2.984375,-7.84375 C 2.5,-7.34375 2.125,-6.484375 2.125,-5.875 C 2.125,-5.125 2.65625,-4.5 3.453125,-4.265625 L 5.5,-3.6875 C 6.453125,-3.421875 6.84375,-3.078125 6.84375,-2.5 C 6.84375,-2.125 6.625,-1.671875 6.28125,-1.359375 C 5.796875,-0.921875 5.09375,-0.6875 4.140625,-0.6875 C 2.78125,-0.6875 2.15625,-1.1875 2.15625,-2.28125 C 2.15625,-2.4375 2.171875,-2.546875 2.21875,-2.765625 L 1.171875,-2.765625 C 1.09375,-2.46875 1.0625,-2.265625 1.0625,-2.015625 C 1.0625,-0.578125 2.140625,0.28125 3.9375,0.28125 C 5.203125,0.28125 6.25,-0.078125 6.953125,-0.734375 C 7.5625,-1.296875 8,-2.15625 8,-2.828125 C 8,-3.140625 7.890625,-3.484375 7.703125,-3.765625 C 7.453125,-4.1875 7.09375,-4.421875 6.53125,-4.578125 L 4.484375,-5.15625 C 3.5625,-5.421875 3.28125,-5.671875 3.28125,-6.1875 C 3.28125,-6.609375 3.453125,-6.984375 3.796875,-7.296875 C 4.25,-7.703125 4.828125,-7.890625 5.625,-7.890625 C 6.28125,-7.890625 6.796875,-7.75 7.046875,-7.515625 C 7.28125,-7.3125 7.4375,-6.9375 7.4375,-6.59375 C 7.4375,-6.484375 7.421875,-6.390625 7.390625,-6.15625 L 8.4375,-6.15625 z"+ id="path21" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.359375,-3.421875 L 9.75,-8.71875 L 8.421875,-8.71875 L 4.96875,-4.453125 L 3.34375,-8.71875 L 2.015625,-8.71875 L 4.234375,-3.421875 L 3.5,0 L 4.625,0 L 5.359375,-3.421875 z"+ id="path24" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.421875,-6.265625 L 3.390625,-6.265625 L 3.578125,-7.09375 C 3.703125,-7.6875 3.921875,-7.890625 4.4375,-7.890625 C 4.515625,-7.890625 4.59375,-7.890625 4.75,-7.859375 L 4.9375,-8.6875 C 4.71875,-8.734375 4.59375,-8.75 4.40625,-8.75 C 3.484375,-8.75 2.8125,-8.21875 2.625,-7.328125 L 2.390625,-6.265625 L 1.546875,-6.265625 L 1.390625,-5.46875 L 2.21875,-5.46875 L 1.0625,0 L 2.0625,0 L 3.234375,-5.46875 L 4.25,-5.46875 L 4.421875,-6.265625 z"+ id="path27" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.125,-6.265625 L 2.109375,-6.265625 L 0.78125,0 L 1.796875,0 L 3.125,-6.265625 z M 3.640625,-8.71875 L 2.640625,-8.71875 L 2.375,-7.484375 L 3.375,-7.484375 L 3.640625,-8.71875 z"+ id="path30" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.59375,-6.4375 C 3.484375,-6.4375 2.5,-5.9375 1.890625,-5.0625 C 1.34375,-4.296875 0.953125,-2.96875 0.953125,-1.953125 C 0.953125,-0.640625 1.875,0.28125 3.21875,0.28125 C 4.359375,0.28125 5.265625,-0.1875 5.9375,-1.109375 C 6.484375,-1.859375 6.890625,-3.171875 6.890625,-4.203125 C 6.890625,-4.84375 6.640625,-5.453125 6.234375,-5.859375 C 5.828125,-6.25 5.28125,-6.4375 4.59375,-6.4375 z M 4.4375,-5.515625 C 5.3125,-5.515625 5.828125,-4.953125 5.828125,-3.984375 C 5.828125,-3.28125 5.625,-2.5 5.3125,-1.90625 C 4.859375,-1.078125 4.203125,-0.640625 3.375,-0.640625 C 2.53125,-0.640625 2.015625,-1.25 2.015625,-2.203125 C 2.015625,-2.875 2.21875,-3.671875 2.53125,-4.265625 C 2.96875,-5.078125 3.640625,-5.515625 4.4375,-5.515625 z"+ id="path33" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.765625,-8.71875 L 6.765625,-8.71875 L 6.046875,-5.359375 C 5.671875,-6.125 5.1875,-6.4375 4.34375,-6.4375 C 2.359375,-6.4375 0.875,-4.546875 0.875,-2.03125 C 0.875,-0.640625 1.671875,0.28125 2.921875,0.28125 C 3.4375,0.28125 3.984375,0.109375 4.453125,-0.171875 C 4.8125,-0.390625 4.96875,-0.578125 5.140625,-0.90625 L 4.953125,0 L 5.921875,0 L 7.765625,-8.71875 z M 4.25,-5.515625 C 5.125,-5.515625 5.65625,-4.921875 5.65625,-3.90625 C 5.65625,-3.203125 5.46875,-2.46875 5.109375,-1.859375 C 4.640625,-1.046875 4.046875,-0.640625 3.328125,-0.640625 C 2.4375,-0.640625 1.921875,-1.25 1.921875,-2.265625 C 1.921875,-2.9375 2.125,-3.703125 2.453125,-4.3125 C 2.90625,-5.140625 3.484375,-5.515625 4.25,-5.515625 z"+ id="path36" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.734375,-2.796875 L 6.765625,-3 C 6.875,-3.578125 6.9375,-4.078125 6.9375,-4.40625 C 6.9375,-5.546875 5.9375,-6.4375 4.65625,-6.4375 C 3.609375,-6.4375 2.609375,-5.953125 2.015625,-5.15625 C 1.453125,-4.40625 1,-3.03125 1,-2.0625 C 1,-1.421875 1.28125,-0.765625 1.75,-0.328125 C 2.15625,0.078125 2.6875,0.28125 3.375,0.28125 C 4.8125,0.28125 6.03125,-0.609375 6.40625,-1.90625 L 5.40625,-1.90625 C 4.96875,-1.078125 4.34375,-0.640625 3.53125,-0.640625 C 2.59375,-0.640625 2.0625,-1.234375 2.0625,-2.25 C 2.0625,-2.5 2.0625,-2.625 2.109375,-2.796875 L 6.734375,-2.796875 z M 2.328125,-3.65625 C 2.640625,-4.75 3.53125,-5.515625 4.5,-5.515625 C 5.34375,-5.515625 5.875,-4.953125 5.875,-4.046875 C 5.875,-3.9375 5.875,-3.84375 5.84375,-3.65625 L 2.328125,-3.65625 z"+ id="path39" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.671875,-8.71875 L 2.671875,-8.71875 L 0.8125,0 L 1.8125,0 L 3.671875,-8.71875 z"+ id="path42" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.984375,-6.265625 L 3.203125,-1.40625 L 2.65625,-6.265625 L 1.578125,-6.265625 L 2.390625,0.046875 L 1.765625,1.015625 C 1.453125,1.515625 1.25,1.640625 0.8125,1.640625 C 0.6875,1.640625 0.609375,1.625 0.28125,1.59375 L 0.09375,2.484375 C 0.3125,2.578125 0.453125,2.609375 0.6875,2.609375 C 1.53125,2.609375 2.140625,2.203125 2.65625,1.3125 L 7.046875,-6.265625 L 5.984375,-6.265625 z"+ id="path45" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.140625,-4.515625 C 6.203125,-4.765625 6.21875,-4.875 6.21875,-5.03125 C 6.21875,-5.875 5.421875,-6.4375 4.25,-6.4375 C 3.40625,-6.4375 2.671875,-6.1875 2.1875,-5.71875 C 1.75,-5.3125 1.46875,-4.6875 1.46875,-4.125 C 1.46875,-3.390625 1.890625,-3.046875 3.125,-2.71875 L 4,-2.5 C 4.40625,-2.390625 4.578125,-2.3125 4.6875,-2.1875 C 4.765625,-2.078125 4.84375,-1.90625 4.84375,-1.796875 C 4.84375,-1.578125 4.65625,-1.203125 4.453125,-1.046875 C 4.15625,-0.796875 3.640625,-0.640625 3.125,-0.640625 C 2.3125,-0.640625 1.84375,-0.96875 1.84375,-1.5625 C 1.84375,-1.640625 1.859375,-1.75 1.859375,-1.859375 L 0.796875,-1.859375 C 0.734375,-1.59375 0.734375,-1.453125 0.734375,-1.25 C 0.734375,-0.296875 1.5625,0.28125 2.953125,0.28125 C 4.734375,0.28125 5.890625,-0.640625 5.890625,-2.0625 C 5.890625,-2.796875 5.5,-3.171875 4.453125,-3.4375 L 3.53125,-3.671875 C 2.875,-3.84375 2.515625,-4.078125 2.515625,-4.390625 C 2.515625,-4.625 2.671875,-4.921875 2.875,-5.125 C 3.171875,-5.40625 3.53125,-5.515625 4.046875,-5.515625 C 4.75,-5.515625 5.15625,-5.25 5.15625,-4.78125 C 5.15625,-4.703125 5.15625,-4.609375 5.140625,-4.515625 L 6.140625,-4.515625 z"+ id="path48" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path51" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.21875,-0.015625 C 2.21875,-0.734375 1.9375,-1.15625 1.515625,-1.15625 C 1.15625,-1.15625 0.9375,-0.890625 0.9375,-0.578125 C 0.9375,-0.28125 1.15625,0 1.515625,0 C 1.640625,0 1.78125,-0.046875 1.890625,-0.140625 C 1.9375,-0.15625 1.9375,-0.171875 1.953125,-0.171875 C 1.96875,-0.171875 1.96875,-0.15625 1.96875,-0.015625 C 1.96875,0.796875 1.59375,1.453125 1.234375,1.8125 C 1.109375,1.9375 1.109375,1.953125 1.109375,1.984375 C 1.109375,2.0625 1.171875,2.109375 1.21875,2.109375 C 1.34375,2.109375 2.21875,1.265625 2.21875,-0.015625 z"+ id="path54" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.09375,-0.578125 C 2.09375,-0.890625 1.828125,-1.15625 1.515625,-1.15625 C 1.203125,-1.15625 0.9375,-0.890625 0.9375,-0.578125 C 0.9375,-0.265625 1.203125,0 1.515625,0 C 1.828125,0 2.09375,-0.265625 2.09375,-0.578125 z"+ id="path57" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path60" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.90625,-2.75 C 8.0625,-2.75 8.296875,-2.75 8.296875,-2.984375 C 8.296875,-3.234375 8.0625,-3.234375 7.90625,-3.234375 L 1.390625,-3.234375 C 1.21875,-3.234375 0.984375,-3.234375 0.984375,-2.984375 C 0.984375,-2.75 1.21875,-2.75 1.390625,-2.75 L 7.90625,-2.75 z"+ id="path63" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 10.25,-2.75 C 9.359375,-2.09375 8.96875,-1.09375 8.96875,-1 C 8.96875,-0.890625 9.0625,-0.859375 9.140625,-0.859375 C 9.28125,-0.859375 9.3125,-0.9375 9.328125,-0.984375 C 9.515625,-1.390625 9.890625,-2.265625 11.09375,-2.828125 C 11.234375,-2.890625 11.265625,-2.90625 11.265625,-2.984375 C 11.265625,-3.078125 11.1875,-3.109375 11.171875,-3.109375 C 10.53125,-3.40625 9.84375,-3.84375 9.34375,-4.953125 C 9.296875,-5.0625 9.28125,-5.109375 9.140625,-5.109375 C 9.0625,-5.109375 8.96875,-5.078125 8.96875,-4.96875 C 8.96875,-4.875 9.359375,-3.890625 10.25,-3.234375 L 1.0625,-3.234375 C 0.890625,-3.234375 0.671875,-3.234375 0.671875,-2.984375 C 0.671875,-2.75 0.890625,-2.75 1.0625,-2.75 L 10.25,-2.75 z"+ id="path66" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path69" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.59375,2.375 L 1.5,2.375 L 1.5,-0.59375 C 1.984375,-0.015625 2.515625,0.25 3.265625,0.25 C 4.734375,0.25 5.703125,-0.9375 5.703125,-2.765625 C 5.703125,-4.671875 4.765625,-5.875 3.25,-5.875 C 2.46875,-5.875 1.859375,-5.53125 1.421875,-4.859375 L 1.421875,-5.71875 L 0.59375,-5.71875 L 0.59375,2.375 z M 3.09375,-5.03125 C 4.09375,-5.03125 4.75,-4.140625 4.75,-2.78125 C 4.75,-1.484375 4.09375,-0.59375 3.09375,-0.59375 C 2.140625,-0.59375 1.5,-1.46875 1.5,-2.8125 C 1.5,-4.15625 2.140625,-5.03125 3.09375,-5.03125 z"+ id="path72" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.75,-5.71875 L 0.75,0 L 1.671875,0 L 1.671875,-2.96875 C 1.671875,-3.78125 1.875,-4.3125 2.3125,-4.640625 C 2.59375,-4.84375 2.875,-4.90625 3.5,-4.921875 L 3.5,-5.84375 C 3.34375,-5.875 3.265625,-5.875 3.15625,-5.875 C 2.5625,-5.875 2.109375,-5.53125 1.59375,-4.671875 L 1.59375,-5.71875 L 0.75,-5.71875 z"+ id="path75" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-5.71875 L 0.734375,-5.71875 L 0.734375,0 L 1.640625,0 L 1.640625,-5.71875 z M 1.640625,-7.953125 L 0.71875,-7.953125 L 0.71875,-6.8125 L 1.640625,-6.8125 L 1.640625,-7.953125 z"+ id="path78" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.765625,-5.71875 L 0.765625,0 L 1.671875,0 L 1.671875,-3.59375 C 1.671875,-4.421875 2.28125,-5.078125 3.015625,-5.078125 C 3.703125,-5.078125 4.078125,-4.671875 4.078125,-3.9375 L 4.078125,0 L 5,0 L 5,-3.59375 C 5,-4.421875 5.59375,-5.078125 6.34375,-5.078125 C 7,-5.078125 7.390625,-4.65625 7.390625,-3.9375 L 7.390625,0 L 8.3125,0 L 8.3125,-4.28125 C 8.3125,-5.3125 7.71875,-5.875 6.65625,-5.875 C 5.890625,-5.875 5.4375,-5.65625 4.890625,-5 C 4.5625,-5.609375 4.09375,-5.875 3.359375,-5.875 C 2.59375,-5.875 2.09375,-5.59375 1.609375,-4.90625 L 1.609375,-5.71875 L 0.765625,-5.71875 z"+ id="path81" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.765625,-5.71875 L 1.828125,-5.71875 L 1.828125,-7.28125 L 0.921875,-7.28125 L 0.921875,-5.71875 L 0.15625,-5.71875 L 0.15625,-4.96875 L 0.921875,-4.96875 L 0.921875,-0.65625 C 0.921875,-0.078125 1.3125,0.25 2.03125,0.25 C 2.25,0.25 2.46875,0.234375 2.765625,0.171875 L 2.765625,-0.59375 C 2.65625,-0.5625 2.515625,-0.546875 2.328125,-0.546875 C 1.9375,-0.546875 1.828125,-0.65625 1.828125,-1.0625 L 1.828125,-4.96875 L 2.765625,-4.96875 L 2.765625,-5.71875 z"+ id="path84" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.109375,0 L 5.296875,-5.71875 L 4.28125,-5.71875 L 2.65625,-1.078125 L 1.140625,-5.71875 L 0.109375,-5.71875 L 2.109375,0 L 3.109375,0 z"+ id="path87" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.59375,-2.546875 C 5.59375,-3.421875 5.53125,-3.953125 5.359375,-4.375 C 5,-5.3125 4.125,-5.875 3.046875,-5.875 C 1.46875,-5.875 0.4375,-4.65625 0.4375,-2.78125 C 0.4375,-0.90625 1.421875,0.25 3.03125,0.25 C 4.34375,0.25 5.25,-0.484375 5.46875,-1.734375 L 4.5625,-1.734375 C 4.3125,-0.984375 3.796875,-0.59375 3.0625,-0.59375 C 2.484375,-0.59375 2,-0.84375 1.6875,-1.328125 C 1.46875,-1.65625 1.390625,-1.984375 1.390625,-2.546875 L 5.59375,-2.546875 z M 1.40625,-3.296875 C 1.484375,-4.359375 2.125,-5.03125 3.046875,-5.03125 C 3.9375,-5.03125 4.625,-4.296875 4.625,-3.359375 C 4.625,-3.34375 4.625,-3.3125 4.609375,-3.296875 L 1.40625,-3.296875 z"+ id="path90" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.96875,-5.875 C 1.359375,-5.875 0.390625,-4.734375 0.390625,-2.8125 C 0.390625,-0.890625 1.359375,0.25 2.984375,0.25 C 4.578125,0.25 5.5625,-0.890625 5.5625,-2.765625 C 5.5625,-4.75 4.609375,-5.875 2.96875,-5.875 z M 2.984375,-5.03125 C 4,-5.03125 4.609375,-4.203125 4.609375,-2.78125 C 4.609375,-1.4375 3.984375,-0.59375 2.984375,-0.59375 C 1.96875,-0.59375 1.34375,-1.421875 1.34375,-2.8125 C 1.34375,-4.1875 1.96875,-5.03125 2.984375,-5.03125 z"+ id="path93" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.140625,-3.796875 C 5.09375,-4.359375 4.96875,-4.71875 4.75,-5.03125 C 4.359375,-5.5625 3.671875,-5.875 2.875,-5.875 C 1.34375,-5.875 0.34375,-4.65625 0.34375,-2.765625 C 0.34375,-0.921875 1.3125,0.25 2.875,0.25 C 4.234375,0.25 5.09375,-0.5625 5.203125,-1.96875 L 4.28125,-1.96875 C 4.140625,-1.046875 3.671875,-0.59375 2.890625,-0.59375 C 1.890625,-0.59375 1.28125,-1.40625 1.28125,-2.765625 C 1.28125,-4.1875 1.875,-5.03125 2.875,-5.03125 C 3.625,-5.03125 4.109375,-4.59375 4.21875,-3.796875 L 5.140625,-3.796875 z"+ id="path96" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.78125,-4.125 C 4.765625,-5.25 4.03125,-5.875 2.703125,-5.875 C 1.375,-5.875 0.515625,-5.1875 0.515625,-4.140625 C 0.515625,-3.234375 0.96875,-2.8125 2.328125,-2.484375 L 3.171875,-2.28125 C 3.8125,-2.125 4.0625,-1.890625 4.0625,-1.484375 C 4.0625,-0.953125 3.515625,-0.59375 2.71875,-0.59375 C 2.234375,-0.59375 1.828125,-0.734375 1.59375,-0.96875 C 1.453125,-1.140625 1.390625,-1.296875 1.328125,-1.703125 L 0.375,-1.703125 C 0.421875,-0.375 1.15625,0.25 2.65625,0.25 C 4.09375,0.25 5,-0.453125 5,-1.5625 C 5,-2.40625 4.53125,-2.875 3.390625,-3.15625 L 2.515625,-3.359375 C 1.78125,-3.53125 1.46875,-3.78125 1.46875,-4.171875 C 1.46875,-4.703125 1.9375,-5.03125 2.671875,-5.03125 C 3.40625,-5.03125 3.796875,-4.71875 3.8125,-4.125 L 4.78125,-4.125 z"+ id="path99" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.09375,-3.40625 L 0.5,-3.40625 L 0.5,-2.625 L 3.09375,-2.625 L 3.09375,-3.40625 z"+ id="path102" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.765625,-5.71875 L 0.765625,0 L 1.671875,0 L 1.671875,-3.15625 C 1.671875,-4.3125 2.296875,-5.078125 3.234375,-5.078125 C 3.953125,-5.078125 4.40625,-4.640625 4.40625,-3.953125 L 4.40625,0 L 5.3125,0 L 5.3125,-4.3125 C 5.3125,-5.265625 4.609375,-5.875 3.5,-5.875 C 2.65625,-5.875 2.109375,-5.546875 1.609375,-4.75 L 1.609375,-5.71875 L 0.765625,-5.71875 z"+ id="path105" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.25,0 L 5.25,-5.71875 L 4.359375,-5.71875 L 4.359375,-2.46875 C 4.359375,-1.3125 3.734375,-0.546875 2.796875,-0.546875 C 2.078125,-0.546875 1.609375,-0.984375 1.609375,-1.671875 L 1.609375,-5.71875 L 0.703125,-5.71875 L 0.703125,-1.3125 C 0.703125,-0.359375 1.421875,0.25 2.53125,0.25 C 3.375,0.25 3.90625,-0.046875 4.4375,-0.796875 L 4.4375,0 L 5.25,0 z"+ id="path108" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path111" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.984375,-5.71875 L 0.78125,0 L 1.6875,0 L 2.453125,-3.59375 C 2.625,-4.421875 3.375,-5.09375 4.09375,-5.09375 C 4.640625,-5.09375 5,-4.78125 5,-4.34375 C 5,-4.21875 4.984375,-4.078125 4.953125,-3.9375 L 4.109375,0 L 5.03125,0 L 5.796875,-3.59375 C 5.96875,-4.4375 6.71875,-5.09375 7.5,-5.09375 C 8.015625,-5.09375 8.328125,-4.78125 8.328125,-4.25 C 8.328125,-4.09375 8.328125,-4.09375 8.234375,-3.71875 L 7.453125,0 L 8.359375,0 L 9.234375,-4.0625 C 9.265625,-4.1875 9.296875,-4.546875 9.296875,-4.671875 C 9.296875,-4.953125 9.15625,-5.25 8.9375,-5.5 C 8.703125,-5.765625 8.40625,-5.875 7.90625,-5.875 C 7.203125,-5.875 6.578125,-5.59375 5.9375,-4.96875 C 5.765625,-5.578125 5.328125,-5.875 4.609375,-5.875 C 3.875,-5.875 3.375,-5.65625 2.671875,-5 L 2.8125,-5.71875 L 1.984375,-5.71875 z"+ id="path114" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.015625,-0.5625 C 5.921875,-0.53125 5.875,-0.53125 5.828125,-0.53125 C 5.546875,-0.53125 5.421875,-0.625 5.421875,-0.84375 C 5.421875,-0.890625 5.421875,-0.921875 5.4375,-0.953125 L 6.125,-4.25 C 6.1875,-4.53125 6.1875,-4.53125 6.1875,-4.640625 C 6.1875,-5.390625 5.4375,-5.875 4.296875,-5.875 C 2.78125,-5.875 1.859375,-5.234375 1.640625,-4.03125 L 2.5625,-4.03125 C 2.65625,-4.328125 2.734375,-4.484375 2.890625,-4.640625 C 3.125,-4.875 3.59375,-5.03125 4.0625,-5.03125 C 4.71875,-5.03125 5.21875,-4.75 5.21875,-4.34375 C 5.21875,-4.296875 5.203125,-4.21875 5.1875,-4.140625 L 5.15625,-3.9375 C 5.0625,-3.484375 4.859375,-3.375 4.0625,-3.296875 C 2.59375,-3.15625 2.140625,-3.046875 1.609375,-2.71875 C 1.03125,-2.359375 0.703125,-1.78125 0.703125,-1.140625 C 0.703125,-0.265625 1.296875,0.25 2.28125,0.25 C 2.65625,0.25 3.125,0.171875 3.515625,0.03125 C 3.859375,-0.09375 4.03125,-0.203125 4.46875,-0.59375 L 4.46875,-0.515625 L 4.46875,-0.46875 C 4.46875,-0.015625 4.78125,0.25 5.296875,0.25 C 5.421875,0.25 5.453125,0.25 5.71875,0.1875 C 5.75,0.171875 5.8125,0.15625 5.875,0.15625 L 6.015625,-0.5625 z M 4.703125,-1.78125 C 4.5625,-1.109375 3.59375,-0.53125 2.640625,-0.53125 C 2.015625,-0.53125 1.671875,-0.796875 1.671875,-1.25 C 1.671875,-1.609375 1.875,-1.96875 2.203125,-2.171875 C 2.46875,-2.328125 2.796875,-2.421875 3.328125,-2.5 C 4.359375,-2.640625 4.4375,-2.65625 4.921875,-2.8125 L 4.703125,-1.78125 z"+ id="path117" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.078125,2.328125 L 1,2.328125 L 1.640625,-0.734375 C 1.984375,-0.03125 2.4375,0.25 3.203125,0.25 C 4.0625,0.25 4.875,-0.140625 5.4375,-0.828125 C 6.015625,-1.546875 6.390625,-2.6875 6.390625,-3.75 C 6.390625,-5.0625 5.65625,-5.875 4.5,-5.875 C 4.015625,-5.875 3.53125,-5.734375 3.09375,-5.453125 C 2.75,-5.234375 2.625,-5.09375 2.46875,-4.796875 L 2.671875,-5.71875 L 1.78125,-5.71875 L 0.078125,2.328125 z M 4.140625,-5.03125 C 4.953125,-5.03125 5.4375,-4.46875 5.4375,-3.53125 C 5.4375,-2.9375 5.25,-2.234375 4.953125,-1.6875 C 4.546875,-0.953125 4,-0.59375 3.296875,-0.59375 C 2.5,-0.59375 2,-1.140625 2,-2 C 2,-2.65625 2.1875,-3.375 2.515625,-3.9375 C 2.90625,-4.671875 3.453125,-5.03125 4.140625,-5.03125 z"+ id="path120" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.703125,-5.609375 C 7.765625,-5.921875 7.78125,-6.0625 7.78125,-6.234375 C 7.78125,-6.703125 7.5625,-7.203125 7.203125,-7.515625 C 6.75,-7.90625 6.171875,-8.078125 5.328125,-8.078125 C 4.203125,-8.078125 3.3125,-7.765625 2.71875,-7.15625 C 2.28125,-6.703125 1.9375,-5.921875 1.9375,-5.359375 C 1.9375,-4.671875 2.421875,-4.09375 3.15625,-3.890625 L 5.015625,-3.375 C 5.890625,-3.125 6.25,-2.796875 6.25,-2.28125 C 6.25,-1.9375 6.046875,-1.53125 5.734375,-1.25 C 5.296875,-0.84375 4.640625,-0.625 3.78125,-0.625 C 2.546875,-0.625 1.96875,-1.09375 1.96875,-2.078125 C 1.96875,-2.21875 1.984375,-2.328125 2.015625,-2.53125 L 1.0625,-2.53125 C 1,-2.25 0.96875,-2.078125 0.96875,-1.84375 C 0.96875,-0.53125 1.953125,0.25 3.59375,0.25 C 4.75,0.25 5.703125,-0.0625 6.34375,-0.671875 C 6.90625,-1.171875 7.296875,-1.96875 7.296875,-2.578125 C 7.296875,-2.875 7.203125,-3.171875 7.03125,-3.4375 C 6.796875,-3.8125 6.484375,-4.03125 5.96875,-4.171875 L 4.09375,-4.71875 C 3.25,-4.953125 2.984375,-5.171875 2.984375,-5.65625 C 2.984375,-6.03125 3.15625,-6.375 3.46875,-6.65625 C 3.875,-7.03125 4.40625,-7.203125 5.125,-7.203125 C 5.734375,-7.203125 6.1875,-7.078125 6.4375,-6.859375 C 6.640625,-6.671875 6.78125,-6.328125 6.78125,-6.015625 C 6.78125,-5.90625 6.765625,-5.828125 6.734375,-5.609375 L 7.703125,-5.609375 z"+ id="path123" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.890625,-3.125 L 8.90625,-7.953125 L 7.6875,-7.953125 L 4.53125,-4.0625 L 3.046875,-7.953125 L 1.828125,-7.953125 L 3.859375,-3.125 L 3.203125,0 L 4.21875,0 L 4.890625,-3.125 z"+ id="path126" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.03125,-5.71875 L 3.09375,-5.71875 L 3.265625,-6.46875 C 3.375,-7.015625 3.578125,-7.203125 4.046875,-7.203125 C 4.125,-7.203125 4.1875,-7.203125 4.34375,-7.171875 L 4.5,-7.921875 C 4.3125,-7.96875 4.1875,-7.984375 4.015625,-7.984375 C 3.171875,-7.984375 2.5625,-7.5 2.390625,-6.6875 L 2.1875,-5.71875 L 1.421875,-5.71875 L 1.265625,-4.984375 L 2.03125,-4.984375 L 0.96875,0 L 1.890625,0 L 2.9375,-4.984375 L 3.875,-4.984375 L 4.03125,-5.71875 z"+ id="path129" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.125,0 L 6.515625,-5.71875 L 5.53125,-5.71875 L 2.875,-1.109375 L 2.328125,-5.71875 L 1.328125,-5.71875 L 2.140625,0 L 3.125,0 z"+ id="path132" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.09375,-7.953125 L 6.171875,-7.953125 L 5.515625,-4.890625 C 5.171875,-5.59375 4.734375,-5.875 3.953125,-5.875 C 2.15625,-5.875 0.796875,-4.15625 0.796875,-1.859375 C 0.796875,-0.578125 1.53125,0.25 2.65625,0.25 C 3.125,0.25 3.625,0.09375 4.0625,-0.15625 C 4.390625,-0.359375 4.53125,-0.53125 4.6875,-0.828125 L 4.515625,0 L 5.40625,0 L 7.09375,-7.953125 z M 3.875,-5.03125 C 4.671875,-5.03125 5.15625,-4.5 5.15625,-3.5625 C 5.15625,-2.921875 4.984375,-2.25 4.65625,-1.6875 C 4.234375,-0.953125 3.703125,-0.59375 3.03125,-0.59375 C 2.21875,-0.59375 1.75,-1.140625 1.75,-2.078125 C 1.75,-2.6875 1.9375,-3.375 2.234375,-3.9375 C 2.65625,-4.6875 3.171875,-5.03125 3.875,-5.03125 z"+ id="path135" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.140625,-2.546875 L 6.171875,-2.734375 C 6.265625,-3.265625 6.328125,-3.71875 6.328125,-4.015625 C 6.328125,-5.0625 5.421875,-5.875 4.25,-5.875 C 3.296875,-5.875 2.375,-5.4375 1.828125,-4.703125 C 1.3125,-4.015625 0.921875,-2.765625 0.921875,-1.890625 C 0.921875,-1.296875 1.171875,-0.703125 1.59375,-0.296875 C 1.96875,0.078125 2.453125,0.25 3.078125,0.25 C 4.390625,0.25 5.5,-0.5625 5.84375,-1.734375 L 4.921875,-1.734375 C 4.53125,-0.984375 3.953125,-0.59375 3.234375,-0.59375 C 2.359375,-0.59375 1.875,-1.125 1.875,-2.046875 C 1.875,-2.28125 1.890625,-2.390625 1.9375,-2.546875 L 6.140625,-2.546875 z M 2.125,-3.34375 C 2.40625,-4.34375 3.21875,-5.03125 4.09375,-5.03125 C 4.875,-5.03125 5.359375,-4.515625 5.359375,-3.703125 C 5.359375,-3.59375 5.359375,-3.515625 5.328125,-3.34375 L 2.125,-3.34375 z"+ id="path138" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.34375,-7.953125 L 2.4375,-7.953125 L 0.734375,0 L 1.65625,0 L 3.34375,-7.953125 z"+ id="path141" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.46875,-5.71875 L 2.921875,-1.28125 L 2.421875,-5.71875 L 1.4375,-5.71875 L 2.1875,0.046875 L 1.609375,0.921875 C 1.3125,1.390625 1.140625,1.5 0.734375,1.5 C 0.625,1.5 0.5625,1.484375 0.265625,1.453125 L 0.09375,2.265625 C 0.28125,2.359375 0.421875,2.375 0.625,2.375 C 1.390625,2.375 1.953125,2 2.421875,1.203125 L 6.4375,-5.71875 L 5.46875,-5.71875 z"+ id="path144" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.609375,-4.125 C 5.65625,-4.359375 5.671875,-4.453125 5.671875,-4.59375 C 5.671875,-5.359375 4.9375,-5.875 3.875,-5.875 C 3.109375,-5.875 2.4375,-5.65625 2,-5.21875 C 1.609375,-4.84375 1.34375,-4.28125 1.34375,-3.765625 C 1.34375,-3.09375 1.71875,-2.78125 2.84375,-2.484375 L 3.65625,-2.28125 C 4.015625,-2.1875 4.171875,-2.109375 4.28125,-2 C 4.359375,-1.890625 4.421875,-1.734375 4.421875,-1.640625 C 4.421875,-1.4375 4.25,-1.09375 4.0625,-0.953125 C 3.796875,-0.734375 3.328125,-0.59375 2.859375,-0.59375 C 2.109375,-0.59375 1.671875,-0.890625 1.671875,-1.421875 C 1.671875,-1.5 1.6875,-1.59375 1.703125,-1.703125 L 0.734375,-1.703125 C 0.671875,-1.453125 0.671875,-1.3125 0.671875,-1.140625 C 0.671875,-0.265625 1.421875,0.25 2.6875,0.25 C 4.3125,0.25 5.375,-0.59375 5.375,-1.890625 C 5.375,-2.546875 5.015625,-2.90625 4.0625,-3.140625 L 3.234375,-3.34375 C 2.625,-3.5 2.296875,-3.71875 2.296875,-4 C 2.296875,-4.21875 2.4375,-4.5 2.625,-4.671875 C 2.890625,-4.921875 3.21875,-5.03125 3.703125,-5.03125 C 4.34375,-5.03125 4.703125,-4.78125 4.703125,-4.359375 C 4.703125,-4.28125 4.703125,-4.203125 4.6875,-4.125 L 5.609375,-4.125 z"+ id="path147" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path150" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.1875,-5.65625 C 1.671875,-5.65625 1.1875,-5.421875 0.890625,-5.03125 C 0.53125,-4.53125 0.34375,-3.78125 0.34375,-2.734375 C 0.34375,-0.828125 0.984375,0.1875 2.1875,0.1875 C 3.390625,0.1875 4.046875,-0.828125 4.046875,-2.6875 C 4.046875,-3.78125 3.859375,-4.515625 3.484375,-5.03125 C 3.203125,-5.421875 2.71875,-5.65625 2.1875,-5.65625 z M 2.1875,-5.03125 C 2.953125,-5.03125 3.328125,-4.265625 3.328125,-2.75 C 3.328125,-1.140625 2.953125,-0.390625 2.171875,-0.390625 C 1.4375,-0.390625 1.0625,-1.171875 1.0625,-2.71875 C 1.0625,-4.265625 1.4375,-5.03125 2.1875,-5.03125 z"+ id="path153" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.0625,-4.03125 L 2.0625,0 L 2.765625,0 L 2.765625,-5.65625 L 2.296875,-5.65625 C 2.0625,-4.78125 1.890625,-4.65625 0.8125,-4.53125 L 0.8125,-4.03125 L 2.0625,-4.03125 z"+ id="path156" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.03125,-0.6875 L 1.0625,-0.6875 C 1.125,-1.15625 1.390625,-1.453125 2.078125,-1.859375 L 2.875,-2.28125 C 3.671875,-2.71875 4.078125,-3.296875 4.078125,-4 C 4.078125,-4.46875 3.875,-4.90625 3.546875,-5.203125 C 3.21875,-5.5 2.796875,-5.65625 2.265625,-5.65625 C 1.546875,-5.65625 1.015625,-5.390625 0.703125,-4.921875 C 0.5,-4.609375 0.421875,-4.265625 0.390625,-3.6875 L 1.09375,-3.6875 C 1.125,-4.078125 1.171875,-4.296875 1.265625,-4.484375 C 1.453125,-4.828125 1.8125,-5.03125 2.234375,-5.03125 C 2.875,-5.03125 3.359375,-4.578125 3.359375,-3.96875 C 3.359375,-3.53125 3.09375,-3.140625 2.59375,-2.859375 L 1.859375,-2.453125 C 0.671875,-1.78125 0.328125,-1.25 0.265625,0 L 4.03125,0 L 4.03125,-0.6875 z"+ id="path159" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path162" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.359375,-5.8125 L 1.703125,-5.8125 L 0.46875,0 L 1.125,0 L 1.46875,-1.625 L 2.328125,-2.3125 L 3.234375,0 L 4,0 L 2.890625,-2.734375 L 4.65625,-4.171875 L 3.796875,-4.171875 L 1.65625,-2.4375 L 2.359375,-5.8125 z"+ id="path165" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path168" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.890625,0 L 2.890625,-3.140625 L 2.390625,-3.140625 L 2.390625,-1.359375 C 2.390625,-0.71875 2.046875,-0.296875 1.53125,-0.296875 C 1.140625,-0.296875 0.890625,-0.53125 0.890625,-0.921875 L 0.890625,-3.140625 L 0.390625,-3.140625 L 0.390625,-0.71875 C 0.390625,-0.203125 0.78125,0.140625 1.390625,0.140625 C 1.84375,0.140625 2.140625,-0.03125 2.4375,-0.4375 L 2.4375,0 L 2.890625,0 z"+ id="path171" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-3.140625 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 2.171875,-2.78125 2.421875,-2.546875 2.421875,-2.171875 L 2.421875,0 L 2.921875,0 L 2.921875,-2.375 C 2.921875,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.453125,-3.21875 1.15625,-3.046875 0.875,-2.609375 L 0.875,-3.140625 L 0.421875,-3.140625 z"+ id="path174" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.890625,-3.140625 L 0.40625,-3.140625 L 0.40625,0 L 0.890625,0 L 0.890625,-3.140625 z M 0.890625,-4.359375 L 0.390625,-4.359375 L 0.390625,-3.734375 L 0.890625,-3.734375 L 0.890625,-4.359375 z"+ id="path177" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,0 L 2.90625,-3.140625 L 2.34375,-3.140625 L 1.453125,-0.59375 L 0.625,-3.140625 L 0.0625,-3.140625 L 1.15625,0 L 1.703125,0 z"+ id="path180" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.0625,-1.40625 C 3.0625,-1.875 3.03125,-2.171875 2.9375,-2.40625 C 2.734375,-2.921875 2.265625,-3.21875 1.671875,-3.21875 C 0.796875,-3.21875 0.234375,-2.5625 0.234375,-1.53125 C 0.234375,-0.5 0.78125,0.140625 1.65625,0.140625 C 2.375,0.140625 2.875,-0.265625 3,-0.953125 L 2.5,-0.953125 C 2.359375,-0.53125 2.078125,-0.328125 1.6875,-0.328125 C 1.359375,-0.328125 1.09375,-0.46875 0.921875,-0.734375 C 0.8125,-0.90625 0.765625,-1.09375 0.765625,-1.40625 L 3.0625,-1.40625 z M 0.765625,-1.8125 C 0.8125,-2.390625 1.171875,-2.765625 1.671875,-2.765625 C 2.15625,-2.765625 2.53125,-2.359375 2.53125,-1.84375 C 2.53125,-1.828125 2.53125,-1.8125 2.53125,-1.8125 L 0.765625,-1.8125 z"+ id="path183" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.40625,-3.140625 L 0.40625,0 L 0.921875,0 L 0.921875,-1.625 C 0.921875,-2.078125 1.03125,-2.375 1.265625,-2.546875 C 1.421875,-2.65625 1.578125,-2.6875 1.921875,-2.703125 L 1.921875,-3.203125 C 1.84375,-3.21875 1.796875,-3.21875 1.734375,-3.21875 C 1.40625,-3.21875 1.15625,-3.03125 0.875,-2.5625 L 0.875,-3.140625 L 0.40625,-3.140625 z"+ id="path186" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.625,-2.265625 C 2.609375,-2.875 2.203125,-3.21875 1.484375,-3.21875 C 0.75,-3.21875 0.28125,-2.84375 0.28125,-2.265625 C 0.28125,-1.78125 0.53125,-1.546875 1.28125,-1.359375 L 1.734375,-1.25 C 2.09375,-1.171875 2.21875,-1.046875 2.21875,-0.8125 C 2.21875,-0.515625 1.9375,-0.328125 1.5,-0.328125 C 1.234375,-0.328125 1,-0.40625 0.875,-0.53125 C 0.796875,-0.625 0.765625,-0.71875 0.734375,-0.9375 L 0.203125,-0.9375 C 0.234375,-0.203125 0.640625,0.140625 1.453125,0.140625 C 2.25,0.140625 2.75,-0.25 2.75,-0.859375 C 2.75,-1.328125 2.484375,-1.578125 1.859375,-1.734375 L 1.375,-1.84375 C 0.96875,-1.9375 0.796875,-2.078125 0.796875,-2.296875 C 0.796875,-2.578125 1.0625,-2.765625 1.46875,-2.765625 C 1.859375,-2.765625 2.078125,-2.59375 2.09375,-2.265625 L 2.625,-2.265625 z"+ id="path189" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.515625,-3.140625 L 1,-3.140625 L 1,-4 L 0.515625,-4 L 0.515625,-3.140625 L 0.078125,-3.140625 L 0.078125,-2.734375 L 0.515625,-2.734375 L 0.515625,-0.359375 C 0.515625,-0.046875 0.71875,0.140625 1.109375,0.140625 C 1.234375,0.140625 1.359375,0.125 1.515625,0.09375 L 1.515625,-0.328125 C 1.453125,-0.3125 1.375,-0.296875 1.28125,-0.296875 C 1.0625,-0.296875 1,-0.359375 1,-0.578125 L 1,-2.734375 L 1.515625,-2.734375 L 1.515625,-3.140625 z"+ id="path192" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.328125,-3.140625 L 1.453125,-0.6875 L 0.65625,-3.140625 L 0.125,-3.140625 L 1.171875,0.015625 L 0.984375,0.515625 C 0.90625,0.734375 0.796875,0.8125 0.59375,0.8125 C 0.515625,0.8125 0.4375,0.796875 0.328125,0.78125 L 0.328125,1.234375 C 0.421875,1.28125 0.53125,1.296875 0.65625,1.296875 C 0.8125,1.296875 1,1.25 1.125,1.15625 C 1.28125,1.046875 1.375,0.90625 1.46875,0.65625 L 2.859375,-3.140625 L 2.328125,-3.140625 z"+ id="path195" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,-1.859375 L 0.28125,-1.859375 L 0.28125,-1.4375 L 1.703125,-1.4375 L 1.703125,-1.859375 z"+ id="path198" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.90625,-4.359375 L 0.40625,-4.359375 L 0.40625,0 L 0.90625,0 L 0.90625,-4.359375 z"+ id="path201" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-3.21875 C 0.75,-3.21875 0.21875,-2.59375 0.21875,-1.546875 C 0.21875,-0.484375 0.734375,0.140625 1.640625,0.140625 C 2.515625,0.140625 3.046875,-0.484375 3.046875,-1.515625 C 3.046875,-2.609375 2.53125,-3.21875 1.625,-3.21875 z M 1.640625,-2.765625 C 2.203125,-2.765625 2.53125,-2.296875 2.53125,-1.53125 C 2.53125,-0.796875 2.1875,-0.328125 1.640625,-0.328125 C 1.078125,-0.328125 0.734375,-0.78125 0.734375,-1.546875 C 0.734375,-2.296875 1.078125,-2.765625 1.640625,-2.765625 z"+ id="path204" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-3.140625 L 2.46875,-2.6875 C 2.21875,-3.046875 1.90625,-3.21875 1.515625,-3.21875 C 0.71875,-3.21875 0.171875,-2.53125 0.171875,-1.515625 C 0.171875,-1 0.3125,-0.578125 0.5625,-0.28125 C 0.796875,-0.015625 1.140625,0.140625 1.46875,0.140625 C 1.859375,0.140625 2.140625,-0.03125 2.421875,-0.421875 L 2.421875,-0.265625 C 2.421875,0.15625 2.359375,0.421875 2.234375,0.59375 C 2.109375,0.78125 1.84375,0.890625 1.546875,0.890625 C 1.3125,0.890625 1.109375,0.828125 0.96875,0.71875 C 0.859375,0.625 0.8125,0.546875 0.78125,0.359375 L 0.28125,0.359375 C 0.328125,0.953125 0.796875,1.296875 1.53125,1.296875 C 2,1.296875 2.390625,1.15625 2.59375,0.90625 C 2.84375,0.609375 2.921875,0.21875 2.921875,-0.515625 L 2.921875,-3.140625 L 2.46875,-3.140625 z M 1.5625,-2.765625 C 2.09375,-2.765625 2.421875,-2.3125 2.421875,-1.53125 C 2.421875,-0.78125 2.09375,-0.328125 1.5625,-0.328125 C 1.015625,-0.328125 0.6875,-0.78125 0.6875,-1.546875 C 0.6875,-2.296875 1.03125,-2.765625 1.5625,-2.765625 z"+ id="path207" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.84375,-1.3125 L 3.28125,0 L 3.90625,0 L 2.375,-4.359375 L 1.65625,-4.359375 L 0.109375,0 L 0.6875,0 L 1.15625,-1.3125 L 2.84375,-1.3125 z M 2.6875,-1.78125 L 1.296875,-1.78125 L 2.015625,-3.765625 L 2.6875,-1.78125 z"+ id="path210" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.140625,-0.625 L 0.515625,-0.625 L 0.515625,0 L 1.140625,0 L 1.140625,-0.625 z"+ id="path213" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.8125,-2.078125 C 2.796875,-2.390625 2.734375,-2.578125 2.609375,-2.765625 C 2.390625,-3.046875 2.015625,-3.21875 1.578125,-3.21875 C 0.734375,-3.21875 0.1875,-2.5625 0.1875,-1.515625 C 0.1875,-0.5 0.71875,0.140625 1.578125,0.140625 C 2.328125,0.140625 2.796875,-0.3125 2.859375,-1.078125 L 2.359375,-1.078125 C 2.265625,-0.578125 2.015625,-0.328125 1.578125,-0.328125 C 1.03125,-0.328125 0.703125,-0.765625 0.703125,-1.515625 C 0.703125,-2.296875 1.03125,-2.765625 1.578125,-2.765625 C 2,-2.765625 2.25,-2.515625 2.3125,-2.078125 L 2.8125,-2.078125 z"+ id="path216" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.203125,-0.296875 C 3.140625,-0.28125 3.125,-0.28125 3.09375,-0.28125 C 2.921875,-0.28125 2.828125,-0.375 2.828125,-0.53125 L 2.828125,-2.375 C 2.828125,-2.921875 2.421875,-3.21875 1.640625,-3.21875 C 1.1875,-3.21875 0.8125,-3.09375 0.609375,-2.859375 C 0.453125,-2.703125 0.40625,-2.515625 0.390625,-2.203125 L 0.890625,-2.203125 C 0.9375,-2.59375 1.15625,-2.765625 1.625,-2.765625 C 2.078125,-2.765625 2.328125,-2.59375 2.328125,-2.296875 L 2.328125,-2.171875 C 2.328125,-1.953125 2.203125,-1.859375 1.8125,-1.8125 C 1.09375,-1.734375 1,-1.703125 0.796875,-1.625 C 0.4375,-1.484375 0.25,-1.203125 0.25,-0.796875 C 0.25,-0.21875 0.640625,0.140625 1.28125,0.140625 C 1.671875,0.140625 2,0 2.34375,-0.328125 C 2.375,0 2.53125,0.140625 2.859375,0.140625 C 2.96875,0.140625 3.046875,0.125 3.203125,0.078125 L 3.203125,-0.296875 z M 2.328125,-0.984375 C 2.328125,-0.8125 2.28125,-0.71875 2.125,-0.578125 C 1.921875,-0.390625 1.6875,-0.296875 1.390625,-0.296875 C 1,-0.296875 0.765625,-0.484375 0.765625,-0.796875 C 0.765625,-1.125 1,-1.296875 1.53125,-1.375 C 2.046875,-1.453125 2.15625,-1.46875 2.328125,-1.546875 L 2.328125,-0.984375 z"+ id="path219" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.40625,-4.359375 C 0.8125,-3.578125 0.4375,-2.484375 0.4375,-1.546875 C 0.4375,-0.609375 0.8125,0.484375 1.40625,1.265625 L 1.734375,1.265625 C 1.21875,0.40625 0.921875,-0.59375 0.921875,-1.546875 C 0.921875,-2.5 1.21875,-3.515625 1.734375,-4.359375 L 1.40625,-4.359375 z"+ id="path222" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.03125,-1.53125 L 1.734375,-2.234375 L 3.28125,0 L 3.9375,0 L 2.140625,-2.578125 L 3.921875,-4.359375 L 3.203125,-4.359375 L 1.03125,-2.15625 L 1.03125,-4.359375 L 0.46875,-4.359375 L 0.46875,0 L 1.03125,0 L 1.03125,-1.53125 z"+ id="path225" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.125,-3.875 L 3.546875,-3.875 L 3.546875,-4.359375 L 0.125,-4.359375 L 0.125,-3.875 L 1.5625,-3.875 L 1.5625,0 L 2.125,0 L 2.125,-3.875 z"+ id="path228" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.296875,-1.984375 L 3.296875,0 L 3.859375,0 L 3.859375,-4.359375 L 3.296875,-4.359375 L 3.296875,-2.484375 L 1.046875,-2.484375 L 1.046875,-4.359375 L 0.5,-4.359375 L 0.5,0 L 1.0625,0 L 1.0625,-1.984375 L 3.296875,-1.984375 z"+ id="path231" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-22"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.5625,1.265625 C 1.15625,0.484375 1.53125,-0.609375 1.53125,-1.546875 C 1.53125,-2.484375 1.15625,-3.578125 0.5625,-4.359375 L 0.234375,-4.359375 C 0.75,-3.5 1.046875,-2.5 1.046875,-1.546875 C 1.046875,-0.59375 0.75,0.421875 0.234375,1.265625 L 0.5625,1.265625 z"+ id="path234" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-23"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,-1.984375 L 3.171875,-1.984375 L 3.171875,-2.484375 L 1.09375,-2.484375 L 1.09375,-3.875 L 3.46875,-3.875 L 3.46875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 L 1.09375,0 L 1.09375,-1.984375 z"+ id="path237" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-24"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.5625,-3.078125 C 3.5625,-3.9375 2.96875,-4.4375 1.96875,-4.4375 C 1.015625,-4.4375 0.421875,-3.9375 0.421875,-3.15625 C 0.421875,-2.625 0.703125,-2.28125 1.28125,-2.140625 L 2.359375,-1.84375 C 2.90625,-1.703125 3.15625,-1.484375 3.15625,-1.140625 C 3.15625,-0.90625 3.03125,-0.671875 2.84375,-0.53125 C 2.671875,-0.421875 2.40625,-0.359375 2.046875,-0.359375 C 1.578125,-0.359375 1.25,-0.46875 1.046875,-0.71875 C 0.875,-0.90625 0.8125,-1.125 0.8125,-1.390625 L 0.28125,-1.390625 C 0.296875,-0.984375 0.375,-0.71875 0.546875,-0.484375 C 0.84375,-0.078125 1.34375,0.140625 2.015625,0.140625 C 2.53125,0.140625 2.953125,0.015625 3.234375,-0.203125 C 3.53125,-0.4375 3.71875,-0.8125 3.71875,-1.203125 C 3.71875,-1.734375 3.375,-2.125 2.78125,-2.296875 L 1.6875,-2.578125 C 1.171875,-2.734375 0.96875,-2.890625 0.96875,-3.234375 C 0.96875,-3.671875 1.359375,-3.96875 1.953125,-3.96875 C 2.640625,-3.96875 3.03125,-3.65625 3.046875,-3.078125 L 3.5625,-3.078125 z"+ id="path240" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-25"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.53125,0 L 2.21875,0 C 3.3125,0 3.984375,-0.828125 3.984375,-2.1875 C 3.984375,-3.53125 3.328125,-4.359375 2.21875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 z M 1.09375,-0.484375 L 1.09375,-3.875 L 2.125,-3.875 C 2.984375,-3.875 3.4375,-3.296875 3.4375,-2.171875 C 3.4375,-1.078125 2.984375,-0.484375 2.125,-0.484375 L 1.09375,-0.484375 z"+ id="path243" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-26"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.796875,0 L 4.03125,-3.65625 L 4.03125,0 L 4.546875,0 L 4.546875,-4.359375 L 3.78125,-4.359375 L 2.515625,-0.5625 L 1.21875,-4.359375 L 0.453125,-4.359375 L 0.453125,0 L 0.96875,0 L 0.96875,-3.65625 L 2.21875,0 L 2.796875,0 z"+ id="path246" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-27"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-4.359375 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 1.921875,-2.78125 2.09375,-2.734375 2.203125,-2.640625 C 2.359375,-2.546875 2.40625,-2.390625 2.40625,-2.171875 L 2.40625,0 L 2.90625,0 L 2.90625,-2.375 C 2.90625,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.484375,-3.21875 1.203125,-3.09375 0.921875,-2.703125 L 0.921875,-4.359375 L 0.421875,-4.359375 z"+ id="path249" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-28"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.03125,-0.515625 L 0.796875,-0.515625 C 0.84375,-0.875 1.046875,-1.09375 1.5625,-1.390625 L 2.15625,-1.71875 C 2.75,-2.046875 3.0625,-2.484375 3.0625,-3 C 3.0625,-3.34375 2.921875,-3.6875 2.65625,-3.90625 C 2.40625,-4.140625 2.09375,-4.25 1.703125,-4.25 C 1.15625,-4.25 0.765625,-4.046875 0.53125,-3.6875 C 0.375,-3.46875 0.3125,-3.203125 0.296875,-2.765625 L 0.828125,-2.765625 C 0.84375,-3.0625 0.875,-3.234375 0.953125,-3.375 C 1.09375,-3.625 1.359375,-3.78125 1.6875,-3.78125 C 2.15625,-3.78125 2.515625,-3.4375 2.515625,-2.984375 C 2.515625,-2.65625 2.328125,-2.359375 1.9375,-2.140625 L 1.390625,-1.84375 C 0.515625,-1.328125 0.25,-0.9375 0.203125,0 L 3.03125,0 L 3.03125,-0.515625 z"+ id="path252" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-29"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.109375,-4.25 L 0.28125,-4.25 L 0.28125,-3.71875 L 2.5625,-3.71875 C 1.5625,-2.28125 1.140625,-1.390625 0.828125,0 L 1.390625,0 C 1.625,-1.359375 2.15625,-2.53125 3.109375,-3.796875 L 3.109375,-4.25 z"+ id="path255" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-30"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.515625,-0.625 L 0.515625,0 L 0.875,0 L 0.875,0.109375 C 0.875,0.515625 0.796875,0.640625 0.515625,0.65625 L 0.515625,0.875 C 0.9375,0.875 1.15625,0.609375 1.15625,0.09375 L 1.15625,-0.625 L 0.515625,-0.625 z"+ id="path258" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-31"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-4.25 C 1.25,-4.25 0.890625,-4.0625 0.671875,-3.78125 C 0.390625,-3.40625 0.25,-2.84375 0.25,-2.046875 C 0.25,-0.625 0.734375,0.140625 1.640625,0.140625 C 2.546875,0.140625 3.03125,-0.625 3.03125,-2.015625 C 3.03125,-2.84375 2.90625,-3.390625 2.625,-3.78125 C 2.40625,-4.078125 2.046875,-4.25 1.640625,-4.25 z M 1.640625,-3.78125 C 2.21875,-3.78125 2.5,-3.203125 2.5,-2.0625 C 2.5,-0.859375 2.21875,-0.296875 1.640625,-0.296875 C 1.078125,-0.296875 0.796875,-0.890625 0.796875,-2.046875 C 0.796875,-3.203125 1.078125,-3.78125 1.640625,-3.78125 z"+ id="path261" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-32"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.34375,-2.234375 C 2.78125,-2.5 2.921875,-2.703125 2.921875,-3.109375 C 2.921875,-3.78125 2.40625,-4.25 1.640625,-4.25 C 0.890625,-4.25 0.375,-3.78125 0.375,-3.109375 C 0.375,-2.71875 0.515625,-2.5 0.953125,-2.234375 C 0.453125,-2 0.21875,-1.640625 0.21875,-1.171875 C 0.21875,-0.40625 0.8125,0.140625 1.640625,0.140625 C 2.484375,0.140625 3.0625,-0.40625 3.0625,-1.171875 C 3.0625,-1.640625 2.828125,-2 2.34375,-2.234375 z M 1.640625,-3.78125 C 2.09375,-3.78125 2.375,-3.515625 2.375,-3.09375 C 2.375,-2.703125 2.09375,-2.4375 1.640625,-2.4375 C 1.203125,-2.4375 0.90625,-2.703125 0.90625,-3.109375 C 0.90625,-3.515625 1.203125,-3.78125 1.640625,-3.78125 z M 1.640625,-2 C 2.171875,-2 2.53125,-1.65625 2.53125,-1.171875 C 2.53125,-0.671875 2.171875,-0.328125 1.640625,-0.328125 C 1.125,-0.328125 0.765625,-0.671875 0.765625,-1.171875 C 0.765625,-1.65625 1.125,-2 1.640625,-2 z"+ id="path264" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-33"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.546875,-3.015625 L 1.546875,0 L 2.078125,0 L 2.078125,-4.25 L 1.734375,-4.25 C 1.546875,-3.59375 1.421875,-3.5 0.609375,-3.40625 L 0.609375,-3.015625 L 1.546875,-3.015625 z"+ id="path267" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-34"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.375,-4.359375 L -0.046875,0.125 L 0.28125,0.125 L 1.703125,-4.359375 L 1.375,-4.359375 z"+ id="path270" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-35"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.328125,-1.9375 L 1.390625,-1.9375 L 1.609375,-1.953125 C 2.1875,-1.953125 2.484375,-1.6875 2.484375,-1.171875 C 2.484375,-0.640625 2.15625,-0.328125 1.609375,-0.328125 C 1.03125,-0.328125 0.75,-0.609375 0.71875,-1.234375 L 0.1875,-1.234375 C 0.21875,-0.890625 0.28125,-0.671875 0.375,-0.484375 C 0.59375,-0.078125 1.015625,0.140625 1.59375,0.140625 C 2.46875,0.140625 3.03125,-0.390625 3.03125,-1.1875 C 3.03125,-1.71875 2.8125,-2.015625 2.3125,-2.203125 C 2.703125,-2.359375 2.90625,-2.65625 2.90625,-3.078125 C 2.90625,-3.8125 2.421875,-4.25 1.609375,-4.25 C 0.75,-4.25 0.296875,-3.78125 0.28125,-2.875 L 0.8125,-2.875 C 0.8125,-3.125 0.84375,-3.265625 0.90625,-3.40625 C 1.015625,-3.640625 1.28125,-3.78125 1.609375,-3.78125 C 2.078125,-3.78125 2.359375,-3.5 2.359375,-3.0625 C 2.359375,-2.765625 2.25,-2.578125 2.015625,-2.484375 C 1.875,-2.421875 1.6875,-2.40625 1.328125,-2.390625 L 1.328125,-1.9375 z"+ id="path273" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path276" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.015625,-1 C 5.015625,-1.25 5.015625,-1.3125 4.859375,-1.3125 C 4.203125,-1.3125 3.125,-1.40625 2.140625,-1.890625 C 0.953125,-2.46875 0.515625,-3.15625 0.234375,-3.59375 C 0.203125,-3.640625 0.140625,-3.640625 0,-3.640625 C -0.25,-3.640625 -0.265625,-3.625 -0.265625,-3.359375 L -0.265625,-3.1875 C 1.21875,-0.515625 3.671875,0 4.78125,0 C 5.015625,0 5.015625,-0.015625 5.015625,-0.3125 L 5.015625,-1 z"+ id="path279" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.171875,1.875 C 3.6875,-0.796875 1.234375,-1.3125 0.125,-1.3125 C -0.109375,-1.3125 -0.109375,-1.296875 -0.109375,-1 L -0.109375,-0.3125 C -0.109375,-0.046875 -0.109375,0 0.046875,0 C 0.703125,0.015625 1.78125,0.09375 2.765625,0.578125 C 3.953125,1.171875 4.390625,1.859375 4.671875,2.28125 C 4.703125,2.328125 4.765625,2.328125 4.90625,2.328125 C 5.15625,2.328125 5.171875,2.328125 5.171875,2.046875 L 5.171875,1.875 z"+ id="path282" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.015625,-1 C 5.015625,-1.296875 5.015625,-1.3125 4.78125,-1.3125 C 3.671875,-1.3125 1.21875,-0.78125 -0.265625,1.875 L -0.265625,2.046875 C -0.265625,2.328125 -0.25,2.328125 0,2.328125 C 0.203125,2.328125 0.21875,2.328125 0.265625,2.25 C 1.171875,0.8125 2.671875,0.046875 4.890625,0 C 5.015625,0 5.015625,-0.078125 5.015625,-0.3125 L 5.015625,-1 z"+ id="path285" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.171875,-3.359375 C 5.171875,-3.625 5.15625,-3.640625 4.90625,-3.640625 C 4.703125,-3.640625 4.6875,-3.625 4.640625,-3.5625 C 3.734375,-2.125 2.234375,-1.359375 0.015625,-1.3125 C -0.109375,-1.3125 -0.109375,-1.234375 -0.109375,-1 L -0.109375,-0.3125 C -0.109375,-0.015625 -0.109375,0 0.125,0 C 1.234375,0 3.6875,-0.53125 5.171875,-3.1875 L 5.171875,-3.359375 z"+ id="path288" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path291" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.171875,-8.96875 C 1.390625,-7.359375 0.9375,-4.9375 0.9375,-2.984375 C 0.9375,-0.890625 1.453125,1.453125 3.171875,3 L 3.890625,3 C 3.4375,2.5625 2.703125,1.640625 2.28125,0.28125 C 1.953125,-0.78125 1.84375,-1.890625 1.84375,-2.96875 C 1.84375,-6.5 3.09375,-8.21875 3.890625,-8.96875 L 3.171875,-8.96875 z"+ id="path294" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.359375,3 C 3.15625,1.40625 3.609375,-1.03125 3.609375,-2.96875 C 3.609375,-5.078125 3.09375,-7.421875 1.359375,-8.96875 L 0.640625,-8.96875 C 1.109375,-8.53125 1.84375,-7.609375 2.265625,-6.25 C 2.578125,-5.1875 2.703125,-4.078125 2.703125,-2.984375 C 2.703125,0.53125 1.453125,2.265625 0.640625,3 L 1.359375,3 z"+ id="path297" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path300" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.75,-5.71875 C 6.890625,-5.796875 6.953125,-5.828125 6.953125,-5.953125 C 6.953125,-6.09375 6.84375,-6.171875 6.734375,-6.171875 C 6.6875,-6.171875 6.59375,-6.125 6.546875,-6.109375 L 0.8125,-2.953125 C 0.671875,-2.875 0.609375,-2.84375 0.609375,-2.71875 C 0.609375,-2.59375 0.703125,-2.546875 0.8125,-2.484375 L 6.546875,0.65625 C 6.59375,0.6875 6.65625,0.71875 6.734375,0.71875 C 6.890625,0.71875 6.953125,0.59375 6.953125,0.5 C 6.953125,0.375 6.890625,0.34375 6.75,0.265625 L 1.28125,-2.71875 L 6.75,-5.71875 z M 10.078125,-5.71875 C 10.21875,-5.796875 10.28125,-5.828125 10.28125,-5.953125 C 10.28125,-6.09375 10.171875,-6.171875 10.0625,-6.171875 C 10.015625,-6.171875 9.921875,-6.125 9.875,-6.109375 L 4.140625,-2.953125 C 3.984375,-2.875 3.9375,-2.84375 3.9375,-2.71875 C 3.9375,-2.59375 4.03125,-2.546875 4.140625,-2.484375 L 9.875,0.65625 C 9.921875,0.6875 9.984375,0.71875 10.0625,0.71875 C 10.21875,0.71875 10.28125,0.59375 10.28125,0.5 C 10.28125,0.375 10.21875,0.34375 10.078125,0.265625 L 4.609375,-2.71875 L 10.078125,-5.71875 z"+ id="path303" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.09375,-2.71875 C 2.09375,-3.046875 1.828125,-3.296875 1.515625,-3.296875 C 1.203125,-3.296875 0.9375,-3.046875 0.9375,-2.71875 C 0.9375,-2.40625 1.203125,-2.15625 1.515625,-2.15625 C 1.828125,-2.15625 2.09375,-2.40625 2.09375,-2.71875 z"+ id="path306" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.765625,-2.5 C 6.90625,-2.578125 6.953125,-2.609375 6.953125,-2.71875 C 6.953125,-2.859375 6.875,-2.90625 6.765625,-2.96875 L 1.015625,-6.109375 C 0.96875,-6.125 0.890625,-6.171875 0.828125,-6.171875 C 0.734375,-6.171875 0.609375,-6.09375 0.609375,-5.953125 C 0.609375,-5.828125 0.671875,-5.796875 0.8125,-5.71875 L 6.28125,-2.71875 L 0.8125,0.265625 C 0.671875,0.34375 0.609375,0.375 0.609375,0.5 C 0.609375,0.71875 0.8125,0.71875 0.890625,0.71875 L 6.765625,-2.5 z M 10.09375,-2.5 C 10.234375,-2.578125 10.28125,-2.609375 10.28125,-2.71875 C 10.28125,-2.859375 10.203125,-2.90625 10.09375,-2.96875 L 4.34375,-6.109375 C 4.296875,-6.125 4.203125,-6.171875 4.15625,-6.171875 C 4.0625,-6.171875 3.9375,-6.09375 3.9375,-5.953125 C 3.9375,-5.828125 4,-5.796875 4.140625,-5.71875 L 9.609375,-2.71875 L 4.140625,0.265625 C 4,0.34375 3.9375,0.375 3.9375,0.5 C 3.9375,0.71875 4.140625,0.71875 4.21875,0.71875 L 10.09375,-2.5 z"+ id="path309" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path312" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.953125,-8.171875 C 2.609375,-7.859375 1.875,-7.1875 1.375,-5.84375 C 0.9375,-4.671875 0.859375,-3.515625 0.859375,-2.71875 C 0.859375,0.796875 2.4375,2.25 2.953125,2.71875 L 3.625,2.71875 C 3.09375,2.203125 1.71875,0.796875 1.71875,-2.71875 C 1.71875,-3.34375 1.75,-4.609375 2.1875,-5.90625 C 2.640625,-7.171875 3.265625,-7.8125 3.625,-8.171875 L 2.953125,-8.171875 z"+ id="path315" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.28125,2.71875 C 1.625,2.40625 2.359375,1.734375 2.859375,0.390625 C 3.296875,-0.78125 3.375,-1.9375 3.375,-2.71875 C 3.375,-6.25 1.796875,-7.703125 1.28125,-8.171875 L 0.609375,-8.171875 C 1.140625,-7.65625 2.515625,-6.25 2.515625,-2.71875 C 2.515625,-2.109375 2.484375,-0.84375 2.046875,0.453125 C 1.59375,1.71875 0.96875,2.359375 0.609375,2.71875 L 1.28125,2.71875 z"+ id="path318" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.5,-3.59375 C 7.65625,-3.59375 7.859375,-3.59375 7.859375,-3.8125 C 7.859375,-4.03125 7.65625,-4.03125 7.5,-4.03125 L 0.96875,-4.03125 C 0.8125,-4.03125 0.609375,-4.03125 0.609375,-3.8125 C 0.609375,-3.59375 0.8125,-3.59375 0.984375,-3.59375 L 7.5,-3.59375 z M 7.5,-1.421875 C 7.65625,-1.421875 7.859375,-1.421875 7.859375,-1.640625 C 7.859375,-1.859375 7.65625,-1.859375 7.5,-1.859375 L 0.984375,-1.859375 C 0.8125,-1.859375 0.609375,-1.859375 0.609375,-1.640625 C 0.609375,-1.421875 0.8125,-1.421875 0.96875,-1.421875 L 7.5,-1.421875 z"+ id="path321" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path324" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.640625,-4.4375 L 5.921875,-4.4375 C 6.734375,-4.4375 7.390625,-4.671875 7.953125,-5.171875 C 8.578125,-5.75 8.84375,-6.421875 8.84375,-7.390625 C 8.84375,-9.359375 7.6875,-10.453125 5.625,-10.453125 L 1.3125,-10.453125 L 1.3125,0 L 2.640625,0 L 2.640625,-4.4375 z M 2.640625,-5.609375 L 2.640625,-9.28125 L 5.421875,-9.28125 C 6.703125,-9.28125 7.453125,-8.59375 7.453125,-7.4375 C 7.453125,-6.296875 6.703125,-5.609375 5.421875,-5.609375 L 2.640625,-5.609375 z"+ id="path327" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.984375,-7.515625 L 0.984375,0 L 2.1875,0 L 2.1875,-3.90625 C 2.1875,-4.984375 2.46875,-5.6875 3.046875,-6.09375 C 3.40625,-6.375 3.765625,-6.453125 4.609375,-6.46875 L 4.609375,-7.6875 C 4.40625,-7.71875 4.296875,-7.734375 4.140625,-7.734375 C 3.375,-7.734375 2.78125,-7.265625 2.09375,-6.15625 L 2.09375,-7.515625 L 0.984375,-7.515625 z"+ id="path330" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.15625,-7.515625 L 0.96875,-7.515625 L 0.96875,0 L 2.15625,0 L 2.15625,-7.515625 z M 2.15625,-10.453125 L 0.953125,-10.453125 L 0.953125,-8.953125 L 2.15625,-8.953125 L 2.15625,-10.453125 z"+ id="path333" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1,-7.515625 L 1,0 L 2.203125,0 L 2.203125,-4.71875 C 2.203125,-5.8125 3,-6.6875 3.96875,-6.6875 C 4.859375,-6.6875 5.359375,-6.140625 5.359375,-5.171875 L 5.359375,0 L 6.5625,0 L 6.5625,-4.71875 C 6.5625,-5.8125 7.359375,-6.6875 8.328125,-6.6875 C 9.203125,-6.6875 9.71875,-6.125 9.71875,-5.171875 L 9.71875,0 L 10.9375,0 L 10.9375,-5.640625 C 10.9375,-6.984375 10.15625,-7.734375 8.75,-7.734375 C 7.75,-7.734375 7.140625,-7.4375 6.4375,-6.578125 C 6,-7.390625 5.390625,-7.734375 4.421875,-7.734375 C 3.40625,-7.734375 2.75,-7.359375 2.109375,-6.453125 L 2.109375,-7.515625 L 1,-7.515625 z"+ id="path336" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.640625,-7.515625 L 2.40625,-7.515625 L 2.40625,-9.578125 L 1.21875,-9.578125 L 1.21875,-7.515625 L 0.203125,-7.515625 L 0.203125,-6.546875 L 1.21875,-6.546875 L 1.21875,-0.859375 C 1.21875,-0.09375 1.734375,0.328125 2.671875,0.328125 C 2.953125,0.328125 3.234375,0.296875 3.640625,0.234375 L 3.640625,-0.78125 C 3.484375,-0.734375 3.296875,-0.71875 3.0625,-0.71875 C 2.546875,-0.71875 2.40625,-0.859375 2.40625,-1.390625 L 2.40625,-6.546875 L 3.640625,-6.546875 L 3.640625,-7.515625 z"+ id="path339" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.09375,0 L 6.96875,-7.515625 L 5.625,-7.515625 L 3.5,-1.421875 L 1.484375,-7.515625 L 0.140625,-7.515625 L 2.78125,0 L 4.09375,0 z"+ id="path342" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.359375,-3.359375 C 7.359375,-4.5 7.265625,-5.1875 7.0625,-5.75 C 6.5625,-6.984375 5.421875,-7.734375 4.015625,-7.734375 C 1.921875,-7.734375 0.578125,-6.125 0.578125,-3.65625 C 0.578125,-1.1875 1.875,0.328125 3.984375,0.328125 C 5.703125,0.328125 6.90625,-0.640625 7.203125,-2.28125 L 6,-2.28125 C 5.671875,-1.296875 4.984375,-0.78125 4.03125,-0.78125 C 3.265625,-0.78125 2.625,-1.125 2.21875,-1.75 C 1.9375,-2.1875 1.84375,-2.609375 1.828125,-3.359375 L 7.359375,-3.359375 z M 1.84375,-4.328125 C 1.953125,-5.71875 2.796875,-6.625 4,-6.625 C 5.171875,-6.625 6.078125,-5.65625 6.078125,-4.421875 C 6.078125,-4.390625 6.078125,-4.359375 6.0625,-4.328125 L 1.84375,-4.328125 z"+ id="path345" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.90625,-7.734375 C 1.796875,-7.734375 0.515625,-6.21875 0.515625,-3.703125 C 0.515625,-1.171875 1.78125,0.328125 3.921875,0.328125 C 6.03125,0.328125 7.3125,-1.171875 7.3125,-3.640625 C 7.3125,-6.234375 6.0625,-7.734375 3.90625,-7.734375 z M 3.921875,-6.625 C 5.265625,-6.625 6.0625,-5.515625 6.0625,-3.65625 C 6.0625,-1.890625 5.234375,-0.78125 3.921875,-0.78125 C 2.578125,-0.78125 1.765625,-1.875 1.765625,-3.703125 C 1.765625,-5.515625 2.578125,-6.625 3.921875,-6.625 z"+ id="path348" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.75,-4.984375 C 6.703125,-5.71875 6.546875,-6.203125 6.25,-6.609375 C 5.734375,-7.3125 4.828125,-7.734375 3.78125,-7.734375 C 1.765625,-7.734375 0.4375,-6.125 0.4375,-3.625 C 0.4375,-1.203125 1.734375,0.328125 3.765625,0.328125 C 5.5625,0.328125 6.703125,-0.75 6.84375,-2.578125 L 5.640625,-2.578125 C 5.4375,-1.375 4.8125,-0.78125 3.796875,-0.78125 C 2.484375,-0.78125 1.6875,-1.84375 1.6875,-3.625 C 1.6875,-5.515625 2.46875,-6.625 3.765625,-6.625 C 4.78125,-6.625 5.40625,-6.03125 5.546875,-4.984375 L 6.75,-4.984375 z"+ id="path351" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.28125,-5.421875 C 6.265625,-6.90625 5.296875,-7.734375 3.5625,-7.734375 C 1.8125,-7.734375 0.671875,-6.828125 0.671875,-5.4375 C 0.671875,-4.265625 1.28125,-3.703125 3.0625,-3.265625 L 4.171875,-3 C 5,-2.796875 5.328125,-2.5 5.328125,-1.953125 C 5.328125,-1.25 4.640625,-0.78125 3.578125,-0.78125 C 2.9375,-0.78125 2.390625,-0.96875 2.09375,-1.28125 C 1.90625,-1.484375 1.828125,-1.703125 1.75,-2.234375 L 0.484375,-2.234375 C 0.546875,-0.5 1.515625,0.328125 3.484375,0.328125 C 5.375,0.328125 6.578125,-0.609375 6.578125,-2.046875 C 6.578125,-3.171875 5.953125,-3.78125 4.453125,-4.140625 L 3.3125,-4.421875 C 2.34375,-4.640625 1.921875,-4.96875 1.921875,-5.5 C 1.921875,-6.1875 2.53125,-6.625 3.515625,-6.625 C 4.46875,-6.625 4.984375,-6.203125 5.015625,-5.421875 L 6.28125,-5.421875 z"+ id="path354" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.078125,-4.46875 L 0.65625,-4.46875 L 0.65625,-3.4375 L 4.078125,-3.4375 L 4.078125,-4.46875 z"+ id="path357" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 9.5,-7.21875 C 9.078125,-9.515625 7.765625,-10.625 5.46875,-10.625 C 4.0625,-10.625 2.921875,-10.1875 2.15625,-9.328125 C 1.203125,-8.296875 0.6875,-6.796875 0.6875,-5.109375 C 0.6875,-3.390625 1.21875,-1.90625 2.203125,-0.890625 C 3.015625,-0.0625 4.046875,0.328125 5.40625,0.328125 C 7.953125,0.328125 9.390625,-1.046875 9.703125,-3.8125 L 8.328125,-3.8125 C 8.21875,-3.09375 8.078125,-2.609375 7.859375,-2.1875 C 7.4375,-1.328125 6.546875,-0.84375 5.421875,-0.84375 C 3.34375,-0.84375 2.015625,-2.515625 2.015625,-5.125 C 2.015625,-7.796875 3.28125,-9.453125 5.3125,-9.453125 C 6.15625,-9.453125 6.9375,-9.1875 7.375,-8.796875 C 7.765625,-8.4375 7.96875,-7.984375 8.140625,-7.21875 L 9.5,-7.21875 z"+ id="path360" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1,-7.515625 L 1,0 L 2.203125,0 L 2.203125,-4.140625 C 2.203125,-5.6875 3.015625,-6.6875 4.25,-6.6875 C 5.1875,-6.6875 5.796875,-6.109375 5.796875,-5.203125 L 5.796875,0 L 6.984375,0 L 6.984375,-5.6875 C 6.984375,-6.921875 6.046875,-7.734375 4.609375,-7.734375 C 3.484375,-7.734375 2.765625,-7.296875 2.109375,-6.25 L 2.109375,-7.515625 L 1,-7.515625 z"+ id="path363" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.90625,0 L 6.90625,-7.515625 L 5.71875,-7.515625 L 5.71875,-3.25 C 5.71875,-1.71875 4.921875,-0.71875 3.671875,-0.71875 C 2.71875,-0.71875 2.125,-1.296875 2.125,-2.1875 L 2.125,-7.515625 L 0.9375,-7.515625 L 0.9375,-1.71875 C 0.9375,-0.46875 1.859375,0.328125 3.328125,0.328125 C 4.4375,0.328125 5.140625,-0.0625 5.84375,-1.046875 L 5.84375,0 L 6.90625,0 z"+ id="path366" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.625,-4.765625 L 8.3125,-4.765625 L 8.3125,-5.9375 L 2.625,-5.9375 L 2.625,-9.28125 L 8.53125,-9.28125 L 8.53125,-10.453125 L 1.296875,-10.453125 L 1.296875,0 L 8.796875,0 L 8.796875,-1.171875 L 2.625,-1.171875 L 2.625,-4.765625 z"+ id="path369" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.1875,-3.890625 L 6.71875,-7.515625 L 5.359375,-7.515625 L 3.5625,-4.796875 L 1.75,-7.515625 L 0.390625,-7.515625 L 2.890625,-3.828125 L 0.25,0 L 1.609375,0 L 3.515625,-2.890625 L 5.390625,0 L 6.78125,0 L 4.1875,-3.890625 z"+ id="path372" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.671875,-0.703125 C 7.546875,-0.671875 7.484375,-0.671875 7.421875,-0.671875 C 7,-0.671875 6.765625,-0.890625 6.765625,-1.265625 L 6.765625,-5.6875 C 6.765625,-7.015625 5.796875,-7.734375 3.9375,-7.734375 C 2.859375,-7.734375 1.953125,-7.421875 1.453125,-6.859375 C 1.109375,-6.46875 0.96875,-6.03125 0.9375,-5.296875 L 2.140625,-5.296875 C 2.234375,-6.203125 2.78125,-6.625 3.90625,-6.625 C 4.984375,-6.625 5.578125,-6.21875 5.578125,-5.515625 L 5.578125,-5.1875 C 5.578125,-4.6875 5.28125,-4.46875 4.328125,-4.359375 C 2.640625,-4.140625 2.375,-4.09375 1.921875,-3.90625 C 1.046875,-3.546875 0.609375,-2.875 0.609375,-1.890625 C 0.609375,-0.53125 1.546875,0.328125 3.0625,0.328125 C 4.015625,0.328125 4.78125,0 5.625,-0.78125 C 5.703125,-0.015625 6.078125,0.328125 6.859375,0.328125 C 7.09375,0.328125 7.28125,0.296875 7.671875,0.203125 L 7.671875,-0.703125 z M 5.578125,-2.359375 C 5.578125,-1.96875 5.46875,-1.71875 5.109375,-1.390625 C 4.625,-0.953125 4.03125,-0.71875 3.328125,-0.71875 C 2.390625,-0.71875 1.84375,-1.15625 1.84375,-1.921875 C 1.84375,-2.71875 2.375,-3.109375 3.65625,-3.296875 C 4.921875,-3.46875 5.171875,-3.53125 5.578125,-3.71875 L 5.578125,-2.359375 z"+ id="path375" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.78125,3.125 L 1.984375,3.125 L 1.984375,-0.78125 C 2.609375,-0.015625 3.3125,0.328125 4.28125,0.328125 C 6.21875,0.328125 7.5,-1.234375 7.5,-3.625 C 7.5,-6.15625 6.265625,-7.734375 4.28125,-7.734375 C 3.25,-7.734375 2.4375,-7.265625 1.875,-6.390625 L 1.875,-7.515625 L 0.78125,-7.515625 L 0.78125,3.125 z M 4.078125,-6.609375 C 5.390625,-6.609375 6.25,-5.453125 6.25,-3.65625 C 6.25,-1.953125 5.375,-0.78125 4.078125,-0.78125 C 2.8125,-0.78125 1.984375,-1.9375 1.984375,-3.703125 C 1.984375,-5.46875 2.8125,-6.609375 4.078125,-6.609375 z"+ id="path378" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.1875,-10.453125 L 0.96875,-10.453125 L 0.96875,0 L 2.1875,0 L 2.1875,-10.453125 z"+ id="path381" />+ </symbol>+ </g>+ <clipPath+ id="clip1">+ <path+ d="M 21.226562,68.800781 L 27.273438,68.800781 L 27.273438,62.753906 L 21.226562,62.753906 L 21.226562,68.800781 z"+ id="path384" />+ </clipPath>+ <clipPath+ id="clip2">+ <path+ d="M 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 L 146.21484,105.14453 z"+ id="path387" />+ </clipPath>+ <clipPath+ id="clip3">+ <path+ d="M 146.21484,75.144531 L 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 z M 229.14844,92.082031 L 238.66016,92.082031 L 238.66016,88.300781 L 229.14844,88.300781 L 229.14844,88.300781 L 236.70703,90.191406 L 229.14844,92.082031 z"+ id="path390" />+ </clipPath>+ <clipPath+ id="clip4">+ <path+ d="M 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 L 146.21484,105.14453 z"+ id="path393" />+ </clipPath>+ <clipPath+ id="clip5">+ <path+ d="M 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 L 146.21484,105.14453 z"+ id="path396" />+ </clipPath>+ <clipPath+ id="clip6">+ <path+ d="M 146.21484,75.144531 L 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 z M 161.12109,92.082031 L 170.63281,92.082031 L 170.63281,88.300781 L 161.12109,88.300781 L 161.12109,88.300781 L 168.67969,90.191406 L 161.12109,92.082031 z"+ id="path399" />+ </clipPath>+ <clipPath+ id="clip7">+ <path+ d="M 146.21484,105.14453 L 239.21484,105.14453 L 239.21484,75.144531 L 146.21484,75.144531 L 146.21484,105.14453 z"+ id="path402" />+ </clipPath>+ <clipPath+ id="clip8">+ <path+ d="M 21.226562,141.50781 L 27.273438,141.50781 L 27.273438,135.46094 L 21.226562,135.46094 L 21.226562,141.50781 z"+ id="path405" />+ </clipPath>+ <clipPath+ id="clip9">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path408" />+ </clipPath>+ <clipPath+ id="clip10">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path411" />+ </clipPath>+ <clipPath+ id="clip11">+ <path+ d="M 143.37891,147.84766 L 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 z"+ id="path414" />+ </clipPath>+ <clipPath+ id="clip12">+ <path+ d="M 143.37891,147.84766 L 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 z M 231.94922,164.78516 L 241.46094,164.78516 L 241.46094,161.00391 L 231.94922,161.00391 L 231.94922,161.00391 L 239.50781,162.89453 L 231.94922,164.78516 z"+ id="path417" />+ </clipPath>+ <clipPath+ id="clip13">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path420" />+ </clipPath>+ <clipPath+ id="clip14">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path423" />+ </clipPath>+ <clipPath+ id="clip15">+ <path+ d="M 143.37891,147.84766 L 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 z M 158.25,164.78516 L 167.76172,164.78516 L 167.76172,161.00391 L 158.25,161.00391 L 158.25,161.00391 L 165.80859,162.89453 L 158.25,164.78516 z"+ id="path426" />+ </clipPath>+ <clipPath+ id="clip16">+ <path+ d="M 143.37891,177.84766 L 241.37891,177.84766 L 241.37891,147.84766 L 143.37891,147.84766 L 143.37891,177.84766 z"+ id="path429" />+ </clipPath>+ </defs>+ <g+ id="g6479"+ transform="matrix(4.7991208,0,0,4.7991208,-740.58262,-341.12121)">+ <g+ clip-path="url(#clip2)"+ clip-rule="nonzero"+ id="g1186">+ <g+ clip-path="url(#clip3)"+ clip-rule="evenodd"+ id="g1188">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 688.26062,149.51594 L 915.0575,149.51594"+ transform="matrix(0.1,0,0,-0.1,146.213,105.143)"+ id="path1190" />+ </g>+ </g>+ <g+ clip-path="url(#clip4)"+ clip-rule="nonzero"+ id="g1192">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 229.14844,92.082031 L 236.70703,90.191406 L 229.14844,88.300781 L 229.14844,92.082031"+ id="path1194" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 829.35438,130.60969 L 904.94031,149.51594 L 829.35438,168.42219 L 829.35438,130.60969 z"+ transform="matrix(0.1,0,0,-0.1,146.213,105.143)"+ id="path1196" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 234.745,7.797187 L 688.26062,7.797187 L 688.26062,291.23469 L 234.745,291.23469 L 234.745,7.797187 z"+ transform="matrix(0.1,0,0,-0.1,146.213,105.143)"+ id="path1198" />+ </g>+ <g+ clip-path="url(#clip5)"+ clip-rule="nonzero"+ id="g1200">+ <g+ clip-path="url(#clip6)"+ clip-rule="evenodd"+ id="g1202">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 7.987187,149.51594 L 234.745,149.51594"+ transform="matrix(0.1,0,0,-0.1,146.213,105.143)"+ id="path1204" />+ </g>+ </g>+ <g+ clip-path="url(#clip7)"+ clip-rule="nonzero"+ id="g1206">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 161.12109,92.082031 L 168.67969,90.191406 L 161.12109,88.300781 L 161.12109,92.082031"+ id="path1208" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 149.08094,130.60969 L 224.66687,149.51594 L 149.08094,168.42219 L 149.08094,130.60969 z"+ transform="matrix(0.1,0,0,-0.1,146.213,105.143)"+ id="path1210" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1212">+ <use+ xlink:href="#glyph4-1"+ x="171.895"+ y="87.377998"+ id="use1214"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-2"+ x="181.85368"+ y="87.377998"+ id="use1216"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-3"+ x="188.50078"+ y="87.377998"+ id="use1218"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-4"+ x="195.14786"+ y="87.377998"+ id="use1220"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-5"+ x="203.12198"+ y="87.377998"+ id="use1222"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1224">+ <use+ xlink:href="#glyph5-1"+ x="185.28799"+ y="98.718002"+ id="use1226"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1228">+ <use+ xlink:href="#glyph4-6"+ x="189.84"+ y="98.718002"+ id="use1230"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1232">+ <use+ xlink:href="#glyph5-2"+ x="194.813"+ y="98.718002"+ id="use1234"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1236">+ <use+ xlink:href="#glyph6-1"+ x="146.353"+ y="78.860001"+ id="use1238"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1240">+ <use+ xlink:href="#glyph6-2"+ x="146.35062"+ y="78.860001"+ id="use1242"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1244">+ <use+ xlink:href="#glyph4-7"+ x="150.493"+ y="87.377998"+ id="use1246"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1248">+ <use+ xlink:href="#glyph6-1"+ x="220.675"+ y="80.994003"+ id="use1250"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1252">+ <use+ xlink:href="#glyph6-2"+ x="220.67261"+ y="80.994003"+ id="use1254"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1256">+ <use+ xlink:href="#glyph4-8"+ x="223.15601"+ y="87.377998"+ id="use1258"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1260">+ <use+ xlink:href="#glyph2-1"+ x="51.334"+ y="121.681"+ id="use1262"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-2"+ x="60.42128"+ y="121.681"+ id="use1264"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-3"+ x="66.48674"+ y="121.681"+ id="use1266"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-4"+ x="72.5522"+ y="121.681"+ id="use1268"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph2-5"+ x="79.828568"+ y="121.681"+ id="use1270"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1272">+ <use+ xlink:href="#glyph7-1"+ x="88.621002"+ y="121.681"+ id="use1274"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1276">+ <use+ xlink:href="#glyph2-6"+ x="92.862999"+ y="121.681"+ id="use1278"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1280">+ <use+ xlink:href="#glyph7-2"+ x="97.401001"+ y="121.681"+ id="use1282"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph7-1"+ x="101.64355"+ y="121.681"+ id="use1284"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1286">+ <use+ xlink:href="#glyph8-1"+ x="105.886"+ y="121.681"+ id="use1288"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1290">+ <use+ xlink:href="#glyph2-7"+ x="119.826"+ y="121.681"+ id="use1292"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1294">+ <use+ xlink:href="#glyph9-1"+ x="125.28"+ y="123.602"+ id="use1296"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1298">+ <use+ xlink:href="#glyph10-1"+ x="130.21001"+ y="121.681"+ id="use1300"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1302">+ <use+ xlink:href="#glyph2-7"+ x="135.058"+ y="121.681"+ id="use1304"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1306">+ <use+ xlink:href="#glyph9-2"+ x="140.513"+ y="123.602"+ id="use1308"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1310">+ <use+ xlink:href="#glyph10-1"+ x="145.442"+ y="121.681"+ id="use1312"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1314">+ <use+ xlink:href="#glyph2-7"+ x="150.28999"+ y="121.681"+ id="use1316"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1318">+ <use+ xlink:href="#glyph9-3"+ x="155.745"+ y="123.602"+ id="use1320"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1322">+ <use+ xlink:href="#glyph10-1"+ x="160.674"+ y="121.681"+ id="use1324"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1326">+ <use+ xlink:href="#glyph8-2"+ x="165.52299"+ y="121.681"+ id="use1328"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1330">+ <use+ xlink:href="#glyph8-2"+ x="170.37537"+ y="121.681"+ id="use1332"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1334">+ <use+ xlink:href="#glyph8-2"+ x="175.21683"+ y="121.681"+ id="use1336"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1338">+ <use+ xlink:href="#glyph8-3"+ x="181.28011"+ y="121.681"+ id="use1340"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1342">+ <use+ xlink:href="#glyph7-2"+ x="192.19"+ y="121.681"+ id="use1344"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1346">+ <use+ xlink:href="#glyph7-3"+ x="199.46529"+ y="121.681"+ id="use1348"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1350">+ <use+ xlink:href="#glyph8-1"+ x="207.94701"+ y="121.681"+ id="use1352"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1354">+ <use+ xlink:href="#glyph2-6"+ x="221.886"+ y="121.681"+ id="use1356"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1358">+ <use+ xlink:href="#glyph7-1"+ x="226.424"+ y="121.681"+ id="use1360"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1362">+ <use+ xlink:href="#glyph2-7"+ x="230.66701"+ y="121.681"+ id="use1364"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1366">+ <use+ xlink:href="#glyph9-1"+ x="236.121"+ y="123.602"+ id="use1368"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1370">+ <use+ xlink:href="#glyph7-2"+ x="241.05099"+ y="121.681"+ id="use1372"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1374">+ <use+ xlink:href="#glyph10-1"+ x="245.293"+ y="121.681"+ id="use1376"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1378">+ <use+ xlink:href="#glyph2-6"+ x="250.142"+ y="121.681"+ id="use1380"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1382">+ <use+ xlink:href="#glyph7-1"+ x="254.67999"+ y="121.681"+ id="use1384"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1386">+ <use+ xlink:href="#glyph2-7"+ x="258.922"+ y="121.681"+ id="use1388"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1390">+ <use+ xlink:href="#glyph9-2"+ x="264.37701"+ y="123.602"+ id="use1392"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1394">+ <use+ xlink:href="#glyph7-2"+ x="269.306"+ y="121.681"+ id="use1396"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1398">+ <use+ xlink:href="#glyph10-1"+ x="273.548"+ y="121.681"+ id="use1400"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1402">+ <use+ xlink:href="#glyph2-6"+ x="278.397"+ y="121.681"+ id="use1404"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1406">+ <use+ xlink:href="#glyph7-1"+ x="282.935"+ y="121.681"+ id="use1408"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1410">+ <use+ xlink:href="#glyph2-7"+ x="287.177"+ y="121.681"+ id="use1412"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1414">+ <use+ xlink:href="#glyph9-3"+ x="292.63199"+ y="123.602"+ id="use1416"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1418">+ <use+ xlink:href="#glyph7-2"+ x="297.561"+ y="121.681"+ id="use1420"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1422">+ <use+ xlink:href="#glyph10-1"+ x="301.80399"+ y="121.681"+ id="use1424"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1426">+ <use+ xlink:href="#glyph8-2"+ x="306.65201"+ y="121.681"+ id="use1428"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1430">+ <use+ xlink:href="#glyph8-2"+ x="311.50436"+ y="121.681"+ id="use1432"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1434">+ <use+ xlink:href="#glyph8-2"+ x="316.34583"+ y="121.681"+ id="use1436"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1438">+ <use+ xlink:href="#glyph8-3"+ x="322.40912"+ y="121.681"+ id="use1440"+ width="362.83499"+ height="272.12601" />+ </g>+ </g>+</svg>
+ doc/www/files/tutorial/figures/piecewise_sin.svg view
@@ -0,0 +1,136 @@+<?xml version="1.0" encoding="UTF-8"?>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="555pt" height="555pt" viewBox="0 0 555 555" version="1.1">+<defs>+<clipPath id="clip1">+ <path d="M 22.199219 15.296875 L 539.714844 15.296875 L 539.714844 536.960938 L 22.199219 536.960938 L 22.199219 15.296875 Z M 22.199219 15.296875 "/>+</clipPath>+<clipPath id="clip2">+ <path d="M 6.9375 6.9375 L 548.0625 6.9375 L 548.0625 548.0625 L 6.9375 548.0625 L 6.9375 6.9375 Z M 6.9375 6.9375 "/>+</clipPath>+<clipPath id="clip3">+ <path d="M 398.210938 308.023438 L 417.636719 308.023438 L 417.636719 328.839844 L 398.210938 328.839844 L 398.210938 308.023438 Z M 398.210938 308.023438 "/>+</clipPath>+<clipPath id="clip4">+ <path d="M 6.9375 6.9375 L 548.0625 6.9375 L 548.0625 548.0625 L 6.9375 548.0625 L 6.9375 6.9375 Z M 6.9375 6.9375 "/>+</clipPath>+<clipPath id="clip5">+ <path d="M 8.324219 288.601562 L 18.039062 288.601562 L 18.039062 306.636719 L 8.324219 306.636719 L 8.324219 288.601562 Z M 8.324219 288.601562 "/>+</clipPath>+<clipPath id="clip6">+ <path d="M 6.9375 6.9375 L 548.0625 6.9375 L 548.0625 548.0625 L 6.9375 548.0625 L 6.9375 6.9375 Z M 6.9375 6.9375 "/>+</clipPath>+<clipPath id="clip7">+ <path d="M 140.136719 288.601562 L 149.851562 288.601562 L 149.851562 306.636719 L 140.136719 306.636719 L 140.136719 288.601562 Z M 140.136719 288.601562 "/>+</clipPath>+<clipPath id="clip8">+ <path d="M 6.9375 6.9375 L 548.0625 6.9375 L 548.0625 548.0625 L 6.9375 548.0625 L 6.9375 6.9375 Z M 6.9375 6.9375 "/>+</clipPath>+<clipPath id="clip9">+ <path d="M 230.324219 527.25 L 240.039062 527.25 L 240.039062 545.289062 L 230.324219 545.289062 L 230.324219 527.25 Z M 230.324219 527.25 "/>+</clipPath>+<clipPath id="clip10">+ <path d="M 6.9375 6.9375 L 548.0625 6.9375 L 548.0625 548.0625 L 6.9375 548.0625 L 6.9375 6.9375 Z M 6.9375 6.9375 "/>+</clipPath>+<clipPath id="clip11">+ <path d="M 230.324219 396.824219 L 240.039062 396.824219 L 240.039062 414.863281 L 230.324219 414.863281 L 230.324219 396.824219 Z M 230.324219 396.824219 "/>+</clipPath>+<clipPath id="clip12">+ <path d="M 6.9375 6.9375 L 548.0625 6.9375 L 548.0625 548.0625 L 6.9375 548.0625 L 6.9375 6.9375 Z M 6.9375 6.9375 "/>+</clipPath>+</defs>+<g id="surface0">+<g clip-path="url(#clip1)" clip-rule="nonzero">+<path style="fill: none; stroke-width: 13.875; stroke-linecap: butt; stroke-linejoin: round; stroke: rgb(100%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 242.8125 4183.320312 L 270.546875 3933.554688 L 298.320312 3683.828125 L 326.054688 3406.328125 L 353.828125 3128.828125 L 409.296875 2643.203125 L 450.9375 2157.578125 L 478.671875 1893.945312 L 506.445312 1644.179688 L 534.179688 1394.453125 L 561.953125 1172.421875 L 617.421875 783.945312 L 672.929688 478.671875 L 728.4375 270.546875 L 783.945312 187.304688 L 811.679688 187.304688 L 825.546875 201.171875 L 825.546875 215.078125 L 853.320312 270.546875 L 881.054688 339.921875 L 936.5625 575.820312 L 992.070312 894.921875 L 1047.578125 1311.171875 L 1103.046875 1796.796875 L 1130.820312 2060.429688 L 1158.554688 2324.0625 L 1172.421875 2587.695312 L 1200.195312 2865.195312 L 1227.929688 3142.695312 L 1255.703125 3420.195312 L 1283.4375 3697.695312 L 1311.171875 3947.421875 L 1366.679688 4363.671875 L 1422.1875 4724.453125 L 1477.695312 5043.554688 L 1533.203125 5251.679688 L 1560.9375 5321.054688 L 1588.671875 5362.695312 L 1616.445312 5362.695312 L 1630.3125 5348.828125 L 1644.179688 5334.921875 L 1685.820312 5196.171875 L 1741.328125 4960.3125 L 1796.796875 4655.078125 L 1838.4375 4294.296875 L 1866.171875 4044.570312 L 1893.945312 3780.9375 L 1935.546875 3517.304688 L 1963.320312 3225.9375 L 2004.921875 2740.3125 L 2060.429688 2240.820312 L 2088.203125 1963.320312 L 2115.9375 1699.6875 L 2143.671875 1449.921875 L 2171.445312 1214.0625 L 2226.953125 839.453125 L 2268.554688 534.179688 L 2324.0625 312.1875 L 2379.570312 201.171875 L 2393.4375 187.304688 L 2421.171875 187.304688 L 2435.078125 201.171875 L 2462.8125 242.8125 L 2490.546875 312.1875 L 2546.054688 534.179688 L 2601.5625 867.1875 L 2643.203125 1241.796875 L 2698.671875 1685.820312 L 2726.445312 1935.546875 L 2754.179688 2199.179688 L 2781.953125 2476.679688 L 2809.6875 2754.179688 L 2837.421875 2518.320312 L 2865.195312 2240.820312 L 2892.929688 1963.320312 L 2920.703125 1699.6875 L 2976.171875 1269.570312 L 3017.8125 894.921875 L 3073.320312 561.953125 L 3128.828125 339.921875 L 3156.5625 256.679688 L 3184.296875 215.078125 L 3198.203125 201.171875 L 3212.070312 187.304688 L 3225.9375 187.304688 L 3239.804688 201.171875 L 3295.3125 298.320312 L 3336.953125 506.445312 L 3392.421875 811.679688 L 3447.929688 1186.328125 L 3475.703125 1436.054688 L 3503.4375 1685.820312 L 3531.171875 1963.320312 L 3558.945312 2240.820312 L 3586.679688 2490.546875 L 3642.1875 3017.8125 L 3669.921875 3281.445312 L 3697.695312 3545.078125 L 3725.429688 3808.671875 L 3753.203125 4058.4375 L 3780.9375 4294.296875 L 3822.578125 4668.945312 L 3878.046875 4974.179688 L 3933.554688 5210.078125 L 3989.0625 5348.828125 L 4002.929688 5348.828125 L 4016.796875 5362.695312 L 4030.703125 5362.695312 L 4044.570312 5348.828125 L 4058.4375 5321.054688 L 4086.171875 5265.546875 L 4141.679688 5057.421875 L 4197.1875 4752.1875 L 4252.695312 4377.578125 L 4308.203125 3919.6875 L 4335.9375 3669.921875 L 4363.671875 3406.328125 L 4391.445312 3128.828125 L 4419.179688 2851.328125 L 4446.953125 2587.695312 L 4474.6875 2324.0625 L 4488.554688 2060.429688 L 4516.328125 1810.703125 L 4571.796875 1325.078125 L 4627.304688 908.828125 L 4682.8125 575.820312 L 4738.320312 339.921875 L 4766.054688 270.546875 L 4793.828125 215.078125 L 4793.828125 201.171875 L 4807.695312 187.304688 L 4835.429688 187.304688 L 4890.9375 284.453125 L 4946.445312 492.578125 L 5001.953125 770.078125 L 5057.421875 1130.820312 L 5112.929688 1588.671875 L 5154.570312 2102.070312 L 5182.304688 2351.796875 L 5210.078125 2615.429688 L 5237.8125 2879.0625 L 5265.546875 3142.695312 L 5293.320312 3420.195312 L 5321.054688 3683.828125 L 5348.828125 3933.554688 L 5376.5625 4183.320312 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+</g>+<g clip-path="url(#clip2)" clip-rule="nonzero">+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 5112.929688 2768.046875 L 5112.929688 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 4863.203125 2768.046875 L 4863.203125 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 4599.570312 2768.046875 L 4599.570312 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 4349.804688 2768.046875 L 4349.804688 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 3836.445312 2768.046875 L 3836.445312 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 3572.8125 2768.046875 L 3572.8125 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 3323.046875 2768.046875 L 3323.046875 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 3059.453125 2768.046875 L 3059.453125 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2546.054688 2768.046875 L 2546.054688 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2296.328125 2768.046875 L 2296.328125 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2032.695312 2768.046875 L 2032.695312 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1782.929688 2768.046875 L 1782.929688 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1269.570312 2768.046875 L 1269.570312 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1005.9375 2768.046875 L 1005.9375 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 756.171875 2768.046875 L 756.171875 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 492.578125 2768.046875 L 492.578125 2740.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 242.8125 2768.046875 L 5376.5625 2768.046875 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+</g>+<g clip-path="url(#clip3)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 408.507812 316.71875 C 408.742188 317.027344 408.886719 317.316406 408.976562 317.621094 C 409.046875 317.839844 409.101562 318.398438 409.175781 319.300781 L 410.167969 318.128906 C 410.4375 317.855469 410.742188 317.585938 411.085938 317.332031 C 411.429688 317.0625 411.71875 316.902344 411.96875 316.792969 C 412.113281 316.738281 412.277344 316.71875 412.4375 316.71875 C 412.691406 316.71875 412.890625 316.773438 413.015625 316.917969 C 413.125 317.046875 413.179688 317.207031 413.140625 317.40625 C 413.089844 317.640625 413.015625 317.785156 412.90625 317.875 C 412.710938 318.019531 412.511719 318.089844 412.3125 318.089844 C 412.1875 318.089844 412.058594 318.054688 411.914062 318 C 411.664062 317.910156 411.484375 317.875 411.394531 317.875 C 411.25 317.875 411.066406 317.945312 410.851562 318.109375 C 410.417969 318.414062 409.859375 319.011719 409.191406 319.878906 L 409.300781 322.90625 C 409.320312 323.375 409.355469 323.648438 409.425781 323.738281 C 409.480469 323.84375 409.554688 323.882812 409.625 323.882812 C 409.75 323.882812 409.894531 323.808594 410.09375 323.683594 C 410.472656 323.414062 410.816406 323.050781 411.140625 322.617188 L 411.410156 322.78125 C 410.90625 323.464844 410.3125 324.042969 409.660156 324.511719 C 409.28125 324.746094 408.976562 324.875 408.757812 324.875 C 408.433594 324.875 408.199219 324.691406 408.09375 324.332031 C 408 324.117188 407.949219 323.125 407.910156 321.375 C 406.683594 322.980469 405.730469 323.988281 405.097656 324.457031 C 404.683594 324.730469 404.304688 324.875 403.960938 324.875 C 403.746094 324.875 403.546875 324.785156 403.402344 324.640625 C 403.277344 324.511719 403.238281 324.332031 403.292969 324.117188 C 403.332031 323.933594 403.421875 323.773438 403.582031 323.628906 C 403.726562 323.503906 403.890625 323.449219 404.070312 323.449219 C 404.269531 323.449219 404.449219 323.539062 404.609375 323.71875 C 404.738281 323.863281 404.84375 323.933594 404.933594 323.933594 C 404.988281 323.933594 405.097656 323.882812 405.222656 323.792969 C 405.546875 323.558594 406.019531 323.085938 406.648438 322.347656 C 407.261719 321.609375 407.695312 321.066406 407.894531 320.742188 C 407.820312 319.316406 407.765625 318.558594 407.765625 318.46875 C 407.695312 318.089844 407.585938 317.820312 407.386719 317.660156 C 407.207031 317.515625 406.902344 317.425781 406.488281 317.425781 C 406.34375 317.425781 406.199219 317.425781 406.019531 317.441406 L 406.070312 317.136719 "/>+</g>+<g clip-path="url(#clip4)" clip-rule="nonzero">+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 242.8125 2768.046875 L 242.8125 2712.578125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+</g>+<g clip-path="url(#clip5)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 11.390625 298.917969 L 23.296875 298.917969 L 23.296875 297.980469 L 11.390625 297.980469 L 11.390625 298.917969 Z M 11.390625 298.917969 "/>+</g>+<g clip-path="url(#clip6)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 22.921875 293.09375 L 25.828125 291.6875 L 26.117188 291.6875 L 26.117188 301.769531 C 26.117188 302.4375 26.132812 302.851562 26.207031 303.015625 C 26.261719 303.175781 26.367188 303.304688 26.546875 303.394531 C 26.730469 303.484375 27.070312 303.539062 27.613281 303.539062 L 27.613281 303.863281 L 23.121094 303.863281 L 23.121094 303.539062 C 23.699219 303.539062 24.058594 303.484375 24.222656 303.394531 C 24.382812 303.320312 24.492188 303.195312 24.5625 303.050781 C 24.636719 302.90625 24.65625 302.492188 24.65625 301.769531 L 24.65625 295.3125 C 24.65625 294.445312 24.636719 293.886719 24.5625 293.652344 C 24.527344 293.453125 24.457031 293.328125 24.347656 293.238281 C 24.238281 293.148438 24.113281 293.09375 23.949219 293.09375 C 23.734375 293.09375 23.429688 293.183594 23.050781 293.363281 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 30.480469 297.964844 C 30.480469 296.609375 30.679688 295.4375 31.09375 294.445312 C 31.507812 293.472656 32.050781 292.734375 32.734375 292.246094 C 33.257812 291.867188 33.800781 291.6875 34.359375 291.6875 C 35.277344 291.6875 36.109375 292.15625 36.828125 293.074219 C 37.75 294.230469 38.199219 295.800781 38.199219 297.785156 C 38.199219 299.171875 38.003906 300.34375 37.605469 301.320312 C 37.207031 302.292969 36.683594 302.996094 36.070312 303.429688 C 35.457031 303.863281 34.84375 304.058594 34.285156 304.058594 C 33.132812 304.058594 32.195312 303.410156 31.4375 302.058594 C 30.789062 300.941406 30.480469 299.570312 30.480469 297.964844 Z M 32.195312 298.199219 C 32.195312 299.839844 32.410156 301.175781 32.808594 302.21875 C 33.148438 303.085938 33.636719 303.519531 34.304688 303.519531 C 34.628906 303.519531 34.953125 303.394531 35.296875 303.105469 C 35.640625 302.816406 35.890625 302.347656 36.070312 301.660156 C 36.34375 300.652344 36.46875 299.246094 36.46875 297.40625 C 36.46875 296.035156 36.324219 294.898438 36.054688 293.996094 C 35.835938 293.308594 35.566406 292.839844 35.222656 292.550781 C 34.988281 292.355469 34.703125 292.265625 34.359375 292.265625 C 33.960938 292.265625 33.601562 292.445312 33.292969 292.804688 C 32.863281 293.292969 32.574219 294.050781 32.429688 295.097656 C 32.285156 296.140625 32.195312 297.171875 32.195312 298.199219 "/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 1519.296875 2768.046875 L 1519.296875 2712.578125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+</g>+<g clip-path="url(#clip7)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 143.203125 298.917969 L 155.109375 298.917969 L 155.109375 297.980469 L 143.203125 297.980469 L 143.203125 298.917969 Z M 143.203125 298.917969 "/>+</g>+<g clip-path="url(#clip8)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 160.453125 291.921875 L 159.75 293.417969 L 156.160156 293.417969 L 155.382812 295.023438 C 156.9375 295.257812 158.164062 295.835938 159.082031 296.753906 C 159.859375 297.566406 160.253906 298.503906 160.253906 299.585938 C 160.253906 300.21875 160.128906 300.796875 159.875 301.320312 C 159.605469 301.859375 159.300781 302.3125 158.902344 302.691406 C 158.523438 303.066406 158.089844 303.375 157.601562 303.589844 C 156.9375 303.898438 156.25 304.058594 155.527344 304.058594 C 154.808594 304.058594 154.300781 303.933594 153.960938 303.71875 C 153.636719 303.464844 153.472656 303.210938 153.472656 302.90625 C 153.472656 302.742188 153.542969 302.597656 153.6875 302.472656 C 153.816406 302.347656 153.996094 302.292969 154.195312 302.292969 C 154.339844 302.292969 154.484375 302.3125 154.589844 302.363281 C 154.699219 302.402344 154.898438 302.527344 155.1875 302.726562 C 155.621094 303.015625 156.070312 303.175781 156.519531 303.175781 C 157.207031 303.175781 157.800781 302.925781 158.324219 302.402344 C 158.847656 301.878906 159.101562 301.246094 159.101562 300.488281 C 159.101562 299.765625 158.882812 299.101562 158.414062 298.46875 C 157.945312 297.855469 157.316406 297.367188 156.484375 297.027344 C 155.855469 296.753906 154.988281 296.609375 153.871094 296.574219 L 156.160156 291.921875 "/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 2768.046875 L 2809.6875 2712.578125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 267.050781 293.800781 C 267.050781 292.449219 267.246094 291.277344 267.664062 290.285156 C 268.078125 289.308594 268.617188 288.570312 269.304688 288.082031 C 269.828125 287.703125 270.367188 287.523438 270.925781 287.523438 C 271.847656 287.523438 272.675781 287.992188 273.398438 288.914062 C 274.320312 290.066406 274.769531 291.636719 274.769531 293.621094 C 274.769531 295.011719 274.570312 296.183594 274.175781 297.15625 C 273.777344 298.128906 273.253906 298.835938 272.640625 299.265625 C 272.027344 299.699219 271.414062 299.898438 270.855469 299.898438 C 269.699219 299.898438 268.761719 299.25 268.003906 297.894531 C 267.355469 296.777344 267.050781 295.40625 267.050781 293.800781 Z M 268.761719 294.035156 C 268.761719 295.675781 268.980469 297.011719 269.375 298.058594 C 269.71875 298.925781 270.207031 299.355469 270.875 299.355469 C 271.199219 299.355469 271.523438 299.230469 271.867188 298.941406 C 272.207031 298.652344 272.460938 298.183594 272.640625 297.5 C 272.910156 296.488281 273.039062 295.082031 273.039062 293.242188 C 273.039062 291.871094 272.894531 290.734375 272.621094 289.832031 C 272.40625 289.148438 272.136719 288.679688 271.792969 288.390625 C 271.558594 288.191406 271.269531 288.101562 270.925781 288.101562 C 270.53125 288.101562 270.167969 288.28125 269.863281 288.644531 C 269.429688 289.128906 269.140625 289.886719 268.996094 290.933594 C 268.851562 291.980469 268.761719 293.007812 268.761719 294.035156 "/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 4086.171875 2768.046875 L 4086.171875 2712.578125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 411.589844 291.921875 L 410.886719 293.417969 L 407.296875 293.417969 L 406.523438 295.023438 C 408.074219 295.257812 409.300781 295.835938 410.21875 296.753906 C 410.996094 297.566406 411.394531 298.503906 411.394531 299.585938 C 411.394531 300.21875 411.265625 300.796875 411.015625 301.320312 C 410.742188 301.859375 410.4375 302.3125 410.039062 302.691406 C 409.660156 303.066406 409.226562 303.375 408.742188 303.589844 C 408.074219 303.898438 407.386719 304.058594 406.667969 304.058594 C 405.945312 304.058594 405.441406 303.933594 405.097656 303.71875 C 404.773438 303.464844 404.609375 303.210938 404.609375 302.90625 C 404.609375 302.742188 404.683594 302.597656 404.828125 302.472656 C 404.953125 302.347656 405.132812 302.292969 405.332031 302.292969 C 405.476562 302.292969 405.621094 302.3125 405.730469 302.363281 C 405.835938 302.402344 406.035156 302.527344 406.324219 302.726562 C 406.757812 303.015625 407.207031 303.175781 407.660156 303.175781 C 408.34375 303.175781 408.941406 302.925781 409.460938 302.402344 C 409.984375 301.878906 410.238281 301.246094 410.238281 300.488281 C 410.238281 299.765625 410.023438 299.101562 409.554688 298.46875 C 409.085938 297.855469 408.453125 297.367188 407.621094 297.027344 C 406.992188 296.753906 406.125 296.609375 405.007812 296.574219 L 407.296875 291.921875 "/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 5376.5625 2768.046875 L 5376.5625 2712.578125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 527.972656 293.09375 L 530.878906 291.6875 L 531.167969 291.6875 L 531.167969 301.769531 C 531.167969 302.4375 531.183594 302.851562 531.257812 303.015625 C 531.308594 303.175781 531.417969 303.304688 531.597656 303.394531 C 531.78125 303.484375 532.121094 303.539062 532.664062 303.539062 L 532.664062 303.863281 L 528.171875 303.863281 L 528.171875 303.539062 C 528.75 303.539062 529.109375 303.484375 529.273438 303.394531 C 529.433594 303.320312 529.542969 303.195312 529.613281 303.050781 C 529.6875 302.90625 529.703125 302.492188 529.703125 301.769531 L 529.703125 295.3125 C 529.703125 294.445312 529.6875 293.886719 529.613281 293.652344 C 529.578125 293.453125 529.507812 293.328125 529.398438 293.238281 C 529.289062 293.148438 529.164062 293.09375 529 293.09375 C 528.785156 293.09375 528.476562 293.183594 528.101562 293.363281 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 535.53125 297.964844 C 535.53125 296.609375 535.730469 295.4375 536.144531 294.445312 C 536.558594 293.472656 537.101562 292.734375 537.785156 292.246094 C 538.308594 291.867188 538.851562 291.6875 539.410156 291.6875 C 540.328125 291.6875 541.160156 292.15625 541.878906 293.074219 C 542.800781 294.230469 543.25 295.800781 543.25 297.785156 C 543.25 299.171875 543.054688 300.34375 542.65625 301.320312 C 542.257812 302.292969 541.734375 302.996094 541.121094 303.429688 C 540.507812 303.863281 539.894531 304.058594 539.335938 304.058594 C 538.183594 304.058594 537.246094 303.410156 536.488281 302.058594 C 535.835938 300.941406 535.53125 299.570312 535.53125 297.964844 Z M 537.246094 298.199219 C 537.246094 299.839844 537.460938 301.175781 537.859375 302.21875 C 538.199219 303.085938 538.6875 303.519531 539.355469 303.519531 C 539.679688 303.519531 540.003906 303.394531 540.347656 303.105469 C 540.691406 302.816406 540.941406 302.347656 541.121094 301.660156 C 541.394531 300.652344 541.519531 299.246094 541.519531 297.40625 C 541.519531 296.035156 541.375 294.898438 541.105469 293.996094 C 540.886719 293.308594 540.617188 292.839844 540.273438 292.550781 C 540.039062 292.355469 539.75 292.265625 539.410156 292.265625 C 539.011719 292.265625 538.652344 292.445312 538.34375 292.804688 C 537.910156 293.292969 537.625 294.050781 537.480469 295.097656 C 537.335938 296.140625 537.246094 297.171875 537.246094 298.199219 "/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 187.304688 L 2809.6875 5362.695312 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 450.9375 L 2768.046875 450.9375 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 700.703125 L 2768.046875 700.703125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 964.296875 L 2768.046875 964.296875 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 1227.929688 L 2768.046875 1227.929688 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 1741.328125 L 2768.046875 1741.328125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 2004.921875 L 2768.046875 2004.921875 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 2254.6875 L 2768.046875 2254.6875 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 2518.320312 L 2768.046875 2518.320312 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 3031.679688 L 2768.046875 3031.679688 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 3295.3125 L 2768.046875 3295.3125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 3545.078125 L 2768.046875 3545.078125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 3808.671875 L 2768.046875 3808.671875 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 4322.070312 L 2768.046875 4322.070312 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 4585.703125 L 2768.046875 4585.703125 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 4849.296875 L 2768.046875 4849.296875 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 5099.0625 L 2768.046875 5099.0625 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 187.304688 L 2726.445312 187.304688 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+</g>+<g clip-path="url(#clip9)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 233.390625 537.570312 L 245.296875 537.570312 L 245.296875 536.632812 L 233.390625 536.632812 L 233.390625 537.570312 Z M 233.390625 537.570312 "/>+</g>+<g clip-path="url(#clip10)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 244.921875 531.742188 L 247.828125 530.335938 L 248.113281 530.335938 L 248.113281 540.421875 C 248.113281 541.085938 248.132812 541.503906 248.207031 541.664062 C 248.257812 541.828125 248.367188 541.953125 248.546875 542.042969 C 248.726562 542.132812 249.070312 542.1875 249.613281 542.1875 L 249.613281 542.511719 L 245.121094 542.511719 L 245.121094 542.1875 C 245.699219 542.1875 246.058594 542.132812 246.222656 542.042969 C 246.382812 541.972656 246.492188 541.84375 246.5625 541.699219 C 246.636719 541.554688 246.652344 541.140625 246.652344 540.421875 L 246.652344 533.960938 C 246.652344 533.097656 246.636719 532.539062 246.5625 532.304688 C 246.527344 532.105469 246.457031 531.980469 246.347656 531.886719 C 246.238281 531.796875 246.113281 531.742188 245.949219 531.742188 C 245.734375 531.742188 245.425781 531.835938 245.046875 532.015625 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 252.785156 545.507812 L 252.785156 545.128906 C 253.398438 544.910156 253.867188 544.605469 254.195312 544.191406 C 254.519531 543.773438 254.699219 543.324219 254.699219 542.855469 C 254.699219 542.746094 254.664062 542.65625 254.609375 542.566406 C 254.574219 542.511719 254.535156 542.511719 254.480469 542.511719 C 254.429688 542.511719 254.285156 542.546875 254.066406 542.675781 C 253.960938 542.730469 253.851562 542.746094 253.726562 542.746094 C 253.453125 542.746094 253.21875 542.65625 253.039062 542.511719 C 252.875 542.351562 252.785156 542.117188 252.785156 541.808594 C 252.785156 541.519531 252.894531 541.269531 253.128906 541.070312 C 253.347656 540.871094 253.617188 540.761719 253.921875 540.761719 C 254.320312 540.761719 254.664062 540.925781 254.96875 541.269531 C 255.257812 541.609375 255.421875 542.042969 255.421875 542.585938 C 255.421875 543.199219 255.203125 543.757812 254.789062 544.28125 C 254.375 544.804688 253.707031 545.199219 252.785156 545.507812 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 256.988281 536.613281 C 256.988281 535.261719 257.1875 534.089844 257.601562 533.097656 C 258.019531 532.121094 258.558594 531.382812 259.246094 530.894531 C 259.765625 530.515625 260.308594 530.335938 260.867188 530.335938 C 261.789062 530.335938 262.617188 530.804688 263.339844 531.726562 C 264.257812 532.878906 264.710938 534.449219 264.710938 536.433594 C 264.710938 537.824219 264.511719 538.996094 264.113281 539.96875 C 263.71875 540.941406 263.195312 541.648438 262.582031 542.078125 C 261.96875 542.511719 261.355469 542.710938 260.796875 542.710938 C 259.640625 542.710938 258.703125 542.0625 257.945312 540.707031 C 257.296875 539.589844 256.988281 538.21875 256.988281 536.613281 Z M 258.703125 536.847656 C 258.703125 538.488281 258.917969 539.824219 259.316406 540.871094 C 259.660156 541.738281 260.144531 542.167969 260.8125 542.167969 C 261.136719 542.167969 261.460938 542.042969 261.804688 541.753906 C 262.148438 541.464844 262.402344 540.996094 262.582031 540.3125 C 262.851562 539.300781 262.976562 537.894531 262.976562 536.054688 C 262.976562 534.683594 262.832031 533.546875 262.5625 532.644531 C 262.347656 531.960938 262.074219 531.492188 261.734375 531.203125 C 261.5 531.003906 261.210938 530.914062 260.867188 530.914062 C 260.472656 530.914062 260.109375 531.09375 259.804688 531.457031 C 259.371094 531.941406 259.082031 532.699219 258.9375 533.746094 C 258.792969 534.792969 258.703125 535.820312 258.703125 536.847656 "/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 1477.695312 L 2726.445312 1477.695312 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+</g>+<g clip-path="url(#clip11)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 233.390625 407.144531 L 245.296875 407.144531 L 245.296875 406.207031 L 233.390625 406.207031 L 233.390625 407.144531 Z M 233.390625 407.144531 "/>+</g>+<g clip-path="url(#clip12)" clip-rule="nonzero">+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 243.460938 406.191406 C 243.460938 404.835938 243.660156 403.664062 244.074219 402.671875 C 244.488281 401.699219 245.03125 400.957031 245.714844 400.472656 C 246.238281 400.09375 246.78125 399.914062 247.339844 399.914062 C 248.257812 399.914062 249.089844 400.382812 249.8125 401.300781 C 250.730469 402.457031 251.179688 404.023438 251.179688 406.007812 C 251.179688 407.398438 250.984375 408.570312 250.585938 409.542969 C 250.1875 410.519531 249.667969 411.222656 249.054688 411.65625 C 248.441406 412.089844 247.828125 412.285156 247.265625 412.285156 C 246.113281 412.285156 245.175781 411.636719 244.417969 410.285156 C 243.769531 409.164062 243.460938 407.796875 243.460938 406.191406 Z M 245.175781 406.425781 C 245.175781 408.066406 245.390625 409.402344 245.789062 410.445312 C 246.132812 411.3125 246.617188 411.746094 247.285156 411.746094 C 247.609375 411.746094 247.933594 411.617188 248.277344 411.332031 C 248.621094 411.042969 248.871094 410.574219 249.054688 409.886719 C 249.324219 408.878906 249.449219 407.46875 249.449219 405.628906 C 249.449219 404.257812 249.304688 403.125 249.035156 402.222656 C 248.820312 401.535156 248.546875 401.066406 248.207031 400.777344 C 247.972656 400.578125 247.683594 400.488281 247.339844 400.488281 C 246.941406 400.488281 246.582031 400.671875 246.273438 401.03125 C 245.84375 401.519531 245.554688 402.277344 245.410156 403.320312 C 245.265625 404.367188 245.175781 405.394531 245.175781 406.425781 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 252.785156 415.082031 L 252.785156 414.703125 C 253.398438 414.488281 253.867188 414.179688 254.195312 413.765625 C 254.519531 413.351562 254.699219 412.898438 254.699219 412.429688 C 254.699219 412.324219 254.664062 412.230469 254.609375 412.140625 C 254.574219 412.089844 254.535156 412.089844 254.480469 412.089844 C 254.429688 412.089844 254.285156 412.125 254.066406 412.25 C 253.960938 412.304688 253.851562 412.324219 253.726562 412.324219 C 253.453125 412.324219 253.21875 412.230469 253.039062 412.089844 C 252.875 411.925781 252.785156 411.691406 252.785156 411.382812 C 252.785156 411.097656 252.894531 410.84375 253.128906 410.644531 C 253.347656 410.445312 253.617188 410.339844 253.921875 410.339844 C 254.320312 410.339844 254.664062 410.5 254.96875 410.84375 C 255.257812 411.1875 255.421875 411.617188 255.421875 412.160156 C 255.421875 412.773438 255.203125 413.332031 254.789062 413.855469 C 254.375 414.378906 253.707031 414.777344 252.785156 415.082031 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 264.167969 400.148438 L 263.464844 401.644531 L 259.875 401.644531 L 259.101562 403.25 C 260.652344 403.484375 261.878906 404.0625 262.796875 404.980469 C 263.574219 405.792969 263.96875 406.730469 263.96875 407.8125 C 263.96875 408.445312 263.84375 409.023438 263.589844 409.542969 C 263.320312 410.085938 263.015625 410.535156 262.617188 410.914062 C 262.238281 411.292969 261.804688 411.601562 261.320312 411.816406 C 260.652344 412.125 259.964844 412.285156 259.246094 412.285156 C 258.523438 412.285156 258.019531 412.160156 257.675781 411.945312 C 257.351562 411.691406 257.1875 411.4375 257.1875 411.132812 C 257.1875 410.96875 257.261719 410.824219 257.40625 410.699219 C 257.53125 410.574219 257.710938 410.519531 257.910156 410.519531 C 258.054688 410.519531 258.199219 410.535156 258.304688 410.589844 C 258.414062 410.628906 258.613281 410.753906 258.902344 410.953125 C 259.335938 411.242188 259.785156 411.402344 260.234375 411.402344 C 260.921875 411.402344 261.515625 411.148438 262.039062 410.628906 C 262.5625 410.105469 262.816406 409.472656 262.816406 408.714844 C 262.816406 407.992188 262.597656 407.324219 262.128906 406.695312 C 261.660156 406.082031 261.03125 405.59375 260.199219 405.25 C 259.570312 404.980469 258.703125 404.835938 257.585938 404.800781 L 259.875 400.148438 "/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 2768.046875 L 2726.445312 2768.046875 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 4072.304688 L 2726.445312 4072.304688 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 243.460938 148.113281 C 243.460938 146.761719 243.660156 145.589844 244.074219 144.597656 C 244.488281 143.621094 245.03125 142.882812 245.714844 142.394531 C 246.238281 142.015625 246.78125 141.835938 247.339844 141.835938 C 248.257812 141.835938 249.089844 142.304688 249.8125 143.226562 C 250.730469 144.378906 251.179688 145.949219 251.179688 147.933594 C 251.179688 149.320312 250.984375 150.496094 250.585938 151.46875 C 250.1875 152.441406 249.667969 153.144531 249.054688 153.578125 C 248.441406 154.011719 247.828125 154.210938 247.265625 154.210938 C 246.113281 154.210938 245.175781 153.5625 244.417969 152.207031 C 243.769531 151.089844 243.460938 149.71875 243.460938 148.113281 Z M 245.175781 148.347656 C 245.175781 149.988281 245.390625 151.324219 245.789062 152.371094 C 246.132812 153.238281 246.617188 153.667969 247.285156 153.667969 C 247.609375 153.667969 247.933594 153.542969 248.277344 153.253906 C 248.621094 152.964844 248.871094 152.496094 249.054688 151.8125 C 249.324219 150.800781 249.449219 149.394531 249.449219 147.554688 C 249.449219 146.183594 249.304688 145.046875 249.035156 144.144531 C 248.820312 143.460938 248.546875 142.992188 248.207031 142.703125 C 247.972656 142.503906 247.683594 142.414062 247.339844 142.414062 C 246.941406 142.414062 246.582031 142.59375 246.273438 142.953125 C 245.84375 143.441406 245.554688 144.199219 245.410156 145.246094 C 245.265625 146.292969 245.175781 147.320312 245.175781 148.347656 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 252.785156 157.007812 L 252.785156 156.628906 C 253.398438 156.410156 253.867188 156.105469 254.195312 155.691406 C 254.519531 155.273438 254.699219 154.824219 254.699219 154.355469 C 254.699219 154.246094 254.664062 154.15625 254.609375 154.066406 C 254.574219 154.011719 254.535156 154.011719 254.480469 154.011719 C 254.429688 154.011719 254.285156 154.046875 254.066406 154.175781 C 253.960938 154.226562 253.851562 154.246094 253.726562 154.246094 C 253.453125 154.246094 253.21875 154.15625 253.039062 154.011719 C 252.875 153.851562 252.785156 153.613281 252.785156 153.308594 C 252.785156 153.019531 252.894531 152.765625 253.128906 152.570312 C 253.347656 152.371094 253.617188 152.261719 253.921875 152.261719 C 254.320312 152.261719 254.664062 152.425781 254.96875 152.765625 C 255.257812 153.109375 255.421875 153.542969 255.421875 154.085938 C 255.421875 154.699219 255.203125 155.257812 254.789062 155.78125 C 254.375 156.304688 253.707031 156.699219 252.785156 157.007812 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 264.167969 142.070312 L 263.464844 143.566406 L 259.875 143.566406 L 259.101562 145.171875 C 260.652344 145.40625 261.878906 145.984375 262.796875 146.90625 C 263.574219 147.71875 263.96875 148.65625 263.96875 149.738281 C 263.96875 150.367188 263.84375 150.945312 263.589844 151.46875 C 263.320312 152.011719 263.015625 152.460938 262.617188 152.839844 C 262.238281 153.21875 261.804688 153.523438 261.320312 153.742188 C 260.652344 154.046875 259.964844 154.210938 259.246094 154.210938 C 258.523438 154.210938 258.019531 154.085938 257.675781 153.867188 C 257.351562 153.613281 257.1875 153.363281 257.1875 153.054688 C 257.1875 152.894531 257.261719 152.75 257.40625 152.625 C 257.53125 152.496094 257.710938 152.441406 257.910156 152.441406 C 258.054688 152.441406 258.199219 152.460938 258.304688 152.515625 C 258.414062 152.550781 258.613281 152.675781 258.902344 152.875 C 259.335938 153.164062 259.785156 153.328125 260.234375 153.328125 C 260.921875 153.328125 261.515625 153.074219 262.039062 152.550781 C 262.5625 152.027344 262.816406 151.398438 262.816406 150.640625 C 262.816406 149.917969 262.597656 149.25 262.128906 148.617188 C 261.660156 148.003906 261.03125 147.519531 260.199219 147.175781 C 259.570312 146.90625 258.703125 146.761719 257.585938 146.726562 L 259.875 142.070312 "/>+<path style="fill: none; stroke-width: 13.875; stroke-linecap: square; stroke-linejoin: miter; stroke: rgb(0%,0%,0%); stroke-opacity: 1;stroke-miterlimit: 10; " d="M 2809.6875 5362.695312 L 2726.445312 5362.695312 " transform="matrix(0.1,0,0,-0.1,0,555)"/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 244.921875 14.207031 L 247.828125 12.800781 L 248.113281 12.800781 L 248.113281 22.882812 C 248.113281 23.550781 248.132812 23.964844 248.207031 24.128906 C 248.257812 24.289062 248.367188 24.414062 248.546875 24.507812 C 248.726562 24.597656 249.070312 24.648438 249.613281 24.648438 L 249.613281 24.976562 L 245.121094 24.976562 L 245.121094 24.648438 C 245.699219 24.648438 246.058594 24.597656 246.222656 24.507812 C 246.382812 24.433594 246.492188 24.308594 246.5625 24.164062 C 246.636719 24.019531 246.652344 23.605469 246.652344 22.882812 L 246.652344 16.425781 C 246.652344 15.558594 246.636719 15 246.5625 14.765625 C 246.527344 14.566406 246.457031 14.441406 246.347656 14.351562 C 246.238281 14.261719 246.113281 14.207031 245.949219 14.207031 C 245.734375 14.207031 245.425781 14.296875 245.046875 14.476562 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 252.785156 27.96875 L 252.785156 27.589844 C 253.398438 27.375 253.867188 27.066406 254.195312 26.652344 C 254.519531 26.238281 254.699219 25.785156 254.699219 25.316406 C 254.699219 25.210938 254.664062 25.121094 254.609375 25.027344 C 254.574219 24.976562 254.535156 24.976562 254.480469 24.976562 C 254.429688 24.976562 254.285156 25.011719 254.066406 25.136719 C 253.960938 25.191406 253.851562 25.210938 253.726562 25.210938 C 253.453125 25.210938 253.21875 25.121094 253.039062 24.976562 C 252.875 24.8125 252.785156 24.578125 252.785156 24.273438 C 252.785156 23.984375 252.894531 23.730469 253.128906 23.53125 C 253.347656 23.332031 253.617188 23.226562 253.921875 23.226562 C 254.320312 23.226562 254.664062 23.386719 254.96875 23.730469 C 255.257812 24.074219 255.421875 24.507812 255.421875 25.046875 C 255.421875 25.660156 255.203125 26.21875 254.789062 26.742188 C 254.375 27.265625 253.707031 27.664062 252.785156 27.96875 "/>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 256.988281 19.078125 C 256.988281 17.722656 257.1875 16.550781 257.601562 15.558594 C 258.019531 14.585938 258.558594 13.847656 259.246094 13.359375 C 259.765625 12.980469 260.308594 12.800781 260.867188 12.800781 C 261.789062 12.800781 262.617188 13.269531 263.339844 14.1875 C 264.257812 15.34375 264.710938 16.914062 264.710938 18.894531 C 264.710938 20.285156 264.511719 21.457031 264.113281 22.433594 C 263.71875 23.40625 263.195312 24.109375 262.582031 24.542969 C 261.96875 24.976562 261.355469 25.171875 260.796875 25.171875 C 259.640625 25.171875 258.703125 24.523438 257.945312 23.171875 C 257.296875 22.054688 256.988281 20.683594 256.988281 19.078125 Z M 258.703125 19.3125 C 258.703125 20.953125 258.917969 22.289062 259.316406 23.332031 C 259.660156 24.199219 260.144531 24.632812 260.8125 24.632812 C 261.136719 24.632812 261.460938 24.507812 261.804688 24.21875 C 262.148438 23.929688 262.402344 23.460938 262.582031 22.773438 C 262.851562 21.765625 262.976562 20.355469 262.976562 18.515625 C 262.976562 17.148438 262.832031 16.011719 262.5625 15.109375 C 262.347656 14.421875 262.074219 13.953125 261.734375 13.664062 C 261.5 13.46875 261.210938 13.375 260.867188 13.375 C 260.472656 13.375 260.109375 13.558594 259.804688 13.917969 C 259.371094 14.40625 259.082031 15.164062 258.9375 16.207031 C 258.792969 17.253906 258.703125 18.28125 258.703125 19.3125 "/>+</g>+</g>+</svg>
+ doc/www/files/tutorial/figures/portConstraints1.png view
binary file changed (absent → 53421 bytes)
+ doc/www/files/tutorial/figures/portConstraints2.png view
binary file changed (absent → 54921 bytes)
+ doc/www/files/tutorial/figures/processbox.svg view
@@ -0,0 +1,2235 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="125.31749"+ height="39.351902"+ viewBox="0 0 362.835 272.126"+ version="1.0"+ id="svg2"+ sodipodi:version="0.32"+ inkscape:version="0.46"+ sodipodi:docname="processbox.svg"+ inkscape:output_extension="org.inkscape.output.svg.inkscape">+ <metadata+ id="metadata7555">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <sodipodi:namedview+ inkscape:window-height="793"+ inkscape:window-width="962"+ inkscape:pageshadow="2"+ inkscape:pageopacity="0.0"+ guidetolerance="10.0"+ gridtolerance="10.0"+ objecttolerance="10.0"+ borderopacity="1.0"+ bordercolor="#666666"+ pagecolor="#ffffff"+ id="base"+ showgrid="false"+ inkscape:zoom="2.3944769"+ inkscape:cx="137.04171"+ inkscape:cy="102.98297"+ inkscape:window-x="247"+ inkscape:window-y="219"+ inkscape:current-layer="svg2" />+ <defs+ id="defs4">+ <inkscape:perspective+ sodipodi:type="inkscape:persp3d"+ inkscape:vp_x="0 : 170.07875 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_z="453.54373 : 170.07875 : 1"+ inkscape:persp3d-origin="226.77187 : 113.38583 : 1"+ id="perspective7557" />+ <g+ id="g6">+ <symbol+ overflow="visible"+ id="glyph20-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path9" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.265625,0 L 3.875,-4.171875 L 3.125,-4.171875 L 1.9375,-0.78125 L 0.828125,-4.171875 L 0.078125,-4.171875 L 1.546875,0 L 2.265625,0 z"+ id="path12" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.265625,-0.390625 C 4.1875,-0.375 4.15625,-0.375 4.125,-0.375 C 3.890625,-0.375 3.765625,-0.5 3.765625,-0.703125 L 3.765625,-3.15625 C 3.765625,-3.890625 3.21875,-4.296875 2.1875,-4.296875 C 1.578125,-4.296875 1.078125,-4.125 0.8125,-3.8125 C 0.609375,-3.59375 0.53125,-3.359375 0.515625,-2.9375 L 1.1875,-2.9375 C 1.25,-3.453125 1.546875,-3.6875 2.171875,-3.6875 C 2.765625,-3.6875 3.09375,-3.453125 3.09375,-3.0625 L 3.09375,-2.890625 C 3.09375,-2.609375 2.9375,-2.484375 2.40625,-2.421875 C 1.46875,-2.296875 1.328125,-2.265625 1.0625,-2.171875 C 0.578125,-1.96875 0.328125,-1.59375 0.328125,-1.046875 C 0.328125,-0.296875 0.859375,0.1875 1.703125,0.1875 C 2.234375,0.1875 2.65625,0 3.125,-0.4375 C 3.171875,-0.015625 3.375,0.1875 3.8125,0.1875 C 3.9375,0.1875 4.046875,0.171875 4.265625,0.109375 L 4.265625,-0.390625 z M 3.09375,-1.3125 C 3.09375,-1.09375 3.03125,-0.953125 2.84375,-0.765625 C 2.5625,-0.53125 2.234375,-0.390625 1.84375,-0.390625 C 1.328125,-0.390625 1.03125,-0.640625 1.03125,-1.0625 C 1.03125,-1.5 1.328125,-1.734375 2.03125,-1.828125 C 2.734375,-1.921875 2.875,-1.953125 3.09375,-2.0625 L 3.09375,-1.3125 z"+ id="path15" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.21875,-5.8125 L 0.546875,-5.8125 L 0.546875,0 L 1.21875,0 L 1.21875,-5.8125 z"+ id="path18" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.84375,0 L 3.84375,-4.171875 L 3.171875,-4.171875 L 3.171875,-1.8125 C 3.171875,-0.953125 2.734375,-0.390625 2.046875,-0.390625 C 1.515625,-0.390625 1.171875,-0.71875 1.171875,-1.21875 L 1.171875,-4.171875 L 0.515625,-4.171875 L 0.515625,-0.953125 C 0.515625,-0.265625 1.03125,0.1875 1.84375,0.1875 C 2.46875,0.1875 2.859375,-0.03125 3.25,-0.578125 L 3.25,0 L 3.84375,0 z"+ id="path21" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.09375,-1.859375 C 4.09375,-2.5 4.046875,-2.890625 3.921875,-3.203125 C 3.65625,-3.875 3.015625,-4.296875 2.234375,-4.296875 C 1.0625,-4.296875 0.3125,-3.40625 0.3125,-2.03125 C 0.3125,-0.65625 1.046875,0.1875 2.21875,0.1875 C 3.171875,0.1875 3.828125,-0.359375 4,-1.265625 L 3.328125,-1.265625 C 3.140625,-0.71875 2.765625,-0.4375 2.234375,-0.4375 C 1.8125,-0.4375 1.453125,-0.625 1.234375,-0.96875 C 1.078125,-1.21875 1.015625,-1.453125 1.015625,-1.859375 L 4.09375,-1.859375 z M 1.03125,-2.40625 C 1.078125,-3.171875 1.546875,-3.6875 2.21875,-3.6875 C 2.875,-3.6875 3.375,-3.140625 3.375,-2.453125 C 3.375,-2.4375 3.375,-2.421875 3.375,-2.40625 L 1.03125,-2.40625 z"+ id="path24" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.484375,-3.015625 C 3.484375,-3.828125 2.9375,-4.296875 1.96875,-4.296875 C 1,-4.296875 0.375,-3.796875 0.375,-3.015625 C 0.375,-2.359375 0.703125,-2.0625 1.703125,-1.8125 L 2.3125,-1.671875 C 2.78125,-1.546875 2.96875,-1.390625 2.96875,-1.078125 C 2.96875,-0.6875 2.578125,-0.4375 1.984375,-0.4375 C 1.640625,-0.4375 1.328125,-0.53125 1.15625,-0.703125 C 1.0625,-0.828125 1.015625,-0.953125 0.96875,-1.25 L 0.265625,-1.25 C 0.296875,-0.28125 0.84375,0.1875 1.9375,0.1875 C 2.984375,0.1875 3.65625,-0.328125 3.65625,-1.140625 C 3.65625,-1.765625 3.3125,-2.109375 2.484375,-2.296875 L 1.84375,-2.453125 C 1.296875,-2.578125 1.0625,-2.75 1.0625,-3.046875 C 1.0625,-3.4375 1.40625,-3.6875 1.953125,-3.6875 C 2.484375,-3.6875 2.765625,-3.453125 2.78125,-3.015625 L 3.484375,-3.015625 z"+ id="path27" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.0625,-4.171875 L 1.359375,-4.171875 L 1.359375,-4.828125 C 1.359375,-5.109375 1.515625,-5.25 1.828125,-5.25 C 1.875,-5.25 1.90625,-5.25 2.0625,-5.25 L 2.0625,-5.796875 C 1.90625,-5.828125 1.8125,-5.828125 1.6875,-5.828125 C 1.0625,-5.828125 0.703125,-5.484375 0.703125,-4.890625 L 0.703125,-4.171875 L 0.140625,-4.171875 L 0.140625,-3.640625 L 0.703125,-3.640625 L 0.703125,0 L 1.359375,0 L 1.359375,-3.640625 L 2.0625,-3.640625 L 2.0625,-4.171875 z"+ id="path30" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.5625,-4.171875 L 0.5625,0 L 1.234375,0 L 1.234375,-2.296875 C 1.234375,-3.15625 1.671875,-3.71875 2.359375,-3.71875 C 2.890625,-3.71875 3.21875,-3.390625 3.21875,-2.890625 L 3.21875,0 L 3.875,0 L 3.875,-3.15625 C 3.875,-3.84375 3.359375,-4.296875 2.5625,-4.296875 C 1.9375,-4.296875 1.53125,-4.0625 1.171875,-3.46875 L 1.171875,-4.171875 L 0.5625,-4.171875 z"+ id="path33" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.75,-2.765625 C 3.71875,-3.171875 3.640625,-3.4375 3.46875,-3.671875 C 3.1875,-4.0625 2.6875,-4.296875 2.109375,-4.296875 C 0.984375,-4.296875 0.25,-3.40625 0.25,-2.015625 C 0.25,-0.671875 0.96875,0.1875 2.09375,0.1875 C 3.09375,0.1875 3.71875,-0.421875 3.796875,-1.4375 L 3.125,-1.4375 C 3.015625,-0.765625 2.671875,-0.4375 2.109375,-0.4375 C 1.375,-0.4375 0.9375,-1.03125 0.9375,-2.015625 C 0.9375,-3.0625 1.375,-3.6875 2.09375,-3.6875 C 2.65625,-3.6875 3,-3.359375 3.078125,-2.765625 L 3.75,-2.765625 z"+ id="path36" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.03125,-4.171875 L 1.34375,-4.171875 L 1.34375,-5.328125 L 0.671875,-5.328125 L 0.671875,-4.171875 L 0.109375,-4.171875 L 0.109375,-3.640625 L 0.671875,-3.640625 L 0.671875,-0.484375 C 0.671875,-0.0625 0.96875,0.1875 1.484375,0.1875 C 1.640625,0.1875 1.796875,0.171875 2.03125,0.125 L 2.03125,-0.4375 C 1.9375,-0.40625 1.828125,-0.390625 1.703125,-0.390625 C 1.421875,-0.390625 1.34375,-0.484375 1.34375,-0.765625 L 1.34375,-3.640625 L 2.03125,-3.640625 L 2.03125,-4.171875 z"+ id="path39" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.1875,-4.171875 L 0.53125,-4.171875 L 0.53125,0 L 1.1875,0 L 1.1875,-4.171875 z M 1.1875,-5.8125 L 0.53125,-5.8125 L 0.53125,-4.96875 L 1.1875,-4.96875 L 1.1875,-5.8125 z"+ id="path42" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.171875,-4.296875 C 1,-4.296875 0.28125,-3.453125 0.28125,-2.0625 C 0.28125,-0.65625 0.984375,0.1875 2.171875,0.1875 C 3.34375,0.1875 4.0625,-0.65625 4.0625,-2.03125 C 4.0625,-3.46875 3.375,-4.296875 2.171875,-4.296875 z M 2.171875,-3.6875 C 2.921875,-3.6875 3.375,-3.0625 3.375,-2.03125 C 3.375,-1.046875 2.90625,-0.4375 2.171875,-0.4375 C 1.4375,-0.4375 0.984375,-1.046875 0.984375,-2.0625 C 0.984375,-3.0625 1.4375,-3.6875 2.171875,-3.6875 z"+ id="path45" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path48" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-2.828125 L 4.5,-2.828125 C 5.96875,-2.828125 6.90625,-3.875 6.90625,-5.484375 C 6.90625,-7.078125 6,-7.953125 4.34375,-7.953125 L 0.828125,-7.953125 L 0.828125,0 L 2.46875,0 L 2.46875,-2.828125 z M 2.46875,-4.203125 L 2.46875,-6.59375 L 3.984375,-6.59375 C 4.859375,-6.59375 5.265625,-6.203125 5.265625,-5.390625 C 5.265625,-4.578125 4.859375,-4.203125 3.984375,-4.203125 L 2.46875,-4.203125 z"+ id="path51" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.6875,-5.890625 L 0.6875,0 L 2.21875,0 L 2.21875,-3.125 C 2.21875,-4.03125 2.65625,-4.46875 3.5625,-4.46875 C 3.71875,-4.46875 3.828125,-4.453125 4.03125,-4.421875 L 4.03125,-5.984375 C 3.953125,-5.984375 3.890625,-5.984375 3.84375,-5.984375 C 3.15625,-5.984375 2.546875,-5.53125 2.21875,-4.734375 L 2.21875,-5.890625 L 0.6875,-5.890625 z"+ id="path54" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.28125,-5.984375 C 1.484375,-5.984375 0.375,-4.796875 0.375,-2.875 C 0.375,-0.921875 1.484375,0.25 3.296875,0.25 C 5.078125,0.25 6.203125,-0.9375 6.203125,-2.828125 C 6.203125,-4.828125 5.125,-5.984375 3.28125,-5.984375 z M 3.296875,-4.75 C 4.140625,-4.75 4.671875,-4 4.671875,-2.84375 C 4.671875,-1.75 4.109375,-0.984375 3.296875,-0.984375 C 2.46875,-0.984375 1.90625,-1.75 1.90625,-2.875 C 1.90625,-3.984375 2.46875,-4.75 3.296875,-4.75 z"+ id="path57" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.6875,-3.6875 C 5.578125,-5.125 4.625,-5.984375 3.15625,-5.984375 C 1.390625,-5.984375 0.375,-4.828125 0.375,-2.828125 C 0.375,-0.890625 1.390625,0.25 3.125,0.25 C 4.5625,0.25 5.546875,-0.625 5.6875,-2.046875 L 4.234375,-2.046875 C 4.03125,-1.28125 3.734375,-0.984375 3.140625,-0.984375 C 2.359375,-0.984375 1.890625,-1.671875 1.890625,-2.828125 C 1.890625,-3.375 2,-3.90625 2.1875,-4.25 C 2.359375,-4.578125 2.703125,-4.75 3.140625,-4.75 C 3.765625,-4.75 4.0625,-4.453125 4.234375,-3.6875 L 5.6875,-3.6875 z"+ id="path60" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.71875,-2.46875 C 5.71875,-2.59375 5.71875,-2.65625 5.71875,-2.71875 C 5.71875,-3.3125 5.640625,-3.859375 5.5,-4.28125 C 5.109375,-5.34375 4.15625,-5.984375 2.96875,-5.984375 C 1.28125,-5.984375 0.234375,-4.765625 0.234375,-2.796875 C 0.234375,-0.90625 1.265625,0.25 2.9375,0.25 C 4.25,0.25 5.328125,-0.5 5.65625,-1.65625 L 4.15625,-1.65625 C 3.96875,-1.1875 3.546875,-0.921875 2.984375,-0.921875 C 2.546875,-0.921875 2.203125,-1.09375 1.984375,-1.421875 C 1.84375,-1.640625 1.78125,-1.90625 1.765625,-2.46875 L 5.71875,-2.46875 z M 1.78125,-3.484375 C 1.890625,-4.375 2.265625,-4.828125 2.9375,-4.828125 C 3.328125,-4.828125 3.671875,-4.640625 3.890625,-4.328125 C 4.03125,-4.109375 4.09375,-3.875 4.140625,-3.484375 L 1.78125,-3.484375 z"+ id="path63" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.5,-3.984375 C 5.484375,-5.234375 4.53125,-5.984375 2.9375,-5.984375 C 1.453125,-5.984375 0.53125,-5.234375 0.53125,-4.03125 C 0.53125,-3.625 0.640625,-3.296875 0.84375,-3.0625 C 1.0625,-2.859375 1.25,-2.765625 1.8125,-2.578125 L 3.625,-2 C 4.015625,-1.890625 4.140625,-1.765625 4.140625,-1.53125 C 4.140625,-1.171875 3.71875,-0.953125 3.015625,-0.953125 C 2.625,-0.953125 2.296875,-1.03125 2.109375,-1.15625 C 1.9375,-1.28125 1.875,-1.390625 1.8125,-1.71875 L 0.3125,-1.71875 C 0.359375,-0.421875 1.3125,0.25 3.09375,0.25 C 3.921875,0.25 4.53125,0.078125 4.96875,-0.265625 C 5.40625,-0.625 5.671875,-1.171875 5.671875,-1.75 C 5.671875,-2.515625 5.296875,-3 4.515625,-3.234375 L 2.578125,-3.78125 C 2.15625,-3.921875 2.046875,-4 2.046875,-4.25 C 2.046875,-4.5625 2.40625,-4.78125 2.9375,-4.78125 C 3.671875,-4.78125 4.03125,-4.53125 4.03125,-3.984375 L 5.5,-3.984375 z"+ id="path66" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.6875,-5.890625 L 0.6875,0 L 2.21875,0 L 2.21875,-3.53125 C 2.21875,-4.234375 2.703125,-4.6875 3.453125,-4.6875 C 4.09375,-4.6875 4.421875,-4.328125 4.421875,-3.625 L 4.421875,0 L 5.953125,0 L 5.953125,-3.953125 C 5.953125,-5.25 5.234375,-5.984375 3.984375,-5.984375 C 3.1875,-5.984375 2.65625,-5.6875 2.21875,-5.03125 L 2.21875,-5.890625 L 0.6875,-5.890625 z"+ id="path69" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.28125,-5.765625 L 2.4375,-5.765625 L 2.4375,-7.34375 L 0.90625,-7.34375 L 0.90625,-5.765625 L 0.15625,-5.765625 L 0.15625,-4.75 L 0.90625,-4.75 L 0.90625,-1.140625 C 0.90625,-0.203125 1.390625,0.25 2.40625,0.25 C 2.734375,0.25 3.015625,0.21875 3.28125,0.125 L 3.28125,-0.9375 C 3.125,-0.921875 3.046875,-0.90625 2.9375,-0.90625 C 2.53125,-0.90625 2.4375,-1.03125 2.4375,-1.546875 L 2.4375,-4.75 L 3.28125,-4.75 L 3.28125,-5.765625 z"+ id="path72" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.90625,0 L 5.90625,-5.890625 L 4.375,-5.890625 L 4.375,-2.203125 C 4.375,-1.5 3.875,-1.046875 3.140625,-1.046875 C 2.484375,-1.046875 2.15625,-1.390625 2.15625,-2.109375 L 2.15625,-5.890625 L 0.625,-5.890625 L 0.625,-1.78125 C 0.625,-0.484375 1.359375,0.25 2.609375,0.25 C 3.40625,0.25 3.9375,-0.046875 4.375,-0.703125 L 4.375,0 L 5.90625,0 z"+ id="path75" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path78" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.828125,-3.078125 L 4.109375,-3.078125 C 4.6875,-3.078125 5.140625,-3.25 5.515625,-3.59375 C 5.96875,-4 6.15625,-4.46875 6.15625,-5.140625 C 6.15625,-6.5 5.34375,-7.265625 3.90625,-7.265625 L 0.90625,-7.265625 L 0.90625,0 L 1.828125,0 L 1.828125,-3.078125 z M 1.828125,-3.890625 L 1.828125,-6.453125 L 3.765625,-6.453125 C 4.65625,-6.453125 5.1875,-5.96875 5.1875,-5.171875 C 5.1875,-4.375 4.65625,-3.890625 3.765625,-3.890625 L 1.828125,-3.890625 z"+ id="path81" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.6875,-5.21875 L 0.6875,0 L 1.53125,0 L 1.53125,-2.71875 C 1.53125,-3.453125 1.71875,-3.953125 2.109375,-4.234375 C 2.375,-4.421875 2.625,-4.484375 3.203125,-4.5 L 3.203125,-5.34375 C 3.0625,-5.359375 2.984375,-5.375 2.875,-5.375 C 2.34375,-5.375 1.9375,-5.046875 1.453125,-4.28125 L 1.453125,-5.21875 L 0.6875,-5.21875 z"+ id="path84" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.71875,-5.375 C 1.25,-5.375 0.359375,-4.328125 0.359375,-2.578125 C 0.359375,-0.8125 1.234375,0.234375 2.71875,0.234375 C 4.1875,0.234375 5.078125,-0.8125 5.078125,-2.53125 C 5.078125,-4.34375 4.21875,-5.375 2.71875,-5.375 z M 2.71875,-4.609375 C 3.65625,-4.609375 4.21875,-3.84375 4.21875,-2.546875 C 4.21875,-1.3125 3.640625,-0.53125 2.71875,-0.53125 C 1.796875,-0.53125 1.21875,-1.3125 1.21875,-2.578125 C 1.21875,-3.828125 1.796875,-4.609375 2.71875,-4.609375 z"+ id="path87" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.6875,-3.46875 C 4.65625,-3.984375 4.546875,-4.3125 4.34375,-4.59375 C 3.984375,-5.078125 3.359375,-5.375 2.625,-5.375 C 1.21875,-5.375 0.3125,-4.25 0.3125,-2.515625 C 0.3125,-0.84375 1.203125,0.234375 2.625,0.234375 C 3.875,0.234375 4.65625,-0.515625 4.75,-1.796875 L 3.921875,-1.796875 C 3.78125,-0.953125 3.34375,-0.53125 2.640625,-0.53125 C 1.71875,-0.53125 1.171875,-1.28125 1.171875,-2.515625 C 1.171875,-3.828125 1.71875,-4.609375 2.625,-4.609375 C 3.3125,-4.609375 3.765625,-4.203125 3.859375,-3.46875 L 4.6875,-3.46875 z"+ id="path90" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.109375,-2.328125 C 5.109375,-3.125 5.046875,-3.609375 4.90625,-4 C 4.5625,-4.859375 3.765625,-5.375 2.796875,-5.375 C 1.328125,-5.375 0.40625,-4.25 0.40625,-2.546875 C 0.40625,-0.828125 1.3125,0.234375 2.765625,0.234375 C 3.96875,0.234375 4.796875,-0.453125 5,-1.578125 L 4.171875,-1.578125 C 3.9375,-0.890625 3.46875,-0.53125 2.796875,-0.53125 C 2.265625,-0.53125 1.828125,-0.78125 1.546875,-1.21875 C 1.34375,-1.515625 1.28125,-1.8125 1.265625,-2.328125 L 5.109375,-2.328125 z M 1.28125,-3.015625 C 1.359375,-3.984375 1.9375,-4.609375 2.78125,-4.609375 C 3.59375,-4.609375 4.234375,-3.921875 4.234375,-3.078125 C 4.234375,-3.046875 4.234375,-3.03125 4.21875,-3.015625 L 1.28125,-3.015625 z"+ id="path93" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.359375,-3.765625 C 4.359375,-4.796875 3.671875,-5.375 2.46875,-5.375 C 1.25,-5.375 0.46875,-4.75 0.46875,-3.78125 C 0.46875,-2.953125 0.890625,-2.578125 2.125,-2.265625 L 2.90625,-2.078125 C 3.484375,-1.9375 3.703125,-1.734375 3.703125,-1.359375 C 3.703125,-0.875 3.21875,-0.53125 2.5,-0.53125 C 2.046875,-0.53125 1.671875,-0.671875 1.453125,-0.890625 C 1.328125,-1.03125 1.265625,-1.1875 1.21875,-1.5625 L 0.34375,-1.5625 C 0.375,-0.34375 1.0625,0.234375 2.421875,0.234375 C 3.734375,0.234375 4.578125,-0.421875 4.578125,-1.421875 C 4.578125,-2.203125 4.140625,-2.625 3.09375,-2.875 L 2.296875,-3.078125 C 1.625,-3.234375 1.328125,-3.453125 1.328125,-3.8125 C 1.328125,-4.296875 1.765625,-4.609375 2.4375,-4.609375 C 3.109375,-4.609375 3.46875,-4.3125 3.484375,-3.765625 L 4.359375,-3.765625 z"+ id="path96" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.328125,-0.484375 C 5.25,-0.46875 5.203125,-0.46875 5.15625,-0.46875 C 4.859375,-0.46875 4.703125,-0.625 4.703125,-0.875 L 4.703125,-3.953125 C 4.703125,-4.875 4.03125,-5.375 2.734375,-5.375 C 1.984375,-5.375 1.359375,-5.15625 1,-4.765625 C 0.765625,-4.5 0.671875,-4.203125 0.640625,-3.671875 L 1.484375,-3.671875 C 1.5625,-4.3125 1.9375,-4.609375 2.71875,-4.609375 C 3.453125,-4.609375 3.875,-4.328125 3.875,-3.828125 L 3.875,-3.609375 C 3.875,-3.265625 3.671875,-3.109375 3.015625,-3.03125 C 1.828125,-2.875 1.65625,-2.84375 1.328125,-2.71875 C 0.734375,-2.46875 0.421875,-2 0.421875,-1.3125 C 0.421875,-0.375 1.078125,0.234375 2.140625,0.234375 C 2.796875,0.234375 3.3125,0 3.90625,-0.53125 C 3.96875,-0.015625 4.234375,0.234375 4.765625,0.234375 C 4.9375,0.234375 5.0625,0.203125 5.328125,0.140625 L 5.328125,-0.484375 z M 3.875,-1.640625 C 3.875,-1.359375 3.796875,-1.203125 3.546875,-0.96875 C 3.203125,-0.65625 2.796875,-0.5 2.3125,-0.5 C 1.671875,-0.5 1.28125,-0.8125 1.28125,-1.328125 C 1.28125,-1.890625 1.65625,-2.15625 2.546875,-2.296875 C 3.421875,-2.40625 3.59375,-2.453125 3.875,-2.578125 L 3.875,-1.640625 z"+ id="path99" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.9375,-7.265625 L 4.109375,-7.265625 L 4.109375,-4.5625 C 3.765625,-5.09375 3.203125,-5.375 2.5,-5.375 C 1.140625,-5.375 0.265625,-4.28125 0.265625,-2.625 C 0.265625,-0.859375 1.125,0.234375 2.53125,0.234375 C 3.25,0.234375 3.75,-0.046875 4.203125,-0.6875 L 4.203125,0 L 4.9375,0 L 4.9375,-7.265625 z M 2.640625,-4.59375 C 3.53125,-4.59375 4.109375,-3.796875 4.109375,-2.546875 C 4.109375,-1.34375 3.53125,-0.546875 2.65625,-0.546875 C 1.734375,-0.546875 1.125,-1.359375 1.125,-2.578125 C 1.125,-3.78125 1.734375,-4.59375 2.640625,-4.59375 z"+ id="path102" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.515625,-5.21875 L 1.640625,-5.21875 L 1.640625,-6.046875 C 1.640625,-6.390625 1.84375,-6.5625 2.21875,-6.5625 C 2.296875,-6.5625 2.328125,-6.5625 2.515625,-6.5625 L 2.515625,-7.25 C 2.328125,-7.28125 2.21875,-7.296875 2.046875,-7.296875 C 1.28125,-7.296875 0.8125,-6.859375 0.8125,-6.109375 L 0.8125,-5.21875 L 0.125,-5.21875 L 0.125,-4.546875 L 0.8125,-4.546875 L 0.8125,0 L 1.640625,0 L 1.640625,-4.546875 L 2.515625,-4.546875 L 2.515625,-5.21875 z M 4.34375,-5.21875 L 3.515625,-5.21875 L 3.515625,0 L 4.34375,0 L 4.34375,-5.21875 z M 4.34375,-7.265625 L 3.515625,-7.265625 L 3.515625,-6.21875 L 4.34375,-6.21875 L 4.34375,-7.265625 z"+ id="path105" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.703125,-5.21875 L 0.703125,0 L 1.53125,0 L 1.53125,-2.875 C 1.53125,-3.953125 2.09375,-4.640625 2.953125,-4.640625 C 3.609375,-4.640625 4.03125,-4.25 4.03125,-3.625 L 4.03125,0 L 4.859375,0 L 4.859375,-3.953125 C 4.859375,-4.8125 4.203125,-5.375 3.203125,-5.375 C 2.421875,-5.375 1.921875,-5.078125 1.46875,-4.34375 L 1.46875,-5.21875 L 0.703125,-5.21875 z"+ id="path108" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.578125,-5.21875 L 1.703125,-5.21875 L 1.703125,-6.046875 C 1.703125,-6.390625 1.90625,-6.5625 2.28125,-6.5625 C 2.359375,-6.5625 2.375,-6.5625 2.578125,-6.5625 L 2.578125,-7.25 C 2.375,-7.28125 2.265625,-7.296875 2.109375,-7.296875 C 1.328125,-7.296875 0.875,-6.859375 0.875,-6.109375 L 0.875,-5.21875 L 0.171875,-5.21875 L 0.171875,-4.546875 L 0.875,-4.546875 L 0.875,0 L 1.703125,0 L 1.703125,-4.546875 L 2.578125,-4.546875 L 2.578125,-5.21875 z"+ id="path111" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.8125,0 L 4.8125,-5.21875 L 3.984375,-5.21875 L 3.984375,-2.265625 C 3.984375,-1.203125 3.421875,-0.5 2.546875,-0.5 C 1.890625,-0.5 1.46875,-0.890625 1.46875,-1.53125 L 1.46875,-5.21875 L 0.640625,-5.21875 L 0.640625,-1.203125 C 0.640625,-0.328125 1.296875,0.234375 2.3125,0.234375 C 3.078125,0.234375 3.5625,-0.046875 4.0625,-0.734375 L 4.0625,0 L 4.8125,0 z"+ id="path114" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.53125,-5.21875 L 1.671875,-5.21875 L 1.671875,-6.65625 L 0.84375,-6.65625 L 0.84375,-5.21875 L 0.140625,-5.21875 L 0.140625,-4.546875 L 0.84375,-4.546875 L 0.84375,-0.59375 C 0.84375,-0.0625 1.203125,0.234375 1.859375,0.234375 C 2.046875,0.234375 2.25,0.203125 2.53125,0.15625 L 2.53125,-0.53125 C 2.421875,-0.515625 2.296875,-0.5 2.140625,-0.5 C 1.78125,-0.5 1.671875,-0.59375 1.671875,-0.96875 L 1.671875,-4.546875 L 2.53125,-4.546875 L 2.53125,-5.21875 z"+ id="path117" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.5,-5.21875 L 0.671875,-5.21875 L 0.671875,0 L 1.5,0 L 1.5,-5.21875 z M 1.5,-7.265625 L 0.65625,-7.265625 L 0.65625,-6.21875 L 1.5,-6.21875 L 1.5,-7.265625 z"+ id="path120" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.84375,0 L 4.84375,-5.21875 L 3.90625,-5.21875 L 2.4375,-0.984375 L 1.03125,-5.21875 L 0.09375,-5.21875 L 1.9375,0 L 2.84375,0 z"+ id="path123" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.109375,-5.21875 L 4.109375,-4.46875 C 3.6875,-5.078125 3.1875,-5.375 2.515625,-5.375 C 1.1875,-5.375 0.296875,-4.21875 0.296875,-2.515625 C 0.296875,-1.671875 0.515625,-0.96875 0.953125,-0.46875 C 1.328125,-0.03125 1.890625,0.234375 2.4375,0.234375 C 3.09375,0.234375 3.5625,-0.046875 4.03125,-0.703125 L 4.03125,-0.4375 C 4.03125,0.265625 3.9375,0.703125 3.734375,0.984375 C 3.515625,1.296875 3.078125,1.46875 2.578125,1.46875 C 2.1875,1.46875 1.859375,1.375 1.625,1.203125 C 1.4375,1.046875 1.359375,0.90625 1.3125,0.59375 L 0.453125,0.59375 C 0.546875,1.578125 1.3125,2.171875 2.546875,2.171875 C 3.3125,2.171875 3.984375,1.921875 4.328125,1.5 C 4.71875,1.03125 4.875,0.375 4.875,-0.859375 L 4.875,-5.21875 L 4.109375,-5.21875 z M 2.609375,-4.609375 C 3.5,-4.609375 4.03125,-3.84375 4.03125,-2.546875 C 4.03125,-1.296875 3.484375,-0.53125 2.609375,-0.53125 C 1.703125,-0.53125 1.15625,-1.3125 1.15625,-2.578125 C 1.15625,-3.828125 1.71875,-4.609375 2.609375,-4.609375 z"+ id="path126" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.515625,-7.265625 L 0.671875,-7.265625 L 0.671875,0 L 1.515625,0 L 1.515625,-7.265625 z"+ id="path129" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.90625,-1.03125 L 0.875,-1.03125 L 0.875,0 L 1.90625,0 L 1.90625,-1.03125 z"+ id="path132" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.59375,-5.015625 C 6.3125,-6.609375 5.390625,-7.390625 3.796875,-7.390625 C 2.828125,-7.390625 2.03125,-7.078125 1.5,-6.484375 C 0.84375,-5.765625 0.484375,-4.71875 0.484375,-3.546875 C 0.484375,-2.359375 0.84375,-1.328125 1.53125,-0.625 C 2.09375,-0.046875 2.8125,0.234375 3.765625,0.234375 C 5.53125,0.234375 6.53125,-0.734375 6.75,-2.65625 L 5.796875,-2.65625 C 5.71875,-2.15625 5.609375,-1.8125 5.46875,-1.53125 C 5.15625,-0.921875 4.546875,-0.59375 3.765625,-0.59375 C 2.328125,-0.59375 1.40625,-1.75 1.40625,-3.5625 C 1.40625,-5.421875 2.28125,-6.5625 3.6875,-6.5625 C 4.28125,-6.5625 4.828125,-6.390625 5.125,-6.109375 C 5.390625,-5.859375 5.546875,-5.546875 5.65625,-5.015625 L 6.59375,-5.015625 z"+ id="path135" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.53125,2.171875 L 1.375,2.171875 L 1.375,-0.546875 C 1.8125,-0.015625 2.296875,0.234375 2.984375,0.234375 C 4.328125,0.234375 5.21875,-0.859375 5.21875,-2.515625 C 5.21875,-4.28125 4.359375,-5.375 2.96875,-5.375 C 2.265625,-5.375 1.6875,-5.046875 1.3125,-4.4375 L 1.3125,-5.21875 L 0.53125,-5.21875 L 0.53125,2.171875 z M 2.828125,-4.59375 C 3.75,-4.59375 4.34375,-3.78125 4.34375,-2.546875 C 4.34375,-1.359375 3.734375,-0.546875 2.828125,-0.546875 C 1.953125,-0.546875 1.375,-1.34375 1.375,-2.578125 C 1.375,-3.796875 1.953125,-4.59375 2.828125,-4.59375 z"+ id="path138" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.140625,-1.03125 L 1.09375,-1.03125 L 1.09375,0 L 2.140625,0 L 2.140625,-1.03125 z M 2.140625,-5.21875 L 1.09375,-5.21875 L 1.09375,-4.1875 L 2.140625,-4.1875 L 2.140625,-5.21875 z"+ id="path141" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path144" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-3.65625 L 4.171875,-5.359375 L 7.859375,0 L 9.4375,0 L 5.140625,-6.203125 L 9.390625,-10.453125 L 7.671875,-10.453125 L 2.46875,-5.15625 L 2.46875,-10.453125 L 1.140625,-10.453125 L 1.140625,0 L 2.46875,0 L 2.46875,-3.65625 z"+ id="path147" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.359375,-3.359375 C 7.359375,-4.5 7.265625,-5.1875 7.0625,-5.75 C 6.5625,-6.984375 5.421875,-7.734375 4.015625,-7.734375 C 1.921875,-7.734375 0.578125,-6.125 0.578125,-3.65625 C 0.578125,-1.1875 1.875,0.328125 3.984375,0.328125 C 5.703125,0.328125 6.90625,-0.640625 7.203125,-2.28125 L 6,-2.28125 C 5.671875,-1.296875 4.984375,-0.78125 4.03125,-0.78125 C 3.265625,-0.78125 2.625,-1.125 2.21875,-1.75 C 1.9375,-2.1875 1.84375,-2.609375 1.828125,-3.359375 L 7.359375,-3.359375 z M 1.84375,-4.328125 C 1.953125,-5.71875 2.796875,-6.625 4,-6.625 C 5.171875,-6.625 6.078125,-5.65625 6.078125,-4.421875 C 6.078125,-4.390625 6.078125,-4.359375 6.0625,-4.328125 L 1.84375,-4.328125 z"+ id="path150" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.5625,-7.515625 L 3.484375,-1.65625 L 1.5625,-7.515625 L 0.28125,-7.515625 L 2.828125,0.03125 L 2.359375,1.21875 C 2.1875,1.75 1.90625,1.953125 1.40625,1.953125 C 1.234375,1.953125 1.03125,1.921875 0.78125,1.859375 L 0.78125,2.9375 C 1.015625,3.0625 1.265625,3.125 1.578125,3.125 C 1.96875,3.125 2.375,3 2.703125,2.765625 C 3.0625,2.5 3.28125,2.1875 3.515625,1.578125 L 6.859375,-7.515625 L 5.5625,-7.515625 z"+ id="path153" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.75,-4.984375 C 6.703125,-5.71875 6.546875,-6.203125 6.25,-6.609375 C 5.734375,-7.3125 4.828125,-7.734375 3.78125,-7.734375 C 1.765625,-7.734375 0.4375,-6.125 0.4375,-3.625 C 0.4375,-1.203125 1.734375,0.328125 3.765625,0.328125 C 5.5625,0.328125 6.703125,-0.75 6.84375,-2.578125 L 5.640625,-2.578125 C 5.4375,-1.375 4.8125,-0.78125 3.796875,-0.78125 C 2.484375,-0.78125 1.6875,-1.84375 1.6875,-3.625 C 1.6875,-5.515625 2.46875,-6.625 3.765625,-6.625 C 4.78125,-6.625 5.40625,-6.03125 5.546875,-4.984375 L 6.75,-4.984375 z"+ id="path156" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.90625,-7.734375 C 1.796875,-7.734375 0.515625,-6.21875 0.515625,-3.703125 C 0.515625,-1.171875 1.78125,0.328125 3.921875,0.328125 C 6.03125,0.328125 7.3125,-1.171875 7.3125,-3.640625 C 7.3125,-6.234375 6.0625,-7.734375 3.90625,-7.734375 z M 3.921875,-6.625 C 5.265625,-6.625 6.0625,-5.515625 6.0625,-3.65625 C 6.0625,-1.890625 5.234375,-0.78125 3.921875,-0.78125 C 2.578125,-0.78125 1.765625,-1.875 1.765625,-3.703125 C 1.765625,-5.515625 2.578125,-6.625 3.921875,-6.625 z"+ id="path159" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1,-7.515625 L 1,0 L 2.203125,0 L 2.203125,-4.140625 C 2.203125,-5.6875 3.015625,-6.6875 4.25,-6.6875 C 5.1875,-6.6875 5.796875,-6.109375 5.796875,-5.203125 L 5.796875,0 L 6.984375,0 L 6.984375,-5.6875 C 6.984375,-6.921875 6.046875,-7.734375 4.609375,-7.734375 C 3.484375,-7.734375 2.765625,-7.296875 2.109375,-6.25 L 2.109375,-7.515625 L 1,-7.515625 z"+ id="path162" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.78125,3.125 L 1.984375,3.125 L 1.984375,-0.78125 C 2.609375,-0.015625 3.3125,0.328125 4.28125,0.328125 C 6.21875,0.328125 7.5,-1.234375 7.5,-3.625 C 7.5,-6.15625 6.265625,-7.734375 4.28125,-7.734375 C 3.25,-7.734375 2.4375,-7.265625 1.875,-6.390625 L 1.875,-7.515625 L 0.78125,-7.515625 L 0.78125,3.125 z M 4.078125,-6.609375 C 5.390625,-6.609375 6.25,-5.453125 6.25,-3.65625 C 6.25,-1.953125 5.375,-0.78125 4.078125,-0.78125 C 2.8125,-0.78125 1.984375,-1.9375 1.984375,-3.703125 C 1.984375,-5.46875 2.8125,-6.609375 4.078125,-6.609375 z"+ id="path165" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.640625,-7.515625 L 2.40625,-7.515625 L 2.40625,-9.578125 L 1.21875,-9.578125 L 1.21875,-7.515625 L 0.203125,-7.515625 L 0.203125,-6.546875 L 1.21875,-6.546875 L 1.21875,-0.859375 C 1.21875,-0.09375 1.734375,0.328125 2.671875,0.328125 C 2.953125,0.328125 3.234375,0.296875 3.640625,0.234375 L 3.640625,-0.78125 C 3.484375,-0.734375 3.296875,-0.71875 3.0625,-0.71875 C 2.546875,-0.71875 2.40625,-0.859375 2.40625,-1.390625 L 2.40625,-6.546875 L 3.640625,-6.546875 L 3.640625,-7.515625 z"+ id="path168" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.28125,-5.421875 C 6.265625,-6.90625 5.296875,-7.734375 3.5625,-7.734375 C 1.8125,-7.734375 0.671875,-6.828125 0.671875,-5.4375 C 0.671875,-4.265625 1.28125,-3.703125 3.0625,-3.265625 L 4.171875,-3 C 5,-2.796875 5.328125,-2.5 5.328125,-1.953125 C 5.328125,-1.25 4.640625,-0.78125 3.578125,-0.78125 C 2.9375,-0.78125 2.390625,-0.96875 2.09375,-1.28125 C 1.90625,-1.484375 1.828125,-1.703125 1.75,-2.234375 L 0.484375,-2.234375 C 0.546875,-0.5 1.515625,0.328125 3.484375,0.328125 C 5.375,0.328125 6.578125,-0.609375 6.578125,-2.046875 C 6.578125,-3.171875 5.953125,-3.78125 4.453125,-4.140625 L 3.3125,-4.421875 C 2.34375,-4.640625 1.921875,-4.96875 1.921875,-5.5 C 1.921875,-6.1875 2.53125,-6.625 3.515625,-6.625 C 4.46875,-6.625 4.984375,-6.203125 5.015625,-5.421875 L 6.28125,-5.421875 z"+ id="path171" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.390625,-10.453125 C 1.953125,-8.578125 1.046875,-5.96875 1.046875,-3.71875 C 1.046875,-1.453125 1.953125,1.15625 3.390625,3.046875 L 4.171875,3.046875 C 2.90625,0.984375 2.203125,-1.421875 2.203125,-3.71875 C 2.203125,-6 2.90625,-8.421875 4.171875,-10.453125 L 3.390625,-10.453125 z"+ id="path174" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.78125,-10.453125 L 1.4375,-10.453125 L 1.4375,0 L 2.78125,0 L 2.78125,-10.453125 z"+ id="path177" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.328125,3.046875 C 2.765625,1.15625 3.671875,-1.453125 3.671875,-3.703125 C 3.671875,-5.96875 2.765625,-8.578125 1.328125,-10.453125 L 0.546875,-10.453125 C 1.8125,-8.40625 2.515625,-6 2.515625,-3.703125 C 2.515625,-1.421875 1.8125,1 0.546875,3.046875 L 1.328125,3.046875 z"+ id="path180" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path183" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.65625,-2.765625 L 3.703125,-2.765625 C 4.21875,-2.765625 4.625,-2.921875 4.96875,-3.234375 C 5.359375,-3.59375 5.53125,-4.015625 5.53125,-4.625 C 5.53125,-5.84375 4.8125,-6.53125 3.515625,-6.53125 L 0.8125,-6.53125 L 0.8125,0 L 1.65625,0 L 1.65625,-2.765625 z M 1.65625,-3.5 L 1.65625,-5.796875 L 3.390625,-5.796875 C 4.1875,-5.796875 4.65625,-5.375 4.65625,-4.65625 C 4.65625,-3.9375 4.1875,-3.5 3.390625,-3.5 L 1.65625,-3.5 z"+ id="path186" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-4.703125 L 0.625,0 L 1.375,0 L 1.375,-2.4375 C 1.375,-3.109375 1.546875,-3.546875 1.90625,-3.8125 C 2.140625,-3.984375 2.359375,-4.03125 2.875,-4.046875 L 2.875,-4.8125 C 2.75,-4.828125 2.6875,-4.828125 2.59375,-4.828125 C 2.109375,-4.828125 1.734375,-4.546875 1.3125,-3.84375 L 1.3125,-4.703125 L 0.625,-4.703125 z"+ id="path189" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.4375,-4.828125 C 1.125,-4.828125 0.328125,-3.890625 0.328125,-2.3125 C 0.328125,-0.734375 1.109375,0.203125 2.453125,0.203125 C 3.765625,0.203125 4.578125,-0.734375 4.578125,-2.28125 C 4.578125,-3.90625 3.796875,-4.828125 2.4375,-4.828125 z M 2.453125,-4.140625 C 3.296875,-4.140625 3.796875,-3.453125 3.796875,-2.28125 C 3.796875,-1.1875 3.28125,-0.484375 2.453125,-0.484375 C 1.609375,-0.484375 1.109375,-1.171875 1.109375,-2.3125 C 1.109375,-3.4375 1.609375,-4.140625 2.453125,-4.140625 z"+ id="path192" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.21875,-3.125 C 4.1875,-3.578125 4.09375,-3.875 3.90625,-4.140625 C 3.59375,-4.578125 3.015625,-4.828125 2.375,-4.828125 C 1.109375,-4.828125 0.28125,-3.828125 0.28125,-2.265625 C 0.28125,-0.75 1.078125,0.203125 2.359375,0.203125 C 3.484375,0.203125 4.1875,-0.46875 4.28125,-1.609375 L 3.53125,-1.609375 C 3.40625,-0.859375 3.015625,-0.484375 2.375,-0.484375 C 1.546875,-0.484375 1.0625,-1.15625 1.0625,-2.265625 C 1.0625,-3.4375 1.546875,-4.140625 2.359375,-4.140625 C 2.984375,-4.140625 3.375,-3.78125 3.46875,-3.125 L 4.21875,-3.125 z"+ id="path195" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.59375,-2.09375 C 4.59375,-2.8125 4.546875,-3.25 4.40625,-3.59375 C 4.109375,-4.375 3.390625,-4.828125 2.515625,-4.828125 C 1.203125,-4.828125 0.359375,-3.828125 0.359375,-2.28125 C 0.359375,-0.75 1.171875,0.203125 2.5,0.203125 C 3.5625,0.203125 4.3125,-0.40625 4.5,-1.421875 L 3.75,-1.421875 C 3.546875,-0.8125 3.125,-0.484375 2.515625,-0.484375 C 2.046875,-0.484375 1.640625,-0.703125 1.390625,-1.09375 C 1.203125,-1.359375 1.140625,-1.625 1.140625,-2.09375 L 4.59375,-2.09375 z M 1.15625,-2.703125 C 1.21875,-3.578125 1.75,-4.140625 2.5,-4.140625 C 3.234375,-4.140625 3.796875,-3.53125 3.796875,-2.765625 C 3.796875,-2.75 3.796875,-2.71875 3.796875,-2.703125 L 1.15625,-2.703125 z"+ id="path198" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.921875,-3.390625 C 3.921875,-4.3125 3.3125,-4.828125 2.21875,-4.828125 C 1.125,-4.828125 0.421875,-4.265625 0.421875,-3.40625 C 0.421875,-2.65625 0.796875,-2.3125 1.90625,-2.046875 L 2.609375,-1.875 C 3.125,-1.75 3.34375,-1.5625 3.34375,-1.21875 C 3.34375,-0.78125 2.890625,-0.484375 2.25,-0.484375 C 1.84375,-0.484375 1.5,-0.59375 1.3125,-0.796875 C 1.1875,-0.9375 1.140625,-1.0625 1.09375,-1.40625 L 0.3125,-1.40625 C 0.34375,-0.3125 0.953125,0.203125 2.171875,0.203125 C 3.359375,0.203125 4.109375,-0.375 4.109375,-1.28125 C 4.109375,-1.984375 3.71875,-2.375 2.796875,-2.59375 L 2.078125,-2.765625 C 1.46875,-2.90625 1.203125,-3.109375 1.203125,-3.4375 C 1.203125,-3.859375 1.59375,-4.140625 2.203125,-4.140625 C 2.796875,-4.140625 3.125,-3.890625 3.140625,-3.390625 L 3.921875,-3.390625 z"+ id="path201" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.796875,-0.4375 C 4.71875,-0.421875 4.6875,-0.421875 4.640625,-0.421875 C 4.375,-0.421875 4.234375,-0.5625 4.234375,-0.796875 L 4.234375,-3.546875 C 4.234375,-4.390625 3.625,-4.828125 2.46875,-4.828125 C 1.78125,-4.828125 1.21875,-4.640625 0.90625,-4.28125 C 0.6875,-4.046875 0.59375,-3.78125 0.578125,-3.3125 L 1.34375,-3.3125 C 1.40625,-3.890625 1.734375,-4.140625 2.4375,-4.140625 C 3.109375,-4.140625 3.484375,-3.890625 3.484375,-3.4375 L 3.484375,-3.25 C 3.484375,-2.9375 3.296875,-2.796875 2.703125,-2.71875 C 1.65625,-2.59375 1.484375,-2.5625 1.203125,-2.4375 C 0.65625,-2.21875 0.375,-1.796875 0.375,-1.1875 C 0.375,-0.328125 0.96875,0.203125 1.921875,0.203125 C 2.515625,0.203125 2.984375,0 3.515625,-0.484375 C 3.5625,-0.015625 3.796875,0.203125 4.28125,0.203125 C 4.4375,0.203125 4.5625,0.1875 4.796875,0.125 L 4.796875,-0.4375 z M 3.484375,-1.484375 C 3.484375,-1.234375 3.421875,-1.078125 3.1875,-0.875 C 2.890625,-0.59375 2.515625,-0.453125 2.078125,-0.453125 C 1.5,-0.453125 1.15625,-0.71875 1.15625,-1.203125 C 1.15625,-1.6875 1.484375,-1.953125 2.28125,-2.0625 C 3.078125,-2.171875 3.234375,-2.203125 3.484375,-2.328125 L 3.484375,-1.484375 z"+ id="path204" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-4.703125 L 0.625,0 L 1.375,0 L 1.375,-2.59375 C 1.375,-3.546875 1.890625,-4.171875 2.65625,-4.171875 C 3.25,-4.171875 3.625,-3.828125 3.625,-3.25 L 3.625,0 L 4.375,0 L 4.375,-3.546875 C 4.375,-4.328125 3.78125,-4.828125 2.875,-4.828125 C 2.171875,-4.828125 1.734375,-4.5625 1.3125,-3.90625 L 1.3125,-4.703125 L 0.625,-4.703125 z"+ id="path207" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.4375,-6.53125 L 3.6875,-6.53125 L 3.6875,-4.109375 C 3.375,-4.578125 2.875,-4.828125 2.25,-4.828125 C 1.03125,-4.828125 0.234375,-3.859375 0.234375,-2.359375 C 0.234375,-0.765625 1.015625,0.203125 2.28125,0.203125 C 2.921875,0.203125 3.375,-0.03125 3.78125,-0.625 L 3.78125,0 L 4.4375,0 L 4.4375,-6.53125 z M 2.375,-4.140625 C 3.1875,-4.140625 3.6875,-3.421875 3.6875,-2.296875 C 3.6875,-1.203125 3.171875,-0.5 2.390625,-0.5 C 1.5625,-0.5 1.015625,-1.21875 1.015625,-2.3125 C 1.015625,-3.40625 1.5625,-4.140625 2.375,-4.140625 z"+ id="path210" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.9375,-4.515625 C 5.671875,-5.953125 4.859375,-6.640625 3.421875,-6.640625 C 2.53125,-6.640625 1.828125,-6.375 1.34375,-5.828125 C 0.75,-5.1875 0.4375,-4.25 0.4375,-3.1875 C 0.4375,-2.109375 0.765625,-1.1875 1.375,-0.5625 C 1.890625,-0.03125 2.53125,0.203125 3.375,0.203125 C 4.984375,0.203125 5.875,-0.65625 6.078125,-2.390625 L 5.203125,-2.390625 C 5.140625,-1.9375 5.046875,-1.625 4.921875,-1.375 C 4.640625,-0.828125 4.09375,-0.53125 3.390625,-0.53125 C 2.09375,-0.53125 1.265625,-1.5625 1.265625,-3.203125 C 1.265625,-4.875 2.046875,-5.90625 3.3125,-5.90625 C 3.84375,-5.90625 4.34375,-5.75 4.609375,-5.5 C 4.859375,-5.28125 4.984375,-5 5.078125,-4.515625 L 5.9375,-4.515625 z"+ id="path213" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.28125,-4.703125 L 1.5,-4.703125 L 1.5,-5.984375 L 0.765625,-5.984375 L 0.765625,-4.703125 L 0.125,-4.703125 L 0.125,-4.09375 L 0.765625,-4.09375 L 0.765625,-0.53125 C 0.765625,-0.0625 1.078125,0.203125 1.671875,0.203125 C 1.84375,0.203125 2.03125,0.1875 2.28125,0.140625 L 2.28125,-0.484375 C 2.171875,-0.453125 2.0625,-0.453125 1.921875,-0.453125 C 1.59375,-0.453125 1.5,-0.53125 1.5,-0.875 L 1.5,-4.09375 L 2.28125,-4.09375 L 2.28125,-4.703125 z"+ id="path216" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.328125,0 L 4.328125,-4.703125 L 3.578125,-4.703125 L 3.578125,-2.03125 C 3.578125,-1.078125 3.078125,-0.453125 2.296875,-0.453125 C 1.703125,-0.453125 1.328125,-0.8125 1.328125,-1.375 L 1.328125,-4.703125 L 0.578125,-4.703125 L 0.578125,-1.078125 C 0.578125,-0.296875 1.171875,0.203125 2.078125,0.203125 C 2.765625,0.203125 3.203125,-0.03125 3.65625,-0.65625 L 3.65625,0 L 4.328125,0 z"+ id="path219" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.515625,0 L 5.78125,-6.53125 L 4.890625,-6.53125 L 3.078125,-1 L 1.171875,-6.53125 L 0.265625,-6.53125 L 2.625,0 L 3.515625,0 z"+ id="path222" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.359375,-6.53125 L 0.609375,-6.53125 L 0.609375,0 L 1.359375,0 L 1.359375,-6.53125 z"+ id="path225" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.921875,-0.9375 L 0.984375,-0.9375 L 0.984375,0 L 1.921875,0 L 1.921875,-0.9375 z M 1.921875,-4.703125 L 0.984375,-4.703125 L 0.984375,-3.765625 L 1.921875,-3.765625 L 1.921875,-4.703125 z"+ id="path228" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.484375,1.953125 L 1.234375,1.953125 L 1.234375,-0.5 C 1.625,-0.015625 2.078125,0.203125 2.6875,0.203125 C 3.890625,0.203125 4.6875,-0.765625 4.6875,-2.265625 C 4.6875,-3.84375 3.921875,-4.828125 2.671875,-4.828125 C 2.03125,-4.828125 1.53125,-4.546875 1.171875,-3.984375 L 1.171875,-4.703125 L 0.484375,-4.703125 L 0.484375,1.953125 z M 2.546875,-4.140625 C 3.375,-4.140625 3.90625,-3.40625 3.90625,-2.28125 C 3.90625,-1.21875 3.359375,-0.5 2.546875,-0.5 C 1.765625,-0.5 1.234375,-1.203125 1.234375,-2.3125 C 1.234375,-3.421875 1.765625,-4.140625 2.546875,-4.140625 z"+ id="path231" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.265625,-4.703125 L 1.484375,-4.703125 L 1.484375,-5.4375 C 1.484375,-5.75 1.65625,-5.90625 2,-5.90625 C 2.0625,-5.90625 2.09375,-5.90625 2.265625,-5.90625 L 2.265625,-6.515625 C 2.09375,-6.5625 1.984375,-6.5625 1.84375,-6.5625 C 1.140625,-6.5625 0.734375,-6.171875 0.734375,-5.5 L 0.734375,-4.703125 L 0.109375,-4.703125 L 0.109375,-4.09375 L 0.734375,-4.09375 L 0.734375,0 L 1.484375,0 L 1.484375,-4.09375 L 2.265625,-4.09375 L 2.265625,-4.703125 z M 3.90625,-4.703125 L 3.171875,-4.703125 L 3.171875,0 L 3.90625,0 L 3.90625,-4.703125 z M 3.90625,-6.53125 L 3.171875,-6.53125 L 3.171875,-5.59375 L 3.90625,-5.59375 L 3.90625,-6.53125 z"+ id="path234" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.6875,-4.703125 L 3.6875,-4.015625 C 3.3125,-4.578125 2.859375,-4.828125 2.265625,-4.828125 C 1.0625,-4.828125 0.265625,-3.796875 0.265625,-2.265625 C 0.265625,-1.5 0.46875,-0.875 0.859375,-0.421875 C 1.203125,-0.03125 1.703125,0.203125 2.203125,0.203125 C 2.796875,0.203125 3.203125,-0.046875 3.625,-0.640625 L 3.625,-0.390625 C 3.625,0.234375 3.546875,0.625 3.359375,0.890625 C 3.15625,1.171875 2.765625,1.328125 2.3125,1.328125 C 1.96875,1.328125 1.671875,1.234375 1.46875,1.078125 C 1.296875,0.9375 1.21875,0.8125 1.171875,0.53125 L 0.40625,0.53125 C 0.5,1.421875 1.1875,1.953125 2.28125,1.953125 C 2.984375,1.953125 3.59375,1.734375 3.890625,1.359375 C 4.25,0.921875 4.390625,0.328125 4.390625,-0.765625 L 4.390625,-4.703125 L 3.6875,-4.703125 z M 2.34375,-4.140625 C 3.140625,-4.140625 3.625,-3.46875 3.625,-2.28125 C 3.625,-1.171875 3.140625,-0.484375 2.34375,-0.484375 C 1.53125,-0.484375 1.046875,-1.171875 1.046875,-2.3125 C 1.046875,-3.4375 1.546875,-4.140625 2.34375,-4.140625 z"+ id="path237" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.34375,-4.703125 L 0.59375,-4.703125 L 0.59375,0 L 1.34375,0 L 1.34375,-4.703125 z M 1.34375,-6.53125 L 0.59375,-6.53125 L 0.59375,-5.59375 L 1.34375,-5.59375 L 1.34375,-6.53125 z"+ id="path240" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-4.703125 L 0.625,0 L 1.375,0 L 1.375,-2.953125 C 1.375,-3.625 1.875,-4.171875 2.484375,-4.171875 C 3.046875,-4.171875 3.359375,-3.84375 3.359375,-3.234375 L 3.359375,0 L 4.109375,0 L 4.109375,-2.953125 C 4.109375,-3.625 4.59375,-4.171875 5.203125,-4.171875 C 5.765625,-4.171875 6.078125,-3.828125 6.078125,-3.234375 L 6.078125,0 L 6.828125,0 L 6.828125,-3.53125 C 6.828125,-4.375 6.34375,-4.828125 5.46875,-4.828125 C 4.84375,-4.828125 4.46875,-4.640625 4.03125,-4.109375 C 3.75,-4.625 3.375,-4.828125 2.765625,-4.828125 C 2.140625,-4.828125 1.71875,-4.59375 1.3125,-4.03125 L 1.3125,-4.703125 L 0.625,-4.703125 z"+ id="path243" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.71875,-0.9375 L 0.78125,-0.9375 L 0.78125,0 L 1.71875,0 L 1.71875,-0.9375 z"+ id="path246" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-22"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-2.984375 L 4.765625,-2.984375 L 4.765625,-3.71875 L 1.640625,-3.71875 L 1.640625,-5.796875 L 5.1875,-5.796875 L 5.1875,-6.53125 L 0.8125,-6.53125 L 0.8125,0 L 1.640625,0 L 1.640625,-2.984375 z"+ id="path249" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-23"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.484375,-6.53125 L 0.484375,0 L 1.15625,0 L 1.15625,-0.59375 C 1.515625,-0.046875 1.984375,0.203125 2.640625,0.203125 C 3.890625,0.203125 4.6875,-0.8125 4.6875,-2.375 C 4.6875,-3.890625 3.921875,-4.828125 2.6875,-4.828125 C 2.03125,-4.828125 1.578125,-4.59375 1.234375,-4.0625 L 1.234375,-6.53125 L 0.484375,-6.53125 z M 2.53125,-4.140625 C 3.375,-4.140625 3.90625,-3.40625 3.90625,-2.28125 C 3.90625,-1.21875 3.359375,-0.5 2.53125,-0.5 C 1.75,-0.5 1.234375,-1.203125 1.234375,-2.3125 C 1.234375,-3.421875 1.75,-4.140625 2.53125,-4.140625 z"+ id="path252" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-24"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-6.53125 L 0.625,0 L 1.375,0 L 1.375,-2.59375 C 1.375,-3.546875 1.875,-4.171875 2.640625,-4.171875 C 2.890625,-4.171875 3.125,-4.09375 3.3125,-3.96875 C 3.53125,-3.8125 3.609375,-3.59375 3.609375,-3.25 L 3.609375,0 L 4.359375,0 L 4.359375,-3.546875 C 4.359375,-4.34375 3.796875,-4.828125 2.875,-4.828125 C 2.21875,-4.828125 1.8125,-4.625 1.375,-4.046875 L 1.375,-6.53125 L 0.625,-6.53125 z"+ id="path255" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-25"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.5625,0 L 4.359375,-4.703125 L 3.515625,-4.703125 L 2.1875,-0.890625 L 0.9375,-4.703125 L 0.09375,-4.703125 L 1.734375,0 L 2.5625,0 z"+ id="path258" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-26"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.796875,-6.53125 L 5,-6.53125 L 5,-1.1875 L 1.59375,-6.53125 L 0.6875,-6.53125 L 0.6875,0 L 1.46875,0 L 1.46875,-5.296875 L 4.859375,0 L 5.796875,0 L 5.796875,-6.53125 z"+ id="path261" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-27"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.171875,-5.796875 L 5.3125,-5.796875 L 5.3125,-6.53125 L 0.1875,-6.53125 L 0.1875,-5.796875 L 2.34375,-5.796875 L 2.34375,0 L 3.171875,0 L 3.171875,-5.796875 z"+ id="path264" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-28"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.3125,-4.703125 L 1.53125,-4.703125 L 1.53125,-5.4375 C 1.53125,-5.75 1.71875,-5.90625 2.046875,-5.90625 C 2.109375,-5.90625 2.140625,-5.90625 2.3125,-5.90625 L 2.3125,-6.515625 C 2.140625,-6.5625 2.046875,-6.5625 1.890625,-6.5625 C 1.203125,-6.5625 0.796875,-6.171875 0.796875,-5.5 L 0.796875,-4.703125 L 0.15625,-4.703125 L 0.15625,-4.09375 L 0.796875,-4.09375 L 0.796875,0 L 1.53125,0 L 1.53125,-4.09375 L 2.3125,-4.09375 L 2.3125,-4.703125 z"+ id="path267" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-29"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.484375,-4.703125 L 2.171875,-1.046875 L 0.984375,-4.703125 L 0.171875,-4.703125 L 1.765625,0.015625 L 1.484375,0.765625 C 1.359375,1.09375 1.1875,1.21875 0.875,1.21875 C 0.765625,1.21875 0.640625,1.203125 0.484375,1.171875 L 0.484375,1.84375 C 0.640625,1.921875 0.796875,1.953125 0.984375,1.953125 C 1.234375,1.953125 1.484375,1.875 1.6875,1.734375 C 1.921875,1.5625 2.046875,1.359375 2.203125,0.984375 L 4.28125,-4.703125 L 3.484375,-4.703125 z"+ id="path270" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-30"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.78125,-0.9375 L 0.78125,0 L 1.3125,0 L 1.3125,0.15625 C 1.3125,0.78125 1.203125,0.953125 0.78125,0.984375 L 0.78125,1.3125 C 1.40625,1.3125 1.71875,0.921875 1.71875,0.140625 L 1.71875,-0.9375 L 0.78125,-0.9375 z"+ id="path273" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path276" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.265625,-3.65625 L 0.484375,0 L 1.078125,0 L 1.5,-2.015625 C 1.671875,-2.78125 2.15625,-3.25 2.78125,-3.25 C 3.125,-3.25 3.390625,-3.015625 3.390625,-2.6875 C 3.390625,-2.640625 3.375,-2.546875 3.34375,-2.4375 L 2.828125,0 L 3.421875,0 L 3.96875,-2.625 C 4,-2.703125 4,-2.796875 4,-2.890625 C 4,-3.421875 3.625,-3.75 3.046875,-3.75 C 2.515625,-3.75 2.0625,-3.5625 1.703125,-3.203125 L 1.796875,-3.65625 L 1.265625,-3.65625 z"+ id="path279" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.265625,-3.65625 L 0.5,0 L 1.078125,0 L 1.5625,-2.296875 C 1.671875,-2.828125 2.15625,-3.25 2.625,-3.25 C 2.96875,-3.25 3.1875,-3.0625 3.1875,-2.78125 C 3.1875,-2.703125 3.1875,-2.609375 3.15625,-2.515625 L 2.625,0 L 3.21875,0 L 3.703125,-2.296875 C 3.8125,-2.84375 4.296875,-3.25 4.796875,-3.25 C 5.125,-3.25 5.328125,-3.046875 5.328125,-2.71875 C 5.328125,-2.609375 5.328125,-2.609375 5.265625,-2.375 L 4.765625,0 L 5.34375,0 L 5.890625,-2.59375 C 5.921875,-2.671875 5.9375,-2.90625 5.9375,-2.984375 C 5.9375,-3.15625 5.859375,-3.359375 5.71875,-3.515625 C 5.5625,-3.6875 5.375,-3.75 5.046875,-3.75 C 4.59375,-3.75 4.203125,-3.578125 3.796875,-3.171875 C 3.671875,-3.5625 3.40625,-3.75 2.953125,-3.75 C 2.46875,-3.75 2.15625,-3.609375 1.703125,-3.203125 L 1.796875,-3.65625 L 1.265625,-3.65625 z"+ id="path282" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path285" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.65625,-3.984375 L 0.890625,-3.984375 L 0.890625,-3.203125 L 1.65625,-3.203125 L 1.65625,-3.984375 z M 0.890625,-0.765625 L 0.890625,0 L 1.65625,0 L 1.65625,-0.765625 L 0.890625,-0.765625 z"+ id="path288" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.34375,-3 C 6.46875,-3 6.640625,-3 6.640625,-3.1875 C 6.640625,-3.375 6.453125,-3.375 6.3125,-3.375 L 0.84375,-3.375 C 0.703125,-3.375 0.515625,-3.375 0.515625,-3.1875 C 0.515625,-3 0.6875,-3 0.8125,-3 L 6.34375,-3 z M 6.3125,-1.109375 C 6.453125,-1.109375 6.640625,-1.109375 6.640625,-1.3125 C 6.640625,-1.5 6.46875,-1.5 6.34375,-1.5 L 0.8125,-1.5 C 0.6875,-1.5 0.515625,-1.5 0.515625,-1.3125 C 0.515625,-1.109375 0.703125,-1.109375 0.84375,-1.109375 L 6.3125,-1.109375 z"+ id="path291" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.484375,-6.734375 C 1.421875,-5.84375 0.71875,-4.3125 0.71875,-2.25 C 0.71875,-0.109375 1.46875,1.375 2.484375,2.234375 L 3.0625,2.234375 C 2.578125,1.734375 1.46875,0.59375 1.46875,-2.25 C 1.46875,-5.078125 2.578125,-6.21875 3.0625,-6.734375 L 2.484375,-6.734375 z"+ id="path294" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,2.234375 C 2.15625,1.34375 2.859375,-0.1875 2.859375,-2.25 C 2.859375,-4.375 2.109375,-5.875 1.09375,-6.734375 L 0.515625,-6.734375 C 1,-6.234375 2.109375,-5.078125 2.109375,-2.25 C 2.109375,0.59375 1,1.734375 0.515625,2.234375 L 1.09375,2.234375 z"+ id="path297" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph14-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path300" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph14-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.765625,-0.484375 C 1.765625,-0.75 1.546875,-0.96875 1.28125,-0.96875 C 1,-0.96875 0.796875,-0.75 0.796875,-0.484375 C 0.796875,-0.21875 1,0 1.28125,0 C 1.546875,0 1.765625,-0.21875 1.765625,-0.484375 z"+ id="path303" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph14-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-0.140625 C 1.625,0.15625 1.625,0.890625 0.96875,1.53125 C 0.921875,1.578125 0.921875,1.59375 0.921875,1.625 C 0.921875,1.6875 0.984375,1.734375 1.03125,1.734375 C 1.125,1.734375 1.859375,1.03125 1.859375,-0.015625 C 1.859375,-0.578125 1.65625,-0.96875 1.28125,-0.96875 C 0.96875,-0.96875 0.796875,-0.734375 0.796875,-0.484375 C 0.796875,-0.234375 0.96875,0 1.28125,0 C 1.40625,0 1.546875,-0.046875 1.625,-0.140625 z"+ id="path306" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path309" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.0625,1.90625 L 0.8125,1.90625 L 1.359375,-0.609375 C 1.625,-0.03125 2,0.203125 2.640625,0.203125 C 3.34375,0.203125 4.015625,-0.109375 4.46875,-0.6875 C 4.953125,-1.28125 5.25,-2.203125 5.25,-3.078125 C 5.25,-4.15625 4.65625,-4.828125 3.6875,-4.828125 C 3.296875,-4.828125 2.90625,-4.71875 2.546875,-4.484375 C 2.265625,-4.3125 2.15625,-4.1875 2.03125,-3.953125 L 2.203125,-4.703125 L 1.46875,-4.703125 L 0.0625,1.90625 z M 3.40625,-4.140625 C 4.078125,-4.140625 4.46875,-3.671875 4.46875,-2.90625 C 4.46875,-2.421875 4.3125,-1.84375 4.078125,-1.390625 C 3.734375,-0.78125 3.296875,-0.484375 2.703125,-0.484375 C 2.046875,-0.484375 1.640625,-0.9375 1.640625,-1.65625 C 1.640625,-2.1875 1.796875,-2.765625 2.0625,-3.234375 C 2.390625,-3.84375 2.84375,-4.140625 3.40625,-4.140625 z"+ id="path312" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.328125,-4.625 C 6.390625,-4.875 6.40625,-4.984375 6.40625,-5.125 C 6.40625,-5.5 6.21875,-5.921875 5.921875,-6.171875 C 5.546875,-6.5 5.078125,-6.640625 4.375,-6.640625 C 3.453125,-6.640625 2.71875,-6.390625 2.25,-5.890625 C 1.875,-5.5 1.59375,-4.875 1.59375,-4.40625 C 1.59375,-3.84375 1.984375,-3.375 2.59375,-3.203125 L 4.125,-2.765625 C 4.84375,-2.5625 5.140625,-2.3125 5.140625,-1.875 C 5.140625,-1.59375 4.96875,-1.25 4.71875,-1.015625 C 4.34375,-0.6875 3.828125,-0.515625 3.109375,-0.515625 C 2.09375,-0.515625 1.625,-0.890625 1.625,-1.71875 C 1.625,-1.828125 1.625,-1.90625 1.65625,-2.078125 L 0.875,-2.078125 C 0.8125,-1.84375 0.796875,-1.703125 0.796875,-1.515625 C 0.796875,-0.4375 1.609375,0.203125 2.953125,0.203125 C 3.90625,0.203125 4.6875,-0.046875 5.21875,-0.546875 C 5.671875,-0.96875 6,-1.625 6,-2.125 C 6,-2.359375 5.921875,-2.609375 5.78125,-2.828125 C 5.59375,-3.140625 5.328125,-3.3125 4.90625,-3.4375 L 3.359375,-3.875 C 2.671875,-4.078125 2.453125,-4.25 2.453125,-4.640625 C 2.453125,-4.953125 2.59375,-5.234375 2.859375,-5.484375 C 3.1875,-5.78125 3.625,-5.921875 4.21875,-5.921875 C 4.71875,-5.921875 5.09375,-5.828125 5.296875,-5.640625 C 5.46875,-5.484375 5.578125,-5.203125 5.578125,-4.9375 C 5.578125,-4.859375 5.5625,-4.796875 5.546875,-4.625 L 6.328125,-4.625 z"+ id="path315" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.34375,-4.703125 L 1.59375,-4.703125 L 0.59375,0 L 1.34375,0 L 2.34375,-4.703125 z M 2.734375,-6.53125 L 1.984375,-6.53125 L 1.78125,-5.609375 L 2.53125,-5.609375 L 2.734375,-6.53125 z"+ id="path318" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.9375,-3.125 L 4.953125,-3.25 C 4.953125,-3.390625 4.96875,-3.484375 4.96875,-3.515625 C 4.96875,-3.8125 4.8125,-4.171875 4.578125,-4.40625 C 4.296875,-4.703125 3.921875,-4.828125 3.421875,-4.828125 C 2.609375,-4.828125 1.890625,-4.5 1.40625,-3.875 C 0.984375,-3.328125 0.6875,-2.34375 0.6875,-1.53125 C 0.6875,-1.109375 0.828125,-0.65625 1.078125,-0.34375 C 1.375,0.03125 1.78125,0.203125 2.359375,0.203125 C 3.09375,0.203125 3.71875,-0.046875 4.125,-0.53125 C 4.359375,-0.8125 4.5,-1.109375 4.640625,-1.609375 L 3.890625,-1.609375 C 3.625,-0.875 3.125,-0.484375 2.484375,-0.484375 C 1.859375,-0.484375 1.46875,-0.921875 1.46875,-1.625 C 1.46875,-2.203125 1.65625,-2.875 1.953125,-3.34375 C 2.28125,-3.875 2.734375,-4.140625 3.28125,-4.140625 C 3.84375,-4.140625 4.203125,-3.828125 4.203125,-3.3125 C 4.203125,-3.265625 4.203125,-3.203125 4.1875,-3.125 L 4.9375,-3.125 z"+ id="path321" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.578125,0 L 5.359375,-4.703125 L 4.546875,-4.703125 L 2.359375,-0.921875 L 1.921875,-4.703125 L 1.09375,-4.703125 L 1.765625,0 L 2.578125,0 z"+ id="path324" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.3125,-4.703125 L 2.546875,-4.703125 L 2.6875,-5.3125 C 2.78125,-5.765625 2.9375,-5.921875 3.328125,-5.921875 C 3.390625,-5.921875 3.4375,-5.921875 3.5625,-5.90625 L 3.703125,-6.515625 C 3.546875,-6.5625 3.4375,-6.5625 3.296875,-6.5625 C 2.609375,-6.5625 2.109375,-6.15625 1.96875,-5.5 L 1.796875,-4.703125 L 1.171875,-4.703125 L 1.046875,-4.09375 L 1.671875,-4.09375 L 0.796875,0 L 1.546875,0 L 2.421875,-4.09375 L 3.1875,-4.09375 L 3.3125,-4.703125 z"+ id="path327" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path330" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.8125,-3.515625 L 1.8125,0 L 2.421875,0 L 2.421875,-4.9375 L 2.015625,-4.9375 C 1.796875,-4.1875 1.65625,-4.078125 0.703125,-3.953125 L 0.703125,-3.515625 L 1.8125,-3.515625 z"+ id="path333" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path336" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3,-3.6875 L 5.71875,-3.6875 C 6.484375,-3.6875 7.046875,-3.890625 7.578125,-4.3125 C 8.328125,-4.90625 8.765625,-5.828125 8.765625,-6.796875 C 8.765625,-8.0625 8.015625,-8.71875 6.546875,-8.71875 L 2.9375,-8.71875 L 1.09375,0 L 2.21875,0 L 3,-3.6875 z M 3.203125,-4.671875 L 3.859375,-7.734375 L 6.1875,-7.734375 C 7.109375,-7.734375 7.609375,-7.328125 7.609375,-6.578125 C 7.609375,-6.15625 7.46875,-5.765625 7.203125,-5.40625 C 6.796875,-4.90625 6.28125,-4.671875 5.515625,-4.671875 L 3.203125,-4.671875 z"+ id="path339" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 9.203125,-6.015625 C 9.171875,-6.71875 9.046875,-7.171875 8.828125,-7.578125 C 8.328125,-8.421875 7.484375,-8.859375 6.359375,-8.859375 C 4.953125,-8.859375 3.796875,-8.296875 2.875,-7.171875 C 1.921875,-6.03125 1.34375,-4.390625 1.34375,-2.890625 C 1.34375,-2.0625 1.578125,-1.296875 2.015625,-0.734375 C 2.5625,-0.046875 3.328125,0.28125 4.390625,0.28125 C 5.65625,0.28125 6.75,-0.1875 7.53125,-1.046875 C 8,-1.546875 8.375,-2.21875 8.78125,-3.171875 L 7.609375,-3.171875 C 7.3125,-2.5 7.125,-2.140625 6.90625,-1.859375 C 6.40625,-1.140625 5.5,-0.6875 4.546875,-0.6875 C 3.3125,-0.6875 2.484375,-1.65625 2.484375,-3.109375 C 2.484375,-4.203125 2.84375,-5.390625 3.453125,-6.296875 C 4.1875,-7.375 5.0625,-7.890625 6.15625,-7.890625 C 7.359375,-7.890625 7.953125,-7.296875 8.0625,-6.015625 L 9.203125,-6.015625 z"+ id="path342" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph13-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path345" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph13-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.84375,-2.25 L 5.6875,-4.078125 C 5.78125,-4.171875 5.796875,-4.21875 5.796875,-4.28125 C 5.796875,-4.40625 5.6875,-4.46875 5.609375,-4.46875 C 5.53125,-4.46875 5.5,-4.453125 5.421875,-4.359375 L 3.578125,-2.53125 L 1.75,-4.359375 C 1.65625,-4.453125 1.609375,-4.46875 1.546875,-4.46875 C 1.4375,-4.46875 1.359375,-4.390625 1.359375,-4.28125 C 1.359375,-4.203125 1.390625,-4.171875 1.46875,-4.09375 L 3.3125,-2.25 L 1.46875,-0.40625 C 1.375,-0.328125 1.359375,-0.265625 1.359375,-0.21875 C 1.359375,-0.09375 1.4375,-0.015625 1.546875,-0.015625 C 1.625,-0.015625 1.65625,-0.046875 1.734375,-0.140625 L 3.578125,-1.96875 L 5.40625,-0.140625 C 5.5,-0.03125 5.5625,-0.015625 5.609375,-0.015625 C 5.6875,-0.015625 5.796875,-0.09375 5.796875,-0.21875 C 5.796875,-0.28125 5.78125,-0.3125 5.6875,-0.40625 L 3.84375,-2.25 z"+ id="path348" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph13-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.890625,-2.046875 C 7.1875,-1.53125 6.921875,-0.828125 6.921875,-0.75 C 6.921875,-0.671875 6.984375,-0.640625 7.046875,-0.640625 C 7.140625,-0.640625 7.15625,-0.671875 7.234375,-0.828125 C 7.640625,-1.71875 8.359375,-2.03125 8.625,-2.140625 C 8.671875,-2.15625 8.703125,-2.203125 8.703125,-2.25 C 8.703125,-2.328125 8.65625,-2.34375 8.5625,-2.375 C 7.625,-2.796875 7.34375,-3.421875 7.1875,-3.765625 C 7.171875,-3.796875 7.140625,-3.859375 7.046875,-3.859375 C 6.984375,-3.859375 6.921875,-3.828125 6.921875,-3.734375 C 6.921875,-3.65625 7.1875,-2.953125 7.890625,-2.4375 L 0.828125,-2.4375 C 0.6875,-2.4375 0.515625,-2.4375 0.515625,-2.25 C 0.515625,-2.046875 0.6875,-2.046875 0.828125,-2.046875 L 7.890625,-2.046875 z"+ id="path351" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph13-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.46875,-2.96875 C 6.609375,-2.96875 6.625,-2.96875 6.703125,-2.90625 C 6.875,-2.765625 7.296875,-2.453125 7.828125,-2.25 C 7.53125,-2.125 7.109375,-1.90625 6.703125,-1.59375 C 6.625,-1.53125 6.609375,-1.53125 6.46875,-1.53125 L 0.8125,-1.53125 C 0.6875,-1.53125 0.515625,-1.53125 0.515625,-1.34375 C 0.515625,-1.140625 0.703125,-1.140625 0.84375,-1.140625 L 6.203125,-1.140625 C 5.6875,-0.625 5.328125,0.078125 5.328125,0.15625 C 5.328125,0.265625 5.4375,0.265625 5.515625,0.265625 C 5.65625,0.265625 5.65625,0.265625 5.75,0.09375 C 6.09375,-0.53125 6.421875,-0.875 6.75,-1.171875 C 7.484375,-1.828125 8.296875,-2.046875 8.59375,-2.140625 C 8.609375,-2.140625 8.703125,-2.15625 8.703125,-2.25 C 8.703125,-2.328125 8.625,-2.34375 8.59375,-2.359375 C 7.578125,-2.640625 6.5,-3.203125 5.75,-4.59375 C 5.65625,-4.75 5.65625,-4.765625 5.515625,-4.765625 C 5.4375,-4.765625 5.328125,-4.765625 5.328125,-4.640625 C 5.328125,-4.578125 5.6875,-3.875 6.203125,-3.359375 L 0.84375,-3.359375 C 0.703125,-3.359375 0.515625,-3.359375 0.515625,-3.15625 C 0.515625,-2.96875 0.6875,-2.96875 0.8125,-2.96875 L 6.46875,-2.96875 z"+ id="path354" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph17-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path357" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph17-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.875,-2.8125 C 1.921875,-2.890625 1.9375,-2.9375 1.9375,-3 C 1.9375,-3.203125 1.75,-3.34375 1.578125,-3.34375 C 1.375,-3.34375 1.28125,-3.203125 1.234375,-3.078125 L 0.390625,-0.484375 C 0.359375,-0.40625 0.359375,-0.390625 0.359375,-0.390625 C 0.359375,-0.296875 0.5625,-0.234375 0.609375,-0.234375 C 0.671875,-0.234375 0.6875,-0.28125 0.71875,-0.328125 L 1.875,-2.8125 z"+ id="path360" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph16-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path363" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph16-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.078125,-3.140625 L 0.421875,0 L 0.921875,0 L 1.28125,-1.734375 C 1.4375,-2.390625 1.84375,-2.796875 2.390625,-2.796875 C 2.6875,-2.796875 2.90625,-2.578125 2.90625,-2.3125 C 2.90625,-2.28125 2.890625,-2.1875 2.875,-2.09375 L 2.421875,0 L 2.9375,0 L 3.40625,-2.25 C 3.421875,-2.328125 3.4375,-2.40625 3.4375,-2.484375 C 3.4375,-2.9375 3.125,-3.21875 2.625,-3.21875 C 2.171875,-3.21875 1.765625,-3.0625 1.453125,-2.75 L 1.53125,-3.140625 L 1.078125,-3.140625 z"+ id="path366" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph16-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,-3.140625 L 0.421875,0 L 0.921875,0 L 1.34375,-1.96875 C 1.4375,-2.421875 1.84375,-2.796875 2.25,-2.796875 C 2.546875,-2.796875 2.734375,-2.625 2.734375,-2.375 C 2.734375,-2.3125 2.734375,-2.234375 2.71875,-2.15625 L 2.25,0 L 2.765625,0 L 3.171875,-1.96875 C 3.265625,-2.4375 3.6875,-2.796875 4.125,-2.796875 C 4.40625,-2.796875 4.578125,-2.625 4.578125,-2.328125 C 4.578125,-2.25 4.578125,-2.25 4.515625,-2.046875 L 4.09375,0 L 4.59375,0 L 5.0625,-2.234375 C 5.078125,-2.296875 5.09375,-2.5 5.09375,-2.5625 C 5.09375,-2.71875 5.03125,-2.890625 4.90625,-3.015625 C 4.78125,-3.171875 4.609375,-3.21875 4.34375,-3.21875 C 3.953125,-3.21875 3.609375,-3.0625 3.25,-2.734375 C 3.15625,-3.0625 2.921875,-3.21875 2.53125,-3.21875 C 2.125,-3.21875 1.84375,-3.109375 1.46875,-2.75 L 1.546875,-3.140625 L 1.09375,-3.140625 z"+ id="path369" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path372" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.609375,-5.21875 L 1.765625,-5.21875 L 0.65625,0 L 1.5,0 L 2.609375,-5.21875 z M 3.046875,-7.265625 L 2.203125,-7.265625 L 1.984375,-6.234375 L 2.828125,-6.234375 L 3.046875,-7.265625 z"+ id="path375" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.828125,-5.375 C 2.90625,-5.375 2.078125,-4.953125 1.578125,-4.21875 C 1.125,-3.578125 0.796875,-2.484375 0.796875,-1.640625 C 0.796875,-0.53125 1.5625,0.234375 2.6875,0.234375 C 3.640625,0.234375 4.390625,-0.15625 4.953125,-0.921875 C 5.40625,-1.5625 5.734375,-2.640625 5.734375,-3.515625 C 5.734375,-4.03125 5.546875,-4.546875 5.1875,-4.890625 C 4.859375,-5.21875 4.40625,-5.375 3.828125,-5.375 z M 3.703125,-4.609375 C 4.4375,-4.609375 4.859375,-4.125 4.859375,-3.3125 C 4.859375,-2.734375 4.6875,-2.078125 4.421875,-1.578125 C 4.046875,-0.890625 3.515625,-0.53125 2.828125,-0.53125 C 2.109375,-0.53125 1.671875,-1.03125 1.671875,-1.828125 C 1.671875,-2.40625 1.84375,-3.0625 2.109375,-3.5625 C 2.484375,-4.234375 3.046875,-4.609375 3.703125,-4.609375 z"+ id="path378" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph19-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path381" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph19-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.28125,0 L 4.765625,-4.171875 L 4.046875,-4.171875 L 2.09375,-0.8125 L 1.703125,-4.171875 L 0.96875,-4.171875 L 1.5625,0 L 2.28125,0 z"+ id="path384" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph19-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.953125,-4.171875 L 2.265625,-4.171875 L 2.375,-4.71875 C 2.46875,-5.125 2.609375,-5.265625 2.953125,-5.265625 C 3.015625,-5.265625 3.0625,-5.265625 3.171875,-5.25 L 3.296875,-5.796875 C 3.140625,-5.828125 3.0625,-5.828125 2.9375,-5.828125 C 2.3125,-5.828125 1.875,-5.46875 1.75,-4.890625 L 1.59375,-4.171875 L 1.03125,-4.171875 L 0.921875,-3.640625 L 1.484375,-3.640625 L 0.703125,0 L 1.375,0 L 2.15625,-3.640625 L 2.84375,-3.640625 L 2.953125,-4.171875 z"+ id="path387" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path390" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M -0.15625,-3.09375 C -0.203125,-3.078125 -0.21875,-3.046875 -0.21875,-3.015625 C -0.234375,-2.96875 -0.21875,-2.921875 -0.21875,-2.875 C -0.21875,-2.8125 -0.234375,-2.75 -0.203125,-2.703125 C -0.15625,-2.578125 -0.09375,-2.46875 -0.03125,-2.375 C 0.109375,-2.15625 0.265625,-1.953125 0.4375,-1.75 C 1.109375,-0.9375 2.046875,-0.34375 3.09375,-0.109375 C 3.328125,-0.046875 3.5625,-0.03125 3.796875,-0.015625 C 3.859375,-0.015625 3.921875,-0.015625 3.984375,-0.015625 C 4.015625,-0.015625 4.046875,-0.015625 4.078125,-0.03125 C 4.15625,-0.0625 4.140625,-0.1875 4.140625,-0.265625 L 4.140625,-0.890625 C 4.140625,-0.96875 4.15625,-1.078125 4.09375,-1.125 C 4.046875,-1.15625 3.984375,-1.140625 3.953125,-1.140625 C 3.859375,-1.140625 3.78125,-1.15625 3.6875,-1.15625 C 3.421875,-1.171875 3.140625,-1.203125 2.859375,-1.265625 C 2.03125,-1.4375 1.28125,-1.828125 0.6875,-2.421875 C 0.5625,-2.546875 0.4375,-2.6875 0.34375,-2.84375 C 0.3125,-2.890625 0.28125,-2.9375 0.25,-2.984375 C 0.234375,-3.015625 0.21875,-3.0625 0.171875,-3.078125 C 0.109375,-3.125 0.015625,-3.109375 -0.0625,-3.109375 C -0.09375,-3.109375 -0.140625,-3.109375 -0.15625,-3.09375 z"+ id="path393" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M -0.03125,-1.140625 C -0.125,-1.109375 -0.09375,-0.96875 -0.09375,-0.890625 L -0.09375,-0.265625 C -0.09375,-0.1875 -0.109375,-0.078125 -0.046875,-0.03125 C -0.015625,0 0.046875,-0.015625 0.09375,-0.015625 C 0.171875,-0.015625 0.265625,0 0.34375,0 C 0.609375,0.015625 0.875,0.046875 1.140625,0.109375 C 1.984375,0.28125 2.828125,0.65625 3.40625,1.3125 C 3.5,1.4375 3.609375,1.5625 3.6875,1.6875 C 3.734375,1.765625 3.78125,1.859375 3.84375,1.921875 C 3.90625,1.96875 4.03125,1.953125 4.109375,1.953125 C 4.140625,1.953125 4.171875,1.953125 4.203125,1.921875 C 4.25,1.90625 4.265625,1.875 4.265625,1.828125 C 4.265625,1.734375 4.28125,1.609375 4.234375,1.53125 C 4.171875,1.40625 4.109375,1.296875 4.046875,1.1875 C 3.90625,0.96875 3.75,0.75 3.5625,0.546875 C 2.890625,-0.25 1.96875,-0.828125 0.9375,-1.046875 C 0.703125,-1.109375 0.46875,-1.125 0.234375,-1.140625 C 0.171875,-1.140625 0.125,-1.140625 0.0625,-1.140625 C 0.03125,-1.140625 -0.015625,-1.140625 -0.03125,-1.140625 z"+ id="path396" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.828125,-1.140625 C 3.484375,-1.109375 3.171875,-1.078125 2.828125,-0.984375 C 1.96875,-0.75 1.171875,-0.234375 0.5625,0.4375 C 0.265625,0.75 0,1.125 -0.203125,1.515625 C -0.234375,1.59375 -0.21875,1.671875 -0.21875,1.765625 C -0.21875,1.796875 -0.21875,1.84375 -0.21875,1.875 C -0.203125,1.921875 -0.171875,1.9375 -0.125,1.953125 C -0.0625,1.953125 -0.015625,1.953125 0.046875,1.953125 C 0.09375,1.953125 0.140625,1.953125 0.171875,1.921875 C 0.21875,1.90625 0.234375,1.859375 0.265625,1.828125 C 0.296875,1.765625 0.328125,1.703125 0.375,1.65625 C 0.5,1.46875 0.640625,1.3125 0.796875,1.15625 C 1.359375,0.59375 2.140625,0.265625 2.921875,0.09375 C 3.171875,0.046875 3.453125,0 3.71875,0 C 3.796875,0 3.890625,-0.015625 3.96875,-0.015625 C 4.015625,-0.015625 4.0625,0 4.09375,-0.03125 C 4.140625,-0.0625 4.140625,-0.109375 4.140625,-0.15625 C 4.140625,-0.25 4.140625,-0.34375 4.140625,-0.4375 L 4.140625,-0.9375 C 4.140625,-1 4.140625,-1.078125 4.09375,-1.125 C 4.03125,-1.171875 3.90625,-1.140625 3.828125,-1.140625 z"+ id="path399" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.890625,-3.09375 C 3.8125,-3.0625 3.78125,-2.984375 3.734375,-2.921875 C 3.65625,-2.78125 3.546875,-2.640625 3.4375,-2.515625 C 3.140625,-2.171875 2.765625,-1.890625 2.359375,-1.671875 C 1.859375,-1.421875 1.3125,-1.28125 0.765625,-1.203125 C 0.578125,-1.171875 0.375,-1.171875 0.1875,-1.140625 C 0.109375,-1.140625 0.015625,-1.171875 -0.046875,-1.125 C -0.125,-1.078125 -0.09375,-0.9375 -0.09375,-0.875 L -0.09375,-0.21875 C -0.09375,-0.125 -0.109375,-0.015625 0.015625,-0.015625 C 0.09375,0 0.171875,-0.015625 0.265625,-0.015625 C 0.5,-0.03125 0.734375,-0.0625 0.96875,-0.109375 C 2.03125,-0.34375 2.984375,-0.984375 3.671875,-1.828125 C 3.828125,-2.015625 3.96875,-2.21875 4.09375,-2.4375 C 4.15625,-2.515625 4.21875,-2.625 4.25,-2.71875 C 4.265625,-2.796875 4.265625,-2.890625 4.265625,-2.953125 C 4.265625,-3 4.265625,-3.03125 4.234375,-3.0625 C 4.171875,-3.125 4.046875,-3.109375 3.96875,-3.109375 C 3.953125,-3.109375 3.90625,-3.109375 3.890625,-3.09375 z"+ id="path402" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph18-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path405" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph18-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.609375,-3.359375 C 4.171875,-2.875 4.75,-2.578125 4.84375,-2.578125 C 4.953125,-2.578125 4.953125,-2.703125 4.953125,-2.765625 C 4.953125,-2.90625 4.9375,-2.90625 4.78125,-2.984375 C 3.71875,-3.5 3.046875,-4.359375 2.703125,-5.40625 C 2.6875,-5.453125 2.65625,-5.53125 2.578125,-5.53125 C 2.5,-5.53125 2.484375,-5.453125 2.46875,-5.421875 C 2.0625,-4.1875 1.296875,-3.421875 0.3125,-2.953125 C 0.234375,-2.90625 0.21875,-2.890625 0.21875,-2.765625 C 0.21875,-2.703125 0.21875,-2.578125 0.328125,-2.578125 C 0.40625,-2.578125 0.984375,-2.859375 1.546875,-3.359375 L 1.546875,1.234375 C 1.546875,1.359375 1.546875,1.546875 1.734375,1.546875 C 1.921875,1.546875 1.921875,1.390625 1.921875,1.265625 L 1.921875,-3.75 C 2.15625,-4.015625 2.359375,-4.3125 2.578125,-4.75 C 2.84375,-4.25 3.0625,-3.953125 3.25,-3.75 L 3.25,1.265625 C 3.25,1.390625 3.25,1.546875 3.421875,1.546875 C 3.609375,1.546875 3.609375,1.359375 3.609375,1.234375 L 3.609375,-3.359375 z"+ id="path408" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph18-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-1.984375 C 1.625,-2.265625 1.40625,-2.4375 1.171875,-2.4375 C 0.90625,-2.4375 0.734375,-2.21875 0.734375,-2 C 0.734375,-1.734375 0.953125,-1.546875 1.171875,-1.546875 C 1.4375,-1.546875 1.625,-1.765625 1.625,-1.984375 z"+ id="path411" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph18-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.703125,-1.8125 C 7.8125,-1.8125 8,-1.8125 8,-1.984375 C 8,-2.171875 7.8125,-2.171875 7.703125,-2.171875 L 1.25,-2.171875 C 1.453125,-2.328125 1.609375,-2.46875 1.765625,-2.671875 C 1.953125,-2.90625 2.125,-3.25 2.125,-3.3125 C 2.125,-3.375 2.078125,-3.4375 1.984375,-3.4375 C 1.9375,-3.4375 1.890625,-3.40625 1.875,-3.359375 C 1.734375,-3.078125 1.46875,-2.484375 0.609375,-2.125 C 0.53125,-2.09375 0.484375,-2.0625 0.484375,-1.984375 C 0.484375,-1.921875 0.515625,-1.90625 0.640625,-1.84375 C 1.1875,-1.625 1.578125,-1.234375 1.84375,-0.6875 C 1.890625,-0.59375 1.90625,-0.546875 1.984375,-0.546875 C 2.078125,-0.546875 2.125,-0.609375 2.125,-0.671875 C 2.125,-0.734375 1.953125,-1.0625 1.78125,-1.296875 C 1.609375,-1.515625 1.453125,-1.65625 1.25,-1.8125 L 7.703125,-1.8125 z"+ id="path414" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path417" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.890625,0 L 2.890625,-3.140625 L 2.390625,-3.140625 L 2.390625,-1.359375 C 2.390625,-0.71875 2.046875,-0.296875 1.53125,-0.296875 C 1.140625,-0.296875 0.890625,-0.53125 0.890625,-0.921875 L 0.890625,-3.140625 L 0.390625,-3.140625 L 0.390625,-0.71875 C 0.390625,-0.203125 0.78125,0.140625 1.390625,0.140625 C 1.84375,0.140625 2.140625,-0.03125 2.4375,-0.4375 L 2.4375,0 L 2.890625,0 z"+ id="path420" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-3.140625 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 2.171875,-2.78125 2.421875,-2.546875 2.421875,-2.171875 L 2.421875,0 L 2.921875,0 L 2.921875,-2.375 C 2.921875,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.453125,-3.21875 1.15625,-3.046875 0.875,-2.609375 L 0.875,-3.140625 L 0.421875,-3.140625 z"+ id="path423" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.890625,-3.140625 L 0.40625,-3.140625 L 0.40625,0 L 0.890625,0 L 0.890625,-3.140625 z M 0.890625,-4.359375 L 0.390625,-4.359375 L 0.390625,-3.734375 L 0.890625,-3.734375 L 0.890625,-4.359375 z"+ id="path426" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,0 L 2.90625,-3.140625 L 2.34375,-3.140625 L 1.453125,-0.59375 L 0.625,-3.140625 L 0.0625,-3.140625 L 1.15625,0 L 1.703125,0 z"+ id="path429" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.0625,-1.40625 C 3.0625,-1.875 3.03125,-2.171875 2.9375,-2.40625 C 2.734375,-2.921875 2.265625,-3.21875 1.671875,-3.21875 C 0.796875,-3.21875 0.234375,-2.5625 0.234375,-1.53125 C 0.234375,-0.5 0.78125,0.140625 1.65625,0.140625 C 2.375,0.140625 2.875,-0.265625 3,-0.953125 L 2.5,-0.953125 C 2.359375,-0.53125 2.078125,-0.328125 1.6875,-0.328125 C 1.359375,-0.328125 1.09375,-0.46875 0.921875,-0.734375 C 0.8125,-0.90625 0.765625,-1.09375 0.765625,-1.40625 L 3.0625,-1.40625 z M 0.765625,-1.8125 C 0.8125,-2.390625 1.171875,-2.765625 1.671875,-2.765625 C 2.15625,-2.765625 2.53125,-2.359375 2.53125,-1.84375 C 2.53125,-1.828125 2.53125,-1.8125 2.53125,-1.8125 L 0.765625,-1.8125 z"+ id="path432" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.40625,-3.140625 L 0.40625,0 L 0.921875,0 L 0.921875,-1.625 C 0.921875,-2.078125 1.03125,-2.375 1.265625,-2.546875 C 1.421875,-2.65625 1.578125,-2.6875 1.921875,-2.703125 L 1.921875,-3.203125 C 1.84375,-3.21875 1.796875,-3.21875 1.734375,-3.21875 C 1.40625,-3.21875 1.15625,-3.03125 0.875,-2.5625 L 0.875,-3.140625 L 0.40625,-3.140625 z"+ id="path435" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.625,-2.265625 C 2.609375,-2.875 2.203125,-3.21875 1.484375,-3.21875 C 0.75,-3.21875 0.28125,-2.84375 0.28125,-2.265625 C 0.28125,-1.78125 0.53125,-1.546875 1.28125,-1.359375 L 1.734375,-1.25 C 2.09375,-1.171875 2.21875,-1.046875 2.21875,-0.8125 C 2.21875,-0.515625 1.9375,-0.328125 1.5,-0.328125 C 1.234375,-0.328125 1,-0.40625 0.875,-0.53125 C 0.796875,-0.625 0.765625,-0.71875 0.734375,-0.9375 L 0.203125,-0.9375 C 0.234375,-0.203125 0.640625,0.140625 1.453125,0.140625 C 2.25,0.140625 2.75,-0.25 2.75,-0.859375 C 2.75,-1.328125 2.484375,-1.578125 1.859375,-1.734375 L 1.375,-1.84375 C 0.96875,-1.9375 0.796875,-2.078125 0.796875,-2.296875 C 0.796875,-2.578125 1.0625,-2.765625 1.46875,-2.765625 C 1.859375,-2.765625 2.078125,-2.59375 2.09375,-2.265625 L 2.625,-2.265625 z"+ id="path438" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.515625,-3.140625 L 1,-3.140625 L 1,-4 L 0.515625,-4 L 0.515625,-3.140625 L 0.078125,-3.140625 L 0.078125,-2.734375 L 0.515625,-2.734375 L 0.515625,-0.359375 C 0.515625,-0.046875 0.71875,0.140625 1.109375,0.140625 C 1.234375,0.140625 1.359375,0.125 1.515625,0.09375 L 1.515625,-0.328125 C 1.453125,-0.3125 1.375,-0.296875 1.28125,-0.296875 C 1.0625,-0.296875 1,-0.359375 1,-0.578125 L 1,-2.734375 L 1.515625,-2.734375 L 1.515625,-3.140625 z"+ id="path441" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.328125,-3.140625 L 1.453125,-0.6875 L 0.65625,-3.140625 L 0.125,-3.140625 L 1.171875,0.015625 L 0.984375,0.515625 C 0.90625,0.734375 0.796875,0.8125 0.59375,0.8125 C 0.515625,0.8125 0.4375,0.796875 0.328125,0.78125 L 0.328125,1.234375 C 0.421875,1.28125 0.53125,1.296875 0.65625,1.296875 C 0.8125,1.296875 1,1.25 1.125,1.15625 C 1.28125,1.046875 1.375,0.90625 1.46875,0.65625 L 2.859375,-3.140625 L 2.328125,-3.140625 z"+ id="path444" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,-1.859375 L 0.28125,-1.859375 L 0.28125,-1.4375 L 1.703125,-1.4375 L 1.703125,-1.859375 z"+ id="path447" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.90625,-4.359375 L 0.40625,-4.359375 L 0.40625,0 L 0.90625,0 L 0.90625,-4.359375 z"+ id="path450" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-3.21875 C 0.75,-3.21875 0.21875,-2.59375 0.21875,-1.546875 C 0.21875,-0.484375 0.734375,0.140625 1.640625,0.140625 C 2.515625,0.140625 3.046875,-0.484375 3.046875,-1.515625 C 3.046875,-2.609375 2.53125,-3.21875 1.625,-3.21875 z M 1.640625,-2.765625 C 2.203125,-2.765625 2.53125,-2.296875 2.53125,-1.53125 C 2.53125,-0.796875 2.1875,-0.328125 1.640625,-0.328125 C 1.078125,-0.328125 0.734375,-0.78125 0.734375,-1.546875 C 0.734375,-2.296875 1.078125,-2.765625 1.640625,-2.765625 z"+ id="path453" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-3.140625 L 2.46875,-2.6875 C 2.21875,-3.046875 1.90625,-3.21875 1.515625,-3.21875 C 0.71875,-3.21875 0.171875,-2.53125 0.171875,-1.515625 C 0.171875,-1 0.3125,-0.578125 0.5625,-0.28125 C 0.796875,-0.015625 1.140625,0.140625 1.46875,0.140625 C 1.859375,0.140625 2.140625,-0.03125 2.421875,-0.421875 L 2.421875,-0.265625 C 2.421875,0.15625 2.359375,0.421875 2.234375,0.59375 C 2.109375,0.78125 1.84375,0.890625 1.546875,0.890625 C 1.3125,0.890625 1.109375,0.828125 0.96875,0.71875 C 0.859375,0.625 0.8125,0.546875 0.78125,0.359375 L 0.28125,0.359375 C 0.328125,0.953125 0.796875,1.296875 1.53125,1.296875 C 2,1.296875 2.390625,1.15625 2.59375,0.90625 C 2.84375,0.609375 2.921875,0.21875 2.921875,-0.515625 L 2.921875,-3.140625 L 2.46875,-3.140625 z M 1.5625,-2.765625 C 2.09375,-2.765625 2.421875,-2.3125 2.421875,-1.53125 C 2.421875,-0.78125 2.09375,-0.328125 1.5625,-0.328125 C 1.015625,-0.328125 0.6875,-0.78125 0.6875,-1.546875 C 0.6875,-2.296875 1.03125,-2.765625 1.5625,-2.765625 z"+ id="path456" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-4.25 C 1.25,-4.25 0.890625,-4.0625 0.671875,-3.78125 C 0.390625,-3.40625 0.25,-2.84375 0.25,-2.046875 C 0.25,-0.625 0.734375,0.140625 1.640625,0.140625 C 2.546875,0.140625 3.03125,-0.625 3.03125,-2.015625 C 3.03125,-2.84375 2.90625,-3.390625 2.625,-3.78125 C 2.40625,-4.078125 2.046875,-4.25 1.640625,-4.25 z M 1.640625,-3.78125 C 2.21875,-3.78125 2.5,-3.203125 2.5,-2.0625 C 2.5,-0.859375 2.21875,-0.296875 1.640625,-0.296875 C 1.078125,-0.296875 0.796875,-0.890625 0.796875,-2.046875 C 0.796875,-3.203125 1.078125,-3.78125 1.640625,-3.78125 z"+ id="path459" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.546875,-3.015625 L 1.546875,0 L 2.078125,0 L 2.078125,-4.25 L 1.734375,-4.25 C 1.546875,-3.59375 1.421875,-3.5 0.609375,-3.40625 L 0.609375,-3.015625 L 1.546875,-3.015625 z"+ id="path462" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.03125,-0.515625 L 0.796875,-0.515625 C 0.84375,-0.875 1.046875,-1.09375 1.5625,-1.390625 L 2.15625,-1.71875 C 2.75,-2.046875 3.0625,-2.484375 3.0625,-3 C 3.0625,-3.34375 2.921875,-3.6875 2.65625,-3.90625 C 2.40625,-4.140625 2.09375,-4.25 1.703125,-4.25 C 1.15625,-4.25 0.765625,-4.046875 0.53125,-3.6875 C 0.375,-3.46875 0.3125,-3.203125 0.296875,-2.765625 L 0.828125,-2.765625 C 0.84375,-3.0625 0.875,-3.234375 0.953125,-3.375 C 1.09375,-3.625 1.359375,-3.78125 1.6875,-3.78125 C 2.15625,-3.78125 2.515625,-3.4375 2.515625,-2.984375 C 2.515625,-2.65625 2.328125,-2.359375 1.9375,-2.140625 L 1.390625,-1.84375 C 0.515625,-1.328125 0.25,-0.9375 0.203125,0 L 3.03125,0 L 3.03125,-0.515625 z"+ id="path465" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.84375,-1.3125 L 3.28125,0 L 3.90625,0 L 2.375,-4.359375 L 1.65625,-4.359375 L 0.109375,0 L 0.6875,0 L 1.15625,-1.3125 L 2.84375,-1.3125 z M 2.6875,-1.78125 L 1.296875,-1.78125 L 2.015625,-3.765625 L 2.6875,-1.78125 z"+ id="path468" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.140625,-0.625 L 0.515625,-0.625 L 0.515625,0 L 1.140625,0 L 1.140625,-0.625 z"+ id="path471" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.8125,-2.078125 C 2.796875,-2.390625 2.734375,-2.578125 2.609375,-2.765625 C 2.390625,-3.046875 2.015625,-3.21875 1.578125,-3.21875 C 0.734375,-3.21875 0.1875,-2.5625 0.1875,-1.515625 C 0.1875,-0.5 0.71875,0.140625 1.578125,0.140625 C 2.328125,0.140625 2.796875,-0.3125 2.859375,-1.078125 L 2.359375,-1.078125 C 2.265625,-0.578125 2.015625,-0.328125 1.578125,-0.328125 C 1.03125,-0.328125 0.703125,-0.765625 0.703125,-1.515625 C 0.703125,-2.296875 1.03125,-2.765625 1.578125,-2.765625 C 2,-2.765625 2.25,-2.515625 2.3125,-2.078125 L 2.8125,-2.078125 z"+ id="path474" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.203125,-0.296875 C 3.140625,-0.28125 3.125,-0.28125 3.09375,-0.28125 C 2.921875,-0.28125 2.828125,-0.375 2.828125,-0.53125 L 2.828125,-2.375 C 2.828125,-2.921875 2.421875,-3.21875 1.640625,-3.21875 C 1.1875,-3.21875 0.8125,-3.09375 0.609375,-2.859375 C 0.453125,-2.703125 0.40625,-2.515625 0.390625,-2.203125 L 0.890625,-2.203125 C 0.9375,-2.59375 1.15625,-2.765625 1.625,-2.765625 C 2.078125,-2.765625 2.328125,-2.59375 2.328125,-2.296875 L 2.328125,-2.171875 C 2.328125,-1.953125 2.203125,-1.859375 1.8125,-1.8125 C 1.09375,-1.734375 1,-1.703125 0.796875,-1.625 C 0.4375,-1.484375 0.25,-1.203125 0.25,-0.796875 C 0.25,-0.21875 0.640625,0.140625 1.28125,0.140625 C 1.671875,0.140625 2,0 2.34375,-0.328125 C 2.375,0 2.53125,0.140625 2.859375,0.140625 C 2.96875,0.140625 3.046875,0.125 3.203125,0.078125 L 3.203125,-0.296875 z M 2.328125,-0.984375 C 2.328125,-0.8125 2.28125,-0.71875 2.125,-0.578125 C 1.921875,-0.390625 1.6875,-0.296875 1.390625,-0.296875 C 1,-0.296875 0.765625,-0.484375 0.765625,-0.796875 C 0.765625,-1.125 1,-1.296875 1.53125,-1.375 C 2.046875,-1.453125 2.15625,-1.46875 2.328125,-1.546875 L 2.328125,-0.984375 z"+ id="path477" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.40625,-4.359375 C 0.8125,-3.578125 0.4375,-2.484375 0.4375,-1.546875 C 0.4375,-0.609375 0.8125,0.484375 1.40625,1.265625 L 1.734375,1.265625 C 1.21875,0.40625 0.921875,-0.59375 0.921875,-1.546875 C 0.921875,-2.5 1.21875,-3.515625 1.734375,-4.359375 L 1.40625,-4.359375 z"+ id="path480" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-22"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.03125,-1.53125 L 1.734375,-2.234375 L 3.28125,0 L 3.9375,0 L 2.140625,-2.578125 L 3.921875,-4.359375 L 3.203125,-4.359375 L 1.03125,-2.15625 L 1.03125,-4.359375 L 0.46875,-4.359375 L 0.46875,0 L 1.03125,0 L 1.03125,-1.53125 z"+ id="path483" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-23"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.125,-3.875 L 3.546875,-3.875 L 3.546875,-4.359375 L 0.125,-4.359375 L 0.125,-3.875 L 1.5625,-3.875 L 1.5625,0 L 2.125,0 L 2.125,-3.875 z"+ id="path486" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-24"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.296875,-1.984375 L 3.296875,0 L 3.859375,0 L 3.859375,-4.359375 L 3.296875,-4.359375 L 3.296875,-2.484375 L 1.046875,-2.484375 L 1.046875,-4.359375 L 0.5,-4.359375 L 0.5,0 L 1.0625,0 L 1.0625,-1.984375 L 3.296875,-1.984375 z"+ id="path489" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-25"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.5625,1.265625 C 1.15625,0.484375 1.53125,-0.609375 1.53125,-1.546875 C 1.53125,-2.484375 1.15625,-3.578125 0.5625,-4.359375 L 0.234375,-4.359375 C 0.75,-3.5 1.046875,-2.5 1.046875,-1.546875 C 1.046875,-0.59375 0.75,0.421875 0.234375,1.265625 L 0.5625,1.265625 z"+ id="path492" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-26"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,-1.984375 L 3.171875,-1.984375 L 3.171875,-2.484375 L 1.09375,-2.484375 L 1.09375,-3.875 L 3.46875,-3.875 L 3.46875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 L 1.09375,0 L 1.09375,-1.984375 z"+ id="path495" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-27"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.5625,-3.078125 C 3.5625,-3.9375 2.96875,-4.4375 1.96875,-4.4375 C 1.015625,-4.4375 0.421875,-3.9375 0.421875,-3.15625 C 0.421875,-2.625 0.703125,-2.28125 1.28125,-2.140625 L 2.359375,-1.84375 C 2.90625,-1.703125 3.15625,-1.484375 3.15625,-1.140625 C 3.15625,-0.90625 3.03125,-0.671875 2.84375,-0.53125 C 2.671875,-0.421875 2.40625,-0.359375 2.046875,-0.359375 C 1.578125,-0.359375 1.25,-0.46875 1.046875,-0.71875 C 0.875,-0.90625 0.8125,-1.125 0.8125,-1.390625 L 0.28125,-1.390625 C 0.296875,-0.984375 0.375,-0.71875 0.546875,-0.484375 C 0.84375,-0.078125 1.34375,0.140625 2.015625,0.140625 C 2.53125,0.140625 2.953125,0.015625 3.234375,-0.203125 C 3.53125,-0.4375 3.71875,-0.8125 3.71875,-1.203125 C 3.71875,-1.734375 3.375,-2.125 2.78125,-2.296875 L 1.6875,-2.578125 C 1.171875,-2.734375 0.96875,-2.890625 0.96875,-3.234375 C 0.96875,-3.671875 1.359375,-3.96875 1.953125,-3.96875 C 2.640625,-3.96875 3.03125,-3.65625 3.046875,-3.078125 L 3.5625,-3.078125 z"+ id="path498" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-28"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.53125,0 L 2.21875,0 C 3.3125,0 3.984375,-0.828125 3.984375,-2.1875 C 3.984375,-3.53125 3.328125,-4.359375 2.21875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 z M 1.09375,-0.484375 L 1.09375,-3.875 L 2.125,-3.875 C 2.984375,-3.875 3.4375,-3.296875 3.4375,-2.171875 C 3.4375,-1.078125 2.984375,-0.484375 2.125,-0.484375 L 1.09375,-0.484375 z"+ id="path501" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-29"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.796875,0 L 4.03125,-3.65625 L 4.03125,0 L 4.546875,0 L 4.546875,-4.359375 L 3.78125,-4.359375 L 2.515625,-0.5625 L 1.21875,-4.359375 L 0.453125,-4.359375 L 0.453125,0 L 0.96875,0 L 0.96875,-3.65625 L 2.21875,0 L 2.796875,0 z"+ id="path504" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-30"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-4.359375 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 1.921875,-2.78125 2.09375,-2.734375 2.203125,-2.640625 C 2.359375,-2.546875 2.40625,-2.390625 2.40625,-2.171875 L 2.40625,0 L 2.90625,0 L 2.90625,-2.375 C 2.90625,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.484375,-3.21875 1.203125,-3.09375 0.921875,-2.703125 L 0.921875,-4.359375 L 0.421875,-4.359375 z"+ id="path507" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-31"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.109375,-4.25 L 0.28125,-4.25 L 0.28125,-3.71875 L 2.5625,-3.71875 C 1.5625,-2.28125 1.140625,-1.390625 0.828125,0 L 1.390625,0 C 1.625,-1.359375 2.15625,-2.53125 3.109375,-3.796875 L 3.109375,-4.25 z"+ id="path510" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-32"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.515625,-0.625 L 0.515625,0 L 0.875,0 L 0.875,0.109375 C 0.875,0.515625 0.796875,0.640625 0.515625,0.65625 L 0.515625,0.875 C 0.9375,0.875 1.15625,0.609375 1.15625,0.09375 L 1.15625,-0.625 L 0.515625,-0.625 z"+ id="path513" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-33"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.34375,-2.234375 C 2.78125,-2.5 2.921875,-2.703125 2.921875,-3.109375 C 2.921875,-3.78125 2.40625,-4.25 1.640625,-4.25 C 0.890625,-4.25 0.375,-3.78125 0.375,-3.109375 C 0.375,-2.71875 0.515625,-2.5 0.953125,-2.234375 C 0.453125,-2 0.21875,-1.640625 0.21875,-1.171875 C 0.21875,-0.40625 0.8125,0.140625 1.640625,0.140625 C 2.484375,0.140625 3.0625,-0.40625 3.0625,-1.171875 C 3.0625,-1.640625 2.828125,-2 2.34375,-2.234375 z M 1.640625,-3.78125 C 2.09375,-3.78125 2.375,-3.515625 2.375,-3.09375 C 2.375,-2.703125 2.09375,-2.4375 1.640625,-2.4375 C 1.203125,-2.4375 0.90625,-2.703125 0.90625,-3.109375 C 0.90625,-3.515625 1.203125,-3.78125 1.640625,-3.78125 z M 1.640625,-2 C 2.171875,-2 2.53125,-1.65625 2.53125,-1.171875 C 2.53125,-0.671875 2.171875,-0.328125 1.640625,-0.328125 C 1.125,-0.328125 0.765625,-0.671875 0.765625,-1.171875 C 0.765625,-1.65625 1.125,-2 1.640625,-2 z"+ id="path516" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-34"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.3125,-0.96875 C 0.421875,-0.28125 0.875,0.140625 1.515625,0.140625 C 1.984375,0.140625 2.40625,-0.09375 2.65625,-0.46875 C 2.921875,-0.875 3.046875,-1.40625 3.046875,-2.171875 C 3.046875,-2.890625 2.9375,-3.34375 2.6875,-3.71875 C 2.453125,-4.0625 2.078125,-4.25 1.609375,-4.25 C 0.8125,-4.25 0.234375,-3.640625 0.234375,-2.8125 C 0.234375,-2.015625 0.765625,-1.46875 1.53125,-1.46875 C 1.9375,-1.46875 2.21875,-1.609375 2.5,-1.9375 C 2.5,-0.90625 2.15625,-0.328125 1.5625,-0.328125 C 1.1875,-0.328125 0.921875,-0.5625 0.84375,-0.96875 L 0.3125,-0.96875 z M 1.609375,-3.78125 C 2.09375,-3.78125 2.46875,-3.375 2.46875,-2.828125 C 2.46875,-2.296875 2.109375,-1.9375 1.59375,-1.9375 C 1.078125,-1.9375 0.765625,-2.28125 0.765625,-2.859375 C 0.765625,-3.390625 1.125,-3.78125 1.609375,-3.78125 z"+ id="path519" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-35"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.375,-4.359375 L -0.046875,0.125 L 0.28125,0.125 L 1.703125,-4.359375 L 1.375,-4.359375 z"+ id="path522" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-36"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.328125,-1.9375 L 1.390625,-1.9375 L 1.609375,-1.953125 C 2.1875,-1.953125 2.484375,-1.6875 2.484375,-1.171875 C 2.484375,-0.640625 2.15625,-0.328125 1.609375,-0.328125 C 1.03125,-0.328125 0.75,-0.609375 0.71875,-1.234375 L 0.1875,-1.234375 C 0.21875,-0.890625 0.28125,-0.671875 0.375,-0.484375 C 0.59375,-0.078125 1.015625,0.140625 1.59375,0.140625 C 2.46875,0.140625 3.03125,-0.390625 3.03125,-1.1875 C 3.03125,-1.71875 2.8125,-2.015625 2.3125,-2.203125 C 2.703125,-2.359375 2.90625,-2.65625 2.90625,-3.078125 C 2.90625,-3.8125 2.421875,-4.25 1.609375,-4.25 C 0.75,-4.25 0.296875,-3.78125 0.28125,-2.875 L 0.8125,-2.875 C 0.8125,-3.125 0.84375,-3.265625 0.90625,-3.40625 C 1.015625,-3.640625 1.28125,-3.78125 1.609375,-3.78125 C 2.078125,-3.78125 2.359375,-3.5 2.359375,-3.0625 C 2.359375,-2.765625 2.25,-2.578125 2.015625,-2.484375 C 1.875,-2.421875 1.6875,-2.40625 1.328125,-2.390625 L 1.328125,-1.9375 z"+ id="path525" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path528" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.59375,-2.296875 C 6.734375,-2.296875 6.921875,-2.296875 6.921875,-2.5 C 6.921875,-2.6875 6.734375,-2.6875 6.59375,-2.6875 L 1.15625,-2.6875 C 1.015625,-2.6875 0.828125,-2.6875 0.828125,-2.5 C 0.828125,-2.296875 1.015625,-2.296875 1.15625,-2.296875 L 6.59375,-2.296875 z"+ id="path531" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 8.546875,-2.296875 C 7.8125,-1.75 7.484375,-0.921875 7.484375,-0.84375 C 7.484375,-0.75 7.5625,-0.71875 7.625,-0.71875 C 7.75,-0.71875 7.765625,-0.78125 7.78125,-0.8125 C 7.9375,-1.15625 8.25,-1.890625 9.25,-2.359375 C 9.375,-2.40625 9.390625,-2.421875 9.390625,-2.5 C 9.390625,-2.5625 9.328125,-2.59375 9.328125,-2.59375 C 8.78125,-2.84375 8.203125,-3.203125 7.796875,-4.125 C 7.75,-4.21875 7.734375,-4.265625 7.625,-4.265625 C 7.5625,-4.265625 7.484375,-4.234375 7.484375,-4.140625 C 7.484375,-4.0625 7.8125,-3.234375 8.546875,-2.6875 L 0.890625,-2.6875 C 0.734375,-2.6875 0.5625,-2.6875 0.5625,-2.5 C 0.5625,-2.296875 0.734375,-2.296875 0.890625,-2.296875 L 8.546875,-2.296875 z"+ id="path534" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path537" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.96875,-5.390625 L 0.578125,-5.390625 L 0.578125,2.171875 L 1.96875,2.171875 L 1.96875,-0.640625 C 2.3125,-0.046875 2.796875,0.234375 3.46875,0.234375 C 4.765625,0.234375 5.71875,-0.984375 5.71875,-2.609375 C 5.71875,-3.375 5.5,-4.125 5.140625,-4.625 C 4.78125,-5.140625 4.109375,-5.46875 3.46875,-5.46875 C 2.796875,-5.46875 2.3125,-5.1875 1.96875,-4.578125 L 1.96875,-5.390625 z M 3.15625,-4.3125 C 3.859375,-4.3125 4.328125,-3.625 4.328125,-2.59375 C 4.328125,-1.609375 3.84375,-0.921875 3.15625,-0.921875 C 2.453125,-0.921875 1.96875,-1.609375 1.96875,-2.609375 C 1.96875,-3.625 2.453125,-4.3125 3.15625,-4.3125 z"+ id="path540" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.390625,0 L 5.390625,-5.390625 L 4,-5.390625 L 4,-2.015625 C 4,-1.375 3.546875,-0.953125 2.875,-0.953125 C 2.265625,-0.953125 1.96875,-1.28125 1.96875,-1.921875 L 1.96875,-5.390625 L 0.578125,-5.390625 L 0.578125,-1.640625 C 0.578125,-0.453125 1.234375,0.234375 2.375,0.234375 C 3.109375,0.234375 3.59375,-0.046875 4,-0.640625 L 4,0 L 5.390625,0 z"+ id="path543" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-5.390625 L 0.625,0 L 2.03125,0 L 2.03125,-2.859375 C 2.03125,-3.671875 2.4375,-4.09375 3.25,-4.09375 C 3.40625,-4.09375 3.5,-4.078125 3.6875,-4.046875 L 3.6875,-5.46875 C 3.609375,-5.46875 3.5625,-5.46875 3.515625,-5.46875 C 2.875,-5.46875 2.328125,-5.046875 2.03125,-4.328125 L 2.03125,-5.390625 L 0.625,-5.390625 z"+ id="path546" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.21875,-2.25 C 5.234375,-2.375 5.234375,-2.421875 5.234375,-2.5 C 5.234375,-3.03125 5.15625,-3.53125 5.03125,-3.90625 C 4.671875,-4.890625 3.796875,-5.46875 2.71875,-5.46875 C 1.171875,-5.46875 0.21875,-4.359375 0.21875,-2.546875 C 0.21875,-0.828125 1.15625,0.234375 2.6875,0.234375 C 3.890625,0.234375 4.859375,-0.453125 5.171875,-1.515625 L 3.796875,-1.515625 C 3.625,-1.09375 3.234375,-0.84375 2.734375,-0.84375 C 2.328125,-0.84375 2.015625,-1 1.8125,-1.3125 C 1.6875,-1.5 1.640625,-1.75 1.609375,-2.25 L 5.21875,-2.25 z M 1.640625,-3.1875 C 1.71875,-4 2.078125,-4.40625 2.6875,-4.40625 C 3.046875,-4.40625 3.359375,-4.234375 3.5625,-3.953125 C 3.6875,-3.765625 3.75,-3.546875 3.78125,-3.1875 L 1.640625,-3.1875 z"+ id="path549" />+ </symbol>+ </g>+ <clipPath+ id="clip1">+ <path+ d="M 21.226562,63.839844 L 27.273438,63.839844 L 27.273438,57.792969 L 21.226562,57.792969 L 21.226562,63.839844 z"+ id="path552" />+ </clipPath>+ <clipPath+ id="clip2">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path555" />+ </clipPath>+ <clipPath+ id="clip3">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path558" />+ </clipPath>+ <clipPath+ id="clip4">+ <path+ d="M 143.18359,45.335938 L 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 z M 161.01562,54.640625 L 170.52734,54.640625 L 170.52734,50.863281 L 161.01562,50.863281 L 161.01562,50.863281 L 168.57422,52.753906 L 161.01562,54.640625 z"+ id="path561" />+ </clipPath>+ <clipPath+ id="clip5">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path564" />+ </clipPath>+ <clipPath+ id="clip6">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path567" />+ </clipPath>+ <clipPath+ id="clip7">+ <path+ d="M 143.18359,45.335938 L 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 z M 161.01562,71.648438 L 170.52734,71.648438 L 170.52734,67.871094 L 161.01562,67.871094 L 161.01562,67.871094 L 168.57422,69.757812 L 161.01562,71.648438 z"+ id="path570" />+ </clipPath>+ <clipPath+ id="clip8">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path573" />+ </clipPath>+ <clipPath+ id="clip9">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path576" />+ </clipPath>+ <clipPath+ id="clip10">+ <path+ d="M 143.18359,45.335938 L 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 z M 212.03906,54.640625 L 221.55078,54.640625 L 221.55078,50.863281 L 212.03906,50.863281 L 212.03906,50.863281 L 219.59766,52.753906 L 212.03906,54.640625 z"+ id="path579" />+ </clipPath>+ <clipPath+ id="clip11">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path582" />+ </clipPath>+ <clipPath+ id="clip12">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path585" />+ </clipPath>+ <clipPath+ id="clip13">+ <path+ d="M 143.18359,45.335938 L 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 z M 212.03906,71.648438 L 221.55078,71.648438 L 221.55078,67.871094 L 212.03906,67.871094 L 212.03906,67.871094 L 219.59766,69.757812 L 212.03906,71.648438 z"+ id="path588" />+ </clipPath>+ <clipPath+ id="clip14">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path591" />+ </clipPath>+ <clipPath+ id="clip15">+ <path+ d="M 44.21875,86.0625 L 49.089844,86.0625 L 49.089844,81.191406 L 44.21875,81.191406 L 44.21875,86.0625 z"+ id="path594" />+ </clipPath>+ <clipPath+ id="clip16">+ <path+ d="M 66.035156,98.625 L 70.910156,98.625 L 70.910156,93.753906 L 66.035156,93.753906 L 66.035156,98.625 z"+ id="path597" />+ </clipPath>+ <clipPath+ id="clip17">+ <path+ d="M 66.035156,121.11719 L 70.910156,121.11719 L 70.910156,116.24219 L 66.035156,116.24219 L 66.035156,121.11719 z"+ id="path600" />+ </clipPath>+ <clipPath+ id="clip18">+ <path+ d="M 21.226562,160.28516 L 27.273438,160.28516 L 27.273438,154.23828 L 21.226562,154.23828 L 21.226562,160.28516 z"+ id="path603" />+ </clipPath>+ <clipPath+ id="clip19">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path606" />+ </clipPath>+ <clipPath+ id="clip20">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path609" />+ </clipPath>+ <clipPath+ id="clip21">+ <path+ d="M 169.97656,141.78125 L 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 z M 187.80859,151.08594 L 197.32031,151.08594 L 197.32031,147.30859 L 187.80859,147.30859 L 187.80859,147.30859 L 195.36719,149.19531 L 187.80859,151.08594 z"+ id="path612" />+ </clipPath>+ <clipPath+ id="clip22">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path615" />+ </clipPath>+ <clipPath+ id="clip23">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path618" />+ </clipPath>+ <clipPath+ id="clip24">+ <path+ d="M 169.97656,141.78125 L 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 z M 187.80859,168.09375 L 197.32031,168.09375 L 197.32031,164.31641 L 187.80859,164.31641 L 187.80859,164.31641 L 195.36719,166.20312 L 187.80859,168.09375 z"+ id="path621" />+ </clipPath>+ <clipPath+ id="clip25">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path624" />+ </clipPath>+ <clipPath+ id="clip26">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path627" />+ </clipPath>+ <clipPath+ id="clip27">+ <path+ d="M 169.97656,141.78125 L 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 z M 238.83203,151.08594 L 248.34375,151.08594 L 248.34375,147.30859 L 238.83203,147.30859 L 238.83203,147.30859 L 246.39062,149.19531 L 238.83203,151.08594 z"+ id="path630" />+ </clipPath>+ <clipPath+ id="clip28">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path633" />+ </clipPath>+ <clipPath+ id="clip29">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path636" />+ </clipPath>+ <clipPath+ id="clip30">+ <path+ d="M 169.97656,141.78125 L 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 z M 238.83203,168.09375 L 248.34375,168.09375 L 248.34375,164.31641 L 238.83203,164.31641 L 238.83203,164.31641 L 246.39062,166.20312 L 238.83203,168.09375 z"+ id="path639" />+ </clipPath>+ <clipPath+ id="clip31">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path642" />+ </clipPath>+ <clipPath+ id="clip32">+ <path+ d="M 44.21875,191.01172 L 49.089844,191.01172 L 49.089844,186.14062 L 44.21875,186.14062 L 44.21875,191.01172 z"+ id="path645" />+ </clipPath>+ <clipPath+ id="clip33">+ <path+ d="M 66.035156,206.41016 L 70.910156,206.41016 L 70.910156,201.53516 L 66.035156,201.53516 L 66.035156,206.41016 z"+ id="path648" />+ </clipPath>+ <clipPath+ id="clip34">+ <path+ d="M 66.035156,217.36719 L 70.910156,217.36719 L 70.910156,212.49609 L 66.035156,212.49609 L 66.035156,217.36719 z"+ id="path651" />+ </clipPath>+ <clipPath+ id="clip35">+ <path+ d="M 66.035156,228.32813 L 70.910156,228.32813 L 70.910156,223.45312 L 66.035156,223.45312 L 66.035156,228.32813 z"+ id="path654" />+ </clipPath>+ <clipPath+ id="clip36">+ <path+ d="M 66.035156,250.24609 L 70.910156,250.24609 L 70.910156,245.37109 L 66.035156,245.37109 L 66.035156,250.24609 z"+ id="path657" />+ </clipPath>+ </defs>+ <g+ id="g13505"+ transform="matrix(8.1227728,0,0,8.1227728,-1324.3412,-356.23241)">+ <g+ clip-path="url(#clip2)"+ clip-rule="nonzero"+ id="g1382">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 263.97031,9.073125 L 547.44687,9.073125 L 547.44687,292.54969 L 263.97031,292.54969 L 263.97031,9.073125 z"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1384" />+ </g>+ <g+ clip-path="url(#clip3)"+ clip-rule="nonzero"+ id="g1386">+ <g+ clip-path="url(#clip4)"+ clip-rule="evenodd"+ id="g1388">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 37.2125,235.83094 L 263.97031,235.83094"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1390" />+ </g>+ </g>+ <g+ clip-path="url(#clip5)"+ clip-rule="nonzero"+ id="g1392">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 161.01562,54.640625 L 168.57422,52.753906 L 161.01562,50.863281 L 161.01562,54.640625"+ id="path1394" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 178.30625,216.96375 L 253.89219,235.83094 L 178.30625,254.73719 L 178.30625,216.96375 z"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1396" />+ </g>+ <g+ clip-path="url(#clip6)"+ clip-rule="nonzero"+ id="g1398">+ <g+ clip-path="url(#clip7)"+ clip-rule="evenodd"+ id="g1400">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 37.2125,65.791875 L 263.97031,65.791875"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1402" />+ </g>+ </g>+ <g+ clip-path="url(#clip8)"+ clip-rule="nonzero"+ id="g1404">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 161.01562,71.648438 L 168.57422,69.757812 L 161.01562,67.871094 L 161.01562,71.648438"+ id="path1406" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 178.30625,46.885625 L 253.89219,65.791875 L 178.30625,84.659062 L 178.30625,46.885625 z"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1408" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:9.4485, 37.794;stroke-dashoffset:37.794;stroke-opacity:1"+ d="M 93.93125,235.83094 L 93.93125,65.791875"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1410" />+ </g>+ <g+ clip-path="url(#clip9)"+ clip-rule="nonzero"+ id="g1412">+ <g+ clip-path="url(#clip10)"+ clip-rule="evenodd"+ id="g1414">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 547.44687,235.83094 L 774.20469,235.83094"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1416" />+ </g>+ </g>+ <g+ clip-path="url(#clip11)"+ clip-rule="nonzero"+ id="g1418">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 212.03906,54.640625 L 219.59766,52.753906 L 212.03906,50.863281 L 212.03906,54.640625"+ id="path1420" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 688.54062,216.96375 L 764.12656,235.83094 L 688.54062,254.73719 L 688.54062,216.96375 z"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1422" />+ </g>+ <g+ clip-path="url(#clip12)"+ clip-rule="nonzero"+ id="g1424">+ <g+ clip-path="url(#clip13)"+ clip-rule="evenodd"+ id="g1426">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 547.44687,65.791875 L 774.20469,65.791875"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1428" />+ </g>+ </g>+ <g+ clip-path="url(#clip14)"+ clip-rule="nonzero"+ id="g1430">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 212.03906,71.648438 L 219.59766,69.757812 L 212.03906,67.871094 L 212.03906,71.648438"+ id="path1432" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 688.54062,46.885625 L 764.12656,65.791875 L 688.54062,84.659062 L 688.54062,46.885625 z"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1434" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:9.4485, 37.794;stroke-dashoffset:37.794;stroke-opacity:1"+ d="M 604.12656,235.83094 L 604.12656,65.791875"+ transform="matrix(0.1,0,0,-0.1,143.185,76.337)"+ id="path1436" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1438">+ <use+ xlink:href="#glyph4-1"+ x="134.168"+ y="65.459"+ id="use1440"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1442">+ <use+ xlink:href="#glyph4-2"+ x="134.166"+ y="65.459"+ id="use1444"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1446">+ <use+ xlink:href="#glyph5-1"+ x="135.798"+ y="72.557999"+ id="use1448"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1450">+ <use+ xlink:href="#glyph6-1"+ x="138.00999"+ y="74.052002"+ id="use1452"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1454">+ <use+ xlink:href="#glyph4-1"+ x="134.168"+ y="48.450001"+ id="use1456"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1458">+ <use+ xlink:href="#glyph4-2"+ x="134.166"+ y="48.450001"+ id="use1460"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1462">+ <use+ xlink:href="#glyph5-1"+ x="135.855"+ y="55.549"+ id="use1464"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1466">+ <use+ xlink:href="#glyph7-1"+ x="138.067"+ y="57.085999"+ id="use1468"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1470">+ <use+ xlink:href="#glyph4-1"+ x="223.506"+ y="67.237999"+ id="use1472"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1474">+ <use+ xlink:href="#glyph4-2"+ x="225.52641"+ y="67.237999"+ id="use1476"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1478">+ <use+ xlink:href="#glyph5-2"+ x="223.506"+ y="72.557999"+ id="use1480"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1482">+ <use+ xlink:href="#glyph6-2"+ x="229.045"+ y="74.052002"+ id="use1484"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1486">+ <use+ xlink:href="#glyph4-1"+ x="223.506"+ y="50.229"+ id="use1488"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1490">+ <use+ xlink:href="#glyph4-2"+ x="223.50401"+ y="50.229"+ id="use1492"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1494">+ <use+ xlink:href="#glyph5-2"+ x="223.53"+ y="55.549"+ id="use1496"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1498">+ <use+ xlink:href="#glyph7-1"+ x="229.069"+ y="57.085999"+ id="use1500"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1502">+ <use+ xlink:href="#glyph8-1"+ x="179.416"+ y="64.053001"+ id="use1504"+ width="362.83499"+ height="272.12601" />+ </g>+ </g>+</svg>
+ doc/www/files/tutorial/figures/processcons.svg view
@@ -0,0 +1,2590 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="153.97754"+ height="71.019638"+ viewBox="0 0 362.835 272.126"+ version="1.0"+ id="svg2"+ sodipodi:version="0.32"+ inkscape:version="0.46"+ sodipodi:docname="processcons.svg"+ inkscape:output_extension="org.inkscape.output.svg.inkscape">+ <metadata+ id="metadata7555">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <sodipodi:namedview+ inkscape:window-height="856"+ inkscape:window-width="1313"+ inkscape:pageshadow="2"+ inkscape:pageopacity="0.0"+ guidetolerance="10.0"+ gridtolerance="10.0"+ objecttolerance="10.0"+ borderopacity="1.0"+ bordercolor="#666666"+ pagecolor="#ffffff"+ id="base"+ showgrid="false"+ inkscape:zoom="2.3944769"+ inkscape:cx="22.499468"+ inkscape:cy="98.63364"+ inkscape:window-x="247"+ inkscape:window-y="219"+ inkscape:current-layer="svg2" />+ <defs+ id="defs4">+ <inkscape:perspective+ sodipodi:type="inkscape:persp3d"+ inkscape:vp_x="0 : 170.07875 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_z="453.54373 : 170.07875 : 1"+ inkscape:persp3d-origin="226.77187 : 113.38583 : 1"+ id="perspective7557" />+ <g+ id="g6">+ <symbol+ overflow="visible"+ id="glyph20-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path9" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.265625,0 L 3.875,-4.171875 L 3.125,-4.171875 L 1.9375,-0.78125 L 0.828125,-4.171875 L 0.078125,-4.171875 L 1.546875,0 L 2.265625,0 z"+ id="path12" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.265625,-0.390625 C 4.1875,-0.375 4.15625,-0.375 4.125,-0.375 C 3.890625,-0.375 3.765625,-0.5 3.765625,-0.703125 L 3.765625,-3.15625 C 3.765625,-3.890625 3.21875,-4.296875 2.1875,-4.296875 C 1.578125,-4.296875 1.078125,-4.125 0.8125,-3.8125 C 0.609375,-3.59375 0.53125,-3.359375 0.515625,-2.9375 L 1.1875,-2.9375 C 1.25,-3.453125 1.546875,-3.6875 2.171875,-3.6875 C 2.765625,-3.6875 3.09375,-3.453125 3.09375,-3.0625 L 3.09375,-2.890625 C 3.09375,-2.609375 2.9375,-2.484375 2.40625,-2.421875 C 1.46875,-2.296875 1.328125,-2.265625 1.0625,-2.171875 C 0.578125,-1.96875 0.328125,-1.59375 0.328125,-1.046875 C 0.328125,-0.296875 0.859375,0.1875 1.703125,0.1875 C 2.234375,0.1875 2.65625,0 3.125,-0.4375 C 3.171875,-0.015625 3.375,0.1875 3.8125,0.1875 C 3.9375,0.1875 4.046875,0.171875 4.265625,0.109375 L 4.265625,-0.390625 z M 3.09375,-1.3125 C 3.09375,-1.09375 3.03125,-0.953125 2.84375,-0.765625 C 2.5625,-0.53125 2.234375,-0.390625 1.84375,-0.390625 C 1.328125,-0.390625 1.03125,-0.640625 1.03125,-1.0625 C 1.03125,-1.5 1.328125,-1.734375 2.03125,-1.828125 C 2.734375,-1.921875 2.875,-1.953125 3.09375,-2.0625 L 3.09375,-1.3125 z"+ id="path15" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.21875,-5.8125 L 0.546875,-5.8125 L 0.546875,0 L 1.21875,0 L 1.21875,-5.8125 z"+ id="path18" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.84375,0 L 3.84375,-4.171875 L 3.171875,-4.171875 L 3.171875,-1.8125 C 3.171875,-0.953125 2.734375,-0.390625 2.046875,-0.390625 C 1.515625,-0.390625 1.171875,-0.71875 1.171875,-1.21875 L 1.171875,-4.171875 L 0.515625,-4.171875 L 0.515625,-0.953125 C 0.515625,-0.265625 1.03125,0.1875 1.84375,0.1875 C 2.46875,0.1875 2.859375,-0.03125 3.25,-0.578125 L 3.25,0 L 3.84375,0 z"+ id="path21" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.09375,-1.859375 C 4.09375,-2.5 4.046875,-2.890625 3.921875,-3.203125 C 3.65625,-3.875 3.015625,-4.296875 2.234375,-4.296875 C 1.0625,-4.296875 0.3125,-3.40625 0.3125,-2.03125 C 0.3125,-0.65625 1.046875,0.1875 2.21875,0.1875 C 3.171875,0.1875 3.828125,-0.359375 4,-1.265625 L 3.328125,-1.265625 C 3.140625,-0.71875 2.765625,-0.4375 2.234375,-0.4375 C 1.8125,-0.4375 1.453125,-0.625 1.234375,-0.96875 C 1.078125,-1.21875 1.015625,-1.453125 1.015625,-1.859375 L 4.09375,-1.859375 z M 1.03125,-2.40625 C 1.078125,-3.171875 1.546875,-3.6875 2.21875,-3.6875 C 2.875,-3.6875 3.375,-3.140625 3.375,-2.453125 C 3.375,-2.4375 3.375,-2.421875 3.375,-2.40625 L 1.03125,-2.40625 z"+ id="path24" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.484375,-3.015625 C 3.484375,-3.828125 2.9375,-4.296875 1.96875,-4.296875 C 1,-4.296875 0.375,-3.796875 0.375,-3.015625 C 0.375,-2.359375 0.703125,-2.0625 1.703125,-1.8125 L 2.3125,-1.671875 C 2.78125,-1.546875 2.96875,-1.390625 2.96875,-1.078125 C 2.96875,-0.6875 2.578125,-0.4375 1.984375,-0.4375 C 1.640625,-0.4375 1.328125,-0.53125 1.15625,-0.703125 C 1.0625,-0.828125 1.015625,-0.953125 0.96875,-1.25 L 0.265625,-1.25 C 0.296875,-0.28125 0.84375,0.1875 1.9375,0.1875 C 2.984375,0.1875 3.65625,-0.328125 3.65625,-1.140625 C 3.65625,-1.765625 3.3125,-2.109375 2.484375,-2.296875 L 1.84375,-2.453125 C 1.296875,-2.578125 1.0625,-2.75 1.0625,-3.046875 C 1.0625,-3.4375 1.40625,-3.6875 1.953125,-3.6875 C 2.484375,-3.6875 2.765625,-3.453125 2.78125,-3.015625 L 3.484375,-3.015625 z"+ id="path27" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.0625,-4.171875 L 1.359375,-4.171875 L 1.359375,-4.828125 C 1.359375,-5.109375 1.515625,-5.25 1.828125,-5.25 C 1.875,-5.25 1.90625,-5.25 2.0625,-5.25 L 2.0625,-5.796875 C 1.90625,-5.828125 1.8125,-5.828125 1.6875,-5.828125 C 1.0625,-5.828125 0.703125,-5.484375 0.703125,-4.890625 L 0.703125,-4.171875 L 0.140625,-4.171875 L 0.140625,-3.640625 L 0.703125,-3.640625 L 0.703125,0 L 1.359375,0 L 1.359375,-3.640625 L 2.0625,-3.640625 L 2.0625,-4.171875 z"+ id="path30" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.5625,-4.171875 L 0.5625,0 L 1.234375,0 L 1.234375,-2.296875 C 1.234375,-3.15625 1.671875,-3.71875 2.359375,-3.71875 C 2.890625,-3.71875 3.21875,-3.390625 3.21875,-2.890625 L 3.21875,0 L 3.875,0 L 3.875,-3.15625 C 3.875,-3.84375 3.359375,-4.296875 2.5625,-4.296875 C 1.9375,-4.296875 1.53125,-4.0625 1.171875,-3.46875 L 1.171875,-4.171875 L 0.5625,-4.171875 z"+ id="path33" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.75,-2.765625 C 3.71875,-3.171875 3.640625,-3.4375 3.46875,-3.671875 C 3.1875,-4.0625 2.6875,-4.296875 2.109375,-4.296875 C 0.984375,-4.296875 0.25,-3.40625 0.25,-2.015625 C 0.25,-0.671875 0.96875,0.1875 2.09375,0.1875 C 3.09375,0.1875 3.71875,-0.421875 3.796875,-1.4375 L 3.125,-1.4375 C 3.015625,-0.765625 2.671875,-0.4375 2.109375,-0.4375 C 1.375,-0.4375 0.9375,-1.03125 0.9375,-2.015625 C 0.9375,-3.0625 1.375,-3.6875 2.09375,-3.6875 C 2.65625,-3.6875 3,-3.359375 3.078125,-2.765625 L 3.75,-2.765625 z"+ id="path36" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.03125,-4.171875 L 1.34375,-4.171875 L 1.34375,-5.328125 L 0.671875,-5.328125 L 0.671875,-4.171875 L 0.109375,-4.171875 L 0.109375,-3.640625 L 0.671875,-3.640625 L 0.671875,-0.484375 C 0.671875,-0.0625 0.96875,0.1875 1.484375,0.1875 C 1.640625,0.1875 1.796875,0.171875 2.03125,0.125 L 2.03125,-0.4375 C 1.9375,-0.40625 1.828125,-0.390625 1.703125,-0.390625 C 1.421875,-0.390625 1.34375,-0.484375 1.34375,-0.765625 L 1.34375,-3.640625 L 2.03125,-3.640625 L 2.03125,-4.171875 z"+ id="path39" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.1875,-4.171875 L 0.53125,-4.171875 L 0.53125,0 L 1.1875,0 L 1.1875,-4.171875 z M 1.1875,-5.8125 L 0.53125,-5.8125 L 0.53125,-4.96875 L 1.1875,-4.96875 L 1.1875,-5.8125 z"+ id="path42" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph20-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.171875,-4.296875 C 1,-4.296875 0.28125,-3.453125 0.28125,-2.0625 C 0.28125,-0.65625 0.984375,0.1875 2.171875,0.1875 C 3.34375,0.1875 4.0625,-0.65625 4.0625,-2.03125 C 4.0625,-3.46875 3.375,-4.296875 2.171875,-4.296875 z M 2.171875,-3.6875 C 2.921875,-3.6875 3.375,-3.0625 3.375,-2.03125 C 3.375,-1.046875 2.90625,-0.4375 2.171875,-0.4375 C 1.4375,-0.4375 0.984375,-1.046875 0.984375,-2.0625 C 0.984375,-3.0625 1.4375,-3.6875 2.171875,-3.6875 z"+ id="path45" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path48" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-2.828125 L 4.5,-2.828125 C 5.96875,-2.828125 6.90625,-3.875 6.90625,-5.484375 C 6.90625,-7.078125 6,-7.953125 4.34375,-7.953125 L 0.828125,-7.953125 L 0.828125,0 L 2.46875,0 L 2.46875,-2.828125 z M 2.46875,-4.203125 L 2.46875,-6.59375 L 3.984375,-6.59375 C 4.859375,-6.59375 5.265625,-6.203125 5.265625,-5.390625 C 5.265625,-4.578125 4.859375,-4.203125 3.984375,-4.203125 L 2.46875,-4.203125 z"+ id="path51" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.6875,-5.890625 L 0.6875,0 L 2.21875,0 L 2.21875,-3.125 C 2.21875,-4.03125 2.65625,-4.46875 3.5625,-4.46875 C 3.71875,-4.46875 3.828125,-4.453125 4.03125,-4.421875 L 4.03125,-5.984375 C 3.953125,-5.984375 3.890625,-5.984375 3.84375,-5.984375 C 3.15625,-5.984375 2.546875,-5.53125 2.21875,-4.734375 L 2.21875,-5.890625 L 0.6875,-5.890625 z"+ id="path54" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.28125,-5.984375 C 1.484375,-5.984375 0.375,-4.796875 0.375,-2.875 C 0.375,-0.921875 1.484375,0.25 3.296875,0.25 C 5.078125,0.25 6.203125,-0.9375 6.203125,-2.828125 C 6.203125,-4.828125 5.125,-5.984375 3.28125,-5.984375 z M 3.296875,-4.75 C 4.140625,-4.75 4.671875,-4 4.671875,-2.84375 C 4.671875,-1.75 4.109375,-0.984375 3.296875,-0.984375 C 2.46875,-0.984375 1.90625,-1.75 1.90625,-2.875 C 1.90625,-3.984375 2.46875,-4.75 3.296875,-4.75 z"+ id="path57" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.6875,-3.6875 C 5.578125,-5.125 4.625,-5.984375 3.15625,-5.984375 C 1.390625,-5.984375 0.375,-4.828125 0.375,-2.828125 C 0.375,-0.890625 1.390625,0.25 3.125,0.25 C 4.5625,0.25 5.546875,-0.625 5.6875,-2.046875 L 4.234375,-2.046875 C 4.03125,-1.28125 3.734375,-0.984375 3.140625,-0.984375 C 2.359375,-0.984375 1.890625,-1.671875 1.890625,-2.828125 C 1.890625,-3.375 2,-3.90625 2.1875,-4.25 C 2.359375,-4.578125 2.703125,-4.75 3.140625,-4.75 C 3.765625,-4.75 4.0625,-4.453125 4.234375,-3.6875 L 5.6875,-3.6875 z"+ id="path60" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.71875,-2.46875 C 5.71875,-2.59375 5.71875,-2.65625 5.71875,-2.71875 C 5.71875,-3.3125 5.640625,-3.859375 5.5,-4.28125 C 5.109375,-5.34375 4.15625,-5.984375 2.96875,-5.984375 C 1.28125,-5.984375 0.234375,-4.765625 0.234375,-2.796875 C 0.234375,-0.90625 1.265625,0.25 2.9375,0.25 C 4.25,0.25 5.328125,-0.5 5.65625,-1.65625 L 4.15625,-1.65625 C 3.96875,-1.1875 3.546875,-0.921875 2.984375,-0.921875 C 2.546875,-0.921875 2.203125,-1.09375 1.984375,-1.421875 C 1.84375,-1.640625 1.78125,-1.90625 1.765625,-2.46875 L 5.71875,-2.46875 z M 1.78125,-3.484375 C 1.890625,-4.375 2.265625,-4.828125 2.9375,-4.828125 C 3.328125,-4.828125 3.671875,-4.640625 3.890625,-4.328125 C 4.03125,-4.109375 4.09375,-3.875 4.140625,-3.484375 L 1.78125,-3.484375 z"+ id="path63" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.5,-3.984375 C 5.484375,-5.234375 4.53125,-5.984375 2.9375,-5.984375 C 1.453125,-5.984375 0.53125,-5.234375 0.53125,-4.03125 C 0.53125,-3.625 0.640625,-3.296875 0.84375,-3.0625 C 1.0625,-2.859375 1.25,-2.765625 1.8125,-2.578125 L 3.625,-2 C 4.015625,-1.890625 4.140625,-1.765625 4.140625,-1.53125 C 4.140625,-1.171875 3.71875,-0.953125 3.015625,-0.953125 C 2.625,-0.953125 2.296875,-1.03125 2.109375,-1.15625 C 1.9375,-1.28125 1.875,-1.390625 1.8125,-1.71875 L 0.3125,-1.71875 C 0.359375,-0.421875 1.3125,0.25 3.09375,0.25 C 3.921875,0.25 4.53125,0.078125 4.96875,-0.265625 C 5.40625,-0.625 5.671875,-1.171875 5.671875,-1.75 C 5.671875,-2.515625 5.296875,-3 4.515625,-3.234375 L 2.578125,-3.78125 C 2.15625,-3.921875 2.046875,-4 2.046875,-4.25 C 2.046875,-4.5625 2.40625,-4.78125 2.9375,-4.78125 C 3.671875,-4.78125 4.03125,-4.53125 4.03125,-3.984375 L 5.5,-3.984375 z"+ id="path66" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.6875,-5.890625 L 0.6875,0 L 2.21875,0 L 2.21875,-3.53125 C 2.21875,-4.234375 2.703125,-4.6875 3.453125,-4.6875 C 4.09375,-4.6875 4.421875,-4.328125 4.421875,-3.625 L 4.421875,0 L 5.953125,0 L 5.953125,-3.953125 C 5.953125,-5.25 5.234375,-5.984375 3.984375,-5.984375 C 3.1875,-5.984375 2.65625,-5.6875 2.21875,-5.03125 L 2.21875,-5.890625 L 0.6875,-5.890625 z"+ id="path69" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.28125,-5.765625 L 2.4375,-5.765625 L 2.4375,-7.34375 L 0.90625,-7.34375 L 0.90625,-5.765625 L 0.15625,-5.765625 L 0.15625,-4.75 L 0.90625,-4.75 L 0.90625,-1.140625 C 0.90625,-0.203125 1.390625,0.25 2.40625,0.25 C 2.734375,0.25 3.015625,0.21875 3.28125,0.125 L 3.28125,-0.9375 C 3.125,-0.921875 3.046875,-0.90625 2.9375,-0.90625 C 2.53125,-0.90625 2.4375,-1.03125 2.4375,-1.546875 L 2.4375,-4.75 L 3.28125,-4.75 L 3.28125,-5.765625 z"+ id="path72" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.90625,0 L 5.90625,-5.890625 L 4.375,-5.890625 L 4.375,-2.203125 C 4.375,-1.5 3.875,-1.046875 3.140625,-1.046875 C 2.484375,-1.046875 2.15625,-1.390625 2.15625,-2.109375 L 2.15625,-5.890625 L 0.625,-5.890625 L 0.625,-1.78125 C 0.625,-0.484375 1.359375,0.25 2.609375,0.25 C 3.40625,0.25 3.9375,-0.046875 4.375,-0.703125 L 4.375,0 L 5.90625,0 z"+ id="path75" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path78" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.828125,-3.078125 L 4.109375,-3.078125 C 4.6875,-3.078125 5.140625,-3.25 5.515625,-3.59375 C 5.96875,-4 6.15625,-4.46875 6.15625,-5.140625 C 6.15625,-6.5 5.34375,-7.265625 3.90625,-7.265625 L 0.90625,-7.265625 L 0.90625,0 L 1.828125,0 L 1.828125,-3.078125 z M 1.828125,-3.890625 L 1.828125,-6.453125 L 3.765625,-6.453125 C 4.65625,-6.453125 5.1875,-5.96875 5.1875,-5.171875 C 5.1875,-4.375 4.65625,-3.890625 3.765625,-3.890625 L 1.828125,-3.890625 z"+ id="path81" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.6875,-5.21875 L 0.6875,0 L 1.53125,0 L 1.53125,-2.71875 C 1.53125,-3.453125 1.71875,-3.953125 2.109375,-4.234375 C 2.375,-4.421875 2.625,-4.484375 3.203125,-4.5 L 3.203125,-5.34375 C 3.0625,-5.359375 2.984375,-5.375 2.875,-5.375 C 2.34375,-5.375 1.9375,-5.046875 1.453125,-4.28125 L 1.453125,-5.21875 L 0.6875,-5.21875 z"+ id="path84" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.71875,-5.375 C 1.25,-5.375 0.359375,-4.328125 0.359375,-2.578125 C 0.359375,-0.8125 1.234375,0.234375 2.71875,0.234375 C 4.1875,0.234375 5.078125,-0.8125 5.078125,-2.53125 C 5.078125,-4.34375 4.21875,-5.375 2.71875,-5.375 z M 2.71875,-4.609375 C 3.65625,-4.609375 4.21875,-3.84375 4.21875,-2.546875 C 4.21875,-1.3125 3.640625,-0.53125 2.71875,-0.53125 C 1.796875,-0.53125 1.21875,-1.3125 1.21875,-2.578125 C 1.21875,-3.828125 1.796875,-4.609375 2.71875,-4.609375 z"+ id="path87" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.6875,-3.46875 C 4.65625,-3.984375 4.546875,-4.3125 4.34375,-4.59375 C 3.984375,-5.078125 3.359375,-5.375 2.625,-5.375 C 1.21875,-5.375 0.3125,-4.25 0.3125,-2.515625 C 0.3125,-0.84375 1.203125,0.234375 2.625,0.234375 C 3.875,0.234375 4.65625,-0.515625 4.75,-1.796875 L 3.921875,-1.796875 C 3.78125,-0.953125 3.34375,-0.53125 2.640625,-0.53125 C 1.71875,-0.53125 1.171875,-1.28125 1.171875,-2.515625 C 1.171875,-3.828125 1.71875,-4.609375 2.625,-4.609375 C 3.3125,-4.609375 3.765625,-4.203125 3.859375,-3.46875 L 4.6875,-3.46875 z"+ id="path90" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.109375,-2.328125 C 5.109375,-3.125 5.046875,-3.609375 4.90625,-4 C 4.5625,-4.859375 3.765625,-5.375 2.796875,-5.375 C 1.328125,-5.375 0.40625,-4.25 0.40625,-2.546875 C 0.40625,-0.828125 1.3125,0.234375 2.765625,0.234375 C 3.96875,0.234375 4.796875,-0.453125 5,-1.578125 L 4.171875,-1.578125 C 3.9375,-0.890625 3.46875,-0.53125 2.796875,-0.53125 C 2.265625,-0.53125 1.828125,-0.78125 1.546875,-1.21875 C 1.34375,-1.515625 1.28125,-1.8125 1.265625,-2.328125 L 5.109375,-2.328125 z M 1.28125,-3.015625 C 1.359375,-3.984375 1.9375,-4.609375 2.78125,-4.609375 C 3.59375,-4.609375 4.234375,-3.921875 4.234375,-3.078125 C 4.234375,-3.046875 4.234375,-3.03125 4.21875,-3.015625 L 1.28125,-3.015625 z"+ id="path93" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.359375,-3.765625 C 4.359375,-4.796875 3.671875,-5.375 2.46875,-5.375 C 1.25,-5.375 0.46875,-4.75 0.46875,-3.78125 C 0.46875,-2.953125 0.890625,-2.578125 2.125,-2.265625 L 2.90625,-2.078125 C 3.484375,-1.9375 3.703125,-1.734375 3.703125,-1.359375 C 3.703125,-0.875 3.21875,-0.53125 2.5,-0.53125 C 2.046875,-0.53125 1.671875,-0.671875 1.453125,-0.890625 C 1.328125,-1.03125 1.265625,-1.1875 1.21875,-1.5625 L 0.34375,-1.5625 C 0.375,-0.34375 1.0625,0.234375 2.421875,0.234375 C 3.734375,0.234375 4.578125,-0.421875 4.578125,-1.421875 C 4.578125,-2.203125 4.140625,-2.625 3.09375,-2.875 L 2.296875,-3.078125 C 1.625,-3.234375 1.328125,-3.453125 1.328125,-3.8125 C 1.328125,-4.296875 1.765625,-4.609375 2.4375,-4.609375 C 3.109375,-4.609375 3.46875,-4.3125 3.484375,-3.765625 L 4.359375,-3.765625 z"+ id="path96" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.328125,-0.484375 C 5.25,-0.46875 5.203125,-0.46875 5.15625,-0.46875 C 4.859375,-0.46875 4.703125,-0.625 4.703125,-0.875 L 4.703125,-3.953125 C 4.703125,-4.875 4.03125,-5.375 2.734375,-5.375 C 1.984375,-5.375 1.359375,-5.15625 1,-4.765625 C 0.765625,-4.5 0.671875,-4.203125 0.640625,-3.671875 L 1.484375,-3.671875 C 1.5625,-4.3125 1.9375,-4.609375 2.71875,-4.609375 C 3.453125,-4.609375 3.875,-4.328125 3.875,-3.828125 L 3.875,-3.609375 C 3.875,-3.265625 3.671875,-3.109375 3.015625,-3.03125 C 1.828125,-2.875 1.65625,-2.84375 1.328125,-2.71875 C 0.734375,-2.46875 0.421875,-2 0.421875,-1.3125 C 0.421875,-0.375 1.078125,0.234375 2.140625,0.234375 C 2.796875,0.234375 3.3125,0 3.90625,-0.53125 C 3.96875,-0.015625 4.234375,0.234375 4.765625,0.234375 C 4.9375,0.234375 5.0625,0.203125 5.328125,0.140625 L 5.328125,-0.484375 z M 3.875,-1.640625 C 3.875,-1.359375 3.796875,-1.203125 3.546875,-0.96875 C 3.203125,-0.65625 2.796875,-0.5 2.3125,-0.5 C 1.671875,-0.5 1.28125,-0.8125 1.28125,-1.328125 C 1.28125,-1.890625 1.65625,-2.15625 2.546875,-2.296875 C 3.421875,-2.40625 3.59375,-2.453125 3.875,-2.578125 L 3.875,-1.640625 z"+ id="path99" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.9375,-7.265625 L 4.109375,-7.265625 L 4.109375,-4.5625 C 3.765625,-5.09375 3.203125,-5.375 2.5,-5.375 C 1.140625,-5.375 0.265625,-4.28125 0.265625,-2.625 C 0.265625,-0.859375 1.125,0.234375 2.53125,0.234375 C 3.25,0.234375 3.75,-0.046875 4.203125,-0.6875 L 4.203125,0 L 4.9375,0 L 4.9375,-7.265625 z M 2.640625,-4.59375 C 3.53125,-4.59375 4.109375,-3.796875 4.109375,-2.546875 C 4.109375,-1.34375 3.53125,-0.546875 2.65625,-0.546875 C 1.734375,-0.546875 1.125,-1.359375 1.125,-2.578125 C 1.125,-3.78125 1.734375,-4.59375 2.640625,-4.59375 z"+ id="path102" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.515625,-5.21875 L 1.640625,-5.21875 L 1.640625,-6.046875 C 1.640625,-6.390625 1.84375,-6.5625 2.21875,-6.5625 C 2.296875,-6.5625 2.328125,-6.5625 2.515625,-6.5625 L 2.515625,-7.25 C 2.328125,-7.28125 2.21875,-7.296875 2.046875,-7.296875 C 1.28125,-7.296875 0.8125,-6.859375 0.8125,-6.109375 L 0.8125,-5.21875 L 0.125,-5.21875 L 0.125,-4.546875 L 0.8125,-4.546875 L 0.8125,0 L 1.640625,0 L 1.640625,-4.546875 L 2.515625,-4.546875 L 2.515625,-5.21875 z M 4.34375,-5.21875 L 3.515625,-5.21875 L 3.515625,0 L 4.34375,0 L 4.34375,-5.21875 z M 4.34375,-7.265625 L 3.515625,-7.265625 L 3.515625,-6.21875 L 4.34375,-6.21875 L 4.34375,-7.265625 z"+ id="path105" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.703125,-5.21875 L 0.703125,0 L 1.53125,0 L 1.53125,-2.875 C 1.53125,-3.953125 2.09375,-4.640625 2.953125,-4.640625 C 3.609375,-4.640625 4.03125,-4.25 4.03125,-3.625 L 4.03125,0 L 4.859375,0 L 4.859375,-3.953125 C 4.859375,-4.8125 4.203125,-5.375 3.203125,-5.375 C 2.421875,-5.375 1.921875,-5.078125 1.46875,-4.34375 L 1.46875,-5.21875 L 0.703125,-5.21875 z"+ id="path108" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.578125,-5.21875 L 1.703125,-5.21875 L 1.703125,-6.046875 C 1.703125,-6.390625 1.90625,-6.5625 2.28125,-6.5625 C 2.359375,-6.5625 2.375,-6.5625 2.578125,-6.5625 L 2.578125,-7.25 C 2.375,-7.28125 2.265625,-7.296875 2.109375,-7.296875 C 1.328125,-7.296875 0.875,-6.859375 0.875,-6.109375 L 0.875,-5.21875 L 0.171875,-5.21875 L 0.171875,-4.546875 L 0.875,-4.546875 L 0.875,0 L 1.703125,0 L 1.703125,-4.546875 L 2.578125,-4.546875 L 2.578125,-5.21875 z"+ id="path111" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.8125,0 L 4.8125,-5.21875 L 3.984375,-5.21875 L 3.984375,-2.265625 C 3.984375,-1.203125 3.421875,-0.5 2.546875,-0.5 C 1.890625,-0.5 1.46875,-0.890625 1.46875,-1.53125 L 1.46875,-5.21875 L 0.640625,-5.21875 L 0.640625,-1.203125 C 0.640625,-0.328125 1.296875,0.234375 2.3125,0.234375 C 3.078125,0.234375 3.5625,-0.046875 4.0625,-0.734375 L 4.0625,0 L 4.8125,0 z"+ id="path114" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.53125,-5.21875 L 1.671875,-5.21875 L 1.671875,-6.65625 L 0.84375,-6.65625 L 0.84375,-5.21875 L 0.140625,-5.21875 L 0.140625,-4.546875 L 0.84375,-4.546875 L 0.84375,-0.59375 C 0.84375,-0.0625 1.203125,0.234375 1.859375,0.234375 C 2.046875,0.234375 2.25,0.203125 2.53125,0.15625 L 2.53125,-0.53125 C 2.421875,-0.515625 2.296875,-0.5 2.140625,-0.5 C 1.78125,-0.5 1.671875,-0.59375 1.671875,-0.96875 L 1.671875,-4.546875 L 2.53125,-4.546875 L 2.53125,-5.21875 z"+ id="path117" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.5,-5.21875 L 0.671875,-5.21875 L 0.671875,0 L 1.5,0 L 1.5,-5.21875 z M 1.5,-7.265625 L 0.65625,-7.265625 L 0.65625,-6.21875 L 1.5,-6.21875 L 1.5,-7.265625 z"+ id="path120" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.84375,0 L 4.84375,-5.21875 L 3.90625,-5.21875 L 2.4375,-0.984375 L 1.03125,-5.21875 L 0.09375,-5.21875 L 1.9375,0 L 2.84375,0 z"+ id="path123" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.109375,-5.21875 L 4.109375,-4.46875 C 3.6875,-5.078125 3.1875,-5.375 2.515625,-5.375 C 1.1875,-5.375 0.296875,-4.21875 0.296875,-2.515625 C 0.296875,-1.671875 0.515625,-0.96875 0.953125,-0.46875 C 1.328125,-0.03125 1.890625,0.234375 2.4375,0.234375 C 3.09375,0.234375 3.5625,-0.046875 4.03125,-0.703125 L 4.03125,-0.4375 C 4.03125,0.265625 3.9375,0.703125 3.734375,0.984375 C 3.515625,1.296875 3.078125,1.46875 2.578125,1.46875 C 2.1875,1.46875 1.859375,1.375 1.625,1.203125 C 1.4375,1.046875 1.359375,0.90625 1.3125,0.59375 L 0.453125,0.59375 C 0.546875,1.578125 1.3125,2.171875 2.546875,2.171875 C 3.3125,2.171875 3.984375,1.921875 4.328125,1.5 C 4.71875,1.03125 4.875,0.375 4.875,-0.859375 L 4.875,-5.21875 L 4.109375,-5.21875 z M 2.609375,-4.609375 C 3.5,-4.609375 4.03125,-3.84375 4.03125,-2.546875 C 4.03125,-1.296875 3.484375,-0.53125 2.609375,-0.53125 C 1.703125,-0.53125 1.15625,-1.3125 1.15625,-2.578125 C 1.15625,-3.828125 1.71875,-4.609375 2.609375,-4.609375 z"+ id="path126" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.515625,-7.265625 L 0.671875,-7.265625 L 0.671875,0 L 1.515625,0 L 1.515625,-7.265625 z"+ id="path129" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.90625,-1.03125 L 0.875,-1.03125 L 0.875,0 L 1.90625,0 L 1.90625,-1.03125 z"+ id="path132" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.59375,-5.015625 C 6.3125,-6.609375 5.390625,-7.390625 3.796875,-7.390625 C 2.828125,-7.390625 2.03125,-7.078125 1.5,-6.484375 C 0.84375,-5.765625 0.484375,-4.71875 0.484375,-3.546875 C 0.484375,-2.359375 0.84375,-1.328125 1.53125,-0.625 C 2.09375,-0.046875 2.8125,0.234375 3.765625,0.234375 C 5.53125,0.234375 6.53125,-0.734375 6.75,-2.65625 L 5.796875,-2.65625 C 5.71875,-2.15625 5.609375,-1.8125 5.46875,-1.53125 C 5.15625,-0.921875 4.546875,-0.59375 3.765625,-0.59375 C 2.328125,-0.59375 1.40625,-1.75 1.40625,-3.5625 C 1.40625,-5.421875 2.28125,-6.5625 3.6875,-6.5625 C 4.28125,-6.5625 4.828125,-6.390625 5.125,-6.109375 C 5.390625,-5.859375 5.546875,-5.546875 5.65625,-5.015625 L 6.59375,-5.015625 z"+ id="path135" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.53125,2.171875 L 1.375,2.171875 L 1.375,-0.546875 C 1.8125,-0.015625 2.296875,0.234375 2.984375,0.234375 C 4.328125,0.234375 5.21875,-0.859375 5.21875,-2.515625 C 5.21875,-4.28125 4.359375,-5.375 2.96875,-5.375 C 2.265625,-5.375 1.6875,-5.046875 1.3125,-4.4375 L 1.3125,-5.21875 L 0.53125,-5.21875 L 0.53125,2.171875 z M 2.828125,-4.59375 C 3.75,-4.59375 4.34375,-3.78125 4.34375,-2.546875 C 4.34375,-1.359375 3.734375,-0.546875 2.828125,-0.546875 C 1.953125,-0.546875 1.375,-1.34375 1.375,-2.578125 C 1.375,-3.796875 1.953125,-4.59375 2.828125,-4.59375 z"+ id="path138" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.140625,-1.03125 L 1.09375,-1.03125 L 1.09375,0 L 2.140625,0 L 2.140625,-1.03125 z M 2.140625,-5.21875 L 1.09375,-5.21875 L 1.09375,-4.1875 L 2.140625,-4.1875 L 2.140625,-5.21875 z"+ id="path141" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path144" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-3.65625 L 4.171875,-5.359375 L 7.859375,0 L 9.4375,0 L 5.140625,-6.203125 L 9.390625,-10.453125 L 7.671875,-10.453125 L 2.46875,-5.15625 L 2.46875,-10.453125 L 1.140625,-10.453125 L 1.140625,0 L 2.46875,0 L 2.46875,-3.65625 z"+ id="path147" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.359375,-3.359375 C 7.359375,-4.5 7.265625,-5.1875 7.0625,-5.75 C 6.5625,-6.984375 5.421875,-7.734375 4.015625,-7.734375 C 1.921875,-7.734375 0.578125,-6.125 0.578125,-3.65625 C 0.578125,-1.1875 1.875,0.328125 3.984375,0.328125 C 5.703125,0.328125 6.90625,-0.640625 7.203125,-2.28125 L 6,-2.28125 C 5.671875,-1.296875 4.984375,-0.78125 4.03125,-0.78125 C 3.265625,-0.78125 2.625,-1.125 2.21875,-1.75 C 1.9375,-2.1875 1.84375,-2.609375 1.828125,-3.359375 L 7.359375,-3.359375 z M 1.84375,-4.328125 C 1.953125,-5.71875 2.796875,-6.625 4,-6.625 C 5.171875,-6.625 6.078125,-5.65625 6.078125,-4.421875 C 6.078125,-4.390625 6.078125,-4.359375 6.0625,-4.328125 L 1.84375,-4.328125 z"+ id="path150" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.5625,-7.515625 L 3.484375,-1.65625 L 1.5625,-7.515625 L 0.28125,-7.515625 L 2.828125,0.03125 L 2.359375,1.21875 C 2.1875,1.75 1.90625,1.953125 1.40625,1.953125 C 1.234375,1.953125 1.03125,1.921875 0.78125,1.859375 L 0.78125,2.9375 C 1.015625,3.0625 1.265625,3.125 1.578125,3.125 C 1.96875,3.125 2.375,3 2.703125,2.765625 C 3.0625,2.5 3.28125,2.1875 3.515625,1.578125 L 6.859375,-7.515625 L 5.5625,-7.515625 z"+ id="path153" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.75,-4.984375 C 6.703125,-5.71875 6.546875,-6.203125 6.25,-6.609375 C 5.734375,-7.3125 4.828125,-7.734375 3.78125,-7.734375 C 1.765625,-7.734375 0.4375,-6.125 0.4375,-3.625 C 0.4375,-1.203125 1.734375,0.328125 3.765625,0.328125 C 5.5625,0.328125 6.703125,-0.75 6.84375,-2.578125 L 5.640625,-2.578125 C 5.4375,-1.375 4.8125,-0.78125 3.796875,-0.78125 C 2.484375,-0.78125 1.6875,-1.84375 1.6875,-3.625 C 1.6875,-5.515625 2.46875,-6.625 3.765625,-6.625 C 4.78125,-6.625 5.40625,-6.03125 5.546875,-4.984375 L 6.75,-4.984375 z"+ id="path156" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.90625,-7.734375 C 1.796875,-7.734375 0.515625,-6.21875 0.515625,-3.703125 C 0.515625,-1.171875 1.78125,0.328125 3.921875,0.328125 C 6.03125,0.328125 7.3125,-1.171875 7.3125,-3.640625 C 7.3125,-6.234375 6.0625,-7.734375 3.90625,-7.734375 z M 3.921875,-6.625 C 5.265625,-6.625 6.0625,-5.515625 6.0625,-3.65625 C 6.0625,-1.890625 5.234375,-0.78125 3.921875,-0.78125 C 2.578125,-0.78125 1.765625,-1.875 1.765625,-3.703125 C 1.765625,-5.515625 2.578125,-6.625 3.921875,-6.625 z"+ id="path159" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1,-7.515625 L 1,0 L 2.203125,0 L 2.203125,-4.140625 C 2.203125,-5.6875 3.015625,-6.6875 4.25,-6.6875 C 5.1875,-6.6875 5.796875,-6.109375 5.796875,-5.203125 L 5.796875,0 L 6.984375,0 L 6.984375,-5.6875 C 6.984375,-6.921875 6.046875,-7.734375 4.609375,-7.734375 C 3.484375,-7.734375 2.765625,-7.296875 2.109375,-6.25 L 2.109375,-7.515625 L 1,-7.515625 z"+ id="path162" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.78125,3.125 L 1.984375,3.125 L 1.984375,-0.78125 C 2.609375,-0.015625 3.3125,0.328125 4.28125,0.328125 C 6.21875,0.328125 7.5,-1.234375 7.5,-3.625 C 7.5,-6.15625 6.265625,-7.734375 4.28125,-7.734375 C 3.25,-7.734375 2.4375,-7.265625 1.875,-6.390625 L 1.875,-7.515625 L 0.78125,-7.515625 L 0.78125,3.125 z M 4.078125,-6.609375 C 5.390625,-6.609375 6.25,-5.453125 6.25,-3.65625 C 6.25,-1.953125 5.375,-0.78125 4.078125,-0.78125 C 2.8125,-0.78125 1.984375,-1.9375 1.984375,-3.703125 C 1.984375,-5.46875 2.8125,-6.609375 4.078125,-6.609375 z"+ id="path165" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.640625,-7.515625 L 2.40625,-7.515625 L 2.40625,-9.578125 L 1.21875,-9.578125 L 1.21875,-7.515625 L 0.203125,-7.515625 L 0.203125,-6.546875 L 1.21875,-6.546875 L 1.21875,-0.859375 C 1.21875,-0.09375 1.734375,0.328125 2.671875,0.328125 C 2.953125,0.328125 3.234375,0.296875 3.640625,0.234375 L 3.640625,-0.78125 C 3.484375,-0.734375 3.296875,-0.71875 3.0625,-0.71875 C 2.546875,-0.71875 2.40625,-0.859375 2.40625,-1.390625 L 2.40625,-6.546875 L 3.640625,-6.546875 L 3.640625,-7.515625 z"+ id="path168" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.28125,-5.421875 C 6.265625,-6.90625 5.296875,-7.734375 3.5625,-7.734375 C 1.8125,-7.734375 0.671875,-6.828125 0.671875,-5.4375 C 0.671875,-4.265625 1.28125,-3.703125 3.0625,-3.265625 L 4.171875,-3 C 5,-2.796875 5.328125,-2.5 5.328125,-1.953125 C 5.328125,-1.25 4.640625,-0.78125 3.578125,-0.78125 C 2.9375,-0.78125 2.390625,-0.96875 2.09375,-1.28125 C 1.90625,-1.484375 1.828125,-1.703125 1.75,-2.234375 L 0.484375,-2.234375 C 0.546875,-0.5 1.515625,0.328125 3.484375,0.328125 C 5.375,0.328125 6.578125,-0.609375 6.578125,-2.046875 C 6.578125,-3.171875 5.953125,-3.78125 4.453125,-4.140625 L 3.3125,-4.421875 C 2.34375,-4.640625 1.921875,-4.96875 1.921875,-5.5 C 1.921875,-6.1875 2.53125,-6.625 3.515625,-6.625 C 4.46875,-6.625 4.984375,-6.203125 5.015625,-5.421875 L 6.28125,-5.421875 z"+ id="path171" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.390625,-10.453125 C 1.953125,-8.578125 1.046875,-5.96875 1.046875,-3.71875 C 1.046875,-1.453125 1.953125,1.15625 3.390625,3.046875 L 4.171875,3.046875 C 2.90625,0.984375 2.203125,-1.421875 2.203125,-3.71875 C 2.203125,-6 2.90625,-8.421875 4.171875,-10.453125 L 3.390625,-10.453125 z"+ id="path174" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.78125,-10.453125 L 1.4375,-10.453125 L 1.4375,0 L 2.78125,0 L 2.78125,-10.453125 z"+ id="path177" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.328125,3.046875 C 2.765625,1.15625 3.671875,-1.453125 3.671875,-3.703125 C 3.671875,-5.96875 2.765625,-8.578125 1.328125,-10.453125 L 0.546875,-10.453125 C 1.8125,-8.40625 2.515625,-6 2.515625,-3.703125 C 2.515625,-1.421875 1.8125,1 0.546875,3.046875 L 1.328125,3.046875 z"+ id="path180" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path183" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.65625,-2.765625 L 3.703125,-2.765625 C 4.21875,-2.765625 4.625,-2.921875 4.96875,-3.234375 C 5.359375,-3.59375 5.53125,-4.015625 5.53125,-4.625 C 5.53125,-5.84375 4.8125,-6.53125 3.515625,-6.53125 L 0.8125,-6.53125 L 0.8125,0 L 1.65625,0 L 1.65625,-2.765625 z M 1.65625,-3.5 L 1.65625,-5.796875 L 3.390625,-5.796875 C 4.1875,-5.796875 4.65625,-5.375 4.65625,-4.65625 C 4.65625,-3.9375 4.1875,-3.5 3.390625,-3.5 L 1.65625,-3.5 z"+ id="path186" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-4.703125 L 0.625,0 L 1.375,0 L 1.375,-2.4375 C 1.375,-3.109375 1.546875,-3.546875 1.90625,-3.8125 C 2.140625,-3.984375 2.359375,-4.03125 2.875,-4.046875 L 2.875,-4.8125 C 2.75,-4.828125 2.6875,-4.828125 2.59375,-4.828125 C 2.109375,-4.828125 1.734375,-4.546875 1.3125,-3.84375 L 1.3125,-4.703125 L 0.625,-4.703125 z"+ id="path189" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.4375,-4.828125 C 1.125,-4.828125 0.328125,-3.890625 0.328125,-2.3125 C 0.328125,-0.734375 1.109375,0.203125 2.453125,0.203125 C 3.765625,0.203125 4.578125,-0.734375 4.578125,-2.28125 C 4.578125,-3.90625 3.796875,-4.828125 2.4375,-4.828125 z M 2.453125,-4.140625 C 3.296875,-4.140625 3.796875,-3.453125 3.796875,-2.28125 C 3.796875,-1.1875 3.28125,-0.484375 2.453125,-0.484375 C 1.609375,-0.484375 1.109375,-1.171875 1.109375,-2.3125 C 1.109375,-3.4375 1.609375,-4.140625 2.453125,-4.140625 z"+ id="path192" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.21875,-3.125 C 4.1875,-3.578125 4.09375,-3.875 3.90625,-4.140625 C 3.59375,-4.578125 3.015625,-4.828125 2.375,-4.828125 C 1.109375,-4.828125 0.28125,-3.828125 0.28125,-2.265625 C 0.28125,-0.75 1.078125,0.203125 2.359375,0.203125 C 3.484375,0.203125 4.1875,-0.46875 4.28125,-1.609375 L 3.53125,-1.609375 C 3.40625,-0.859375 3.015625,-0.484375 2.375,-0.484375 C 1.546875,-0.484375 1.0625,-1.15625 1.0625,-2.265625 C 1.0625,-3.4375 1.546875,-4.140625 2.359375,-4.140625 C 2.984375,-4.140625 3.375,-3.78125 3.46875,-3.125 L 4.21875,-3.125 z"+ id="path195" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.59375,-2.09375 C 4.59375,-2.8125 4.546875,-3.25 4.40625,-3.59375 C 4.109375,-4.375 3.390625,-4.828125 2.515625,-4.828125 C 1.203125,-4.828125 0.359375,-3.828125 0.359375,-2.28125 C 0.359375,-0.75 1.171875,0.203125 2.5,0.203125 C 3.5625,0.203125 4.3125,-0.40625 4.5,-1.421875 L 3.75,-1.421875 C 3.546875,-0.8125 3.125,-0.484375 2.515625,-0.484375 C 2.046875,-0.484375 1.640625,-0.703125 1.390625,-1.09375 C 1.203125,-1.359375 1.140625,-1.625 1.140625,-2.09375 L 4.59375,-2.09375 z M 1.15625,-2.703125 C 1.21875,-3.578125 1.75,-4.140625 2.5,-4.140625 C 3.234375,-4.140625 3.796875,-3.53125 3.796875,-2.765625 C 3.796875,-2.75 3.796875,-2.71875 3.796875,-2.703125 L 1.15625,-2.703125 z"+ id="path198" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.921875,-3.390625 C 3.921875,-4.3125 3.3125,-4.828125 2.21875,-4.828125 C 1.125,-4.828125 0.421875,-4.265625 0.421875,-3.40625 C 0.421875,-2.65625 0.796875,-2.3125 1.90625,-2.046875 L 2.609375,-1.875 C 3.125,-1.75 3.34375,-1.5625 3.34375,-1.21875 C 3.34375,-0.78125 2.890625,-0.484375 2.25,-0.484375 C 1.84375,-0.484375 1.5,-0.59375 1.3125,-0.796875 C 1.1875,-0.9375 1.140625,-1.0625 1.09375,-1.40625 L 0.3125,-1.40625 C 0.34375,-0.3125 0.953125,0.203125 2.171875,0.203125 C 3.359375,0.203125 4.109375,-0.375 4.109375,-1.28125 C 4.109375,-1.984375 3.71875,-2.375 2.796875,-2.59375 L 2.078125,-2.765625 C 1.46875,-2.90625 1.203125,-3.109375 1.203125,-3.4375 C 1.203125,-3.859375 1.59375,-4.140625 2.203125,-4.140625 C 2.796875,-4.140625 3.125,-3.890625 3.140625,-3.390625 L 3.921875,-3.390625 z"+ id="path201" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.796875,-0.4375 C 4.71875,-0.421875 4.6875,-0.421875 4.640625,-0.421875 C 4.375,-0.421875 4.234375,-0.5625 4.234375,-0.796875 L 4.234375,-3.546875 C 4.234375,-4.390625 3.625,-4.828125 2.46875,-4.828125 C 1.78125,-4.828125 1.21875,-4.640625 0.90625,-4.28125 C 0.6875,-4.046875 0.59375,-3.78125 0.578125,-3.3125 L 1.34375,-3.3125 C 1.40625,-3.890625 1.734375,-4.140625 2.4375,-4.140625 C 3.109375,-4.140625 3.484375,-3.890625 3.484375,-3.4375 L 3.484375,-3.25 C 3.484375,-2.9375 3.296875,-2.796875 2.703125,-2.71875 C 1.65625,-2.59375 1.484375,-2.5625 1.203125,-2.4375 C 0.65625,-2.21875 0.375,-1.796875 0.375,-1.1875 C 0.375,-0.328125 0.96875,0.203125 1.921875,0.203125 C 2.515625,0.203125 2.984375,0 3.515625,-0.484375 C 3.5625,-0.015625 3.796875,0.203125 4.28125,0.203125 C 4.4375,0.203125 4.5625,0.1875 4.796875,0.125 L 4.796875,-0.4375 z M 3.484375,-1.484375 C 3.484375,-1.234375 3.421875,-1.078125 3.1875,-0.875 C 2.890625,-0.59375 2.515625,-0.453125 2.078125,-0.453125 C 1.5,-0.453125 1.15625,-0.71875 1.15625,-1.203125 C 1.15625,-1.6875 1.484375,-1.953125 2.28125,-2.0625 C 3.078125,-2.171875 3.234375,-2.203125 3.484375,-2.328125 L 3.484375,-1.484375 z"+ id="path204" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-4.703125 L 0.625,0 L 1.375,0 L 1.375,-2.59375 C 1.375,-3.546875 1.890625,-4.171875 2.65625,-4.171875 C 3.25,-4.171875 3.625,-3.828125 3.625,-3.25 L 3.625,0 L 4.375,0 L 4.375,-3.546875 C 4.375,-4.328125 3.78125,-4.828125 2.875,-4.828125 C 2.171875,-4.828125 1.734375,-4.5625 1.3125,-3.90625 L 1.3125,-4.703125 L 0.625,-4.703125 z"+ id="path207" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.4375,-6.53125 L 3.6875,-6.53125 L 3.6875,-4.109375 C 3.375,-4.578125 2.875,-4.828125 2.25,-4.828125 C 1.03125,-4.828125 0.234375,-3.859375 0.234375,-2.359375 C 0.234375,-0.765625 1.015625,0.203125 2.28125,0.203125 C 2.921875,0.203125 3.375,-0.03125 3.78125,-0.625 L 3.78125,0 L 4.4375,0 L 4.4375,-6.53125 z M 2.375,-4.140625 C 3.1875,-4.140625 3.6875,-3.421875 3.6875,-2.296875 C 3.6875,-1.203125 3.171875,-0.5 2.390625,-0.5 C 1.5625,-0.5 1.015625,-1.21875 1.015625,-2.3125 C 1.015625,-3.40625 1.5625,-4.140625 2.375,-4.140625 z"+ id="path210" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.9375,-4.515625 C 5.671875,-5.953125 4.859375,-6.640625 3.421875,-6.640625 C 2.53125,-6.640625 1.828125,-6.375 1.34375,-5.828125 C 0.75,-5.1875 0.4375,-4.25 0.4375,-3.1875 C 0.4375,-2.109375 0.765625,-1.1875 1.375,-0.5625 C 1.890625,-0.03125 2.53125,0.203125 3.375,0.203125 C 4.984375,0.203125 5.875,-0.65625 6.078125,-2.390625 L 5.203125,-2.390625 C 5.140625,-1.9375 5.046875,-1.625 4.921875,-1.375 C 4.640625,-0.828125 4.09375,-0.53125 3.390625,-0.53125 C 2.09375,-0.53125 1.265625,-1.5625 1.265625,-3.203125 C 1.265625,-4.875 2.046875,-5.90625 3.3125,-5.90625 C 3.84375,-5.90625 4.34375,-5.75 4.609375,-5.5 C 4.859375,-5.28125 4.984375,-5 5.078125,-4.515625 L 5.9375,-4.515625 z"+ id="path213" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.28125,-4.703125 L 1.5,-4.703125 L 1.5,-5.984375 L 0.765625,-5.984375 L 0.765625,-4.703125 L 0.125,-4.703125 L 0.125,-4.09375 L 0.765625,-4.09375 L 0.765625,-0.53125 C 0.765625,-0.0625 1.078125,0.203125 1.671875,0.203125 C 1.84375,0.203125 2.03125,0.1875 2.28125,0.140625 L 2.28125,-0.484375 C 2.171875,-0.453125 2.0625,-0.453125 1.921875,-0.453125 C 1.59375,-0.453125 1.5,-0.53125 1.5,-0.875 L 1.5,-4.09375 L 2.28125,-4.09375 L 2.28125,-4.703125 z"+ id="path216" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.328125,0 L 4.328125,-4.703125 L 3.578125,-4.703125 L 3.578125,-2.03125 C 3.578125,-1.078125 3.078125,-0.453125 2.296875,-0.453125 C 1.703125,-0.453125 1.328125,-0.8125 1.328125,-1.375 L 1.328125,-4.703125 L 0.578125,-4.703125 L 0.578125,-1.078125 C 0.578125,-0.296875 1.171875,0.203125 2.078125,0.203125 C 2.765625,0.203125 3.203125,-0.03125 3.65625,-0.65625 L 3.65625,0 L 4.328125,0 z"+ id="path219" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.515625,0 L 5.78125,-6.53125 L 4.890625,-6.53125 L 3.078125,-1 L 1.171875,-6.53125 L 0.265625,-6.53125 L 2.625,0 L 3.515625,0 z"+ id="path222" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.359375,-6.53125 L 0.609375,-6.53125 L 0.609375,0 L 1.359375,0 L 1.359375,-6.53125 z"+ id="path225" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.921875,-0.9375 L 0.984375,-0.9375 L 0.984375,0 L 1.921875,0 L 1.921875,-0.9375 z M 1.921875,-4.703125 L 0.984375,-4.703125 L 0.984375,-3.765625 L 1.921875,-3.765625 L 1.921875,-4.703125 z"+ id="path228" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.484375,1.953125 L 1.234375,1.953125 L 1.234375,-0.5 C 1.625,-0.015625 2.078125,0.203125 2.6875,0.203125 C 3.890625,0.203125 4.6875,-0.765625 4.6875,-2.265625 C 4.6875,-3.84375 3.921875,-4.828125 2.671875,-4.828125 C 2.03125,-4.828125 1.53125,-4.546875 1.171875,-3.984375 L 1.171875,-4.703125 L 0.484375,-4.703125 L 0.484375,1.953125 z M 2.546875,-4.140625 C 3.375,-4.140625 3.90625,-3.40625 3.90625,-2.28125 C 3.90625,-1.21875 3.359375,-0.5 2.546875,-0.5 C 1.765625,-0.5 1.234375,-1.203125 1.234375,-2.3125 C 1.234375,-3.421875 1.765625,-4.140625 2.546875,-4.140625 z"+ id="path231" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.265625,-4.703125 L 1.484375,-4.703125 L 1.484375,-5.4375 C 1.484375,-5.75 1.65625,-5.90625 2,-5.90625 C 2.0625,-5.90625 2.09375,-5.90625 2.265625,-5.90625 L 2.265625,-6.515625 C 2.09375,-6.5625 1.984375,-6.5625 1.84375,-6.5625 C 1.140625,-6.5625 0.734375,-6.171875 0.734375,-5.5 L 0.734375,-4.703125 L 0.109375,-4.703125 L 0.109375,-4.09375 L 0.734375,-4.09375 L 0.734375,0 L 1.484375,0 L 1.484375,-4.09375 L 2.265625,-4.09375 L 2.265625,-4.703125 z M 3.90625,-4.703125 L 3.171875,-4.703125 L 3.171875,0 L 3.90625,0 L 3.90625,-4.703125 z M 3.90625,-6.53125 L 3.171875,-6.53125 L 3.171875,-5.59375 L 3.90625,-5.59375 L 3.90625,-6.53125 z"+ id="path234" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.6875,-4.703125 L 3.6875,-4.015625 C 3.3125,-4.578125 2.859375,-4.828125 2.265625,-4.828125 C 1.0625,-4.828125 0.265625,-3.796875 0.265625,-2.265625 C 0.265625,-1.5 0.46875,-0.875 0.859375,-0.421875 C 1.203125,-0.03125 1.703125,0.203125 2.203125,0.203125 C 2.796875,0.203125 3.203125,-0.046875 3.625,-0.640625 L 3.625,-0.390625 C 3.625,0.234375 3.546875,0.625 3.359375,0.890625 C 3.15625,1.171875 2.765625,1.328125 2.3125,1.328125 C 1.96875,1.328125 1.671875,1.234375 1.46875,1.078125 C 1.296875,0.9375 1.21875,0.8125 1.171875,0.53125 L 0.40625,0.53125 C 0.5,1.421875 1.1875,1.953125 2.28125,1.953125 C 2.984375,1.953125 3.59375,1.734375 3.890625,1.359375 C 4.25,0.921875 4.390625,0.328125 4.390625,-0.765625 L 4.390625,-4.703125 L 3.6875,-4.703125 z M 2.34375,-4.140625 C 3.140625,-4.140625 3.625,-3.46875 3.625,-2.28125 C 3.625,-1.171875 3.140625,-0.484375 2.34375,-0.484375 C 1.53125,-0.484375 1.046875,-1.171875 1.046875,-2.3125 C 1.046875,-3.4375 1.546875,-4.140625 2.34375,-4.140625 z"+ id="path237" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.34375,-4.703125 L 0.59375,-4.703125 L 0.59375,0 L 1.34375,0 L 1.34375,-4.703125 z M 1.34375,-6.53125 L 0.59375,-6.53125 L 0.59375,-5.59375 L 1.34375,-5.59375 L 1.34375,-6.53125 z"+ id="path240" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-4.703125 L 0.625,0 L 1.375,0 L 1.375,-2.953125 C 1.375,-3.625 1.875,-4.171875 2.484375,-4.171875 C 3.046875,-4.171875 3.359375,-3.84375 3.359375,-3.234375 L 3.359375,0 L 4.109375,0 L 4.109375,-2.953125 C 4.109375,-3.625 4.59375,-4.171875 5.203125,-4.171875 C 5.765625,-4.171875 6.078125,-3.828125 6.078125,-3.234375 L 6.078125,0 L 6.828125,0 L 6.828125,-3.53125 C 6.828125,-4.375 6.34375,-4.828125 5.46875,-4.828125 C 4.84375,-4.828125 4.46875,-4.640625 4.03125,-4.109375 C 3.75,-4.625 3.375,-4.828125 2.765625,-4.828125 C 2.140625,-4.828125 1.71875,-4.59375 1.3125,-4.03125 L 1.3125,-4.703125 L 0.625,-4.703125 z"+ id="path243" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.71875,-0.9375 L 0.78125,-0.9375 L 0.78125,0 L 1.71875,0 L 1.71875,-0.9375 z"+ id="path246" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-22"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-2.984375 L 4.765625,-2.984375 L 4.765625,-3.71875 L 1.640625,-3.71875 L 1.640625,-5.796875 L 5.1875,-5.796875 L 5.1875,-6.53125 L 0.8125,-6.53125 L 0.8125,0 L 1.640625,0 L 1.640625,-2.984375 z"+ id="path249" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-23"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.484375,-6.53125 L 0.484375,0 L 1.15625,0 L 1.15625,-0.59375 C 1.515625,-0.046875 1.984375,0.203125 2.640625,0.203125 C 3.890625,0.203125 4.6875,-0.8125 4.6875,-2.375 C 4.6875,-3.890625 3.921875,-4.828125 2.6875,-4.828125 C 2.03125,-4.828125 1.578125,-4.59375 1.234375,-4.0625 L 1.234375,-6.53125 L 0.484375,-6.53125 z M 2.53125,-4.140625 C 3.375,-4.140625 3.90625,-3.40625 3.90625,-2.28125 C 3.90625,-1.21875 3.359375,-0.5 2.53125,-0.5 C 1.75,-0.5 1.234375,-1.203125 1.234375,-2.3125 C 1.234375,-3.421875 1.75,-4.140625 2.53125,-4.140625 z"+ id="path252" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-24"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-6.53125 L 0.625,0 L 1.375,0 L 1.375,-2.59375 C 1.375,-3.546875 1.875,-4.171875 2.640625,-4.171875 C 2.890625,-4.171875 3.125,-4.09375 3.3125,-3.96875 C 3.53125,-3.8125 3.609375,-3.59375 3.609375,-3.25 L 3.609375,0 L 4.359375,0 L 4.359375,-3.546875 C 4.359375,-4.34375 3.796875,-4.828125 2.875,-4.828125 C 2.21875,-4.828125 1.8125,-4.625 1.375,-4.046875 L 1.375,-6.53125 L 0.625,-6.53125 z"+ id="path255" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-25"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.5625,0 L 4.359375,-4.703125 L 3.515625,-4.703125 L 2.1875,-0.890625 L 0.9375,-4.703125 L 0.09375,-4.703125 L 1.734375,0 L 2.5625,0 z"+ id="path258" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-26"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.796875,-6.53125 L 5,-6.53125 L 5,-1.1875 L 1.59375,-6.53125 L 0.6875,-6.53125 L 0.6875,0 L 1.46875,0 L 1.46875,-5.296875 L 4.859375,0 L 5.796875,0 L 5.796875,-6.53125 z"+ id="path261" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-27"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.171875,-5.796875 L 5.3125,-5.796875 L 5.3125,-6.53125 L 0.1875,-6.53125 L 0.1875,-5.796875 L 2.34375,-5.796875 L 2.34375,0 L 3.171875,0 L 3.171875,-5.796875 z"+ id="path264" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-28"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.3125,-4.703125 L 1.53125,-4.703125 L 1.53125,-5.4375 C 1.53125,-5.75 1.71875,-5.90625 2.046875,-5.90625 C 2.109375,-5.90625 2.140625,-5.90625 2.3125,-5.90625 L 2.3125,-6.515625 C 2.140625,-6.5625 2.046875,-6.5625 1.890625,-6.5625 C 1.203125,-6.5625 0.796875,-6.171875 0.796875,-5.5 L 0.796875,-4.703125 L 0.15625,-4.703125 L 0.15625,-4.09375 L 0.796875,-4.09375 L 0.796875,0 L 1.53125,0 L 1.53125,-4.09375 L 2.3125,-4.09375 L 2.3125,-4.703125 z"+ id="path267" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-29"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.484375,-4.703125 L 2.171875,-1.046875 L 0.984375,-4.703125 L 0.171875,-4.703125 L 1.765625,0.015625 L 1.484375,0.765625 C 1.359375,1.09375 1.1875,1.21875 0.875,1.21875 C 0.765625,1.21875 0.640625,1.203125 0.484375,1.171875 L 0.484375,1.84375 C 0.640625,1.921875 0.796875,1.953125 0.984375,1.953125 C 1.234375,1.953125 1.484375,1.875 1.6875,1.734375 C 1.921875,1.5625 2.046875,1.359375 2.203125,0.984375 L 4.28125,-4.703125 L 3.484375,-4.703125 z"+ id="path270" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-30"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.78125,-0.9375 L 0.78125,0 L 1.3125,0 L 1.3125,0.15625 C 1.3125,0.78125 1.203125,0.953125 0.78125,0.984375 L 0.78125,1.3125 C 1.40625,1.3125 1.71875,0.921875 1.71875,0.140625 L 1.71875,-0.9375 L 0.78125,-0.9375 z"+ id="path273" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path276" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.265625,-3.65625 L 0.484375,0 L 1.078125,0 L 1.5,-2.015625 C 1.671875,-2.78125 2.15625,-3.25 2.78125,-3.25 C 3.125,-3.25 3.390625,-3.015625 3.390625,-2.6875 C 3.390625,-2.640625 3.375,-2.546875 3.34375,-2.4375 L 2.828125,0 L 3.421875,0 L 3.96875,-2.625 C 4,-2.703125 4,-2.796875 4,-2.890625 C 4,-3.421875 3.625,-3.75 3.046875,-3.75 C 2.515625,-3.75 2.0625,-3.5625 1.703125,-3.203125 L 1.796875,-3.65625 L 1.265625,-3.65625 z"+ id="path279" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.265625,-3.65625 L 0.5,0 L 1.078125,0 L 1.5625,-2.296875 C 1.671875,-2.828125 2.15625,-3.25 2.625,-3.25 C 2.96875,-3.25 3.1875,-3.0625 3.1875,-2.78125 C 3.1875,-2.703125 3.1875,-2.609375 3.15625,-2.515625 L 2.625,0 L 3.21875,0 L 3.703125,-2.296875 C 3.8125,-2.84375 4.296875,-3.25 4.796875,-3.25 C 5.125,-3.25 5.328125,-3.046875 5.328125,-2.71875 C 5.328125,-2.609375 5.328125,-2.609375 5.265625,-2.375 L 4.765625,0 L 5.34375,0 L 5.890625,-2.59375 C 5.921875,-2.671875 5.9375,-2.90625 5.9375,-2.984375 C 5.9375,-3.15625 5.859375,-3.359375 5.71875,-3.515625 C 5.5625,-3.6875 5.375,-3.75 5.046875,-3.75 C 4.59375,-3.75 4.203125,-3.578125 3.796875,-3.171875 C 3.671875,-3.5625 3.40625,-3.75 2.953125,-3.75 C 2.46875,-3.75 2.15625,-3.609375 1.703125,-3.203125 L 1.796875,-3.65625 L 1.265625,-3.65625 z"+ id="path282" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path285" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.65625,-3.984375 L 0.890625,-3.984375 L 0.890625,-3.203125 L 1.65625,-3.203125 L 1.65625,-3.984375 z M 0.890625,-0.765625 L 0.890625,0 L 1.65625,0 L 1.65625,-0.765625 L 0.890625,-0.765625 z"+ id="path288" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.34375,-3 C 6.46875,-3 6.640625,-3 6.640625,-3.1875 C 6.640625,-3.375 6.453125,-3.375 6.3125,-3.375 L 0.84375,-3.375 C 0.703125,-3.375 0.515625,-3.375 0.515625,-3.1875 C 0.515625,-3 0.6875,-3 0.8125,-3 L 6.34375,-3 z M 6.3125,-1.109375 C 6.453125,-1.109375 6.640625,-1.109375 6.640625,-1.3125 C 6.640625,-1.5 6.46875,-1.5 6.34375,-1.5 L 0.8125,-1.5 C 0.6875,-1.5 0.515625,-1.5 0.515625,-1.3125 C 0.515625,-1.109375 0.703125,-1.109375 0.84375,-1.109375 L 6.3125,-1.109375 z"+ id="path291" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.484375,-6.734375 C 1.421875,-5.84375 0.71875,-4.3125 0.71875,-2.25 C 0.71875,-0.109375 1.46875,1.375 2.484375,2.234375 L 3.0625,2.234375 C 2.578125,1.734375 1.46875,0.59375 1.46875,-2.25 C 1.46875,-5.078125 2.578125,-6.21875 3.0625,-6.734375 L 2.484375,-6.734375 z"+ id="path294" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,2.234375 C 2.15625,1.34375 2.859375,-0.1875 2.859375,-2.25 C 2.859375,-4.375 2.109375,-5.875 1.09375,-6.734375 L 0.515625,-6.734375 C 1,-6.234375 2.109375,-5.078125 2.109375,-2.25 C 2.109375,0.59375 1,1.734375 0.515625,2.234375 L 1.09375,2.234375 z"+ id="path297" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph14-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path300" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph14-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.765625,-0.484375 C 1.765625,-0.75 1.546875,-0.96875 1.28125,-0.96875 C 1,-0.96875 0.796875,-0.75 0.796875,-0.484375 C 0.796875,-0.21875 1,0 1.28125,0 C 1.546875,0 1.765625,-0.21875 1.765625,-0.484375 z"+ id="path303" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph14-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-0.140625 C 1.625,0.15625 1.625,0.890625 0.96875,1.53125 C 0.921875,1.578125 0.921875,1.59375 0.921875,1.625 C 0.921875,1.6875 0.984375,1.734375 1.03125,1.734375 C 1.125,1.734375 1.859375,1.03125 1.859375,-0.015625 C 1.859375,-0.578125 1.65625,-0.96875 1.28125,-0.96875 C 0.96875,-0.96875 0.796875,-0.734375 0.796875,-0.484375 C 0.796875,-0.234375 0.96875,0 1.28125,0 C 1.40625,0 1.546875,-0.046875 1.625,-0.140625 z"+ id="path306" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path309" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.0625,1.90625 L 0.8125,1.90625 L 1.359375,-0.609375 C 1.625,-0.03125 2,0.203125 2.640625,0.203125 C 3.34375,0.203125 4.015625,-0.109375 4.46875,-0.6875 C 4.953125,-1.28125 5.25,-2.203125 5.25,-3.078125 C 5.25,-4.15625 4.65625,-4.828125 3.6875,-4.828125 C 3.296875,-4.828125 2.90625,-4.71875 2.546875,-4.484375 C 2.265625,-4.3125 2.15625,-4.1875 2.03125,-3.953125 L 2.203125,-4.703125 L 1.46875,-4.703125 L 0.0625,1.90625 z M 3.40625,-4.140625 C 4.078125,-4.140625 4.46875,-3.671875 4.46875,-2.90625 C 4.46875,-2.421875 4.3125,-1.84375 4.078125,-1.390625 C 3.734375,-0.78125 3.296875,-0.484375 2.703125,-0.484375 C 2.046875,-0.484375 1.640625,-0.9375 1.640625,-1.65625 C 1.640625,-2.1875 1.796875,-2.765625 2.0625,-3.234375 C 2.390625,-3.84375 2.84375,-4.140625 3.40625,-4.140625 z"+ id="path312" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.328125,-4.625 C 6.390625,-4.875 6.40625,-4.984375 6.40625,-5.125 C 6.40625,-5.5 6.21875,-5.921875 5.921875,-6.171875 C 5.546875,-6.5 5.078125,-6.640625 4.375,-6.640625 C 3.453125,-6.640625 2.71875,-6.390625 2.25,-5.890625 C 1.875,-5.5 1.59375,-4.875 1.59375,-4.40625 C 1.59375,-3.84375 1.984375,-3.375 2.59375,-3.203125 L 4.125,-2.765625 C 4.84375,-2.5625 5.140625,-2.3125 5.140625,-1.875 C 5.140625,-1.59375 4.96875,-1.25 4.71875,-1.015625 C 4.34375,-0.6875 3.828125,-0.515625 3.109375,-0.515625 C 2.09375,-0.515625 1.625,-0.890625 1.625,-1.71875 C 1.625,-1.828125 1.625,-1.90625 1.65625,-2.078125 L 0.875,-2.078125 C 0.8125,-1.84375 0.796875,-1.703125 0.796875,-1.515625 C 0.796875,-0.4375 1.609375,0.203125 2.953125,0.203125 C 3.90625,0.203125 4.6875,-0.046875 5.21875,-0.546875 C 5.671875,-0.96875 6,-1.625 6,-2.125 C 6,-2.359375 5.921875,-2.609375 5.78125,-2.828125 C 5.59375,-3.140625 5.328125,-3.3125 4.90625,-3.4375 L 3.359375,-3.875 C 2.671875,-4.078125 2.453125,-4.25 2.453125,-4.640625 C 2.453125,-4.953125 2.59375,-5.234375 2.859375,-5.484375 C 3.1875,-5.78125 3.625,-5.921875 4.21875,-5.921875 C 4.71875,-5.921875 5.09375,-5.828125 5.296875,-5.640625 C 5.46875,-5.484375 5.578125,-5.203125 5.578125,-4.9375 C 5.578125,-4.859375 5.5625,-4.796875 5.546875,-4.625 L 6.328125,-4.625 z"+ id="path315" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.34375,-4.703125 L 1.59375,-4.703125 L 0.59375,0 L 1.34375,0 L 2.34375,-4.703125 z M 2.734375,-6.53125 L 1.984375,-6.53125 L 1.78125,-5.609375 L 2.53125,-5.609375 L 2.734375,-6.53125 z"+ id="path318" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.9375,-3.125 L 4.953125,-3.25 C 4.953125,-3.390625 4.96875,-3.484375 4.96875,-3.515625 C 4.96875,-3.8125 4.8125,-4.171875 4.578125,-4.40625 C 4.296875,-4.703125 3.921875,-4.828125 3.421875,-4.828125 C 2.609375,-4.828125 1.890625,-4.5 1.40625,-3.875 C 0.984375,-3.328125 0.6875,-2.34375 0.6875,-1.53125 C 0.6875,-1.109375 0.828125,-0.65625 1.078125,-0.34375 C 1.375,0.03125 1.78125,0.203125 2.359375,0.203125 C 3.09375,0.203125 3.71875,-0.046875 4.125,-0.53125 C 4.359375,-0.8125 4.5,-1.109375 4.640625,-1.609375 L 3.890625,-1.609375 C 3.625,-0.875 3.125,-0.484375 2.484375,-0.484375 C 1.859375,-0.484375 1.46875,-0.921875 1.46875,-1.625 C 1.46875,-2.203125 1.65625,-2.875 1.953125,-3.34375 C 2.28125,-3.875 2.734375,-4.140625 3.28125,-4.140625 C 3.84375,-4.140625 4.203125,-3.828125 4.203125,-3.3125 C 4.203125,-3.265625 4.203125,-3.203125 4.1875,-3.125 L 4.9375,-3.125 z"+ id="path321" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.578125,0 L 5.359375,-4.703125 L 4.546875,-4.703125 L 2.359375,-0.921875 L 1.921875,-4.703125 L 1.09375,-4.703125 L 1.765625,0 L 2.578125,0 z"+ id="path324" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.3125,-4.703125 L 2.546875,-4.703125 L 2.6875,-5.3125 C 2.78125,-5.765625 2.9375,-5.921875 3.328125,-5.921875 C 3.390625,-5.921875 3.4375,-5.921875 3.5625,-5.90625 L 3.703125,-6.515625 C 3.546875,-6.5625 3.4375,-6.5625 3.296875,-6.5625 C 2.609375,-6.5625 2.109375,-6.15625 1.96875,-5.5 L 1.796875,-4.703125 L 1.171875,-4.703125 L 1.046875,-4.09375 L 1.671875,-4.09375 L 0.796875,0 L 1.546875,0 L 2.421875,-4.09375 L 3.1875,-4.09375 L 3.3125,-4.703125 z"+ id="path327" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path330" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.8125,-3.515625 L 1.8125,0 L 2.421875,0 L 2.421875,-4.9375 L 2.015625,-4.9375 C 1.796875,-4.1875 1.65625,-4.078125 0.703125,-3.953125 L 0.703125,-3.515625 L 1.8125,-3.515625 z"+ id="path333" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path336" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3,-3.6875 L 5.71875,-3.6875 C 6.484375,-3.6875 7.046875,-3.890625 7.578125,-4.3125 C 8.328125,-4.90625 8.765625,-5.828125 8.765625,-6.796875 C 8.765625,-8.0625 8.015625,-8.71875 6.546875,-8.71875 L 2.9375,-8.71875 L 1.09375,0 L 2.21875,0 L 3,-3.6875 z M 3.203125,-4.671875 L 3.859375,-7.734375 L 6.1875,-7.734375 C 7.109375,-7.734375 7.609375,-7.328125 7.609375,-6.578125 C 7.609375,-6.15625 7.46875,-5.765625 7.203125,-5.40625 C 6.796875,-4.90625 6.28125,-4.671875 5.515625,-4.671875 L 3.203125,-4.671875 z"+ id="path339" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 9.203125,-6.015625 C 9.171875,-6.71875 9.046875,-7.171875 8.828125,-7.578125 C 8.328125,-8.421875 7.484375,-8.859375 6.359375,-8.859375 C 4.953125,-8.859375 3.796875,-8.296875 2.875,-7.171875 C 1.921875,-6.03125 1.34375,-4.390625 1.34375,-2.890625 C 1.34375,-2.0625 1.578125,-1.296875 2.015625,-0.734375 C 2.5625,-0.046875 3.328125,0.28125 4.390625,0.28125 C 5.65625,0.28125 6.75,-0.1875 7.53125,-1.046875 C 8,-1.546875 8.375,-2.21875 8.78125,-3.171875 L 7.609375,-3.171875 C 7.3125,-2.5 7.125,-2.140625 6.90625,-1.859375 C 6.40625,-1.140625 5.5,-0.6875 4.546875,-0.6875 C 3.3125,-0.6875 2.484375,-1.65625 2.484375,-3.109375 C 2.484375,-4.203125 2.84375,-5.390625 3.453125,-6.296875 C 4.1875,-7.375 5.0625,-7.890625 6.15625,-7.890625 C 7.359375,-7.890625 7.953125,-7.296875 8.0625,-6.015625 L 9.203125,-6.015625 z"+ id="path342" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph13-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path345" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph13-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.84375,-2.25 L 5.6875,-4.078125 C 5.78125,-4.171875 5.796875,-4.21875 5.796875,-4.28125 C 5.796875,-4.40625 5.6875,-4.46875 5.609375,-4.46875 C 5.53125,-4.46875 5.5,-4.453125 5.421875,-4.359375 L 3.578125,-2.53125 L 1.75,-4.359375 C 1.65625,-4.453125 1.609375,-4.46875 1.546875,-4.46875 C 1.4375,-4.46875 1.359375,-4.390625 1.359375,-4.28125 C 1.359375,-4.203125 1.390625,-4.171875 1.46875,-4.09375 L 3.3125,-2.25 L 1.46875,-0.40625 C 1.375,-0.328125 1.359375,-0.265625 1.359375,-0.21875 C 1.359375,-0.09375 1.4375,-0.015625 1.546875,-0.015625 C 1.625,-0.015625 1.65625,-0.046875 1.734375,-0.140625 L 3.578125,-1.96875 L 5.40625,-0.140625 C 5.5,-0.03125 5.5625,-0.015625 5.609375,-0.015625 C 5.6875,-0.015625 5.796875,-0.09375 5.796875,-0.21875 C 5.796875,-0.28125 5.78125,-0.3125 5.6875,-0.40625 L 3.84375,-2.25 z"+ id="path348" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph13-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.890625,-2.046875 C 7.1875,-1.53125 6.921875,-0.828125 6.921875,-0.75 C 6.921875,-0.671875 6.984375,-0.640625 7.046875,-0.640625 C 7.140625,-0.640625 7.15625,-0.671875 7.234375,-0.828125 C 7.640625,-1.71875 8.359375,-2.03125 8.625,-2.140625 C 8.671875,-2.15625 8.703125,-2.203125 8.703125,-2.25 C 8.703125,-2.328125 8.65625,-2.34375 8.5625,-2.375 C 7.625,-2.796875 7.34375,-3.421875 7.1875,-3.765625 C 7.171875,-3.796875 7.140625,-3.859375 7.046875,-3.859375 C 6.984375,-3.859375 6.921875,-3.828125 6.921875,-3.734375 C 6.921875,-3.65625 7.1875,-2.953125 7.890625,-2.4375 L 0.828125,-2.4375 C 0.6875,-2.4375 0.515625,-2.4375 0.515625,-2.25 C 0.515625,-2.046875 0.6875,-2.046875 0.828125,-2.046875 L 7.890625,-2.046875 z"+ id="path351" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph13-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.46875,-2.96875 C 6.609375,-2.96875 6.625,-2.96875 6.703125,-2.90625 C 6.875,-2.765625 7.296875,-2.453125 7.828125,-2.25 C 7.53125,-2.125 7.109375,-1.90625 6.703125,-1.59375 C 6.625,-1.53125 6.609375,-1.53125 6.46875,-1.53125 L 0.8125,-1.53125 C 0.6875,-1.53125 0.515625,-1.53125 0.515625,-1.34375 C 0.515625,-1.140625 0.703125,-1.140625 0.84375,-1.140625 L 6.203125,-1.140625 C 5.6875,-0.625 5.328125,0.078125 5.328125,0.15625 C 5.328125,0.265625 5.4375,0.265625 5.515625,0.265625 C 5.65625,0.265625 5.65625,0.265625 5.75,0.09375 C 6.09375,-0.53125 6.421875,-0.875 6.75,-1.171875 C 7.484375,-1.828125 8.296875,-2.046875 8.59375,-2.140625 C 8.609375,-2.140625 8.703125,-2.15625 8.703125,-2.25 C 8.703125,-2.328125 8.625,-2.34375 8.59375,-2.359375 C 7.578125,-2.640625 6.5,-3.203125 5.75,-4.59375 C 5.65625,-4.75 5.65625,-4.765625 5.515625,-4.765625 C 5.4375,-4.765625 5.328125,-4.765625 5.328125,-4.640625 C 5.328125,-4.578125 5.6875,-3.875 6.203125,-3.359375 L 0.84375,-3.359375 C 0.703125,-3.359375 0.515625,-3.359375 0.515625,-3.15625 C 0.515625,-2.96875 0.6875,-2.96875 0.8125,-2.96875 L 6.46875,-2.96875 z"+ id="path354" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph17-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path357" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph17-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.875,-2.8125 C 1.921875,-2.890625 1.9375,-2.9375 1.9375,-3 C 1.9375,-3.203125 1.75,-3.34375 1.578125,-3.34375 C 1.375,-3.34375 1.28125,-3.203125 1.234375,-3.078125 L 0.390625,-0.484375 C 0.359375,-0.40625 0.359375,-0.390625 0.359375,-0.390625 C 0.359375,-0.296875 0.5625,-0.234375 0.609375,-0.234375 C 0.671875,-0.234375 0.6875,-0.28125 0.71875,-0.328125 L 1.875,-2.8125 z"+ id="path360" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph16-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path363" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph16-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.078125,-3.140625 L 0.421875,0 L 0.921875,0 L 1.28125,-1.734375 C 1.4375,-2.390625 1.84375,-2.796875 2.390625,-2.796875 C 2.6875,-2.796875 2.90625,-2.578125 2.90625,-2.3125 C 2.90625,-2.28125 2.890625,-2.1875 2.875,-2.09375 L 2.421875,0 L 2.9375,0 L 3.40625,-2.25 C 3.421875,-2.328125 3.4375,-2.40625 3.4375,-2.484375 C 3.4375,-2.9375 3.125,-3.21875 2.625,-3.21875 C 2.171875,-3.21875 1.765625,-3.0625 1.453125,-2.75 L 1.53125,-3.140625 L 1.078125,-3.140625 z"+ id="path366" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph16-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,-3.140625 L 0.421875,0 L 0.921875,0 L 1.34375,-1.96875 C 1.4375,-2.421875 1.84375,-2.796875 2.25,-2.796875 C 2.546875,-2.796875 2.734375,-2.625 2.734375,-2.375 C 2.734375,-2.3125 2.734375,-2.234375 2.71875,-2.15625 L 2.25,0 L 2.765625,0 L 3.171875,-1.96875 C 3.265625,-2.4375 3.6875,-2.796875 4.125,-2.796875 C 4.40625,-2.796875 4.578125,-2.625 4.578125,-2.328125 C 4.578125,-2.25 4.578125,-2.25 4.515625,-2.046875 L 4.09375,0 L 4.59375,0 L 5.0625,-2.234375 C 5.078125,-2.296875 5.09375,-2.5 5.09375,-2.5625 C 5.09375,-2.71875 5.03125,-2.890625 4.90625,-3.015625 C 4.78125,-3.171875 4.609375,-3.21875 4.34375,-3.21875 C 3.953125,-3.21875 3.609375,-3.0625 3.25,-2.734375 C 3.15625,-3.0625 2.921875,-3.21875 2.53125,-3.21875 C 2.125,-3.21875 1.84375,-3.109375 1.46875,-2.75 L 1.546875,-3.140625 L 1.09375,-3.140625 z"+ id="path369" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path372" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.609375,-5.21875 L 1.765625,-5.21875 L 0.65625,0 L 1.5,0 L 2.609375,-5.21875 z M 3.046875,-7.265625 L 2.203125,-7.265625 L 1.984375,-6.234375 L 2.828125,-6.234375 L 3.046875,-7.265625 z"+ id="path375" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.828125,-5.375 C 2.90625,-5.375 2.078125,-4.953125 1.578125,-4.21875 C 1.125,-3.578125 0.796875,-2.484375 0.796875,-1.640625 C 0.796875,-0.53125 1.5625,0.234375 2.6875,0.234375 C 3.640625,0.234375 4.390625,-0.15625 4.953125,-0.921875 C 5.40625,-1.5625 5.734375,-2.640625 5.734375,-3.515625 C 5.734375,-4.03125 5.546875,-4.546875 5.1875,-4.890625 C 4.859375,-5.21875 4.40625,-5.375 3.828125,-5.375 z M 3.703125,-4.609375 C 4.4375,-4.609375 4.859375,-4.125 4.859375,-3.3125 C 4.859375,-2.734375 4.6875,-2.078125 4.421875,-1.578125 C 4.046875,-0.890625 3.515625,-0.53125 2.828125,-0.53125 C 2.109375,-0.53125 1.671875,-1.03125 1.671875,-1.828125 C 1.671875,-2.40625 1.84375,-3.0625 2.109375,-3.5625 C 2.484375,-4.234375 3.046875,-4.609375 3.703125,-4.609375 z"+ id="path378" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph19-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path381" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph19-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.28125,0 L 4.765625,-4.171875 L 4.046875,-4.171875 L 2.09375,-0.8125 L 1.703125,-4.171875 L 0.96875,-4.171875 L 1.5625,0 L 2.28125,0 z"+ id="path384" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph19-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.953125,-4.171875 L 2.265625,-4.171875 L 2.375,-4.71875 C 2.46875,-5.125 2.609375,-5.265625 2.953125,-5.265625 C 3.015625,-5.265625 3.0625,-5.265625 3.171875,-5.25 L 3.296875,-5.796875 C 3.140625,-5.828125 3.0625,-5.828125 2.9375,-5.828125 C 2.3125,-5.828125 1.875,-5.46875 1.75,-4.890625 L 1.59375,-4.171875 L 1.03125,-4.171875 L 0.921875,-3.640625 L 1.484375,-3.640625 L 0.703125,0 L 1.375,0 L 2.15625,-3.640625 L 2.84375,-3.640625 L 2.953125,-4.171875 z"+ id="path387" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path390" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M -0.15625,-3.09375 C -0.203125,-3.078125 -0.21875,-3.046875 -0.21875,-3.015625 C -0.234375,-2.96875 -0.21875,-2.921875 -0.21875,-2.875 C -0.21875,-2.8125 -0.234375,-2.75 -0.203125,-2.703125 C -0.15625,-2.578125 -0.09375,-2.46875 -0.03125,-2.375 C 0.109375,-2.15625 0.265625,-1.953125 0.4375,-1.75 C 1.109375,-0.9375 2.046875,-0.34375 3.09375,-0.109375 C 3.328125,-0.046875 3.5625,-0.03125 3.796875,-0.015625 C 3.859375,-0.015625 3.921875,-0.015625 3.984375,-0.015625 C 4.015625,-0.015625 4.046875,-0.015625 4.078125,-0.03125 C 4.15625,-0.0625 4.140625,-0.1875 4.140625,-0.265625 L 4.140625,-0.890625 C 4.140625,-0.96875 4.15625,-1.078125 4.09375,-1.125 C 4.046875,-1.15625 3.984375,-1.140625 3.953125,-1.140625 C 3.859375,-1.140625 3.78125,-1.15625 3.6875,-1.15625 C 3.421875,-1.171875 3.140625,-1.203125 2.859375,-1.265625 C 2.03125,-1.4375 1.28125,-1.828125 0.6875,-2.421875 C 0.5625,-2.546875 0.4375,-2.6875 0.34375,-2.84375 C 0.3125,-2.890625 0.28125,-2.9375 0.25,-2.984375 C 0.234375,-3.015625 0.21875,-3.0625 0.171875,-3.078125 C 0.109375,-3.125 0.015625,-3.109375 -0.0625,-3.109375 C -0.09375,-3.109375 -0.140625,-3.109375 -0.15625,-3.09375 z"+ id="path393" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M -0.03125,-1.140625 C -0.125,-1.109375 -0.09375,-0.96875 -0.09375,-0.890625 L -0.09375,-0.265625 C -0.09375,-0.1875 -0.109375,-0.078125 -0.046875,-0.03125 C -0.015625,0 0.046875,-0.015625 0.09375,-0.015625 C 0.171875,-0.015625 0.265625,0 0.34375,0 C 0.609375,0.015625 0.875,0.046875 1.140625,0.109375 C 1.984375,0.28125 2.828125,0.65625 3.40625,1.3125 C 3.5,1.4375 3.609375,1.5625 3.6875,1.6875 C 3.734375,1.765625 3.78125,1.859375 3.84375,1.921875 C 3.90625,1.96875 4.03125,1.953125 4.109375,1.953125 C 4.140625,1.953125 4.171875,1.953125 4.203125,1.921875 C 4.25,1.90625 4.265625,1.875 4.265625,1.828125 C 4.265625,1.734375 4.28125,1.609375 4.234375,1.53125 C 4.171875,1.40625 4.109375,1.296875 4.046875,1.1875 C 3.90625,0.96875 3.75,0.75 3.5625,0.546875 C 2.890625,-0.25 1.96875,-0.828125 0.9375,-1.046875 C 0.703125,-1.109375 0.46875,-1.125 0.234375,-1.140625 C 0.171875,-1.140625 0.125,-1.140625 0.0625,-1.140625 C 0.03125,-1.140625 -0.015625,-1.140625 -0.03125,-1.140625 z"+ id="path396" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.828125,-1.140625 C 3.484375,-1.109375 3.171875,-1.078125 2.828125,-0.984375 C 1.96875,-0.75 1.171875,-0.234375 0.5625,0.4375 C 0.265625,0.75 0,1.125 -0.203125,1.515625 C -0.234375,1.59375 -0.21875,1.671875 -0.21875,1.765625 C -0.21875,1.796875 -0.21875,1.84375 -0.21875,1.875 C -0.203125,1.921875 -0.171875,1.9375 -0.125,1.953125 C -0.0625,1.953125 -0.015625,1.953125 0.046875,1.953125 C 0.09375,1.953125 0.140625,1.953125 0.171875,1.921875 C 0.21875,1.90625 0.234375,1.859375 0.265625,1.828125 C 0.296875,1.765625 0.328125,1.703125 0.375,1.65625 C 0.5,1.46875 0.640625,1.3125 0.796875,1.15625 C 1.359375,0.59375 2.140625,0.265625 2.921875,0.09375 C 3.171875,0.046875 3.453125,0 3.71875,0 C 3.796875,0 3.890625,-0.015625 3.96875,-0.015625 C 4.015625,-0.015625 4.0625,0 4.09375,-0.03125 C 4.140625,-0.0625 4.140625,-0.109375 4.140625,-0.15625 C 4.140625,-0.25 4.140625,-0.34375 4.140625,-0.4375 L 4.140625,-0.9375 C 4.140625,-1 4.140625,-1.078125 4.09375,-1.125 C 4.03125,-1.171875 3.90625,-1.140625 3.828125,-1.140625 z"+ id="path399" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph15-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.890625,-3.09375 C 3.8125,-3.0625 3.78125,-2.984375 3.734375,-2.921875 C 3.65625,-2.78125 3.546875,-2.640625 3.4375,-2.515625 C 3.140625,-2.171875 2.765625,-1.890625 2.359375,-1.671875 C 1.859375,-1.421875 1.3125,-1.28125 0.765625,-1.203125 C 0.578125,-1.171875 0.375,-1.171875 0.1875,-1.140625 C 0.109375,-1.140625 0.015625,-1.171875 -0.046875,-1.125 C -0.125,-1.078125 -0.09375,-0.9375 -0.09375,-0.875 L -0.09375,-0.21875 C -0.09375,-0.125 -0.109375,-0.015625 0.015625,-0.015625 C 0.09375,0 0.171875,-0.015625 0.265625,-0.015625 C 0.5,-0.03125 0.734375,-0.0625 0.96875,-0.109375 C 2.03125,-0.34375 2.984375,-0.984375 3.671875,-1.828125 C 3.828125,-2.015625 3.96875,-2.21875 4.09375,-2.4375 C 4.15625,-2.515625 4.21875,-2.625 4.25,-2.71875 C 4.265625,-2.796875 4.265625,-2.890625 4.265625,-2.953125 C 4.265625,-3 4.265625,-3.03125 4.234375,-3.0625 C 4.171875,-3.125 4.046875,-3.109375 3.96875,-3.109375 C 3.953125,-3.109375 3.90625,-3.109375 3.890625,-3.09375 z"+ id="path402" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph18-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path405" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph18-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.609375,-3.359375 C 4.171875,-2.875 4.75,-2.578125 4.84375,-2.578125 C 4.953125,-2.578125 4.953125,-2.703125 4.953125,-2.765625 C 4.953125,-2.90625 4.9375,-2.90625 4.78125,-2.984375 C 3.71875,-3.5 3.046875,-4.359375 2.703125,-5.40625 C 2.6875,-5.453125 2.65625,-5.53125 2.578125,-5.53125 C 2.5,-5.53125 2.484375,-5.453125 2.46875,-5.421875 C 2.0625,-4.1875 1.296875,-3.421875 0.3125,-2.953125 C 0.234375,-2.90625 0.21875,-2.890625 0.21875,-2.765625 C 0.21875,-2.703125 0.21875,-2.578125 0.328125,-2.578125 C 0.40625,-2.578125 0.984375,-2.859375 1.546875,-3.359375 L 1.546875,1.234375 C 1.546875,1.359375 1.546875,1.546875 1.734375,1.546875 C 1.921875,1.546875 1.921875,1.390625 1.921875,1.265625 L 1.921875,-3.75 C 2.15625,-4.015625 2.359375,-4.3125 2.578125,-4.75 C 2.84375,-4.25 3.0625,-3.953125 3.25,-3.75 L 3.25,1.265625 C 3.25,1.390625 3.25,1.546875 3.421875,1.546875 C 3.609375,1.546875 3.609375,1.359375 3.609375,1.234375 L 3.609375,-3.359375 z"+ id="path408" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph18-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-1.984375 C 1.625,-2.265625 1.40625,-2.4375 1.171875,-2.4375 C 0.90625,-2.4375 0.734375,-2.21875 0.734375,-2 C 0.734375,-1.734375 0.953125,-1.546875 1.171875,-1.546875 C 1.4375,-1.546875 1.625,-1.765625 1.625,-1.984375 z"+ id="path411" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph18-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.703125,-1.8125 C 7.8125,-1.8125 8,-1.8125 8,-1.984375 C 8,-2.171875 7.8125,-2.171875 7.703125,-2.171875 L 1.25,-2.171875 C 1.453125,-2.328125 1.609375,-2.46875 1.765625,-2.671875 C 1.953125,-2.90625 2.125,-3.25 2.125,-3.3125 C 2.125,-3.375 2.078125,-3.4375 1.984375,-3.4375 C 1.9375,-3.4375 1.890625,-3.40625 1.875,-3.359375 C 1.734375,-3.078125 1.46875,-2.484375 0.609375,-2.125 C 0.53125,-2.09375 0.484375,-2.0625 0.484375,-1.984375 C 0.484375,-1.921875 0.515625,-1.90625 0.640625,-1.84375 C 1.1875,-1.625 1.578125,-1.234375 1.84375,-0.6875 C 1.890625,-0.59375 1.90625,-0.546875 1.984375,-0.546875 C 2.078125,-0.546875 2.125,-0.609375 2.125,-0.671875 C 2.125,-0.734375 1.953125,-1.0625 1.78125,-1.296875 C 1.609375,-1.515625 1.453125,-1.65625 1.25,-1.8125 L 7.703125,-1.8125 z"+ id="path414" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path417" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.890625,0 L 2.890625,-3.140625 L 2.390625,-3.140625 L 2.390625,-1.359375 C 2.390625,-0.71875 2.046875,-0.296875 1.53125,-0.296875 C 1.140625,-0.296875 0.890625,-0.53125 0.890625,-0.921875 L 0.890625,-3.140625 L 0.390625,-3.140625 L 0.390625,-0.71875 C 0.390625,-0.203125 0.78125,0.140625 1.390625,0.140625 C 1.84375,0.140625 2.140625,-0.03125 2.4375,-0.4375 L 2.4375,0 L 2.890625,0 z"+ id="path420" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-3.140625 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 2.171875,-2.78125 2.421875,-2.546875 2.421875,-2.171875 L 2.421875,0 L 2.921875,0 L 2.921875,-2.375 C 2.921875,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.453125,-3.21875 1.15625,-3.046875 0.875,-2.609375 L 0.875,-3.140625 L 0.421875,-3.140625 z"+ id="path423" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.890625,-3.140625 L 0.40625,-3.140625 L 0.40625,0 L 0.890625,0 L 0.890625,-3.140625 z M 0.890625,-4.359375 L 0.390625,-4.359375 L 0.390625,-3.734375 L 0.890625,-3.734375 L 0.890625,-4.359375 z"+ id="path426" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,0 L 2.90625,-3.140625 L 2.34375,-3.140625 L 1.453125,-0.59375 L 0.625,-3.140625 L 0.0625,-3.140625 L 1.15625,0 L 1.703125,0 z"+ id="path429" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.0625,-1.40625 C 3.0625,-1.875 3.03125,-2.171875 2.9375,-2.40625 C 2.734375,-2.921875 2.265625,-3.21875 1.671875,-3.21875 C 0.796875,-3.21875 0.234375,-2.5625 0.234375,-1.53125 C 0.234375,-0.5 0.78125,0.140625 1.65625,0.140625 C 2.375,0.140625 2.875,-0.265625 3,-0.953125 L 2.5,-0.953125 C 2.359375,-0.53125 2.078125,-0.328125 1.6875,-0.328125 C 1.359375,-0.328125 1.09375,-0.46875 0.921875,-0.734375 C 0.8125,-0.90625 0.765625,-1.09375 0.765625,-1.40625 L 3.0625,-1.40625 z M 0.765625,-1.8125 C 0.8125,-2.390625 1.171875,-2.765625 1.671875,-2.765625 C 2.15625,-2.765625 2.53125,-2.359375 2.53125,-1.84375 C 2.53125,-1.828125 2.53125,-1.8125 2.53125,-1.8125 L 0.765625,-1.8125 z"+ id="path432" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.40625,-3.140625 L 0.40625,0 L 0.921875,0 L 0.921875,-1.625 C 0.921875,-2.078125 1.03125,-2.375 1.265625,-2.546875 C 1.421875,-2.65625 1.578125,-2.6875 1.921875,-2.703125 L 1.921875,-3.203125 C 1.84375,-3.21875 1.796875,-3.21875 1.734375,-3.21875 C 1.40625,-3.21875 1.15625,-3.03125 0.875,-2.5625 L 0.875,-3.140625 L 0.40625,-3.140625 z"+ id="path435" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.625,-2.265625 C 2.609375,-2.875 2.203125,-3.21875 1.484375,-3.21875 C 0.75,-3.21875 0.28125,-2.84375 0.28125,-2.265625 C 0.28125,-1.78125 0.53125,-1.546875 1.28125,-1.359375 L 1.734375,-1.25 C 2.09375,-1.171875 2.21875,-1.046875 2.21875,-0.8125 C 2.21875,-0.515625 1.9375,-0.328125 1.5,-0.328125 C 1.234375,-0.328125 1,-0.40625 0.875,-0.53125 C 0.796875,-0.625 0.765625,-0.71875 0.734375,-0.9375 L 0.203125,-0.9375 C 0.234375,-0.203125 0.640625,0.140625 1.453125,0.140625 C 2.25,0.140625 2.75,-0.25 2.75,-0.859375 C 2.75,-1.328125 2.484375,-1.578125 1.859375,-1.734375 L 1.375,-1.84375 C 0.96875,-1.9375 0.796875,-2.078125 0.796875,-2.296875 C 0.796875,-2.578125 1.0625,-2.765625 1.46875,-2.765625 C 1.859375,-2.765625 2.078125,-2.59375 2.09375,-2.265625 L 2.625,-2.265625 z"+ id="path438" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.515625,-3.140625 L 1,-3.140625 L 1,-4 L 0.515625,-4 L 0.515625,-3.140625 L 0.078125,-3.140625 L 0.078125,-2.734375 L 0.515625,-2.734375 L 0.515625,-0.359375 C 0.515625,-0.046875 0.71875,0.140625 1.109375,0.140625 C 1.234375,0.140625 1.359375,0.125 1.515625,0.09375 L 1.515625,-0.328125 C 1.453125,-0.3125 1.375,-0.296875 1.28125,-0.296875 C 1.0625,-0.296875 1,-0.359375 1,-0.578125 L 1,-2.734375 L 1.515625,-2.734375 L 1.515625,-3.140625 z"+ id="path441" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.328125,-3.140625 L 1.453125,-0.6875 L 0.65625,-3.140625 L 0.125,-3.140625 L 1.171875,0.015625 L 0.984375,0.515625 C 0.90625,0.734375 0.796875,0.8125 0.59375,0.8125 C 0.515625,0.8125 0.4375,0.796875 0.328125,0.78125 L 0.328125,1.234375 C 0.421875,1.28125 0.53125,1.296875 0.65625,1.296875 C 0.8125,1.296875 1,1.25 1.125,1.15625 C 1.28125,1.046875 1.375,0.90625 1.46875,0.65625 L 2.859375,-3.140625 L 2.328125,-3.140625 z"+ id="path444" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,-1.859375 L 0.28125,-1.859375 L 0.28125,-1.4375 L 1.703125,-1.4375 L 1.703125,-1.859375 z"+ id="path447" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.90625,-4.359375 L 0.40625,-4.359375 L 0.40625,0 L 0.90625,0 L 0.90625,-4.359375 z"+ id="path450" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-3.21875 C 0.75,-3.21875 0.21875,-2.59375 0.21875,-1.546875 C 0.21875,-0.484375 0.734375,0.140625 1.640625,0.140625 C 2.515625,0.140625 3.046875,-0.484375 3.046875,-1.515625 C 3.046875,-2.609375 2.53125,-3.21875 1.625,-3.21875 z M 1.640625,-2.765625 C 2.203125,-2.765625 2.53125,-2.296875 2.53125,-1.53125 C 2.53125,-0.796875 2.1875,-0.328125 1.640625,-0.328125 C 1.078125,-0.328125 0.734375,-0.78125 0.734375,-1.546875 C 0.734375,-2.296875 1.078125,-2.765625 1.640625,-2.765625 z"+ id="path453" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-3.140625 L 2.46875,-2.6875 C 2.21875,-3.046875 1.90625,-3.21875 1.515625,-3.21875 C 0.71875,-3.21875 0.171875,-2.53125 0.171875,-1.515625 C 0.171875,-1 0.3125,-0.578125 0.5625,-0.28125 C 0.796875,-0.015625 1.140625,0.140625 1.46875,0.140625 C 1.859375,0.140625 2.140625,-0.03125 2.421875,-0.421875 L 2.421875,-0.265625 C 2.421875,0.15625 2.359375,0.421875 2.234375,0.59375 C 2.109375,0.78125 1.84375,0.890625 1.546875,0.890625 C 1.3125,0.890625 1.109375,0.828125 0.96875,0.71875 C 0.859375,0.625 0.8125,0.546875 0.78125,0.359375 L 0.28125,0.359375 C 0.328125,0.953125 0.796875,1.296875 1.53125,1.296875 C 2,1.296875 2.390625,1.15625 2.59375,0.90625 C 2.84375,0.609375 2.921875,0.21875 2.921875,-0.515625 L 2.921875,-3.140625 L 2.46875,-3.140625 z M 1.5625,-2.765625 C 2.09375,-2.765625 2.421875,-2.3125 2.421875,-1.53125 C 2.421875,-0.78125 2.09375,-0.328125 1.5625,-0.328125 C 1.015625,-0.328125 0.6875,-0.78125 0.6875,-1.546875 C 0.6875,-2.296875 1.03125,-2.765625 1.5625,-2.765625 z"+ id="path456" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-4.25 C 1.25,-4.25 0.890625,-4.0625 0.671875,-3.78125 C 0.390625,-3.40625 0.25,-2.84375 0.25,-2.046875 C 0.25,-0.625 0.734375,0.140625 1.640625,0.140625 C 2.546875,0.140625 3.03125,-0.625 3.03125,-2.015625 C 3.03125,-2.84375 2.90625,-3.390625 2.625,-3.78125 C 2.40625,-4.078125 2.046875,-4.25 1.640625,-4.25 z M 1.640625,-3.78125 C 2.21875,-3.78125 2.5,-3.203125 2.5,-2.0625 C 2.5,-0.859375 2.21875,-0.296875 1.640625,-0.296875 C 1.078125,-0.296875 0.796875,-0.890625 0.796875,-2.046875 C 0.796875,-3.203125 1.078125,-3.78125 1.640625,-3.78125 z"+ id="path459" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.546875,-3.015625 L 1.546875,0 L 2.078125,0 L 2.078125,-4.25 L 1.734375,-4.25 C 1.546875,-3.59375 1.421875,-3.5 0.609375,-3.40625 L 0.609375,-3.015625 L 1.546875,-3.015625 z"+ id="path462" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.03125,-0.515625 L 0.796875,-0.515625 C 0.84375,-0.875 1.046875,-1.09375 1.5625,-1.390625 L 2.15625,-1.71875 C 2.75,-2.046875 3.0625,-2.484375 3.0625,-3 C 3.0625,-3.34375 2.921875,-3.6875 2.65625,-3.90625 C 2.40625,-4.140625 2.09375,-4.25 1.703125,-4.25 C 1.15625,-4.25 0.765625,-4.046875 0.53125,-3.6875 C 0.375,-3.46875 0.3125,-3.203125 0.296875,-2.765625 L 0.828125,-2.765625 C 0.84375,-3.0625 0.875,-3.234375 0.953125,-3.375 C 1.09375,-3.625 1.359375,-3.78125 1.6875,-3.78125 C 2.15625,-3.78125 2.515625,-3.4375 2.515625,-2.984375 C 2.515625,-2.65625 2.328125,-2.359375 1.9375,-2.140625 L 1.390625,-1.84375 C 0.515625,-1.328125 0.25,-0.9375 0.203125,0 L 3.03125,0 L 3.03125,-0.515625 z"+ id="path465" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.84375,-1.3125 L 3.28125,0 L 3.90625,0 L 2.375,-4.359375 L 1.65625,-4.359375 L 0.109375,0 L 0.6875,0 L 1.15625,-1.3125 L 2.84375,-1.3125 z M 2.6875,-1.78125 L 1.296875,-1.78125 L 2.015625,-3.765625 L 2.6875,-1.78125 z"+ id="path468" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.140625,-0.625 L 0.515625,-0.625 L 0.515625,0 L 1.140625,0 L 1.140625,-0.625 z"+ id="path471" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.8125,-2.078125 C 2.796875,-2.390625 2.734375,-2.578125 2.609375,-2.765625 C 2.390625,-3.046875 2.015625,-3.21875 1.578125,-3.21875 C 0.734375,-3.21875 0.1875,-2.5625 0.1875,-1.515625 C 0.1875,-0.5 0.71875,0.140625 1.578125,0.140625 C 2.328125,0.140625 2.796875,-0.3125 2.859375,-1.078125 L 2.359375,-1.078125 C 2.265625,-0.578125 2.015625,-0.328125 1.578125,-0.328125 C 1.03125,-0.328125 0.703125,-0.765625 0.703125,-1.515625 C 0.703125,-2.296875 1.03125,-2.765625 1.578125,-2.765625 C 2,-2.765625 2.25,-2.515625 2.3125,-2.078125 L 2.8125,-2.078125 z"+ id="path474" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.203125,-0.296875 C 3.140625,-0.28125 3.125,-0.28125 3.09375,-0.28125 C 2.921875,-0.28125 2.828125,-0.375 2.828125,-0.53125 L 2.828125,-2.375 C 2.828125,-2.921875 2.421875,-3.21875 1.640625,-3.21875 C 1.1875,-3.21875 0.8125,-3.09375 0.609375,-2.859375 C 0.453125,-2.703125 0.40625,-2.515625 0.390625,-2.203125 L 0.890625,-2.203125 C 0.9375,-2.59375 1.15625,-2.765625 1.625,-2.765625 C 2.078125,-2.765625 2.328125,-2.59375 2.328125,-2.296875 L 2.328125,-2.171875 C 2.328125,-1.953125 2.203125,-1.859375 1.8125,-1.8125 C 1.09375,-1.734375 1,-1.703125 0.796875,-1.625 C 0.4375,-1.484375 0.25,-1.203125 0.25,-0.796875 C 0.25,-0.21875 0.640625,0.140625 1.28125,0.140625 C 1.671875,0.140625 2,0 2.34375,-0.328125 C 2.375,0 2.53125,0.140625 2.859375,0.140625 C 2.96875,0.140625 3.046875,0.125 3.203125,0.078125 L 3.203125,-0.296875 z M 2.328125,-0.984375 C 2.328125,-0.8125 2.28125,-0.71875 2.125,-0.578125 C 1.921875,-0.390625 1.6875,-0.296875 1.390625,-0.296875 C 1,-0.296875 0.765625,-0.484375 0.765625,-0.796875 C 0.765625,-1.125 1,-1.296875 1.53125,-1.375 C 2.046875,-1.453125 2.15625,-1.46875 2.328125,-1.546875 L 2.328125,-0.984375 z"+ id="path477" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.40625,-4.359375 C 0.8125,-3.578125 0.4375,-2.484375 0.4375,-1.546875 C 0.4375,-0.609375 0.8125,0.484375 1.40625,1.265625 L 1.734375,1.265625 C 1.21875,0.40625 0.921875,-0.59375 0.921875,-1.546875 C 0.921875,-2.5 1.21875,-3.515625 1.734375,-4.359375 L 1.40625,-4.359375 z"+ id="path480" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-22"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.03125,-1.53125 L 1.734375,-2.234375 L 3.28125,0 L 3.9375,0 L 2.140625,-2.578125 L 3.921875,-4.359375 L 3.203125,-4.359375 L 1.03125,-2.15625 L 1.03125,-4.359375 L 0.46875,-4.359375 L 0.46875,0 L 1.03125,0 L 1.03125,-1.53125 z"+ id="path483" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-23"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.125,-3.875 L 3.546875,-3.875 L 3.546875,-4.359375 L 0.125,-4.359375 L 0.125,-3.875 L 1.5625,-3.875 L 1.5625,0 L 2.125,0 L 2.125,-3.875 z"+ id="path486" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-24"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.296875,-1.984375 L 3.296875,0 L 3.859375,0 L 3.859375,-4.359375 L 3.296875,-4.359375 L 3.296875,-2.484375 L 1.046875,-2.484375 L 1.046875,-4.359375 L 0.5,-4.359375 L 0.5,0 L 1.0625,0 L 1.0625,-1.984375 L 3.296875,-1.984375 z"+ id="path489" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-25"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.5625,1.265625 C 1.15625,0.484375 1.53125,-0.609375 1.53125,-1.546875 C 1.53125,-2.484375 1.15625,-3.578125 0.5625,-4.359375 L 0.234375,-4.359375 C 0.75,-3.5 1.046875,-2.5 1.046875,-1.546875 C 1.046875,-0.59375 0.75,0.421875 0.234375,1.265625 L 0.5625,1.265625 z"+ id="path492" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-26"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,-1.984375 L 3.171875,-1.984375 L 3.171875,-2.484375 L 1.09375,-2.484375 L 1.09375,-3.875 L 3.46875,-3.875 L 3.46875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 L 1.09375,0 L 1.09375,-1.984375 z"+ id="path495" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-27"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.5625,-3.078125 C 3.5625,-3.9375 2.96875,-4.4375 1.96875,-4.4375 C 1.015625,-4.4375 0.421875,-3.9375 0.421875,-3.15625 C 0.421875,-2.625 0.703125,-2.28125 1.28125,-2.140625 L 2.359375,-1.84375 C 2.90625,-1.703125 3.15625,-1.484375 3.15625,-1.140625 C 3.15625,-0.90625 3.03125,-0.671875 2.84375,-0.53125 C 2.671875,-0.421875 2.40625,-0.359375 2.046875,-0.359375 C 1.578125,-0.359375 1.25,-0.46875 1.046875,-0.71875 C 0.875,-0.90625 0.8125,-1.125 0.8125,-1.390625 L 0.28125,-1.390625 C 0.296875,-0.984375 0.375,-0.71875 0.546875,-0.484375 C 0.84375,-0.078125 1.34375,0.140625 2.015625,0.140625 C 2.53125,0.140625 2.953125,0.015625 3.234375,-0.203125 C 3.53125,-0.4375 3.71875,-0.8125 3.71875,-1.203125 C 3.71875,-1.734375 3.375,-2.125 2.78125,-2.296875 L 1.6875,-2.578125 C 1.171875,-2.734375 0.96875,-2.890625 0.96875,-3.234375 C 0.96875,-3.671875 1.359375,-3.96875 1.953125,-3.96875 C 2.640625,-3.96875 3.03125,-3.65625 3.046875,-3.078125 L 3.5625,-3.078125 z"+ id="path498" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-28"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.53125,0 L 2.21875,0 C 3.3125,0 3.984375,-0.828125 3.984375,-2.1875 C 3.984375,-3.53125 3.328125,-4.359375 2.21875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 z M 1.09375,-0.484375 L 1.09375,-3.875 L 2.125,-3.875 C 2.984375,-3.875 3.4375,-3.296875 3.4375,-2.171875 C 3.4375,-1.078125 2.984375,-0.484375 2.125,-0.484375 L 1.09375,-0.484375 z"+ id="path501" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-29"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.796875,0 L 4.03125,-3.65625 L 4.03125,0 L 4.546875,0 L 4.546875,-4.359375 L 3.78125,-4.359375 L 2.515625,-0.5625 L 1.21875,-4.359375 L 0.453125,-4.359375 L 0.453125,0 L 0.96875,0 L 0.96875,-3.65625 L 2.21875,0 L 2.796875,0 z"+ id="path504" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-30"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-4.359375 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 1.921875,-2.78125 2.09375,-2.734375 2.203125,-2.640625 C 2.359375,-2.546875 2.40625,-2.390625 2.40625,-2.171875 L 2.40625,0 L 2.90625,0 L 2.90625,-2.375 C 2.90625,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.484375,-3.21875 1.203125,-3.09375 0.921875,-2.703125 L 0.921875,-4.359375 L 0.421875,-4.359375 z"+ id="path507" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-31"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.109375,-4.25 L 0.28125,-4.25 L 0.28125,-3.71875 L 2.5625,-3.71875 C 1.5625,-2.28125 1.140625,-1.390625 0.828125,0 L 1.390625,0 C 1.625,-1.359375 2.15625,-2.53125 3.109375,-3.796875 L 3.109375,-4.25 z"+ id="path510" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-32"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.515625,-0.625 L 0.515625,0 L 0.875,0 L 0.875,0.109375 C 0.875,0.515625 0.796875,0.640625 0.515625,0.65625 L 0.515625,0.875 C 0.9375,0.875 1.15625,0.609375 1.15625,0.09375 L 1.15625,-0.625 L 0.515625,-0.625 z"+ id="path513" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-33"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.34375,-2.234375 C 2.78125,-2.5 2.921875,-2.703125 2.921875,-3.109375 C 2.921875,-3.78125 2.40625,-4.25 1.640625,-4.25 C 0.890625,-4.25 0.375,-3.78125 0.375,-3.109375 C 0.375,-2.71875 0.515625,-2.5 0.953125,-2.234375 C 0.453125,-2 0.21875,-1.640625 0.21875,-1.171875 C 0.21875,-0.40625 0.8125,0.140625 1.640625,0.140625 C 2.484375,0.140625 3.0625,-0.40625 3.0625,-1.171875 C 3.0625,-1.640625 2.828125,-2 2.34375,-2.234375 z M 1.640625,-3.78125 C 2.09375,-3.78125 2.375,-3.515625 2.375,-3.09375 C 2.375,-2.703125 2.09375,-2.4375 1.640625,-2.4375 C 1.203125,-2.4375 0.90625,-2.703125 0.90625,-3.109375 C 0.90625,-3.515625 1.203125,-3.78125 1.640625,-3.78125 z M 1.640625,-2 C 2.171875,-2 2.53125,-1.65625 2.53125,-1.171875 C 2.53125,-0.671875 2.171875,-0.328125 1.640625,-0.328125 C 1.125,-0.328125 0.765625,-0.671875 0.765625,-1.171875 C 0.765625,-1.65625 1.125,-2 1.640625,-2 z"+ id="path516" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-34"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.3125,-0.96875 C 0.421875,-0.28125 0.875,0.140625 1.515625,0.140625 C 1.984375,0.140625 2.40625,-0.09375 2.65625,-0.46875 C 2.921875,-0.875 3.046875,-1.40625 3.046875,-2.171875 C 3.046875,-2.890625 2.9375,-3.34375 2.6875,-3.71875 C 2.453125,-4.0625 2.078125,-4.25 1.609375,-4.25 C 0.8125,-4.25 0.234375,-3.640625 0.234375,-2.8125 C 0.234375,-2.015625 0.765625,-1.46875 1.53125,-1.46875 C 1.9375,-1.46875 2.21875,-1.609375 2.5,-1.9375 C 2.5,-0.90625 2.15625,-0.328125 1.5625,-0.328125 C 1.1875,-0.328125 0.921875,-0.5625 0.84375,-0.96875 L 0.3125,-0.96875 z M 1.609375,-3.78125 C 2.09375,-3.78125 2.46875,-3.375 2.46875,-2.828125 C 2.46875,-2.296875 2.109375,-1.9375 1.59375,-1.9375 C 1.078125,-1.9375 0.765625,-2.28125 0.765625,-2.859375 C 0.765625,-3.390625 1.125,-3.78125 1.609375,-3.78125 z"+ id="path519" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-35"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.375,-4.359375 L -0.046875,0.125 L 0.28125,0.125 L 1.703125,-4.359375 L 1.375,-4.359375 z"+ id="path522" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-36"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.328125,-1.9375 L 1.390625,-1.9375 L 1.609375,-1.953125 C 2.1875,-1.953125 2.484375,-1.6875 2.484375,-1.171875 C 2.484375,-0.640625 2.15625,-0.328125 1.609375,-0.328125 C 1.03125,-0.328125 0.75,-0.609375 0.71875,-1.234375 L 0.1875,-1.234375 C 0.21875,-0.890625 0.28125,-0.671875 0.375,-0.484375 C 0.59375,-0.078125 1.015625,0.140625 1.59375,0.140625 C 2.46875,0.140625 3.03125,-0.390625 3.03125,-1.1875 C 3.03125,-1.71875 2.8125,-2.015625 2.3125,-2.203125 C 2.703125,-2.359375 2.90625,-2.65625 2.90625,-3.078125 C 2.90625,-3.8125 2.421875,-4.25 1.609375,-4.25 C 0.75,-4.25 0.296875,-3.78125 0.28125,-2.875 L 0.8125,-2.875 C 0.8125,-3.125 0.84375,-3.265625 0.90625,-3.40625 C 1.015625,-3.640625 1.28125,-3.78125 1.609375,-3.78125 C 2.078125,-3.78125 2.359375,-3.5 2.359375,-3.0625 C 2.359375,-2.765625 2.25,-2.578125 2.015625,-2.484375 C 1.875,-2.421875 1.6875,-2.40625 1.328125,-2.390625 L 1.328125,-1.9375 z"+ id="path525" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path528" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.59375,-2.296875 C 6.734375,-2.296875 6.921875,-2.296875 6.921875,-2.5 C 6.921875,-2.6875 6.734375,-2.6875 6.59375,-2.6875 L 1.15625,-2.6875 C 1.015625,-2.6875 0.828125,-2.6875 0.828125,-2.5 C 0.828125,-2.296875 1.015625,-2.296875 1.15625,-2.296875 L 6.59375,-2.296875 z"+ id="path531" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 8.546875,-2.296875 C 7.8125,-1.75 7.484375,-0.921875 7.484375,-0.84375 C 7.484375,-0.75 7.5625,-0.71875 7.625,-0.71875 C 7.75,-0.71875 7.765625,-0.78125 7.78125,-0.8125 C 7.9375,-1.15625 8.25,-1.890625 9.25,-2.359375 C 9.375,-2.40625 9.390625,-2.421875 9.390625,-2.5 C 9.390625,-2.5625 9.328125,-2.59375 9.328125,-2.59375 C 8.78125,-2.84375 8.203125,-3.203125 7.796875,-4.125 C 7.75,-4.21875 7.734375,-4.265625 7.625,-4.265625 C 7.5625,-4.265625 7.484375,-4.234375 7.484375,-4.140625 C 7.484375,-4.0625 7.8125,-3.234375 8.546875,-2.6875 L 0.890625,-2.6875 C 0.734375,-2.6875 0.5625,-2.6875 0.5625,-2.5 C 0.5625,-2.296875 0.734375,-2.296875 0.890625,-2.296875 L 8.546875,-2.296875 z"+ id="path534" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path537" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.96875,-5.390625 L 0.578125,-5.390625 L 0.578125,2.171875 L 1.96875,2.171875 L 1.96875,-0.640625 C 2.3125,-0.046875 2.796875,0.234375 3.46875,0.234375 C 4.765625,0.234375 5.71875,-0.984375 5.71875,-2.609375 C 5.71875,-3.375 5.5,-4.125 5.140625,-4.625 C 4.78125,-5.140625 4.109375,-5.46875 3.46875,-5.46875 C 2.796875,-5.46875 2.3125,-5.1875 1.96875,-4.578125 L 1.96875,-5.390625 z M 3.15625,-4.3125 C 3.859375,-4.3125 4.328125,-3.625 4.328125,-2.59375 C 4.328125,-1.609375 3.84375,-0.921875 3.15625,-0.921875 C 2.453125,-0.921875 1.96875,-1.609375 1.96875,-2.609375 C 1.96875,-3.625 2.453125,-4.3125 3.15625,-4.3125 z"+ id="path540" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.390625,0 L 5.390625,-5.390625 L 4,-5.390625 L 4,-2.015625 C 4,-1.375 3.546875,-0.953125 2.875,-0.953125 C 2.265625,-0.953125 1.96875,-1.28125 1.96875,-1.921875 L 1.96875,-5.390625 L 0.578125,-5.390625 L 0.578125,-1.640625 C 0.578125,-0.453125 1.234375,0.234375 2.375,0.234375 C 3.109375,0.234375 3.59375,-0.046875 4,-0.640625 L 4,0 L 5.390625,0 z"+ id="path543" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.625,-5.390625 L 0.625,0 L 2.03125,0 L 2.03125,-2.859375 C 2.03125,-3.671875 2.4375,-4.09375 3.25,-4.09375 C 3.40625,-4.09375 3.5,-4.078125 3.6875,-4.046875 L 3.6875,-5.46875 C 3.609375,-5.46875 3.5625,-5.46875 3.515625,-5.46875 C 2.875,-5.46875 2.328125,-5.046875 2.03125,-4.328125 L 2.03125,-5.390625 L 0.625,-5.390625 z"+ id="path546" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.21875,-2.25 C 5.234375,-2.375 5.234375,-2.421875 5.234375,-2.5 C 5.234375,-3.03125 5.15625,-3.53125 5.03125,-3.90625 C 4.671875,-4.890625 3.796875,-5.46875 2.71875,-5.46875 C 1.171875,-5.46875 0.21875,-4.359375 0.21875,-2.546875 C 0.21875,-0.828125 1.15625,0.234375 2.6875,0.234375 C 3.890625,0.234375 4.859375,-0.453125 5.171875,-1.515625 L 3.796875,-1.515625 C 3.625,-1.09375 3.234375,-0.84375 2.734375,-0.84375 C 2.328125,-0.84375 2.015625,-1 1.8125,-1.3125 C 1.6875,-1.5 1.640625,-1.75 1.609375,-2.25 L 5.21875,-2.25 z M 1.640625,-3.1875 C 1.71875,-4 2.078125,-4.40625 2.6875,-4.40625 C 3.046875,-4.40625 3.359375,-4.234375 3.5625,-3.953125 C 3.6875,-3.765625 3.75,-3.546875 3.78125,-3.1875 L 1.640625,-3.1875 z"+ id="path549" />+ </symbol>+ </g>+ <clipPath+ id="clip1">+ <path+ d="M 21.226562,63.839844 L 27.273438,63.839844 L 27.273438,57.792969 L 21.226562,57.792969 L 21.226562,63.839844 z"+ id="path552" />+ </clipPath>+ <clipPath+ id="clip2">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path555" />+ </clipPath>+ <clipPath+ id="clip3">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path558" />+ </clipPath>+ <clipPath+ id="clip4">+ <path+ d="M 143.18359,45.335938 L 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 z M 161.01562,54.640625 L 170.52734,54.640625 L 170.52734,50.863281 L 161.01562,50.863281 L 161.01562,50.863281 L 168.57422,52.753906 L 161.01562,54.640625 z"+ id="path561" />+ </clipPath>+ <clipPath+ id="clip5">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path564" />+ </clipPath>+ <clipPath+ id="clip6">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path567" />+ </clipPath>+ <clipPath+ id="clip7">+ <path+ d="M 143.18359,45.335938 L 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 z M 161.01562,71.648438 L 170.52734,71.648438 L 170.52734,67.871094 L 161.01562,67.871094 L 161.01562,67.871094 L 168.57422,69.757812 L 161.01562,71.648438 z"+ id="path570" />+ </clipPath>+ <clipPath+ id="clip8">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path573" />+ </clipPath>+ <clipPath+ id="clip9">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path576" />+ </clipPath>+ <clipPath+ id="clip10">+ <path+ d="M 143.18359,45.335938 L 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 z M 212.03906,54.640625 L 221.55078,54.640625 L 221.55078,50.863281 L 212.03906,50.863281 L 212.03906,50.863281 L 219.59766,52.753906 L 212.03906,54.640625 z"+ id="path579" />+ </clipPath>+ <clipPath+ id="clip11">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path582" />+ </clipPath>+ <clipPath+ id="clip12">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path585" />+ </clipPath>+ <clipPath+ id="clip13">+ <path+ d="M 143.18359,45.335938 L 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 z M 212.03906,71.648438 L 221.55078,71.648438 L 221.55078,67.871094 L 212.03906,67.871094 L 212.03906,67.871094 L 219.59766,69.757812 L 212.03906,71.648438 z"+ id="path588" />+ </clipPath>+ <clipPath+ id="clip14">+ <path+ d="M 143.18359,76.335938 L 225.18359,76.335938 L 225.18359,45.335938 L 143.18359,45.335938 L 143.18359,76.335938 z"+ id="path591" />+ </clipPath>+ <clipPath+ id="clip15">+ <path+ d="M 44.21875,86.0625 L 49.089844,86.0625 L 49.089844,81.191406 L 44.21875,81.191406 L 44.21875,86.0625 z"+ id="path594" />+ </clipPath>+ <clipPath+ id="clip16">+ <path+ d="M 66.035156,98.625 L 70.910156,98.625 L 70.910156,93.753906 L 66.035156,93.753906 L 66.035156,98.625 z"+ id="path597" />+ </clipPath>+ <clipPath+ id="clip17">+ <path+ d="M 66.035156,121.11719 L 70.910156,121.11719 L 70.910156,116.24219 L 66.035156,116.24219 L 66.035156,121.11719 z"+ id="path600" />+ </clipPath>+ <clipPath+ id="clip18">+ <path+ d="M 21.226562,160.28516 L 27.273438,160.28516 L 27.273438,154.23828 L 21.226562,154.23828 L 21.226562,160.28516 z"+ id="path603" />+ </clipPath>+ <clipPath+ id="clip19">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path606" />+ </clipPath>+ <clipPath+ id="clip20">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path609" />+ </clipPath>+ <clipPath+ id="clip21">+ <path+ d="M 169.97656,141.78125 L 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 z M 187.80859,151.08594 L 197.32031,151.08594 L 197.32031,147.30859 L 187.80859,147.30859 L 187.80859,147.30859 L 195.36719,149.19531 L 187.80859,151.08594 z"+ id="path612" />+ </clipPath>+ <clipPath+ id="clip22">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path615" />+ </clipPath>+ <clipPath+ id="clip23">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path618" />+ </clipPath>+ <clipPath+ id="clip24">+ <path+ d="M 169.97656,141.78125 L 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 z M 187.80859,168.09375 L 197.32031,168.09375 L 197.32031,164.31641 L 187.80859,164.31641 L 187.80859,164.31641 L 195.36719,166.20312 L 187.80859,168.09375 z"+ id="path621" />+ </clipPath>+ <clipPath+ id="clip25">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path624" />+ </clipPath>+ <clipPath+ id="clip26">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path627" />+ </clipPath>+ <clipPath+ id="clip27">+ <path+ d="M 169.97656,141.78125 L 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 z M 238.83203,151.08594 L 248.34375,151.08594 L 248.34375,147.30859 L 238.83203,147.30859 L 238.83203,147.30859 L 246.39062,149.19531 L 238.83203,151.08594 z"+ id="path630" />+ </clipPath>+ <clipPath+ id="clip28">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path633" />+ </clipPath>+ <clipPath+ id="clip29">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path636" />+ </clipPath>+ <clipPath+ id="clip30">+ <path+ d="M 169.97656,141.78125 L 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 z M 238.83203,168.09375 L 248.34375,168.09375 L 248.34375,164.31641 L 238.83203,164.31641 L 238.83203,164.31641 L 246.39062,166.20312 L 238.83203,168.09375 z"+ id="path639" />+ </clipPath>+ <clipPath+ id="clip31">+ <path+ d="M 169.97656,172.78125 L 251.97656,172.78125 L 251.97656,141.78125 L 169.97656,141.78125 L 169.97656,172.78125 z"+ id="path642" />+ </clipPath>+ <clipPath+ id="clip32">+ <path+ d="M 44.21875,191.01172 L 49.089844,191.01172 L 49.089844,186.14062 L 44.21875,186.14062 L 44.21875,191.01172 z"+ id="path645" />+ </clipPath>+ <clipPath+ id="clip33">+ <path+ d="M 66.035156,206.41016 L 70.910156,206.41016 L 70.910156,201.53516 L 66.035156,201.53516 L 66.035156,206.41016 z"+ id="path648" />+ </clipPath>+ <clipPath+ id="clip34">+ <path+ d="M 66.035156,217.36719 L 70.910156,217.36719 L 70.910156,212.49609 L 66.035156,212.49609 L 66.035156,217.36719 z"+ id="path651" />+ </clipPath>+ <clipPath+ id="clip35">+ <path+ d="M 66.035156,228.32813 L 70.910156,228.32813 L 70.910156,223.45312 L 66.035156,223.45312 L 66.035156,228.32813 z"+ id="path654" />+ </clipPath>+ <clipPath+ id="clip36">+ <path+ d="M 66.035156,250.24609 L 70.910156,250.24609 L 70.910156,245.37109 L 66.035156,245.37109 L 66.035156,250.24609 z"+ id="path657" />+ </clipPath>+ </defs>+ <g+ id="g13377"+ transform="matrix(4.5723391,0,0,4.5723391,-836.93347,-637.361)">+ <g+ clip-path="url(#clip19)"+ clip-rule="nonzero"+ id="g4078">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 263.97,9.07 L 547.44656,9.07 L 547.44656,292.54656 L 263.97,292.54656 L 263.97,9.07 z"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4080" />+ </g>+ <g+ clip-path="url(#clip20)"+ clip-rule="nonzero"+ id="g4082">+ <g+ clip-path="url(#clip21)"+ clip-rule="evenodd"+ id="g4084">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 37.212187,235.86687 L 263.97,235.86687"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4086" />+ </g>+ </g>+ <g+ clip-path="url(#clip22)"+ clip-rule="nonzero"+ id="g4088">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 187.80859,151.08594 L 195.36719,149.19531 L 187.80859,147.30859 L 187.80859,151.08594"+ id="path4090" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 178.30594,216.96062 L 253.89187,235.86687 L 178.30594,254.73406 L 178.30594,216.96062 z"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4092" />+ </g>+ <g+ clip-path="url(#clip23)"+ clip-rule="nonzero"+ id="g4094">+ <g+ clip-path="url(#clip24)"+ clip-rule="evenodd"+ id="g4096">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 37.212187,65.78875 L 263.97,65.78875"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4098" />+ </g>+ </g>+ <g+ clip-path="url(#clip25)"+ clip-rule="nonzero"+ id="g4100">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 187.80859,168.09375 L 195.36719,166.20312 L 187.80859,164.31641 L 187.80859,168.09375"+ id="path4102" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 178.30594,46.8825 L 253.89187,65.78875 L 178.30594,84.655937 L 178.30594,46.8825 z"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4104" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:9.4485, 37.794;stroke-dashoffset:37.794;stroke-opacity:1"+ d="M 93.930937,235.86687 L 93.930937,65.78875"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4106" />+ </g>+ <g+ clip-path="url(#clip26)"+ clip-rule="nonzero"+ id="g4108">+ <g+ clip-path="url(#clip27)"+ clip-rule="evenodd"+ id="g4110">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 547.44656,235.86687 L 774.20438,235.86687"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4112" />+ </g>+ </g>+ <g+ clip-path="url(#clip28)"+ clip-rule="nonzero"+ id="g4114">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 238.83203,151.08594 L 246.39062,149.19531 L 238.83203,147.30859 L 238.83203,151.08594"+ id="path4116" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 688.54031,216.96062 L 764.12625,235.86687 L 688.54031,254.73406 L 688.54031,216.96062 z"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4118" />+ </g>+ <g+ clip-path="url(#clip29)"+ clip-rule="nonzero"+ id="g4120">+ <g+ clip-path="url(#clip30)"+ clip-rule="evenodd"+ id="g4122">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 547.44656,65.78875 L 774.20438,65.78875"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4124" />+ </g>+ </g>+ <g+ clip-path="url(#clip31)"+ clip-rule="nonzero"+ id="g4126">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 238.83203,168.09375 L 246.39062,166.20312 L 238.83203,164.31641 L 238.83203,168.09375"+ id="path4128" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 688.54031,46.8825 L 764.12625,65.78875 L 688.54031,84.655937 L 688.54031,46.8825 z"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4130" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:9.4485, 37.794;stroke-dashoffset:37.794;stroke-opacity:1"+ d="M 604.12625,235.86687 L 604.12625,65.78875"+ transform="matrix(0.1,0,0,-0.1,169.978,172.782)"+ id="path4132" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4134">+ <use+ xlink:href="#glyph4-1"+ x="160.96001"+ y="161.90401"+ id="use4136"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4138">+ <use+ xlink:href="#glyph4-2"+ x="160.95801"+ y="161.90401"+ id="use4140"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4142">+ <use+ xlink:href="#glyph5-1"+ x="162.59"+ y="169.002"+ id="use4144"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4146">+ <use+ xlink:href="#glyph6-1"+ x="164.802"+ y="170.496"+ id="use4148"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4150">+ <use+ xlink:href="#glyph4-1"+ x="160.96001"+ y="144.895"+ id="use4152"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4154">+ <use+ xlink:href="#glyph4-2"+ x="160.95801"+ y="144.895"+ id="use4156"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4158">+ <use+ xlink:href="#glyph5-1"+ x="162.64799"+ y="151.993"+ id="use4160"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4162">+ <use+ xlink:href="#glyph7-1"+ x="164.85899"+ y="153.53"+ id="use4164"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4166">+ <use+ xlink:href="#glyph4-1"+ x="250.298"+ y="163.68201"+ id="use4168"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4170">+ <use+ xlink:href="#glyph4-2"+ x="252.31842"+ y="163.68201"+ id="use4172"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4174">+ <use+ xlink:href="#glyph5-2"+ x="250.298"+ y="169.002"+ id="use4176"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4178">+ <use+ xlink:href="#glyph6-2"+ x="255.83701"+ y="170.496"+ id="use4180"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4182">+ <use+ xlink:href="#glyph4-1"+ x="250.298"+ y="146.673"+ id="use4184"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4186">+ <use+ xlink:href="#glyph4-2"+ x="250.29601"+ y="146.673"+ id="use4188"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4190">+ <use+ xlink:href="#glyph5-2"+ x="250.32201"+ y="151.993"+ id="use4192"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4194">+ <use+ xlink:href="#glyph7-1"+ x="255.86099"+ y="153.53"+ id="use4196"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4198">+ <use+ xlink:href="#glyph8-1"+ x="201.946"+ y="160.49699"+ id="use4200"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph8-2"+ x="209.92012"+ y="160.49699"+ id="use4202"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4204">+ <use+ xlink:href="#glyph18-1"+ x="208.481"+ y="178.33299"+ id="use4206"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 185.66406,180.92188 L 236.47266,180.92188"+ id="path4208" />+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 185.66406,188.79297 L 185.66406,180.72266"+ id="path4210" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4212">+ <use+ xlink:href="#glyph19-1"+ x="191.642"+ y="186.403"+ id="use4214"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4216">+ <use+ xlink:href="#glyph0-15"+ x="195.627"+ y="187.916"+ id="use4218"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 202.60156,188.79297 L 202.60156,180.72266"+ id="path4220" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4222">+ <use+ xlink:href="#glyph19-1"+ x="208.578"+ y="186.403"+ id="use4224"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4226">+ <use+ xlink:href="#glyph0-16"+ x="212.563"+ y="187.916"+ id="use4228"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 219.53516,188.79297 L 219.53516,180.72266"+ id="path4230" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4232">+ <use+ xlink:href="#glyph18-2"+ x="225.51401"+ y="186.403"+ id="use4234"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4236">+ <use+ xlink:href="#glyph18-2"+ x="229.27669"+ y="186.403"+ id="use4238"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4240">+ <use+ xlink:href="#glyph18-2"+ x="233.03937"+ y="186.403"+ id="use4242"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 236.47266,188.79297 L 236.47266,180.72266"+ id="path4244" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4246">+ <use+ xlink:href="#glyph18-3"+ x="242.451"+ y="186.403"+ id="use4248"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4250">+ <use+ xlink:href="#glyph20-1"+ x="253.13499"+ y="186.403"+ id="use4252"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4254">+ <use+ xlink:href="#glyph20-2"+ x="256.92081"+ y="186.403"+ id="use4256"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-3"+ x="261.35217"+ y="186.403"+ id="use4258"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-4"+ x="263.12152"+ y="186.403"+ id="use4260"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-5"+ x="267.55292"+ y="186.403"+ id="use4262"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-6"+ x="271.98428"+ y="186.403"+ id="use4264"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 185.66406,188.99219 L 236.47266,188.99219"+ id="path4266" />+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 185.66406,197.04688 L 185.66406,188.79297"+ id="path4268" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4270">+ <use+ xlink:href="#glyph19-2"+ x="191.642"+ y="194.65601"+ id="use4272"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4274">+ <use+ xlink:href="#glyph0-15"+ x="193.85699"+ y="196.16901"+ id="use4276"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 202.60156,197.04688 L 202.60156,188.79297"+ id="path4278" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4280">+ <use+ xlink:href="#glyph19-2"+ x="208.578"+ y="194.65601"+ id="use4282"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4284">+ <use+ xlink:href="#glyph0-16"+ x="210.79401"+ y="196.16901"+ id="use4286"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 219.53516,197.04688 L 219.53516,188.79297"+ id="path4288" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4290">+ <use+ xlink:href="#glyph18-2"+ x="225.51401"+ y="194.65601"+ id="use4292"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4294">+ <use+ xlink:href="#glyph18-2"+ x="229.27669"+ y="194.65601"+ id="use4296"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4298">+ <use+ xlink:href="#glyph18-2"+ x="233.03937"+ y="194.65601"+ id="use4300"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 236.47266,197.04688 L 236.47266,188.79297"+ id="path4302" />+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4304">+ <use+ xlink:href="#glyph18-3"+ x="242.451"+ y="194.65601"+ id="use4306"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g4308">+ <use+ xlink:href="#glyph20-7"+ x="253.13499"+ y="194.65601"+ id="use4310"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-4"+ x="255.35069"+ y="194.65601"+ id="use4312"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-8"+ x="259.78207"+ y="194.65601"+ id="use4314"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-9"+ x="264.21344"+ y="194.65601"+ id="use4316"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-10"+ x="268.19849"+ y="194.65601"+ id="use4318"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-11"+ x="270.41418"+ y="194.65601"+ id="use4320"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-12"+ x="272.18353"+ y="194.65601"+ id="use4322"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-8"+ x="276.61493"+ y="194.65601"+ id="use4324"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph20-6"+ x="281.0463"+ y="194.65601"+ id="use4326"+ width="362.83499"+ height="272.12601" />+ </g>+ <path+ style="fill:none;stroke:#000000;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 185.66406,197.24609 L 236.47266,197.24609"+ id="path4328" />+ </g>+</svg>
+ doc/www/files/tutorial/figures/processfun.svg view
@@ -0,0 +1,156 @@+<?xml version="1.0" encoding="UTF-8"?>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="696.287pt" height="81.295pt" viewBox="0 0 696.287 81.295" version="1.1">+<defs>+<g>+<symbol overflow="visible" id="glyph4-0">+<path style="stroke: none;" d=""/>+</symbol>+<symbol overflow="visible" id="glyph4-1">+<path style="stroke: none;" d="M 3.0625 -1.578125 C 2.96875 -1.25 2.8125 -0.625 2.8125 -0.546875 C 2.8125 0 3.265625 0.25 3.671875 0.25 C 4.125 0.25 4.515625 -0.078125 4.640625 -0.296875 C 4.765625 -0.53125 4.96875 -1.328125 5.09375 -1.859375 C 5.21875 -2.328125 5.5 -3.484375 5.65625 -4.125 C 5.796875 -4.671875 5.953125 -5.21875 6.078125 -5.796875 C 6.359375 -6.828125 6.40625 -7.03125 7.125 -8.0625 C 7.828125 -9.0625 9.015625 -10.375 10.890625 -10.375 C 12.359375 -10.375 12.375 -9.09375 12.375 -8.609375 C 12.375 -7.109375 11.296875 -4.3125 10.890625 -3.265625 C 10.625 -2.5625 10.515625 -2.328125 10.515625 -1.90625 C 10.515625 -0.578125 11.625 0.25 12.90625 0.25 C 15.421875 0.25 16.515625 -3.21875 16.515625 -3.59375 C 16.515625 -3.921875 16.203125 -3.921875 16.125 -3.921875 C 15.765625 -3.921875 15.75 -3.765625 15.640625 -3.484375 C 15.0625 -1.484375 13.984375 -0.453125 12.984375 -0.453125 C 12.453125 -0.453125 12.359375 -0.796875 12.359375 -1.328125 C 12.359375 -1.90625 12.484375 -2.234375 12.9375 -3.359375 C 13.234375 -4.140625 14.265625 -6.796875 14.265625 -8.203125 C 14.265625 -10.640625 12.328125 -11.078125 11 -11.078125 C 8.90625 -11.078125 7.5 -9.796875 6.75 -8.78125 C 6.578125 -10.515625 5.09375 -11.078125 4.0625 -11.078125 C 2.984375 -11.078125 2.40625 -10.296875 2.078125 -9.71875 C 1.53125 -8.78125 1.1875 -7.359375 1.1875 -7.234375 C 1.1875 -6.90625 1.53125 -6.90625 1.609375 -6.90625 C 1.953125 -6.90625 1.984375 -6.984375 2.15625 -7.65625 C 2.53125 -9.140625 3.015625 -10.375 4 -10.375 C 4.640625 -10.375 4.828125 -9.8125 4.828125 -9.140625 C 4.828125 -8.65625 4.59375 -7.734375 4.421875 -7.0625 C 4.25 -6.375 4 -5.34375 3.859375 -4.796875 L 3.0625 -1.578125 Z M 3.0625 -1.578125 "/>+</symbol>+<symbol overflow="visible" id="glyph4-2">+<path style="stroke: none;" d="M 10.890625 -2.03125 C 10.765625 -1.53125 10.546875 -0.671875 10.546875 -0.546875 C 10.546875 0 11 0.25 11.40625 0.25 C 11.859375 0.25 12.25 -0.078125 12.375 -0.296875 C 12.5 -0.53125 12.703125 -1.328125 12.828125 -1.859375 C 12.953125 -2.328125 13.234375 -3.484375 13.390625 -4.125 C 13.53125 -4.671875 13.6875 -5.21875 13.8125 -5.796875 C 14.09375 -6.875 14.09375 -6.9375 14.59375 -7.703125 C 15.390625 -8.9375 16.640625 -10.375 18.609375 -10.375 C 20.015625 -10.375 20.09375 -9.21875 20.09375 -8.609375 C 20.09375 -7.109375 19 -4.3125 18.609375 -3.265625 C 18.328125 -2.5625 18.234375 -2.328125 18.234375 -1.90625 C 18.234375 -0.578125 19.328125 0.25 20.609375 0.25 C 23.125 0.25 24.234375 -3.21875 24.234375 -3.59375 C 24.234375 -3.921875 23.90625 -3.921875 23.828125 -3.921875 C 23.484375 -3.921875 23.453125 -3.765625 23.359375 -3.484375 C 22.78125 -1.484375 21.6875 -0.453125 20.6875 -0.453125 C 20.15625 -0.453125 20.0625 -0.796875 20.0625 -1.328125 C 20.0625 -1.90625 20.1875 -2.234375 20.640625 -3.359375 C 20.9375 -4.140625 21.96875 -6.796875 21.96875 -8.203125 C 21.96875 -8.609375 21.96875 -9.671875 21.046875 -10.390625 C 20.609375 -10.71875 19.890625 -11.078125 18.703125 -11.078125 C 16.453125 -11.078125 15.0625 -9.59375 14.265625 -8.53125 C 14.0625 -10.671875 12.28125 -11.078125 11 -11.078125 C 8.90625 -11.078125 7.5 -9.796875 6.75 -8.78125 C 6.578125 -10.515625 5.09375 -11.078125 4.0625 -11.078125 C 2.984375 -11.078125 2.40625 -10.296875 2.078125 -9.71875 C 1.53125 -8.78125 1.1875 -7.359375 1.1875 -7.234375 C 1.1875 -6.90625 1.53125 -6.90625 1.609375 -6.90625 C 1.953125 -6.90625 1.984375 -6.984375 2.15625 -7.65625 C 2.53125 -9.140625 3.015625 -10.375 4 -10.375 C 4.640625 -10.375 4.828125 -9.8125 4.828125 -9.140625 C 4.828125 -8.65625 4.59375 -7.734375 4.421875 -7.0625 C 4.25 -6.375 4 -5.34375 3.859375 -4.796875 L 3.0625 -1.578125 C 2.96875 -1.25 2.8125 -0.625 2.8125 -0.546875 C 2.8125 0 3.265625 0.25 3.671875 0.25 C 4.125 0.25 4.515625 -0.078125 4.640625 -0.296875 C 4.765625 -0.53125 4.96875 -1.328125 5.09375 -1.859375 C 5.21875 -2.328125 5.5 -3.484375 5.65625 -4.125 C 5.796875 -4.671875 5.953125 -5.21875 6.078125 -5.796875 C 6.359375 -6.828125 6.40625 -7.03125 7.125 -8.0625 C 7.828125 -9.0625 9.015625 -10.375 10.890625 -10.375 C 12.359375 -10.375 12.375 -9.09375 12.375 -8.609375 C 12.375 -7.984375 12.296875 -7.65625 11.953125 -6.25 L 10.890625 -2.03125 Z M 10.890625 -2.03125 "/>+</symbol>+<symbol overflow="visible" id="glyph0-0">+<path style="stroke: none;" d=""/>+</symbol>+<symbol overflow="visible" id="glyph0-1">+<path style="stroke: none;" d="M 6.28125 -12.078125 C 7.3125 -13.90625 9.078125 -14.953125 10.90625 -14.953125 C 13.515625 -14.953125 15.703125 -11.796875 15.703125 -7.75 C 15.703125 -3.40625 13.203125 -0.390625 10.546875 -0.390625 C 9.109375 -0.390625 7.75 -1.109375 6.78125 -2.578125 C 6.28125 -3.328125 6.28125 -3.375 6.28125 -4.09375 L 6.28125 -12.078125 Z M 6.28125 -2.109375 C 6.453125 -1.546875 7.953125 0.390625 10.6875 0.390625 C 14.953125 0.390625 18.6875 -3.125 18.6875 -7.75 C 18.6875 -12.296875 15.203125 -15.84375 11.1875 -15.84375 C 8.390625 -15.84375 6.890625 -14.265625 6.171875 -13.484375 L 6.171875 -15.84375 L 1 -15.453125 L 1 -14.34375 C 3.546875 -14.34375 3.796875 -14.125 3.796875 -12.546875 L 3.796875 4.234375 C 3.796875 5.84375 3.40625 5.84375 1 5.84375 L 1 6.953125 C 2.21875 6.921875 4.09375 6.84375 5.015625 6.84375 C 5.984375 6.84375 7.8125 6.921875 9.078125 6.953125 L 9.078125 5.84375 C 6.671875 5.84375 6.28125 5.84375 6.28125 4.234375 L 6.28125 -1.796875 L 6.28125 -2.109375 Z M 6.28125 -2.109375 "/>+</symbol>+<symbol overflow="visible" id="glyph0-2">+<path style="stroke: none;" d="M 6.890625 -13.5625 C 6.890625 -14.59375 6.03125 -15.453125 4.984375 -15.453125 C 3.9375 -15.453125 3.078125 -14.59375 3.078125 -13.5625 C 3.078125 -12.515625 3.9375 -11.65625 4.984375 -11.65625 C 6.03125 -11.65625 6.890625 -12.515625 6.890625 -13.5625 Z M 6.890625 -1.90625 C 6.890625 -2.9375 6.03125 -3.796875 4.984375 -3.796875 C 3.9375 -3.796875 3.078125 -2.9375 3.078125 -1.90625 C 3.078125 -0.859375 3.9375 0 4.984375 0 C 6.03125 0 6.890625 -0.859375 6.890625 -1.90625 Z M 6.890625 -1.90625 "/>+</symbol>+<symbol overflow="visible" id="glyph1-0">+<path style="stroke: none;" d=""/>+</symbol>+<symbol overflow="visible" id="glyph1-1">+<path style="stroke: none;" d="M 23.125 -24.921875 C 23.125 -25.03125 23.0625 -25.28125 22.734375 -25.28125 C 22.5625 -25.28125 22.515625 -25.25 22.09375 -24.75 L 20.375 -22.703125 C 19.4375 -24.390625 17.578125 -25.28125 15.234375 -25.28125 C 10.6875 -25.28125 6.390625 -21.15625 6.390625 -16.8125 C 6.390625 -13.90625 8.28125 -12.265625 10.109375 -11.71875 L 13.953125 -10.71875 C 15.28125 -10.40625 17.25 -9.859375 17.25 -6.921875 C 17.25 -3.6875 14.3125 -0.328125 10.796875 -0.328125 C 8.5 -0.328125 4.515625 -1.109375 4.515625 -5.5625 C 4.515625 -6.421875 4.703125 -7.28125 4.734375 -7.5 C 4.765625 -7.640625 4.8125 -7.671875 4.8125 -7.75 C 4.8125 -8.109375 4.546875 -8.140625 4.375 -8.140625 C 4.203125 -8.140625 4.125 -8.109375 4.015625 -8 C 3.875 -7.859375 1.859375 0.328125 1.859375 0.4375 C 1.859375 0.640625 2.046875 0.78125 2.265625 0.78125 C 2.4375 0.78125 2.46875 0.75 2.90625 0.25 L 4.65625 -1.796875 C 6.203125 0.28125 8.640625 0.78125 10.71875 0.78125 C 15.59375 0.78125 19.828125 -3.984375 19.828125 -8.421875 C 19.828125 -10.90625 18.609375 -12.125 18.078125 -12.625 C 17.25 -13.453125 16.703125 -13.59375 13.515625 -14.421875 C 12.734375 -14.625 11.4375 -14.984375 11.109375 -15.0625 C 10.140625 -15.390625 8.921875 -16.421875 8.921875 -18.328125 C 8.921875 -21.234375 11.796875 -24.28125 15.203125 -24.28125 C 18.1875 -24.28125 20.375 -22.734375 20.375 -18.71875 C 20.375 -17.578125 20.21875 -16.921875 20.21875 -16.703125 C 20.21875 -16.671875 20.21875 -16.359375 20.65625 -16.359375 C 21.015625 -16.359375 21.046875 -16.453125 21.1875 -17.0625 L 23.125 -24.921875 Z M 23.125 -24.921875 "/>+</symbol>+<symbol overflow="visible" id="glyph1-2">+<path style="stroke: none;" d="M 6.890625 -1.90625 C 6.890625 -2.9375 6.03125 -3.796875 4.984375 -3.796875 C 3.9375 -3.796875 3.078125 -2.9375 3.078125 -1.90625 C 3.078125 -0.859375 3.9375 0 4.984375 0 C 6.03125 0 6.890625 -0.859375 6.890625 -1.90625 Z M 6.890625 -1.90625 "/>+</symbol>+<symbol overflow="visible" id="glyph2-0">+<path style="stroke: none;" d=""/>+</symbol>+<symbol overflow="visible" id="glyph2-1">+<path style="stroke: none;" d="M 14.984375 -8.96875 L 22.125 -16.140625 C 22.515625 -16.53125 22.59375 -16.609375 22.59375 -16.890625 C 22.59375 -17.28125 22.265625 -17.609375 21.875 -17.609375 C 21.59375 -17.609375 21.4375 -17.46875 21.125 -17.140625 L 13.953125 -9.96875 L 6.734375 -17.140625 C 6.34375 -17.53125 6.28125 -17.609375 5.984375 -17.609375 C 5.625 -17.609375 5.265625 -17.28125 5.265625 -16.890625 C 5.265625 -16.609375 5.421875 -16.453125 5.734375 -16.140625 L 12.875 -8.96875 L 5.734375 -1.828125 C 5.375 -1.46875 5.265625 -1.25 5.265625 -1.046875 C 5.265625 -0.640625 5.625 -0.328125 5.984375 -0.328125 C 6.28125 -0.328125 6.34375 -0.390625 6.734375 -0.78125 L 13.90625 -7.953125 L 21.078125 -0.78125 C 21.4375 -0.4375 21.65625 -0.328125 21.875 -0.328125 C 22.296875 -0.328125 22.59375 -0.640625 22.59375 -1.046875 C 22.59375 -1.328125 22.515625 -1.40625 22.125 -1.796875 L 14.984375 -8.96875 Z M 14.984375 -8.96875 "/>+</symbol>+<symbol overflow="visible" id="glyph2-2">+<path style="stroke: none;" d="M 30.765625 -8.25 C 28.078125 -6.28125 26.890625 -3.296875 26.890625 -3.015625 C 26.890625 -2.6875 27.1875 -2.578125 27.4375 -2.578125 C 27.859375 -2.578125 27.9375 -2.796875 28 -2.9375 C 28.546875 -4.15625 29.6875 -6.78125 33.28125 -8.46875 C 33.703125 -8.671875 33.78125 -8.71875 33.78125 -8.96875 C 33.78125 -9.21875 33.5625 -9.328125 33.53125 -9.328125 C 31.59375 -10.21875 29.515625 -11.546875 28.046875 -14.84375 C 27.90625 -15.171875 27.828125 -15.34375 27.4375 -15.34375 C 27.1875 -15.34375 26.890625 -15.234375 26.890625 -14.921875 C 26.890625 -14.625 28.078125 -11.65625 30.765625 -9.6875 L 3.1875 -9.6875 C 2.65625 -9.6875 2.015625 -9.6875 2.015625 -8.96875 C 2.015625 -8.25 2.65625 -8.25 3.1875 -8.25 L 30.765625 -8.25 Z M 30.765625 -8.25 "/>+</symbol>+<symbol overflow="visible" id="glyph3-0">+<path style="stroke: none;" d=""/>+</symbol>+<symbol overflow="visible" id="glyph3-1">+<path style="stroke: none;" d="M 16.5 -3.296875 C 16.5 -4.125 16.5 -4.296875 16 -4.296875 C 13.8125 -4.34375 10.25 -4.625 7.03125 -6.203125 C 3.15625 -8.140625 1.6875 -10.40625 0.78125 -11.796875 C 0.6875 -11.984375 0.46875 -11.984375 0 -11.984375 C -0.828125 -11.984375 -0.859375 -11.9375 -0.859375 -11.046875 L -0.859375 -10.46875 C 4.015625 -1.6875 12.078125 0 15.75 0 C 16.5 0 16.5 -0.03125 16.5 -1 L 16.5 -3.296875 Z M 16.5 -3.296875 "/>+</symbol>+<symbol overflow="visible" id="glyph3-2">+<path style="stroke: none;" d="M 17 6.171875 C 12.125 -2.625 4.046875 -4.296875 0.390625 -4.296875 C -0.359375 -4.296875 -0.359375 -4.265625 -0.359375 -3.296875 L -0.359375 -1 C -0.359375 -0.171875 -0.359375 0 0.140625 0 C 2.328125 0.03125 5.875 0.328125 9.109375 1.90625 C 12.984375 3.84375 14.453125 6.09375 15.34375 7.5 C 15.453125 7.671875 15.671875 7.671875 16.140625 7.671875 C 16.96875 7.671875 17 7.640625 17 6.734375 L 17 6.171875 Z M 17 6.171875 "/>+</symbol>+<symbol overflow="visible" id="glyph3-3">+<path style="stroke: none;" d="M 16.5 -3.296875 C 16.5 -4.265625 16.5 -4.296875 15.75 -4.296875 C 12.078125 -4.296875 4.015625 -2.578125 -0.859375 6.171875 L -0.859375 6.734375 C -0.859375 7.640625 -0.828125 7.671875 0 7.671875 C 0.6875 7.671875 0.71875 7.640625 0.890625 7.390625 C 3.84375 2.6875 8.78125 0.140625 16.0625 0 C 16.5 0 16.5 -0.25 16.5 -1 L 16.5 -3.296875 Z M 16.5 -3.296875 "/>+</symbol>+<symbol overflow="visible" id="glyph3-4">+<path style="stroke: none;" d="M 17 -11.046875 C 17 -11.9375 16.96875 -11.984375 16.140625 -11.984375 C 15.453125 -11.984375 15.421875 -11.9375 15.234375 -11.6875 C 12.296875 -7 7.34375 -4.453125 0.078125 -4.296875 C -0.359375 -4.296875 -0.359375 -4.046875 -0.359375 -3.296875 L -0.359375 -1 C -0.359375 -0.03125 -0.359375 0 0.390625 0 C 4.046875 0 12.125 -1.71875 17 -10.46875 L 17 -11.046875 Z M 17 -11.046875 "/>+</symbol>+</g>+<clipPath id="clip1">+ <path d="M 0 81.296875 L 696 81.296875 L 696 0.296875 L 0 0.296875 L 0 81.296875 Z M 0 81.296875 "/>+</clipPath>+</defs>+<g id="surface0">+<g clip-path="url(#clip1)" clip-rule="nonzero">+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph0-1" x="0" y="25.943"/>+ <use xlink:href="#glyph0-2" x="31.884305" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="53.7984" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="97.7832" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="133.65" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="165.6792" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="213.498" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="229.458085" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="245.382305" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="275.2668" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="323.0856" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-1" x="53.7984" y="43.9934"/>+</g>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 69.9375 43.992188 L 184.332031 43.992188 L 184.332031 39.691406 L 69.9375 39.691406 L 69.9375 43.992188 Z M 69.9375 43.992188 "/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-2" x="184.3344" y="43.9934"/>+ <use xlink:href="#glyph3-3" x="200.473812" y="43.9934"/>+</g>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 216.613281 43.992188 L 331.003906 43.992188 L 331.003906 39.691406 L 216.613281 39.691406 L 216.613281 43.992188 Z M 216.613281 43.992188 "/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-4" x="331.005636" y="43.9934"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph4-1" x="191.606436" y="76.271"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-2" x="357.109236" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="402.9372" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="446.922" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="482.7888" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="514.818" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="562.6368" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="578.596885" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-2" x="594.521105" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph2-1" x="624.4056" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph1-1" x="672.2244" y="25.943"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-1" x="402.9372" y="43.9934"/>+</g>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 419.074219 43.992188 L 533.46875 43.992188 L 533.46875 39.691406 L 419.074219 39.691406 L 419.074219 43.992188 Z M 419.074219 43.992188 "/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-2" x="533.4732" y="43.9934"/>+ <use xlink:href="#glyph3-3" x="549.612612" y="43.9934"/>+</g>+<path style=" stroke:none;fill-rule: nonzero; fill: rgb(0%,0%,0%); fill-opacity: 1;" d="M 565.75 43.992188 L 680.144531 43.992188 L 680.144531 39.691406 L 565.75 39.691406 L 565.75 43.992188 Z M 565.75 43.992188 "/>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph3-4" x="680.1444" y="43.9934"/>+</g>+<g style="fill: rgb(0%,0%,0%); fill-opacity: 1;">+ <use xlink:href="#glyph4-2" x="536.886" y="76.271"/>+</g>+</g>+</g>+</svg>
+ doc/www/files/tutorial/figures/sourceSY.svg view
@@ -0,0 +1,2524 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="333.68686"+ height="139.55212"+ viewBox="0 0 362.835 272.126"+ version="1.0"+ id="svg2"+ sodipodi:version="0.32"+ inkscape:version="0.46"+ sodipodi:docname="sourceSY.svg"+ inkscape:output_extension="org.inkscape.output.svg.inkscape">+ <metadata+ id="metadata2038">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <sodipodi:namedview+ inkscape:window-height="944"+ inkscape:window-width="1679"+ inkscape:pageshadow="2"+ inkscape:pageopacity="0.0"+ guidetolerance="10.0"+ gridtolerance="10.0"+ objecttolerance="10.0"+ borderopacity="1.0"+ bordercolor="#666666"+ pagecolor="#ffffff"+ id="base"+ showgrid="false"+ inkscape:zoom="1.1972385"+ inkscape:cx="184.10509"+ inkscape:cy="170.07875"+ inkscape:window-x="0"+ inkscape:window-y="0"+ inkscape:current-layer="svg2" />+ <defs+ id="defs4">+ <inkscape:perspective+ sodipodi:type="inkscape:persp3d"+ inkscape:vp_x="0 : 170.07875 : 1"+ inkscape:vp_y="0 : 1000 : 0"+ inkscape:vp_z="453.54373 : 170.07875 : 1"+ inkscape:persp3d-origin="226.77187 : 113.38583 : 1"+ id="perspective2040" />+ <g+ id="g6">+ <symbol+ overflow="visible"+ id="glyph4-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path9" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.765625,-8.71875 L 6.765625,-8.71875 L 6.046875,-5.359375 C 5.671875,-6.125 5.1875,-6.4375 4.34375,-6.4375 C 2.359375,-6.4375 0.875,-4.546875 0.875,-2.03125 C 0.875,-0.640625 1.671875,0.28125 2.921875,0.28125 C 3.4375,0.28125 3.984375,0.109375 4.453125,-0.171875 C 4.8125,-0.390625 4.96875,-0.578125 5.140625,-0.90625 L 4.953125,0 L 5.921875,0 L 7.765625,-8.71875 z M 4.25,-5.515625 C 5.125,-5.515625 5.65625,-4.921875 5.65625,-3.90625 C 5.65625,-3.203125 5.46875,-2.46875 5.109375,-1.859375 C 4.640625,-1.046875 4.046875,-0.640625 3.328125,-0.640625 C 2.4375,-0.640625 1.921875,-1.25 1.921875,-2.265625 C 1.921875,-2.9375 2.125,-3.703125 2.453125,-4.3125 C 2.90625,-5.140625 3.484375,-5.515625 4.25,-5.515625 z"+ id="path12" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.734375,-2.796875 L 6.765625,-3 C 6.875,-3.578125 6.9375,-4.078125 6.9375,-4.40625 C 6.9375,-5.546875 5.9375,-6.4375 4.65625,-6.4375 C 3.609375,-6.4375 2.609375,-5.953125 2.015625,-5.15625 C 1.453125,-4.40625 1,-3.03125 1,-2.0625 C 1,-1.421875 1.28125,-0.765625 1.75,-0.328125 C 2.15625,0.078125 2.6875,0.28125 3.375,0.28125 C 4.8125,0.28125 6.03125,-0.609375 6.40625,-1.90625 L 5.40625,-1.90625 C 4.96875,-1.078125 4.34375,-0.640625 3.53125,-0.640625 C 2.59375,-0.640625 2.0625,-1.234375 2.0625,-2.25 C 2.0625,-2.5 2.0625,-2.625 2.109375,-2.796875 L 6.734375,-2.796875 z M 2.328125,-3.65625 C 2.640625,-4.75 3.53125,-5.515625 4.5,-5.515625 C 5.34375,-5.515625 5.875,-4.953125 5.875,-4.046875 C 5.875,-3.9375 5.875,-3.84375 5.84375,-3.65625 L 2.328125,-3.65625 z"+ id="path15" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.671875,-8.71875 L 2.671875,-8.71875 L 0.8125,0 L 1.8125,0 L 3.671875,-8.71875 z"+ id="path18" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.59375,-0.609375 C 6.484375,-0.578125 6.4375,-0.578125 6.390625,-0.578125 C 6.078125,-0.578125 5.9375,-0.6875 5.9375,-0.9375 C 5.9375,-0.984375 5.9375,-1.015625 5.953125,-1.046875 L 6.71875,-4.65625 C 6.796875,-4.96875 6.796875,-4.96875 6.796875,-5.09375 C 6.796875,-5.90625 5.96875,-6.4375 4.703125,-6.4375 C 3.046875,-6.4375 2.03125,-5.734375 1.8125,-4.40625 L 2.8125,-4.40625 C 2.921875,-4.75 3,-4.90625 3.171875,-5.078125 C 3.4375,-5.34375 3.9375,-5.515625 4.453125,-5.515625 C 5.15625,-5.515625 5.71875,-5.203125 5.71875,-4.75 C 5.71875,-4.703125 5.703125,-4.625 5.6875,-4.53125 L 5.65625,-4.3125 C 5.546875,-3.828125 5.3125,-3.6875 4.453125,-3.609375 C 2.84375,-3.46875 2.34375,-3.34375 1.75,-2.96875 C 1.140625,-2.578125 0.78125,-1.953125 0.78125,-1.25 C 0.78125,-0.296875 1.421875,0.28125 2.5,0.28125 C 2.921875,0.28125 3.421875,0.1875 3.84375,0.03125 C 4.234375,-0.09375 4.40625,-0.21875 4.90625,-0.640625 L 4.90625,-0.5625 L 4.90625,-0.515625 C 4.90625,-0.03125 5.234375,0.28125 5.8125,0.28125 C 5.9375,0.28125 5.96875,0.28125 6.28125,0.203125 C 6.296875,0.1875 6.375,0.171875 6.4375,0.171875 L 6.59375,-0.609375 z M 5.15625,-1.953125 C 5,-1.21875 3.9375,-0.578125 2.890625,-0.578125 C 2.21875,-0.578125 1.828125,-0.875 1.828125,-1.375 C 1.828125,-1.765625 2.0625,-2.15625 2.421875,-2.375 C 2.703125,-2.5625 3.0625,-2.65625 3.640625,-2.734375 C 4.765625,-2.890625 4.859375,-2.90625 5.390625,-3.078125 L 5.15625,-1.953125 z"+ id="path21" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.984375,-6.265625 L 3.203125,-1.40625 L 2.65625,-6.265625 L 1.578125,-6.265625 L 2.390625,0.046875 L 1.765625,1.015625 C 1.453125,1.515625 1.25,1.640625 0.8125,1.640625 C 0.6875,1.640625 0.609375,1.625 0.28125,1.59375 L 0.09375,2.484375 C 0.3125,2.578125 0.453125,2.609375 0.6875,2.609375 C 1.53125,2.609375 2.140625,2.203125 2.65625,1.3125 L 7.046875,-6.265625 L 5.984375,-6.265625 z"+ id="path24" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 8.4375,-6.15625 C 8.515625,-6.484375 8.53125,-6.640625 8.53125,-6.828125 C 8.53125,-7.34375 8.28125,-7.890625 7.890625,-8.234375 C 7.40625,-8.671875 6.765625,-8.859375 5.828125,-8.859375 C 4.609375,-8.859375 3.640625,-8.515625 2.984375,-7.84375 C 2.5,-7.34375 2.125,-6.484375 2.125,-5.875 C 2.125,-5.125 2.65625,-4.5 3.453125,-4.265625 L 5.5,-3.6875 C 6.453125,-3.421875 6.84375,-3.078125 6.84375,-2.5 C 6.84375,-2.125 6.625,-1.671875 6.28125,-1.359375 C 5.796875,-0.921875 5.09375,-0.6875 4.140625,-0.6875 C 2.78125,-0.6875 2.15625,-1.1875 2.15625,-2.28125 C 2.15625,-2.4375 2.171875,-2.546875 2.21875,-2.765625 L 1.171875,-2.765625 C 1.09375,-2.46875 1.0625,-2.265625 1.0625,-2.015625 C 1.0625,-0.578125 2.140625,0.28125 3.9375,0.28125 C 5.203125,0.28125 6.25,-0.078125 6.953125,-0.734375 C 7.5625,-1.296875 8,-2.15625 8,-2.828125 C 8,-3.140625 7.890625,-3.484375 7.703125,-3.765625 C 7.453125,-4.1875 7.09375,-4.421875 6.53125,-4.578125 L 4.484375,-5.15625 C 3.5625,-5.421875 3.28125,-5.671875 3.28125,-6.1875 C 3.28125,-6.609375 3.453125,-6.984375 3.796875,-7.296875 C 4.25,-7.703125 4.828125,-7.890625 5.625,-7.890625 C 6.28125,-7.890625 6.796875,-7.75 7.046875,-7.515625 C 7.28125,-7.3125 7.4375,-6.9375 7.4375,-6.59375 C 7.4375,-6.484375 7.421875,-6.390625 7.390625,-6.15625 L 8.4375,-6.15625 z"+ id="path27" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.359375,-3.421875 L 9.75,-8.71875 L 8.421875,-8.71875 L 4.96875,-4.453125 L 3.34375,-8.71875 L 2.015625,-8.71875 L 4.234375,-3.421875 L 3.5,0 L 4.625,0 L 5.359375,-3.421875 z"+ id="path30" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.140625,-4.515625 C 6.203125,-4.765625 6.21875,-4.875 6.21875,-5.03125 C 6.21875,-5.875 5.421875,-6.4375 4.25,-6.4375 C 3.40625,-6.4375 2.671875,-6.1875 2.1875,-5.71875 C 1.75,-5.3125 1.46875,-4.6875 1.46875,-4.125 C 1.46875,-3.390625 1.890625,-3.046875 3.125,-2.71875 L 4,-2.5 C 4.40625,-2.390625 4.578125,-2.3125 4.6875,-2.1875 C 4.765625,-2.078125 4.84375,-1.90625 4.84375,-1.796875 C 4.84375,-1.578125 4.65625,-1.203125 4.453125,-1.046875 C 4.15625,-0.796875 3.640625,-0.640625 3.125,-0.640625 C 2.3125,-0.640625 1.84375,-0.96875 1.84375,-1.5625 C 1.84375,-1.640625 1.859375,-1.75 1.859375,-1.859375 L 0.796875,-1.859375 C 0.734375,-1.59375 0.734375,-1.453125 0.734375,-1.25 C 0.734375,-0.296875 1.5625,0.28125 2.953125,0.28125 C 4.734375,0.28125 5.890625,-0.640625 5.890625,-2.0625 C 5.890625,-2.796875 5.5,-3.171875 4.453125,-3.4375 L 3.53125,-3.671875 C 2.875,-3.84375 2.515625,-4.078125 2.515625,-4.390625 C 2.515625,-4.625 2.671875,-4.921875 2.875,-5.125 C 3.171875,-5.40625 3.53125,-5.515625 4.046875,-5.515625 C 4.75,-5.515625 5.15625,-5.25 5.15625,-4.78125 C 5.15625,-4.703125 5.15625,-4.609375 5.140625,-4.515625 L 6.140625,-4.515625 z"+ id="path33" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.171875,-6.265625 L 0.84375,0 L 1.859375,0 L 2.6875,-3.9375 C 2.875,-4.84375 3.6875,-5.578125 4.5,-5.578125 C 5.078125,-5.578125 5.46875,-5.25 5.46875,-4.75 C 5.46875,-4.625 5.46875,-4.46875 5.421875,-4.3125 L 4.5,0 L 5.515625,0 L 6.34375,-3.9375 C 6.53125,-4.859375 7.359375,-5.578125 8.21875,-5.578125 C 8.78125,-5.578125 9.125,-5.234375 9.125,-4.65625 C 9.125,-4.484375 9.125,-4.484375 9.03125,-4.078125 L 8.15625,0 L 9.171875,0 L 10.109375,-4.453125 C 10.140625,-4.59375 10.1875,-4.984375 10.1875,-5.109375 C 10.1875,-5.421875 10.046875,-5.765625 9.796875,-6.03125 C 9.53125,-6.328125 9.21875,-6.4375 8.671875,-6.4375 C 7.890625,-6.4375 7.203125,-6.125 6.5,-5.453125 C 6.3125,-6.125 5.84375,-6.4375 5.0625,-6.4375 C 4.25,-6.4375 3.6875,-6.203125 2.921875,-5.484375 L 3.078125,-6.265625 L 2.171875,-6.265625 z"+ id="path36" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.078125,2.546875 L 1.09375,2.546875 L 1.8125,-0.8125 C 2.171875,-0.03125 2.671875,0.28125 3.515625,0.28125 C 4.453125,0.28125 5.34375,-0.15625 5.953125,-0.90625 C 6.59375,-1.703125 7,-2.9375 7,-4.109375 C 7,-5.546875 6.203125,-6.4375 4.921875,-6.4375 C 4.40625,-6.4375 3.875,-6.28125 3.390625,-5.96875 C 3.015625,-5.734375 2.875,-5.578125 2.71875,-5.265625 L 2.921875,-6.265625 L 1.953125,-6.265625 L 0.078125,2.546875 z M 4.53125,-5.515625 C 5.421875,-5.515625 5.953125,-4.90625 5.953125,-3.875 C 5.953125,-3.234375 5.75,-2.453125 5.421875,-1.859375 C 4.984375,-1.046875 4.390625,-0.640625 3.609375,-0.640625 C 2.734375,-0.640625 2.1875,-1.25 2.1875,-2.203125 C 2.1875,-2.921875 2.390625,-3.6875 2.75,-4.3125 C 3.1875,-5.109375 3.796875,-5.515625 4.53125,-5.515625 z"+ id="path39" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.421875,-6.265625 L 3.390625,-6.265625 L 3.578125,-7.09375 C 3.703125,-7.6875 3.921875,-7.890625 4.4375,-7.890625 C 4.515625,-7.890625 4.59375,-7.890625 4.75,-7.859375 L 4.9375,-8.6875 C 4.71875,-8.734375 4.59375,-8.75 4.40625,-8.75 C 3.484375,-8.75 2.8125,-8.21875 2.625,-7.328125 L 2.390625,-6.265625 L 1.546875,-6.265625 L 1.390625,-5.46875 L 2.21875,-5.46875 L 1.0625,0 L 2.0625,0 L 3.234375,-5.46875 L 4.25,-5.46875 L 4.421875,-6.265625 z"+ id="path42" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.59375,-6.4375 C 3.484375,-6.4375 2.5,-5.9375 1.890625,-5.0625 C 1.34375,-4.296875 0.953125,-2.96875 0.953125,-1.953125 C 0.953125,-0.640625 1.875,0.28125 3.21875,0.28125 C 4.359375,0.28125 5.265625,-0.1875 5.9375,-1.109375 C 6.484375,-1.859375 6.890625,-3.171875 6.890625,-4.203125 C 6.890625,-4.84375 6.640625,-5.453125 6.234375,-5.859375 C 5.828125,-6.25 5.28125,-6.4375 4.59375,-6.4375 z M 4.4375,-5.515625 C 5.3125,-5.515625 5.828125,-4.953125 5.828125,-3.984375 C 5.828125,-3.28125 5.625,-2.5 5.3125,-1.90625 C 4.859375,-1.078125 4.203125,-0.640625 3.375,-0.640625 C 2.53125,-0.640625 2.015625,-1.25 2.015625,-2.203125 C 2.015625,-2.875 2.21875,-3.671875 2.53125,-4.265625 C 2.96875,-5.078125 3.640625,-5.515625 4.4375,-5.515625 z"+ id="path45" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.765625,0 L 7.09375,-6.265625 L 6.09375,-6.265625 L 5.34375,-2.71875 C 5.0625,-1.421875 4.21875,-0.578125 3.203125,-0.578125 C 2.5625,-0.578125 2.140625,-0.9375 2.140625,-1.5 C 2.140625,-1.609375 2.15625,-1.703125 2.171875,-1.828125 L 3.125,-6.265625 L 2.109375,-6.265625 L 1.09375,-1.4375 C 1.0625,-1.3125 1.046875,-1.1875 1.046875,-1.03125 C 1.046875,-0.21875 1.671875,0.28125 2.703125,0.28125 C 3.640625,0.28125 4.3125,-0.015625 5.015625,-0.6875 L 4.859375,0 L 5.765625,0 z"+ id="path48" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.15625,-6.265625 L 0.828125,0 L 1.828125,0 L 2.515625,-3.25 C 2.828125,-4.703125 3.6875,-5.4375 5,-5.390625 L 5.21875,-6.40625 C 5.0625,-6.4375 4.953125,-6.4375 4.828125,-6.4375 C 4.140625,-6.4375 3.59375,-6.125 2.859375,-5.28125 L 3.0625,-6.265625 L 2.15625,-6.265625 z"+ id="path51" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.59375,-4.15625 L 6.59375,-4.34375 C 6.609375,-4.515625 6.625,-4.65625 6.625,-4.6875 C 6.625,-5.078125 6.40625,-5.5625 6.09375,-5.875 C 5.71875,-6.265625 5.234375,-6.4375 4.546875,-6.4375 C 3.484375,-6.4375 2.515625,-5.984375 1.875,-5.15625 C 1.3125,-4.4375 0.90625,-3.125 0.90625,-2.03125 C 0.90625,-1.46875 1.09375,-0.890625 1.4375,-0.46875 C 1.84375,0.046875 2.375,0.28125 3.140625,0.28125 C 4.125,0.28125 4.953125,-0.078125 5.5,-0.71875 C 5.8125,-1.078125 6,-1.484375 6.1875,-2.15625 L 5.1875,-2.15625 C 4.828125,-1.171875 4.171875,-0.640625 3.3125,-0.640625 C 2.484375,-0.640625 1.953125,-1.234375 1.953125,-2.15625 C 1.953125,-2.921875 2.21875,-3.84375 2.609375,-4.453125 C 3.046875,-5.15625 3.640625,-5.515625 4.375,-5.515625 C 5.125,-5.515625 5.59375,-5.109375 5.59375,-4.421875 C 5.59375,-4.34375 5.59375,-4.265625 5.578125,-4.15625 L 6.59375,-4.15625 z"+ id="path54" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph4-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.125,-6.265625 L 2.109375,-6.265625 L 0.78125,0 L 1.796875,0 L 3.125,-6.265625 z M 3.640625,-8.71875 L 2.640625,-8.71875 L 2.375,-7.484375 L 3.375,-7.484375 L 3.640625,-8.71875 z"+ id="path57" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path60" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.75,-5.71875 C 6.890625,-5.796875 6.953125,-5.828125 6.953125,-5.953125 C 6.953125,-6.09375 6.84375,-6.171875 6.734375,-6.171875 C 6.6875,-6.171875 6.59375,-6.125 6.546875,-6.109375 L 0.8125,-2.953125 C 0.671875,-2.875 0.609375,-2.84375 0.609375,-2.71875 C 0.609375,-2.59375 0.703125,-2.546875 0.8125,-2.484375 L 6.546875,0.65625 C 6.59375,0.6875 6.65625,0.71875 6.734375,0.71875 C 6.890625,0.71875 6.953125,0.59375 6.953125,0.5 C 6.953125,0.375 6.890625,0.34375 6.75,0.265625 L 1.28125,-2.71875 L 6.75,-5.71875 z M 10.078125,-5.71875 C 10.21875,-5.796875 10.28125,-5.828125 10.28125,-5.953125 C 10.28125,-6.09375 10.171875,-6.171875 10.0625,-6.171875 C 10.015625,-6.171875 9.921875,-6.125 9.875,-6.109375 L 4.140625,-2.953125 C 3.984375,-2.875 3.9375,-2.84375 3.9375,-2.71875 C 3.9375,-2.59375 4.03125,-2.546875 4.140625,-2.484375 L 9.875,0.65625 C 9.921875,0.6875 9.984375,0.71875 10.0625,0.71875 C 10.21875,0.71875 10.28125,0.59375 10.28125,0.5 C 10.28125,0.375 10.21875,0.34375 10.078125,0.265625 L 4.609375,-2.71875 L 10.078125,-5.71875 z"+ id="path63" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.09375,-2.71875 C 2.09375,-3.046875 1.828125,-3.296875 1.515625,-3.296875 C 1.203125,-3.296875 0.9375,-3.046875 0.9375,-2.71875 C 0.9375,-2.40625 1.203125,-2.15625 1.515625,-2.15625 C 1.828125,-2.15625 2.09375,-2.40625 2.09375,-2.71875 z"+ id="path66" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph11-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.765625,-2.5 C 6.90625,-2.578125 6.953125,-2.609375 6.953125,-2.71875 C 6.953125,-2.859375 6.875,-2.90625 6.765625,-2.96875 L 1.015625,-6.109375 C 0.96875,-6.125 0.890625,-6.171875 0.828125,-6.171875 C 0.734375,-6.171875 0.609375,-6.09375 0.609375,-5.953125 C 0.609375,-5.828125 0.671875,-5.796875 0.8125,-5.71875 L 6.28125,-2.71875 L 0.8125,0.265625 C 0.671875,0.34375 0.609375,0.375 0.609375,0.5 C 0.609375,0.71875 0.8125,0.71875 0.890625,0.71875 L 6.765625,-2.5 z M 10.09375,-2.5 C 10.234375,-2.578125 10.28125,-2.609375 10.28125,-2.71875 C 10.28125,-2.859375 10.203125,-2.90625 10.09375,-2.96875 L 4.34375,-6.109375 C 4.296875,-6.125 4.203125,-6.171875 4.15625,-6.171875 C 4.0625,-6.171875 3.9375,-6.09375 3.9375,-5.953125 C 3.9375,-5.828125 4,-5.796875 4.140625,-5.71875 L 9.609375,-2.71875 L 4.140625,0.265625 C 4,0.34375 3.9375,0.375 3.9375,0.5 C 3.9375,0.71875 4.140625,0.71875 4.21875,0.71875 L 10.09375,-2.5 z"+ id="path69" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path72" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.71875,0 L 9.65625,-8.765625 L 9.65625,0 L 10.921875,0 L 10.921875,-10.453125 L 9.0625,-10.453125 L 6.03125,-1.34375 L 2.921875,-10.453125 L 1.078125,-10.453125 L 1.078125,0 L 2.34375,0 L 2.34375,-8.765625 L 5.3125,0 L 6.71875,0 z"+ id="path75" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.90625,-7.734375 C 1.796875,-7.734375 0.515625,-6.21875 0.515625,-3.703125 C 0.515625,-1.171875 1.78125,0.328125 3.921875,0.328125 C 6.03125,0.328125 7.3125,-1.171875 7.3125,-3.640625 C 7.3125,-6.234375 6.0625,-7.734375 3.90625,-7.734375 z M 3.921875,-6.625 C 5.265625,-6.625 6.0625,-5.515625 6.0625,-3.65625 C 6.0625,-1.890625 5.234375,-0.78125 3.921875,-0.78125 C 2.578125,-0.78125 1.765625,-1.875 1.765625,-3.703125 C 1.765625,-5.515625 2.578125,-6.625 3.921875,-6.625 z"+ id="path78" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.984375,-7.515625 L 0.984375,0 L 2.1875,0 L 2.1875,-3.90625 C 2.1875,-4.984375 2.46875,-5.6875 3.046875,-6.09375 C 3.40625,-6.375 3.765625,-6.453125 4.609375,-6.46875 L 4.609375,-7.6875 C 4.40625,-7.71875 4.296875,-7.734375 4.140625,-7.734375 C 3.375,-7.734375 2.78125,-7.265625 2.09375,-6.15625 L 2.09375,-7.515625 L 0.984375,-7.515625 z"+ id="path81" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.359375,-3.359375 C 7.359375,-4.5 7.265625,-5.1875 7.0625,-5.75 C 6.5625,-6.984375 5.421875,-7.734375 4.015625,-7.734375 C 1.921875,-7.734375 0.578125,-6.125 0.578125,-3.65625 C 0.578125,-1.1875 1.875,0.328125 3.984375,0.328125 C 5.703125,0.328125 6.90625,-0.640625 7.203125,-2.28125 L 6,-2.28125 C 5.671875,-1.296875 4.984375,-0.78125 4.03125,-0.78125 C 3.265625,-0.78125 2.625,-1.125 2.21875,-1.75 C 1.9375,-2.1875 1.84375,-2.609375 1.828125,-3.359375 L 7.359375,-3.359375 z M 1.84375,-4.328125 C 1.953125,-5.71875 2.796875,-6.625 4,-6.625 C 5.171875,-6.625 6.078125,-5.65625 6.078125,-4.421875 C 6.078125,-4.390625 6.078125,-4.359375 6.0625,-4.328125 L 1.84375,-4.328125 z"+ id="path84" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.625,-4.765625 L 8.3125,-4.765625 L 8.3125,-5.9375 L 2.625,-5.9375 L 2.625,-9.28125 L 8.53125,-9.28125 L 8.53125,-10.453125 L 1.296875,-10.453125 L 1.296875,0 L 8.796875,0 L 8.796875,-1.171875 L 2.625,-1.171875 L 2.625,-4.765625 z"+ id="path87" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.1875,-3.890625 L 6.71875,-7.515625 L 5.359375,-7.515625 L 3.5625,-4.796875 L 1.75,-7.515625 L 0.390625,-7.515625 L 2.890625,-3.828125 L 0.25,0 L 1.609375,0 L 3.515625,-2.890625 L 5.390625,0 L 6.78125,0 L 4.1875,-3.890625 z"+ id="path90" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.671875,-0.703125 C 7.546875,-0.671875 7.484375,-0.671875 7.421875,-0.671875 C 7,-0.671875 6.765625,-0.890625 6.765625,-1.265625 L 6.765625,-5.6875 C 6.765625,-7.015625 5.796875,-7.734375 3.9375,-7.734375 C 2.859375,-7.734375 1.953125,-7.421875 1.453125,-6.859375 C 1.109375,-6.46875 0.96875,-6.03125 0.9375,-5.296875 L 2.140625,-5.296875 C 2.234375,-6.203125 2.78125,-6.625 3.90625,-6.625 C 4.984375,-6.625 5.578125,-6.21875 5.578125,-5.515625 L 5.578125,-5.1875 C 5.578125,-4.6875 5.28125,-4.46875 4.328125,-4.359375 C 2.640625,-4.140625 2.375,-4.09375 1.921875,-3.90625 C 1.046875,-3.546875 0.609375,-2.875 0.609375,-1.890625 C 0.609375,-0.53125 1.546875,0.328125 3.0625,0.328125 C 4.015625,0.328125 4.78125,0 5.625,-0.78125 C 5.703125,-0.015625 6.078125,0.328125 6.859375,0.328125 C 7.09375,0.328125 7.28125,0.296875 7.671875,0.203125 L 7.671875,-0.703125 z M 5.578125,-2.359375 C 5.578125,-1.96875 5.46875,-1.71875 5.109375,-1.390625 C 4.625,-0.953125 4.03125,-0.71875 3.328125,-0.71875 C 2.390625,-0.71875 1.84375,-1.15625 1.84375,-1.921875 C 1.84375,-2.71875 2.375,-3.109375 3.65625,-3.296875 C 4.921875,-3.46875 5.171875,-3.53125 5.578125,-3.71875 L 5.578125,-2.359375 z"+ id="path93" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1,-7.515625 L 1,0 L 2.203125,0 L 2.203125,-4.71875 C 2.203125,-5.8125 3,-6.6875 3.96875,-6.6875 C 4.859375,-6.6875 5.359375,-6.140625 5.359375,-5.171875 L 5.359375,0 L 6.5625,0 L 6.5625,-4.71875 C 6.5625,-5.8125 7.359375,-6.6875 8.328125,-6.6875 C 9.203125,-6.6875 9.71875,-6.125 9.71875,-5.171875 L 9.71875,0 L 10.9375,0 L 10.9375,-5.640625 C 10.9375,-6.984375 10.15625,-7.734375 8.75,-7.734375 C 7.75,-7.734375 7.140625,-7.4375 6.4375,-6.578125 C 6,-7.390625 5.390625,-7.734375 4.421875,-7.734375 C 3.40625,-7.734375 2.75,-7.359375 2.109375,-6.453125 L 2.109375,-7.515625 L 1,-7.515625 z"+ id="path96" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.78125,3.125 L 1.984375,3.125 L 1.984375,-0.78125 C 2.609375,-0.015625 3.3125,0.328125 4.28125,0.328125 C 6.21875,0.328125 7.5,-1.234375 7.5,-3.625 C 7.5,-6.15625 6.265625,-7.734375 4.28125,-7.734375 C 3.25,-7.734375 2.4375,-7.265625 1.875,-6.390625 L 1.875,-7.515625 L 0.78125,-7.515625 L 0.78125,3.125 z M 4.078125,-6.609375 C 5.390625,-6.609375 6.25,-5.453125 6.25,-3.65625 C 6.25,-1.953125 5.375,-0.78125 4.078125,-0.78125 C 2.8125,-0.78125 1.984375,-1.9375 1.984375,-3.703125 C 1.984375,-5.46875 2.8125,-6.609375 4.078125,-6.609375 z"+ id="path99" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.1875,-10.453125 L 0.96875,-10.453125 L 0.96875,0 L 2.1875,0 L 2.1875,-10.453125 z"+ id="path102" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph1-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.28125,-5.421875 C 6.265625,-6.90625 5.296875,-7.734375 3.5625,-7.734375 C 1.8125,-7.734375 0.671875,-6.828125 0.671875,-5.4375 C 0.671875,-4.265625 1.28125,-3.703125 3.0625,-3.265625 L 4.171875,-3 C 5,-2.796875 5.328125,-2.5 5.328125,-1.953125 C 5.328125,-1.25 4.640625,-0.78125 3.578125,-0.78125 C 2.9375,-0.78125 2.390625,-0.96875 2.09375,-1.28125 C 1.90625,-1.484375 1.828125,-1.703125 1.75,-2.234375 L 0.484375,-2.234375 C 0.546875,-0.5 1.515625,0.328125 3.484375,0.328125 C 5.375,0.328125 6.578125,-0.609375 6.578125,-2.046875 C 6.578125,-3.171875 5.953125,-3.78125 4.453125,-4.140625 L 3.3125,-4.421875 C 2.34375,-4.640625 1.921875,-4.96875 1.921875,-5.5 C 1.921875,-6.1875 2.53125,-6.625 3.515625,-6.625 C 4.46875,-6.625 4.984375,-6.203125 5.015625,-5.421875 L 6.28125,-5.421875 z"+ id="path105" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path108" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.890625,0 L 2.890625,-3.140625 L 2.390625,-3.140625 L 2.390625,-1.359375 C 2.390625,-0.71875 2.046875,-0.296875 1.53125,-0.296875 C 1.140625,-0.296875 0.890625,-0.53125 0.890625,-0.921875 L 0.890625,-3.140625 L 0.390625,-3.140625 L 0.390625,-0.71875 C 0.390625,-0.203125 0.78125,0.140625 1.390625,0.140625 C 1.84375,0.140625 2.140625,-0.03125 2.4375,-0.4375 L 2.4375,0 L 2.890625,0 z"+ id="path111" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-3.140625 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 2.171875,-2.78125 2.421875,-2.546875 2.421875,-2.171875 L 2.421875,0 L 2.921875,0 L 2.921875,-2.375 C 2.921875,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.453125,-3.21875 1.15625,-3.046875 0.875,-2.609375 L 0.875,-3.140625 L 0.421875,-3.140625 z"+ id="path114" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.890625,-3.140625 L 0.40625,-3.140625 L 0.40625,0 L 0.890625,0 L 0.890625,-3.140625 z M 0.890625,-4.359375 L 0.390625,-4.359375 L 0.390625,-3.734375 L 0.890625,-3.734375 L 0.890625,-4.359375 z"+ id="path117" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,0 L 2.90625,-3.140625 L 2.34375,-3.140625 L 1.453125,-0.59375 L 0.625,-3.140625 L 0.0625,-3.140625 L 1.15625,0 L 1.703125,0 z"+ id="path120" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.0625,-1.40625 C 3.0625,-1.875 3.03125,-2.171875 2.9375,-2.40625 C 2.734375,-2.921875 2.265625,-3.21875 1.671875,-3.21875 C 0.796875,-3.21875 0.234375,-2.5625 0.234375,-1.53125 C 0.234375,-0.5 0.78125,0.140625 1.65625,0.140625 C 2.375,0.140625 2.875,-0.265625 3,-0.953125 L 2.5,-0.953125 C 2.359375,-0.53125 2.078125,-0.328125 1.6875,-0.328125 C 1.359375,-0.328125 1.09375,-0.46875 0.921875,-0.734375 C 0.8125,-0.90625 0.765625,-1.09375 0.765625,-1.40625 L 3.0625,-1.40625 z M 0.765625,-1.8125 C 0.8125,-2.390625 1.171875,-2.765625 1.671875,-2.765625 C 2.15625,-2.765625 2.53125,-2.359375 2.53125,-1.84375 C 2.53125,-1.828125 2.53125,-1.8125 2.53125,-1.8125 L 0.765625,-1.8125 z"+ id="path123" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.40625,-3.140625 L 0.40625,0 L 0.921875,0 L 0.921875,-1.625 C 0.921875,-2.078125 1.03125,-2.375 1.265625,-2.546875 C 1.421875,-2.65625 1.578125,-2.6875 1.921875,-2.703125 L 1.921875,-3.203125 C 1.84375,-3.21875 1.796875,-3.21875 1.734375,-3.21875 C 1.40625,-3.21875 1.15625,-3.03125 0.875,-2.5625 L 0.875,-3.140625 L 0.40625,-3.140625 z"+ id="path126" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.625,-2.265625 C 2.609375,-2.875 2.203125,-3.21875 1.484375,-3.21875 C 0.75,-3.21875 0.28125,-2.84375 0.28125,-2.265625 C 0.28125,-1.78125 0.53125,-1.546875 1.28125,-1.359375 L 1.734375,-1.25 C 2.09375,-1.171875 2.21875,-1.046875 2.21875,-0.8125 C 2.21875,-0.515625 1.9375,-0.328125 1.5,-0.328125 C 1.234375,-0.328125 1,-0.40625 0.875,-0.53125 C 0.796875,-0.625 0.765625,-0.71875 0.734375,-0.9375 L 0.203125,-0.9375 C 0.234375,-0.203125 0.640625,0.140625 1.453125,0.140625 C 2.25,0.140625 2.75,-0.25 2.75,-0.859375 C 2.75,-1.328125 2.484375,-1.578125 1.859375,-1.734375 L 1.375,-1.84375 C 0.96875,-1.9375 0.796875,-2.078125 0.796875,-2.296875 C 0.796875,-2.578125 1.0625,-2.765625 1.46875,-2.765625 C 1.859375,-2.765625 2.078125,-2.59375 2.09375,-2.265625 L 2.625,-2.265625 z"+ id="path129" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.515625,-3.140625 L 1,-3.140625 L 1,-4 L 0.515625,-4 L 0.515625,-3.140625 L 0.078125,-3.140625 L 0.078125,-2.734375 L 0.515625,-2.734375 L 0.515625,-0.359375 C 0.515625,-0.046875 0.71875,0.140625 1.109375,0.140625 C 1.234375,0.140625 1.359375,0.125 1.515625,0.09375 L 1.515625,-0.328125 C 1.453125,-0.3125 1.375,-0.296875 1.28125,-0.296875 C 1.0625,-0.296875 1,-0.359375 1,-0.578125 L 1,-2.734375 L 1.515625,-2.734375 L 1.515625,-3.140625 z"+ id="path132" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.328125,-3.140625 L 1.453125,-0.6875 L 0.65625,-3.140625 L 0.125,-3.140625 L 1.171875,0.015625 L 0.984375,0.515625 C 0.90625,0.734375 0.796875,0.8125 0.59375,0.8125 C 0.515625,0.8125 0.4375,0.796875 0.328125,0.78125 L 0.328125,1.234375 C 0.421875,1.28125 0.53125,1.296875 0.65625,1.296875 C 0.8125,1.296875 1,1.25 1.125,1.15625 C 1.28125,1.046875 1.375,0.90625 1.46875,0.65625 L 2.859375,-3.140625 L 2.328125,-3.140625 z"+ id="path135" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.703125,-1.859375 L 0.28125,-1.859375 L 0.28125,-1.4375 L 1.703125,-1.4375 L 1.703125,-1.859375 z"+ id="path138" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.90625,-4.359375 L 0.40625,-4.359375 L 0.40625,0 L 0.90625,0 L 0.90625,-4.359375 z"+ id="path141" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.625,-3.21875 C 0.75,-3.21875 0.21875,-2.59375 0.21875,-1.546875 C 0.21875,-0.484375 0.734375,0.140625 1.640625,0.140625 C 2.515625,0.140625 3.046875,-0.484375 3.046875,-1.515625 C 3.046875,-2.609375 2.53125,-3.21875 1.625,-3.21875 z M 1.640625,-2.765625 C 2.203125,-2.765625 2.53125,-2.296875 2.53125,-1.53125 C 2.53125,-0.796875 2.1875,-0.328125 1.640625,-0.328125 C 1.078125,-0.328125 0.734375,-0.78125 0.734375,-1.546875 C 0.734375,-2.296875 1.078125,-2.765625 1.640625,-2.765625 z"+ id="path144" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.46875,-3.140625 L 2.46875,-2.6875 C 2.21875,-3.046875 1.90625,-3.21875 1.515625,-3.21875 C 0.71875,-3.21875 0.171875,-2.53125 0.171875,-1.515625 C 0.171875,-1 0.3125,-0.578125 0.5625,-0.28125 C 0.796875,-0.015625 1.140625,0.140625 1.46875,0.140625 C 1.859375,0.140625 2.140625,-0.03125 2.421875,-0.421875 L 2.421875,-0.265625 C 2.421875,0.15625 2.359375,0.421875 2.234375,0.59375 C 2.109375,0.78125 1.84375,0.890625 1.546875,0.890625 C 1.3125,0.890625 1.109375,0.828125 0.96875,0.71875 C 0.859375,0.625 0.8125,0.546875 0.78125,0.359375 L 0.28125,0.359375 C 0.328125,0.953125 0.796875,1.296875 1.53125,1.296875 C 2,1.296875 2.390625,1.15625 2.59375,0.90625 C 2.84375,0.609375 2.921875,0.21875 2.921875,-0.515625 L 2.921875,-3.140625 L 2.46875,-3.140625 z M 1.5625,-2.765625 C 2.09375,-2.765625 2.421875,-2.3125 2.421875,-1.53125 C 2.421875,-0.78125 2.09375,-0.328125 1.5625,-0.328125 C 1.015625,-0.328125 0.6875,-0.78125 0.6875,-1.546875 C 0.6875,-2.296875 1.03125,-2.765625 1.5625,-2.765625 z"+ id="path147" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.84375,-1.3125 L 3.28125,0 L 3.90625,0 L 2.375,-4.359375 L 1.65625,-4.359375 L 0.109375,0 L 0.6875,0 L 1.15625,-1.3125 L 2.84375,-1.3125 z M 2.6875,-1.78125 L 1.296875,-1.78125 L 2.015625,-3.765625 L 2.6875,-1.78125 z"+ id="path150" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.140625,-0.625 L 0.515625,-0.625 L 0.515625,0 L 1.140625,0 L 1.140625,-0.625 z"+ id="path153" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.8125,-2.078125 C 2.796875,-2.390625 2.734375,-2.578125 2.609375,-2.765625 C 2.390625,-3.046875 2.015625,-3.21875 1.578125,-3.21875 C 0.734375,-3.21875 0.1875,-2.5625 0.1875,-1.515625 C 0.1875,-0.5 0.71875,0.140625 1.578125,0.140625 C 2.328125,0.140625 2.796875,-0.3125 2.859375,-1.078125 L 2.359375,-1.078125 C 2.265625,-0.578125 2.015625,-0.328125 1.578125,-0.328125 C 1.03125,-0.328125 0.703125,-0.765625 0.703125,-1.515625 C 0.703125,-2.296875 1.03125,-2.765625 1.578125,-2.765625 C 2,-2.765625 2.25,-2.515625 2.3125,-2.078125 L 2.8125,-2.078125 z"+ id="path156" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.203125,-0.296875 C 3.140625,-0.28125 3.125,-0.28125 3.09375,-0.28125 C 2.921875,-0.28125 2.828125,-0.375 2.828125,-0.53125 L 2.828125,-2.375 C 2.828125,-2.921875 2.421875,-3.21875 1.640625,-3.21875 C 1.1875,-3.21875 0.8125,-3.09375 0.609375,-2.859375 C 0.453125,-2.703125 0.40625,-2.515625 0.390625,-2.203125 L 0.890625,-2.203125 C 0.9375,-2.59375 1.15625,-2.765625 1.625,-2.765625 C 2.078125,-2.765625 2.328125,-2.59375 2.328125,-2.296875 L 2.328125,-2.171875 C 2.328125,-1.953125 2.203125,-1.859375 1.8125,-1.8125 C 1.09375,-1.734375 1,-1.703125 0.796875,-1.625 C 0.4375,-1.484375 0.25,-1.203125 0.25,-0.796875 C 0.25,-0.21875 0.640625,0.140625 1.28125,0.140625 C 1.671875,0.140625 2,0 2.34375,-0.328125 C 2.375,0 2.53125,0.140625 2.859375,0.140625 C 2.96875,0.140625 3.046875,0.125 3.203125,0.078125 L 3.203125,-0.296875 z M 2.328125,-0.984375 C 2.328125,-0.8125 2.28125,-0.71875 2.125,-0.578125 C 1.921875,-0.390625 1.6875,-0.296875 1.390625,-0.296875 C 1,-0.296875 0.765625,-0.484375 0.765625,-0.796875 C 0.765625,-1.125 1,-1.296875 1.53125,-1.375 C 2.046875,-1.453125 2.15625,-1.46875 2.328125,-1.546875 L 2.328125,-0.984375 z"+ id="path159" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.40625,-4.359375 C 0.8125,-3.578125 0.4375,-2.484375 0.4375,-1.546875 C 0.4375,-0.609375 0.8125,0.484375 1.40625,1.265625 L 1.734375,1.265625 C 1.21875,0.40625 0.921875,-0.59375 0.921875,-1.546875 C 0.921875,-2.5 1.21875,-3.515625 1.734375,-4.359375 L 1.40625,-4.359375 z"+ id="path162" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.03125,-1.53125 L 1.734375,-2.234375 L 3.28125,0 L 3.9375,0 L 2.140625,-2.578125 L 3.921875,-4.359375 L 3.203125,-4.359375 L 1.03125,-2.15625 L 1.03125,-4.359375 L 0.46875,-4.359375 L 0.46875,0 L 1.03125,0 L 1.03125,-1.53125 z"+ id="path165" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.125,-3.875 L 3.546875,-3.875 L 3.546875,-4.359375 L 0.125,-4.359375 L 0.125,-3.875 L 1.5625,-3.875 L 1.5625,0 L 2.125,0 L 2.125,-3.875 z"+ id="path168" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.296875,-1.984375 L 3.296875,0 L 3.859375,0 L 3.859375,-4.359375 L 3.296875,-4.359375 L 3.296875,-2.484375 L 1.046875,-2.484375 L 1.046875,-4.359375 L 0.5,-4.359375 L 0.5,0 L 1.0625,0 L 1.0625,-1.984375 L 3.296875,-1.984375 z"+ id="path171" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-22"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.5625,1.265625 C 1.15625,0.484375 1.53125,-0.609375 1.53125,-1.546875 C 1.53125,-2.484375 1.15625,-3.578125 0.5625,-4.359375 L 0.234375,-4.359375 C 0.75,-3.5 1.046875,-2.5 1.046875,-1.546875 C 1.046875,-0.59375 0.75,0.421875 0.234375,1.265625 L 0.5625,1.265625 z"+ id="path174" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-23"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.09375,-1.984375 L 3.171875,-1.984375 L 3.171875,-2.484375 L 1.09375,-2.484375 L 1.09375,-3.875 L 3.46875,-3.875 L 3.46875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 L 1.09375,0 L 1.09375,-1.984375 z"+ id="path177" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-24"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.5625,-3.078125 C 3.5625,-3.9375 2.96875,-4.4375 1.96875,-4.4375 C 1.015625,-4.4375 0.421875,-3.9375 0.421875,-3.15625 C 0.421875,-2.625 0.703125,-2.28125 1.28125,-2.140625 L 2.359375,-1.84375 C 2.90625,-1.703125 3.15625,-1.484375 3.15625,-1.140625 C 3.15625,-0.90625 3.03125,-0.671875 2.84375,-0.53125 C 2.671875,-0.421875 2.40625,-0.359375 2.046875,-0.359375 C 1.578125,-0.359375 1.25,-0.46875 1.046875,-0.71875 C 0.875,-0.90625 0.8125,-1.125 0.8125,-1.390625 L 0.28125,-1.390625 C 0.296875,-0.984375 0.375,-0.71875 0.546875,-0.484375 C 0.84375,-0.078125 1.34375,0.140625 2.015625,0.140625 C 2.53125,0.140625 2.953125,0.015625 3.234375,-0.203125 C 3.53125,-0.4375 3.71875,-0.8125 3.71875,-1.203125 C 3.71875,-1.734375 3.375,-2.125 2.78125,-2.296875 L 1.6875,-2.578125 C 1.171875,-2.734375 0.96875,-2.890625 0.96875,-3.234375 C 0.96875,-3.671875 1.359375,-3.96875 1.953125,-3.96875 C 2.640625,-3.96875 3.03125,-3.65625 3.046875,-3.078125 L 3.5625,-3.078125 z"+ id="path180" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-25"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.53125,0 L 2.21875,0 C 3.3125,0 3.984375,-0.828125 3.984375,-2.1875 C 3.984375,-3.53125 3.328125,-4.359375 2.21875,-4.359375 L 0.53125,-4.359375 L 0.53125,0 z M 1.09375,-0.484375 L 1.09375,-3.875 L 2.125,-3.875 C 2.984375,-3.875 3.4375,-3.296875 3.4375,-2.171875 C 3.4375,-1.078125 2.984375,-0.484375 2.125,-0.484375 L 1.09375,-0.484375 z"+ id="path183" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-26"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.796875,0 L 4.03125,-3.65625 L 4.03125,0 L 4.546875,0 L 4.546875,-4.359375 L 3.78125,-4.359375 L 2.515625,-0.5625 L 1.21875,-4.359375 L 0.453125,-4.359375 L 0.453125,0 L 0.96875,0 L 0.96875,-3.65625 L 2.21875,0 L 2.796875,0 z"+ id="path186" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-27"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.421875,-4.359375 L 0.421875,0 L 0.921875,0 L 0.921875,-1.734375 C 0.921875,-2.375 1.25,-2.78125 1.765625,-2.78125 C 1.921875,-2.78125 2.09375,-2.734375 2.203125,-2.640625 C 2.359375,-2.546875 2.40625,-2.390625 2.40625,-2.171875 L 2.40625,0 L 2.90625,0 L 2.90625,-2.375 C 2.90625,-2.890625 2.53125,-3.21875 1.921875,-3.21875 C 1.484375,-3.21875 1.203125,-3.09375 0.921875,-2.703125 L 0.921875,-4.359375 L 0.421875,-4.359375 z"+ id="path189" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-28"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.03125,-0.515625 L 0.796875,-0.515625 C 0.84375,-0.875 1.046875,-1.09375 1.5625,-1.390625 L 2.15625,-1.71875 C 2.75,-2.046875 3.0625,-2.484375 3.0625,-3 C 3.0625,-3.34375 2.921875,-3.6875 2.65625,-3.90625 C 2.40625,-4.140625 2.09375,-4.25 1.703125,-4.25 C 1.15625,-4.25 0.765625,-4.046875 0.53125,-3.6875 C 0.375,-3.46875 0.3125,-3.203125 0.296875,-2.765625 L 0.828125,-2.765625 C 0.84375,-3.0625 0.875,-3.234375 0.953125,-3.375 C 1.09375,-3.625 1.359375,-3.78125 1.6875,-3.78125 C 2.15625,-3.78125 2.515625,-3.4375 2.515625,-2.984375 C 2.515625,-2.65625 2.328125,-2.359375 1.9375,-2.140625 L 1.390625,-1.84375 C 0.515625,-1.328125 0.25,-0.9375 0.203125,0 L 3.03125,0 L 3.03125,-0.515625 z"+ id="path192" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-29"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.109375,-4.25 L 0.28125,-4.25 L 0.28125,-3.71875 L 2.5625,-3.71875 C 1.5625,-2.28125 1.140625,-1.390625 0.828125,0 L 1.390625,0 C 1.625,-1.359375 2.15625,-2.53125 3.109375,-3.796875 L 3.109375,-4.25 z"+ id="path195" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-30"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.515625,-0.625 L 0.515625,0 L 0.875,0 L 0.875,0.109375 C 0.875,0.515625 0.796875,0.640625 0.515625,0.65625 L 0.515625,0.875 C 0.9375,0.875 1.15625,0.609375 1.15625,0.09375 L 1.15625,-0.625 L 0.515625,-0.625 z"+ id="path198" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-31"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-4.25 C 1.25,-4.25 0.890625,-4.0625 0.671875,-3.78125 C 0.390625,-3.40625 0.25,-2.84375 0.25,-2.046875 C 0.25,-0.625 0.734375,0.140625 1.640625,0.140625 C 2.546875,0.140625 3.03125,-0.625 3.03125,-2.015625 C 3.03125,-2.84375 2.90625,-3.390625 2.625,-3.78125 C 2.40625,-4.078125 2.046875,-4.25 1.640625,-4.25 z M 1.640625,-3.78125 C 2.21875,-3.78125 2.5,-3.203125 2.5,-2.0625 C 2.5,-0.859375 2.21875,-0.296875 1.640625,-0.296875 C 1.078125,-0.296875 0.796875,-0.890625 0.796875,-2.046875 C 0.796875,-3.203125 1.078125,-3.78125 1.640625,-3.78125 z"+ id="path201" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-32"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.34375,-2.234375 C 2.78125,-2.5 2.921875,-2.703125 2.921875,-3.109375 C 2.921875,-3.78125 2.40625,-4.25 1.640625,-4.25 C 0.890625,-4.25 0.375,-3.78125 0.375,-3.109375 C 0.375,-2.71875 0.515625,-2.5 0.953125,-2.234375 C 0.453125,-2 0.21875,-1.640625 0.21875,-1.171875 C 0.21875,-0.40625 0.8125,0.140625 1.640625,0.140625 C 2.484375,0.140625 3.0625,-0.40625 3.0625,-1.171875 C 3.0625,-1.640625 2.828125,-2 2.34375,-2.234375 z M 1.640625,-3.78125 C 2.09375,-3.78125 2.375,-3.515625 2.375,-3.09375 C 2.375,-2.703125 2.09375,-2.4375 1.640625,-2.4375 C 1.203125,-2.4375 0.90625,-2.703125 0.90625,-3.109375 C 0.90625,-3.515625 1.203125,-3.78125 1.640625,-3.78125 z M 1.640625,-2 C 2.171875,-2 2.53125,-1.65625 2.53125,-1.171875 C 2.53125,-0.671875 2.171875,-0.328125 1.640625,-0.328125 C 1.125,-0.328125 0.765625,-0.671875 0.765625,-1.171875 C 0.765625,-1.65625 1.125,-2 1.640625,-2 z"+ id="path204" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-33"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.546875,-3.015625 L 1.546875,0 L 2.078125,0 L 2.078125,-4.25 L 1.734375,-4.25 C 1.546875,-3.59375 1.421875,-3.5 0.609375,-3.40625 L 0.609375,-3.015625 L 1.546875,-3.015625 z"+ id="path207" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-34"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.375,-4.359375 L -0.046875,0.125 L 0.28125,0.125 L 1.703125,-4.359375 L 1.375,-4.359375 z"+ id="path210" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph0-35"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.328125,-1.9375 L 1.390625,-1.9375 L 1.609375,-1.953125 C 2.1875,-1.953125 2.484375,-1.6875 2.484375,-1.171875 C 2.484375,-0.640625 2.15625,-0.328125 1.609375,-0.328125 C 1.03125,-0.328125 0.75,-0.609375 0.71875,-1.234375 L 0.1875,-1.234375 C 0.21875,-0.890625 0.28125,-0.671875 0.375,-0.484375 C 0.59375,-0.078125 1.015625,0.140625 1.59375,0.140625 C 2.46875,0.140625 3.03125,-0.390625 3.03125,-1.1875 C 3.03125,-1.71875 2.8125,-2.015625 2.3125,-2.203125 C 2.703125,-2.359375 2.90625,-2.65625 2.90625,-3.078125 C 2.90625,-3.8125 2.421875,-4.25 1.609375,-4.25 C 0.75,-4.25 0.296875,-3.78125 0.28125,-2.875 L 0.8125,-2.875 C 0.8125,-3.125 0.84375,-3.265625 0.90625,-3.40625 C 1.015625,-3.640625 1.28125,-3.78125 1.609375,-3.78125 C 2.078125,-3.78125 2.359375,-3.5 2.359375,-3.0625 C 2.359375,-2.765625 2.25,-2.578125 2.015625,-2.484375 C 1.875,-2.421875 1.6875,-2.40625 1.328125,-2.390625 L 1.328125,-1.9375 z"+ id="path213" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path216" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.609375,-4.125 C 5.65625,-4.359375 5.671875,-4.453125 5.671875,-4.59375 C 5.671875,-5.359375 4.9375,-5.875 3.875,-5.875 C 3.109375,-5.875 2.4375,-5.65625 2,-5.21875 C 1.609375,-4.84375 1.34375,-4.28125 1.34375,-3.765625 C 1.34375,-3.09375 1.71875,-2.78125 2.84375,-2.484375 L 3.65625,-2.28125 C 4.015625,-2.1875 4.171875,-2.109375 4.28125,-2 C 4.359375,-1.890625 4.421875,-1.734375 4.421875,-1.640625 C 4.421875,-1.4375 4.25,-1.09375 4.0625,-0.953125 C 3.796875,-0.734375 3.328125,-0.59375 2.859375,-0.59375 C 2.109375,-0.59375 1.671875,-0.890625 1.671875,-1.421875 C 1.671875,-1.5 1.6875,-1.59375 1.703125,-1.703125 L 0.734375,-1.703125 C 0.671875,-1.453125 0.671875,-1.3125 0.671875,-1.140625 C 0.671875,-0.265625 1.421875,0.25 2.6875,0.25 C 4.3125,0.25 5.375,-0.59375 5.375,-1.890625 C 5.375,-2.546875 5.015625,-2.90625 4.0625,-3.140625 L 3.234375,-3.34375 C 2.625,-3.5 2.296875,-3.71875 2.296875,-4 C 2.296875,-4.21875 2.4375,-4.5 2.625,-4.671875 C 2.890625,-4.921875 3.21875,-5.03125 3.703125,-5.03125 C 4.34375,-5.03125 4.703125,-4.78125 4.703125,-4.359375 C 4.703125,-4.28125 4.703125,-4.203125 4.6875,-4.125 L 5.609375,-4.125 z"+ id="path219" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.1875,-5.875 C 3.171875,-5.875 2.28125,-5.421875 1.71875,-4.609375 C 1.234375,-3.921875 0.875,-2.71875 0.875,-1.78125 C 0.875,-0.578125 1.71875,0.25 2.9375,0.25 C 3.984375,0.25 4.8125,-0.171875 5.421875,-1.015625 C 5.921875,-1.703125 6.28125,-2.890625 6.28125,-3.84375 C 6.28125,-4.421875 6.0625,-4.96875 5.6875,-5.34375 C 5.3125,-5.703125 4.828125,-5.875 4.1875,-5.875 z M 4.046875,-5.03125 C 4.859375,-5.03125 5.328125,-4.515625 5.328125,-3.625 C 5.328125,-2.984375 5.140625,-2.28125 4.84375,-1.734375 C 4.421875,-0.984375 3.84375,-0.59375 3.09375,-0.59375 C 2.3125,-0.59375 1.828125,-1.140625 1.828125,-2 C 1.828125,-2.625 2.015625,-3.34375 2.3125,-3.890625 C 2.71875,-4.640625 3.328125,-5.03125 4.046875,-5.03125 z"+ id="path222" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.265625,0 L 6.484375,-5.71875 L 5.5625,-5.71875 L 4.875,-2.46875 C 4.625,-1.296875 3.84375,-0.53125 2.921875,-0.53125 C 2.328125,-0.53125 1.953125,-0.859375 1.953125,-1.375 C 1.953125,-1.46875 1.96875,-1.5625 1.984375,-1.671875 L 2.84375,-5.71875 L 1.9375,-5.71875 L 1,-1.3125 C 0.96875,-1.203125 0.953125,-1.078125 0.953125,-0.9375 C 0.953125,-0.203125 1.53125,0.25 2.46875,0.25 C 3.3125,0.25 3.9375,-0.015625 4.5625,-0.625 L 4.4375,0 L 5.265625,0 z"+ id="path225" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.96875,-5.71875 L 0.75,0 L 1.671875,0 L 2.296875,-2.96875 C 2.578125,-4.296875 3.359375,-4.96875 4.5625,-4.921875 L 4.75,-5.84375 C 4.609375,-5.875 4.53125,-5.875 4.40625,-5.875 C 3.78125,-5.875 3.28125,-5.59375 2.609375,-4.828125 L 2.796875,-5.71875 L 1.96875,-5.71875 z"+ id="path228" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.015625,-3.796875 L 6.015625,-3.953125 C 6.03125,-4.125 6.046875,-4.25 6.046875,-4.28125 C 6.046875,-4.640625 5.84375,-5.078125 5.5625,-5.359375 C 5.21875,-5.71875 4.78125,-5.875 4.15625,-5.875 C 3.171875,-5.875 2.296875,-5.46875 1.71875,-4.71875 C 1.203125,-4.046875 0.828125,-2.859375 0.828125,-1.859375 C 0.828125,-1.34375 1,-0.8125 1.3125,-0.421875 C 1.671875,0.046875 2.171875,0.25 2.875,0.25 C 3.765625,0.25 4.515625,-0.0625 5.015625,-0.65625 C 5.296875,-0.984375 5.46875,-1.359375 5.65625,-1.96875 L 4.734375,-1.96875 C 4.40625,-1.0625 3.8125,-0.59375 3.015625,-0.59375 C 2.265625,-0.59375 1.78125,-1.125 1.78125,-1.96875 C 1.78125,-2.671875 2.015625,-3.5 2.375,-4.0625 C 2.78125,-4.71875 3.328125,-5.03125 3.984375,-5.03125 C 4.671875,-5.03125 5.109375,-4.65625 5.109375,-4.03125 C 5.109375,-3.96875 5.109375,-3.890625 5.09375,-3.796875 L 6.015625,-3.796875 z"+ id="path231" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.140625,-2.546875 L 6.171875,-2.734375 C 6.265625,-3.265625 6.328125,-3.71875 6.328125,-4.015625 C 6.328125,-5.0625 5.421875,-5.875 4.25,-5.875 C 3.296875,-5.875 2.375,-5.4375 1.828125,-4.703125 C 1.3125,-4.015625 0.921875,-2.765625 0.921875,-1.890625 C 0.921875,-1.296875 1.171875,-0.703125 1.59375,-0.296875 C 1.96875,0.078125 2.453125,0.25 3.078125,0.25 C 4.390625,0.25 5.5,-0.5625 5.84375,-1.734375 L 4.921875,-1.734375 C 4.53125,-0.984375 3.953125,-0.59375 3.234375,-0.59375 C 2.359375,-0.59375 1.875,-1.125 1.875,-2.046875 C 1.875,-2.28125 1.890625,-2.390625 1.9375,-2.546875 L 6.140625,-2.546875 z M 2.125,-3.34375 C 2.40625,-4.34375 3.21875,-5.03125 4.09375,-5.03125 C 4.875,-5.03125 5.359375,-4.515625 5.359375,-3.703125 C 5.359375,-3.59375 5.359375,-3.515625 5.328125,-3.34375 L 2.125,-3.34375 z"+ id="path234" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.703125,-5.609375 C 7.765625,-5.921875 7.78125,-6.0625 7.78125,-6.234375 C 7.78125,-6.703125 7.5625,-7.203125 7.203125,-7.515625 C 6.75,-7.90625 6.171875,-8.078125 5.328125,-8.078125 C 4.203125,-8.078125 3.3125,-7.765625 2.71875,-7.15625 C 2.28125,-6.703125 1.9375,-5.921875 1.9375,-5.359375 C 1.9375,-4.671875 2.421875,-4.09375 3.15625,-3.890625 L 5.015625,-3.375 C 5.890625,-3.125 6.25,-2.796875 6.25,-2.28125 C 6.25,-1.9375 6.046875,-1.53125 5.734375,-1.25 C 5.296875,-0.84375 4.640625,-0.625 3.78125,-0.625 C 2.546875,-0.625 1.96875,-1.09375 1.96875,-2.078125 C 1.96875,-2.21875 1.984375,-2.328125 2.015625,-2.53125 L 1.0625,-2.53125 C 1,-2.25 0.96875,-2.078125 0.96875,-1.84375 C 0.96875,-0.53125 1.953125,0.25 3.59375,0.25 C 4.75,0.25 5.703125,-0.0625 6.34375,-0.671875 C 6.90625,-1.171875 7.296875,-1.96875 7.296875,-2.578125 C 7.296875,-2.875 7.203125,-3.171875 7.03125,-3.4375 C 6.796875,-3.8125 6.484375,-4.03125 5.96875,-4.171875 L 4.09375,-4.71875 C 3.25,-4.953125 2.984375,-5.171875 2.984375,-5.65625 C 2.984375,-6.03125 3.15625,-6.375 3.46875,-6.65625 C 3.875,-7.03125 4.40625,-7.203125 5.125,-7.203125 C 5.734375,-7.203125 6.1875,-7.078125 6.4375,-6.859375 C 6.640625,-6.671875 6.78125,-6.328125 6.78125,-6.015625 C 6.78125,-5.90625 6.765625,-5.828125 6.734375,-5.609375 L 7.703125,-5.609375 z"+ id="path237" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.890625,-3.125 L 8.90625,-7.953125 L 7.6875,-7.953125 L 4.53125,-4.0625 L 3.046875,-7.953125 L 1.828125,-7.953125 L 3.859375,-3.125 L 3.203125,0 L 4.21875,0 L 4.890625,-3.125 z"+ id="path240" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.03125,-5.71875 L 3.09375,-5.71875 L 3.265625,-6.46875 C 3.375,-7.015625 3.578125,-7.203125 4.046875,-7.203125 C 4.125,-7.203125 4.1875,-7.203125 4.34375,-7.171875 L 4.5,-7.921875 C 4.3125,-7.96875 4.1875,-7.984375 4.015625,-7.984375 C 3.171875,-7.984375 2.5625,-7.5 2.390625,-6.6875 L 2.1875,-5.71875 L 1.421875,-5.71875 L 1.265625,-4.984375 L 2.03125,-4.984375 L 0.96875,0 L 1.890625,0 L 2.9375,-4.984375 L 3.875,-4.984375 L 4.03125,-5.71875 z"+ id="path243" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.078125,2.328125 L 1,2.328125 L 1.640625,-0.734375 C 1.984375,-0.03125 2.4375,0.25 3.203125,0.25 C 4.0625,0.25 4.875,-0.140625 5.4375,-0.828125 C 6.015625,-1.546875 6.390625,-2.6875 6.390625,-3.75 C 6.390625,-5.0625 5.65625,-5.875 4.5,-5.875 C 4.015625,-5.875 3.53125,-5.734375 3.09375,-5.453125 C 2.75,-5.234375 2.625,-5.09375 2.46875,-4.796875 L 2.671875,-5.71875 L 1.78125,-5.71875 L 0.078125,2.328125 z M 4.140625,-5.03125 C 4.953125,-5.03125 5.4375,-4.46875 5.4375,-3.53125 C 5.4375,-2.9375 5.25,-2.234375 4.953125,-1.6875 C 4.546875,-0.953125 4,-0.59375 3.296875,-0.59375 C 2.5,-0.59375 2,-1.140625 2,-2 C 2,-2.65625 2.1875,-3.375 2.515625,-3.9375 C 2.90625,-4.671875 3.453125,-5.03125 4.140625,-5.03125 z"+ id="path246" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.34375,-7.953125 L 2.4375,-7.953125 L 0.734375,0 L 1.65625,0 L 3.34375,-7.953125 z"+ id="path249" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.984375,-5.71875 L 0.78125,0 L 1.6875,0 L 2.453125,-3.59375 C 2.625,-4.421875 3.375,-5.09375 4.09375,-5.09375 C 4.640625,-5.09375 5,-4.78125 5,-4.34375 C 5,-4.21875 4.984375,-4.078125 4.953125,-3.9375 L 4.109375,0 L 5.03125,0 L 5.796875,-3.59375 C 5.96875,-4.4375 6.71875,-5.09375 7.5,-5.09375 C 8.015625,-5.09375 8.328125,-4.78125 8.328125,-4.25 C 8.328125,-4.09375 8.328125,-4.09375 8.234375,-3.71875 L 7.453125,0 L 8.359375,0 L 9.234375,-4.0625 C 9.265625,-4.1875 9.296875,-4.546875 9.296875,-4.671875 C 9.296875,-4.953125 9.15625,-5.25 8.9375,-5.5 C 8.703125,-5.765625 8.40625,-5.875 7.90625,-5.875 C 7.203125,-5.875 6.578125,-5.59375 5.9375,-4.96875 C 5.765625,-5.578125 5.328125,-5.875 4.609375,-5.875 C 3.875,-5.875 3.375,-5.65625 2.671875,-5 L 2.8125,-5.71875 L 1.984375,-5.71875 z"+ id="path252" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph3-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.015625,-0.5625 C 5.921875,-0.53125 5.875,-0.53125 5.828125,-0.53125 C 5.546875,-0.53125 5.421875,-0.625 5.421875,-0.84375 C 5.421875,-0.890625 5.421875,-0.921875 5.4375,-0.953125 L 6.125,-4.25 C 6.1875,-4.53125 6.1875,-4.53125 6.1875,-4.640625 C 6.1875,-5.390625 5.4375,-5.875 4.296875,-5.875 C 2.78125,-5.875 1.859375,-5.234375 1.640625,-4.03125 L 2.5625,-4.03125 C 2.65625,-4.328125 2.734375,-4.484375 2.890625,-4.640625 C 3.125,-4.875 3.59375,-5.03125 4.0625,-5.03125 C 4.71875,-5.03125 5.21875,-4.75 5.21875,-4.34375 C 5.21875,-4.296875 5.203125,-4.21875 5.1875,-4.140625 L 5.15625,-3.9375 C 5.0625,-3.484375 4.859375,-3.375 4.0625,-3.296875 C 2.59375,-3.15625 2.140625,-3.046875 1.609375,-2.71875 C 1.03125,-2.359375 0.703125,-1.78125 0.703125,-1.140625 C 0.703125,-0.265625 1.296875,0.25 2.28125,0.25 C 2.65625,0.25 3.125,0.171875 3.515625,0.03125 C 3.859375,-0.09375 4.03125,-0.203125 4.46875,-0.59375 L 4.46875,-0.515625 L 4.46875,-0.46875 C 4.46875,-0.015625 4.78125,0.25 5.296875,0.25 C 5.421875,0.25 5.453125,0.25 5.71875,0.1875 C 5.75,0.171875 5.8125,0.15625 5.875,0.15625 L 6.015625,-0.5625 z M 4.703125,-1.78125 C 4.5625,-1.109375 3.59375,-0.53125 2.640625,-0.53125 C 2.015625,-0.53125 1.671875,-0.796875 1.671875,-1.25 C 1.671875,-1.609375 1.875,-1.96875 2.203125,-2.171875 C 2.46875,-2.328125 2.796875,-2.421875 3.328125,-2.5 C 4.359375,-2.640625 4.4375,-2.65625 4.921875,-2.8125 L 4.703125,-1.78125 z"+ id="path255" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path258" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph12-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.09375,-6.03125 L 3.09375,0 L 4.140625,0 L 4.140625,-8.46875 L 3.453125,-8.46875 C 3.078125,-7.171875 2.84375,-7 1.21875,-6.796875 L 1.21875,-6.03125 L 3.09375,-6.03125 z"+ id="path261" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path264" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph8-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.328125,0.046875 C 2.328125,-0.640625 2.109375,-1.15625 1.609375,-1.15625 C 1.234375,-1.15625 1.046875,-0.84375 1.046875,-0.578125 C 1.046875,-0.328125 1.21875,0 1.625,0 C 1.78125,0 1.90625,-0.046875 2.015625,-0.15625 C 2.046875,-0.171875 2.0625,-0.171875 2.0625,-0.171875 C 2.09375,-0.171875 2.09375,-0.015625 2.09375,0.046875 C 2.09375,0.4375 2.015625,1.21875 1.328125,2 C 1.1875,2.140625 1.1875,2.15625 1.1875,2.1875 C 1.1875,2.25 1.25,2.3125 1.3125,2.3125 C 1.40625,2.3125 2.328125,1.421875 2.328125,0.046875 z"+ id="path267" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path270" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.0625,-4.03125 L 2.0625,0 L 2.765625,0 L 2.765625,-5.65625 L 2.296875,-5.65625 C 2.0625,-4.78125 1.890625,-4.65625 0.8125,-4.53125 L 0.8125,-4.03125 L 2.0625,-4.03125 z"+ id="path273" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph5-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.1875,-5.65625 C 1.671875,-5.65625 1.1875,-5.421875 0.890625,-5.03125 C 0.53125,-4.53125 0.34375,-3.78125 0.34375,-2.734375 C 0.34375,-0.828125 0.984375,0.1875 2.1875,0.1875 C 3.390625,0.1875 4.046875,-0.828125 4.046875,-2.6875 C 4.046875,-3.78125 3.859375,-4.515625 3.484375,-5.03125 C 3.203125,-5.421875 2.71875,-5.65625 2.1875,-5.65625 z M 2.1875,-5.03125 C 2.953125,-5.03125 3.328125,-4.265625 3.328125,-2.75 C 3.328125,-1.140625 2.953125,-0.390625 2.171875,-0.390625 C 1.4375,-0.390625 1.0625,-1.171875 1.0625,-2.71875 C 1.0625,-4.265625 1.4375,-5.03125 2.1875,-5.03125 z"+ id="path276" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path279" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.90625,-2.75 C 8.0625,-2.75 8.296875,-2.75 8.296875,-2.984375 C 8.296875,-3.234375 8.0625,-3.234375 7.90625,-3.234375 L 1.390625,-3.234375 C 1.21875,-3.234375 0.984375,-3.234375 0.984375,-2.984375 C 0.984375,-2.75 1.21875,-2.75 1.390625,-2.75 L 7.90625,-2.75 z"+ id="path282" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph7-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 10.25,-2.75 C 9.359375,-2.09375 8.96875,-1.09375 8.96875,-1 C 8.96875,-0.890625 9.0625,-0.859375 9.140625,-0.859375 C 9.28125,-0.859375 9.3125,-0.9375 9.328125,-0.984375 C 9.515625,-1.390625 9.890625,-2.265625 11.09375,-2.828125 C 11.234375,-2.890625 11.265625,-2.90625 11.265625,-2.984375 C 11.265625,-3.078125 11.1875,-3.109375 11.171875,-3.109375 C 10.53125,-3.40625 9.84375,-3.84375 9.34375,-4.953125 C 9.296875,-5.0625 9.28125,-5.109375 9.140625,-5.109375 C 9.0625,-5.109375 8.96875,-5.078125 8.96875,-4.96875 C 8.96875,-4.875 9.359375,-3.890625 10.25,-3.234375 L 1.0625,-3.234375 C 0.890625,-3.234375 0.671875,-3.234375 0.671875,-2.984375 C 0.671875,-2.75 0.890625,-2.75 1.0625,-2.75 L 10.25,-2.75 z"+ id="path285" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path288" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.953125,-8.171875 C 2.609375,-7.859375 1.875,-7.1875 1.375,-5.84375 C 0.9375,-4.671875 0.859375,-3.515625 0.859375,-2.71875 C 0.859375,0.796875 2.4375,2.25 2.953125,2.71875 L 3.625,2.71875 C 3.09375,2.203125 1.71875,0.796875 1.71875,-2.71875 C 1.71875,-3.34375 1.75,-4.609375 2.1875,-5.90625 C 2.640625,-7.171875 3.265625,-7.8125 3.625,-8.171875 L 2.953125,-8.171875 z"+ id="path291" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.28125,2.71875 C 1.625,2.40625 2.359375,1.734375 2.859375,0.390625 C 3.296875,-0.78125 3.375,-1.9375 3.375,-2.71875 C 3.375,-6.25 1.796875,-7.703125 1.28125,-8.171875 L 0.609375,-8.171875 C 1.140625,-7.65625 2.515625,-6.25 2.515625,-2.71875 C 2.515625,-2.109375 2.484375,-0.84375 2.046875,0.453125 C 1.59375,1.71875 0.96875,2.359375 0.609375,2.71875 L 1.28125,2.71875 z"+ id="path294" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 7.5,-3.59375 C 7.65625,-3.59375 7.859375,-3.59375 7.859375,-3.8125 C 7.859375,-4.03125 7.65625,-4.03125 7.5,-4.03125 L 0.96875,-4.03125 C 0.8125,-4.03125 0.609375,-4.03125 0.609375,-3.8125 C 0.609375,-3.59375 0.8125,-3.59375 0.984375,-3.59375 L 7.5,-3.59375 z M 7.5,-1.421875 C 7.65625,-1.421875 7.859375,-1.421875 7.859375,-1.640625 C 7.859375,-1.859375 7.65625,-1.859375 7.5,-1.859375 L 0.984375,-1.859375 C 0.8125,-1.859375 0.609375,-1.859375 0.609375,-1.640625 C 0.609375,-1.421875 0.8125,-1.421875 0.96875,-1.421875 L 7.5,-1.421875 z"+ id="path297" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph9-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.453125,-2.515625 L 7.5,-2.515625 C 7.65625,-2.515625 7.859375,-2.515625 7.859375,-2.71875 C 7.859375,-2.9375 7.65625,-2.9375 7.5,-2.9375 L 4.453125,-2.9375 L 4.453125,-6 C 4.453125,-6.15625 4.453125,-6.359375 4.25,-6.359375 C 4.03125,-6.359375 4.03125,-6.15625 4.03125,-6 L 4.03125,-2.9375 L 0.96875,-2.9375 C 0.8125,-2.9375 0.609375,-2.9375 0.609375,-2.71875 C 0.609375,-2.515625 0.8125,-2.515625 0.96875,-2.515625 L 4.03125,-2.515625 L 4.03125,0.546875 C 4.03125,0.703125 4.03125,0.90625 4.25,0.90625 C 4.453125,0.90625 4.453125,0.703125 4.453125,0.546875 L 4.453125,-2.515625 z"+ id="path300" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path303" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph10-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.21875,-0.015625 C 2.21875,-0.734375 1.9375,-1.15625 1.515625,-1.15625 C 1.15625,-1.15625 0.9375,-0.890625 0.9375,-0.578125 C 0.9375,-0.28125 1.15625,0 1.515625,0 C 1.640625,0 1.78125,-0.046875 1.890625,-0.140625 C 1.9375,-0.15625 1.9375,-0.171875 1.953125,-0.171875 C 1.96875,-0.171875 1.96875,-0.15625 1.96875,-0.015625 C 1.96875,0.796875 1.59375,1.453125 1.234375,1.8125 C 1.109375,1.9375 1.109375,1.953125 1.109375,1.984375 C 1.109375,2.0625 1.171875,2.109375 1.21875,2.109375 C 1.34375,2.109375 2.21875,1.265625 2.21875,-0.015625 z"+ id="path306" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path309" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.171875,-8.96875 C 1.390625,-7.359375 0.9375,-4.9375 0.9375,-2.984375 C 0.9375,-0.890625 1.453125,1.453125 3.171875,3 L 3.890625,3 C 3.4375,2.5625 2.703125,1.640625 2.28125,0.28125 C 1.953125,-0.78125 1.84375,-1.890625 1.84375,-2.96875 C 1.84375,-6.5 3.09375,-8.21875 3.890625,-8.96875 L 3.171875,-8.96875 z"+ id="path312" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.359375,3 C 3.15625,1.40625 3.609375,-1.03125 3.609375,-2.96875 C 3.609375,-5.078125 3.09375,-7.421875 1.359375,-8.96875 L 0.640625,-8.96875 C 1.109375,-8.53125 1.84375,-7.609375 2.265625,-6.25 C 2.578125,-5.1875 2.703125,-4.078125 2.703125,-2.984375 C 2.703125,0.53125 1.453125,2.265625 0.640625,3 L 1.359375,3 z"+ id="path315" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph6-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.765625,-2.765625 L 8.0625,-2.765625 C 8.234375,-2.765625 8.453125,-2.765625 8.453125,-2.96875 C 8.453125,-3.203125 8.25,-3.203125 8.0625,-3.203125 L 4.765625,-3.203125 L 4.765625,-6.5 C 4.765625,-6.671875 4.765625,-6.890625 4.546875,-6.890625 C 4.328125,-6.890625 4.328125,-6.6875 4.328125,-6.5 L 4.328125,-3.203125 L 1.03125,-3.203125 C 0.859375,-3.203125 0.640625,-3.203125 0.640625,-2.984375 C 0.640625,-2.765625 0.84375,-2.765625 1.03125,-2.765625 L 4.328125,-2.765625 L 4.328125,0.53125 C 4.328125,0.703125 4.328125,0.921875 4.546875,0.921875 C 4.765625,0.921875 4.765625,0.71875 4.765625,0.53125 L 4.765625,-2.765625 z"+ id="path318" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-0"+ style="overflow:visible">+ <path+ style="stroke:none"+ d=""+ id="path321" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-1"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.859375,-7.0625 L 6.46875,-7.0625 L 6.46875,-7.953125 L 0.234375,-7.953125 L 0.234375,-7.0625 L 2.84375,-7.0625 L 2.84375,0 L 3.859375,0 L 3.859375,-7.0625 z"+ id="path324" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-2"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.765625,-7.953125 L 0.765625,0 L 1.671875,0 L 1.671875,-3.15625 C 1.671875,-4.3125 2.28125,-5.078125 3.21875,-5.078125 C 3.515625,-5.078125 3.8125,-4.984375 4.03125,-4.828125 C 4.28125,-4.640625 4.390625,-4.359375 4.390625,-3.953125 L 4.390625,0 L 5.296875,0 L 5.296875,-4.3125 C 5.296875,-5.28125 4.609375,-5.875 3.5,-5.875 C 2.6875,-5.875 2.203125,-5.625 1.671875,-4.921875 L 1.671875,-7.953125 L 0.765625,-7.953125 z"+ id="path327" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-3"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.59375,-2.546875 C 5.59375,-3.421875 5.53125,-3.953125 5.359375,-4.375 C 5,-5.3125 4.125,-5.875 3.046875,-5.875 C 1.46875,-5.875 0.4375,-4.65625 0.4375,-2.78125 C 0.4375,-0.90625 1.421875,0.25 3.03125,0.25 C 4.34375,0.25 5.25,-0.484375 5.46875,-1.734375 L 4.5625,-1.734375 C 4.3125,-0.984375 3.796875,-0.59375 3.0625,-0.59375 C 2.484375,-0.59375 2,-0.84375 1.6875,-1.328125 C 1.46875,-1.65625 1.390625,-1.984375 1.390625,-2.546875 L 5.59375,-2.546875 z M 1.40625,-3.296875 C 1.484375,-4.359375 2.125,-5.03125 3.046875,-5.03125 C 3.9375,-5.03125 4.625,-4.296875 4.625,-3.359375 C 4.625,-3.34375 4.625,-3.3125 4.609375,-3.296875 L 1.40625,-3.296875 z"+ id="path330" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-4"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.40625,-7.953125 L 4.5,-7.953125 L 4.5,-5 C 4.109375,-5.578125 3.5,-5.875 2.734375,-5.875 C 1.25,-5.875 0.28125,-4.6875 0.28125,-2.875 C 0.28125,-0.9375 1.234375,0.25 2.765625,0.25 C 3.5625,0.25 4.09375,-0.046875 4.59375,-0.75 L 4.59375,0 L 5.40625,0 L 5.40625,-7.953125 z M 2.890625,-5.03125 C 3.875,-5.03125 4.5,-4.15625 4.5,-2.796875 C 4.5,-1.46875 3.859375,-0.59375 2.90625,-0.59375 C 1.890625,-0.59375 1.234375,-1.484375 1.234375,-2.8125 C 1.234375,-4.140625 1.890625,-5.03125 2.890625,-5.03125 z"+ id="path333" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-5"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.75,-5.71875 L 0.75,0 L 1.671875,0 L 1.671875,-2.96875 C 1.671875,-3.78125 1.875,-4.3125 2.3125,-4.640625 C 2.59375,-4.84375 2.875,-4.90625 3.5,-4.921875 L 3.5,-5.84375 C 3.34375,-5.875 3.265625,-5.875 3.15625,-5.875 C 2.5625,-5.875 2.109375,-5.53125 1.59375,-4.671875 L 1.59375,-5.71875 L 0.75,-5.71875 z"+ id="path336" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-6"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.640625,-5.71875 L 0.734375,-5.71875 L 0.734375,0 L 1.640625,0 L 1.640625,-5.71875 z M 1.640625,-7.953125 L 0.71875,-7.953125 L 0.71875,-6.8125 L 1.640625,-6.8125 L 1.640625,-7.953125 z"+ id="path339" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-7"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 3.109375,0 L 5.296875,-5.71875 L 4.28125,-5.71875 L 2.65625,-1.078125 L 1.140625,-5.71875 L 0.109375,-5.71875 L 2.109375,0 L 3.109375,0 z"+ id="path342" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-8"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.59375,2.375 L 1.5,2.375 L 1.5,-0.59375 C 1.984375,-0.015625 2.515625,0.25 3.265625,0.25 C 4.734375,0.25 5.703125,-0.9375 5.703125,-2.765625 C 5.703125,-4.671875 4.765625,-5.875 3.25,-5.875 C 2.46875,-5.875 1.859375,-5.53125 1.421875,-4.859375 L 1.421875,-5.71875 L 0.59375,-5.71875 L 0.59375,2.375 z M 3.09375,-5.03125 C 4.09375,-5.03125 4.75,-4.140625 4.75,-2.78125 C 4.75,-1.484375 4.09375,-0.59375 3.09375,-0.59375 C 2.140625,-0.59375 1.5,-1.46875 1.5,-2.8125 C 1.5,-4.15625 2.140625,-5.03125 3.09375,-5.03125 z"+ id="path345" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-9"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.96875,-5.875 C 1.359375,-5.875 0.390625,-4.734375 0.390625,-2.8125 C 0.390625,-0.890625 1.359375,0.25 2.984375,0.25 C 4.578125,0.25 5.5625,-0.890625 5.5625,-2.765625 C 5.5625,-4.75 4.609375,-5.875 2.96875,-5.875 z M 2.984375,-5.03125 C 4,-5.03125 4.609375,-4.203125 4.609375,-2.78125 C 4.609375,-1.4375 3.984375,-0.59375 2.984375,-0.59375 C 1.96875,-0.59375 1.34375,-1.421875 1.34375,-2.8125 C 1.34375,-4.1875 1.96875,-5.03125 2.984375,-5.03125 z"+ id="path348" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-10"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.140625,-3.796875 C 5.09375,-4.359375 4.96875,-4.71875 4.75,-5.03125 C 4.359375,-5.5625 3.671875,-5.875 2.875,-5.875 C 1.34375,-5.875 0.34375,-4.65625 0.34375,-2.765625 C 0.34375,-0.921875 1.3125,0.25 2.875,0.25 C 4.234375,0.25 5.09375,-0.5625 5.203125,-1.96875 L 4.28125,-1.96875 C 4.140625,-1.046875 3.671875,-0.59375 2.890625,-0.59375 C 1.890625,-0.59375 1.28125,-1.40625 1.28125,-2.765625 C 1.28125,-4.1875 1.875,-5.03125 2.875,-5.03125 C 3.625,-5.03125 4.109375,-4.59375 4.21875,-3.796875 L 5.140625,-3.796875 z"+ id="path351" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-11"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 4.78125,-4.125 C 4.765625,-5.25 4.03125,-5.875 2.703125,-5.875 C 1.375,-5.875 0.515625,-5.1875 0.515625,-4.140625 C 0.515625,-3.234375 0.96875,-2.8125 2.328125,-2.484375 L 3.171875,-2.28125 C 3.8125,-2.125 4.0625,-1.890625 4.0625,-1.484375 C 4.0625,-0.953125 3.515625,-0.59375 2.71875,-0.59375 C 2.234375,-0.59375 1.828125,-0.734375 1.59375,-0.96875 C 1.453125,-1.140625 1.390625,-1.296875 1.328125,-1.703125 L 0.375,-1.703125 C 0.421875,-0.375 1.15625,0.25 2.65625,0.25 C 4.09375,0.25 5,-0.453125 5,-1.5625 C 5,-2.40625 4.53125,-2.875 3.390625,-3.15625 L 2.515625,-3.359375 C 1.78125,-3.53125 1.46875,-3.78125 1.46875,-4.171875 C 1.46875,-4.703125 1.9375,-5.03125 2.671875,-5.03125 C 3.40625,-5.03125 3.796875,-4.71875 3.8125,-4.125 L 4.78125,-4.125 z"+ id="path354" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-12"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.765625,-5.71875 L 0.765625,0 L 1.671875,0 L 1.671875,-3.15625 C 1.671875,-4.3125 2.296875,-5.078125 3.234375,-5.078125 C 3.953125,-5.078125 4.40625,-4.640625 4.40625,-3.953125 L 4.40625,0 L 5.3125,0 L 5.3125,-4.3125 C 5.3125,-5.265625 4.609375,-5.875 3.5,-5.875 C 2.65625,-5.875 2.109375,-5.546875 1.609375,-4.75 L 1.609375,-5.71875 L 0.765625,-5.71875 z"+ id="path357" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-13"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.765625,-5.71875 L 1.828125,-5.71875 L 1.828125,-7.28125 L 0.921875,-7.28125 L 0.921875,-5.71875 L 0.15625,-5.71875 L 0.15625,-4.96875 L 0.921875,-4.96875 L 0.921875,-0.65625 C 0.921875,-0.078125 1.3125,0.25 2.03125,0.25 C 2.25,0.25 2.46875,0.234375 2.765625,0.171875 L 2.765625,-0.59375 C 2.65625,-0.5625 2.515625,-0.546875 2.328125,-0.546875 C 1.9375,-0.546875 1.828125,-0.65625 1.828125,-1.0625 L 1.828125,-4.96875 L 2.765625,-4.96875 L 2.765625,-5.71875 z"+ id="path360" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-14"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.25,0 L 5.25,-5.71875 L 4.359375,-5.71875 L 4.359375,-2.46875 C 4.359375,-1.3125 3.734375,-0.546875 2.796875,-0.546875 C 2.078125,-0.546875 1.609375,-0.984375 1.609375,-1.671875 L 1.609375,-5.71875 L 0.703125,-5.71875 L 0.703125,-1.3125 C 0.703125,-0.359375 1.421875,0.25 2.53125,0.25 C 3.375,0.25 3.90625,-0.046875 4.4375,-0.796875 L 4.4375,0 L 5.25,0 z"+ id="path363" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-15"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 6.5,-5.609375 C 6.484375,-7.171875 5.421875,-8.078125 3.59375,-8.078125 C 1.84375,-8.078125 0.765625,-7.1875 0.765625,-5.75 C 0.765625,-4.78125 1.28125,-4.171875 2.328125,-3.890625 L 4.296875,-3.375 C 5.296875,-3.109375 5.765625,-2.703125 5.765625,-2.078125 C 5.765625,-1.65625 5.53125,-1.21875 5.1875,-0.984375 C 4.875,-0.765625 4.375,-0.640625 3.734375,-0.640625 C 2.875,-0.640625 2.28125,-0.84375 1.890625,-1.3125 C 1.609375,-1.65625 1.46875,-2.046875 1.484375,-2.53125 L 0.53125,-2.53125 C 0.53125,-1.796875 0.671875,-1.3125 1,-0.890625 C 1.53125,-0.140625 2.453125,0.25 3.671875,0.25 C 4.609375,0.25 5.390625,0.03125 5.90625,-0.359375 C 6.4375,-0.78125 6.765625,-1.5 6.765625,-2.1875 C 6.765625,-3.15625 6.15625,-3.875 5.078125,-4.171875 L 3.09375,-4.71875 C 2.125,-4.96875 1.78125,-5.28125 1.78125,-5.890625 C 1.78125,-6.703125 2.484375,-7.234375 3.5625,-7.234375 C 4.828125,-7.234375 5.53125,-6.65625 5.546875,-5.609375 L 6.5,-5.609375 z"+ id="path366" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-16"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 5.828125,-0.53125 C 5.734375,-0.515625 5.6875,-0.515625 5.640625,-0.515625 C 5.328125,-0.515625 5.140625,-0.671875 5.140625,-0.953125 L 5.140625,-4.3125 C 5.140625,-5.328125 4.40625,-5.875 3,-5.875 C 2.171875,-5.875 1.484375,-5.640625 1.09375,-5.21875 C 0.84375,-4.921875 0.734375,-4.59375 0.703125,-4.03125 L 1.625,-4.03125 C 1.703125,-4.71875 2.109375,-5.03125 2.96875,-5.03125 C 3.78125,-5.03125 4.25,-4.734375 4.25,-4.1875 L 4.25,-3.953125 C 4.25,-3.5625 4.015625,-3.40625 3.296875,-3.3125 C 2,-3.15625 1.8125,-3.109375 1.46875,-2.96875 C 0.796875,-2.6875 0.453125,-2.1875 0.453125,-1.4375 C 0.453125,-0.40625 1.171875,0.25 2.328125,0.25 C 3.046875,0.25 3.625,0 4.28125,-0.59375 C 4.34375,-0.015625 4.625,0.25 5.21875,0.25 C 5.40625,0.25 5.546875,0.234375 5.828125,0.15625 L 5.828125,-0.53125 z M 4.25,-1.796875 C 4.25,-1.5 4.15625,-1.3125 3.875,-1.0625 C 3.515625,-0.71875 3.0625,-0.546875 2.53125,-0.546875 C 1.828125,-0.546875 1.40625,-0.890625 1.40625,-1.46875 C 1.40625,-2.0625 1.8125,-2.359375 2.78125,-2.515625 C 3.734375,-2.640625 3.9375,-2.6875 4.25,-2.828125 L 4.25,-1.796875 z"+ id="path369" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-17"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 0.765625,-5.71875 L 0.765625,0 L 1.671875,0 L 1.671875,-3.59375 C 1.671875,-4.421875 2.28125,-5.078125 3.015625,-5.078125 C 3.703125,-5.078125 4.078125,-4.671875 4.078125,-3.9375 L 4.078125,0 L 5,0 L 5,-3.59375 C 5,-4.421875 5.59375,-5.078125 6.34375,-5.078125 C 7,-5.078125 7.390625,-4.65625 7.390625,-3.9375 L 7.390625,0 L 8.3125,0 L 8.3125,-4.28125 C 8.3125,-5.3125 7.71875,-5.875 6.65625,-5.875 C 5.890625,-5.875 5.4375,-5.65625 4.890625,-5 C 4.5625,-5.609375 4.09375,-5.875 3.359375,-5.875 C 2.59375,-5.875 2.09375,-5.59375 1.609375,-4.90625 L 1.609375,-5.71875 L 0.765625,-5.71875 z"+ id="path372" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-18"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 1.65625,-7.953125 L 0.734375,-7.953125 L 0.734375,0 L 1.65625,0 L 1.65625,-7.953125 z"+ id="path375" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-19"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.8125,-5.71875 L 1.859375,-5.71875 L 1.859375,-6.609375 C 1.859375,-6.984375 2.078125,-7.1875 2.5,-7.1875 C 2.578125,-7.1875 2.609375,-7.1875 2.8125,-7.171875 L 2.8125,-7.921875 C 2.609375,-7.96875 2.484375,-7.984375 2.296875,-7.984375 C 1.46875,-7.984375 0.953125,-7.5 0.953125,-6.6875 L 0.953125,-5.71875 L 0.203125,-5.71875 L 0.203125,-4.96875 L 0.953125,-4.96875 L 0.953125,0 L 1.859375,0 L 1.859375,-4.96875 L 2.8125,-4.96875 L 2.8125,-5.71875 z"+ id="path378" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-20"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.328125,-1.140625 L 1.203125,-1.140625 L 1.203125,0 L 2.328125,0 L 2.328125,-1.140625 z M 2.328125,-5.71875 L 1.203125,-5.71875 L 1.203125,-4.578125 L 2.328125,-4.578125 L 2.328125,-5.71875 z"+ id="path381" />+ </symbol>+ <symbol+ overflow="visible"+ id="glyph2-21"+ style="overflow:visible">+ <path+ style="stroke:none"+ d="M 2.828125,-5.5 L 2.828125,0 L 3.78125,0 L 3.78125,-7.734375 L 3.15625,-7.734375 C 2.8125,-6.546875 2.59375,-6.375 1.109375,-6.1875 L 1.109375,-5.5 L 2.828125,-5.5 z"+ id="path384" />+ </symbol>+ </g>+ <clipPath+ id="clip1">+ <path+ d="M 21.226562,53.703125 L 27.273438,53.703125 L 27.273438,47.65625 L 21.226562,47.65625 L 21.226562,53.703125 z"+ id="path387" />+ </clipPath>+ <clipPath+ id="clip2">+ <path+ d="M 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 L 130.21094,156.50781 z"+ id="path390" />+ </clipPath>+ <clipPath+ id="clip3">+ <path+ d="M 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 L 130.21094,156.50781 z"+ id="path393" />+ </clipPath>+ <clipPath+ id="clip4">+ <path+ d="M 130.21094,59.507812 L 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 z M 145.71094,97.511719 L 155.22266,97.511719 L 155.22266,93.730469 L 145.71094,93.730469 L 145.71094,93.730469 L 153.27344,95.621094 L 145.71094,97.511719 z"+ id="path396" />+ </clipPath>+ <clipPath+ id="clip5">+ <path+ d="M 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 L 130.21094,156.50781 z"+ id="path399" />+ </clipPath>+ <clipPath+ id="clip6">+ <path+ d="M 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 L 130.21094,156.50781 z"+ id="path402" />+ </clipPath>+ <clipPath+ id="clip7">+ <path+ d="M 130.21094,59.507812 L 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 z M 219.53906,133.41406 L 210.02734,133.41406 L 210.02734,137.19531 L 219.53906,137.19531 L 219.53906,137.19531 L 211.97656,135.30469 L 219.53906,133.41406 z"+ id="path405" />+ </clipPath>+ <clipPath+ id="clip8">+ <path+ d="M 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 L 130.21094,156.50781 z"+ id="path408" />+ </clipPath>+ <clipPath+ id="clip9">+ <path+ d="M 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 L 130.21094,156.50781 z"+ id="path411" />+ </clipPath>+ <clipPath+ id="clip10">+ <path+ d="M 130.21094,59.507812 L 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 z M 242.08984,97.511719 L 251.59766,97.511719 L 251.59766,93.730469 L 242.08984,93.730469 L 242.08984,93.730469 L 249.64453,95.621094 L 242.08984,97.511719 z"+ id="path414" />+ </clipPath>+ <clipPath+ id="clip11">+ <path+ d="M 130.21094,156.50781 L 255.21094,156.50781 L 255.21094,59.507812 L 130.21094,59.507812 L 130.21094,156.50781 z"+ id="path417" />+ </clipPath>+ <clipPath+ id="clip12">+ <path+ d="M 21.226562,186.39453 L 27.273438,186.39453 L 27.273438,180.34766 L 21.226562,180.34766 L 21.226562,186.39453 z"+ id="path420" />+ </clipPath>+ <clipPath+ id="clip13">+ <path+ d="M 2146.2383,-1777.2891 L 2239.2383,-1777.2891 L 2239.2383,-1807.2891 L 2146.2383,-1807.2891 L 2146.2383,-1777.2891 z"+ id="path423" />+ </clipPath>+ <clipPath+ id="clip14">+ <path+ d="M 2146.2383,-1807.2891 L 2146.2383,-1777.2891 L 2239.2383,-1777.2891 L 2239.2383,-1807.2891 L 2146.2383,-1807.2891 z M 2229.1758,-1790.3516 L 2238.6875,-1790.3516 L 2238.6875,-1794.1328 L 2229.1758,-1794.1328 L 2229.1758,-1794.1328 L 2236.7344,-1792.2422 L 2229.1758,-1790.3516 z"+ id="path426" />+ </clipPath>+ <clipPath+ id="clip15">+ <path+ d="M 2146.2383,-1777.2891 L 2239.2383,-1777.2891 L 2239.2383,-1807.2891 L 2146.2383,-1807.2891 L 2146.2383,-1777.2891 z"+ id="path429" />+ </clipPath>+ <clipPath+ id="clip16">+ <path+ d="M 2146.2383,-1777.2891 L 2239.2383,-1777.2891 L 2239.2383,-1807.2891 L 2146.2383,-1807.2891 L 2146.2383,-1777.2891 z"+ id="path432" />+ </clipPath>+ <clipPath+ id="clip17">+ <path+ d="M 2146.2383,-1807.2891 L 2146.2383,-1777.2891 L 2239.2383,-1777.2891 L 2239.2383,-1807.2891 L 2146.2383,-1807.2891 z M 2161.1484,-1790.3516 L 2170.6602,-1790.3516 L 2170.6602,-1794.1328 L 2161.1484,-1794.1328 L 2161.1484,-1794.1328 L 2168.707,-1792.2422 L 2161.1484,-1790.3516 z"+ id="path435" />+ </clipPath>+ <clipPath+ id="clip18">+ <path+ d="M 2146.2383,-1777.2891 L 2239.2383,-1777.2891 L 2239.2383,-1807.2891 L 2146.2383,-1807.2891 L 2146.2383,-1777.2891 z"+ id="path438" />+ </clipPath>+ </defs>+ <g+ id="g5211"+ transform="matrix(2.3300878,0,0,2.3300878,-265.85211,-135.25479)">+ <g+ clip-path="url(#clip2)"+ clip-rule="nonzero"+ id="g1149">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 240.6925,467.14031 L 807.5675,467.14031 L 807.5675,750.57781 L 240.6925,750.57781 L 240.6925,467.14031 z"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1151" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 240.6925,70.304375 L 807.5675,70.304375 L 807.5675,353.74187 L 240.6925,353.74187 L 240.6925,70.304375 z"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1153" />+ </g>+ <g+ clip-path="url(#clip3)"+ clip-rule="nonzero"+ id="g1155">+ <g+ clip-path="url(#clip4)"+ clip-rule="evenodd"+ id="g1157">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 240.6925,212.02312 L 70.614375,212.02312 L 70.614375,608.85906 L 240.6925,608.85906"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1159" />+ </g>+ </g>+ <g+ clip-path="url(#clip5)"+ clip-rule="nonzero"+ id="g1161">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 145.71094,97.511719 L 153.27344,95.621094 L 145.71094,93.730469 L 145.71094,97.511719"+ id="path1163" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 154.98937,589.95281 L 230.61437,608.85906 L 154.98937,627.76531 L 154.98937,589.95281 z"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1165" />+ </g>+ <g+ clip-path="url(#clip6)"+ clip-rule="nonzero"+ id="g1167">+ <g+ clip-path="url(#clip7)"+ clip-rule="evenodd"+ id="g1169">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 807.5675,608.85906 L 977.64562,608.85906 L 977.64562,212.02312 L 807.5675,212.02312"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1171" />+ </g>+ </g>+ <g+ clip-path="url(#clip8)"+ clip-rule="nonzero"+ id="g1173">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 219.53906,133.41406 L 211.97656,135.30469 L 219.53906,137.19531 L 219.53906,133.41406"+ id="path1175" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 893.27062,230.92937 L 817.64562,212.02312 L 893.27062,193.11687 L 893.27062,230.92937 z"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1177" />+ </g>+ <g+ clip-path="url(#clip9)"+ clip-rule="nonzero"+ id="g1179">+ <g+ clip-path="url(#clip10)"+ clip-rule="evenodd"+ id="g1181">+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 977.64562,608.85906 L 1204.4034,608.85906"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1183" />+ </g>+ </g>+ <g+ clip-path="url(#clip11)"+ clip-rule="nonzero"+ id="g1185">+ <path+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"+ d="M 242.08984,97.511719 L 249.64453,95.621094 L 242.08984,93.730469 L 242.08984,97.511719"+ id="path1187" />+ <path+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 1118.7784,589.95281 L 1194.3253,608.85906 L 1118.7784,627.76531 L 1118.7784,589.95281 z"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1189" />+ <path+ style="fill:none;stroke:#000000;stroke-width:9.44849968;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="M 13.895625,13.585625 L 1034.3644,13.585625 L 1034.3644,949.01531 L 13.895625,949.01531 L 13.895625,13.585625 z"+ transform="matrix(0.1,0,0,-0.1,130.212,156.507)"+ id="path1191" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1193">+ <use+ xlink:href="#glyph4-1"+ x="157.24899"+ y="92.754997"+ id="use1195"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-2"+ x="163.89609"+ y="92.754997"+ id="use1197"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-3"+ x="170.54318"+ y="92.754997"+ id="use1199"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-4"+ x="173.19724"+ y="92.754997"+ id="use1201"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1203">+ <use+ xlink:href="#glyph4-5"+ x="179.48567"+ y="92.754997"+ id="use1205"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-6"+ x="185.46327"+ y="92.754997"+ id="use1207"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-7"+ x="193.43739"+ y="92.754997"+ id="use1209"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1211">+ <use+ xlink:href="#glyph5-1"+ x="203.07201"+ y="95.768997"+ id="use1213"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1215">+ <use+ xlink:href="#glyph6-1"+ x="172.619"+ y="104.094"+ id="use1217"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1219">+ <use+ xlink:href="#glyph4-8"+ x="177.172"+ y="104.094"+ id="use1221"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1223">+ <use+ xlink:href="#glyph5-2"+ x="183.149"+ y="105.887"+ id="use1225"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1227">+ <use+ xlink:href="#glyph6-2"+ x="188.07899"+ y="104.094"+ id="use1229"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1231">+ <use+ xlink:href="#glyph4-9"+ x="155.155"+ y="138.112"+ id="use1233"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-4"+ x="165.11368"+ y="138.112"+ id="use1235"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-10"+ x="171.76077"+ y="138.112"+ id="use1237"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-6"+ x="178.40787"+ y="138.112"+ id="use1239"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-7"+ x="186.38199"+ y="138.112"+ id="use1241"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1243">+ <use+ xlink:href="#glyph6-1"+ x="196.017"+ y="138.112"+ id="use1245"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1247">+ <use+ xlink:href="#glyph4-11"+ x="200.57001"+ y="138.112"+ id="use1249"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1251">+ <use+ xlink:href="#glyph6-2"+ x="205.543"+ y="138.112"+ id="use1253"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1255">+ <use+ xlink:href="#glyph7-1"+ x="253.496"+ y="92.040001"+ id="use1257"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1259">+ <use+ xlink:href="#glyph7-2"+ x="253.49361"+ y="92.040001"+ id="use1261"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1263">+ <use+ xlink:href="#glyph4-12"+ x="255.97701"+ y="98.424004"+ id="use1265"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1267">+ <use+ xlink:href="#glyph4-8"+ x="140.767"+ y="75.746002"+ id="use1269"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-12"+ x="146.7446"+ y="75.746002"+ id="use1271"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-13"+ x="153.39169"+ y="75.746002"+ id="use1273"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-14"+ x="160.03879"+ y="75.746002"+ id="use1275"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-15"+ x="164.01987"+ y="75.746002"+ id="use1277"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-2"+ x="169.99747"+ y="75.746002"+ id="use1279"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-6"+ x="176.64456"+ y="75.746002"+ id="use1281"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph4-7"+ x="184.61867"+ y="75.746002"+ id="use1283"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1285">+ <use+ xlink:href="#glyph6-1"+ x="194.254"+ y="75.746002"+ id="use1287"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1289">+ <use+ xlink:href="#glyph4-11"+ x="198.806"+ y="75.746002"+ id="use1291"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1293">+ <use+ xlink:href="#glyph8-1"+ x="203.77901"+ y="75.746002"+ id="use1295"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1297">+ <use+ xlink:href="#glyph4-8"+ x="209.024"+ y="75.746002"+ id="use1299"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1301">+ <use+ xlink:href="#glyph5-2"+ x="215.00101"+ y="77.539001"+ id="use1303"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1305">+ <use+ xlink:href="#glyph6-2"+ x="219.931"+ y="75.746002"+ id="use1307"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1309">+ <use+ xlink:href="#glyph7-1"+ x="140.103"+ y="111.884"+ id="use1311"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1313">+ <use+ xlink:href="#glyph7-2"+ x="140.10062"+ y="111.884"+ id="use1315"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1317">+ <use+ xlink:href="#glyph4-8"+ x="142.918"+ y="118.268"+ id="use1319"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1321">+ <use+ xlink:href="#glyph3-1"+ x="58.202"+ y="170.056"+ id="use1323"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph3-2"+ x="63.656551"+ y="170.056"+ id="use1325"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph3-3"+ x="69.722008"+ y="170.056"+ id="use1327"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph3-4"+ x="75.787468"+ y="170.056"+ id="use1329"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph3-5"+ x="79.420197"+ y="170.056"+ id="use1331"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph3-6"+ x="84.874748"+ y="170.056"+ id="use1333"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph3-7"+ x="90.940208"+ y="170.056"+ id="use1335"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph3-8"+ x="98.216576"+ y="170.056"+ id="use1337"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1339">+ <use+ xlink:href="#glyph9-1"+ x="107.008"+ y="170.056"+ id="use1341"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1343">+ <use+ xlink:href="#glyph3-9"+ x="111.251"+ y="170.056"+ id="use1345"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1347">+ <use+ xlink:href="#glyph10-1"+ x="115.789"+ y="170.056"+ id="use1349"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1351">+ <use+ xlink:href="#glyph3-1"+ x="120.637"+ y="170.056"+ id="use1353"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1355">+ <use+ xlink:href="#glyph5-2"+ x="126.092"+ y="171.97701"+ id="use1357"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1359">+ <use+ xlink:href="#glyph9-2"+ x="131.021"+ y="170.056"+ id="use1361"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1363">+ <use+ xlink:href="#glyph9-3"+ x="138.29628"+ y="170.056"+ id="use1365"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1367">+ <use+ xlink:href="#glyph11-1"+ x="146.77901"+ y="170.056"+ id="use1369"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1371">+ <use+ xlink:href="#glyph3-1"+ x="160.718"+ y="170.056"+ id="use1373"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1375">+ <use+ xlink:href="#glyph5-2"+ x="166.173"+ y="171.97701"+ id="use1377"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1379">+ <use+ xlink:href="#glyph10-1"+ x="171.10201"+ y="170.056"+ id="use1381"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1383">+ <use+ xlink:href="#glyph3-9"+ x="175.951"+ y="170.056"+ id="use1385"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1387">+ <use+ xlink:href="#glyph9-1"+ x="180.48801"+ y="170.056"+ id="use1389"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1391">+ <use+ xlink:href="#glyph3-1"+ x="184.731"+ y="170.056"+ id="use1393"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1395">+ <use+ xlink:href="#glyph5-2"+ x="190.185"+ y="171.97701"+ id="use1397"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1399">+ <use+ xlink:href="#glyph9-2"+ x="195.11501"+ y="170.056"+ id="use1401"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1403">+ <use+ xlink:href="#glyph10-1"+ x="199.35699"+ y="170.056"+ id="use1405"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1407">+ <use+ xlink:href="#glyph3-9"+ x="204.20599"+ y="170.056"+ id="use1409"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1411">+ <use+ xlink:href="#glyph9-1"+ x="208.744"+ y="170.056"+ id="use1413"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1415">+ <use+ xlink:href="#glyph3-9"+ x="212.98599"+ y="170.056"+ id="use1417"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1419">+ <use+ xlink:href="#glyph9-1"+ x="217.524"+ y="170.056"+ id="use1421"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1423">+ <use+ xlink:href="#glyph3-1"+ x="221.767"+ y="170.056"+ id="use1425"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1427">+ <use+ xlink:href="#glyph5-2"+ x="227.22099"+ y="171.97701"+ id="use1429"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1431">+ <use+ xlink:href="#glyph9-2"+ x="232.151"+ y="170.056"+ id="use1433"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph9-2"+ x="236.39355"+ y="170.056"+ id="use1435"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1437">+ <use+ xlink:href="#glyph10-1"+ x="240.63499"+ y="170.056"+ id="use1439"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1441">+ <use+ xlink:href="#glyph3-9"+ x="245.48399"+ y="170.056"+ id="use1443"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1445">+ <use+ xlink:href="#glyph9-1"+ x="250.022"+ y="170.056"+ id="use1447"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1449">+ <use+ xlink:href="#glyph3-9"+ x="254.26401"+ y="170.056"+ id="use1451"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1453">+ <use+ xlink:href="#glyph9-1"+ x="258.802"+ y="170.056"+ id="use1455"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1457">+ <use+ xlink:href="#glyph3-9"+ x="263.04501"+ y="170.056"+ id="use1459"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1461">+ <use+ xlink:href="#glyph9-1"+ x="267.58301"+ y="170.056"+ id="use1463"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1465">+ <use+ xlink:href="#glyph3-1"+ x="271.82501"+ y="170.056"+ id="use1467"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1469">+ <use+ xlink:href="#glyph5-2"+ x="277.28"+ y="171.97701"+ id="use1471"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1473">+ <use+ xlink:href="#glyph9-2"+ x="282.20901"+ y="170.056"+ id="use1475"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph9-2"+ x="286.45154"+ y="170.056"+ id="use1477"+ width="362.83499"+ height="272.12601" />+ <use+ xlink:href="#glyph9-2"+ x="290.69409"+ y="170.056"+ id="use1479"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1481">+ <use+ xlink:href="#glyph10-1"+ x="294.936"+ y="170.056"+ id="use1483"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1485">+ <use+ xlink:href="#glyph11-2"+ x="299.785"+ y="170.056"+ id="use1487"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1489">+ <use+ xlink:href="#glyph11-2"+ x="304.63736"+ y="170.056"+ id="use1491"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1493">+ <use+ xlink:href="#glyph11-2"+ x="309.47882"+ y="170.056"+ id="use1495"+ width="362.83499"+ height="272.12601" />+ </g>+ <g+ style="fill:#000000;fill-opacity:1"+ id="g1497">+ <use+ xlink:href="#glyph11-3"+ x="315.54211"+ y="170.056"+ id="use1499"+ width="362.83499"+ height="272.12601" />+ </g>+ </g>+ <g+ id="g1813"+ clip-rule="nonzero"+ clip-path="url(#clip13)"+ transform="translate(-58.873875,-61.13305)">+ <g+ id="g1815"+ clip-rule="evenodd"+ clip-path="url(#clip14)">+ <path+ id="path1817"+ transform="matrix(0.1,0,0,-0.1,2146.2388,-1777.2898)"+ d="M 688.27616,149.52397 L 915.03398,149.52397"+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ </g>+ </g>+ <g+ id="g1819"+ clip-rule="nonzero"+ clip-path="url(#clip15)"+ transform="translate(-58.873875,-61.13305)">+ <path+ id="path1821"+ d="M 2229.1758,-1790.3516 L 2236.7344,-1792.2422 L 2229.1758,-1794.1328 L 2229.1758,-1790.3516"+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" />+ <path+ id="path1823"+ transform="matrix(0.1,0,0,-0.1,2146.2388,-1777.2898)"+ d="M 829.36991,130.61772 L 904.95585,149.52397 L 829.36991,168.43023 L 829.36991,130.61772 z"+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ <path+ id="path1825"+ transform="matrix(0.1,0,0,-0.1,2146.2388,-1777.2898)"+ d="M 234.76054,7.805225 L 688.27616,7.805225 L 688.27616,291.24273 L 234.76054,291.24273 L 234.76054,7.805225 z"+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ </g>+ <g+ id="g1827"+ clip-rule="nonzero"+ clip-path="url(#clip16)"+ transform="translate(-58.873875,-61.13305)">+ <g+ id="g1829"+ clip-rule="evenodd"+ clip-path="url(#clip17)">+ <path+ id="path1831"+ transform="matrix(0.1,0,0,-0.1,2146.2388,-1777.2898)"+ d="M 7.963662,149.52397 L 234.76054,149.52397"+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ </g>+ </g>+ <g+ id="g1833"+ clip-rule="nonzero"+ clip-path="url(#clip18)"+ transform="translate(-58.873875,-61.13305)">+ <path+ id="path1835"+ d="M 2161.1484,-1790.3516 L 2168.707,-1792.2422 L 2161.1484,-1794.1328 L 2161.1484,-1790.3516"+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" />+ <path+ id="path1837"+ transform="matrix(0.1,0,0,-0.1,2146.2388,-1777.2898)"+ d="M 149.09647,130.61772 L 224.68241,149.52397 L 149.09647,168.43023 L 149.09647,130.61772 z"+ style="fill:none;stroke:#000000;stroke-width:4.72424984;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" />+ </g>+ <g+ id="g1839"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1841"+ y="-1783.7158"+ x="2179.9238"+ xlink:href="#glyph6-1" />+ <use+ height="272.12601"+ width="362.83499"+ id="use1843"+ y="-1783.7158"+ x="2184.4763"+ xlink:href="#glyph6-3" />+ </g>+ <g+ id="g1845"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1847"+ y="-1783.7158"+ x="2193.5808"+ xlink:href="#glyph12-1" />+ </g>+ <g+ id="g1849"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1851"+ y="-1783.7158"+ x="2200.2278"+ xlink:href="#glyph6-2" />+ </g>+ <g+ id="g1853"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1855"+ y="-1801.4388"+ x="2220.7007"+ xlink:href="#glyph7-1" />+ </g>+ <g+ id="g1857"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1859"+ y="-1801.4388"+ x="2220.6985"+ xlink:href="#glyph7-2" />+ </g>+ <g+ id="g1861"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1863"+ y="-1795.0548"+ x="2223.1819"+ xlink:href="#glyph4-12" />+ </g>+ <g+ id="g1865"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1867"+ y="-1795.0548"+ x="2171.918"+ xlink:href="#glyph4-9" />+ <use+ height="272.12601"+ width="362.83499"+ id="use1869"+ y="-1795.0548"+ x="2181.8765"+ xlink:href="#glyph4-4" />+ <use+ height="272.12601"+ width="362.83499"+ id="use1871"+ y="-1795.0548"+ x="2188.5237"+ xlink:href="#glyph4-10" />+ <use+ height="272.12601"+ width="362.83499"+ id="use1873"+ y="-1795.0548"+ x="2195.1707"+ xlink:href="#glyph4-6" />+ <use+ height="272.12601"+ width="362.83499"+ id="use1875"+ y="-1795.0548"+ x="2203.1448"+ xlink:href="#glyph4-7" />+ </g>+ <g+ id="g1877"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1879"+ y="-1803.5728"+ x="2146.3789"+ xlink:href="#glyph7-1" />+ </g>+ <g+ id="g1881"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1883"+ y="-1803.5728"+ x="2146.3765"+ xlink:href="#glyph7-2" />+ </g>+ <g+ id="g1885"+ style="fill:#d9d9d9;fill-opacity:1"+ transform="translate(-58.873875,-61.13305)">+ <use+ height="272.12601"+ width="362.83499"+ id="use1887"+ y="-1795.0548"+ x="2150.5188"+ xlink:href="#glyph4-16" />+ </g>+</svg>
+ doc/www/files/tutorial/figures/sourceSY_counterProc1.svg view
@@ -0,0 +1,41 @@+<?xml version="1.0" encoding="UTF-8"?>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="132" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="136" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12" stroke-dashoffset="0" image-rendering="auto">+ <!--Generated by ySVG-->+ <defs id="genericDefs"/>+ <g>+ <defs id="defs1">+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">+ <path d="M0 0 L132 0 L132 136 L0 136 L0 0 Z"/>+ </clipPath>+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">+ <path d="M-16 -21 L116 -21 L116 115 L-16 115 L-16 -21 Z"/>+ </clipPath>+ </defs>+ <g fill="white" transform="translate(16,21)" stroke="white">+ <rect x="-16" y="-21" clip-path="url(#clipPath2)" width="132" height="136" stroke="none"/>+ </g>+ <g fill="rgb(111,125,188)" transform="matrix(1,0,0,1,16,21)" stroke="rgb(111,125,188)">+ <rect x="0" y="0" clip-path="url(#clipPath2)" width="100" rx="4" ry="4" height="55" stroke="none"/>+ <text x="31" y="17.9023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">MapSY</text>+ <text x="33" y="32.0352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">"map"</text>+ <text x="1" y="46.168" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">fName=addOnef</text>+ </g>+ <g stroke-miterlimit="1.45" transform="matrix(1,0,0,1,16,21)" stroke-linecap="butt">+ <rect x="0" y="0" clip-path="url(#clipPath2)" fill="none" width="100" rx="4" ry="4" height="55"/>+ </g>+ <g fill="rgb(255,147,76)" transform="matrix(1,0,0,1,16,21)" stroke="rgb(255,147,76)">+ <path d="M0 50 L50 0 L100 50 L50 100 Z" clip-path="url(#clipPath2)" fill-rule="evenodd" stroke="none"/>+ <text x="27.5" y="40.4023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">DelaySY</text>+ <text x="30.5" y="54.5352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">"delay"</text>+ <text x="33" y="68.668" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">val=1</text>+ </g>+ <g stroke-miterlimit="1.45" transform="matrix(1,0,0,1,16,21)" stroke-linecap="butt">+ <path fill="none" d="M0 50 L50 0 L100 50 L50 100 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>+ <rect stroke-linecap="square" x="0" y="0" clip-path="url(#clipPath2)" width="7" height="7" stroke="none" stroke-miterlimit="10"/>+ <text stroke-linecap="square" x="13" y="8.0352" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve" stroke-miterlimit="10">out1</text>+ <rect x="0" y="0" clip-path="url(#clipPath2)" fill="none" width="7" height="7"/>+ <path fill="none" d="M100 50 L14.2609 10.1313" clip-path="url(#clipPath2)"/>+ <path d="M7.0068 6.7582 L15.7798 16.3517 L15.1677 10.553 L19.9962 7.2841 Z" clip-path="url(#clipPath2)" stroke="none"/>+ </g>+ </g>+</svg>
+ doc/www/files/tutorial/figures/sourceSY_counterProc2.svg view
@@ -0,0 +1,45 @@+<?xml version="1.0" encoding="UTF-8"?>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="391" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="141" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12" stroke-dashoffset="0" image-rendering="auto">+ <!--Generated by ySVG-->+ <defs id="genericDefs"/>+ <g>+ <defs id="defs1">+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">+ <path d="M0 0 L391 0 L391 141 L0 141 L0 0 Z"/>+ </clipPath>+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">+ <path d="M-15 -15 L376 -15 L376 126 L-15 126 L-15 -15 Z"/>+ </clipPath>+ </defs>+ <g fill="white" transform="translate(15,15)" stroke="white">+ <rect x="-15" y="-15" clip-path="url(#clipPath2)" width="391" height="141" stroke="none"/>+ </g>+ <g fill="rgb(111,125,188)" transform="matrix(1,0,0,1,15,15)" stroke="rgb(111,125,188)">+ <rect x="20" y="22.5" clip-path="url(#clipPath2)" width="100" rx="4" ry="4" height="55" stroke="none"/>+ <text x="51" y="40.4023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">MapSY</text>+ <text x="53" y="54.5352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">"map"</text>+ <text x="21" y="68.668" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">fName=addOnef</text>+ </g>+ <g stroke-miterlimit="1.45" transform="matrix(1,0,0,1,15,15)" stroke-linecap="butt">+ <rect x="20" y="22.5" clip-path="url(#clipPath2)" fill="none" width="100" rx="4" ry="4" height="55"/>+ </g>+ <g fill="rgb(255,147,76)" transform="matrix(1,0,0,1,15,15)" stroke="rgb(255,147,76)">+ <path d="M160 50 L210 0 L260 50 L210 100 Z" clip-path="url(#clipPath2)" fill-rule="evenodd" stroke="none"/>+ <text x="187.5" y="40.4023" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">DelaySY</text>+ <text x="190.5" y="54.5352" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">"delay"</text>+ <text x="193" y="68.668" clip-path="url(#clipPath2)" fill="black" font-family="sans-serif" stroke="none" xml:space="preserve">val=1</text>+ </g>+ <g stroke-miterlimit="1.45" transform="matrix(1,0,0,1,15,15)" stroke-linecap="butt">+ <path fill="none" d="M160 50 L210 0 L260 50 L210 100 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>+ <rect stroke-linecap="square" x="320" y="46.5" clip-path="url(#clipPath2)" width="7" height="7" stroke="none" stroke-miterlimit="10"/>+ <text stroke-linecap="square" x="333" y="54.5352" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve" stroke-miterlimit="10">out1</text>+ <rect x="320" y="46.5" clip-path="url(#clipPath2)" fill="none" width="7" height="7"/>+ <path fill="none" d="M260 50 L280 50 L280 110.5 L0 110.5 L0 50 L11.9609 50" clip-path="url(#clipPath2)"/>+ <path d="M19.9609 50 L7.9609 45 L10.9609 50 L7.9609 55 Z" clip-path="url(#clipPath2)" stroke="none"/>+ <path fill="none" d="M120 50 L152 50" clip-path="url(#clipPath2)"/>+ <path d="M160 50 L148 45 L151 50 L148 55 Z" clip-path="url(#clipPath2)" stroke="none"/>+ <path fill="none" d="M260 50 L311.9707 50" clip-path="url(#clipPath2)"/>+ <path d="M319.9707 50 L307.9707 45 L310.9707 50 L307.9707 55 Z" clip-path="url(#clipPath2)" stroke="none"/>+ </g>+ </g>+</svg>
+ doc/www/files/tutorial/fptools.css view
@@ -0,0 +1,39 @@+div {+ font-family: sans-serif;+ color: black;+ background: white+}++h1, h2, h3, h4, h5, h6, p.title { color: #005A9C }++h1 { font: 170% sans-serif }+h2 { font: 140% sans-serif }+h3 { font: 120% sans-serif }+h4 { font: bold 100% sans-serif }+h5 { font: italic 100% sans-serif }+h6 { font: small-caps 100% sans-serif }++pre {+ font-family: monospace;+ border-width: 1px;+ border-style: solid;+ padding: 0.3em+}++pre.screen { color: #006400 }+pre.programlisting { color: maroon }++div.example, div.figure {+ margin: 1ex 0em;+ border: solid #412e25 1px;+ padding: 0ex 0.4em+}++div.example, div.example-contents {+ background-color: #fffcf5+}++a:link { color: #0000C8 }+a:hover { background: #FFFFA8 }+a:active { color: #D00000 }+a:visited { color: #680098 }
+ doc/www/files/tutorial/tutorial.html view
@@ -0,0 +1,1492 @@+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>ForSyDe tutorial</title><link rel="stylesheet" href="fptools.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.73.2"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="article" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="ForSyDe-tutorial"></a>ForSyDe tutorial</h2></div><div><div class="author"><h3 class="author"><span class="firstname">Alfonso</span> <span class="surname">Acosta</span></h3><div class="affiliation"><span class="org">+ <span class="orgname">Royal Institute of Technology (KTH)</span>+ <span class="orgdiv">System, Architecture and Methodology (SAM) group</span>+ <div class="address"><p><span class="city">Stockholm</span>, <span class="country">Sweden</span></p></div>+ </span></div><code class="email"><<a class="email" href="mailto:alfonsoa@kth.se">alfonsoa@kth.se</a>></code></div></div><div><p class="pubdate">2008-09-20</p></div><div><div class="revhistory"><table border="1" width="100%" summary="Revision history"><tr><th align="left" valign="top" colspan="2"><b>Revision History</b></th></tr><tr><td align="left">Revision 0.2</td><td align="left">2008-09-20</td></tr><tr><td align="left" colspan="2">Complete draft.</td></tr><tr><td align="left">Revision 0.1</td><td align="left">2008-08-15</td></tr><tr><td align="left" colspan="2">First version.</td></tr></table></div></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="#intro">1. Disclaimer and Prerequisites</a></span></dt><dt><span class="section"><a href="#install">2. Installing ForSyDe</a></span></dt><dt><span class="section"><a href="#introForSYDe">3. Introduction to ForSyDe</a></span></dt><dd><dl><dt><span class="section"><a href="#id1251676">3.1. Signals</a></span></dt><dt><span class="section"><a href="#id1251727">3.2. Processes</a></span></dt><dt><span class="section"><a href="#id1251867">3.3. Process Constructors</a></span></dt><dt><span class="section"><a href="#id1251871">3.4. Models of Computation and Domain Interfaces</a></span></dt></dl></dd><dt><span class="section"><a href="#DEvsSE">4. Deep-embedded vs Shallow-embedded signals</a></span></dt><dt><span class="section"><a href="#DE">5. Using deep-embedded Signals</a></span></dt><dd><dl><dt><span class="section"><a href="#combinational">5.1. Combinational Systems</a></span></dt><dt><span class="section"><a href="#sequential">5.2. Sequential Systems</a></span></dt><dt><span class="section"><a href="#components">5.3. Using components</a></span></dt><dt><span class="section"><a href="#VHDL">5.4. VHDL Backend</a></span></dt><dt><span class="section"><a href="#GraphML">5.5. GraphML Backend</a></span></dt></dl></dd><dt><span class="section"><a href="#SE">6. Shallow-embedded signals</a></span></dt><dt><span class="appendix"><a href="#FSVec">A. <code class="literal">FSVec</code>s: Vectors parameterized in size</a></span></dt><dd><dl><dt><span class="section"><a href="#id1255404">1. Goal</a></span></dt><dt><span class="section"><a href="#id1255478">2. How?</a></span></dt><dt><span class="section"><a href="#id1255502">3. Type-level decimal numerals</a></span></dt><dt><span class="section"><a href="#id1255520">4. Fixed Sized Vectors themselves</a></span></dt><dt><span class="section"><a href="#id1255822">5. <code class="code">FSVec</code> issues</a></span></dt></dl></dd></dl></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="intro"></a>1. Disclaimer and Prerequisites</h2></div></div></div><p>+ This document has been devised as a practical hands-on+ introduction to the use of ForSyDe's implementation. Thus, it is+ intentionally informal and non-exhaustive. If you are interested+ in ForSyDe's theoretical foundations please refer to the <a class="ulink" href="http://www.ict.kth.se/org/ict/ecs/sam/projects/forsyde/www/index.html#documentation" target="_top">Documentation+ section</a> in our <a class="ulink" href="http://www.ict.kth.se/org/ict/ecs/sam/projects/forsyde/www/" target="_top">website</a>.+ </p><p>+ In order to take full advantage of this tutorial, it is+ essential to have a good background in the <a class="ulink" href="http://www.haskell.org" target="_top">Haskell</a> programming+ language. Familiarity with some Haskell extensions (<a class="ulink" href="http://www.haskell.org/th" target="_top">Template Haskell</a>,+ <a class="ulink" href="http://haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#functional-dependencies" target="_top">Multiparameter+ Type Classes with Functional Dependencies</a>, <a class="ulink" href="http://haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#instance-decls" target="_top">Undecidable+ and Overlapping Instances</a>) might help but is not vital.+ </p></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="install"></a>2. Installing ForSyDe</h2></div></div></div><p>+ ForSyDe is implemented as a Haskell-embedded Domain Specific+ Language (DSL). As intimidating as the previous phrase might+ sound, from a practical point of view it only means that, to all+ effects, ForSyDe is simply a Haskell library.+ </p><p>+ As it was already stated in <a class="xref" href="#intro" title="1. Disclaimer and Prerequisites">Section 1, “Disclaimer and Prerequisites”</a>, ForSyDe+ relies on many Haskell extensions, some of which are exclusive+ to GHC. For that reason, a recent version of GHC is required to+ build ForSyDe<sup>[<a name="id1251533" href="#ftn.id1251533" class="footnote">1</a>]</sup>.+ </p><p>+ ForSyDe's library is available on Haskell's <a class="ulink" href="http://hackage.haskell.org" target="_top">HackageDB</a>, a+ popular repository of Haskell <a class="ulink" href="http://www.haskell.org/cabal" target="_top">Cabal</a> packages.+ If ForSyDe is the first Cabal package you install or your memory+ needs to be refreshed in this matter, you should read <a class="ulink" href="http://haskell.org/haskellwiki/Cabal/How_to_install_a_Cabal_package" target="_top">"How+ to install a Cabal package"</a>.+ </p><p>+ At the time being, ForSyDe depends on the <a class="ulink" href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/type-level" target="_top"><code class="code">type-level</code></a>+ and <a class="ulink" href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/parameterized-data" target="_top"><code class="code">parameterized-data</code></a>+ packages to offer numerically-parametrized vectors, and on some+ other packages normally distributed with GHC (e.g. <a class="ulink" href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/mtl" target="_top"><code class="code">mtl</code></a>+ ..)+ </p></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="introForSYDe"></a>3. Introduction to ForSyDe</h2></div></div></div><p>+ This section is a short introduction to some basic concepts+ surrounding ForSyDe which are vital to understand how to use its+ implementation. If you cannot wait to get your hands dirty and begin+ with the implementation examples, go directly to <a class="xref" href="#DEvsSE" title="4. Deep-embedded vs Shallow-embedded signals">Section 4, “Deep-embedded vs Shallow-embedded signals”</a>.+ </p><p>+ ForSyDe, which stands for Formal System Design, is a+ methodology aimed at raising the abstraction level in which+ systems (e.g. System on Chip Systems, Hardware or Software) are designed.+ </p><p>+ ForSyDe systems are modelled as networks of <span class="emphasis"><em>processes</em></span>+ interconnected by <span class="emphasis"><em>signals</em></span>. In+ addition, the designer is allowed to use processes belonging to+ different <span class="emphasis"><em>Models of Computation</em></span>.+ </p><p>+ In order to understand how systems are modelled, it is important to+ get familiar with the concepts outlined above.+ </p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1251676"></a>3.1. Signals</h3></div></div></div><p>+ Signals can be intuitively defined as+ streams of information which flow through the different+ processes forming a system.+ </p><p>+ For example, this is a signal containing the first 10 positive numbers+ </p><div class="example"><a name="id1251694"></a><p class="title"><b>Example 1. Signal containing the first 10 positive numbers</b></p><div class="example-contents"><1,2,3,4,5,6,7,8,9,10></div></div><br class="example-break"><p>+ More formally, a signal is a sequence of events where each+ event has a tag and a value. In ForSyDe, the tag of an event+ is implicitly given by the event's position on the list. For+ instance, the sample signal above is formed by integer values+ which are identical to the signal implicit tags.+ </p><p>+ It is important to note that signals are homogeneous (i.e. a+ signal cannot carry values belonging to different types)+ </p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>The interpretation of tags, as we will see, is determined+ by the <span class="emphasis"><em>Model of Computation</em></span> used, e.g. an+ identical tag of two events in different signals does not+ necessarily imply that these events happen at the same+ time. </div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1251727"></a>3.2. Processes</h3></div></div></div><p>+ Processes are pure functions on signals, i.e. for a given set of input signals a process always gets the same+ set of output signals.+ </p><div class="figure"><a name="processfun"></a><p class="title"><b>Figure 1. Processes viewed as functions</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="360"><tr><td align="center" valign="middle"><object data="figures/processfun.svg" type="image/svg+xml" width="360" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ They can also be viewed as a black box which performs computations over its input signals and+ forward the results to adjacent processes through output signals.+ </p><div class="figure"><a name="processbox"></a><p class="title"><b>Figure 2. Processes viewed as boxes</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="225"><tr><td align="center" valign="middle"><object data="figures/processbox.svg" type="image/svg+xml" width="225" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ Note that this still allows processes to have internal+ state. A process does not necessarily react identically the+ same event applied at different times. But it will produce the same, possibly infinite, output signals+ when confronted with identical, possibly infinite, input signals.+ </p><p>+ One of the simplest examples one can think of, is a process which merely adds one to every value in its+ only input signal: <span class="emphasis"><em>plus1</em></span>. + </p><div class="example"><a name="id1251834"></a><p class="title"><b>Example 2. The <span class="emphasis"><em>plus1</em></span> process</b></p><div class="example-contents">+ plus1(<v<sub>1</sub>, v<sub>2</sub>, v<sub>3</sub>, ...>) =+ <v<sub>1</sub>+1, v<sub>2</sub>+1, v<sub>3</sub>+1, ...>)+ </div></div><br class="example-break"></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1251867"></a>3.3. Process Constructors</h3></div></div></div><p>+ In ForSyDe, all processes, even <span class="emphasis"><em>plus1</em></span>, must be created from + <span class="emphasis"><em>process constructors</em></span>. A process constructor takes zero or more+ functions and/or values which determine the initial state and behaviour of the process to be created. + </p><div class="figure"><a name="processcons"></a><p class="title"><b>Figure 3. A process constructor</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="270"><tr><td align="center" valign="middle"><object data="figures/processcons.svg" type="image/svg+xml" width="270" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ The ForSyDe methodology offers a set of well-defined+ process constructors. For example, certain process constructors are aimed at creating+ synchronous systems. Synchronous systems are governed by a global clock and all processes consume and produce+ exactly one signal event in each clock-cycle.+ </p><p>+ For instance, <span class="emphasis"><em>mapSY</em></span>, (where the suffix+ <span class="emphasis"><em>SY</em></span> stands for+ <span class="emphasis"><em>SY</em></span>ncrhonous) is a+ combinational<sup>[<a name="id1251950" href="#ftn.id1251950" class="footnote">2</a>]</sup> process constructor.+ <span class="emphasis"><em>mapSY</em></span> takes a function+ <span class="emphasis"><em>f</em></span> and creates a process with one input+ and output signal, resulting from the application of+ <span class="emphasis"><em>f</em></span> to every value in the input.+ </p><div class="figure"><a name="mapSY"></a><p class="title"><b>Figure 4. The synchronous, combinational map process constructor: <span class="emphasis"><em>mapSY</em></span></b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="495"><tr><td align="center" valign="middle"><object data="figures/mapSY.svg" type="image/svg+xml" width="495" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ <span class="emphasis"><em>plus1</em></span> can, in fact, be defined in terms of+ <span class="emphasis"><em>mapSY</em></span> as <span class="emphasis"><em>plus1 = mapSY+ (+1)</em></span>.+ </p><p>+ ForSyDe also supports synchronous, sequential+ systems. However, it does not allow loops formed exclusively+ by combinational processes, also known as+ <span class="emphasis"><em>combinational loops</em></span>, <span class="emphasis"><em>zero-delay+ loops</em></span> or <span class="emphasis"><em>feedback loops</em></span>, since+ their behaviour is not always decidable. Even with that,+ combinational loops are still possible if they contain at+ least one process formed by the+ <span class="emphasis"><em>delaySY<sub>k</sub></em></span>+ (<span class="emphasis"><em>k</em></span> > 0) constructor, which is defined as follows.+ </p><div class="figure"><a name="delaySY"></a><p class="title"><b>Figure 5. The synchronous, sequential delay process constructor: <span class="emphasis"><em>delaySY</em></span></b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="495"><tr><td align="center" valign="middle"><object data="figures/delaySY.svg" type="image/svg+xml" width="495" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ <span class="emphasis"><em>delaySY<sub>k</sub></em></span> takes an+ initial value <span class="emphasis"><em>s<sub>0</sub></em></span>+ and creates a process which appends+ <span class="emphasis"><em>s<sub>0</sub></em></span>, replicated+ <span class="emphasis"><em>k</em></span> times, to its input+ signal. <span class="emphasis"><em>delaySY</em></span> provides the basic+ mechanism with which to build sequential systems.+ </p><p>+ Both <span class="emphasis"><em>mapSY</em></span> and+ <span class="emphasis"><em>delaySY<sub>k</sub></em></span> are+ considered primitive process constructors, since they cannot+ be defined in terms of simpler ones. Primitive constructors+ can be combined, forming derived process+ constructors. For instance, <span class="emphasis"><em>sourceSY</em></span> is+ the result of combining+ <span class="emphasis"><em>delaySY<sub>1</sub></em></span> (normally+ denoted simply as <span class="emphasis"><em>delaSY</em></span>) and+ <span class="emphasis"><em>mapSY</em></span>.+ </p><div class="figure"><a name="sourceSY"></a><p class="title"><b>Figure 6. The <span class="emphasis"><em>sourceSY</em></span> derived process constructor</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="450"><tr><td align="center" valign="middle"><object data="figures/sourceSY.svg" type="image/svg+xml" width="450" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ <span class="emphasis"><em>sourceSY</em></span> takes an initial value <span class="emphasis"><em>s<sub>0</sub></em></span>+ and a function <span class="emphasis"><em>f</em></span>, and creates a sequential process with no+ inputs and just one output, resulting from the reiterated application of <span class="emphasis"><em>f</em></span>+ to <span class="emphasis"><em>s<sub>0</sub></em></span>.+ </p><p>+ For example, <span class="emphasis"><em>sourceSY</em></span>(1,(+1)), is a+ counter with <span class="emphasis"><em>1</em></span> as its initial value.+ </p><p>+ ForSyDe supplies many other process constructors (e.g. <code class="code">zipWithSY</code>, <code class="code">mealySY</code> ...). However, a thoroughly description+ is out of the scope of this tutorial. + </p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1251871"></a>3.4. Models of Computation and Domain Interfaces</h3></div></div></div><p>+ A <span class="emphasis"><em>Model of Computation</em></span> (MoC), also known+ as <span class="emphasis"><em>Computational Model</em></span>, establishes a set of+ constraints on the possible processes and signals contained by+ a system. A system is said to belong to certain+ <span class="emphasis"><em>MoC</em></span> if it satisfies its+ constraints. + </p><p>+ The behaviour of a process is observed in its+ <span class="emphasis"><em>evaluation</em></span>. The evaluation is divided+ in atomic steps called <span class="emphasis"><em>evaluation+ cycles</em></span>, during which the process produces and+ consumes signal values. MoCs specify how and when evaluation+ cycles are fired.+ </p><p>+ ForSyDe currently offers 3 MoCs.+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ The <span class="strong"><strong>Synchronous MoC</strong></span> was+ already mentioned in previous section. All systems+ contain an implicit global clock. Its cycle matches+ the evaluation cycle of all the system processes, during which+ they must consume and produce exactly one value on every+ input and output signal.+ </p></li><li><p>+ <span class="strong"><strong>Untimed+ MoC</strong></span>. Communication between processes can be+ thought as a specific variant of asynchronous, blocking+ message passing. There is no notion of time or global+ clock.+ </p><p>+ Contrary to the Synchronous MoC, in which all the system+ processes evaluate in parallel during every cycle,+ untimed processes are fired individually. A process only+ evaluates when all their inputs have a minimum number of+ values ready to be read. That number may vary between+ inputs, but is fixed for each of them. On the other hand,+ the number of values produced by output signals + may vary independently between evaluation cycles.+ </p></li><li><p>+ The <span class="strong"><strong>Continuous MoC</strong></span>+ models continuous signals representing them as+ continuous one-variable, piecewise functions.+ </p><div class="figure"><a name="id1252356"></a><p class="title"><b>Figure 7. Continuous signal</b></p><div class="figure-contents">+ < (sin(x),[-10,0)), (-sin(x),[0,10)) >+ <div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="360"><tr><td align="center" valign="middle"><object data="figures/piecewise_sin.svg" type="image/svg+xml" width="360" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"></li></ul></div><p>+ ForSyDe specifies a set of process constructors for each MoC. A+ ForSyDe system is thus guaranteed to belong to a MoC if it was+ built using constructors from one of those sets.+ </p><p>+ Nevertheless, it is possible to build heterogeneous systems,+ i.e. systems which mix different MoCs. For that purpose,+ ForSyDe provides special<sup>[<a name="id1252412" href="#ftn.id1252412" class="footnote">3</a>]</sup> processes in+ charge of connecting two subsystems which belong to different+ MoCs or which have different timing specifications (e.g. two+ Synchronous subsystems with a different clock period).+ </p></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="DEvsSE"></a>4. Deep-embedded vs Shallow-embedded signals</h2></div></div></div><p>+ As we already mentioned, ForSyDe is implemented as a+ Domain Specific Embedded Language (DSL) on top of Haskell.+ Actually, ForSyDe offers two different DSL flavours+ according to how signals are modelled.+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ <span class="strong"><strong>Shallow-embedded signals</strong></span>+ (<a class="ulink" href="http://hackage.haskell.org/packages/archive/ForSyDe/3.0/doc/html/ForSyDe-Shallow-Signal.htm" target="_top"><code class="code">ForSyDe.Shallow.Signal</code></a>)+ are modelled as streams of data isomorphic to lists.+ </p><pre class="programlisting">+data Signal a = NullS | a :- Signal a+ </pre><p>+ Systems built with them are unfortunately restricted to+ simulation, however, shallow-embedded signals provide a+ rapid-prototyping framework with which to experiment with+ Models of Computation.+ </p></li><li><p>+ <span class="strong"><strong>Deep-embedded signals</strong></span>+ (<a class="ulink" href="http://hackage.haskell.org/packages/archive/ForSyDe/3.0/doc/html/ForSyDe-Signal.htm" target="_top"><code class="code">ForSyDe.Signal</code></a>)+ are used in a similar way to shallow-embedded signals but+ are modelled as an abstract data type which, transparently+ to the end user, keeps track of the system+ structure<sup>[<a name="id1252502" href="#ftn.id1252502" class="footnote">4</a>]</sup>. Based on that structural+ information, ForSyDe's embedded compiler can perform+ different analysis and transformations such as simulating+ the system or translating it to other target languages+ (e.g. VHDL and GraphML).+ </p><p>+ As a drawback, the deep-embedded API can only currently+ build systems belonging to the Synchronous MoC and domain+ interfaces are not yet supported. This limitation is,+ however, likely to change in the future.+ </p></li></ul></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="DE"></a>5. Using deep-embedded Signals</h2></div></div></div><p>+ In this section we go through a few simple sample systems+ built with ForSyDe's deep-embedded API. We will create both+ combinational and sequential systems all belonging to the+ Synchronous MoC (the only MoC currently supported by this API).+ </p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="combinational"></a>5.1. Combinational Systems</h3></div></div></div><p>+ A system or process is combinational if its outputs are+ stateless, i.e. they don't depend on past system events.+ </p><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="plus1"></a>5.1.1. A naive combinational system: <span class="emphasis"><em>plus1</em></span></h4></div></div></div><p>+ We are going to implement <span class="emphasis"><em>plus1</em></span>, ForSyDe's <span class="emphasis"><em>Hello World</em></span>, a+ system with takes integer values, adds 1 to them and forwards the result+ through its output signal.+ </p><p>+ As we mentioned previously, the <span class="emphasis"><em>plus1</em></span>+ process can be created in terms of the+ <span class="emphasis"><em>mapSY</em></span> process constructor. Here is the+ signature of <code class="code">mapSY</code> in the deep-embedded API.+ </p><pre class="programlisting">+mapSY :: (ProcType a, ProcType b) =>+ ProcId -> ProcFun (a -> b) -> Signal a -> Signal b + </pre><p>+ <code class="code">mapSY</code> works similarly to Haskell's+ <code class="code">map</code> function. It creates a process which applies a+ function to every value in a signal. Let's have a closer look+ at its arguments.+ </p><div class="variablelist"><dl><dt><span class="term"><code class="code">ProcId</code></span></dt><dd>+ The process identifier, simply a textual tag which+ univocally identifies the process created (<code class="code">type ProcId+ = String</code>).+ </dd><dt><span class="term"><code class="code">ProcFun (a->b)</code></span></dt><dd><p>+ A process function. The function which will be applied to every element in the input signal. In the+ case of <code class="code">plus1</code> we will need a function computationally equivalent to <code class="code">(+1)</code>.+ </p><p>+ Both <code class="code">a</code> and <code class="code">b</code> must be instances+ of <code class="code">ProcType</code> (read Process Type).+ <code class="code">ProcType</code> is used by ForSyDe's embedded+ compiler to extract type and structure information of expressions. + </p></dd><dt><span class="term"><code class="code">Signal a</code></span></dt><dd>+ Input signal.+ </dd><dt><span class="term"><code class="code">Signal b</code></span></dt><dd>+ Output signal.+ </dd></dl></div>+ + + Now, we are ready to start implementing <span class="emphasis"><em>plus1</em></span>.+ + <pre class="programlisting">+{-# LANGUAGE TemplateHaskell #-}+module Plus1 where++import ForSyDe+import Data.Int (Int32)+ </pre><p>+ We need to import ForSyDe's library and+ <code class="code">Int32</code>. Since deep-embedded systems might be+ later translated to hardware, it is required to be specific+ about the size of integers used (the size of <code class="code">Int</code> is+ platform-specific). Additionally, in all ForSyDe+ deep-embedded designs we need to tell GHC to enable the <a class="ulink" href="http://www.haskell.org/th/" target="_top">Template+ Haskell</a> (TH) extension, here is why:+ </p><pre class="programlisting">+-- A process function which adds one to its input+addOnef :: ProcFun (Int32 -> Int32)+addOnef = $(newProcFun [d|addOnef :: Int32 -> Int32 + addOnef n = n + 1 |])+ </pre><p>+ In the code above, we declared the <code class="code">ProcFun</code> needed+ by <code class="code">mapSY</code>. It simply takes an <code class="code">Int32</code> value+ and adds 1 to it.+ </p><p>+ Instead of creating a specific DSL to express computations+ in the deep-embedded model, ForSyDe uses TH to allow using+ plain Haskell. In principle, <code class="code">ProcFun</code>s can make+ use of any Haskell feature supported by TH. However, such+ features might not be supported or make sense for certain+ backends (e.g. lists and thus, list comprehensions, are+ difficult to support in VHDL). Thus, in this tutorial we will+ create systems which are compatible with every backend. For example,+ writing <code class="code">addOnef = (+1)</code> instead of <code class="code">addOnef n = n +1</code>+ is more compact, however the VHDL backend does not currently support+ sections nor points-free notation.+ </p><p>+ In order to use ForSyDe it is not vital to understand what is+ really happening, but, for those curious about it, here is how+ the TH trick works. First, the <code class="code">[d| .. |]</code> brackets+ enclosing the function declaration lift its AST (Abstract+ Syntax Tree). Then, the AST is used by <code class="code">newProcFun</code>+ to splice (expand in TH's terminology) a <code class="code">ProcFun</code>.+ It is important to note that everything happens at compile-time.+ </p><p>+ Here is the rest of the system definition. + </p><pre class="programlisting">+-- System function (simply a process in this case) which uses addOnef+plus1Proc :: Signal Int32 -> Signal Int32+plus1Proc = mapSY "plus1Proc" addOnef+++-- System definition associated to the system function+plus1SysDef :: SysDef (Signal Int32 -> Signal Int32)+plus1SysDef = newSysDef plus1Proc "plus1" ["inSignal"] ["outSignal"]+ </pre><p>+ First, we use <code class="code">mapSY</code> to create process. Then we create the final definition+ of the <span class="emphasis"><em>plus1</em></span> system with <code class="code">newSysDef</code>. Here is its type signature.+ </p><pre class="programlisting">+newSysDef :: (SysFun f) => f -> SysId -> [PortId] -> [PortId] -> SysDef f+ </pre><div class="variablelist"><dl><dt><span class="term"><code class="code">f</code></span></dt><dd>+ A <code class="code">SysFun</code> (system function) describing the+ system. It results from the combination of one or more+ processes. ForSyDe uses a trick similar to <a class="ulink" href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Text-Printf.html" target="_top"><code class="code">Text.Printf</code></a>+ in order to emulate variadic functions (different systems+ are obviously allowed to have different number of inputs+ and outputs).+ </dd><dt><span class="term"><code class="code">SysId</code></span></dt><dd>+ Textual tag identifying the system. <code class="code">type SysId = String</code>.+ </dd><dt><span class="term"><code class="code">[PortId]</code></span></dt><dd>+ List of port identifiers for the system inputs and outputs. <code class="code">type PortId = String</code>.+ </dd></dl></div><p>+ Now we can simulate our system, or, as we will see later on, translate it to VHDL or GraphML.+ </p><pre class="programlisting">+simulate :: SysFunToSimFun sysFun simFun => SysDef sysFun -> simFun+ </pre><p>+ <code class="code">simulate</code> transforms our system definition into a+ list-based function with the help of a multiparameter+ typeclass, <code class="code">SysFunToSimFun</code>, in charge of+ implementing the <span class="emphasis"><em>type-level</em></span> translation of the system+ signals to lists.+ </p><pre class="screen">+<code class="prompt">$</code> ghci Plus1.hs+<code class="prompt">*Plus1></code> let simPlus1 = simulate plus1SysDef +<code class="prompt">*Plus1></code> :t simPlus1+simPlus1 :: [Int32] -> [Int32]+<code class="prompt">*Plus1></code> simPlus1 [1..10]+[2,3,4,5,6,7,8,9,10,11]+ </pre><p>+ Simulation is lazy, allowing to work with infinite signals.+ </p><pre class="screen">+<code class="prompt">*Plus1></code> take 10 $ simPlus1 [1,1..] +[2,2,2,2,2,2,2,2,2,2]+ </pre><p>+ It is important to remark that ForSyDe does not support+ systems containing <span class="emphasis"><em>combinational loops</em></span>.+ If such a loop is found, an error will be reported.+ </p><p>+ For example, here is a system containing a combinational+ loop, built with a mutually recursive call between two+ processes adding one to their inputs.+ </p><pre class="programlisting">+combLoopSysDef :: SysDef (Signal Int32)+combLoopSysDef = newSysDef s "combLoop" [] ["out"] + where s = mapSY "addOne1" addOnef s'+ s' = mapSY "addOne2" addOnef s+ </pre><p>+ As we mentioned, <code class="code">combLoopSysDef</code> cannot be simulated.+ </p><pre class="screen">+*Plus1> simulate combLoopSysDef +*** Exception: detected combinational loop+ </pre></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id1253066"></a>5.1.2. Keypad encoder</h4></div></div></div><p>+ Here is a slightly more complex example. We have a keypad with+ 4 arrow buttons connected to our synchronous system. The+ key-presses are sent in the form of a 4-bit vector. Each bit+ indicates whether the corresponding button is pressed (high+ value) or not (low value) according to the diagram below.+ </p><div class="figure"><a name="encoderfig"></a><p class="title"><b>Figure 8. Keypad encoder</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="225"><tr><td align="center" valign="middle"><object data="figures/encoder.svg" type="image/svg+xml" width="225" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ In order to work more comfortably and forget about multiple+ key-strokes at once, we want to encode each key-press event+ with a specific Haskell type: <code class="code">data Direction = Left |+ Down | Right | Up</code>.+ </p><p>+ Of course, keys are not necessarily pressed all the time.+ Thus, instead of encoding the input vector into a signal of+ <code class="code">Direction</code> we will output signals of+ <code class="code">AbstExt Direction</code>.+ </p><pre class="programlisting">+data AbstExt a = Abst | Prst a+ </pre><p>+ <code class="code">AbstExt</code> (read absent-extended) is ForSyDe's+ equivalent to the popular Haskell type <code class="code">Maybe</code>.+ It is used to introduce absent values in signals, in our+ particular case it will denote an absence of key presses.+ </p>++ + Here is the definition of <code class="code">Direction</code> together with+ the necessary imports for the definition of the whole system.++ + <pre class="programlisting">+{-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}+module Encoder where++import ForSyDe+import Language.Haskell.TH.Lift (deriveLift1)++import Prelude hiding (Left, Right)+import Data.Generics (Data,Typeable)+import Data.Param.FSVec+import Data.TypeLevel.Num hiding ((==))+++data Direction = Left | Down | Right | Up+ deriving (Typeable, Data, Show)++$(deriveLift1 ''Direction)+ </pre><p>+ There are a few things worth remarking+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ Since we are defining new constructors named <code class="code">Left</code> and <code class="code">Right</code>, to avoid clashes+ with the identically-named constructors of <code class="code">Either</code> we hide their import from+ the <code class="code">Prelude</code>.+ </p></li><li><p>+ We are defining a custom enumerated+ datatype<sup>[<a name="id1253225" href="#ftn.id1253225" class="footnote">5</a>]</sup> (<code class="code">Direction</code>)+ whose values will be carried by system signals. All+ the values used in a system, and+ <code class="code">Direction</code> in particular, must be+ instances of the private typeclass+ <code class="code">ProcType</code>.+ </p><pre class="programlisting">+class (Data a, Lift a) => ProcType a++-- Some existing (overlapping) instances of ProcType+instance (Data a, Lift a) => ProcType a+instance ProcType a => ProcType (AbstExt a)+instance (ProcType a, ProcType b) => ProcType (a,b)+... + </pre><p>+ The <code class="code">ProcType</code> constraint is required,+ among other reasons, to provide type and structural+ information of datatypes to ForSyDe's embedded+ compiler. The overlapping instances are needed to+ obtain datatype information regardless of + the nesting of values in other supported datastructures.+ </p><p>+ Due to the <code class="code">(Data a, Lift a) => ProcType a</code>+ instance all we need to do in order to use our custom+ enumerated datatypes with ForSyDe is creating+ instances of <code class="code">Data</code> (which implicitly+ requires an instantiation of <code class="code">Typeable</code>)+ and Template Haskell's <code class="code">Lift</code> class.+ </p><p>+ Fortunately, thanks to a GHC extension it is possible+ to derive instances for <code class="code">Typeable</code> and+ <code class="code">Data</code> (hence the+ <code class="code">DeriveDataTypeable</code> language+ pragma). Additionally, ForSyDe provides a Template+ Haskell module+ <code class="code">Language.Haskell.TH.Lift</code><sup>[<a name="id1253310" href="#ftn.id1253310" class="footnote">6</a>]</sup> to automatically generate+ instances of <code class="code">Lift</code>. In this case, since we+ needed to instantiate a single datatype, we used+ <code class="code">deriveLift1</code>.+ </p></li><li><p>+ The rest of the imports (<code class="code">Data.Param.FSVec</code>+ and <code class="code">Data.TypeLevel.Num</code>) come from the+ <a class="ulink" href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/parameterized-data" target="_top"><code class="code">parameterized-data</code></a>+ and+ <a class="ulink" href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/type-level" target="_top"><code class="code">type-level</code></a>+ packages in order to support fixed-sized vectors.+ </p></li></ul></div><p>++ </p><p>+ Here is the code of the process function, needed to encode the button presses:+ </p><pre class="programlisting">+encoderFun :: ProcFun (FSVec D4 Bit -> AbstExt Direction)+encoderFun = $(newProcFun + [d| encode :: FSVec D4 Bit -> AbstExt Direction+ encode v = if v ! d0 == H then Prst Left else+ if v ! d1 == H then Prst Down else+ if v ! d2 == H then Prst Right else+ if v ! d3 == H then Prst Up else Abst |])+ </pre><p>+ The code should be self-explanatory, it makes use of the+ type <code class="code">ForSyDe.Bit.Bit</code>, with data constructors+ <code class="code">L</code> (low) and <code class="code">H</code> (high), and of+ vectors of size 4 (hence the <code class="code">D4</code> type+ parameter). In order to get a deeper insight on how+ <code class="code">FSVec</code>s work, check <a class="xref" href="#FSVec" title="A. FSVecs: Vectors parameterized in size">Appendix A, <i><code class="literal">FSVec</code>s: Vectors parameterized in size</i></a>. It+ is important to note that the system does not take+ simultaneous key-strokes in account, choosing the direction+ with higher precedence (i.e. situated in the outermost <code class="code">if</code>+ expression). Also, using pattern matching with multiple+ function clauses instead of nested <code class="code">if</code>+ expressions would had been more clear. However, the VHDL+ backend currently only supports one clause.+ </p><p>+ Here is the remaining code needed to build the rest of the system.+ </p><pre class="programlisting">+encoderProc :: Signal (FSVec D4 Bit) -> Signal (AbstExt Direction)+encoderProc = mapSY "encoder" encoderFun++encoderSysDef :: SysDef (Signal (FSVec D4 Bit) -> Signal (AbstExt Direction))+encoderSysDef = newSysDef encoderProc "KeypadEncoder" ["arrowBits"] ["direction"] + </pre><p>+ Finally, we can evaluate some simulations.+ </p><pre class="screen">+<code class="prompt">$</code> ghci -XTemplateHaskell Encoder.hs+<code class="prompt">*Encoder></code> let simEncoder = simulate encoderSysDef +<code class="prompt">*Encoder></code> :t simEncoder+simEncoder :: [FSVec D4 Bit] -> [AbstExt Direction]+<code class="prompt">*Encoder></code> simEncoder [$(vectorTH [L,H,L,L]), $(vectorTH [L,L,L,L])]+[Down,_]+ </pre></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="sequential"></a>5.2. Sequential Systems</h3></div></div></div><p>+ Now we are going to have a look at a couple of sequential systems, whose outputs, contrary to combinational systems,+ can depend on the system history (i.e. can have a state).+ </p><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="counter"></a>5.2.1. A naive sequential system: <span class="emphasis"><em>counter</em></span></h4></div></div></div><p>+ Our goal is to generate a signal whose values match its tags+ or, more intuitively, a counter from 1 to infinity.+ </p><p>+ This is clearly a sequential system since its output signal+ is not stateless, each output value depends on the previous+ one.+ </p><pre class="programlisting">+{-# LANGUAGE TemplateHaskell #-}+module Counter where++import ForSyDe+import Data.Int (Int32)+import Plus1 (addOnef)++counterProc :: Signal Int32+counterProc = out'+ where out = mapSY "addOneProc" addOnef out'+ out' = delaySY "delayOne" 1 out++counterSysDef :: SysDef (Signal Int32)+counterSysDef = newSysDef counterProc "counter" [] ["count"]+ </pre><p>+ We reuse <code class="code">addOnef</code> from previous examples. The counter is built by the mutually recursive calls of+ <code class="code">mapSY</code> and <code class="code">delaySY</code> which should be interpreted as parallel equations.+ </p><p>+ Again, we can lazily simulate the system.+ </p><pre class="screen">+<code class="prompt">$</code> ghci Counter.hs+<code class="prompt">*Counter></code> :t simulate counterSysDef +simulate counterSysDef :: [Int32]+<code class="prompt">*Plus1></code> simulate counterSysDef+[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17+^C Interrupted+ </pre><p>+ Actually, the definition of <code class="code">counterProc</code> can be+ simplified by using <code class="code">sourceSY</code>, getting the following+ equivalent declaration.+ </p><pre class="programlisting">+counterProc :: Signal Int32+counterProc = sourceSY "counterProc" addOnef 1+ </pre></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id1253588"></a>5.2.2. Serial full adder</h4></div></div></div><p>+ A serial full adder which adds two streams of bits is a,+ still simple, but more elaborated example of a sequential+ system. Our system will receive pairs of bits which will be+ added together, taking the resulting carry of last cycle in+ account.+ </p><p>+ We are going to implement it as a Mealy FSM (Finite State Machine) following the diagram below.+ </p><div class="figure"><a name="fullAdderfig"></a><p class="title"><b>Figure 9. Full Adder: Mealy Machine</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="315"><tr><td align="center" valign="middle"><object data="figures/fullAdderMealy.svg" type="image/svg+xml" width="315" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ ForSyDe provides derived process constructors to implement FSMs, in this case we will be using+ <code class="code">mealySY</code>.+ </p><pre class="programlisting">+mealySY :: (ProcType c, ProcType b, ProcType a) =>+ ProcId+ -> ProcFun (a -> b -> a)+ -> ProcFun (a -> b -> c)+ -> a+ -> Signal b+ -> Signal c+ </pre><div class="variablelist"><dl><dt><span class="term"><code class="code">ProcId</code></span></dt><dd>+ The process identifier, used in the same way as in the+ rest of the process constructors+ (e.g. <code class="code">mapSY</code> and <code class="code">delaySY</code>).+ </dd><dt><span class="term"><code class="code">ProcFun (a- > b -> a)</code></span></dt><dd><p>+ A process function in charge of calculating next state+ based on current state and current input.+ </p></dd><dt><span class="term"><code class="code">ProcFun (a -> b -> c)</code></span></dt><dd><p>+ A process function in charge of calculating current output+ based on current state and current input.+ </p></dd><dt><span class="term"><code class="code">a</code></span></dt><dd><p>+ Initial state.+ </p></dd><dt><span class="term"><code class="code">Signal b</code></span></dt><dd>+ Input Signal.+ </dd><dt><span class="term"><code class="code">Signal c</code></span></dt><dd>+ Output Signal.+ </dd></dl></div><p>+ Here is the Haskell code, which should be straightforward to understand.+ </p><pre class="programlisting">+{-# LANGUAGE TemplateHaskell #-}+module FullAdder where++import ForSyDe++faNextState :: ProcFun (Bit -> (Bit,Bit) -> Bit)+faNextState = $(newProcFun+ [d| faNextState :: Bit -> (Bit,Bit) -> Bit+ faNextState st input =+ if st == L then+ case input of+ (H, H) -> H+ _ -> L+ else+ case input of+ (L,L) -> L+ _ -> H+ |])++faOut :: ProcFun (Bit -> (Bit,Bit) -> Bit)+faOut= $(newProcFun+ [d| faOut :: Bit -> (Bit,Bit) -> Bit+ faOut st input =+ if st == L then+ case input of+ (L, L) -> L+ (L, H) -> H+ (H, L) -> H+ (H, H) -> L+ else+ case input of+ (L, L) -> H+ (L, H) -> L+ (H, L) -> L+ (H, H) -> H+ |])+++faProc :: Signal (Bit,Bit) -> Signal Bit+faProc = mealySY "addProc" faNextState faOut L++faSysDef :: SysDef (Signal (Bit,Bit) -> Signal Bit)+faSysDef = newSysDef faProc "fullAdder" ["op1", "op2"] ["res"] + </pre>++ Here is a little test.++ <pre class="screen">+*FullAdder> let simfa = simulate faSysDef +*FullAdder> simfa [(L,L),(L,H),(H,H),(L,L)]+[L,H,L,H]+*FullAdder> + </pre></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="components"></a>5.3. Using components</h3></div></div></div><p>+ A desired characteristic of any system design language is+ the possibility of creating hierarchical models.+ </p><p>+ In ForSyDe's deep-embedded DSL, hierarchical design is implemented through components, let's see+ an example.+ </p><div class="figure"><a name="seqaddfour"></a><p class="title"><b>Figure 10. <span class="emphasis"><em>AddFour</em></span> system</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="540"><tr><td align="center" valign="middle"><object data="figures/SeqAddFour.svg" type="image/svg+xml" width="540" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ The system above which, admittedly, would not be of much use+ in the real world, adds 4 to its input in serial steps of 1.+ </p><p>+ Instead of creating 4 different processes and connecting them+ together, we can reuse the design of <span class="emphasis"><em>plus1</em></span>+ placing 4 identical components.+ </p><p>+ ForSyDe provides a primitive to create components or instances+ of a system: <code class="code">instantiate</code>.+ </p><pre class="programlisting">+instantiate :: (SysFun f) => ProcId -> SysDef f -> f+ </pre><p>+ <code class="code">instantiate</code> creates a component out of a system+ definition. A component can be considered a special process+ (hence the <code class="code">ProcId</code> parameter) containing an+ instance of its parent system (the system from which it is+ created).+ </p><p>+ Instances behave identically to their parents and can be combined with+ other system processes.+ </p><p>+ For example, here we create and simulate an instance of <span class="emphasis"><em>plus1</em></span>+ </p><pre class="screen">+$ ghci Plus1.hs+*Plus1> :t plus1SysDef+plus1SysDef :: SysDef (Signal Int32 -> Signal Int32)+*Plus1> let plus1Comp1 = instantiate "plus1_1" plus1SysDef +*Plus1> :t plus1Comp1+plus1SysDef :: Signal Int32 -> Signal Int32+*Plus1> let nestedPlus1 = newSysDef plus1Comp1 "nestedPlus1" ["in1"] ["out1"]+*Plus1> simulate nestedPlus1 $ [1,2,3,4]+[2,3,4,5]+ </pre><p>+ And here is the definition of the <span class="emphasis"><em>AddFour</em></span> system.+ </p><pre class="programlisting">+module AddFour where++import Plus1 (plus1SysDef)++import ForSyDe+import Data.Int (Int32)++addFourProc :: Signal Int32 -> Signal Int32+addFourProc = plus1Comp "plus1_1" .+ plus1Comp "plus1_2" .+ plus1Comp "plus1_3" .+ plus1Comp "plus1_4"+ where plus1Comp id = instantiate id plus1SysDef++addFourSysDef :: SysDef (Signal Int32 -> Signal Int32)+addFourSysDef = newSysDef addFourProc "addFour" ["in1"] ["out1"]+ </pre><p>+ Components, just like any other process, are functions over+ signals. This allows using all the combinatorial power of+ Haskell. In this particular case we have just used function+ composition.+ </p><p>+ Here is the general workflow of ForSyDe modelling, including+ the use of components.+ </p><div class="figure"><a name="cwf"></a><p class="title"><b>Figure 11. Component workflow</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="540"><tr><td align="center" valign="middle"><object data="figures/compflow.svg" type="image/svg+xml" width="540" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><div class="orderedlist"><ol type="1"><li><p>+ The designer describes computations using process functions (<code class="code">ProcFun</code>s).+ </p></li><li><p>+ Those process functions, possibly with other constants,+ are passed to process constructors in order to build+ processes which are combined together,+ creating the main process function.+ </p></li><li><p>+ The system function is transformed into a system definition by <code class="code">newSysDef</code>.+ </p></li><li><p>+ The system definition can be+ </p><div class="itemizedlist"><ul type="disc"><li>+ passed to ForSyDe's embedded compiler, capable of simulating or+ translating it to other target languages (VHDL or GraphML at the time being).+ </li><li>+ used to create components, bringing us back to step 2.+ </li></ul></div><p>+ </p></li></ol></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="VHDL"></a>5.4. VHDL Backend</h3></div></div></div><p>+ ForSyDe's embedded compiler is able to translate system definitions to VHDL. That is+ done through the <code class="code">writeVHDL</code>* functions.+ </p><pre class="programlisting">+writeVHDL :: SysDef a -> IO ()+writeVHDLOps :: VHDLOps -> SysDef a -> IO ()+ </pre><p>+ For example, this is how we would generate the VHDL definition+ of <span class="emphasis"><em>AddFour</em></span> and write it to disk.+ </p><pre class="screen">+$ ghci AddFour.hs+*AddFour> writeVHDL addFourSysDef +*AddFour> :q+Leaving GHCi.+$ ls -R addFour+vhdl++addFour/vhdl:+addFour_lib work++addFour/vhdl/addFour_lib:+addFour_lib.vhd++addFour/vhdl/work:+addFour.vhd plus1.vhd+ </pre><p>+ Here is a diagram of the filetree generated for <code class="code">addFour</code>.+ </p><div class="figure"><a name="VHDLTree"></a><p class="title"><b>Figure 12. VHDL filetree of <code class="code">addFour</code></b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="315"><tr><td align="center" valign="middle"><object data="figures/VHDLTree.svg" type="image/svg+xml" width="315" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ <code class="code">writeVHDL</code> generates a VHDL filetree pending from current+ working directory. Assuming <code class="code">$SYSNAME</code> is the+ system's name (<code class="code">addFour</code> in this particular case):+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ The main VHDL entity and architecture is written in <code class="code">$SYSNAME/vhdl/work/$SYSNAME.vhdl</code>.+ </p></li><li><p>+ The VHDL translation of other systems included through component instantiation is also written under+ <code class="code">$SYSNAME/vhdl/work/</code>. In the case of the <code class="code">addFour</code> system, the compiler also+ generates the file <code class="code">plus1.vhd</code>.+ </p></li><li><p>+ A global VHDL library, <code class="code">forsyde_lib.vhd</code>, is+ bundled with ForSyDe's distribution and contains the+ translation of basic monomorphic Haskell types to VHDL. It+ is installed under the <code class="code">data</code> directory of+ ForSyDe's Cabal package, whose location is+ system-dependent.+ </p></li><li><p>+ Since VHDL lacks support for <span class="emphasis"><em>parametric+ polymorphism</em></span>, the translation of polymorphic+ types and functions is done on a per-system basis+ (i.e. each different possible monotype of a polymorphic+ Haskell type triggers a different translation). Thus, the+ result of that translation is put in+ <code class="code">$SYSNAME/vhdl/lib/$SYSNAME_lib.vhd</code> and not+ <code class="code">forsyde_lib.vhd</code>.+ </p></li></ul></div><p>+ It is important to remember that, even if ForSyDe signals are polymorphic and+ <code class="code">ProcFun</code>s can include any Haskell function definition, + some backends might be limited. In the case of the VHDL backend:+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ Accepted <code class="code">Signal</code> types. <code class="code">Signal a</code> is a valid+ signal for the VHDL backend if <code class="code">a</code> belongs to:+ </p><div class="orderedlist"><ol type="1"><li><p>+ Primitive types: <code class="code">Data.Int</code>{<code class="code">8</code>, <code class="code">16</code>, <code class="code">32</code>}, <code class="code">Bool</code>,+ <code class="code">ForSyDe.Bit</code>.+ </p></li><li><p>+ Custom types: enumerated<sup>[<a name="id1254317" href="#ftn.id1254317" class="footnote">7</a>]</sup> types.+ </p></li><li><p>+ The following containers, which can hold any primitive+ or custom type and can be unrestrictively nested:+ <code class="code">Data.Param.FSVec</code>, tuples of unlimited+ size<sup>[<a name="id1254337" href="#ftn.id1254337" class="footnote">8</a>]</sup>,+ </p></li></ol></div></li><li><p>+ Although this will hopefully change in the future, the+ declarations contained by <code class="code">ProcFun</code>s must+ be fairly simple. For instance:+ </p><div class="orderedlist"><ol type="1"><li><p>+ Points-free notation is not admitted.+ </p></li><li><p>+ They can only contain a clause, multiple clauses are not accepted.+ </p></li></ol></div></li></ul></div><p>+ Getting back to the function interface of the VHDL backend, it+ is possible to provide certain compilation options, namely to+ integrate Altera's <span class="emphasis"><em>Quartus II</em></span> and+ <span class="emphasis"><em>Modelsim</em></span> in our workflow. For that+ purpose we will use <code class="code">writeVHDLOps</code>.+ </p><p>+ For example, we can generate a <code class="code">Quartus II</code> project+ and compile the generated VHDL code setting certain configuration+ options such as the pin-mapping and the FGPA model to be used.+ </p><pre class="programlisting">+compileQuartus :: IO ()+compileQuartus = writeVHDLOps vhdlOps addFourSysDef+ where vhdlOps = defaultVHDLOps{execQuartus=Just quartusOps}+ quartusOps = QuartusOps{action=FullCompilation,+ fMax=Just 50, -- in MHz+ fpgaFamiliyDevice=Just ("CycloneII",+ Just "EP2C35F672C6"),+ -- Three sample pin assignments+ pinAssigs=[("in1[0]", "PIN_W1"),+ ("in1[1]", "PIN_W2"),+ ("in1[2]", "PIN_W3")]}+ </pre><p>+ The code above generates the VHDL code for the+ <code class="code">addFour</code> system, subsequently creating a Quartus+ project and running a full compilation of the project. We set+ a minimum acceptable clock frequency of 50 MHz, the FPGA+ family (<code class="code">CycloneII</code>), specific device+ (<code class="code">EP2C35F672C6</code>) and some pin assignments, which,+ for briefness' sake are not sufficient.+ </p><p>+ It is important to note that, when needed, Quartus will+ split input and output port identifiers into several logical+ names corresponding to individual bits (e.g in1[0]). Thus, it+ might be necessary to open Quartus in order to find out what+ logical names to use in pin assignments.+ </p><p>+ In addition to <span class="emphasis"><em>Quartus II</em></span>, the VHDL+ backend is able to interface with+ <span class="emphasis"><em>ModelSim</em></span>. For example, the following+ function shows how can we automatically compile the generated+ VHDL code with ModelSim.+ </p><pre class="programlisting">+compileModelSim :: IO ()+compileModelSim = writeVHDLOps vhdlOps addFourSysDef+ where vhdlOps = defaultVHDLOps{compileModelsim=True}+ </pre><p>+ It is also possible to run test benches in ModelSim.+ </p><pre class="programlisting">+writeAndModelsimVHDL :: (SysFunToIOSimFun sysF simF) =>+ Maybe Int -> SysDef sysF -> simF+writeAndModelsimVHDLOps :: (SysFunToIOSimFun sysF simF) =>+ VHDLOps -> Maybe Int -> SysDef sysF -> simF+ </pre>+ + Here are two examples:+ + <pre class="screen">+$ ghci AddFour.hs+*AddFour> let vhdlSim = writeAndModelsimVHDL Nothing addFourSysDef +*AddFour> :t vhdlSim+vhdlSim :: [Int32] -> IO [Int32]+*AddFour> vhdlSim [1..10]+[4,5,6,7,8,9,10,11,12,13,14]+ </pre><p>+ In the example above, we simulate <code class="code">addFour</code> without supplying a limit in the number of cycles to+ simulate. <code class="code">writeAndModelsimVHDL</code> is strict, so, without a limit it will only work+ with finite input stimuli.+ </p><pre class="screen">+$ ghci Counter.hs+*Counter> writeAndModelsimVHDL (Just 20) counterSysDef+[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] + </pre><p>+ In this case the system does not have any inputs and thus the simulation implicitly results in infinite+ output stimuli. Thus, it is necessary to set a limit in the number of cycles to simulate.+ </p><p>+ In a general way, the <code class="code">writeAndModelsimVHDL</code>* functions, generate a+ simulation function which will+ </p><div class="orderedlist"><ol type="1"><li><p>+ Generate a VHDL model (implicitly using the+ <code class="code">writeVHDL</code>* functions).+ </p></li><li><p>+ Compile the resulting model with ModelSim. + </p></li><li><p>+ Marshal the provided input stimuli from Haskell to VHDL+ and generate a testbench in+ <code class="code">$SYSNAME/vhdl/test/$SYSNAME_tb.vhd</code>.+ </p></li><li><p>+ Simulate the testbench with ModelSim and unmarshal the+ results back to Haskell.+ </p></li></ol></div><p>+ <code class="code">writeAndModelsimVHDL</code>* give equivalent results to <code class="code">simulate</code>, with a few caveats.+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ <code class="code">writeAndModelsimVHDL</code>*, unlike+ <code class="code">simulate</code>, are strict, and thus do not+ support infinite stimuli. For that reason, it is+ possible to set the number of cycles to simulate+ (<code class="code">Maybe Int</code> parameter).+ </p></li><li><p>+ <code class="code">writeAndModelsimVHDL</code>* , provide <code class="code">IO</code> simulation functions+ whereas <code class="code">simulate</code> is pure.+ </p></li><li><p>+ <code class="code">writeAndModelsimVHDL</code>* suffer all the limitations of the VHDL backend whereas+ <code class="code">simulate</code> can cope with any system.+ </p></li></ul></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="GraphML"></a>5.5. GraphML Backend</h3></div></div></div><p>+ It is possible to use ForSyDe's GraphML backend in order to + </p><div class="orderedlist"><ol type="1"><li><p>+ Generate an XML-based intermediate representation of+ a system for further processing.+ </p></li><li><p>+ Obtain system diagrams.+ </p></li></ol></div><p>+ ForSyDe provides the following functions, similar to the ones of the VHDL backend. + </p><pre class="programlisting">+writeGraphML :: SysDef a -> IO ()+writeGraphMLOps :: GraphMLOps -> SysDef a -> IO ()+ </pre><p>+ For example, here is how we would generate the GraphML translation of <code class="code">addFour</code>+ </p><pre class="screen">+$ ghci AddFour.hs+*AddFour> writeGraphML addFourSysDef +*AddFour> :q+Leaving GHCi.+$ ls -R addFour+graphml++addFour/graphml:+addFour.graphml plus1.graphml+ </pre><p>+ As we can see, a <code class="code">.graphml</code> file is generated for each+ system involved. In this case, one for the main system+ (<code class="code">addFour.graphml</code>) and another one for <code class="code">plus1</code>+ which was instantiated by <code class="code">addFour</code>.+ </p><p>+ In order to embed ForSyDe metainformation, the GraphML backend+ makes use of the following <a class="ulink" href="http://graphml.graphdrawing.org/primer/graphml-primer.html#Attributes" target="_top">GraphML-Attributes</a>:+ </p><pre class="screen">+<key id="process_type" for="node" attr.name="process_type" attr.type="string"/>+<key id="value_arg" for="node" attr.name="value_arg" attr.type="string"/>+<key id="procfun_arg" for="node" attr.name="procfun_arg" attr.type="string"/>+<key id="instance_parent" for="node" attr.name="instance_parent" attr.type="string"/>+ </pre><p>+ The keys above are used to tag nodes in different ways.+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ <span class="strong"><strong><code class="code">process_type</code></strong></span> indicates what process constructor was used+ to create a process node or if the node is an input or output port. + </p></li><li><p>+ <span class="strong"><strong><code class="code">value_arg</code></strong></span> contains a value passed to a process+ constructor.+ </p></li><li><p>+ <span class="strong"><strong><code class="code">procfun_arg</code></strong></span> contains a value passed to a process+ constructor.+ </p></li><li><p>+ <span class="strong"><strong><code class="code">instance_parent</code></strong></span> is specific to component nodes+ and indicates the name of the parent system from which the component was instanciated.+ </p></li></ul></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id1254817"></a>5.5.1. Obtaining diagrams of ForSyDe</h4></div></div></div><p>+ The GraphML definition does not provide a way to specify the+ graphical representation of graphs (e.g. edge and node+ shapes, colours, textual tags ...)+ </p><p>+ For that reason, <a class="ulink" href="http://www.yworks.com" target="_top"><span class="emphasis"><em>yWorks</em></span></a>, a company+ offering graph visualization products, created yFiles-GraphML, an extension to the GraphML+ schema which adds graphical information. + </p><p>+ yWorks also distributes <a class="ulink" href="http://www.yworks.com/en/products_yed_about.html" target="_top"><span class="emphasis"><em>yEd</em></span></a>,+ a free (as in beer) multiplatform graph editor with+ impressive automatic layout features.+ </p><p>+ Here is an example on how to generate and edit+ yFiles-GraphML diagrams from ForSyDe systems. For this+ purpose, we will use our <span class="emphasis"><em>counter</em></span> system.+ </p><pre class="screen">+$ ghci Counter.hs+*Counter> writeGraphMLOps defaultGraphMLOps{yFilesMarkup=True} counterSysDef +*Counter> :q+$ ls -R counter+graphml++counter/graphml:+counter.graphml sourceSY_counterProc.graphml+ </pre><p>+ <code class="code">sourceSY_counterProc.graphml</code> contains the <span class="emphasis"><em>sourceSY</em></span> process+ used in the counter. Let's view its representation with yEd.+ </p><p>+ This is the unorganized representation we get right after opening <code class="code">sourceSY_counterProc.graphml</code>+ with yEd.+ </p><div class="figure"><a name="sourceSY_counterProc1"></a><p class="title"><b>Figure 13. Initial yEd representation</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="225"><tr><td align="center" valign="middle"><object data="figures/sourceSY_counterProc1.svg" type="image/svg+xml" width="225" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"><p>+ All nodes are overlapped because the GraphML-yFiles backend+ does not perform any kind of node placement nor edge+ routing. yEd, however, does a very good job in this regard.+ </p><p>+ Before running a layout algorithm it is convenient to set+ port constraints on the graph nodes. This is a workaround to+ make yEd faithfully represent shared signals+ (signals coming from the same process output), otherwise yEd+ will treat them as different outputs. The GraphML format+ (and GraphML-yFiles) allows edge sharing through the use of+ <a class="link" href=""><span class="emphasis"><em>ports</em></span></a>,+ however, yEd does not currently respect them. Our current+ solution is to set a location for the edge ends in the+ GraphML backend and lock that location through yEd port+ constraints.+ </p><p>+ In order to set the port constraints we will go to+ <span class="emphasis"><em>Tools -> Constraints -> Port+ Constraints</em></span>.+ </p><p>+ The port constraints menu will initially look like this.+ </p><div class="figure"><a name="portConstraints1"></a><p class="title"><b>Figure 14. Port constraints default options</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="360"><tr><td align="center" valign="middle"><img src="figures/portConstraints1.png" align="middle" width="360" alt="Port constraints default options"></td></tr></table></div></div></div><br class="figure-break"><p>+ These are the options we need to set in order to fix all+ ports. Remember to click on OK after setting them.+ </p><div class="figure"><a name="portConstraints2"></a><p class="title"><b>Figure 15. Desired port constraint options</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="360"><tr><td align="center" valign="middle"><img src="figures/portConstraints2.png" align="middle" width="360" alt="Desired port constraint options"></td></tr></table></div></div></div><br class="figure-break"><p>+ It is important to note that due to a bug in yFiles format+ it is not possible to save port constraints in <code class="code">.graphml</code> files. Thus,+ we will need to reset the port constraints every time a file is reopened.+ </p><p>+ Now we are ready to run an automatic layout algorithm. The+ generated GraphML-yFiles graph is prepared to be displayed+ from left to right. The hierarchical layout+ (<span class="emphasis"><em>Layout -> Hierarchical -> Classic</em></span>)+ seems to give the best results for system diagrams. It is+ important to set the Orientation to <span class="emphasis"><em>Left to+ Right</em></span> and allow <span class="emphasis"><em>Backloop Routing</em></span>.+ </p><div class="figure"><a name="layout"></a><p class="title"><b>Figure 16. hierarchical layout</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="360"><tr><td align="center" valign="middle"><img src="figures/layout.png" align="middle" width="360" alt="hierarchical layout"></td></tr></table></div></div></div><br class="figure-break">+ + After clicking on <span class="emphasis"><em>OK</em></span>, the system diagram should look like this:++ <div class="figure"><a name="sourceSY_counterProc2"></a><p class="title"><b>Figure 17. Final yEd representation</b></p><div class="figure-contents"><div class="mediaobject" align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0" width="450"><tr><td align="center" valign="middle"><object data="figures/sourceSY_counterProc2.svg" type="image/svg+xml" width="450" align="middle"></object></td></tr></table></div></div></div><br class="figure-break"></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id1255153"></a>5.5.2. GraphML limitations</h4></div></div></div><p>+ Unfortunately, GraphML nor yFiles-GraphML + yEd suit all ForSyDe needs: + </p><div class="itemizedlist"><ul type="disc"><li><p>+ yFiles does not respect GraphML ports (source signal+ sharing). We provide a workaround based on precalculate+ the location of edge ends plus yEd routing port constraints+ (which unfortunately cannot be saved).+ </p></li><li><p>+ yEd wipes out external <code class="code"><data></code> tags+ (external GraphML attributes). That includes ForSyDe's+ metainformation, which will be lost after editing the+ graph with yEd.+ </p></li><li><p>+ GraphML nor yFiles-GraphML explicitly support subgraphs+ but not subgraph sharing (components). Our solution is+ to use external <data> tags indicating parent+ systems in instance nodes. However, yEd is obviously+ unaware of that trick, not being able to offer+ hierarchical browsing.+ </p></li></ul></div></div></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="SE"></a>6. Shallow-embedded signals</h2></div></div></div><p>+ As it was previously mentioned, ForSyDe offers a flavour of+ signals called shallow-embedded signals, modelled as+ streams of data:+ </p><pre class="programlisting">+data Signal a = NullS | a :- Signal a+ </pre><p>+ This representation offers some advantages:+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ Rapid prototyping of systems.+ </p></li><li><p>+ It is easy to include new MoCs.+ </p></li><li><p>+ It supports all the MoCs covered by ForSyDe (Synchronous, Untimed and Continuous). + </p></li></ul></div><p>+ Shallow-embedded signals also present some disadvantages:+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ Systems built with them can only be+ simulated. Shallow-embedded signals don't contain any+ structural information. Thus, the models resulting from them+ cannot be analyzed or compiled to other target languages.+ </p></li><li><p>+ No support for components. However, they are not really needed, components are not+ useful for simulation and reusability can be achieved by function refactoring.+ </p></li></ul></div><p>+ Here is the implementation of <span class="emphasis"><em>plus1</em></span> using shallow-embedded signals. + </p><pre class="programlisting">+module Plus1Shallow where++import ForSyDe.Shallow++import Data.Int(Int32)++plus1 :: Signal Int32 -> Signal Int32+plus1 = mapSY (+1)+ </pre><p>+ The system can be simulated directly simply by calling <span class="emphasis"><em>plus1</em></span>.+ </p><pre class="screen">+$ ghci Plus1Shallow.hs+*Plus1Shallow> :t signal+signal :: [a] -> Signal a+*Plus1Shallow> plus1 (signal [1..10])+{2,3,4,5,6,7,8,9,10,11}+ </pre><p>+ We can also integrate deep-embedded models into shallow-embedded+ ones by using <code class="code">simulate</code>, <code class="code">signal</code> and+ <code class="code">fromSignal</code> (the inverse of <code class="code">signal</code>).+ In the example below, we use the deep-embedded+ <code class="code">addFour</code> system and the shallow-embedded+ <code class="code">plus1</code> to build <span class="emphasis"><em>plus5</em></span>+ </p><pre class="programlisting">+module Plus5 where++import Plus1Shallow+import AddFour++import ForSyDe (simulate)+import ForSyDe.Shallow++import Data.Int (Int32)++plus5 :: Signal Int32 -> Signal Int32+plus5 = plus1 . signal . simulate addFourSysDef . fromSignal+ </pre><pre class="screen">+$ ghci Plus5.hs +*Plus5> plus5 (signal [1..10])+{6,7,8,9,10,11,12,13,14,15}+ </pre></div><div class="appendix" lang="en"><h2 class="title" style="clear: both"><a name="FSVec"></a>A. <code class="literal">FSVec</code>s: Vectors parameterized in size</h2><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1255404"></a>1. Goal</h3></div></div></div><p>+ We would like to numerically parameterize vectors using their+ length in order to implement fixed-sized vectors+ (<code class="code">FSVec</code>). Ideally, we would like to be able to+ implement something similar to this:+ </p><pre class="programlisting">+v :: FSVec 23 Int -- Not Haskell + </pre><p>+ <code class="code">v</code> would be a a vector containing 23 <code class="code">Int</code>s. Note it+ is not possible to directly do this in Haskell.+ </p><p>+ The vector concatenation function would be something along the lines of:+ </p><pre class="programlisting">+(++) :: FSVec s1 a -> FSVec s2 a -> FSVec (s1+s2) a -- Again, not valid Haskell+ </pre><p>+ We would also like to establish static security constraints on+ functions. Those constrains would be checked at compile time+ guaranteeing a correct behaviour during runtime. For instance.+ </p><pre class="programlisting">+head :: FSVec (s > 0) a -> FSVec (s - 1) a -- Not Haskell+ </pre><p>+ However, Haskell does not support dependent types (a numerically+ parameterized-vector is in practice a dependent type) nor type-level+ lambdas directly. Yet, it is still possible to implement our <code class="code">FSVec</code>+ type using Haskell plus a few GHC extensions.+ </p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1255478"></a>2. How?</h3></div></div></div><p>+ Before diving into the details, let me spoil the final result:+ </p><pre class="programlisting">+v :: FSVec D23 Int++(++) :: (Nat s1, Nat s2, Add s1 s2 s3) => FSVec s1 a -> FSVec s2 a -> FSVec s3 a++head :: Pos s => FSVec s a -> a+ </pre><p>+ The code is a bit more verbose that the pseudo-Haskell code of+ previous section, but note that <span class="strong"><strong>it+ is</strong></span> Haskell code (using the Multiparameter class+ extension).+ </p><p>+ The trick is to emulate the parameters using type-level decimal+ numerals. But, What is that?+ </p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1255502"></a>3. Type-level decimal numerals</h3></div></div></div><p>+ We already mentioned that the trick is to use types to represent the size of+ the vector. So, we want a type parameter to represent a number, but, How?+ </p><pre class="programlisting">+-- Numerical digits+data D0 -- empty type (supported by a EmptyDataDecls GHC extension, + -- we could have included a phony constructor otherwise)+data D1+data D2+..+data D9++data a :* b -- connective to build multidigit numerals (empty again)+ -- note that the type constructor is infix (GHC TypeOperators extension)+ </pre><p>+ Using the definitions above we can represent arbitrarily-sized natural+ numbers. Some examples:+ </p><div class="segmentedlist"><table border="0"><thead><tr class="segtitle"><th>Number</th><th>Type-level representation</th></tr></thead><tbody><tr class="seglistitem"><td class="seg">0</td><td class="seg"><code class="code">D0</code></td></tr><tr class="seglistitem"><td class="seg">13</td><td class="seg"><code class="code">D1 :* D3</code></td></tr><tr class="seglistitem"><td class="seg">1024</td><td class="seg"><code class="code">D1 :* D0 :* D2 :* D4</code></td></tr></tbody></table></div><p>+ It seems sensible, but very verbose. It would certainly be nicer to be+ able to express 0 as <code class="code">D0</code>, 13 as <code class="code">D13</code> and so on.+ </p><p>+ We solved the problem by using Template Haskell to generate+ type synonyms (aliases) up to <code class="code">D5000</code>. The same+ trick was used to emulate binaries (up to+ <code class="code">B10000000000</code>), octals (up to <code class="code">O10000</code>)+ and hexadecimals (up to <code class="code">H1000</code>):+ </p><pre class="screen">+$ ghci -XTypeOperators -XFlexibleContexts # Extensions used in different parts of this appendix+Prelude> :m +Data.TypeLevel+Prelude Data.TypeLevel> :i D124+type D124 = (D1 :* D2) :* D4+ -- Defined in Data.TypeLevel.Num.Aliases+Prelude Data.TypeLevel> :i HFF+type HFF = (D2 :* D5) :* D5+ -- Defined in Data.TypeLevel.Num.Aliases+Prelude Data.TypeLevel> :i B101+type B101 = D5 -- Defined in Data.TypeLevel.Num.Aliases+ </pre><p>+ Of course, if you want to use a numeral which is out of the+ aliases range, the only option is to use the verbose decimal+ representation (it shouldn't be the normal case though)+ </p><p>+ Similarly to <code class="code">D13</code>, <code class="code">D124</code> ...+ undercase value-level aliases (<code class="code">d12</code>,+ <code class="code">d123</code>, .. declared as <code class="code">undefined</code>)+ are generated in order to create type-level values.+ </p><pre class="screen">+Prelude Data.TypeLevel> :i d123+d123 :: (D1 :* D2) :* D3 -- Defined in Data.TypeLevel.Num.Aliases+ </pre><p>+ Fair enough. However, you might already have guessed that+ <code class="code">:*</code> can be used to construct ambiguous or+ not-normalized numerals, for instance:+ </p><pre class="programlisting">+D0 :* D0 :* D1 -- numeral with trailing zeros+(D1 :* D0) :* (D2 :* D2) -- malformed numeral+ </pre><p> + Now is when the natural (<code class="code">Nat</code>) and positive+ (<code class="code">Pos</code>) type-classes get in the game. We are+ going to omit the instances but, trust us, they guarantee+ that numerals are well-formed:+ </p><pre class="programlisting">+class Nat n where+ toNum :: Num a => n -> a++class Nat n => Pos n+ </pre><p>+ <code class="code">toNum</code> allows to pass the type-level numeral to value-level.+ </p><pre class="screen"> +Prelude Data.TypeLevel> toNum d123+123+-- a non-normalized numeral+Prelude Data.TypeLevel> toNum (undefined :: D0 :* D1)+<interactive>:1:0:+ No instance for (Data.TypeLevel.Num.Sets.PosI D0)+ arising from a use of `toNum' at <interactive>:1:0-28+ Possible fix:+ add an instance declaration for (Data.TypeLevel.Num.Sets.PosI D0)+ In the expression: toNum (undefined :: D0 :* D1)+ In the definition of `it': it = toNum (undefined :: D0 :* D1) + </pre><p>+ Based on the numerical representation we created, and using+ multiparameter type-classes, we can define type-level+ operations. The operations supported right now are:+ </p><div class="itemizedlist"><ul type="disc"><li><p>+ Arithmetic: Successor, Predecesor, Addition,+ Subtraction, Multiplication, Division, Modulus, Greatest+ Common Divisor, Exponentiation and Logarithm.+ </p></li><li><p>+ Comparison: trichotomy classification, (<), (>) (<=),+ (>=), (==), Minimum and Maximum.+ </p></li></ul></div><p>+ Some examples:+ </p><pre class="screen">+Prelude Data.TypeLevel> :i Data.TypeLevel.divMod+Data.TypeLevel.divMod :: (DivMod x y q r) => x -> y -> (q, r)+ -- Defined in Data.TypeLevel.Num.Ops+Prelude Data.TypeLevel> d23 `Data.TypeLevel.divMod` d2+(11,1)+ </pre><p>+ Note that the resulting type is calculated at compile time:+ </p><pre class="screen">+Prelude Data.TypeLevel> :t d23 `Data.TypeLevel.divMod` d2+d23 `Data.TypeLevel.divMod` d2 :: (D1 :* D1, D1)+d23 `Data.TypeLevel.divMod` d2 :: (D1 :* D1, D1)+ </pre><p>+ Note as well that the operations are consistent, we cannot, for+ instance, calculate the predecessor of zero:+ </p><pre class="screen">+Prelude Data.TypeLevel> Data.TypeLevel.pred d0++<interactive>:1:0:+ No instances for (Data.TypeLevel.Num.Ops.Failure+ (Data.TypeLevel.Num.Ops.PredecessorOfZeroError x),+[..]+ </pre><p>+ We can even add constraints to our own functions. For instance, we+ want to guarantee (at compilation time) that a type-level+ numeral number is lower than 6 and greater than 3.+ </p><pre class="screen">+Prelude Data.TypeLevel> let check :: (Nat x, x :<: D6, x :;>: D3, Num a) => x -> a; check n = toNum n+ </pre><p>+ For example, 2 does not meet the constraints.+ </p><pre class="screen">+Prelude Data.TypeLevel> check d2+<interactive>:1:0:+ Couldn't match expected type `CGT' against inferred type `CLT'+[..]+ </pre><p>+ Whereas 4 does+ </p><pre class="screen">+Prelude Data.TypeLevel> check d4+4+ </pre></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1255520"></a>4. Fixed Sized Vectors themselves</h3></div></div></div><p>+ Getting back to fixed-sized vectors themselves, FSVec offers+ a <a class="ulink" href="http://hackage.haskell.org/packages/archive/parameterized-data/0.1.2/doc/html/Data-Param-FSVec.html" target="_top">reasonably+ rich vector API</a> based on type-level numerals.+ </p><p>+ For example, we can safely access the elements of a vector+ without the risk of getting+ <span class="emphasis"><em>out-of-bounds</em></span> errors. + </p><pre class="programlisting">+(!) :: (Pos s, Nat i, i :<: s) => FSVec s a -> i -> a+ </pre><p>+ The best part of it is that the bound checks are performed+ on the type level at compilation time, not adding any+ overhead to the execution of our code.+ </p><pre class="screen">+Prelude Data.TypeLevel> :m +Data.Param.FSVec+Prelude Data.TypeLevel Data.Param.FSVec> $(vectorTH [1::Int,2,3]) ! d0+1+Prelude Data.TypeLevel Data.Param.FSVec> $(vectorTH [1::Int,2,3]) ! d7+<interactive>:1:0:+ Couldn't match expected type `LT' against inferred type `GT'+ When using functional dependencies to combine+ Trich D7 D3 GT, + [..]+ </pre><p>+ <code class="code">vectorTH</code> is a Template Haskell function to+ create vectors out of lists, we will get back to why TH is+ needed later. <code class="code">d0</code> and <code class="code">d7</code> are+ declared as <code class="code">undefined</code> (bottom) and force the+ inference of the <code class="code">D0</code> and <code class="code">D7</code>+ type-level values. Note that the explicit type signatures+ are needed due to Haskell's monomorphism restriction, in the+ general non-interactive code does not need this kind of type+ annotations.+ </p><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3>+ Using numerical literals instead of the+ <code class="code">undefined</code> values (e.g. 0 and 7 instead of+ <code class="code">d0</code> and <code class="code">d7</code>) is a very common error.+ </div><p>+ Here are two further examples using <code class="code">head</code>.+ </p><pre class="screen">+Prelude Data.TypeLevel Data.Param.FSVec> Data.Param.FSVec.head $(vectorTH [1::Int,2,3])+1+Prelude Data.TypeLevel Data.Param.FSVec> Data.Param.FSVec.head empty++<interactive>:1:0:+ No instance for (Data.TypeLevel.Num.Sets.PosI D0)+ arising from a use of `Data.Param.FSVec.head'+ </pre><p>+ Again, attempting to obtain the head of an empty vector triggers a compile-time error.+ </p><p>+ Even if FSVec offers many nice features, it also has a few problems.+ </p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id1255822"></a>5. <code class="code">FSVec</code> issues</h3></div></div></div><div class="orderedlist"><ol type="1"><li><p>+ Some functions such as <code class="code">filter</code> cannot be+ implemented. One can think about something along the+ lines of:+ </p><pre class="programlisting">+filter :: (a -> Bool) -> FSVec s a -> FSVec s2 a+ </pre><p>+ However, the size of the output vector (<code class="code">s2</code>) cannot be precalculated+ statically.+ </p></li><li><p>+ Since <code class="code">FSVec</code> is an abstract data type,+ pattern matching is lost, but that is the general case+ in vector implementations+ <sup>[<a name="id1255999" href="#ftn.id1255999" class="footnote">9</a>]</sup>.+ </p></li><li><p>+ It is difficult to build a vector from a list. Again, the first thing one would+ think of would be+ </p><pre class="programlisting"> +vector :: Nat s => [a] -> FSVec s a+ </pre><p>+ However, since <code class="code">s</code> would be a different type+ depending on the length of <code class="code">[a]</code>, this is not+ a valid Haskell function. <code class="code">s</code> is+ existentially quantified, a feature not supported+ directly by Haskell98.+ </p><p>+ In addition, since the list-length is a run-time+ condition, it is impossible to guess at compile+ time.+ </p><p>+ However, there are a few workarounds which are already+ included in the library:+ </p><div class="orderedlist"><ol type="a"><li><p>+ As suggested in Eaton's <a class="ulink" href="http://ofb.net/~frederik/vectro/draft-r2.pdf" target="_top">Statically+ Typed Linear Algebra in Haskell</a>, emulate an+ existential through <a class="ulink" href="http://en.wikibooks.org/wiki/Haskell/Continuation_passing_style" target="_top">CPS</a>+ (Continuation passing style). CPS is a style of+ programming where functions never return values, but+ instead take an extra parameter which they give+ their result to.+ </p><pre class="programlisting">+vectorCPS :: Nat s => vectorCPS :: [a] -> (forall s. Nat s => FSVec s a -> w) -> w+ </pre><p>+ Note that the <code class="code">forall</code> keyword is due to using Rank2 types + to emulate the existential. You don't+ really need to understand how they work but just know to use+ vectorCPS. Here is an example:+ </p><pre class="screen">+$ ghci+Prelude> :m +Data.Param+Prelude Data.Param> (vectorCPS [1,2,3,4]) Data.Param.length+4+ </pre><p>+ Note that length is passed to the result of <code class="code">vectorCPS</code> and not the+ other way around.+ </p></li><li><p>+ Unsafely provide the length of the resulting vector:+ </p><pre class="programlisting">+unsafeVector :: Nat s => s -> [a] -> FSVec s a+ </pre><p>+ <code class="code">unsafeVector</code> does not suffer the+ "existential type" problem of <code class="code">vectorCPS</code>,+ however it can happen that the dynamic length of the+ list does not match the provided length (that is why the+ function name has an "unsafe" prefix). Furthermore if+ that is the case, we will only be able to know at+ runtime.+ </p><pre class="programlisting">+Prelude Data.Param> :m +Data.TypeLevel+Prelude Data.Param Data.TypeLevel> unsafeVector d8 [1,2]+*** Exception: unsafeVector: dynamic/static length mismatch+Prelude Data.Param Data.TypeLevel> unsafeVector d2 [1,2]+<1,2>+ </pre></li><li><p>+ Template Haskell.+ </p><p>+ This is the preferred solution. The only problem is that, of course,+ the TH extension is required (but we already had that dependency in ForSyDe) and you+ can only use it with lists which are available at compile time (which,+ for the general case of ForSyDe designs should not be a problem).+ </p><pre class="screen">+$ ghci -XTemplateHaskell+Prelude> :m +Data.Param+Prelude Data.Param> $(vectorTH [1 :: Int,2,3,4])+Prelude Data.Param> :t $(vectorTH [1 :: Int,2,3,4])+$(vectorTH [1 :: Int,2,3,4]) :: (Num t) => FSVec Data.TypeLevel.Num.Reps.D4 t+ </pre></li></ol></div></li></ol></div></div></div><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id1251533" href="#id1251533" class="para">1</a>] </sup>ForSyDe has been tested to run+ successfully on Linux, OSX-Leopard-x86 and Windows when compiled+ under GHC version 6.8.2. Due to the massive number of instances+ automatically generated in ForSyDe, it is not recommended to use+ a higher version of GHC until <a class="ulink" href="http://hackage.haskell.org/trac/ghc/ticket/2328" target="_top">bug+ #2328</a> is fixed.</p></div><div class="footnote"><p><sup>[<a name="ftn.id1251950" href="#id1251950" class="para">2</a>] </sup>The term combinational comes from+ Digital Circuit Theory. In the context of ForSyDe, a+ synchronous process is combinational, as opposed to+ sequential, if its outputs don't depend on the history of the+ input signals. That is, the process is stateless, all output+ values can only depend on the input values consumed in the+ same clock cycle.</p></div><div class="footnote"><p><sup>[<a name="ftn.id1252412" href="#id1252412" class="para">3</a>] </sup>In the sense of+ belonging to any particular MoC</p></div><div class="footnote"><p><sup>[<a name="ftn.id1252502" href="#id1252502" class="para">4</a>] </sup>Current implementation is based on+ <a class="ulink" href="http://www.cs.chalmers.se/~koen/Lava/" target="_top">Lava</a>'s+ <a class="ulink" href="http://www.cs.chalmers.se/~koen/pubs/entry-asian99-lava.html" target="_top">Observable+ Sharing</a>.</p></div><div class="footnote"><p><sup>[<a name="ftn.id1253225" href="#id1253225" class="para">5</a>] </sup>More formally, a datatype with+ data constructors whose arity is zero in all+ cases.</p></div><div class="footnote"><p><sup>[<a name="ftn.id1253310" href="#id1253310" class="para">6</a>] </sup>Based+ on the <a class="ulink" href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/th-lift" target="_top"><code class="code">th-lift</code></a>+ package</p></div><div class="footnote"><p><sup>[<a name="ftn.id1254317" href="#id1254317" class="para">7</a>] </sup>Again,+ consider an enumerated type to be an algebraic type+ whose data constructors all have arity+ zero.</p></div><div class="footnote"><p><sup>[<a name="ftn.id1254337" href="#id1254337" class="para">8</a>] </sup>In practice, the upper limit is+ Haskell-compiler dependent. In the case of GHC,+ current limit is 62.</p></div><div class="footnote"><p><sup>[<a name="ftn.id1255999" href="#id1255999" class="para">9</a>] </sup>+ We tried to implement pattern matching using the+ <a class="ulink" href="http://www.haskell.org/ghc/dist/current/docs/users_guide/template-haskell.html#th-quasiquotation" target="_top">new+ Quasiquoting mechanism in GHC</a> <a class="ulink" href="http://www.haskell.org/pipermail/template-haskell/2008-February/000655.html" target="_top">+ without success</a>.+ </p></div></div></div></body></html>
+ doc/www/files/tutorial/tutorial.pdf view
binary file changed (absent → 518226 bytes)
+ examples/ALU.hs view
@@ -0,0 +1,343 @@+{-# LANGUAGE TemplateHaskell #-}++-- The following example is designed as tutorial example for the paper.+--+-- It implements a simple ALU, which has the following modes+-- HH: out <- a AND b +-- HL: out <- a OR b +-- LH: (cout, out) <- ADD a b+-- LL: out <- shiftl a 0+--+-- The expressiveness of the compiler could be clearly improved, if the+-- higher-order function 'zipWith' that works on vectors would be synthesizable. +-- Check 'and4BitFun'!+--+-- We could improve the example even further, if we use enumeration types for the +-- multiplexer. So far I have not done it, but should only be a matter of time!+ +module ALU where++import ForSyDe+import Data.Bits+import Data.Param.FSVec+import Data.TypeLevel.Num.Reps+import Data.TypeLevel.Num.Aliases+++----- AND - 4 Bit++and4BitFun :: ProcFun (FSVec D4 Bit -> FSVec D4 Bit -> FSVec D4 Bit)+and4BitFun = $(newProcFun [d| and4BitFun :: FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit+ --and4BitFun a b = Data.Param.FSVec.zipWith (.&.) a b + and4BitFun a b = (a!d3 .&. b!d3) +> (a!d2 .&. b!d2) +> (a!d1 .&. b!d1) +> (a!d0 .&. b!d0) +> empty+ |])+++and4BitProc :: Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit)+and4BitProc = zipWithSY "and4" and4BitFun+ ++and4BitSys :: SysDef (Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit))+and4BitSys = $(newSysDefTHName 'and4BitProc ["a", "b"] ["y"])++simAnd4Bit :: [FSVec D4 Bit] -> [FSVec D4 Bit] -> [FSVec D4 Bit]+simAnd4Bit = simulate and4BitSys++vhdlAnd4Bit = writeVHDL and4BitSys+++----- OR - 4 Bit++or4BitFun :: ProcFun (FSVec D4 Bit -> FSVec D4 Bit -> FSVec D4 Bit)+or4BitFun = $(newProcFun [d| or4BitFun :: FSVec D4 Bit -> FSVec D4 Bit -> FSVec D4 Bit+ --or4BitFun a b = Data.Param.FSVec.zipWith (.&.) a b + or4BitFun a b = (a!d3 .|. b!d3) +> (a!d2 .|. b!d2) +> (a!d1 .|. b!d1) +> (a!d0 .|. b!d0) +> empty+ |])+++or4BitProc :: Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit)+or4BitProc = zipWithSY "or4" or4BitFun+ ++or4BitSys :: SysDef (Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit))+or4BitSys = $(newSysDefTHName 'or4BitProc ["a", "b"] ["y"])++simOr4Bit :: [FSVec D4 Bit] -> [FSVec D4 Bit] -> [FSVec D4 Bit]+simOr4Bit = simulate or4BitSys++vhdlOr4Bit = writeVHDL or4BitSys++----- Logical Shift Left++lslFun :: ProcFun (FSVec D4 Bit -> FSVec D4 Bit) +lslFun = $(newProcFun [d| lslFun :: FSVec D4 Bit -> FSVec D4 Bit+ lslFun a = shiftl a L+ |])++lslProc :: Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) +lslProc = mapSY "lsl" lslFun++lslSys :: SysDef (Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit))+lslSys = $(newSysDefTHName 'lslProc ["in"] ["out"])++simLsl :: [FSVec D4 Bit] -> [FSVec D4 Bit]+simLsl = simulate lslSys++vhdlLsl = writeVHDL lslSys++----- Mux 4/1 (no use of FSVec as input, only for selection)++mux41Fun :: ProcFun (FSVec D2 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit)+mux41Fun = $(newProcFun [d| mux41Fun :: FSVec D2 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit+ mux41Fun sel x3 x2 x1 x0 + = if sel == H +> H +> empty then+ x3+ else + if sel == H +> L +> empty then+ x2+ else+ if sel == L +> H +> empty then + x1+ else+ x0+ |])++mux41Proc :: Signal (FSVec D2 Bit) -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit)+mux41Proc = zipWith5SY "mux41" mux41Fun++mux41Sys :: SysDef (Signal (FSVec D2 Bit) -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit))+mux41Sys = $(newSysDefTHName 'mux41Proc ["sel", "d3", "d2", "d1", "d0"] ["out"])++simMux41 :: [FSVec D2 Bit] -> [FSVec D4 Bit] -> [FSVec D4 Bit] + -> [FSVec D4 Bit] -> [FSVec D4 Bit] -> [FSVec D4 Bit]+simMux41 = simulate mux41Sys++vhdlMux41 = writeVHDL mux41Sys++----- Convert FSVector to Tuple (Size 4)++convFromFSVec4Fun :: ProcFun (FSVec D4 Bit -> (Bit, Bit, Bit, Bit))+convFromFSVec4Fun = $(newProcFun [d| convFromFSVec4Fun :: FSVec D4 Bit -> (Bit, Bit, Bit, Bit)+ convFromFSVec4Fun v+ = (v!d3, v!d2, v!d1, v!d0)+ |])++convFromFSVec4Proc :: Signal (FSVec D4 Bit) -> (Signal Bit, Signal Bit, Signal Bit, Signal Bit)+convFromFSVec4Proc = (unzip4SY "unzip4" . mapSY "conv4" convFromFSVec4Fun) ++convFromFSVec4Sys :: SysDef (Signal (FSVec D4 Bit) -> (Signal Bit, Signal Bit, Signal Bit, Signal Bit))+convFromFSVec4Sys = $(newSysDefTHName 'convFromFSVec4Proc ["vector4"] ["v3", "v2", "v1", "v0"])++simConvFromFSVec4 :: [FSVec D4 Bit] -> ([Bit], [Bit], [Bit], [Bit])+simConvFromFSVec4 = simulate convFromFSVec4Sys++vhdlConvFromFSVec4 = writeVHDL convFromFSVec4Sys ++----- Convert To FSVector (Size 4)++convToFSVec4Fun :: ProcFun (Bit -> Bit -> Bit -> Bit -> FSVec D4 Bit)+convToFSVec4Fun = $(newProcFun [d| convToFSVec4Fun :: Bit -> Bit -> Bit -> Bit -> FSVec D4 Bit+ convToFSVec4Fun x3 x2 x1 x0 + = x3 +> x2 +> x1 +> x0 +> empty |])++convToFSVec4Proc :: Signal Bit -> Signal Bit -> Signal Bit -> Signal Bit -> Signal (FSVec D4 Bit)+convToFSVec4Proc = zipWith4SY "toVector4" convToFSVec4Fun++convToFSVec4Sys :: SysDef (Signal Bit -> Signal Bit -> Signal Bit -> Signal Bit -> Signal (FSVec D4 Bit))+convToFSVec4Sys = $(newSysDefTHName 'convToFSVec4Proc ["x3", "x2", "x1", "x0"] ["vec4"])++simConvToFSVec4 = simulate convToFSVec4Sys++vhdlConvToFSVec4 = writeVHDL convToFSVec4Sys++------ Full Adder++fullAddFun :: ProcFun (Bit -> Bit -> Bit -> (Bit, Bit))+fullAddFun = $(newProcFun [d|fullAddFun :: Bit -> Bit -> Bit -> (Bit, Bit)+ -- I would like to use 'where'-clauses. Is this possible?+ -- fullAddFun a b c_in = (c_out, sum)+ -- where c_out = (a .&. b) .|. (a .&. c_in) .|. (b .&. c_in)+ -- sum = (a `xor` b) `xor` c_in |])+ fullAddFun a b c_in = ((a .&. b) .|. (a .&. c_in) .|. (b .&. c_in),+ (a `xor` b) `xor` c_in) |])++--fullAddProc :: Signal Bit -> Signal Bit -> Signal Bit -> Signal (Bit, Bit)+--fullAddProc = zipWith3SY "fulladd" fullAddFun+fullAddProc :: Signal Bit -> Signal Bit -> Signal Bit -> (Signal Bit, Signal Bit)+fullAddProc a b c_in = (unzipSY "unzipSY") $ (zipWith3SY "fulladd" fullAddFun a b c_in)++fullAddSys :: SysDef (Signal Bit -> Signal Bit -> Signal Bit -> (Signal Bit, Signal Bit))+fullAddSys = $(newSysDefTHName 'fullAddProc ["a", "b", "c_in"] ["cout", "sum"])++simFullAdd :: [Bit] -> [Bit] -> [Bit] -> ([Bit], [Bit])+simFullAdd = simulate fullAddSys++--vhdlFullAdd = writeVHDL fullAddSys++a_in = [L,L,L,L,H,H,H,H]+b_in = [L,H,L,H,L,H,L,H]+c_in = [L,L,H,H,L,L,H,H]++------ 4-bit Adder Chain++fourBitAdder :: Signal Bit -- C_IN+ -> Signal Bit -- A3+ -> Signal Bit -- A2+ -> Signal Bit -- A1+ -> Signal Bit -- A0+ -> Signal Bit -- B3+ -> Signal Bit -- B2+ -> Signal Bit -- B1+ -> Signal Bit -- B0+ -> (Signal Bit, -- C_OUT+ Signal Bit, -- SUM3+ Signal Bit, -- SUM2+ Signal Bit, -- SUM1+ Signal Bit) -- SUM0+fourBitAdder c_in a3 a2 a1 a0 b3 b2 b1 b0 + = (c_out, sum3, sum2, sum1, sum0)+ where (c_out, sum3) = (instantiate "add3" fullAddSys) a3 b3 c2+ (c2, sum2) = (instantiate "add2" fullAddSys) a2 b2 c1+ (c1, sum1) = (instantiate "add1" fullAddSys) a1 b1 c0+ (c0, sum0) = (instantiate "add0" fullAddSys) a0 b0 c_in++fourBitAdderSys :: SysDef (Signal Bit -- C_IN+ -> Signal Bit -- A3+ -> Signal Bit -- A2+ -> Signal Bit -- A1+ -> Signal Bit -- A0+ -> Signal Bit -- B3+ -> Signal Bit -- B2+ -> Signal Bit -- B1+ -> Signal Bit -- B0+ -> (Signal Bit, -- C_OUT+ Signal Bit, -- SUM3+ Signal Bit, -- SUM2+ Signal Bit, -- SUM1+ Signal Bit)) -- SUM0 +fourBitAdderSys = $(newSysDefTHName 'fourBitAdder ["C_IN", "A3", "A2", "A1", "A0",+ "B3", "B2", "B1", "B0"]+ ["C_OUT", "SUM3", "SUM2", "SUM1", "SUM0"])++simFourBitAdder = simulate fourBitAdderSys++vhdlFourBitAdder = writeVHDL fourBitAdderSys++a0 = [L,L,L,L,L,L,L,L,H,H,H,H,H,H,H,H]+a1 = [L,L,L,L,H,H,H,H,L,L,L,L,H,H,H,H]+a2 = [L,L,H,H,L,L,H,H,L,L,H,H,L,L,H,H]+a3 = [L,H,L,H,L,H,L,H,L,H,L,H,L,H,L,H]+zero = [L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L]+one = [H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H]+++simAdd_0 = simFourBitAdder zero a3 a2 a1 a0 a3 a2 a1 a0 +simAdd_1 = simFourBitAdder one a3 a2 a1 a0 a3 a2 a1 a0 +++----- FSVec Adder+add4FSVecProc :: Signal (FSVec D4 Bit)+ -> Signal (FSVec D4 Bit)+ -> (Signal Bit, Signal (FSVec D4 Bit))+add4FSVecProc a b = (cout, sum)+ where+ (a3,a2,a1,a0) = (instantiate "split_a" convFromFSVec4Sys) a+ (b3,b2,b1,b0) = (instantiate "split_b" convFromFSVec4Sys) b + (cout, s3, s2, s1, s0) = (instantiate "adder" fourBitAdderSys) zero a3 a2 a1 a0 b3 b2 b1 b0 + sum = (instantiate "merge" convToFSVec4Sys) s3 s2 s1 s0+ zero = instantiate "Zero" zeroSys ++add4FSVecSys :: SysDef (Signal (FSVec D4 Bit)+ -> Signal (FSVec D4 Bit)+ -> (Signal Bit, Signal (FSVec D4 Bit)))+add4FSVecSys = $(newSysDefTHName 'add4FSVecProc ["a", "b"] ["cout", "sum"])++simAdd4FSVecSys = simulate add4FSVecSys++vhdlAdd4FSVecSys = writeVHDL add4FSVecSys++----- Constant Signals++-- Constant input 'H' modeled with constSY+oneProc :: Signal Bit+oneProc = constSY "high" H++oneSys :: SysDef (Signal Bit)+oneSys = $(newSysDefTHName 'oneProc [] ["one"])++-- Constant input 'L' modeled with constSY+zeroProc :: Signal Bit+zeroProc = constSY "low" L+ +zeroSys :: SysDef (Signal Bit)+zeroSys = $(newSysDefTHName 'zeroProc [] ["zero"])++----- ALU++aluProc :: Signal(FSVec D2 Bit) + -> Signal (FSVec D4 Bit)+ -> Signal (FSVec D4 Bit)+ -> (Signal Bit, Signal (FSVec D4 Bit))+aluProc sel a b = (cout, out)+ where+ andOut = (instantiate "and" and4BitSys) a b+ orOut = (instantiate "or" or4BitSys) a b+ (cout, sum) = (instantiate "add" add4FSVecSys) a b+ lslOut = (instantiate "lsl" lslSys) a+ out = (instantiate "mux" mux41Sys) sel andOut orOut sum lslOut++ ++aluSys :: SysDef (Signal(FSVec D2 Bit) + -> Signal (FSVec D4 Bit)+ -> Signal (FSVec D4 Bit)+ -> (Signal Bit, Signal (FSVec D4 Bit)))+aluSys = $(newSysDefTHName 'aluProc ["sel", "a", "b"] ["cout", "data"])+ ++simALU :: [FSVec D2 Bit] -> [FSVec D4 Bit] -> [FSVec D4 Bit] -> ([Bit], [FSVec D4 Bit])+simALU = simulate aluSys++vhdlALU = writeVHDL aluSys+ ++----- Test-Inputs++sel = [reallyUnsafeVector [H,H], -- AND+ reallyUnsafeVector [H,L], -- OR+ reallyUnsafeVector [L,H], -- ADD+ reallyUnsafeVector [L,L]] -- LSL++a = [reallyUnsafeVector [L,H,H,H], -- LSB D1 D2 MSB+ reallyUnsafeVector [L,H,L,H],+ reallyUnsafeVector [H,H,H,H],+ reallyUnsafeVector [L,H,H,H]]++b = [reallyUnsafeVector [H,H,H,H],+ reallyUnsafeVector [H,H,L,H],+ reallyUnsafeVector [H,L,L,L], + reallyUnsafeVector [H,H,H,H]]
+ examples/ALU_Shallow.hs view
@@ -0,0 +1,185 @@+{-# LANGUAGE TemplateHaskell #-}++-- *** Shallow-Embedded ForSyDe Model ***+--+-- The following example is designed as tutorial example for the paper.+--+-- It implements a simple ALU, which has the following modes+-- HH: out <- a AND b +-- HL: out <- a OR b +-- LH: (cout, out) <- ADD a b+-- LL: out <- shiftl a 0+--+ +module ALU_Shallow where++import ForSyDe.Shallow+import ForSyDe.Bit+import Data.Bits+import Data.Param.FSVec+import Data.TypeLevel.Num.Reps+import Data.TypeLevel.Num.Aliases++++----- AND - 4 Bit++and4Bit :: Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit)+and4Bit = zipWithSY (Data.Param.FSVec.zipWith (.&.)) ++----- OR - 4 Bit++or4Bit :: Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit)+or4Bit = zipWithSY (Data.Param.FSVec.zipWith (.|.))++----- Logical Shift Left++++lsl :: Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) +lsl = mapSY shiftl_L where+ shiftl_L v = shiftl v L ++----- Mux 4/1 (no use of FSVec as input, only for selection)++mux41Fun :: FSVec D2 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit + -> FSVec D4 Bit+mux41Fun sel x3 x2 x1 x0 = if sel == H +> H +> empty then+ x3+ else + if sel == H +> L +> empty then+ x2+ else+ if sel == L +> H +> empty then + x1+ else+ x0+ ++mux41 :: Signal (FSVec D2 Bit) -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) + -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit)+mux41 = zipWith5SY mux41Fun++----- Convert FSVector to Tuple (Size 4)++convFromFSVec4 :: FSVec D4 a -> (a, a, a, a)+convFromFSVec4 v = (v!d3, v!d2, v!d1, v!d0)++----- Convert To FSVector (Size 4)++convToFSVec4 :: a -> a -> a -> a -> FSVec D4 a+convToFSVec4 x3 x2 x1 x0 = x3 +> x2 +> x1 +> x0 +> empty++----- 4-Bit Adder++------ 4-bit Adder Chain+++fourBitAdder :: Signal Bit -- C_IN+ -> Signal Bit -- A3+ -> Signal Bit -- A2+ -> Signal Bit -- A1+ -> Signal Bit -- A0+ -> Signal Bit -- B3+ -> Signal Bit -- B2+ -> Signal Bit -- B1+ -> Signal Bit -- B0+ -> (Signal Bit, -- C_OUT+ Signal Bit, -- SUM3+ Signal Bit, -- SUM2+ Signal Bit, -- SUM1+ Signal Bit) -- SUM0+fourBitAdder c_in a3 a2 a1 a0 b3 b2 b1 b0 + = (c_out, sum3, sum2, sum1, sum0)+ where (c_out, sum3) = unzipSY $ zipWith3SY fullAdd a3 b3 c2+ (c2, sum2) = unzipSY $ zipWith3SY fullAdd a2 b2 c1+ (c1, sum1) = unzipSY $ zipWith3SY fullAdd a1 b1 c0+ (c0, sum0) = unzipSY $ zipWith3SY fullAdd a0 b0 c_in++fullAdd a b cin = (cout, sum) + where+ cout = (a .&. b) .|. (a .&. cin) .|. (b .&. cin)+ sum = (a `xor` b) `xor` cin++----- FSVec Adder+add4FSVec :: Signal (FSVec D4 Bit)+ -> Signal (FSVec D4 Bit)+ -> (Signal Bit, Signal (FSVec D4 Bit))+add4FSVec a b = (cout, sum)+ where+ (a3,a2,a1,a0) = unzip4SY $ mapSY convFromFSVec4 a+ (b3,b2,b1,b0) = unzip4SY $ mapSY convFromFSVec4 b + (cout, s3, s2, s1, s0) = fourBitAdder zero a3 a2 a1 a0 b3 b2 b1 b0 + sum = zipWith4SY convToFSVec4 s3 s2 s1 s0+ zero = sourceSY id L ++----- ALU++alu :: Signal(FSVec D2 Bit) + -> Signal (FSVec D4 Bit)+ -> Signal (FSVec D4 Bit)+ -> (Signal Bit, Signal (FSVec D4 Bit))+alu sel a b = (cout, out)+ where+ andOut = and4Bit a b+ orOut = or4Bit a b+ (cout, sum) = add4FSVec a b+ lslOut = lsl a+ out = mux41 sel andOut orOut sum lslOut++ ++----- Test-Inputs++sel = signal [reallyUnsafeVector [H,H], -- AND+ reallyUnsafeVector [H,L], -- OR+ reallyUnsafeVector [L,H], -- ADD+ reallyUnsafeVector [L,L]] -- LSL++a = signal [reallyUnsafeVector [L,H,H,H],+ reallyUnsafeVector [L,H,L,H],+ reallyUnsafeVector [L,H,H,H],+ reallyUnsafeVector [L,H,H,H]]++b = signal [reallyUnsafeVector [H,H,H,H],+ reallyUnsafeVector [H,H,L,H],+ reallyUnsafeVector [H,H,H,H],+ reallyUnsafeVector [H,H,H,H]]++c = signal [reallyUnsafeVector [L,L,L,L], -- LSB D1 D2 MSB+ reallyUnsafeVector [H,L,L,L],+ reallyUnsafeVector [L,L,L,H],+ reallyUnsafeVector [L,L,L,H]]++d = signal [reallyUnsafeVector [L,L,L,L],+ reallyUnsafeVector [L,L,L,L],+ reallyUnsafeVector [L,L,L,H],+ reallyUnsafeVector [H,H,H,H]]++x0 = signal [L,L,L,L]+x1 = signal [H,H,H,H]++-- Helper functions+zipWith5SY :: (a -> b -> c -> d -> e -> f) + -> Signal a+ -> Signal b+ -> Signal c+ -> Signal d+ -> Signal e+ -> Signal f+zipWith5SY _ NullS _ _ _ _ = NullS+zipWith5SY _ _ NullS _ _ _ = NullS+zipWith5SY _ _ _ NullS _ _ = NullS+zipWith5SY _ _ _ _ NullS _ = NullS+zipWith5SY _ _ _ _ _ NullS = NullS+zipWith5SY f (a :- as) (b :- bs) (c :- cs) (d :- ds) (e:-es) = + f a b c d e :- zipWith5SY f as bs cs ds es
+ examples/BitVector.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE TemplateHaskell #-}+-- example module to test bit conversion functions+module BitVector where++import ForSyDe+import Data.Int (Int32)+import Data.Param.FSVec+import Data.TypeLevel.Num (D32)++to32BitFun :: ProcFun (Int32 -> FSVec D32 Bit)+to32BitFun = $(newProcFun+ [d| to32Bit :: Int32 -> FSVec D32 Bit+ to32Bit i = toBitVector32 i |])++to32BitProc :: Signal Int32 -> Signal (FSVec D32 Bit)+to32BitProc = mapSY "to32Proc" to32BitFun ++to32BitSysDef :: SysDef (Signal Int32 -> Signal (FSVec D32 Bit))+to32BitSysDef = newSysDef to32BitProc "to32BitSys" ["in1"] ["out1"]
+ examples/ButtonEncoder.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}++module ButtonEncoder where++import ForSyDe+import Language.Haskell.TH.Lift+import Data.Generics (Data, Typeable)+import Prelude hiding (Either(..))++-- Combinational syncrhonous system to encode the keypresses of+-- an arrow-keypad into directions which are easier to process+-- +-- This example shows how the VHDL backend can process custom Enumerated+-- Algebraic types (ie. Algebraic types whose data constructors have all+-- zero arity)+++data Direction = Up | Down | Left | Right | Unknown+ deriving (Data, Typeable, Show, Eq)++$(deriveLift1 ''Direction)++type ButtonPress = (Bit, -- is left pressed + Bit, -- is right pressed+ Bit, -- is up pressed + Bit) -- is down pressed++buttonEncoder :: Signal ButtonPress -> Signal Direction +buttonEncoder = mapSY "encoder" transFun+ where transFun = + $(newProcFun [d| transFun (left,right,up,down) =+ if left == H then Left else+ if right == H then Right else+ if up == H then Up else+ if down == H then Down else Unknown |])++buttonEncoderSys :: SysDef (Signal ButtonPress -> Signal Direction)+buttonEncoderSys = $(newSysDefTHName 'buttonEncoder ["buttonPress"] ["direction"])+++simButtonEncoder :: [ButtonPress] -> [Direction]+simButtonEncoder = simulate buttonEncoderSys+
+ examples/CarrySelectAdder.hs view
@@ -0,0 +1,386 @@+{-# LANGUAGE TemplateHaskell #-}++-- This module models a 16-bit carry select adder+++module CarrySelectAdder where++import ForSyDe -- Definition of Bit data type+import Data.Bits -- Operations for Bit data type+import Data.Param.FSVec+import Data.TypeLevel.Num.Reps+import Data.TypeLevel.Num.Aliases++-- First we create a four bit carry select adder.+-- It uses eight full adders and five 2/1 muxes.++------ Full Adder++fullAddFun :: ProcFun (Bit -> Bit -> Bit -> (Bit, Bit))+fullAddFun = $(newProcFun [d|fullAddFun :: Bit -> Bit -> Bit -> (Bit, Bit)+ -- I would like to use 'where'-clauses. Is this possible?+ -- fullAddFun a b c_in = (c_out, sum)+ -- where c_out = (a .&. b) .|. (a .&. c_in) .|. (b .&. c_in)+ -- sum = (a `xor` b) `xor` c_in |])+ fullAddFun a b c_in = ((a .&. b) .|. (a .&. c_in) .|. (b .&. c_in),+ (a `xor` b) `xor` c_in) |])++--fullAddProc :: Signal Bit -> Signal Bit -> Signal Bit -> Signal (Bit, Bit)+--fullAddProc = zipWith3SY "fulladd" fullAddFun+fullAddProc :: Signal Bit -> Signal Bit -> Signal Bit -> (Signal Bit, Signal Bit)+fullAddProc a b c_in = (unzipSY "unzipSY") $ (zipWith3SY "fulladd" fullAddFun a b c_in)++fullAddSys :: SysDef (Signal Bit -> Signal Bit -> Signal Bit -> (Signal Bit, Signal Bit))+fullAddSys = $(newSysDefTHName 'fullAddProc ["a", "b", "c_in"] ["cout", "sum"])++simFullAdd :: [Bit] -> [Bit] -> [Bit] -> ([Bit], [Bit])+simFullAdd = simulate fullAddSys++--vhdlFullAdd = writeVHDL fullAddSys++a_in = [L,L,L,L,H,H,H,H]+b_in = [L,H,L,H,L,H,L,H]+c_in = [L,L,H,H,L,L,H,H]+++------ 2/1 Multiplexer++--mux21Fun :: ProcFun (Bit -> Bit -> Bit -> Bit)+--mux21Fun = $(newProcFun [d|mux21Fun :: Bit -> Bit -> Bit -> Bit+-- mux21Fun sel d1 d0 = if (sel == L) then+-- d0+-- else+-- d1 |])++mux21Proc :: Signal Bit -> Signal Bit -> Signal Bit -> Signal Bit+mux21Proc = zipWith3SY "mux21" mux21Fun++mux21Sys :: SysDef (Signal Bit -> Signal Bit -> Signal Bit -> Signal Bit)+mux21Sys = $(newSysDefTHName 'mux21Proc ["sel", "d1", "d0"] ["out"])++simMux21 :: [Bit] -> [Bit] -> [Bit] -> [Bit]+simMux21 = simulate mux21Sys++vhdlMux21 = writeVHDL mux21Sys++------ 4-bit Adder Chain++fourBitAdder :: Signal Bit -- C_IN+ -> Signal Bit -- A3+ -> Signal Bit -- A2+ -> Signal Bit -- A1+ -> Signal Bit -- A0+ -> Signal Bit -- B3+ -> Signal Bit -- B2+ -> Signal Bit -- B1+ -> Signal Bit -- B0+ -> (Signal Bit, -- C_OUT+ Signal Bit, -- SUM3+ Signal Bit, -- SUM2+ Signal Bit, -- SUM1+ Signal Bit) -- SUM0+fourBitAdder c_in a3 a2 a1 a0 b3 b2 b1 b0 + = (c_out, sum3, sum2, sum1, sum0)+ where (c_out, sum3) = (instantiate "add3" fullAddSys) a3 b3 c2+ (c2, sum2) = (instantiate "add2" fullAddSys) a2 b2 c1+ (c1, sum1) = (instantiate "add1" fullAddSys) a1 b1 c0+ (c0, sum0) = (instantiate "add0" fullAddSys) a0 b0 c_in++fourBitAdderSys :: SysDef (Signal Bit -- C_IN+ -> Signal Bit -- A3+ -> Signal Bit -- A2+ -> Signal Bit -- A1+ -> Signal Bit -- A0+ -> Signal Bit -- B3+ -> Signal Bit -- B2+ -> Signal Bit -- B1+ -> Signal Bit -- B0+ -> (Signal Bit, -- C_OUT+ Signal Bit, -- SUM3+ Signal Bit, -- SUM2+ Signal Bit, -- SUM1+ Signal Bit)) -- SUM0 +fourBitAdderSys = $(newSysDefTHName 'fourBitAdder ["C_IN", "A3", "A2", "A1", "A0",+ "B3", "B2", "B1", "B0"]+ ["C_OUT", "SUM3", "SUM2", "SUM1", "SUM0"])++simFourBitAdder = simulate fourBitAdderSys++vhdlFourBitAdder = writeVHDL fourBitAdderSys++a0 = [L,L,L,L,L,L,L,L,H,H,H,H,H,H,H,H]+a1 = [L,L,L,L,H,H,H,H,L,L,L,L,H,H,H,H]+a2 = [L,L,H,H,L,L,H,H,L,L,H,H,L,L,H,H]+a3 = [L,H,L,H,L,H,L,H,L,H,L,H,L,H,L,H]+zero = [L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L]+one = [H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H]+++simAdd_0 = simFourBitAdder zero a3 a2 a1 a0 a3 a2 a1 a0 +simAdd_1 = simFourBitAdder one a3 a2 a1 a0 a3 a2 a1 a0 ++----- fourBitCarrySelectAdder+++fourBitCSAdder :: Signal Bit -- C_IN+ -> Signal Bit -- A3+ -> Signal Bit -- A2+ -> Signal Bit -- A1+ -> Signal Bit -- A0+ -> Signal Bit -- B3+ -> Signal Bit -- B2+ -> Signal Bit -- B1+ -> Signal Bit -- B0+ -> (Signal Bit, -- C_OUT+ Signal Bit, -- SUM3+ Signal Bit, -- SUM2+ Signal Bit, -- SUM1+ Signal Bit) -- SUM0fourBitCSAdder :: +fourBitCSAdder c_in a3 a2 a1 a0 b3 b2 b1 b0+ = (c_out, sum3, sum2, sum1, sum0)+ where c_out = (instantiate "mux4" mux21Sys) c_in c_out_1 c_out_0+ sum3 = (instantiate "mux3" mux21Sys) c_in sum3_1 sum3_0+ sum2 = (instantiate "mux2" mux21Sys) c_in sum2_1 sum2_0+ sum1 = (instantiate "mux1" mux21Sys) c_in sum1_1 sum1_0 + sum0 = (instantiate "mux0" mux21Sys) c_in sum0_1 sum0_0+ (c_out_1, sum3_1, sum2_1, sum1_1, sum0_1) + = (instantiate "Adder_1" fourBitAdderSys) + one a3 a2 a1 a0 b3 b2 b1 b0+ (c_out_0, sum3_0, sum2_0, sum1_0, sum0_0) + = (instantiate "Adder_1" fourBitAdderSys) + zero a3 a2 a1 a0 b3 b2 b1 b0+ one = instantiate "One" oneSys+ zero = instantiate "Zero" zeroSys++fourBitCSAdderSys = $(newSysDefTHName 'fourBitCSAdder ["C_IN", "A3", "A2", "A1", "A0",+ "B3", "B2", "B1", "B0"]+ ["C_OUT", "SUM3", "SUM2", "SUM1", "SUM0"])+++simFourBitCSAdder = simulate fourBitCSAdderSys++vhdlFourBitCSAdder = writeVHDL fourBitCSAdderSys+ +simCSAdd_0 = simFourBitAdder zero a3 a2 a1 a0 a3 a2 a1 a0 +simCSAdd_1 = simFourBitAdder one a3 a2 a1 a0 a3 a2 a1 a0 ++----- Convert Output to FSVec++convertToFSVec5 :: a -> a -> a -> a -> a -> FSVec D5 a+convertToFSVec5 x4 x3 x2 x1 x0 = x4 +> x3 +> x2 +> x1 +> (singleton x0)++convOutput :: ProcFun (Bit -> Bit -> Bit -> Bit -> Bit -> FSVec D5 Bit)+convOutput = $(newProcFun [d|convOutput :: Bit -> Bit -> Bit -> Bit -> Bit -> FSVec D5 Bit+ convOutput x4 x3 x2 x1 x0 + = convertToFSVec5 x4 x3 x2 x1 x0 |])++convOutputProc :: Signal Bit -> Signal Bit -> Signal Bit -> Signal Bit -> Signal Bit -> Signal (FSVec D5 Bit)+convOutputProc = zipWith5SY "toVector5" convOutput++convOutputSys :: SysDef (Signal Bit -> Signal Bit -> Signal Bit -> Signal Bit -> Signal Bit -> Signal (FSVec D5 Bit))+convOutputSys = $(newSysDefTHName 'convOutputProc ["x4", "x3", "x2", "x1", "x0"] ["vec5"])++fourBitCSAdder' :: Signal Bit -- C_IN+ -> Signal Bit -- A3+ -> Signal Bit -- A2+ -> Signal Bit -- A1+ -> Signal Bit -- A0+ -> Signal Bit -- B3+ -> Signal Bit -- B2+ -> Signal Bit -- B1+ -> Signal Bit -- B0+ -> Signal (FSVec D5 Bit) -- <C_OUT, SUM3, SUM2, SUM1, SUM0>+fourBitCSAdder' c_in a3 a2 a1 a0 b3 b2 b1 b0 = out5+ where+ out5 = (instantiate "toVector5" convOutputSys) c_out sum3 sum2 sum1 sum0+ (c_out, sum3, sum2, sum1, sum0) = (instantiate "Adder" fourBitCSAdderSys) c_in a3 a2 a1 a0 b3 b2 b1 b0 ++fourBitCSAdderSys2 :: SysDef (Signal Bit -- C_IN+ -> Signal Bit -- A3+ -> Signal Bit -- A2+ -> Signal Bit -- A1+ -> Signal Bit -- A0+ -> Signal Bit -- B3+ -> Signal Bit -- B2+ -> Signal Bit -- B1+ -> Signal Bit -- B0+ -> Signal (FSVec D5 Bit))+fourBitCSAdderSys2 = $(newSysDefTHName 'fourBitCSAdder' ["C_IN", "A3", "A2", "A1", "A0",+ "B3", "B2", "B1", "B0"]+ ["vect5"])++simFourBitCSAdder2 = simulate fourBitCSAdderSys2++vhdlFourBitCSAdder2 = writeVHDL fourBitCSAdderSys2++simCSAdd_0' = simFourBitCSAdder2 zero a3 a2 a1 a0 a3 a2 a1 a0 +simCSAdd_1' = simFourBitCSAdder2 one a3 a2 a1 a0 a3 a2 a1 a0 +++----- Four Bit Adder +--+-- The four bit adder is modelled as a set of equations. +-- It uses fixed-size vectors for the 4-bit input and output values.++adder4BitFun :: ProcFun (Bit -> FSVec D4 Bit -> FSVec D4 Bit -> (Bit, FSVec D4 Bit))+adder4BitFun = $(newProcFun [d|adder4BitFun :: Bit -> FSVec D4 Bit -> FSVec D4 Bit -> (Bit, FSVec D4 Bit)+ adder4BitFun cin a b = (cout, sum) where+ cout = (a!d3 .&. b!d3) .|. (a!d3 .&. c2) .|. (b!d3 .&. c2)+ c2 = (a!d2 .&. b!d2) .|. (a!d2 .&. c1) .|. (b!d2 .&. c1)+ c1 = (a!d1 .&. b!d1) .|. (a!d1 .&. c0) .|. (b!d1 .&. c0)+ c0 = (a!d0 .&. b!d0) .|. (a!d0 .&. cin) .|. (b!d0 .&. cin)+ s3 = (a!d3 `xor` b!d3) `xor` c2+ s2 = (a!d2 `xor` b!d2) `xor` c1+ s1 = (a!d1 `xor` b!d1) `xor` c0+ s0 = (a!d0 `xor` b!d0) `xor` cin+ sum = s0 +> s1 +> s2 +> s3 +> empty |])++adder4BitProc :: Signal Bit -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) -> (Signal Bit, Signal (FSVec D4 Bit))+adder4BitProc cin a b = (unzipSY "unzip") $ (zipWith3SY "4BitAdder" adder4BitFun cin a b)++adder4BitSys :: SysDef (Signal Bit -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) -> (Signal Bit, Signal (FSVec D4 Bit)))+adder4BitSys = $(newSysDefTHName 'adder4BitProc ["cin", "a", "b"] ["cout", "sum"])++simAdder4Bit = simulate adder4BitSys++vhdlAdder4Bit = writeVHDL adder4BitSys++----- 4-Bit 2/1 Multiplexer+--+-- The multiplexer uses fixed size vectors for input and output values.++mux21Fun :: ProcFun (Bit -> a -> a -> a)+mux21Fun = $(newProcFun [d|mux21Fun :: Bit -> a -> a -> a+ mux21Fun sel d1 d0 = if (sel == L) then+ d0+ else+ d1 |])++mux21_4BitProc :: Signal Bit -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit)+mux21_4BitProc = zipWith3SY "mux21" mux21Fun++mux21_4BitSys :: SysDef (Signal Bit -> Signal ( FSVec D4 Bit) -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit))+mux21_4BitSys = $(newSysDefTHName 'mux21_4BitProc ["sel", "d1", "d0"] ["out"])++simMux21_4Bit :: [Bit] -> [FSVec D4 Bit] -> [FSVec D4 Bit] -> [FSVec D4 Bit]+simMux21_4Bit = simulate mux21_4BitSys++vhdlMux21_4Bit = writeVHDL mux21_4BitSys+++----- 4-Bit Carry Select Adder++-- The carry select adder has two input that are connected to 'H' or 'L' respectively++-- Constant input 'H' modeled with constSY+oneProc :: Signal Bit+oneProc = constSY "high" H++oneSys :: SysDef (Signal Bit)+oneSys = $(newSysDefTHName 'oneProc [] ["one"])++-- Constant input 'L' modeled with constSY+zeroProc :: Signal Bit+zeroProc = constSY "low" L+ +zeroSys :: SysDef (Signal Bit)+zeroSys = $(newSysDefTHName 'zeroProc [] ["zero"])++-- The 4-Bit carry select adder is implemented as a composition of components+csAdder4BitProc :: Signal Bit -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) -> (Signal Bit, Signal (FSVec D4 Bit))+csAdder4BitProc cin a b = (cout, sum) where+ cout = (instantiate "mux" mux21Sys) cin cout_1 cout_0+ sum = (instantiate "mux4Bit" mux21_4BitSys) cin sum_1 sum_0+ (cout_1, sum_1) = (instantiate "adder1" adder4BitSys) one a b+ (cout_0, sum_0) = (instantiate "adder0" adder4BitSys) zero a b + one = instantiate "One" oneSys+ zero = instantiate "Zero" zeroSys+ +csAdder4BitSys :: SysDef (Signal Bit -> Signal (FSVec D4 Bit) -> Signal (FSVec D4 Bit) -> (Signal Bit, Signal (FSVec D4 Bit)))+csAdder4BitSys = $(newSysDefTHName 'csAdder4BitProc ["cin", "a", "b"] ["cout", "sum"])++simCSAdder4Bit = simulate csAdder4BitSys++vhdlCSAdder4Bit = writeVHDL csAdder4BitSys++----- 16 Bit Adder++csAdder16BitProc :: Signal (FSVec D16 Bit) -> Signal (FSVec D16 Bit) -> (Signal Bit, Signal (FSVec D16 Bit))+csAdder16BitProc a b = (cout, sum) where+ sum = zipWith4SY "concat4" concat4Fun sum3_0 sum7_4 sum11_8 sum15_12+ (cout, sum15_12) = (instantiate "csadder3" csAdder4BitSys) c11 a15_12 b15_12+ (c11, sum11_8) = (instantiate "csadder2" csAdder4BitSys) c7 a11_8 b11_8+ (c7, sum7_4) = (instantiate "csadder3" csAdder4BitSys) c3 a7_4 b7_4+ (c3, sum3_0) = (instantiate "csadder3" csAdder4BitSys) zero a3_0 b3_0+ a15_12 = mapSY "a15_12" select15_12Fun a+ a11_8 = mapSY "a11_8" select11_8Fun a+ a7_4 = mapSY "a7_4" select7_4Fun a+ a3_0 = mapSY "a3_0" select3_0Fun a+ b15_12 = mapSY "b15_12" select15_12Fun b+ b11_8 = mapSY "b11_8" select11_8Fun b+ b7_4 = mapSY "b7_4" select7_4Fun b+ b3_0 = mapSY "b3 _0" select3_0Fun b+ zero = instantiate "Zero" zeroSys +++csAdder16BitSys = $(newSysDefTHName 'csAdder16BitProc ["a", "b"] ["cout", "sum"])++simCSAdder16Bit = simulate csAdder16BitSys++vhdlCSAdder16Bit = writeVHDL csAdder16BitSys++-- Helper functions++select15_12Fun :: ProcFun (FSVec D16 Bit -> FSVec D4 Bit)+select15_12Fun = $(newProcFun [d|select15_12 :: FSVec D16 Bit -> FSVec D4 Bit+ select15_12 v = select d12 d1 d4 v |])++select11_8Fun :: ProcFun (FSVec D16 Bit -> FSVec D4 Bit)+select11_8Fun = $(newProcFun [d|select11_8 :: FSVec D16 Bit -> FSVec D4 Bit+ select11_8 v = select d8 d1 d4 v |])++select7_4Fun :: ProcFun (FSVec D16 Bit -> FSVec D4 Bit)+select7_4Fun = $(newProcFun [d|select7_4 :: FSVec D16 Bit -> FSVec D4 Bit+ select7_4 v = select d4 d1 d4 v |])++select3_0Fun :: ProcFun (FSVec D16 Bit -> FSVec D4 Bit)+select3_0Fun = $(newProcFun [d|select3_0 :: FSVec D16 Bit -> FSVec D4 Bit+ select3_0 v = select d0 d1 d4 v |])++concat4Fun :: ProcFun (FSVec D4 Bit -> FSVec D4 Bit -> FSVec D4 Bit -> FSVec D4 Bit -> FSVec D16 Bit)+concat4Fun = $(newProcFun [d|concat4Fun :: FSVec D4 Bit -> FSVec D4 Bit -> FSVec D4 Bit -> FSVec D4 Bit -> FSVec D16 Bit+ concat4Fun v1 v2 v3 v4 = v1 Data.Param.FSVec.++ + v2 Data.Param.FSVec.++ + v3 Data.Param.FSVec.++ + v4 |])++-- 16 Bit Test Values++v_0000 = reallyUnsafeVector [L,L,L,L, L,L,L,L, L,L,L,L, L,L,L,L]+v_8000 = reallyUnsafeVector [L,L,L,L, L,L,L,L, L,L,L,L, L,L,L,H] -- H is MSB+v_0001 = reallyUnsafeVector [H,L,L,L, L,L,L,L, L,L,L,L, L,L,L,L]+v_ffff = reallyUnsafeVector [H,H,H,H, H,H,H,H, H,H,H,H, H,H,H,H]++a16 = v_0000 : v_0000 : v_0001 : v_8000 : v_ffff : v_ffff : []+b16 = v_0000 : v_0001 : v_0001 : v_8000 : v_ffff : v_0001 : []++test16Bit = simCSAdder16Bit a16 b16++-- 4 Bit Test Values++v_0 = reallyUnsafeVector [L,L,L,L]+v_1 = reallyUnsafeVector [H,L,L,L]+v_8 = reallyUnsafeVector [L,L,L,H]+v_f = reallyUnsafeVector [H,H,H,H]++a4 = v_0 : v_0 : v_1 : v_8 : v_f : v_1 : []+b4 = v_0 : v_1 : v_1 : v_8 : v_f : v_f : []++c_low = [L,L,L,L,L,L]+c_high = [H,H,H,H,H,H] ++test4Bit = simCSAdder4Bit c_low a4 b4 ++-- Test FSVector++fv = 0 +> 1 +> 2 +> 3 +> empty -- LSB fv!d0 = 0, MSB fv!d3 = 3
+ examples/Counter.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++-- A counter, the simplest system with which to test netlist loops++module Counter where++import ForSyDe+import Data.Int++counter :: Signal Int32+counter = sourceSY "counterSource" add1 (0 :: Int32)+ where add1 = $(newProcFun [d| add1 :: Int32 -> Int32 + add1 a = a + 1 |]) +++counterSys :: SysDef (Signal Int32)+counterSys = $(newSysDefTHName 'counter [] ["countVal"])++simCounter :: [Int32]+simCounter = simulate counterSys
+ examples/DeepShallow.hs view
@@ -0,0 +1,22 @@+-- This example shows how to mix shallow-embedded and+-- deep-embedded signals by building an heterogeneous+-- system which adds five to its input+module DeepShallow where++import SeqAddFour (addFourSys)+import ForSyDe(simulate)+import ForSyDe.Shallow+import Data.Int++-- addOne using shallow-embedded signals+addOne :: Signal Int32 -> Signal Int32+addOne = mapSY (+1)++-- addFourSys uses deep-embedded signals, but we can transform them to lists+-- using simulate+addFourLists :: [Int32] -> [Int32]+addFourLists = simulate addFourSys++-- addFive uses addOne and addFourLists+addFive :: Signal Int32 -> Signal Int32+addFive = signal.addFourLists.fromSignal.addOne
+ examples/Equalizer_Shallow/AudioAnalyzer.lhs view
@@ -0,0 +1,55 @@+\subsection{Overview}++The \process{Audio Analyzer} analyzes the current bass level and raises a flag when the bass level exceeds a limit. ++\begin{figure}+\centering+\scalebox{0.8}{\mbox{\input{Figures/AudioAnalyzer.pstex_t}}}+\caption{The \textit{Audio Analyzer} subsystem}+\label{fig:AudioAnalyzerSubsystem}+\end{figure}++As illutsrated in Figure \ref{fig:AudioAnalyzerSubsystem} the \process{Audio Analyzer} is divided into four blocks. The input signal is first grouped into samples of size $N$ in the process \process{Group Samples} and then processed with a \process{DFT} in order to get the frequency spectrum of the signal. Then the power spectrum is calculated in \process{Spectrum}. In \process{CheckBass} the lowest frequencies are compared with a threshold value. If they exceed this value, the output \process{Distortion Flag} will have the value \constant{Fail}.++Since \process{Group Samples} needs $N$ cycles for the grouping, it produces $N-1$ absent values $\perp$ for each grouped sample. Thus the following processes \process{DFT}, \process{Spectrum} and \process{Check Bass} are all $\Psi$-extended in order to be able to process the absent value $\Abst$.+\begin{code}+module AudioAnalyzer (audioAnalyzer) where++import ForSyDe.Shallow+import Complex+import EqualizerTypes++input = 0.1 :- 0.2 :- input++limit :: Double+limit = 1.0++nLow :: Int+nLow = 3++audioAnalyzer :: Int -> Signal Double -> Signal (AbstExt AnalyzerMsg)+audioAnalyzer pts = mapSY (psi checkBass) -- Check Bass + . mapSY (psi spectrum) -- Spectrum+ . mapSY (psi (dft pts)) -- DFT+ . groupSY pts -- Group Samples + . mapSY toComplex++spectrum :: (RealFloat a) => Vector (Complex a) -> Vector a+spectrum = mapV log10 . selectLow nLow . mapV power . selectHalf . dropV 1+ where+ log10 x = log x / log 10+ selectLow n xs = takeV n xs+ selectHalf xs = takeV half xs+ where half = floor (fromIntegral (lengthV xs) / 2) + power x = (magnitude x) ^ 2++checkBass :: Vector Double -> AnalyzerMsg+checkBass = checkLimit limit . sumV+ where+ checkLimit limit x | x > limit = Fail+ | otherwise = Pass+ sumV vs = foldlV (+) 0.0 vs+++toComplex x = x :+ 0+\end{code}
+ examples/Equalizer_Shallow/AudioFilter.lhs view
@@ -0,0 +1,34 @@+\subsection{Overview}+Figure \ref{fig:AudioFilter} shows the structure of the \process{AudioFilter}. The task of this subsystem is to amplify different frequencies of the audio signal independently according to the assigned levels. The audio signal is splitted into three identical signals, one for each frequency region. The signals are filtered and then amplified according to the assigned amplification level. As the equalizer in this design only has a bass and treble control, the middle frequencies are not amplified. The output signal from the \process{Audio Filter} is the addition of the three filtered and amplified signals.++\begin{figure}[h]+\centering+\input{Figures/AudioFilter.pstex_t}+\caption{Subsystems of the \emph{Audio Filter}}+\label{fig:AudioFilter}+\end{figure}++We model this structure as a network of blocks directly from Figure \ref{fig:AudioFilter}. It consists of three filters, two amplifiers and an adder. These blocks are modeled in the process layer. The \process{Audio Filter} has the filter coefficients for the low pass, band pass and high pass filter as parameters.+%+\begin{code}+module AudioFilter where++import ForSyDe.Shallow+import ForSyDe.Shallow.FIR++audioFilter :: Floating a => Vector a -> Vector a -> Vector a + -> Signal a -> Signal a -> Signal a -> Signal a+audioFilter lpCoeff bpCoeff hpCoeff bass treble audioIn = audioOut+ where audioOut = zipWith3SY add3 bassPath middlePath treblePath+ bassPath = ((amplify bass) . lowPass) audioIn+ middlePath = bandPass audioIn+ treblePath = ((amplify treble) . highPass) audioIn+ lowPass = firSY lpCoeff+ bandPass = firSY bpCoeff+ highPass = firSY hpCoeff+ amplify = zipWithSY scale+ add3 x y z = x + y + z+ scale x y = y * (base ** x) + base = 1.1+\end{code}+
+ examples/Equalizer_Shallow/ButtonControl.lhs view
@@ -0,0 +1,140 @@+\subsection{Overview}++The subsystem \process{Button Control} works as a user interface in the equalizer system. It receives the four input signals \signal{BassDn}, \signal{BassUp}, \signal{TrebleDn}, \signal{TrebleUp} and the override signal \process{Override} from the \process{Distortion Control} and calculates the new bass and treble values for the output signals \signal{Bass} and \signal{Treble}. The subsytem contains the main processes \process{Button Interface} and \process{Level Control}. The process \process{Level Control} outputs a new value, if either the signal \signal{Button} or the signal \signal{Overr} is present, otherwise the output value is absent. The process \process{Hold Level} is modeled by means of \process{holdSY (0.0, 0.0)} that outputs the last present value, if the input value is absent. The process \process{unzipSY} transforms a signal of tuples (the current bass and treble level) into a tuple of signals (a bass and a treble signal).++\begin{figure}+\centering+\scalebox{0.8}{\mbox{\input{Figures/ButtonControl.pstex_t}}}+\caption{The Subsystem \process{Button Control}}+\end{figure}++\begin{code}+module ButtonControl (buttonControl) where ++import ForSyDe.Shallow+import EqualizerTypes+import Combinators++data State = Operating + | Locked deriving(Eq, Show)+type Level = Double+type Bass = Level+type Treble = Level++buttonControl :: Signal (AbstExt OverrideMsg) -> Signal (AbstExt Sensor) + -> Signal (AbstExt Sensor) -> Signal (AbstExt Sensor) + -> Signal (AbstExt Sensor) -> (Signal Bass,Signal Treble)+buttonControl overrides bassDn bassUp trebleDn trebleUp + = (bass, treble) + where (bass, treble) = unzipSY levels+ levels = ((holdSY (0.0, 0.0)) `funComb2` levelControl) + button overrides+ button = buttonInterface bassDn bassUp trebleDn trebleUp+\end{code}++\subsection{The Process \process{Button Interface}}++The \process{Button Interface} monitors the four input buttons \signal{BassDn}, \signal{BassUp}, \signal{TrebleDn}, \signal{TrebleUp} and indicates if a button is pressed. If two or more buttons are pressed the conflict is resolved by the priority order of the buttons. ++\begin{code}+buttonInterface :: Signal (AbstExt Sensor) -> Signal (AbstExt Sensor) + -> Signal (AbstExt Sensor) -> Signal (AbstExt Sensor) + -> Signal (AbstExt Button)+buttonInterface bassUp bassDn trebleUp trebleDn + = zipWith4SY f bassUp bassDn trebleUp trebleDn+ where f (Prst Active) _ _ _ = Prst BassUp+ f _ (Prst Active) _ _ = Prst BassDn+ f _ _ (Prst Active) _ = Prst TrebleUp+ f _ _ _ (Prst Active) = Prst TrebleDn+ f _ _ _ _ = Abst+\end{code}++\subsection{The Process \process{Level Control}}++The process has a local state that consists of a mode and the current values for the bass and treble levels (Figure \ref{fig:FSM_LevelControl}). The \process{Level Control} has two modes, in the mode \constant{Operating} the bass and treble values are stepwise changed in 0.2 steps. However, there exists maximum and minimum values which are -5.0 and +5.0. The process enters the mode \constant{Locked} when the \constant{Override} input has the value \constant{Lock}. In this mode an additional increase of the bass level is prohibitet and even decreased by 1.0 in case the \constant{Override} signal has the value \constant{CutBass}. The subsystem returns to the \constant{Operating} mode on the override value \constant{Release}. The output of the process is an absent extended signal of tuples with the current bass and treble levels. ++\begin{figure}+\resizebox{\columnwidth}{!}{\mbox{\input{Figures/FSM_LevelControl.pstex_t}}}+\caption{The State Diagram of the Process \process{Level Control}}+\label{fig:FSM_LevelControl}+\end{figure}+\begin{code}+levelControl :: Signal (AbstExt Button) -> Signal (AbstExt OverrideMsg) + -> Signal (AbstExt (Bass,Treble))+levelControl button overrides + = mealy2SY nextState output (initState, initLevel) button overrides++nextState :: (State,(Double,Double)) -> AbstExt Button + -> AbstExt OverrideMsg -> (State,(Double,Double))+nextState (state, (bass, treble)) button override+ = (newState, (newBass, newTreble)) where+ newState = if state == Operating then+ if override == Prst Lock then+ Locked+ else+ Operating+ else+ if override == Prst Release then+ Operating+ else + Locked++ newBass = if state == Locked then+ if override == Prst CutBass then+ decreaseLevel bass cutStep+ else+ if button == Prst BassDn then+ decreaseLevel bass step+ else+ bass+ else -- state = Operating+ if button == Prst BassDn then+ decreaseLevel bass step+ else + if button == Prst BassUp then+ increaseLevel bass step+ else+ bass+ + newTreble = if button == Prst TrebleDn then+ decreaseLevel treble step+ else + if button == Prst TrebleUp then+ increaseLevel treble step+ else + treble++output :: (a, (Bass, Treble)) -> AbstExt Button -> AbstExt OverrideMsg + -> AbstExt (Bass,Treble)+output _ Abst Abst = Abst+output (_, levels) _ _ = Prst levels +\end{code}++The process uses the following initial values.++\begin{code}+initState = Operating+initLevel = (0.0, 0.0)+maxLevel = 5.0+minLevel = -5.0+step = 0.2+cutStep = 1.0+\end{code}++The process uses the following auxiliary functions.++\begin{code}+decreaseLevel :: Level -> Level -> Level+decreaseLevel level step = if reducedLevel >= minLevel then+ reducedLevel+ else+ minLevel+ where reducedLevel = level - step++increaseLevel :: Level -> Level -> Level+increaseLevel level step = if increasedLevel <= maxLevel then+ increasedLevel+ else+ maxLevel+ where increasedLevel = level + step+\end{code}
+ examples/Equalizer_Shallow/DistortionControl.lhs view
@@ -0,0 +1,61 @@+The block \process{Distortion Control} is directly developed from the SDL-specification, that has been used for the MASCOT-model \cite{BjJa2000}. The specification is shown in Figure \ref{fig:SDL-Distortion Control}.++\begin{figure}[h]+\centering+\includegraphics[scale=0.5]{Figures/DistortionControl.eps}+\caption{SDL-description of \emph{Distortion Control}}+\label{fig:SDL-Distortion Control}+\end{figure}++The \process{Distortion Control} is a single FSM, which is modeled by means of the skeleton \process{mealySY}. The global state is not only expressed by the explicit states - \constant{Passed}, \constant{Failed} and \constant{Locked} -, but also by means of the variable \variable{cnt}. The state machine has two possible input values, \constant{Pass} and \constant{Fail}, and three output values, \constant{Lock}, \constant{Release} and \constant{CutBass}. ++The \process{mealySY} creates a process that can be interpreted as a Mealy-machine. It takes two functions, \function{nxtSt} to calculate the next state and \function{out} to calculate the output. The state is represented by a pair of the explicit state and the variable \variable{cnt}. The initial state is the same as in the SDL-model, given by the tuple \constant{(Passed, 0)}. The \function{nxtSt} function uses pattern matching. Whenever an input value matches a pattern of the \function{nxtSt} function the corresponding right hand side is evaluated, giving the next state. An event with an absent value leaves the state unchanged. The output function is modeled in a similar way. The output is absent, when no output message is indicated in the SDL-model.+%+\begin{code}+module DistortionControl (distortionControl) where++import ForSyDe.Shallow+import EqualizerTypes++data State = Passed+ | Failed+ | Locked++distortionControl :: Signal (AbstExt AnalyzerMsg) + -> Signal (AbstExt OverrideMsg)++distortionControl distortion + = mealySY nxtSt out (Passed, 0) distortion++lim = 3++-- State Input NextState +nxtSt (state, cnt) (Abst) = (state,cnt)+nxtSt (Passed,cnt) (Prst Pass) = (Passed,cnt)+nxtSt (Passed,_ ) (Prst Fail) = (Failed,lim)+nxtSt (Failed,cnt) (Prst Pass) = (Locked,cnt)+nxtSt (Failed,cnt) (Prst Fail) = (Failed,cnt)+nxtSt (Locked,_ ) (Prst Fail) = (Failed,lim)+nxtSt (Locked,cnt) (Prst Pass) = (newSt,newCnt)+ where newSt = if (newCnt == 0) then Passed+ else Locked+ newCnt = cnt - 1++-- State Input Output+out (Passed,_) (Prst Pass) = Abst+out (Passed,_) (Prst Fail) = Prst Lock+out (Failed,_) (Prst Pass) = Abst+out (Failed,_) (Prst Fail) = Prst CutBass+out (Locked,_) (Prst Fail) = Abst +out (Locked,cnt) (Prst Pass) = + if (cnt == 1) then Prst Release+ else Abst+out _ Abst = Abst+\end{code}+++++++
+ examples/Equalizer_Shallow/Equalizer.lhs view
@@ -0,0 +1,55 @@+\subsection{Overview}++The main task of the equalizer system is to adjust the audio signal according to the \process{Button Control}, that works as a user interface. In addition, the bass level must not+exceed a predefined threshold to avoid damage to the speakers.++This specification can be naturally decomposed into four functions shown in+Figure \ref{fig:Equalizer-Level1}. The subsystems \process{Button Control} and \process{Distortion Control}, are control dominated (grey shaded), while the \process{Audio Filter} and the \process{Audio Analyzer} are data flow dominated subsystems. ++\begin{figure}[h]+\centering+\input{Figures/Equalizer-Level1.pstex_t}+\caption{Subsystems of the \process{Equalizer}}+\label{fig:Equalizer-Level1}+\end{figure}++The \process{Button Control} subsystem monitors the button inputs and the override+signal from the subsystem \process{Distortion Control} and adjusts the current+bass and treble levels. This information is passed to the subsystem+\process{Audio Filter}, which receives the audio input, and filters and+amplifies the audio signal according to the current bass and treble+levels. This signal, the output signal of the equalizer, is analyzed by the +\process{Audio Analyzer} subsystem, which determines, whether the bass exceeds a+predefined threshold. The result of this analysis is passed to the subsystem \process{Distortion Control}, which decides, if a minor or major violation is encountered and issues the+necessary commands to the \process{Button Control} subsystem. ++The frequency characteristics of the \process{Equalizer} is adjusted by the coefficients for the three FIR-filters in the \process{AudioFilter}. +%+\begin{code}+module Equalizer(equalizer) where++import ForSyDe.Shallow++import ButtonControl+import DistortionControl+import AudioAnalyzer+import AudioFilter+\end{code}+%+The structure of the equalizer is expressed as a network of blocks:+%+\begin{code}+equalizer lpCoeff bpCoeff hpCoeff dftPts + bassUp bassDn trebleUp trebleDn input = (bass, treble) --output + where+ (bass, treble) = buttonControl overrides bassUp bassDn + trebleUp trebleDn+ output = audioFilter lpCoeff bpCoeff hpCoeff bass + treble input+ distFlag = audioAnalyzer dftPts output+ overrides = distortionControl delayedDistFlag+ delayedDistFlag = delaySY Abst distFlag+\end{code}++Since the equalizer contains a feedback loop, the signal \process{DistFlag} is delayed one event cycle using the initial value \Abst.+
+ examples/Equalizer_Shallow/EqualizerTypes.lhs view
@@ -0,0 +1,21 @@+\subsection{Overview}++This module is a collection of data types that are used in the equalizer model.++\begin{code}+module EqualizerTypes where++data AnalyzerMsg = Pass+ | Fail deriving(Show, Read, Eq)++data OverrideMsg = Lock+ | CutBass+ | Release deriving(Show, Read, Eq)++data Sensor = Active deriving(Show, Read, Eq)++data Button = BassDn+ | BassUp+ | TrebleDn+ | TrebleUp deriving (Show, Read, Eq)+\end{code}
+ examples/Equalizer_Shallow/README view
@@ -0,0 +1,6 @@+This directory contains the Equalizer example, used in Sander's PhD Thesis,+and modelled using shallow-embedded signals.++[San03] Ingo Sander. System Modeling and Design Refinement in ForSyDe. + PhD thesis, Royal Institute of Technology, Stockholm, Sweden,+ April 2003. [http://web.it.kth.se/~ingo/Papers/Thesis_Sander_2003.pdf]
+ examples/Equalizer_Shallow/Test/AudioIn.mat view
@@ -0,0 +1,1 @@+ 3.0000000e+00 1.1102230e-16 6.1803399e-01 0.0000000e+00 1.6180340e+00 -1.7460502e-15 -1.6180340e+00 6.6613381e-16 -6.1803399e-01 1.4432899e-15 -3.0000000e+00 1.2212453e-15 -6.1803399e-01 -8.8817842e-16 -1.6180340e+00 -2.7554553e-15 1.6180340e+00 -1.1102230e-15 6.1803399e-01 1.6653345e-15 3.0000000e+00 -2.2204460e-16 6.1803399e-01 7.6605389e-15 1.6180340e+00 1.0397118e-15 -1.6180340e+00 1.9984014e-15 -6.1803399e-01 2.7755576e-15 -3.0000000e+00 1.7763568e-15 -6.1803399e-01 -1.6653345e-15 -1.6180340e+00 6.0051022e-15 1.6180340e+00 -7.4384943e-15 6.1803399e-01 5.2180482e-15 3.0000000e+00 -1.0214052e-14 6.1803399e-01 -4.4408921e-15 1.6180340e+00 -2.3917751e-15 -1.6180340e+00 7.1054274e-15 -6.1803399e-01 -4.6629367e-15 -3.0000000e+00 -4.5519144e-15 -6.1803399e-01 4.7739590e-15 -1.6180340e+00 9.4365891e-15 1.6180340e+00 3.3306691e-15 6.1803399e-01 -1.0991208e-14 3.0000000e+00 6.4392935e-15 6.1803399e-01 7.7715612e-15 1.6180340e+00 -4.9419158e-16 -1.6180340e+00 9.2148511e-15 -6.1803399e-01 -1.2434498e-14 -3.0000000e+00 -7.2164497e-15 -6.1803399e-01 -2.3092639e-14 -1.6180340e+00 2.2099351e-15 1.6180340e+00 1.5321078e-14 6.1803399e-01 6.3282712e-15 3.0000000e+00 -1.0769163e-14 6.1803399e-01 -1.3211654e-14 1.6180340e+00 6.7324625e-15 -1.6180340e+00 1.4210855e-14 -6.1803399e-01 -5.5511151e-15 -3.0000000e+00 -1.2989609e-14 -6.1803399e-01 -2.2426505e-14 -1.6180340e+00 -1.2122146e-14 1.6180340e+00 1.5543122e-15 6.1803399e-01 3.6637360e-15 3.0000000e+00 4.9960036e-15 6.1803399e-01 1.4765966e-14 1.6180340e+00 -7.3571655e-15 -1.6180340e+00 1.0658141e-14 -6.1803399e-01 -1.2878587e-14 -3.0000000e+00 3.2751579e-14 -6.1803399e-01 -1.5543122e-15 -1.6180340e+00 5.8810900e-14 1.6180340e+00 -2.6201263e-14 6.1803399e-01 -2.6201263e-14 3.0000000e+00 6.4392935e-15 6.1803399e-01 1.1546319e-14 1.6180340e+00 1.0527630e-14 -1.6180340e+00 1.2989609e-14 -6.1803399e-01 -1.1435297e-14 -3.0000000e+00 5.5511151e-16 -6.1803399e-01 -2.6645353e-14 -1.6180340e+00 1.2504396e-14 1.6180340e+00 -2.7977620e-14 6.1803399e-01 2.0428104e-14 3.0000000e+00 3.8524739e-14 6.1803399e-01 3.6637360e-14 1.6180340e+00 5.6834134e-14 -1.6180340e+00 3.8080650e-14 -6.1803399e-01 1.8429702e-14 -3.0000000e+00 1.6764368e-14 -6.1803399e-01 2.2648550e-14 -1.6180340e+00 4.4357592e-14 1.6180340e+00 2.1205260e-14 6.1803399e-01 3.6637360e-14 3.0000000e+00 -2.5757174e-14 6.1803399e-01 -7.5495166e-15 1.6180340e+00 -6.7389618e-14 -1.6180340e+00 1.7208457e-14 -6.1803399e-01 2.3314684e-15 -3.0000000e+00 -1.3211654e-14 -6.1803399e-01 2.5979219e-14 -1.6180340e+00 2.6472797e-14 1.6180340e+00 -3.8857806e-15 6.1803399e-01 4.5519144e-15 3.0000000e+00 4.1078252e-15 6.1803399e-01 6.3504757e-14 1.6180340e+00 7.3385961e-15 -1.6180340e+00 3.6637360e-14 -6.1803399e-01 3.7747583e-15 -3.0000000e+00 4.4408921e-14 -6.1803399e-01 -4.8849813e-15 -1.6180340e+00 -4.8255417e-14 1.6180340e+00 -2.8976821e-14 6.1803399e-01 3.1086245e-15 3.0000000e+00 -8.8595797e-14 6.1803399e-01 -4.9404925e-14 1.6180340e+00 1.4601566e-13 -1.6180340e+00 5.6621374e-14 -6.1803399e-01 4.4519943e-14 -3.0000000e+00 -6.6613381e-16 -6.1803399e-01 1.5987212e-14 -1.6180340e+00 -9.2967930e-15 1.6180340e+00 4.8738791e-14 6.1803399e-01 2.1427304e-14 3.0000000e+00 -8.3266727e-15 6.1803399e-01 -2.9309888e-14 1.6180340e+00 -1.3735233e-14 -1.6180340e+00 -5.1070259e-15 -6.1803399e-01 -2.6201263e-14 -3.0000000e+00 1.7541524e-14 -6.1803399e-01 4.2743586e-14 -1.6180340e+00 9.3610677e-14 1.6180340e+00 1.8540725e-14 6.1803399e-01 3.5305092e-14 3.0000000e+00 -2.6645353e-14 6.1803399e-01 8.8817842e-16 1.6180340e+00 -1.1664270e-13 -1.6180340e+00 -3.1752379e-14 -6.1803399e-01 -4.4519943e-14 -3.0000000e+00 3.5860204e-14 -6.1803399e-01 1.2434498e-14 -1.6180340e+00 1.3967473e-13 1.6180340e+00 4.5186077e-14 6.1803399e-01 5.3512750e-14 3.0000000e+00 -1.0169643e-13 6.1803399e-01 -2.5757174e-14 1.6180340e+00 -1.6270675e-13 -1.6180340e+00 -4.6851412e-14 -6.1803399e-01 -1.1968204e-13 -3.0000000e+00 1.1102230e-13 -6.1803399e-01 3.9079850e-14 -1.6180340e+00 1.8573878e-13 1.6180340e+00 3.4416914e-15 6.1803399e-01 1.2867485e-13 3.0000000e+00 -2.3758773e-14 6.1803399e-01 -5.7731597e-15 1.6180340e+00 -2.4029693e-14 -1.6180340e+00 2.9976022e-14 -6.1803399e-01 -4.1522341e-14 -3.0000000e+00 3.2973624e-14 -6.1803399e-01 1.9206858e-14 -1.6180340e+00 1.0390514e-13 1.6180340e+00 -1.6653345e-14 6.1803399e-01 5.0737192e-14 3.0000000e+00 -4.2077453e-14 6.1803399e-01 -3.2418512e-14 1.6180340e+00 -1.1272631e-13 -1.6180340e+00 3.3306691e-15 -6.1803399e-01 -5.9952043e-14 -3.0000000e+00 5.1181281e-14 -6.1803399e-01 -1.1102230e-14 -1.6180340e+00 1.3575833e-13 1.6180340e+00 9.9920072e-15 6.1803399e-01 6.8944850e-14 3.0000000e+00 3.5971226e-14 6.1803399e-01 -2.2204460e-15 1.6180340e+00 2.5950752e-14 -1.6180340e+00 3.3639758e-14 -6.1803399e-01 1.8207658e-14 -3.0000000e+00 1.2634338e-13 -6.1803399e-01 2.5757174e-14 -1.6180340e+00 1.8182239e-13 1.6180340e+00 -6.6724404e-14 6.1803399e-01 8.7263530e-14 3.0000000e+00 -3.9190873e-14 6.1803399e-01 3.9523940e-14 1.6180340e+00 -2.0113300e-14 -1.6180340e+00 -3.3306691e-15 -6.1803399e-01 -1.1102230e-16 -3.0000000e+00 -8.6597396e-15 -6.1803399e-01 -7.2719608e-14 -1.6180340e+00 9.9988744e-14 1.6180340e+00 -4.0190073e-14 6.1803399e-01 6.6058270e-14 3.0000000e+00 -5.7398530e-14 6.1803399e-01 2.7755576e-15 1.6180340e+00 -6.6177351e-14 -1.6180340e+00 -2.9976022e-14 -6.1803399e-01 -1.3200552e-13 -3.0000000e+00 5.3290705e-15 -6.1803399e-01 -4.6185278e-14 -1.6180340e+00 1.8155103e-14 1.6180340e+00 -1.3544721e-14 6.1803399e-01 7.9936058e-14 3.0000000e+00 -7.1276318e-14 6.1803399e-01 -1.2434498e-14 1.6180340e+00 -2.2592824e-13 -1.6180340e+00 -4.5075055e-14 -6.1803399e-01 -1.5021318e-13 -3.0000000e+00 1.9095836e-14 -6.1803399e-01 -1.9539925e-14 -1.6180340e+00 1.7790599e-13 1.6180340e+00 1.5543122e-15 6.1803399e-01 9.8254738e-14 3.0000000e+00 1.0313972e-13 6.1803399e-01 -3.9079850e-14 1.6180340e+00 -2.7199229e-13 -1.6180340e+00 -7.1609385e-14 -6.1803399e-01 2.4202862e-14 -3.0000000e+00 3.7414516e-14 -6.1803399e-01 1.8540725e-14 -1.6180340e+00 2.2397004e-13 1.6180340e+00 -6.5059069e-14 6.1803399e-01 1.1668444e-13 3.0000000e+00 8.4821039e-14 6.1803399e-01 -7.7049478e-14 1.6180340e+00 5.1425881e-14 -1.6180340e+00 -8.6930463e-14 -6.1803399e-01 5.8841820e-15 -3.0000000e+00 1.6953106e-13 -6.1803399e-01 -4.8072657e-14 -1.6180340e+00 2.7003409e-13 1.6180340e+00 -3.8413717e-14 6.1803399e-01 1.3489210e-13 3.0000000e+00 -4.7184479e-14 6.1803399e-01 -8.0713214e-14 1.6180340e+00 5.3618297e-15 -1.6180340e+00 1.1102230e-16 -6.1803399e-01 -1.2545520e-14 -3.0000000e+00 1.8784974e-13 -6.1803399e-01 -4.4408921e-14 -1.6180340e+00 3.1609814e-13 1.6180340e+00 -1.2545520e-13 6.1803399e-01 -3.9523940e-14 3.0000000e+00 -6.5503158e-14 6.1803399e-01 6.3282712e-15 1.6180340e+00 -4.0702221e-14 -1.6180340e+00 6.6724404e-14 -6.1803399e-01 -3.0864200e-14 -3.0000000e+00 1.3433699e-14 -6.1803399e-01 -1.3145041e-13 -1.6180340e+00 -7.3200267e-15 1.6180340e+00 -9.8920871e-14 6.1803399e-01 -2.1205260e-14 3.0000000e+00 -1.5409896e-13 6.1803399e-01 7.2941653e-14 1.6180340e+00 -3.1413995e-13 -1.6180340e+00 4.0079051e-14 -6.1803399e-01 -2.3303581e-13 -3.0000000e+00 3.1641356e-14 -6.1803399e-01 7.9047879e-14 -1.6180340e+00 3.8744024e-14 1.6180340e+00 1.1168844e-13 6.1803399e-01 -2.8865799e-15 3.0000000e+00 -1.7241764e-13 6.1803399e-01 4.6296300e-14 1.6180340e+00 -3.6020400e-13 -1.6180340e+00 1.3433699e-14 -6.1803399e-01 -2.5135449e-13 -3.0000000e+00 4.9960036e-14
+ examples/Equalizer_Shallow/TestAnalyzer.lhs view
@@ -0,0 +1,30 @@+\begin{code}+module Main(main) where++import IO+import ForSyDe.Shallow+import AudioFilter+import AudioAnalyzer++input = 0.1 :- 0.2 :- input+zeros = (0.0, 0.0) :- zeros+++k = 8+n = 2 ^ k +sig = takeS (2*(2^k)) input+pts = 4++--testFilter = audioFilter zeros input++main = do fftInfile <- openFile "Test/audioOut.dat" ReadMode+ fftOutfile <- openFile "Test/fftOut.dat" WriteMode+ contents <- hGetContents fftInfile+-- hPutStr fftOutfile (writeS (audioAnalyzer 6 ((readS contents2) :: Signal Double)))+ putStr (show (audioAnalyzer pts ((readS contents) :: Signal Double)))+ hPutStr fftOutfile (writeS (audioAnalyzer pts ((readS contents) :: Signal Double)))+-- hClose fftOutfile+ putStr "\nDone.\n"+\end{code}++
+ examples/Equalizer_Shallow/TestButtonControl.lhs view
@@ -0,0 +1,38 @@+\begin{code}+module TestButtonControl where++import ButtonControl+import EqualizerTypes+import ForSyDe.Shallow+++++bassUp = signal [Prst Active, Prst Active, Abst, Abst,+ Prst Active, Prst Active, Abst, Abst,+ Prst Active, Prst Active, Abst, Abst,+ Prst Active, Prst Active, Abst, Abst]++bassDn = signal [Abst, Abst, Prst Active, Abst,+ Abst, Abst, Prst Active, Abst,+ Abst, Abst, Prst Active, Abst,+ Abst, Abst, Prst Active, Abst]++trebleUp = signal [Abst, Abst, Abst, Abst,+ Abst, Abst, Abst, Prst Active,+ Abst, Abst, Abst, Abst,+ Abst, Abst, Abst, Prst Active]++trebleDn = signal [Abst, Abst, Abst, Prst Active,+ Abst, Abst, Abst, Prst Active,+ Abst, Abst, Abst, Prst Active,+ Abst, Abst, Abst, Prst Active]++overrides = signal [Abst, Abst, Abst, Abst,+ Prst Lock, Abst, Abst, Abst,+ Abst, Prst CutBass, Abst, Abst,+ Prst Release, Abst, Abst, Abst]++testButtonControl = buttonControl overrides bassUp bassDn trebleUp trebleDn+--testButtonInterface = buttonInterface bassUp bassDn trebleUp trebleDn +\end{code}
+ examples/Equalizer_Shallow/TestDFT.lhs view
@@ -0,0 +1,17 @@+\begin{code}+module TestFFT where++import ForSyDe.Shallow+import Complex++toComplex a = a:+0++testDFT = dft 8 v3+testFFT = fft 8 v3++testBoth = zipWithV (-) testDFT testFFT++v1 = mapV toComplex (vector [1, 2])+v2 = mapV toComplex (vector [1, 2,3,4])+v3 = mapV toComplex (vector [1, 2, 3, 4, 5, 6, 7, 8])+\end{code}
+ examples/Equalizer_Shallow/TestDistortionControl.lhs view
@@ -0,0 +1,30 @@+\begin{code}+module TestDistortionControl where++import DistortionControl+import EqualizerTypes+import ForSyDe.Shallow++flag = signal+ [Abst, Abst, Abst, Prst Fail,+ Abst, Abst, Abst, Prst Fail,+ Abst, Abst, Abst, Prst Fail,+ Abst, Abst, Abst, Prst Fail,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Fail,+ Abst, Abst, Abst, Prst Fail,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Fail,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Fail,+ Abst, Abst, Abst, Prst Pass,+ Abst, Abst, Abst, Prst Pass] ++testDistortionControl = distortionControl flag+\end{code}
+ examples/Equalizer_Shallow/TestEqualizer.lhs view
@@ -0,0 +1,94 @@+\begin{code}+module TestEqualizer where++import IO+import Equalizer+import EqualizerTypes+import ForSyDe.Shallow+import AudioFilter+import AudioAnalyzer++audioIn = takeS (pts * 4) $ infiniteS (id) 1.0++bassUp = signal [Prst Active, Prst Active, Abst, Abst,+ Prst Active, Prst Active, Abst, Abst,+ Prst Active, Prst Active, Abst, Abst,+ Prst Active, Prst Active, Abst, Abst]++bassDn = signal [Abst, Abst, Prst Active, Abst,+ Abst, Abst, Prst Active, Abst,+ Abst, Abst, Prst Active, Abst,+ Abst, Abst, Prst Active, Abst]++trebleUp = signal [Abst, Abst, Abst, Abst,+ Abst, Abst, Abst, Prst Active,+ Abst, Abst, Abst, Abst,+ Abst, Abst, Abst, Prst Active]++trebleDn = signal [Abst, Abst, Abst, Prst Active,+ Abst, Abst, Abst, Prst Active,+ Abst, Abst, Abst, Prst Active,+ Abst, Abst, Abst, Prst Active]++overrides = signal [Abst, Abst, Abst, Abst,+ Prst Lock, Abst, Abst, Abst,+ Abst, Prst CutBass, Abst, Abst,+ Prst Release, Abst, Abst, Abst]+bass = infiniteS id 0.0+treble = infiniteS id 0.0+dataflow = audioAnalyzer 2 (audioFilter lpCoeff bpCoeff hpCoeff bass treble audioIn)++testEqualizer = equalizer lpCoeff bpCoeff hpCoeff 2 bassUp bassDn trebleUp trebleDn audioIn+--testButtonInterface = buttonInterface bassUp bassDn trebleUp trebleDn +\end{code}++\begin{code}+lpCoeff = vector+ [ 0.01392741661548, 0.01396895728902,+ 0.01399870011280, 0.01401657422649,+ 0.01402253700635, 0.01401657422649,+ 0.01399870011280, 0.01396895728902,+ 0.01392741661548 ]++bpCoeff = vector+ [ 0.06318761339784, 0.08131651217682,+ 0.09562326700432, 0.10478344432968,+ 0.10793629404886, 0.10478344432968,+ 0.09562326700432, 0.08131651217682,+ 0.06318761339784 ]++hpCoeff = vector+ [ -0.07883878579454, -0.09820015927379,+ -0.11354603917221, -0.12339860164118,+ 0.87320570334018, -0.12339860164118,+ -0.11354603917221, -0.09820015927379,+ -0.07883878579454 ]++zeros = infiniteS id 0.0++audioFilterD = audioFilter lpCoeff bpCoeff hpCoeff zeros zeros+pts = 4++main = do + -- Test AudioFilter+ putStr "\n-->Test AudioFilter \n"+ filterInfile <- openFile "Test/AudioIn.mat" ReadMode+ filterContents <- hGetContents filterInfile + putStr (show (audioFilterD (readS filterContents)))+ writeFile "Test/audioOut.dat" (writeS (audioFilterD (readS filterContents))) + -- Test AudioAnalyzer+ putStr "\n--> Test AudioAnalyzer \n"+ analyzerInfile <- openFile "Test/audioOut.dat" ReadMode+ analyzerOutfile <- openFile "Test/analyzerOut.dat" WriteMode+ analyzerContents <- hGetContents analyzerInfile+ putStr (show (audioAnalyzer pts ((readS analyzerContents) :: Signal Double)))+ hPutStr analyzerOutfile (writeS (audioAnalyzer pts ((readS analyzerContents) :: Signal Double)))+ + --fftInfile <- openFile "audioOut.txt" ReadMode+ --fftOutfile <- openFile "fftOut.txt" WriteMode+ --contents <- hGetContents fftInfile+ --putStr (writeS (((readS contents) :: Signal Double)))+ --hPutStr fftOutfile (writeS (((readS contents) :: Signal Double)))+ putStr "\nDone.\n"+\end{code}+
+ examples/Equalizer_Shallow/TestFIR.lhs view
@@ -0,0 +1,10 @@+\begin{code}+module TestFIR(main) where++import ForSyDe.Shallow+import ForSyDe.Shallow.FIR+coeff = vector [0.1, -0.2, 0.5, 0.2]+s = signal [1.0, 0, 0, 0, 0]+main = do putStr (show (firSY coeff s))+ putStr "\nDone\n."+\end{code}
+ examples/Equalizer_Shallow/TestFilter.lhs view
@@ -0,0 +1,82 @@+\begin{code}+module Main where++import IO+import ForSyDe.Shallow+--import FixedPoint+import AudioFilter++zeros = infiniteS id 0.0++s = signal [0.1,0.05,0.3,0.2,-0.5,0.2,0.1,0.3,0.1,-0.1,0.0,0.2]++fs = 200+t = takeS 400 (infiniteS (+1/200) 0.0)+ +cos10 x = cos (2*pi*10*x)+cos50 x = cos (2*pi*50*x)+cos90 x = cos (2*pi*90*x)++modCos x = cos10 x + cos50 x + cos90 x++audioIn = mapSY modCos t++lpCoeffD = vector [+ 0.03898579822345,+ 0.09739504968381,+ 0.15360490491115,+ 0.19416166962179,+ 0.20893350067585,+ 0.19416166962179,+ 0.15360490491115, + 0.09739504968381,+ 0.03898579822345+ ]++bpCoeffD = vector [+ -0.07845593083988,+ 0.00000000000000,+ -0.30707118658796,+ 0.00000000000000,+ 0.58268794919522,+ 0.00000000000000,+ -0.30707118658796,+ 0.00000000000000,+ -0.07845593083988+ ]++hpCoeffD = vector [+ 0.03898579822345, + -0.09739504968381, + 0.15360490491115,+ -0.19416166962179,+ 0.20893350067585,+ -0.19416166962179,+ 0.15360490491115,+ -0.09739504968381,+ 0.03898579822345+ ]++--lpCoeffF8 = mapV real2Fixed8 lpCoeffD+--bpCoeffF8 = mapV real2Fixed8 bpCoeffD+--hpCoeffF8 = mapV real2Fixed8 hpCoeffD+--sF8 = mapSY real2Fixed8 s++--lpCoeffF16 = mapV real2Fixed16 lpCoeffD+--bpCoeffF16 = mapV real2Fixed16 bpCoeffD+--hpCoeffF16 = mapV real2Fixed16 hpCoeffD+--sF16 = mapSY real2Fixed16 s++audioFilterD = audioFilter lpCoeffD bpCoeffD hpCoeffD zeros zeros+outDouble = audioFilter lpCoeffD bpCoeffD hpCoeffD zeros zeros s+--outF16 = audioFilter lpCoeffF16 bpCoeffF16 hpCoeffF16 (mapSY real2Fixed16 zeros) (mapSY real2Fixed16 zeros) sF16+--outF8 = audioFilter lpCoeffF8 bpCoeffF8 hpCoeffF8 (mapSY real2Fixed8 zeros)(mapSY real2Fixed8 zeros) sF8++--writeAudioOut = writeFile "Test/AudioOut.for") . writeS +readAudioIn = readFile "Test/AudioIn.mat"++testSeries = do contents <- readAudioIn+ writeFile "Test/AudioOutFSD.ext" (writeS (audioFilterD (readS contents)))+-- writeAudioIn++\end{code}
+ examples/LFSR.hs view
@@ -0,0 +1,58 @@+{-# LANGUAGE TemplateHaskell #-}++-- This modules implements an Linear Feedback Shiftregister++-- Source:+-- Ben Cohen. VHDL Answers to Frequently Answered Questions. Kluwer. 1998++module LFSR where++import ForSyDe -- Definition of Bit data type+import Data.Bits -- Operations for Bit data type+import List++-- ********************+--+-- Naive Implementation+--+-- ********************++-- Design has one XOR-component+xor2f :: ProcFun (Bit -> Bit -> Bit)+xor2f = $(newProcFun [d|xor2f :: Bit -> Bit -> Bit+ xor2f x1 x0 = xor x1 x0 |])++xor2Proc :: Signal Bit -> Signal Bit -> Signal Bit+xor2Proc = zipWithSY "xor2" xor2f++xor2Sys :: SysDef (Signal Bit -> Signal Bit -> Signal Bit)+xor2Sys = newSysDef xor2Proc "xor2" ["in1", "in0"] ["out0"]+++-- Design has four D-Flip-Flops+dffProc :: Signal Bit -> Signal Bit+dffProc = delaySY "delayDFF" H -- Starting Sequence must not be LL...L++dffSys :: SysDef (Signal Bit -> Signal Bit)+dffSys = newSysDef dffProc "DelayFF" ["in1"] ["in0"]++-- Netlist of LFSR+lfsr :: (Signal Bit, Signal Bit, Signal Bit, Signal Bit)+lfsr = (s1, s2, s3, s4)+ where s5 = instantiate "xor2" xor2Sys s1 s4+ s1 = instantiate "dff1" dffSys s5+ s2 = instantiate "dff2" dffSys s1+ s3 = instantiate "dff3" dffSys s2+ s4 = instantiate "dff4" dffSys s3++lfsrSys :: SysDef ((Signal Bit, Signal Bit, Signal Bit, Signal Bit))+lfsrSys = newSysDef lfsr "lfsr" [] ["s1", "s2", "s3", "s4"]++simlfsr :: ([Bit], [Bit], [Bit], [Bit])+simlfsr = simulate lfsrSys++zip4tuple (a, b, c, d) = zip4 a b c d++createVHDL = writeVHDL lfsrSys++myLFSRtest = (take 20 . zip4tuple) (simlfsr)
+ examples/Multiplexer.hs view
@@ -0,0 +1,57 @@+{-# LANGUAGE TemplateHaskell #-}+-- multiplexer+module Multiplexer where++import ForSyDe+import Language.Haskell.TH.Lift++-- I used tuples, but a vector of bits is what I would like to have+selectf :: ProcFun((Bit, Bit) -> (Bit, Bit, Bit, Bit) -> Bit)+selectf = $(newProcFun [d| select1 :: (Bit, Bit) + -> (Bit, Bit, Bit, Bit) -> Bit + select1 (s1, s0) (x3, x2, x1, x0) =+ if (s1 == L) && (s0 == L) then+ x0+ else + if (s1 == L) && (s0 == H) then+ x1+ else+ if (s1 == H) && (s0 == L) then+ x2+ else+ x3 |])+++-- System function (or process) which uses 'selectf'+selectProc :: Signal (Bit, Bit) -> Signal (Bit, Bit, Bit, Bit) -> Signal Bit+selectProc = zipWithSY "select1" selectf++-- System definition associated to the system process 'selectProc' +muxSysDef :: SysDef (Signal (Bit, Bit) -> Signal (Bit, Bit, Bit, Bit) -> Signal Bit)+muxSysDef = $(newSysDefTHName 'selectProc ["sel", "data"] ["out1"])++-- we simulate the system+simMux :: [(Bit, Bit)] -> [(Bit, Bit, Bit, Bit)] -> [Bit]+simMux = simulate muxSysDef+++selIn = [(L,L),(L,H),(H,L)]+dataIn = [(L,L,L,H), (L,L,L,H), (L,H,L,L)]+++-- translate to VHDL, write output and run in QUartus+vhdlMux :: IO ()+vhdlMux = writeVHDLOps defaultVHDLOps{execQuartus=Just quartusOps} muxSysDef+ where quartusOps = QuartusOps FullCompilation+ (Just 50)+ (Just ("CycloneII", Just "EP2C35F672C6"))+ [("sel.tup_1","PIN_AF14"),+ ("sel.tup_2","PIN_AD13"),+ ("data.tup_1","PIN_N25"),+ ("data.tup_2","PIN_N26"),+ ("data.tup_3","PIN_P25"),+ ("data.tup_4","PIN_AE14"),+ ("out1","PIN_AE23")]+++
+ examples/Multiplexer_FSVector.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE TemplateHaskell #-}+-- multiplexer+module Multiplexer_FSVector where++import ForSyDe+import Language.Haskell.TH.Lift+import Data.Param.FSVec+import Data.TypeLevel.Num.Reps+import Data.TypeLevel.Num.Aliases++-- I used tuples, but a vector of bits is what I would like to have+selectf :: ProcFun(FSVec D2 Bit -> FSVec D4 Bit -> Bit)+selectf = $(newProcFun [d| select1 :: FSVec D2 Bit + -> FSVec D4 Bit -> Bit + select1 sel input =+ if (sel!d1 == L) && (sel!d0 == L) then+ input!d0+ else + if (sel!d1 == L) && (sel!d0 == H) then+ input!d1+ else+ if (sel!d1 == H) && (sel!d0 == L) then+ input!d2+ else+ input!d3 |])+++-- System function (or process) which uses 'selectf'+selectProc :: Signal (FSVec D2 Bit) -> Signal (FSVec D4 Bit) -> Signal Bit+selectProc = zipWithSY "select1" selectf++-- System definition associated to the system process 'selectProc' +muxSysDef :: SysDef (Signal (FSVec D2 Bit) -> Signal (FSVec D4 Bit) -> Signal Bit)+muxSysDef = $(newSysDefTHName 'selectProc ["sel", "data"] ["out1"])++-- we simulate the system+simMux :: [FSVec D2 Bit] -> [FSVec D4 Bit] -> [Bit]+simMux = simulate muxSysDef++selIn = [$(vectorTH [L,L]), $(vectorTH [H,L]), $(vectorTH [L,H]) ]+dataIn = [$(vectorTH [L,H,H,H]), $(vectorTH [H,L,H,H]), $(vectorTH [H,H,L,H])]++-- Create VHDL+createVHDL = writeVHDL muxSysDef+
+ examples/Null.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++-- This module is aimed at testing the, normally useless but possible, +-- null system++module Null where++import ForSyDe++nullSysF :: ()+nullSysF = ()++nullSysDef :: SysDef ()+nullSysDef = $(newSysDefTHName 'nullSysF [] [])++nullIns0 :: ()+nullIns0 = instantiate "null0" nullSysDef++simNull :: ()+simNull = simulate nullSysDef
+ examples/ParAddFour.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE TemplateHaskell #-}+-- Naive example to test instances working in paralell+-- Adds a signal to four signals+module ParAddFour where++import ForSyDe+import Data.Int+++add :: ProcFun (Int32 -> Int32 -> Int32)+add = $(newProcFun [d| add :: Int32 -> Int32 -> Int32+ add a b = a + b |])++addProc :: Signal Int32 -> Signal Int32 -> Signal Int32+addProc s1 s2 = zipWithSY "zip1" add s1 s2+++addSys :: SysDef (Signal Int32 -> Signal Int32 -> Signal Int32)+addSys = $(newSysDefTHName 'addProc ["in1","in2"] ["sum"])++simAdd :: [Int32] -> [Int32] -> [Int32]+simAdd = simulate addSys++parAddFour :: Signal Int32 + -> Signal Int32 -> Signal Int32 -> Signal Int32 -> Signal Int32 + -> (Signal Int32, Signal Int32, Signal Int32, Signal Int32)+parAddFour toAdd s1 s2 s3 s4 = (sum1, sum2, sum3, sum4)+ where sum1 = (instantiate "adder1" addSys) toAdd s1+ sum2 = (instantiate "adder2" addSys) toAdd s2+ sum3 = (instantiate "adder3" addSys) toAdd s3+ sum4 = (instantiate "adder4" addSys) toAdd s4++parAddFourSys :: SysDef (Signal Int32 + -> Signal Int32 -> Signal Int32 -> Signal Int32 -> Signal Int32 + -> (Signal Int32, Signal Int32, Signal Int32, Signal Int32))+parAddFourSys = $(newSysDefTHName 'parAddFour ["toAdd","s1","s2","s3","s4"]+ ["sum1","sum2","sum3","sum4"])+++simParAddFour :: [Int32]+ -> [Int32] -> [Int32] -> [Int32] -> [Int32]+ -> ([Int32], [Int32], [Int32], [Int32]) +simParAddFour = simulate parAddFourSys
+ examples/SeqAddFour.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE TemplateHaskell #-}++-- This module is aimed at testing a naive use-case of +-- the instantiation mechanism++-- We'll build a system which uses four single-adder components connected+-- sequentially to add four units to the values of the input signal++module SeqAddFour where++import ForSyDe+import Data.Int++-- A process function which adds one to its input+addOnef :: ProcFun (Int32 -> Int32)+addOnef = $(newProcFun [d|addOnef :: Int32 -> Int32 + addOnef n = n + 1 |])++-- System function (or process) which uses addOnef+addOneProc :: Signal Int32 -> Signal Int32+addOneProc = mapSY "addOne" addOnef+++-- System definition associated to the system function+addOneSysDef :: SysDef (Signal Int32 -> Signal Int32)+addOneSysDef = newSysDef addOneProc "addOne" ["in1"] ["out1"]+++-- Finally, we create the sequential add four system function+addFour :: Signal Int32 -> Signal Int32+addFour = instantiate "addOne3" addOneSysDef .+ instantiate "addOne2" addOneSysDef .+ instantiate "addOne1" addOneSysDef .+ instantiate "addOne0" addOneSysDef++-- We build the system+addFourSys :: SysDef (Signal Int32 -> Signal Int32)+addFourSys = newSysDef addFour "addFour" ["in1"] ["out1"]++-- we simulate the system+simAddFour :: [Int32] -> [Int32]+simAddFour = simulate addFourSys++-- we generate VHDL+createVHDL = writeVHDL addFourSys
+ examples/ZipTwist.hs view
@@ -0,0 +1,36 @@+{-# LANGUAGE TemplateHaskell #-}+-- An identity system of six inputs formed by various zipping and unzipping+-- processes+module ZipTwist where++import ForSyDe+import Data.Param.FSVec+import Data.TypeLevel.Num.Reps+import Data.Int++zip6xSY :: ProcId -> FSVec D6 (Signal Int32) -> Signal (FSVec D6 Int32)+zip6xSY = zipxSY++zipTwistFun :: Signal Int32 -> Signal Int32 -> Signal Int32 + -> Signal Int32 -> Signal Int32 -> Signal Int32+ -> (Signal Int32, Signal Int32, Signal Int32,+ Signal Int32, Signal Int32, Signal Int32)+zipTwistFun i1 i2 i3 i4 i5 i6 = (o1,o2,o3,o4,o5,o6)+ where [i1',i2',i3',i4',i5',i6'] = (fromVector.unzipxSY "unzipxSY" . zip6xSY "zip6xsy")+ $ reallyUnsafeVector [i1,i2,i3,i4,i5,i6]+ zip13 = zip3SY "zip13" i1' i2' i3'+ zip46 = zip3SY "zip46" i4' i5' i6'+ (o1,o2,o3) = unzip3SY "unzip13" zip13+ (o4,o5,o6) = unzip3SY "unzip46" zip46++zipTwistSys :: SysDef (Signal Int32 -> Signal Int32 -> Signal Int32 + -> Signal Int32 -> Signal Int32 -> Signal Int32+ -> (Signal Int32, Signal Int32, Signal Int32,+ Signal Int32, Signal Int32, Signal Int32))+zipTwistSys = $(newSysDefTHName 'zipTwistFun + ["in1","in2","in3","in4","in5","in6"]+ ["out1","out2","out3","out4","out5","out6"])++simZipTwist = simulate zipTwistSys++writeVHDLZipTwist = writeVHDL zipTwistSys
+ lib/forsyde.vhd view
@@ -0,0 +1,158 @@+library ieee;+use ieee.numeric_std.all;+use ieee.std_logic_1164.all;+ +package types is+ + function default return integer;+ function show (i : integer) return string; + +-- Commented out due to representation overflow (modelsim integers+-- are 32bits long)+-- subtype int64 is integer range -(2**(64-1)) to +(2**(64-1)-1); ++-- Commented out due to a overflow in 2**32:+-- subtype int32 is integer range -(2**(32-1)) to +(2**(32-1)-1); ++-- Note the lower bound is not -2147483648 because the LRM doesn't+-- force to include it.+ subtype int32 is integer range -2147483647 to +2147483647; + + subtype int16 is integer range -(2**(16-1)) to +(2**(16-1)-1); ++ subtype int8 is integer range -(2**(8-1)) to +(2**(8-1)-1);++ function default return std_logic;+ function show (s : std_logic) return string;+ + function default return boolean;+ function show (b : boolean) return string;+ + -- Indexes for unconstrained fsvecs:+ -- -1 is used to express the null vector, with bounds (0 to -1)+ subtype fsvec_index is integer range -1 to integer'high;++ -- Unconstrained translation of "FSVec _ Bit"+ -- needed for toBitVector and fromBitVector+ type fsvec_std_logic is array (fsvec_index range <>) of std_logic;++ function toBitVector8 (i : int8) return fsvec_std_logic; + function toBitVector16 (i : int16) return fsvec_std_logic;+ function toBitVector32 (i : int32) return fsvec_std_logic;++ function fromBitVector8 (v : fsvec_std_logic) return int8; + function fromBitVector16 (v : fsvec_std_logic) return int16;+ function fromBitVector32 (v : fsvec_std_logic) return int32;+ +end types;++package body types is++-- Commented out due to representation overflow +-- function default return int64 is+-- begin +-- return 0;+-- end default;++ function default return integer is+ begin + return 0;+ end default;++ function show (i : integer) return string is+ begin+ return integer'image(i);+ end show;++ function default return std_logic is+ begin+ return '0';+ end default;++ function show (s : std_logic) return string is+ begin+ if s = '1' then+ return "H";+ else+ return "L";+ end if;+ end show;++ + function default return boolean is+ begin+ return true;+ end default;++ function show (b : boolean) return string is+ begin+ if b then+ return "True";+ else+ return "False";+ end if;+ end show;++ function toBitVector8 (i : int8) return fsvec_std_logic is+ variable inter : signed (0 to 7) := to_signed (i, 8);+ variable ret : fsvec_std_logic (0 to 7); + begin+ for index in 0 to ret'length-1 loop+ ret(index) := inter(index);+ end loop;+ return ret;+ end toBitVector8;+++ function toBitVector16 (i : int16) return fsvec_std_logic is+ variable inter : signed (0 to 15) := to_signed (i, 16);+ variable ret : fsvec_std_logic (0 to 15); + begin+ for index in 0 to ret'length-1 loop+ ret(index) := inter(index);+ end loop;+ return ret;+ end toBitVector16;+++ function toBitVector32 (i : int32) return fsvec_std_logic is+ variable inter : signed (0 to 31) := to_signed (i, 32);+ variable ret : fsvec_std_logic (0 to 31); + begin+ for index in 0 to ret'length-1 loop+ ret(index) := inter(index);+ end loop;+ return ret;+ end toBitVector32;+++ function fromBitVector8 (v : fsvec_std_logic) return int8 is+ variable inter : signed (0 to 7);+ begin+ for index in 0 to inter'length-1 loop+ inter(index) := v(index);+ end loop;+ return to_integer(inter);+ end frombitVector8;++ function fromBitVector16 (v : fsvec_std_logic) return int16 is+ variable inter : signed (0 to 15);+ begin+ for index in 0 to inter'length-1 loop+ inter(index) := v(index);+ end loop;+ return to_integer(inter);+ end frombitVector16;+++ function fromBitVector32 (v : fsvec_std_logic) return int32 is+ variable inter : signed (0 to 31);+ begin+ for index in 0 to inter'length-1 loop+ inter(index) := v(index);+ end loop;+ return to_integer(inter);+ end frombitVector32;+ ++end types;
+ src/Data/Traversable/GenericZipWith.hs view
@@ -0,0 +1,71 @@+---------------------------------------------------------------------------+-- |+-- Module : Data.Traversable.GenericZipWith+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides generalized zipWith functions.+-- +-----------------------------------------------------------------------------+module Data.Traversable.GenericZipWith + (zipWithTF,+ zipTF,+ zipWithTFA,+ zipWithTFM) where+++import Data.Foldable+import Data.Traversable+import qualified Data.Traversable as T+import Control.Applicative+import Control.Monad.State ++-- | The state contains the list of values obtained form the foldable container+-- and a String indicating the name of the function currectly being executed+data ZipState a = ZipState {fName :: String,+ list :: [a]}++-- | State monad containing ZipState+type ZipM l a = State (ZipState l) a++-- | pops the first element of the list inside the state+pop :: ZipM l l+pop = do + st <- get + let xs = list st+ n = fName st+ case xs of+ (a:as) -> do put st{list=as}+ return a+ [] -> error $ n ++ ": insufficient input"++-- | pop a value form the state and supply it to the second +-- argument of a binary function +supplySecond :: (a -> b -> c) -> a -> ZipM b c+supplySecond f a = do b <- pop + return $ f a b++zipWithTFError :: (Traversable t,Foldable f) => + String -> (a -> b -> c) -> t a -> f b -> t c +zipWithTFError str g t f = evalState (T.mapM (supplySecond g) t) + (ZipState str (toList f))+++zipWithTF :: (Traversable t,Foldable f) => (a -> b -> c) -> t a -> f b -> t c+zipWithTF = zipWithTFError "GenericZip.zipWithTF"++zipTF :: (Traversable t, Foldable f) => t a -> f b -> t (a,b)+zipTF = zipWithTFError "GenericZip.zipTF" (,) +++zipWithTFM :: (Traversable t,Foldable f,Monad m) => + (a -> b -> m c) -> t a -> f b -> m (t c)+zipWithTFM g t f = T.sequence (zipWithTFError "GenericZip.zipWithTFM" g t f)+ +zipWithTFA :: (Traversable t,Foldable f,Applicative m) => + (a -> b -> m c) -> t a -> f b -> m (t c)+zipWithTFA g t f = sequenceA (zipWithTFError "GenericZip.zipWithTFA" g t f)
+ src/Data/Typeable/TypeRepLib.hs view
@@ -0,0 +1,31 @@+---------------------------------------------------------------------------+-- |+-- Module : Data.Typeable.TypeRepLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides basic functions related to Data.Typeables's 'TypeRep'.+-- +-----------------------------------------------------------------------------+module Data.Typeable.TypeRepLib (unArrowT) where++import Data.Typeable+++-- | Obtains the arguments and return type of a given 'TypeRep' +-- (normally a function)+-- together with its 'Context' (non-empty if the type is polymorphic)+unArrowT :: TypeRep -- ^ TypeRep to observe + -> ([TypeRep], TypeRep) -- ^ (args 'TypeRep', ret 'TypeRep')+unArrowT rep+ | repCon == arrowTyCon = let (args', ret') = unArrowT arrowArg2+ in (arrowArg1:args', ret')+ | otherwise = ([], rep)+ where (repCon,~[arrowArg1,arrowArg2]) = splitTyConApp rep++arrowTyCon :: TyCon+arrowTyCon = (typeRepTyCon.typeOf) (undefined :: () -> ())
+ src/ForSyDe.hs view
@@ -0,0 +1,36 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe+-- Copyright : (c) SAM Group (KTH) 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module is a wrapper for all the publicly usable types and+-- functions of ForSyDe's deep-embedded Domain Specific Language+-- (DSL). For the shallow-embedded DSL, please see "ForSyDe.Shallow".+--+-- +-----------------------------------------------------------------------------+module ForSyDe +(module ForSyDe.Ids,+ module ForSyDe.Signal,+ module ForSyDe.System,+ module ForSyDe.Process,+ module ForSyDe.Backend,+ module ForSyDe.Bit,+ module ForSyDe.AbsentExt,+ module ForSyDe.DFT,+ module ForSyDe.FIR) where++import ForSyDe.Ids+import ForSyDe.Signal (Signal)+import ForSyDe.Bit+import ForSyDe.Process+import ForSyDe.System+import ForSyDe.Backend+import ForSyDe.AbsentExt+import ForSyDe.DFT+import ForSyDe.FIR
+ src/ForSyDe/AbsentExt.hs view
@@ -0,0 +1,100 @@+{-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-} +-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.AbsentExt+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- The 'AbstExt' is used to extend existing data types with the value+-- \'absent\', which models the absence of a value.+-- +-----------------------------------------------------------------------------++module ForSyDe.AbsentExt( + AbstExt (Abst, Prst), fromAbstExt, unsafeFromAbstExt, + abstExt, psi, + isAbsent, isPresent, abstExtFunc)+ where++import Data.Generics+import Language.Haskell.TH.Lift+++-- |The data type 'AbstExt' has two constructors. The constructor 'Abst' is used to model the absence of a value, while the constructor 'Prst' is used to model present values.+data AbstExt a = Abst + | Prst a + deriving (Eq, Data, Typeable)+$(deriveLift1 ''AbstExt)++++-- |The function 'fromAbstExt' extracts the inner value contained in 'AbstExt'+fromAbstExt :: a -- ^ Default value returned if the input is 'Abst' + -> AbstExt a -> a+-- |Similar to 'fromAbstExt', but without default value+unsafeFromAbstExt :: AbstExt a -> a +-- |The functions 'isPresent' checks for the presence of a value.+isPresent :: AbstExt a -> Bool+-- |The functions 'isAbsent' checks for the absence of a value.+isAbsent :: AbstExt a -> Bool+-- |The function 'abstExtFunc' extends a function in order to process absent extended values. If the input is (\"bottom\"), the output will also be (\"bottom\").+abstExtFunc :: (a -> b) -> AbstExt a -> AbstExt b+-- | The function 'psi' is identical to 'abstExtFunc' and should be used in future.+psi :: (a -> b) -> AbstExt a -> AbstExt b+-- | The function 'abstExt' converts a usual value to a present value. +abstExt :: a -> AbstExt a+++++++-- Implementation of Library Functions++-- | The data type 'AbstExt' is defined as an instance of 'Show' and 'Read'. \'_\' represents the value 'Abst' while a present value is represented with its value, e.g. 'Prst' 1 is represented as \'1\'.+instance Show a => Show (AbstExt a) where+ showsPrec _ x = showsAbstExt x++showsAbstExt :: Show a => AbstExt a -> [Char] -> [Char]+showsAbstExt Abst = (++) "_" +showsAbstExt (Prst x) = (++) (show x)++instance Read a => Read (AbstExt a) where+ readsPrec _ x = readsAbstExt x ++readsAbstExt :: (Read a) => ReadS (AbstExt a)+readsAbstExt s = [(Abst, r1) | ("_", r1) <- lex s]+ ++ [(Prst x, r2) | (x, r2) <- reads s]++abstExt v = Prst v++fromAbstExt x Abst = x +fromAbstExt _ (Prst y) = y ++unsafeFromAbstExt (Prst x) = x +unsafeFromAbstExt Abst = error "AbsentExt.unsafeFromAbstExt: Abst"++isPresent Abst = False+isPresent (Prst _) = True++isAbsent = not . isPresent++abstExtFunc f = f' + where f' Abst = Abst+ f' (Prst x) = Prst (f x)+++psi = abstExtFunc+++++++++
+ src/ForSyDe/Backend.hs view
@@ -0,0 +1,24 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Wrapper module exporting all the backends+-- +-----------------------------------------------------------------------------+module ForSyDe.Backend + (module ForSyDe.Backend.Simulate,+ module ForSyDe.Backend.VHDL,+ module ForSyDe.Backend.GraphML) where++import ForSyDe.Backend.Simulate+import ForSyDe.Backend.VHDL+import ForSyDe.Backend.GraphML+++
+ src/ForSyDe/Backend/GraphML.hs view
@@ -0,0 +1,45 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.GraphML+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides the GraphML backend of ForSyDe's embedded compiler+--+-----------------------------------------------------------------------------+-- FIXME: factorize code shared between backends, and create a common interface for+-- backends (maybe based on a MPTC)++module ForSyDe.Backend.GraphML+ (writeGraphML, + writeGraphMLOps, + GraphMLOps(..),+ GraphMLDebugLevel(..),+ GraphMLRecursivity(..),+ defaultGraphMLOps) where++import Control.Monad.State (evalStateT)+import ForSyDe.ForSyDeErr+import ForSyDe.OSharing (readURef)+import ForSyDe.System.SysDef+import ForSyDe.Backend.GraphML.Traverse++-- | Given a System Definition whose name is A generate @A.graphml@ in current +-- working directory using the default compilation options.+writeGraphML :: SysDef a -> IO ()+writeGraphML = writeGraphMLOps defaultGraphMLOps ++-- | 'writeGraphML'-alternative which allows setting GraphML compilation +-- options.+writeGraphMLOps :: GraphMLOps -> SysDef a -> IO ()+writeGraphMLOps ops sysDef = do+ -- initiate the compilation State+ let s = initGraphMLTravST $ (readURef.unPrimSysDef.unSysDef) sysDef+ -- Translate the code+ res <- runErrorT $ evalStateT (setGraphMLOps ops >> writeGraphMLM) s+ -- Check if the compilation went well and print an error in case it didn't+ either printGraphMLError return res
+ src/ForSyDe/Backend/GraphML/AST.hs view
@@ -0,0 +1,44 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.GraphML.AST+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- AST covering the GraphML subset we are interested in for this backend+-----------------------------------------------------------------------------++--FIXME: the design of this module is ugly++module ForSyDe.Backend.GraphML.AST where++import ForSyDe.Netlist++type GraphMLGraphId = String+type GraphMLPortId = String+type GraphMLNodeId = String++-- | Main AST type, a graph+data GraphMLGraph = GraphMLGraph + GraphMLGraphId -- Graph id+ [GraphMLNode] -- Nodes + [GraphMLEdge] -- Edges+++-- | Edge+data GraphMLEdge = GraphMLEdge + GraphMLNode -- Origin node+ GraphMLPortId -- Origin port id+ GraphMLNode -- Target node+ GraphMLPortId -- Target port id++-- | Node+data GraphMLNode = + ProcNode (NlNode GraphMLPortId) -- Netlist node indicating the input ports+ [GraphMLPortId] -- Output ports + -- FIXME: This representation is ugly+ |+ OutNode GraphMLNodeId GraphMLPortId -- the special output node
+ src/ForSyDe/Backend/GraphML/FileIO.hs view
@@ -0,0 +1,27 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.GraphML.FileIO+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Functions working with files in the GraphML backend. +--+-----------------------------------------------------------------------------+module ForSyDe.Backend.GraphML.FileIO where++import ForSyDe.Backend.GraphML.AST+import ForSyDe.Backend.GraphML.Ppr(YFilesMarkup, pprGraphWithHeaders)++import System.IO+import Text.PrettyPrint.HughesPJ++-- | Write a design file to a file in disk+writeGraph :: YFilesMarkup -> GraphMLGraph -> FilePath -> IO ()+writeGraph yFiles graph fp = do+ handle <- openFile fp WriteMode+ hPutStr handle $ (render . pprGraphWithHeaders yFiles) graph+ hClose handle
+ src/ForSyDe/Backend/GraphML/Ppr.hs view
@@ -0,0 +1,325 @@+{-# LANGUAGE TypeSynonymInstances, MultiParamTypeClasses #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.GraphML.Ppr+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- GraphML pretty printing instances.+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.GraphML.Ppr where++import ForSyDe.Backend.Ppr+import ForSyDe.Ids+import ForSyDe.Process.ProcVal+import ForSyDe.Process.ProcFun+import ForSyDe.Backend.GraphML.AST+import ForSyDe.Netlist+import ForSyDe.Netlist.Traverse+import ForSyDe.System.SysDef+import ForSyDe.OSharing++import Data.Maybe (fromJust)+import Data.List (findIndex)+import qualified Data.Foldable as DF (foldr, toList)+import Language.Haskell.TH (pprint, Dec(FunD), Exp, nameBase)+import Text.PrettyPrint.HughesPJ+++-- | The only accepted pretyprinting option+type YFilesMarkup = Bool++-- | Number of spaces used for indentation+nestVal :: Int+nestVal = 5+++instance PprOps YFilesMarkup GraphMLGraph where+ pprOps yFiles (GraphMLGraph id nodes edges) =+ text "<graph" <+> text ("id=\"" ++ id ++ "\"") <+> + text "edgedefault=\"directed\" >" $+$+ nest nestVal (vSpace $+$ + pprOps_list yFiles (vNSpaces 1) nodes $+$+ vSpace $+$+ pprOps_list yFiles (vNSpaces 1) edges $+$+ vSpace) $+$+ text "</graph>" ++instance PprOps YFilesMarkup GraphMLNode where+ pprOps yFiles node =+ text "<node" <+> text ("id=\"" ++ id ++ "\"") <> text ">" $+$ + nest nestVal (+ (case node of+ ProcNode ins _ ->+ case ins of+ InPort _ -> + process_type "InPort" $+$+ yFilesNodeTags dim "#000000" "rectangle" (Just "w") id + Proc _ (Const pval) -> + let arg = (expVal.valAST) pval+ in process_type "ConstSY" $+$+ value_arg arg $+$+ yFilesNodeTags dim "#FFFFFF" "ellipse" Nothing ("ConstSY\n" ++ show id ++ "\nval=" ++ pprint arg)+ Proc _ (ZipWithNSY tpf i) -> + let nins = length i+ typ = case nins of+ 1 -> "MapSY"+ _ -> "ZipWith" ++ show nins ++ "SY"+ pfAST = (tpast.tast) tpf+ in process_type "ZipWithNSY" $+$+ procfun_arg pfAST $+$+ yFilesNodeTags dim "#6F7DBC" "roundrectangle" Nothing (typ ++ "\n" ++ show id ++ "\nfName=" ++ nameBase (name pfAST))+ Proc _ (ZipWithxSY tpf _) -> + process_type "ZipWithxSY" $+$+ procfun_arg ((tpast.tast) tpf) $+$+ yFilesNodeTags dim "#AFADFC" "rectangle" Nothing ("ZipWithxSY\n" ++ show id)+ Proc _ (UnzipNSY t _ _) -> + let typ = "Unzip" ++ show (length t) ++ "SY"+ in process_type "UnzipNSY" $+$+ yFilesNodeTags dim "#5993A3" "roundrectangle" Nothing (typ ++ "\n" ++ show id)+ Proc _ (UnzipxSY _ _ _ _) -> + process_type "UnzipxSY" $+$+ yFilesNodeTags dim "#99D3E3" "rectangle" Nothing ("UnzipxSY\n" ++ show id )+ Proc _ (DelaySY pval _) -> + let arg = (expVal.valAST) pval+ in process_type "DelaySY" $+$+ value_arg arg $+$+ yFilesNodeTags dim "#FF934C" "diamond" Nothing ("DelaySY\n" ++ show id ++ "\nval=" ++ pprint arg)+ Proc _ (SysIns psd _) -> + let parId = (sid.readURef.unPrimSysDef) psd+ in process_type "SysIns" $+$+ instance_parent parId $+$+ yFilesNodeTags dim "#FF934C" "rectangle" Nothing ("SysIns\n" ++ show id ++ "\nparent=" ++ parId)+ OutNode _ _ -> + process_type "OutPort" $+$+ yFilesNodeTags dim "#000000" "rectangle" (Just "e") id + ) $+$ vcat (map port portIds) + ) $+$+ text "</node>" + where + (id, portIds) = + case node of+ ProcNode ins outs ->+ let pids = arguments ins ++ outs+ in case ins of+ InPort id -> (id, pids)+ Proc id _ -> (id, pids)+ OutNode id portid -> (id,[portid])+ dim = nodeDims node+ -- write the yFiles specific markup for the node+ yFilesNodeTags (xsize, ysize) color shape mSide label =+ let labelLocation = maybe "modelName=\"internal\" modelPosition=\"c\""+ (\s -> "modelName=\"sides\" modelPosition=\""+++ s ++ "\"")+ mSide in + if yFiles + then + text "<data key=\"d0\">" $+$+ nest nestVal + (text "<y:ShapeNode>" $+$+ nest nestVal + (text "<y:Geometry height=\"" <> float ysize <> text "\" width=\"" <> float xsize <> text "\" x=\"0.0\" y=\"0.0\"/>" $+$+ text "<y:Fill color=\"" <> text color <> text "\" transparent=\"false\"/>" $+$+ text "<y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\"" <+> text labelLocation <+> text "textColor=\"#000000\" visible=\"true\">" <> text label <> text "</y:NodeLabel>" $+$+ text "<y:Shape type=\"" <> text shape <> text "\"/>"+ ) $+$+ text "</y:ShapeNode>" + ) $+$+ text "</data>"+ else empty++instance PprOps YFilesMarkup GraphMLEdge where+ pprOps yFiles (GraphMLEdge origN origP targetN targetP) = + text "<edge" <+> text ("source=\"" ++ origId ++ "\"") <+> + text ("sourceport=\"" ++ origP ++ "\"") <+>+ text ("target=\"" ++ targetId ++ "\"") <+> + text ("targetport=\"" ++ targetP ++ "\"") <> + if not yFiles + then text "/>"+ else char '>' $+$+ nest nestVal+ (text "<data key=\"d2\">" $+$+ nest nestVal+ (text "<y:PolyLineEdge>" $+$+ nest nestVal+ (text "<y:Path sx=\"" <> float edgeOrigX <> text "\" sy=\"" <> float edgeOrigY <> text "\" tx=\"" <> float edgeTargetX <> text "\" ty=\""<> float edgeTargetY <> text "\"/>" $+$+ text "<y:LineStyle color=\"#000000\" type=\"line\" width=\"1.0\"/>" $+$+ text "<y:Arrows source=\"none\" target=\"standard\"/>" $+$+ text "<y:BendStyle smoothed=\"false\"/>"+ ) $+$+ text "</y:PolyLineEdge>") $+$+ text "</data>") $+$+ text "</edge>" + where -- Origin Node identifier+ origId = getId origN+ -- Target Node Identifier+ targetId = getId targetN+ -- Calculate the edge connection point for yFiles markup+ (edgeOrigX, edgeOrigY) = edgeConnection True + origNodeDims nOPortsOrig+ (findOutOrder origN origP)+ (edgeTargetX, edgeTargetY) = edgeConnection False + targetNodeDims nIPortsTarget+ (findInOrder targetN targetP) + (_, nOPortsOrig) = nIOPorts origN+ origNodeDims = nodeDims origN+ (nIPortsTarget, _) = nIOPorts targetN+ targetNodeDims = nodeDims targetN + -- Function to calculate where to connect an edge to a node+ -- note that in yfiles the coordinates origin of a node+ -- is located in the center, but the Y axis is inverted + -- (negative values are in the upper side)+ edgeConnection isSource (nodeXSize, nodeYSize) totalPorts portOrder = + (x,y)+ where x = if isSource then nodeXSize / 2 else -(nodeXSize/2) + ySep = nodeYSize/(fromIntegral totalPorts)+ -- Absolut value of y measure from the top+ yAbs = ySep/2 + (fromIntegral portOrder) * ySep+ y = yAbs - (nodeYSize / 2)++ -- helper functions+ -------------------+ -- Find the order (starting at 0) of a input Port in a node+ findInOrder node portid = findList list+ where findList = fromJust . findIndex (==portid)+ list = case node of + OutNode _ pid -> [pid]+ ProcNode ins _ -> DF.toList ins+ -- Find the order (starting at 0) of an output Port in a node+ findOutOrder node portid = findList list + where findList = fromJust . findIndex (==portid)+ list = case node of + OutNode _ pid -> [pid]+ ProcNode _ outs -> outs+ -- Get the identifier of a node+ getId node = case node of+ OutNode id _ -> id+ ProcNode n _ -> case n of+ InPort pid -> pid+ Proc pid _ -> pid++-- | pretty print a Graph with XML headers and key definitions+pprGraphWithHeaders :: YFilesMarkup -> GraphMLGraph -> Doc+pprGraphWithHeaders yFiles graph = + text "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" $+$+ text "<!-- Automatically generated by ForSyDe -->" $+$+ text "<graphml" <+> xmlns <+> + text "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" <+>+ xmlns_y <+>++ xsi_schemaLocation <>+ char '>' $+$ + nest nestVal (+ text "<key id=\"process_type\" for=\"node\" attr.name=\"process_type\" attr.type=\"string\"/>" $+$+ text "<key id=\"value_arg\" for=\"node\" attr.name=\"value_arg\" attr.type=\"string\"/>" $+$+ text "<key id=\"procfun_arg\" for=\"node\" attr.name=\"procfun_arg\" attr.type=\"string\"/>" $+$+ text "<key id=\"instance_parent\" for=\"node\" attr.name=\"instance_parent\" attr.type=\"string\"/>" $+$+ yFilesAttribs $+$+ pprOps yFiles graph) $+$+ text "</graphml>"+ where+ -- For some silly reason, yFiles uses a different GraphML target namesapce+ -- different to the one used in grapdrawing.org's GraphML primer+ xmlns = if yFiles + then text "xmlns=\"http://graphml.graphdrawing.org/xmlns/graphml\""+ else text "xmlns=\"http://graphml.graphdrawing.org/xmlns\""+ xmlns_y = if not yFiles then empty else+ text "xmlns:y=\"http://www.yworks.com/xml/graphml\""+ xsi_schemaLocation = if yFiles + then text "xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns/graphml http://www.yworks.com/xml/schema/graphml/1.0/ygraphml.xsd\""+ else text "xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\"" + yFilesAttribs = if not yFiles then empty else + text "<key for=\"node\" id=\"d0\" yfiles.type=\"nodegraphics\"/>" $+$+ text "<key attr.name=\"description\" attr.type=\"string\" for=\"node\" id=\"d1\"/>" $+$+ text "<key for=\"edge\" id=\"d2\" yfiles.type=\"edgegraphics\"/>" $+$+ text "<key attr.name=\"description\" attr.type=\"string\" for=\"edge\" id=\"d3\"/>" ++-------------------------+-- Tag printing functions+-------------------------+ +port :: GraphMLPortId -> Doc+port id = text "<port" <+> text ("name=\"" ++ id ++ "\"") <> text "/>" +++process_type :: String -> Doc+process_type str = + text "<data key=\"process_type\">" <> text str <> text "</data>" +++value_arg :: Exp -> Doc+value_arg exp = + text "<data key=\"value_arg\">" <> text (pprint exp) <> text "</data>" ++procfun_arg :: ProcFunAST -> Doc+-- FIXME: support default parameters+procfun_arg (ProcFunAST n cls _) = + text "<data key=\"procfun_arg\">" $+$+ nest nestVal (text $ pprint (FunD n cls)) $+$+ text "</data>" +++instance_parent :: SysId -> Doc+instance_parent id = + text "<data key=\"instance_parent\">" <> text id <> text "</data>" ++-------------------------+-- Other helper functions+-------------------------++-- Location of Edge connections and node size using yFiles Markup+-- ==============================================================+-- * All Nodes (except ports, of 7x7) have a constant width of 100+-- * The height depends on the node:+-- * ConstSY has a constant height of 100 +-- * DelaySY has a constant height of 100+-- * Nodes with three lines of text (ZipWithNSY, SysIns) have a minimum of 55+-- * Nodes with two lines of text (the rest) have a minimum height of 40+--+-- ** The final height of nodes with minimum height is+-- Max(minheight, MaxS*ps)+-- where MaxS = Max(number of input signals, number of output signals)+-- ps = inter-port separation+-- ** The location where both ends of an edge is trivially calculated+-- using the order of the corresponding port, the final size of the+-- node, "bi" and "ps"++-- | port separation space when connecting to a node which surpasses the +-- minimum height+portSep :: Float +portSep = 15++-- | Calculate the dimensions of a Node+nodeDims :: GraphMLNode -> (Float, Float) -- ^ Node dimensions (x,y)+nodeDims node = case node of+ OutNode _ _ -> (7,7)+ ProcNode n _ ->+ case n of+ InPort _ -> (7,7)+ Proc _ n' ->+ case n' of+ Const _ -> (100,100) + DelaySY _ _ -> (100,100)+ ZipWithNSY _ _ -> (100, height 55 maxio)+ SysIns _ _ -> (100, height 55 maxio)+ _ -> (100, height 40 maxio) + where height :: Float -- ^ Minimum height + -> Int -- ^ Max(input port number, output port number)+ -> Float -- ^ Final height+ height min maxio = max min + (portSep*(fromIntegral maxio))+ maxio :: Int -- ^ Max(input port number, output port number) + maxio = uncurry max $ nIOPorts node+++-- | Calculate the number of input and output ports of a node+nIOPorts :: GraphMLNode -> (Int, Int)+nIOPorts node = + case node of+ ProcNode ins outs -> (DF.foldr (\_ b -> b+1) 0 ins, length outs)+ OutNode _ _ -> (1,0)
+ src/ForSyDe/Backend/GraphML/Traverse.hs view
@@ -0,0 +1,139 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.GraphML.Traverse+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides specialized Netlist traversing functions aimed at+-- GraphML compilation.+-----------------------------------------------------------------------------+module ForSyDe.Backend.GraphML.Traverse + (writeGraphMLM,+ module ForSyDe.Backend.GraphML.Traverse.GraphMLM) where++import ForSyDe.Backend.GraphML.Traverse.GraphMLM+import ForSyDe.Backend.GraphML.FileIO+import ForSyDe.Backend.GraphML.AST+++import ForSyDe.System.SysDef+import ForSyDe.Netlist.Traverse+import ForSyDe.Netlist+import ForSyDe.OSharing++import Data.Traversable.GenericZipWith++import System.Directory+import System.FilePath+import Control.Monad.State+++-- | Internal GraphML-Monad version of 'ForSyDe.Backend.writeGraphML+writeGraphMLM :: GraphMLM ()+writeGraphMLM = do+ -- create and change to systemName/graphml+ rootDir <- gets (sid.globalSysDef.global)+ let graphmlDir = rootDir </> "graphml"+ liftIO $ createDirectoryIfMissing True graphmlDir+ liftIO $ setCurrentDirectory graphmlDir+ -- write the local results for the first-level entity+ writeLocalGraphMLM+ -- if we are in recursive mode, also write the local results+ -- for the rest of the subsystems+ rec <- isRecursiveSet+ when rec $ do subs <- gets (subSys.globalSysDef.global)+ let writeSub s = + withLocalST (initLocalST ((readURef.unPrimSysDef) s))+ writeLocalGraphMLM + mapM_ writeSub subs+ -- go back to the original directory+ liftIO $ setCurrentDirectory (".." </> "..")+++-- | Traverse the netlist and write the local results (i.e. system graphs)+writeLocalGraphMLM :: GraphMLM ()+writeLocalGraphMLM = do+ lSysDefVal <- gets (currSysDef.local)+ let lSysDefId = sid lSysDefVal+ debugMsg $ "Compiling system definition `" ++ lSysDefId ++ "' ...\n"+ -- Obtain the output Nodes of the system+ -- Obtain the netlist of the system definition + let nl = netlist lSysDefVal+ -- Traverse the netlist, and get the traversing results+ intOutsInfo <- traverseGraphML nl + LocalTravResult nodes edges <- gets (localRes.local)+ -- For each output signal, we need a node and an edge between its + -- intermediate signal and the final output signal declared in the system + -- interface.+ let outIds = map fst (oIface lSysDefVal)+ outNodes = map (\id -> OutNode id (id ++ "_in")) outIds+ outEdges = + zipWith (\(IntSignalInfo n pId) id -> + GraphMLEdge n pId (OutNode id (id ++ "_in")) (id ++ "_in")) + intOutsInfo + outIds+ -- Generate the final Graph + finalGraph = GraphMLGraph lSysDefId (nodes ++ outNodes) + (edges ++ outEdges) + -- and write it to disk+ yFiles <- genyFilesMarkup+ return ()+ liftIO $ writeGraph yFiles finalGraph (lSysDefId ++ ".graphml") ++-- | Traverse the netlist of a System Definition, +-- returning the (implicit) final traversing state and a list+-- containing the 'IntSignalInfo' of each output of the system+traverseGraphML :: Netlist [] -> GraphMLM [IntSignalInfo]+traverseGraphML = traverseSEIO newGraphML defineGraphML++-- | \'new\' traversing function for the GraphML backend+newGraphML :: NlNode NlSignal -> GraphMLM [(NlNodeOut, IntSignalInfo)]+newGraphML node = do+ let id = case node of+ InPort id -> id + Proc pid _ -> pid+ -- node inputs+ insNode = zipWithTF (\_ n -> id ++ "_in" ++ show n) node [(1::Int)..]+ -- node outputs tagged with the edge label+ taggedOutsNode = zipWith (\t n -> (t, id ++ "_out" ++ show n)) + (outTags node)+ [(1::Int)..] + -- graphml node+ gMLNode = ProcNode insNode (map snd taggedOutsNode)+ return $ map (\(t,out) -> (t, IntSignalInfo gMLNode out)) taggedOutsNode ++ ++ +-- | \'define\' traversing function for the GraphML backend+defineGraphML :: [(NlNodeOut, IntSignalInfo)] + -> NlNode IntSignalInfo + -> GraphMLM ()+defineGraphML outs ins = do + let id = case ins of+ InPort id -> id + Proc pid _ -> pid+ -- Formal input signals of the proces+ formalInL = [id ++ "_in" ++ show n | n <- [(1::Int)..]]+ -- Generate the graph node+ -- Formal output ports of the process+ outPids = map (\(_, IntSignalInfo _ pid) -> pid) outs+ -- Substitute actual inputs by formal inputs in "ins"+ insFormal = zipWithTF (\_ n -> n) ins formalInL+ node = ProcNode insFormal outPids+ -- Generate the input edges of the node + -- Actual input signals of the process+ actualInL = arguments ins+ inEdges = zipWith (\(IntSignalInfo aN aPid) fPid ->+ GraphMLEdge aN aPid node fPid ) actualInL formalInL++ mapM_ addEdge inEdges+ addNode node++++
+ src/ForSyDe/Backend/GraphML/Traverse/GraphMLM.hs view
@@ -0,0 +1,247 @@+{-# LANGUAGE FlexibleContexts #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.GraphML.Traverse.GraphMLM+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- 'GraphMLM' (GraphML Monad), related types and functions+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.GraphML.Traverse.GraphMLM where++import ForSyDe.Backend.GraphML.AST++import ForSyDe.Ids+import ForSyDe.ForSyDeErr+import ForSyDe.System.SysDef (SysDefVal(..))+import ForSyDe.Netlist.Traverse (TravSEIO)++import Control.Monad.State+++--------------+-- GraphMLM --+--------------++-- | GraphMLM backend monad+type GraphMLM a = TravSEIO GraphMLTravST ContextErr a+++-------------------+-- GraphMLTravST --+-------------------++-- | GraphML traversing State. (see 'ForSyDe.Netlist.Traverse.traverseSIO')+data GraphMLTravST = GraphMLTravST+ {local :: LocalGraphMLST, -- Local State (related to the system currently + -- compiled)+ global :: GlobalGraphMLST} -- Global state (related to all systems being + -- recursively compiled) ++data LocalGraphMLST = LocalGraphMLST+ {currSysDef :: SysDefVal, -- System definition which is currently + -- being compiled+ context :: Context, -- Error Context+ localRes :: LocalTravResult} -- Result accumulated during the + -- traversal of current System Definition + -- netlist+++++-- | initialize the local state+initLocalST :: SysDefVal -> LocalGraphMLST+initLocalST sysDefVal = + LocalGraphMLST sysDefVal (SysDefC (sid sysDefVal) (loc sysDefVal)) + emptyLocalTravResult++-- | Execute certain operation with a concrete local state.+-- The initial local state is restored after the operation is executed+withLocalST :: LocalGraphMLST -> GraphMLM a -> GraphMLM a+withLocalST l' action = do+ -- get the initial local state+ st <- get+ let l = local st+ -- set the modified state+ put st{local=l'}+ -- execute the action+ res <- action+ -- restore the initial local state+ st' <- get + put st'{local=l}+ -- return the result+ return res++data GlobalGraphMLST = GlobalGraphMLST+ {globalSysDef :: SysDefVal,+ ops :: GraphMLOps, -- Compilation options+ globalRes :: GlobalTravResult} -- Result accumulated during the + -- whole compilation+ ++++-- | Empty initial traversing state+initGlobalGraphMLST :: SysDefVal -> GlobalGraphMLST+initGlobalGraphMLST sysDefVal = + GlobalGraphMLST sysDefVal defaultGraphMLOps emptyGlobalTravResult++-- | Empty initial traversing state +initGraphMLTravST :: SysDefVal -> GraphMLTravST+initGraphMLTravST sysDefVal = + GraphMLTravST (initLocalST sysDefVal) (initGlobalGraphMLST sysDefVal)++-------------+-- TravResult+-------------++-- | Local result accumulated during the traversal of a netlist+data LocalTravResult = LocalTravResult + {nodes :: [GraphMLNode], -- generated nodes+ edges :: [GraphMLEdge]} -- generated edges++++-- | empty local GraphML compilation result+emptyLocalTravResult :: LocalTravResult+emptyLocalTravResult = LocalTravResult [] []+++-- | Global Results accumulated throughout the whole compilation+-- (empty right now)+type GlobalTravResult = ()+++-- | empty global GraphML compilation result+emptyGlobalTravResult :: GlobalTravResult+emptyGlobalTravResult = ()+++-------------+-- GraphMLOps+-------------++-- | GraphML Compilation options+data GraphMLOps = GraphMLOps + {debugGraphML :: GraphMLDebugLevel, + recursivityGraphML :: GraphMLRecursivity,+ yFilesMarkup :: Bool -- ^ Generate yFiles markup? + }+ deriving (Eq, Show)++-- | Debug level+data GraphMLDebugLevel = GraphMLNormal | GraphMLVerbose+ deriving (Eq, Ord, Show)++-- | Print a message to stdout if in verbose mode+debugMsg :: String -> GraphMLM ()+debugMsg str = do+ debugLevel <- gets (debugGraphML.ops.global)+ when (debugLevel > GraphMLNormal) + (liftIO $ putStr ("DEBUG: " ++ str))++-- | Recursivity, should the parent systems of system instances be compiled as +-- well?+data GraphMLRecursivity = GraphMLRecursive | GraphMLNonRecursive+ deriving (Eq, Show)++-- | Check if we are in recursive mode+isRecursiveSet :: GraphMLM Bool+isRecursiveSet = do + recOp <- gets (recursivityGraphML.ops.global)+ return $ recOp == GraphMLRecursive++-- | Check if we want to generate yFiles markup+genyFilesMarkup :: GraphMLM Bool+genyFilesMarkup = gets (yFilesMarkup.ops.global)+++-- | Default traversing options+defaultGraphMLOps :: GraphMLOps+defaultGraphMLOps = GraphMLOps GraphMLNormal GraphMLRecursive False+++-- | Set GraphML options inside the GraphML monad+setGraphMLOps :: GraphMLOps -> GraphMLM ()+setGraphMLOps options = modify (\st -> st{global=(global st){ops=options}})+++----------------------------------------+-- Useful functions in the GraphML Monad+----------------------------------------++-- | Add a signal declaration to the 'LocalTravResult' in the State+addEdge :: GraphMLEdge -> GraphMLM ()+addEdge e = modify addFun + -- FIXME: use a queue for the declarations+ where addFun st = st{local=l{localRes=r{edges=edg ++ [e]}}}+ where l = local st+ r = localRes l+ edg = edges r +++-- | Add a statement to the 'LocalTravResult' in the State+addNode :: GraphMLNode -> GraphMLM ()+addNode node = modify addFun+ -- FIXME: use a queue for the statements+ where addFun st = st{local=l{localRes=r{nodes= nds ++ [node]}}}+ where l = local st+ r = localRes l+ nds = nodes r ++++-- | Lift an 'EProne' value to the GraphML monad setting current error context+-- for the error+liftEProne :: EProne a -> GraphMLM a+liftEProne ep = do+ cxt <- gets (context.local)+ either (throwError.(ContextErr cxt)) return ep++-- | Throw a ForSyDe error, setting current error context+throwFError :: ForSyDeErr -> GraphMLM a+throwFError = liftEProne.Left++++-- | Execute certain operation with a concrete process context.+-- The initial context is restored after the operation is executed+-- Note: the initial context must be a system context or 'InconsistenContexts'+-- will be raised.+withProcC :: ProcId -> GraphMLM a -> GraphMLM a+withProcC pid action = do+ -- get the initial context+ st <- get+ let l = local st+ c = context l+ -- set the modified name context+ put st{local=l{context=setProcC pid c}}+ -- execute the action+ res <- action+ -- restore the initial name context+ st' <- get+ let l' = local st'+ put st'{local=l'{context=c}}+ -- return the result+ return res+++++----------------+-- IntSignalInfo+----------------++-- | Intermediate edge information. Tag generated for each output of each+-- node found during the traversal. +-- (see ForSyDe.Netlist.Traverse.traverseSIO).+-- It contains the GraphML node identifier +-- and port identifier associated with the process output.+data IntSignalInfo = IntSignalInfo GraphMLNode -- Source Node + GraphMLPortId -- Source Port Identifier+
+ src/ForSyDe/Backend/Ppr.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Ppr+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- ForSyDe pretty-printing class and auxiliar functions.+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.Ppr where++import Text.PrettyPrint.HughesPJ++-- | Pretty printing class+class Ppr a where+ ppr :: a -> Doc++-- identity instantiation+instance Ppr Doc where+ ppr = id++-- | Pretty printing class with associated printing options+class PprOps ops toPpr | toPpr -> ops where+ -- NOTE: Would it be better to use a State Monad?+ -- i.e. pprOps :: toPpr -> State ops Doc+ pprOps :: ops -> toPpr -> Doc +++-- dot+dot :: Doc+dot = char '.'++-- One line vertical space+vSpace :: Doc+vSpace = text ""++-- Multi-line vertical space+multiVSpace :: Int -> Doc+multiVSpace n = vcat (replicate n (text "")) ++-- Pretty-print a list supplying the document joining function+ppr_list :: Ppr a => (Doc -> Doc -> Doc) -> [a] -> Doc+ppr_list _ [] = empty+ppr_list join (a1:rest) = go a1 rest + where go a1 [] = ppr a1+ go a1 (a2:rest) = ppr a1 `join` go a2 rest++-- Pretty-print a list supplying the document joining function+-- (PprOps version)+pprOps_list :: PprOps ops toPpr => ops -> (Doc -> Doc -> Doc) -> [toPpr] -> Doc+pprOps_list _ _ [] = empty+pprOps_list ops join (a1:rest) = go a1 rest+ where go a1 [] = pprOps ops a1+ go a1 (a2:rest) = pprOps ops a1 `join` go a2 rest++-- | Join two documents vertically leaving n vertical spaces between them+vNSpaces :: Int -> Doc -> Doc -> Doc+vNSpaces n doc1 doc2 = doc1 $+$ + multiVSpace n $+$+ doc2++-- Join two documents vertically putting a semicolon in the middle+vSemi :: Doc -> Doc -> Doc+vSemi doc1 doc2 = doc1 <> semi $+$ doc2+++-- Join two documents vertically putting a comma in the middle+vComma :: Doc -> Doc -> Doc+vComma doc1 doc2 = doc1 <> comma $+$ doc2++-- Join two documents horizontally putting a comma in the middle+hComma :: Doc -> Doc -> Doc+hComma doc1 doc2 = doc1 <> comma <+> doc2+++-- | apply sep to a list of prettyprintable elements, +-- previously interspersing commas+commaSep :: Ppr a => [a] -> Doc+commaSep = sep.(punctuate comma).(map ppr)+ ++-- | Only append if both of the documents are non-empty+($++$) :: Doc -> Doc -> Doc+d1 $++$ d2 + | isEmpty d1 || isEmpty d2 = empty+ | otherwise = d1 $+$ d2+++-- | Only append if both of the documents are non-empty+(<++>) :: Doc -> Doc -> Doc+d1 <++> d2 + | isEmpty d1 || isEmpty d2 = empty+ | otherwise = d1 <+> d2++-- | Enclose in parenthesis only if the document is non-empty+parensNonEmpty :: Doc -> Doc+parensNonEmpty doc | isEmpty doc = empty+parensNonEmpty doc = parens doc++-- | Enclose in parenthesis only if the predicate is True+parensIf :: Bool -> Doc -> Doc+parensIf p d = if p then parens d else d
+ src/ForSyDe/Backend/Simulate.hs view
@@ -0,0 +1,248 @@+{-# LANGUAGE ScopedTypeVariables #-} +-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.Simulate+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell, LSTV)+--+-- This module provides the simulation backend of ForSyDe's embedded compiler+--+-- /This module is based on Lava2000/: <http://www.cs.chalmers.se/~koen/Lava/>+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.Simulate (simulate) where++import ForSyDe.OSharing+import ForSyDe.Netlist+import ForSyDe.Netlist.Traverse+import ForSyDe.System.SysDef+import ForSyDe.System.SysFun(SysFunToSimFun(..))+import ForSyDe.ForSyDeErr+import ForSyDe.Process.ProcVal++import Control.Monad (liftM, mapM_, zipWithM_)+import Data.Maybe (fromJust)+import Control.Monad.ST+import Data.STRef+import qualified Data.Traversable as DT+import Data.List (lookup, transpose)+import Data.Dynamic++-- | 'simulate' takes a system definition and generates a function +-- able simulate a System using a list-based representation +-- of its signals.+simulate :: SysFunToSimFun sysFun simFun => SysDef sysFun -> simFun+simulate sysDef = fromDynSimFun (simulateDyn (unSysDef sysDef)) []++-- FIXME: clean and document the following horrible code!++--------------------------------------+-- The following was adapted from Lava+--------------------------------------++type Var s+ = (STRef s Dynamic, STRef s (Wire s))++data Wire s+ = Wire+ { dependencies :: [Var s]+ , kick :: ST s ()+ }++----------------------------------------------------------------+-- simulateDyn+++simulateDyn :: PrimSysDef -> [[Dynamic]] -> [[Dynamic]]+simulateDyn pSysDef inps | any null inps = replicate outN []+ where outN = (length . oIface . readURef . unPrimSysDef) pSysDef+simulateDyn pSysDef inps = runST (+ do let sysDefVal = (readURef . unPrimSysDef) pSysDef+ sysDefInIface = iIface sysDefVal+ -- List where to store the Vars generated by delay processes+ roots <- newSTRef []+ -- Input port ids paired with a reference to each input value list+ inpPairs <- zipWithM (\(id,_) inputL -> + do {ref <- newSTRef inputL; return (id,ref)}) + sysDefInIface inps++ let -- Add a Var to the roots list + root r =+ do rs <- readSTRef roots+ writeSTRef roots (r:rs)++ -- Create an empty var+ empty = do rval <- newSTRef (error "val?")+ rwir <- newSTRef (error "wire?")+ return (rval, rwir)+ new node = + do mapM (\tag -> do {e <- empty; return (tag, e)}) (outTags node)+ newInstance varPairs node =+ let funName = "ForSyDe.Backend.Simulate.simulateDyn" + in case node of+ InPort id ->+ case lookup id varPairs of+ -- FIXME: replace the Other error with a custom one+ Nothing -> intError funName (Other "inconsistency")+ Just var -> return [(InPortOut, var)]+ _ -> new node+ + -- define for the general traversal+ define nodeVarPairs childVars = + case (nodeVarPairs,childVars) of+ ([(InPortOut, var)], InPort name) -> do+ let inputRef = fromJust $ lookup name inpPairs+ relate var [] $+ do (curr:rest) <- readSTRef inputRef+ writeSTRef inputRef rest+ return curr+ + _ -> defineShared nodeVarPairs childVars++ -- define for instances+ defineInstance nodeVarPairs childVars = + case (nodeVarPairs,childVars) of+ ([(InPortOut, _)], InPort _) -> return ()+ _ -> defineShared nodeVarPairs childVars+ + -- Shared part of define define for instances and the main traversal+ defineShared nodeVarPairs childVars = -- r s =+ case (nodeVarPairs,childVars) of+ ([(InPortOut, _)], InPort _) -> return ()++ (nodeVarPairs,+ Proc _ (SysIns pSysDef ins)) ->+ -- FIXME: ugly ugly ugly+ do let sysDefVal = (readURef . unPrimSysDef) pSysDef+ taggedIns = zipWith (\(id,_) var -> (id,var)) + (iIface sysDefVal) ins+ sr <- traverseST + (newInstance taggedIns)+ defineInstance + (netlist sysDefVal)++ let relateIns prevVar@(prevValR,_) (_,nextVar) =+ relate nextVar [prevVar] (readSTRef prevValR)+ + zipWithM_ relateIns sr nodeVarPairs++ ([(DelaySYOut, nodeVar)], + Proc _ (DelaySY (ProcVal init _) sigVar)) ->+ do valVar <- empty+ relate valVar [] (return init) + delay nodeVar valVar sigVar+ _ ->+ do let evalPairs = eval `fmap` DT.mapM (readSTRef.fst) childVars+ args = arguments childVars+ relEval (tag, var) = + relate var args $+ -- FIXME: remove fromJust and write a proper error+ liftM (fromJust.(lookup tag)) evalPairs+ mapM_ relEval nodeVarPairs + where+ delay r ri@(rinit,_) r1@(pre,_) =+ do state <- newSTRef Nothing+ r2 <- empty+ root r2++ relate r [ri] $+ do ms <- readSTRef state+ case ms of+ Just s -> return s+ Nothing ->+ do s <- readSTRef rinit+ writeSTRef state (Just s)+ return s++ relate r2 [r,r1] $+ do s <- readSTRef pre+ writeSTRef state (Just s)+ return s+ + sr <- traverseST new define (netlist sysDefVal)+ rs <- readSTRef roots+ -- remove tags of the resulting vars (all the root nodes should only+ -- have one output and thus a must return a unique list)+ step <- drive (sr ++ rs)++ outs <- lazyloop $+ do step+ s <- DT.mapM (readSTRef . fst) sr+ return s+ -- Since the simulation is done in a per-cycle basis+ -- the results (outs) are transposed (not what we want)+ -- e.g.+ -- imagine a system whose outputs are its inputs plus 1+ -- then, for this these two inputs [[1,2,3],[4,5,6]]+ -- outs would be [[2,5],[3,6],[4,7]]+ --+ -- We need as well to check that all inputs are defined in+ -- each simulation cycle e.g. [[1,2,3],[4,5,6,7]] as input+ -- makes imposible to simulate cycle 4+ --+ -- NOTE: having to check this makes simulation really inneficient+ -- a solution would providing a cycle-based simulation input/output+ -- which wouldn't suffer from this problems+ -- Or, even better, a simulation which showed a diffierent type of output + let inN = length sysDefInIface+ res = if inN == 0 then+ transpose outs+ else transpose (checkIns inN (transpose inps) outs)+ return res+ )++ +-- evaluation order++relate :: Var s -> [Var s] -> ST s Dynamic -> ST s ()+relate (rval, rwir) rs f =+ do writeSTRef rwir $ + Wire{ dependencies = rs+ , kick = do b <- f+ writeSTRef rval b+ }++drive :: [Var s] -> ST s (ST s ())+drive [] =+ do return (return ())++drive ((_,rwir):rs) =+ do wire <- readSTRef rwir+ writeSTRef rwir (error "detected combinational loop")+ driv1 <- drive (dependencies wire)+ writeSTRef rwir $+ Wire { dependencies = [], kick = return () }+ driv2 <- drive rs+ return $+ do driv1+ kick wire+ driv2++----------------------------------------------------------------+-- helper functions++lazyloop :: ST s a -> ST s [a]+lazyloop m = + do a <- m+ as <- unsafeInterleaveST (lazyloop m)+ return (a:as)++-- | check that there will only be output as long as there are inputs +checkIns :: Int -- ^ number of inputs + -> [[a]] -- ^ transposed inputs + -> [[b]] -- ^ transposed outputs (infinitie list) + -> [[b]] -- ^ selected outputs++-- The lazy pattern match is used to avoid evaluating the output list +-- if length i /= nIns. If that happens the input lists of simulate will +-- implicitly be simulated, and due to lack of inputs it will cause an error. +checkIns nIns (i:is) ~(o:os) | length i == nIns = o : checkIns nIns is os +checkIns _ _ _ = []++++
+ src/ForSyDe/Backend/VHDL.hs view
@@ -0,0 +1,90 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides the VHDL backend of ForSyDe's embedded compiler+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL + (writeVHDL, + writeVHDLOps,+ writeAndModelsimVHDL,+ writeAndModelsimVHDLOps, + VHDLOps(..),+ QuartusOps(..),+ QuartusAction(..),+ checkSynthesisQuartus,+ VHDLDebugLevel(..),+ VHDLRecursivity(..),+ defaultVHDLOps) where++import Control.Monad.State (evalStateT)+import qualified Language.Haskell.TH as TH++import ForSyDe.System.SysFun+import ForSyDe.ForSyDeErr+import ForSyDe.OSharing (readURef)+import ForSyDe.System.SysDef+import ForSyDe.Backend.VHDL.Traverse+import ForSyDe.Backend.VHDL.Modelsim++-- | Given a System Definition whose name is a valid VHDL _basic_ identifier +-- (call it \"A\") generate @A.vhd@ in current working directory using +-- default compilation options.+-- Imp: the input and output signal names of A must be valid VHDL identifiers+-- (basic or extended) and different to @clk@ and @reset@+-- which are reserved for the main clock and reset signals+writeVHDL :: SysDef a -> IO ()+writeVHDL = writeVHDLOps defaultVHDLOps ++-- | 'writeVHDL'-alternative which allows setting VHDL compilation options.+writeVHDLOps :: VHDLOps -> SysDef a -> IO ()+writeVHDLOps ops sysDef = do+ -- initiate the compilation State+ let sinit = initVHDLTravST $ (readURef.unPrimSysDef.unSysDef) sysDef+ -- Compile the code+ res <- runErrorT $ evalStateT (setVHDLOps ops >> writeVHDLM) sinit+ -- Check if the compilation went well and print an error in case it didn't+ either printVHDLError return res++++-- | Generate a function which, given a system definition and some simulation+-- stimuli:+-- +-- (1) Writes a VHDL model of the system +-- +-- (2) Simulates the VHDL model with Modelsim getting the results back to Haskell+writeAndModelsimVHDL :: SysFunToIOSimFun sysF simF => + Maybe Int -- ^ Number of cycles to simulate+ -- if 'Nothing' the number will be determined+ -- by the length of the input stimulti.+ -- Useful when the system to simulate doesn't+ -- have inputs or the inputs provided are + -- infinite+ -> SysDef sysF -- ^ system definition to simulate+ -> simF +writeAndModelsimVHDL = writeAndModelsimVHDLOps defaultVHDLOps+++-- | 'VHDLOps'-alternative of 'writeAndModelsimVHDL', note that+-- compileModelSim will implicitly be set to True+writeAndModelsimVHDLOps :: SysFunToIOSimFun sysF simF => + VHDLOps -> Maybe Int -> SysDef sysF -> simF +writeAndModelsimVHDLOps ops mCycles sysDef = fromTHStrSimFun simIO []+ where sinit = initVHDLTravST $ (readURef.unPrimSysDef.unSysDef) sysDef+ simVHDLM :: [[TH.Exp]] -> VHDLM [[String]] + simVHDLM stimuli = do + setVHDLOps ops{compileModelsim=True} + writeVHDLM+ executeTestBenchModelsim mCycles stimuli + simIO :: [[TH.Exp]] -> IO [[String]] + simIO stimuli = do+ res <- runErrorT $ evalStateT (simVHDLM stimuli) sinit+ either printVHDLError return res
+ src/ForSyDe/Backend/VHDL/AST.hs view
@@ -0,0 +1,712 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.AST+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- A VHDL 93 subset AST (Abstract Syntax Tree), coded so that it can be easy +-- to extend, please see doc/VHDL/vhdl93-syntax.html as reference +-- in order to extend it (this AST is based on that grammar)+-----------------------------------------------------------------------------++-- This AST is aimed at code generation not parsing, and thus, +-- it was simplified+-- The incompatibilities or simplifications from the standard+-- are properly commented++-- FIXME: shouldn't be records used instead of bare algebraic types?+-- FIXME: shouldn't the unused type redefinitions be removed?+-- FIXME: It would maybe be a good idea to create a sequence ADT which+-- guaranteed to hold at least one element (i.e. the grammar+-- has some cases such as "choices ::= choice | {choice}"+-- which are not well represented as "[Choice]", +-- "Choices Choice (Maybe [Choice])" is not easy to handle either+-- and thus, it was discarded.++module ForSyDe.Backend.VHDL.AST where++import Data.Char (toLower)+import Text.Regex.Posix++import ForSyDe.ForSyDeErr+++--------------------+-- VHDL identifiers+--------------------++-- VHDL identifier, use mkVHDLId to create it from a String, +-- making sure a string is a proper VHDL identifier+data VHDLId = Basic String | Extended String+ deriving Eq++-- | Obtain the String of a VHDL identifier+fromVHDLId :: VHDLId -> String+fromVHDLId (Basic str) = str+fromVHDLId (Extended str) = '\\' : (escapeBackslashes str) ++ "\\"+ where escapeBackslashes [] = []+ escapeBackslashes (x : xs) + | x == '\\' = "\\\\" ++ escapeBackslashes xs+ | otherwise = x : escapeBackslashes xs+instance Show VHDLId where+ show = show.fromVHDLId+++-- | unsafely create a basic VHDLId (without cheking if the string is correct)+unsafeVHDLBasicId :: String -> VHDLId+unsafeVHDLBasicId str = Basic str+++-- | unsafely create an exteded VHDLId (without cheking if the string is +-- correct)+unsafeVHDLExtId :: String -> VHDLId+unsafeVHDLExtId str = Extended str+++-- | Create a VHDL basic identifier from a String, previously checking if the +-- String is correct+mkVHDLBasicId ::String -> EProne VHDLId+-- FIXME: we relax the fact that two consecutive underlines +-- are not allowed+mkVHDLBasicId [] = throwError EmptyVHDLId+mkVHDLBasicId id+ | id =~ basiIdPat && (not $ elem lowId reservedWords) = return $ Basic id+ | otherwise = throwError $ IncVHDLBasId id+ where lowId = map toLower id+ basiIdPat = "^[A-Za-z](_?[A-Za-z0-9])*$"++-- | Create a VHDL extended identifier from a String, previously checking +-- if the String is correct. The input string must not include the initial+-- and ending backslashes nad the intermediate backslashes shouldn't be escaped.+mkVHDLExtId :: String -> EProne VHDLId+mkVHDLExtId [] = throwError EmptyVHDLId+mkVHDLExtId id+ | id =~ extIdPat = return $ Extended id+ | otherwise = throwError $ IncVHDLExtId id+ where -- Regular expression pattern for extended identifiers.+ -- According to the VHDL93 standard, an extended identifier must:+ -- * Start and end with a backslash '\'+ -- * Its middle characters can be+ -- * two contiguous backslashes \\+ -- * an alphanumeric (A-Za-z0-9)+ -- * a Special Character + -- * an Other Special Character + -- (backslashes can only appear in pairs as indicated above)+ -- + -- However, backslashes will be handled when printing the identifier,+ -- (an initial and ending backslash are added and the intermediate backslashes+ -- are escaped)+ --+ -- Note that we cannot use specialChars and otherSpecialChars+ -- to build the pattern because of the double-backslash rule+ -- and also, the right bracket (according to the posix+ -- standard) needs to go in the first place of a bracket+ -- expression to lose its special meaning. Furthermore,+ -- (according to the POSIX standard as well) we also need to put+ -- '-' in the last place of the bracket expression.+ extIdPat = + "^[]A-Za-z0-9 \"#&\\'()*+,./:;<=>_|!$%@?[^`{}~-]+$"+++-- | Unsafely append a string to a VHDL identifier (i.e. without checking if+-- the resulting identifier is valid)+unsafeIdAppend :: VHDLId -> String -> VHDLId+unsafeIdAppend (Basic id) suffix = Basic $ id ++ suffix+unsafeIdAppend (Extended id) suffix = Extended $ id ++ suffix++-- | special characters as defined in the VHDL93 standard+specialChars :: [Char]+specialChars = ['"' , '#' , '&' , '\'' , '(' , ')' , '*' , '+' , ',',+ '-' , '.' , '/' , ':' , ';' , '<' , '=' , '>' , '_' , '|']++-- | other special characters as defined in the VHDL93 standard+otherSpecialChars :: [Char]+otherSpecialChars =['!' , '$' , '%' , '@' , '?' , '[' , '\\' , ']',+ '^' , '`' , '{' , '}' , '~']++-- | Reserved identifiers+reservedWords :: [String]+reservedWords = ["abs", "access", "after", "alias", "all", "and",+ "architecture", "array", "assert", "attribute", "begin", "block",+ "body", "buffer", "bus", "case", "component", "configuration",+ "constant", "disconnect", "downto", "else", "elsif", "end", "entity",+ "exit", "file", "for", "function", "generate", "generic", "group",+ "guarded", "if", "impure", "in", "inertial", "inout", "is", "label",+ "library", "linkage", "literal", "loop", "map", "mod", "nand", "new",+ "next", "nor", "not", "null", "of", "on", "open", "or", "others",+ "out", "package", "port", "postponed", "procedure", "process", "pure",+ "range", "record", "register", "reject", "rem", "report", "return",+ "rol", "ror", "select", "severity", "shared", "signal", "sla", "sll",+ "sra", "srl", "subtype", "then", "to", "transport", "type",+ "unaffected", "units", "until", "use", "variable", "wait", "when",+ "while", "with", "xnor", "xor"]+++++ ---------+ -- AST --+ ---------+++-- { } (0 or more) is expressed as [ ]+-- [ ] (optional) is expressed as Maybe+++-- design_file+-- Having ContextClauses associated to library units is messy+-- instead we only allow ContextClause for the whole design file.+-- Furthermore we incorrectly (and deliberately) accept a file with +-- no library units +data DesignFile = DesignFile [ContextItem] [LibraryUnit] + deriving Show++-- context_item+-- We don't allow the "name1,name2,name3" syntax, only one name is allowed+-- at once+data ContextItem = Library VHDLId | Use SelectedName+ deriving Show++-- library_unit+-- We avoid adding the overhead of a PrimaryUnit and SecondaryUnit types+data LibraryUnit = LUEntity EntityDec | + LUArch ArchBody | + LUPackageDec PackageDec |+ LUPackageBody PackageBody+ deriving Show++-- entity_declaration+-- No declarative nor statemet part is allowed +-- Only interface signal declarations are allowed in the port clause+data EntityDec = EntityDec VHDLId [IfaceSigDec]+ deriving Show++-- | interface_signal_declaration+-- We don't allow the "id1,id2,id3" syntax, only one identifier is allowed+-- at once+-- The Mode is mandatory+-- Bus is not allowed +-- Preasigned values are not allowed+-- Subtype indications are not allowed, just a typemark +-- Constraints are not allowed: just add a new type with the constarint+-- in ForSyDe.vhd if it is required+data IfaceSigDec = IfaceSigDec VHDLId Mode TypeMark+ deriving Show++-- | type_mark+-- We don't distinguish between type names and subtype names+-- We dont' support selected names, only simple names because we won't need+-- name selection (i.e. Use clauses will make name selection unnecesary)+type TypeMark = SimpleName+++-- | mode+-- INOUT | BUFFER | LINKAGE are not allowed+data Mode = In | Out+ deriving (Show, Eq)++-- | architecture_body +-- [ ARCHITECTURE ] and [ architecture_simple_name ] are not allowed+data ArchBody = ArchBody VHDLId VHDLName [BlockDecItem] [ConcSm]+ deriving Show++-- | package_declaration+-- [ PACKAGE ] and [ package_simple_name ] are not allowed+data PackageDec = PackageDec VHDLId [PackageDecItem]+ deriving Show+++-- | package_declarative_item+-- only type declarations, subtype declarations and subprogram specifications +-- (working as subprogram_declaration) allowed+data PackageDecItem = PDITD TypeDec | PDISD SubtypeDec | PDISS SubProgSpec+ deriving Show++-- | package_body+-- [ PACKAGE ] and [ package_simple_name ] are not allowed+data PackageBody = PackageBody VHDLId [PackageBodyDecItem]+ deriving Show++-- | only subprogram_body is allowed+type PackageBodyDecItem = SubProgBody++-- | subtype-declaration+data SubtypeDec = SubtypeDec VHDLId SubtypeIn+ deriving Show++-- | subtype_indication+-- resolution functions are not permitted+data SubtypeIn = SubtypeIn TypeMark (Maybe Constraint)+ deriving Show++-- | constraint+-- Only index constraints are allowed+type Constraint = IndexConstraint++-- | range+-- the direction must always be \"to\"+data Range = AttribRange AttribName | ToRange Expr Expr+ deriving Show++-- | index_constraint+data IndexConstraint = IndexConstraint [DiscreteRange]+ deriving Show++-- | discrete_range+-- only ranges are allowed+type DiscreteRange = Range++-- | type_declaration+-- only full_type_declarations are allowed+data TypeDec = TypeDec VHDLId TypeDef+ deriving Show++-- | type_declaration+-- only composite types and enumeration types (a specific scalar type)+data TypeDef = TDA ArrayTypeDef | TDR RecordTypeDef | TDE EnumTypeDef+ deriving Show++-- | array_type_definition+-- unconstrained_array_definition+-- constrained_array_definition+-- A TypeMark is used instead of a subtype_indication. If subtyping is required,+-- declare a subtype explicitly. +data ArrayTypeDef = UnconsArrayDef [TypeMark] TypeMark |+ ConsArrayDef IndexConstraint TypeMark+ deriving Show++-- | record_type_definition+-- [ record_type_simple_name ] not allowed+data RecordTypeDef = RecordTypeDef [ElementDec]+ deriving Show++-- | element_declaration +-- multi-identifier element declarations not allowed+-- element_subtype_definition is simplified to a type_mark+data ElementDec = ElementDec VHDLId TypeMark+ deriving Show++-- | enumeration_type_definition +-- enumeration literals can only be identifiers+data EnumTypeDef = EnumTypeDef [VHDLId]+ deriving Show++-- | name+-- operator_names are not allowed +data VHDLName = NSimple SimpleName | + NSelected SelectedName | + NIndexed IndexedName |+ NSlice SliceName |+ NAttribute AttribName + deriving Show++-- | simple_name+type SimpleName = VHDLId++-- | selected_name+data SelectedName = Prefix :.: Suffix+ deriving Show++infixl :.:++-- | indexed_name+-- note that according to the VHDL93 grammar the index list cannot be empty +data IndexedName = IndexedName Prefix [Expr]+ deriving Show++-- | prefix+-- only names (no function calls)+type Prefix = VHDLName++-- | suffix+-- no character or operator symbols are accepted+data Suffix = SSimple SimpleName | All+ deriving Show+++-- | slice_name+data SliceName = SliceName Prefix DiscreteRange+ deriving Show++-- | attribute_name+-- signatures are not allowed+data AttribName = AttribName Prefix SimpleName (Maybe Expr)+ deriving Show++-- | block_declarative_item+-- Only subprogram bodies and signal declarations are allowed+data BlockDecItem = BDISPB SubProgBody | BDISD SigDec+ deriving Show+++-- | subprogram_body+-- No subprogram kind nor designator is allowed+data SubProgBody = SubProgBody SubProgSpec [SubProgDecItem] [SeqSm]+ deriving Show++-- | subprogram_declarative_item+-- only varaible declarations are allowed.+data SubProgDecItem = SPVD VarDec | SPSB SubProgBody+ deriving Show++-- | variable_declaration+-- identifier lists are not allowed+data VarDec = VarDec VHDLId SubtypeIn (Maybe Expr)+ deriving Show++-- | subprogram_specification+-- Only Functions are allowed+-- [Pure | Impure] is not allowed+-- Only an identifier is valid as the designator+-- In the formal parameter list only variable declarations are accepted +data SubProgSpec = Function VHDLId [IfaceVarDec] TypeMark + deriving Show++-- | interface_variable_declaration+-- [variable] is not allowed+-- We don't allow the "id1,id2,id3" syntax, only one identifier is allowed+-- Mode is not allowed+-- Resolution functions and constraints are not allowed, thus a TypeMark+-- is used instead of a subtype_indication. If subtyping is required,+-- declare a subtype explicitly.+data IfaceVarDec = IfaceVarDec VHDLId TypeMark+ deriving Show++-- | sequential_statement+-- Only If, case, return, for loops, assignment, @wait for@ procedure calls+-- allowed.+-- Only for loops are allowed (thus loop_statement doesn't exist) and cannot+-- be provided labels.+-- The target cannot be an aggregate.+-- General wait statements are not allowed, only @wait for@+-- It is incorrect to have an empty [CaseSmAlt]+data SeqSm = IfSm Expr [SeqSm] [ElseIf] (Maybe Else) |+ CaseSm Expr [CaseSmAlt] |+ ReturnSm (Maybe Expr) |+ ForSM VHDLId DiscreteRange [SeqSm] |+ VHDLName := Expr |+ WaitFor Expr |+ SigAssign VHDLName Wform |+ ProcCall VHDLName [AssocElem]+ deriving Show++-- | helper type, they doesn't exist in the origianl grammar+data ElseIf = ElseIf Expr [SeqSm]+ deriving Show++-- | helper type, it doesn't exist in the origianl grammar+data Else = Else [SeqSm]+ deriving Show++-- | case_statement_alternative+-- it is incorrect to have an empty [Choice]+data CaseSmAlt = CaseSmAlt [Choice] [SeqSm]+ deriving Show++-- | choice+-- although any expression is allowed the grammar specfically only allows +-- simple_expressions (not covered in this AST) +data Choice = ChoiceE Expr | Others+ deriving Show++-- | signal_declaration+-- We don't allow the "id1,id2,id3" syntax, only one identifier is allowed+-- at once+-- Resolution functions and constraints are not allowed, thus a TypeMark+-- is used instead of a subtype_indication+-- Signal kinds are not allowed+data SigDec = SigDec VHDLId TypeMark (Maybe Expr)+ deriving Show++-- | concurrent_statement+-- only block statements, component instantiations and signal assignments +-- are allowed+data ConcSm = CSBSm BlockSm | + CSSASm ConSigAssignSm | + CSISm CompInsSm |+ CSPSm ProcSm+ deriving Show++-- | block_statement+-- Generics are not supported+-- The port_clause (with only signals) and port_map_aspect are mandatory+-- The ending [ block_label ] is not allowed+-- +data BlockSm = BlockSm Label [IfaceSigDec] PMapAspect [BlockDecItem] [ConcSm]+ deriving Show++-- | port_map_aspect+newtype PMapAspect = PMapAspect [AssocElem]+ deriving Show++-- | label+type Label = VHDLId++-- | association_element+data AssocElem = Maybe (FormalPart) :=>: ActualPart+ deriving Show++-- | formal_part+-- We only accept a formal_designator (which is a name after all),+-- in the forme of simple name (no need for selected names) +-- "function_name ( formal_designator )" and "type_mark ( formal_designator )"+-- are not allowed+type FormalPart = SimpleName++-- | actual_part+-- We only accept an actual_designator,+-- "function_name ( actual_designator )" and "type_mark ( actual_designator )"+-- are not allowed+type ActualPart = ActualDesig++-- | actual_designator+data ActualDesig = ADName VHDLName | ADExpr Expr | Open+ deriving Show++-- | concurrent_signal_assignment_statement+-- Only conditional_signal_assignment is allowed (without options)+-- The LHS (targets) are simply signal names, no aggregates+data ConSigAssignSm = VHDLName :<==: ConWforms+ deriving Show++-- | conditional_waveforms +data ConWforms = ConWforms [WhenElse] Wform (Maybe When) + deriving Show++-- | Helper type, it doesn't exist in the VHDL grammar+data WhenElse = WhenElse Wform Expr+ deriving Show++-- | Helper type, it doesn't exist in the VHDL grammar+newtype When = When Expr+ deriving Show++-- | waveform+-- although it is possible to leave [Expr] empty, that's obviously not+-- valid VHDL waveform+data Wform = Wform [WformElem] | Unaffected+ deriving Show++-- | waveform_element+-- Null is not accepted+data WformElem = WformElem Expr (Maybe Expr)+ deriving Show++ +-- | component_instantiation_statement+-- No generics supported+-- The port map aspect is mandatory+data CompInsSm = CompInsSm Label InsUnit PMapAspect+ deriving Show++-- | process_statement+-- The label is mandatory+-- Only simple names are accepted in the sensitivity list+-- No declarative part is allowed+data ProcSm = ProcSm Label [SimpleName] [SeqSm]+ deriving Show++-- | instantiated_unit+-- Only Entities are allowed and their architecture cannot be specified+data InsUnit = IUEntity VHDLName+ deriving Show++-----------------+-- Expression AST+-----------------++-- | expression, instead of creating an AST like the grammar +-- (see commented section below) we made our own expressions which are +-- easier to handle, but which don't don't show operand precedence+-- (that is a responsibility of the pretty printer)++data Expr = -- Logical operations+ And Expr Expr |+ Or Expr Expr |+ Xor Expr Expr |+ Nand Expr Expr |+ Nor Expr Expr |+ Xnor Expr Expr |+ -- Relational Operators+ Expr :=: Expr |+ Expr :/=: Expr |+ Expr :<: Expr |+ Expr :<=: Expr |+ Expr :>: Expr |+ Expr :>=: Expr |+ -- Shift Operators+ Sll Expr Expr |+ Srl Expr Expr |+ Sla Expr Expr |+ Sra Expr Expr |+ Rol Expr Expr |+ Ror Expr Expr |+ -- Adding Operators+ Expr :+: Expr |+ Expr :-: Expr |+ Expr :&: Expr |+ -- Sign Operators+ Neg Expr |+ Pos Expr |+ -- Multiplying Operators+ Expr :*: Expr |+ Expr :/: Expr |+ Mod Expr Expr |+ Rem Expr Expr |+ -- Miscellaneous Operators+ Expr :**: Expr |+ Abs Expr |+ Not Expr |+ -- Primary expressions+ -- Only literals, names and function calls are allowed+ PrimName VHDLName |+ PrimLit Literal |+ PrimFCall FCall | + -- Composite_types-related operators+ Aggregate [ElemAssoc] -- (exp1,exp2,exp3, ...)+ deriving Show ++-- operand precedences, according to the VHDL LRM: +-- "Where the language+-- allows a sequence of operators, operators with the same+-- precedence level are associated with their operands in textual+-- order, from left to right." In other words, they are all left associative+--+-- For example: a / b / c = (a/b)/c+-- a and b or c is illegal (mixing operators is not allowed+-- by the language and only+-- can avoid parenthesis in some +-- cases)++infixl 2 `And`, `Or`, `Xor`, `Nand`, `Nor`, `Xnor`+infixl 3 :=:, :/=:, :<:, :<=:, :>:, :>=:+infixl 4 `Sll`, `Srl`, `Sla`, `Sra`, `Rol`, `Ror`+infixl 5 :+:, :-:, :&:+infix 6 `Neg`, `Pos` +infixl 7 :*:, :/:, `Mod`, `Rem`+infixl 8 :**:, `Abs`, `Not` ++-- | Logical Operators precedence+logicalPrec :: Int+logicalPrec = 2++-- | Relational Operators Precedence+relationalPrec :: Int+relationalPrec = 3++-- | Shift Operators Precedence+shiftPrec :: Int+shiftPrec = 4++-- | Plus Operators precedence+plusPrec :: Int+plusPrec = 5++-- | Sign Operators Precedence+signPrec :: Int+signPrec = 6++-- | Multplying Operators Precedecne+multPrec :: Int+multPrec = 7++-- | Miscellaneous Operators Precedence+miscPrec :: Int+miscPrec = 8+++++-- | element_association+-- only one choice is allowed+data ElemAssoc = ElemAssoc (Maybe Choice) Expr+ deriving Show++-- | literal+-- Literals are expressed as a string (remember we are generating+-- code, not parsing)+type Literal = String++-- | function_call+data FCall = FCall VHDLName [AssocElem]+ deriving Show+ + +{-++Expression AST following the grammar (discarded)++-- again, even if it possible to leave the [Relation] lists empty+-- that wouldn't be valid VHDL code+-- regading NandExpr and NorExpr, their Relation list should +-- have a maximum size of two (i.e. NandExpr Expr (Maybe Expr))+data Expr = AndExpr [Relation] | + OrExpr [Relation] |+ XorExpr [Relation] |+ NandExpr [Relation] |+ NorExpr [Relation] |+ XnorExpr [Relation]+ deriving Show++-- relation +data Relation = Relation ShiftExpr (Maybe (RelOp,ShiftExpr))+ deriving Show++-- relational_operator+data RelOp = Eq | NEq | Less | LessEq | Gter | GterEq + deriving Show ++-- shift_expression+data ShiftExpr = ShiftExpr SimpleExpr (Maybe(ShiftOp,SimpleExpr)) + deriving Show++-- simple_expression+data SimpleExpr = SimpleExpr (Maybe Sign) Term [(AddOp,Term)]+ deriving Show++-- sign+data Sign = Pos | Neg+ deriving Show++-- shift_operator+data ShiftOp = Sll | Srl | Sla | Sra | Rol | Ror+ deriving Show ++-- adding_operator+data AddOp = Plus | Minus | Concat + deriving Show++-- term+data Term = Term Factor (Maybe (MultOp, Factor))+ deriving Show++-- multiplying_operator+data MultOp = Mult | Div | Mod | Rem+ deriving Show++-- factor+data Factor = Exp Primary (Maybe (Primary)) |+ Abs Primary |+ Not Primary+ deriving Show++-- primary+-- Only literals, names and function calls are allowed+data Primary = PrimName VHDLName |+ PrimLit Literal |+ PrimFCall FCall+ deriving Show++-- literal+-- Literals are expressed as a string (remember we are generating+-- code, not parsing)+type Literal = String++-- function_call+data FCall = FCall VHDLName [AssocElem]+ deriving Show+-}
+ src/ForSyDe/Backend/VHDL/Constants.hs view
@@ -0,0 +1,338 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Constants+-- Copyright : (c) SAM Group, KTH/ICT/ECS+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Constants used in the VHDL backend+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.Constants where++import ForSyDe.Backend.VHDL.AST++-- | Standard context clause used in all generated vhdl files. It imports+commonContextClause :: [ContextItem]+commonContextClause = + [Library forsydeId, + Library ieeeId,+ Use $ NSelected (NSimple forsydeId :.: SSimple typesId) :.: All,+ Use $ NSelected (NSimple ieeeId :.: SSimple std_logic_1164Id) :.: All,+ Use $ NSelected (NSimple ieeeId :.: SSimple numeric_stdId) :.: All]+ where forsydeId = unsafeVHDLBasicId "forsyde" + ieeeId = unsafeVHDLBasicId "ieee"+ typesId = unsafeVHDLBasicId "types"+ std_logic_1164Id = unsafeVHDLBasicId "std_logic_1164"+ numeric_stdId = unsafeVHDLBasicId "numeric_std"++--------------+-- Identifiers+--------------++-- | reset and clock signal identifiers in String form+resetStr, clockStr :: String+resetStr = "resetn"+clockStr = "clock"++-- | reset and clock signal identifiers in basic VHDLId form+resetId, clockId :: VHDLId+resetId = unsafeVHDLBasicId resetStr+clockId = unsafeVHDLBasicId clockStr+++-- | \"types\" identifier+typesId :: VHDLId+typesId = unsafeVHDLBasicId "types"++-- | work identifier+workId :: VHDLId+workId = unsafeVHDLBasicId "work"++-- | std identifier+stdId :: VHDLId+stdId = unsafeVHDLBasicId "std"+++-- | textio identifier+textioId :: VHDLId+textioId = unsafeVHDLBasicId "textio"++-- | range attribute identifier+rangeId :: VHDLId+rangeId = unsafeVHDLBasicId "range"+++-- | range attribute identifier+imageId :: VHDLId+imageId = unsafeVHDLBasicId "image"++-- | event attribute identifie+eventId :: VHDLId+eventId = unsafeVHDLBasicId "event"+++-- | default function identifier+defaultId :: VHDLId+defaultId = unsafeVHDLBasicId "default"+++-- AsbtExt function identifiers++-- | absent function identifier+absentId :: VHDLId+absentId = unsafeVHDLBasicId "absent"++-- | present function identifier+presentId :: VHDLId+presentId = unsafeVHDLBasicId "present"++-- | fromAbstExt function identifier+fromAbstExtId :: VHDLId+fromAbstExtId = unsafeVHDLBasicId "fromAbstExt"++-- | unsafeFromAbstExt function identifier+unsafeFromAbstExtId :: VHDLId+unsafeFromAbstExtId = unsafeVHDLBasicId "unsafeFromAbstExt"++-- | value element identifier+valueId :: VHDLId+valueId = unsafeVHDLBasicId "value"++-- | value element suffix+valueSuffix :: Suffix+valueSuffix = SSimple valueId++-- | isPresent function and element identifier+isPresentId :: VHDLId+isPresentId = unsafeVHDLBasicId "isPresent"++-- | isAbsent function identifier+isAbsentId :: VHDLId+isAbsentId = unsafeVHDLBasicId "isAbsent"++-- FSVec function identifiers++-- | ex (operator ! in original Haskell source) function identifier+exId :: VHDLId+exId = unsafeVHDLBasicId "ex"++-- | sel (function select in original Haskell source) function identifier+selId :: VHDLId+selId = unsafeVHDLBasicId "sel"+++-- | ltplus (function (<+) in original Haskell source) function identifier+ltplusId :: VHDLId+ltplusId = unsafeVHDLBasicId "ltplus"+++-- | plusplus (function (++) in original Haskell source) function identifier+plusplusId :: VHDLId+plusplusId = unsafeVHDLBasicId "plusplus"+++-- | empty function identifier+emptyId :: VHDLId+emptyId = unsafeVHDLBasicId "empty"++-- | plusgt (function (+>) in original Haskell source) function identifier+plusgtId :: VHDLId+plusgtId = unsafeVHDLBasicId "plusgt"++-- | singleton function identifier+singletonId :: VHDLId+singletonId = unsafeVHDLBasicId "singleton"++-- | length function identifier+lengthId :: VHDLId+lengthId = unsafeVHDLBasicId "length"+++-- | isnull (function null in original Haskell source) function identifier+isnullId :: VHDLId+isnullId = unsafeVHDLBasicId "isnull"+++-- | replace function identifier+replaceId :: VHDLId+replaceId = unsafeVHDLBasicId "replace"+++-- | head function identifier+headId :: VHDLId+headId = unsafeVHDLBasicId "head"+++-- | last function identifier+lastId :: VHDLId+lastId = unsafeVHDLBasicId "last"+++-- | init function identifier+initId :: VHDLId+initId = unsafeVHDLBasicId "init"+++-- | tail function identifier+tailId :: VHDLId+tailId = unsafeVHDLBasicId "tail"+++-- | take function identifier+takeId :: VHDLId+takeId = unsafeVHDLBasicId "take"+++-- | drop function identifier+dropId :: VHDLId+dropId = unsafeVHDLBasicId "drop"++-- | shiftl function identifier+shiftlId :: VHDLId+shiftlId = unsafeVHDLBasicId "shiftl"++-- | shiftr function identifier+shiftrId :: VHDLId+shiftrId = unsafeVHDLBasicId "shiftr"++-- | rotl function identifier+rotlId :: VHDLId+rotlId = unsafeVHDLBasicId "rotl"++-- | reverse function identifier+rotrId :: VHDLId+rotrId = unsafeVHDLBasicId "rotr"++-- | reverse function identifier+reverseId :: VHDLId+reverseId = unsafeVHDLBasicId "reverse"++-- | toBitVector8 function identifier+toBitVector8Id :: VHDLId+toBitVector8Id = unsafeVHDLBasicId "toBitVector8"++-- | toBitVector16 function identifier+toBitVector16Id :: VHDLId+toBitVector16Id = unsafeVHDLBasicId "toBitVector16"++-- | toBitVector32 function identifier+toBitVector32Id :: VHDLId+toBitVector32Id = unsafeVHDLBasicId "toBitVector32"+++-- | fromBitVector8 function identifier+fromBitVector8Id :: VHDLId+fromBitVector8Id = unsafeVHDLBasicId "fromBitVector8"+++-- | fromBitVector16 function identifier+fromBitVector16Id :: VHDLId+fromBitVector16Id = unsafeVHDLBasicId "fromBitVector16"+++-- | fromBitVector32 function identifier+fromBitVector32Id :: VHDLId+fromBitVector32Id = unsafeVHDLBasicId "fromBitVector32"++++-- | copy function identifier+copyId :: VHDLId+copyId = unsafeVHDLBasicId "copy"+++-- | show function identifier+showId :: VHDLId+showId = unsafeVHDLBasicId "show"+++-- | write function idenfier (from std.textio)+writeId :: VHDLId+writeId = unsafeVHDLBasicId "write"++-- | output file identifier (from std.textio)+outputId :: VHDLId+outputId = unsafeVHDLBasicId "output"++--------+-- Names+--------++defaultSN :: VHDLName+defaultSN = NSimple defaultId++------------------+-- VHDL type marks+------------------++-- | Stardard logic type mark+std_logicTM :: TypeMark+std_logicTM = unsafeVHDLBasicId "std_logic"++-- | boolean type mark+booleanTM :: TypeMark+booleanTM = unsafeVHDLBasicId "boolean"++-- | fsvec_index typemark+fsvec_indexTM :: TypeMark+fsvec_indexTM = unsafeVHDLBasicId "fsvec_index"++-- | natural typemark+naturalTM :: TypeMark+naturalTM = unsafeVHDLBasicId "natural"++-- | int32 typemark (defined in ForSyDe's VHDL library)+int64TM :: TypeMark+int64TM = unsafeVHDLBasicId "int64"++-- | int32 typemark (defined in ForSyDe's VHDL library)+int32TM :: TypeMark+int32TM = unsafeVHDLBasicId "int32"++-- | int32 typemark (defined in ForSyDe's VHDL library)+int16TM :: TypeMark+int16TM = unsafeVHDLBasicId "int16"++-- | int8 typemark (defined in ForSyDe's VHDL library)+int8TM :: TypeMark+int8TM = unsafeVHDLBasicId "int8"++-- | string typemark+stringTM :: TypeMark+stringTM = unsafeVHDLBasicId "string"++--------------+-- Expressions+--------------++-- | true expression+trueExpr :: Expr+trueExpr = PrimName (NSimple $ unsafeVHDLBasicId "true")+ +-- | false expression+falseExpr :: Expr+falseExpr = PrimName (NSimple $ unsafeVHDLBasicId "false")++-- | \'0\' bit expression+lowExpr :: Expr+lowExpr = PrimLit "'0'"++-- | \'1\' bit expression+highExpr :: Expr+highExpr = PrimLit "'1'"++-- | tup string record suffix+tupStrSuffix :: Int -> String+tupStrSuffix n = "tup_" ++ show n++-- | tup VHLID record suffix+tupVHDLIdSuffix :: Int -> VHDLId+tupVHDLIdSuffix = unsafeVHDLBasicId . tupStrSuffix++-- | tup VHDLName suffix+tupVHDLSuffix :: Int -> Suffix+tupVHDLSuffix = SSimple . tupVHDLIdSuffix
+ src/ForSyDe/Backend/VHDL/FileIO.hs view
@@ -0,0 +1,30 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.FileIO+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Functions working with files in the VHDL backend. +--+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.FileIO (writeDesignFile) where++import ForSyDe.Backend.VHDL.AST+import ForSyDe.Backend.VHDL.Ppr() -- instances+import qualified ForSyDe.Backend.Ppr as ForSyDePpr (ppr)++import System.IO+import Text.PrettyPrint.HughesPJ++-- | Write a design file to a file in disk+writeDesignFile :: DesignFile -> FilePath -> IO ()+writeDesignFile df fp = do+ handle <- openFile fp WriteMode+ hPutStrLn handle "-- Automatically generated by ForSyDe"+ hPutStr handle $ (renderStyle mystyle . ForSyDePpr.ppr) df+ hClose handle+ where mystyle = style{lineLength=80, ribbonsPerLine=1}
+ src/ForSyDe/Backend/VHDL/Generate.hs view
@@ -0,0 +1,713 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Generate+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Functions used to generate VHDL AST elements without making any +-- explicit translation.+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.Generate where++import ForSyDe.Backend.VHDL.Constants+import ForSyDe.Backend.VHDL.AST+import ForSyDe.Backend.VHDL.Traverse.VHDLM++-- | Generate a list of asignments (in 'ConcSm' form) of intermediate signals+-- (first argument) to final output signals (second argument) +genOutAssigns :: [VHDLId] -> [VHDLId] -> [ConcSm]+genOutAssigns = zipWith assign+ where assign dest orig = CSSASm $ dest `genSignalAssign` orig++-- | Generate a simple signal assignment, from a VHDL identifier to a+-- VHDL identifier+genSignalAssign :: VHDLId -- ^ destination+ -> VHDLId -- ^ origin+ -> ConSigAssignSm+genSignalAssign dest orig = genExprAssign dest (PrimName $ NSimple orig) ++-- | Generate a function call asignment+genFCallAssign :: VHDLId -- ^ destination signal+ -> VHDLId -- ^ Function Name+ -> [VHDLId] -- ^ Function formal parameters+ -> [VHDLId] -- ^ Function actual parameters+ -> ConSigAssignSm+genFCallAssign dest fName formal actual = + genExprAssign dest (PrimFCall $ genFCall fName formal actual) ++-- | Generate a simple assignment from an expression to a name+genExprAssign :: VHDLId -> Expr -> ConSigAssignSm+genExprAssign dest origExpr =+ NSimple dest :<==: (ConWforms [] (Wform [WformElem origExpr Nothing]) + Nothing) ++-- | Generate a system design file for a system from the global system +-- identifier,+-- local traversing results and the translated entity declaration+genSysDesignFile :: String -> EntityDec -> LocalTravResult -> DesignFile +genSysDesignFile globalSysId ent@(EntityDec id _) (LocalTravResult decs stms) = + DesignFile contextClause [LUEntity ent, LUArch archBody]+ where archBody = ArchBody archId (NSimple id) decs stms + archId = unsafeVHDLBasicId "synthesizable"+ libName = globalSysId ++ "_lib"+ libId = unsafeVHDLBasicId libName+ contextClause = commonContextClause ++ + [Library libId,+ Use $ NSelected (NSimple libId :.: SSimple typesId) :.: All]++-- | Generate a library design file from the global results+genLibDesignFile :: GlobalTravResult -> DesignFile+genLibDesignFile (GlobalTravResult typeDecs subtypeDecs subProgBodies) = + DesignFile commonContextClause [LUPackageDec packageDec, + LUPackageBody packageBody]+ where packageDec = PackageDec typesId (packageTypeDecs ++ + packageSubtypeDecs +++ subProgSpecs)+ packageTypeDecs = map PDITD typeDecs+ packageSubtypeDecs = map PDISD subtypeDecs+ subProgSpecs = map (\(SubProgBody spec _ _) -> PDISS spec) subProgBodies+ packageBody = PackageBody typesId subProgBodies++ +-- | Generate a list of association from two lists of signal identifiers+-- The first one establishes the formal parameters+genAssocElems :: [VHDLId] -> [VHDLId] -> [AssocElem]+genAssocElems formalNames actualNames = zipWith genAssoc formalNames actualNames++-- | Generate a port map from two lists of signal identifiers+-- The first list establishes the formal parameters+genPMap :: [VHDLId] -> [VHDLId] -> PMapAspect+genPMap formalIds actualIds = + PMapAspect $ genAssocElems formalIds actualIds+++-- | Generate a function call from two lists of signal identifiers+-- The first list establishes the formal parameters+genFCall :: VHDLId -> [VHDLId] -> [VHDLId] -> FCall +genFCall fName formalIds actualIds = + FCall (NSimple fName) $ zipWith genAssoc formalIds actualIds+ ++-- | Generate a function call from the Function Name and a list of expressions+-- (its arguments)+genExprFCall :: VHDLId -> [Expr] -> Expr+genExprFCall fName args = + PrimFCall $ FCall (NSimple fName) $+ map (\exp -> Nothing :=>: ADExpr exp) args++-- | version of genExprFCall which requires exactly n arguments+genExprFCallN :: VHDLId -> Int -> [Expr] -> Expr+genExprFCallN fName n args = genExprFCall fName (takeExactly n args)+ where takeExactly 0 [] = []+ takeExactly n (x:xs) | n > 0 = x : takeExactly (n-1) xs+ takeExactly _ _ = error "takeExactly: non exact length of input list"++-- | Generate a function call from the Function Name (constant function)+genExprFCall0 :: VHDLId -> Expr+genExprFCall0 fName = genExprFCall fName []++-- | List version of genExprFCall0+genExprFCall0L :: VHDLId -> [Expr] -> Expr+genExprFCall0L fName [] = genExprFCall fName []+genExprFCall0L _ _ = error "ForSyDe.Backend.VHDL.Generate.genExprFCall0L incorrect length"++-- | Generate a function call from the Function Name and an expression argument+genExprFCall1 :: VHDLId -> Expr -> Expr+genExprFCall1 fName arg = genExprFCall fName [arg]++-- | List version of genExprFCall1+genExprFCall1L :: VHDLId -> [Expr] -> Expr+genExprFCall1L fName [arg] = genExprFCall fName [arg]+genExprFCall1L _ _ = error "ForSyDe.Backend.VHDL.Generate.genExprFCall1L incorrect length"++-- | Generate a function call from the Function Name and two expression arguments+genExprFCall2 :: VHDLId -> Expr -> Expr -> Expr+genExprFCall2 fName arg1 arg2 = genExprFCall fName [arg1,arg2]++-- | List version of genExprFCall2+genExprFCall2L :: VHDLId -> [Expr] -> Expr+genExprFCall2L fName [arg1, arg2] = genExprFCall fName [arg1,arg2]+genExprFCall2L _ _ = error "ForSyDe.Backend.VHDL.Generate.genExprFCall2L incorrect length"++-- | Generate a function call from the Function Name and two expression arguments+genExprFCall4 :: VHDLId -> Expr -> Expr -> Expr -> Expr -> Expr+genExprFCall4 fName arg1 arg2 arg3 arg4 = + genExprFCall fName [arg1,arg2,arg2,arg3,arg4]+++-- | List version of genExprFCall4+genExprFCall4L :: VHDLId -> [Expr] -> Expr+genExprFCall4L fName [arg1, arg2, arg3, arg4] = + genExprFCall fName [arg1,arg2,arg2,arg3,arg4]+genExprFCall4L _ _ = error "ForSyDe.Backend.VHDL.Generate.genExprFCall4L incorrect length"++-- | Generate a procedure call from the Function Name and a list of expressions+-- (its arguments)+genExprProcCall :: VHDLId -> [Expr] -> SeqSm+genExprProcCall pName args = ProcCall (NSimple pName) $+ map (\exp -> Nothing :=>: ADExpr exp) args+++-- | Generate a procedure call from the Function Name (constant procedure)+genExprProcCall0 :: VHDLId -> SeqSm+genExprProcCall0 fName = genExprProcCall fName []+++-- | Generate a procedure call from the Function Name and an expression argument+genExprProcCall1 :: VHDLId -> Expr -> SeqSm+genExprProcCall1 pName arg = genExprProcCall pName [arg]+++-- | Generate a procedure call from the Function Name and four expression +-- arguments+genExprProcCall2 :: VHDLId -> Expr -> Expr -> SeqSm+genExprProcCall2 pName arg1 arg2 = genExprProcCall pName [arg1,arg2]+++-- | Generate a procedure call from the Function Name and two expression +-- arguments+genExprProcCall4 :: VHDLId -> Expr -> Expr -> Expr -> Expr -> SeqSm+genExprProcCall4 pName arg1 arg2 arg3 arg4 = + genExprProcCall pName [arg1,arg2,arg2,arg3,arg4]+++-- Generate an association of a formal and actual parameter+genAssoc :: VHDLId -> VHDLId -> AssocElem+genAssoc formal actual = Just formal :=>: ADName (NSimple actual)+++-- | Generate the default functions for an unconstrained custom vector type+genUnconsVectorFuns :: TypeMark -- ^ type of the vector elements+ -> TypeMark -- ^ type of the vector+ -> [SubProgBody]+genUnconsVectorFuns elemTM vectorTM = + [SubProgBody exSpec [] [exExpr] ,+ SubProgBody selSpec [SPVD selVar] [selFor, selRet] ,+ SubProgBody emptySpec [SPVD emptyVar] [emptyExpr] ,+ SubProgBody lengthSpec [] [lengthExpr] ,+ SubProgBody isnullSpec [] [isnullExpr] ,+ SubProgBody replaceSpec [SPVD replaceVar] [replaceExpr, replaceRet] ,+ SubProgBody headSpec [] [headExpr] ,+ SubProgBody lastSpec [] [lastExpr] ,+ SubProgBody initSpec [SPVD initVar] [initExpr, initRet] ,+ SubProgBody tailSpec [SPVD tailVar] [tailExpr, tailRet] ,+ SubProgBody takeSpec [SPVD takeVar] [takeExpr, takeRet] ,+ SubProgBody dropSpec [SPVD dropVar] [dropExpr, dropRet] ,+ SubProgBody shiftlSpec [SPVD shiftlVar] [shiftlExpr, shiftlRet] ,+ SubProgBody shiftrSpec [SPVD shiftrVar] [shiftrExpr, shiftrRet] ,+ SubProgBody rotlSpec [SPVD rotlVar] [rotlExpr, rotlRet] ,+ SubProgBody rotrSpec [SPVD rotrVar] [rotrExpr, rotrRet] ,+ SubProgBody reverseSpec [SPVD reverseVar] [reverseFor, reverseRet] ,+ SubProgBody copySpec [SPVD copyVar] [copyExpr] ,+ SubProgBody plusgtSpec [SPVD plusgtVar] [plusgtExpr, plusgtRet] ,+ SubProgBody ltplusSpec [SPVD ltplusVar] [ltplusExpr, ltplusRet] ,+ SubProgBody plusplusSpec [SPVD plusplusVar] [plusplusExpr, plusplusRet] ,+ SubProgBody singletonSpec [SPVD singletonVar] [singletonRet] ,+ SubProgBody showSpec [SPSB doShowDef] [showRet] ,+ SubProgBody defaultSpec [] [defaultExpr] ]+ where ixPar = unsafeVHDLBasicId "ix"+ vecPar = unsafeVHDLBasicId "vec"+ vec1Par = unsafeVHDLBasicId "vec1"+ vec2Par = unsafeVHDLBasicId "vec2"+ fPar = unsafeVHDLBasicId "f"+ nPar = unsafeVHDLBasicId "n"+ sPar = unsafeVHDLBasicId "s"+ iId = unsafeVHDLBasicId "i"+ iPar = iId+ aPar = unsafeVHDLBasicId "a"+ resId = unsafeVHDLBasicId "res"+ exSpec = Function exId [IfaceVarDec vecPar vectorTM,+ IfaceVarDec ixPar naturalTM] elemTM+ exExpr = + ReturnSm (Just $ PrimName $ NIndexed + (IndexedName (NSimple vecPar) [PrimName $ NSimple ixPar]))+ selSpec = Function selId [IfaceVarDec fPar naturalTM,+ IfaceVarDec nPar naturalTM,+ IfaceVarDec sPar naturalTM,+ IfaceVarDec vecPar vectorTM ] vectorTM+ -- variable res : fsvec_x (0 to n-1);+ selVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ ((PrimName (NSimple nPar)) :-:+ (PrimLit "1")) ]))+ Nothing+ -- for i res'range loop+ -- res(i) := vec(f+i*s);+ -- end loop;+ selFor = ForSM iId (AttribRange $ applyRangeAttrib resId) [selAssign]+ -- res(i) := vec(f+i*s);+ selAssign = let origExp = PrimName (NSimple fPar) :+: + (PrimName (NSimple iId) :*: + PrimName (NSimple sPar)) in+ NIndexed (IndexedName (NSimple resId) [PrimName (NSimple iId)]) :=+ (PrimName $ NIndexed (IndexedName (NSimple vecPar) [origExp]))+ -- return res;+ selRet = ReturnSm (Just $ PrimName (NSimple resId))+ emptySpec = Function emptyId [] vectorTM+ emptyVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimLit "-1")]))+ Nothing+ emptyExpr = ReturnSm (Just $ PrimName (NSimple resId))+ lengthSpec = Function lengthId [IfaceVarDec vecPar vectorTM] naturalTM+ lengthExpr = ReturnSm (Just $ PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing))+ isnullSpec = Function isnullId [IfaceVarDec vecPar vectorTM] booleanTM+ -- return vec'length = 0+ isnullExpr = ReturnSm (Just $ + PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :=:+ PrimLit "0")+ replaceSpec = Function replaceId [IfaceVarDec vecPar vectorTM,+ IfaceVarDec iPar naturalTM,+ IfaceVarDec aPar elemTM ] vectorTM + -- variable res : fsvec_x (0 to vec'length-1);+ replaceVar =+ VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimLit "1")) ]))+ Nothing+ -- res := vec(0 to i-1) & a & vec(i+1 to length'vec-1)+ replaceExpr = NSimple resId :=+ (vecSlice (PrimLit "0") (PrimName (NSimple iPar) :-: PrimLit "1") :&:+ PrimName (NSimple aPar) :&: + vecSlice (PrimName (NSimple iPar) :+: PrimLit "1")+ ((PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing)) + :-: PrimLit "1"))+ replaceRet = ReturnSm (Just $ PrimName $ NSimple resId)+ vecSlice init last = PrimName (NSlice + (SliceName + (NSimple vecPar) + (ToRange init last)))+ headSpec = Function headId [IfaceVarDec vecPar vectorTM] elemTM+ -- return vec(0);+ headExpr = ReturnSm (Just $ (PrimName $ NIndexed (IndexedName + (NSimple vecPar) [PrimLit "0"])))+ lastSpec = Function lastId [IfaceVarDec vecPar vectorTM] elemTM+ -- return vec(vec'length-1);+ lastExpr = ReturnSm (Just $ (PrimName $ NIndexed (IndexedName + (NSimple vecPar) + [PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) + :-: PrimLit "1"])))+ initSpec = Function initId [IfaceVarDec vecPar vectorTM] vectorTM + -- variable res : fsvec_x (0 to vec'length-2);+ initVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimLit "2")) ]))+ Nothing+ -- res:= vec(0 to vec'length-2)+ initExpr = NSimple resId := (vecSlice + (PrimLit "0") + (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) + :-: PrimLit "2"))+ initRet = ReturnSm (Just $ PrimName $ NSimple resId)+ tailSpec = Function tailId [IfaceVarDec vecPar vectorTM] vectorTM+ -- variable res : fsvec_x (0 to vec'length-2); + tailVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimLit "2")) ]))+ Nothing + -- res := vec(1 to vec'length-1)+ tailExpr = NSimple resId := (vecSlice + (PrimLit "1") + (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) + :-: PrimLit "1"))+ tailRet = ReturnSm (Just $ PrimName $ NSimple resId)+ takeSpec = Function takeId [IfaceVarDec nPar naturalTM,+ IfaceVarDec vecPar vectorTM ] vectorTM+ -- variable res : fsvec_x (0 to n-1);+ takeVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ ((PrimName (NSimple nPar)) :-:+ (PrimLit "1")) ]))+ Nothing+ -- res := vec(0 to n-1)+ takeExpr = NSimple resId := + (vecSlice (PrimLit "1") + (PrimName (NSimple $ nPar) :-: PrimLit "1"))+ takeRet = ReturnSm (Just $ PrimName $ NSimple resId)+ dropSpec = Function dropId [IfaceVarDec nPar naturalTM,+ IfaceVarDec vecPar vectorTM ] vectorTM + -- variable res : fsvec_x (0 to vec'length-n-1);+ dropVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimName $ NSimple nPar):-: (PrimLit "1")) ]))+ Nothing+ -- res := vec(n to vec'length-1)+ dropExpr = NSimple resId := (vecSlice + (PrimName $ NSimple nPar) + (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) + :-: PrimLit "1"))+ dropRet = ReturnSm (Just $ PrimName $ NSimple resId)+ shiftlSpec = Function shiftlId [IfaceVarDec vecPar vectorTM,+ IfaceVarDec aPar elemTM ] vectorTM + -- variable res : fsvec_x (0 to vec'length-1);+ shiftlVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimLit "1")) ]))+ Nothing+ -- res := a & init(vec)+ shiftlExpr = NSimple resId :=+ (PrimName (NSimple aPar) :&:+ genExprFCall1 initId (PrimName $ NSimple vecPar))+ shiftlRet = ReturnSm (Just $ PrimName $ NSimple resId) + shiftrSpec = Function shiftrId [IfaceVarDec vecPar vectorTM,+ IfaceVarDec aPar elemTM ] vectorTM + -- variable res : fsvec_x (0 to vec'length-1);+ shiftrVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimLit "1")) ]))+ Nothing+ -- res := tail(vec) & a+ shiftrExpr = NSimple resId :=+ (genExprFCall1 tailId (PrimName $ NSimple vecPar) :&:+ PrimName (NSimple aPar))+ shiftrRet = ReturnSm (Just $ PrimName $ NSimple resId) + rotlSpec = Function rotlId [IfaceVarDec vecPar vectorTM] vectorTM + -- variable res : fsvec_x (0 to vec'length-1);+ rotlVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimLit "1")) ]))+ Nothing+ -- if null(vec) then res := vec else res := last(vec) & init(vec)+ rotlExpr = IfSm (genExprFCall1 isnullId (PrimName $ NSimple vecPar)) + [NSimple resId := (PrimName $ NSimple vecPar)]+ []+ (Just $ Else [rotlExprRet])+ where rotlExprRet = + NSimple resId := + (genExprFCall1 lastId (PrimName $ NSimple vecPar) :&:+ genExprFCall1 initId (PrimName $ NSimple vecPar))+ rotlRet = ReturnSm (Just $ PrimName $ NSimple resId) + rotrSpec = Function rotrId [IfaceVarDec vecPar vectorTM] vectorTM + -- variable res : fsvec_x (0 to vec'length-1);+ rotrVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimLit "1")) ]))+ Nothing+ -- if null(vec) then res := vec else res := tail(vec) & head(vec)+ rotrExpr = IfSm (genExprFCall1 isnullId (PrimName $ NSimple vecPar)) + [NSimple resId := (PrimName $ NSimple vecPar)]+ []+ (Just $ Else [rotrExprRet]) + where rotrExprRet = + NSimple resId := + (genExprFCall1 lastId (PrimName $ NSimple vecPar) :&:+ genExprFCall1 initId (PrimName $ NSimple vecPar))+ rotrRet = ReturnSm (Just $ PrimName $ NSimple resId) + reverseSpec = Function reverseId [IfaceVarDec vecPar vectorTM] vectorTM+ reverseVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing) :-:+ (PrimLit "1")) ]))+ Nothing+ -- for i in 0 to res'range loop+ -- res(vec'length-i-1) := vec(i);+ -- end loop;+ reverseFor = + ForSM iId (AttribRange $ applyRangeAttrib resId) [reverseAssign]+ -- res(vec'length-i-1) := vec(i);+ reverseAssign = NIndexed (IndexedName (NSimple resId) [destExp]) :=+ (PrimName $ NIndexed (IndexedName (NSimple vecPar) + [PrimName $ NSimple iId]))+ where destExp = PrimName (NAttribute $ AttribName (NSimple vecPar) + lengthId Nothing) :-: + PrimName (NSimple iId) :-: + (PrimLit "1") + -- return res;+ reverseRet = ReturnSm (Just $ PrimName (NSimple resId))+ copySpec = Function copyId [IfaceVarDec nPar naturalTM,+ IfaceVarDec aPar elemTM ] vectorTM + -- variable res : fsvec_x (0 to n-1) := (others => a);+ copyVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ ((PrimName (NSimple nPar)) :-:+ (PrimLit "1")) ]))+ (Just $ Aggregate [ElemAssoc (Just Others) + (PrimName $ NSimple aPar)])+ -- return res+ copyExpr = ReturnSm (Just $ PrimName $ NSimple resId)+ plusgtSpec = Function plusgtId [IfaceVarDec aPar elemTM,+ IfaceVarDec vecPar vectorTM] vectorTM + -- variable res : fsvec_x (0 to vec'length);+ plusgtVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing))]))+ Nothing+ plusgtExpr = NSimple resId := + ((PrimName $ NSimple aPar) :&: + (PrimName $ NSimple vecPar))+ plusgtRet = ReturnSm (Just $ PrimName $ NSimple resId)+ ltplusSpec = Function ltplusId [IfaceVarDec vecPar vectorTM,+ IfaceVarDec aPar elemTM] vectorTM + -- variable res : fsvec_x (0 to vec'length);+ ltplusVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing))]))+ Nothing+ ltplusExpr = NSimple resId := + ((PrimName $ NSimple vecPar) :&: + (PrimName $ NSimple aPar))+ ltplusRet = ReturnSm (Just $ PrimName $ NSimple resId)+ plusplusSpec = Function plusplusId [IfaceVarDec vec1Par vectorTM,+ IfaceVarDec vec2Par vectorTM ] + vectorTM + -- variable res : fsvec_x (0 to vec1'length + vec2'length -1);+ plusplusVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0")+ (PrimName (NAttribute $ + AttribName (NSimple vec1Par) lengthId Nothing) :+:+ PrimName (NAttribute $ + AttribName (NSimple vec2Par) lengthId Nothing) :-:+ PrimLit "1")]))+ Nothing+ plusplusExpr = NSimple resId := + ((PrimName $ NSimple vec1Par) :&: + (PrimName $ NSimple vec2Par))+ plusplusRet = ReturnSm (Just $ PrimName $ NSimple resId)+ singletonSpec = Function singletonId [IfaceVarDec aPar elemTM ] + vectorTM+ -- variable res : fsvec_x (0 to 0) := (others => a);+ singletonVar = + VarDec resId + (SubtypeIn vectorTM+ (Just $ IndexConstraint + [ToRange (PrimLit "0") (PrimLit "0")]))+ (Just $ Aggregate [ElemAssoc (Just Others) + (PrimName $ NSimple aPar)])+ singletonRet = ReturnSm (Just $ PrimName $ NSimple resId)+ showSpec = Function showId [IfaceVarDec vecPar vectorTM] stringTM+ doShowId = unsafeVHDLBasicId "doshow"+ doShowDef = SubProgBody doShowSpec [] [doShowRet]+ where doShowSpec = Function doShowId [IfaceVarDec vecPar vectorTM] + stringTM+ -- case vec'len is+ -- when 0 => return "";+ -- when 1 => return head(vec);+ -- when others => return show(head(vec)) & ',' &+ -- doshow (tail(vec));+ -- end case;+ doShowRet = + CaseSm (PrimName (NAttribute $ + AttribName (NSimple vecPar) lengthId Nothing))+ [CaseSmAlt [ChoiceE $ PrimLit "0"] + [ReturnSm (Just $ PrimLit "\"\"")],+ CaseSmAlt [ChoiceE $ PrimLit "1"] + [ReturnSm (Just $ + genExprFCall1 showId + (genExprFCall1 headId (PrimName $ NSimple vecPar)) )],+ CaseSmAlt [Others] + [ReturnSm (Just $ + genExprFCall1 showId + (genExprFCall1 headId (PrimName $ NSimple vecPar)) :&:+ PrimLit "','" :&:+ genExprFCall1 doShowId + (genExprFCall1 tailId (PrimName $ NSimple vecPar)) ) ]]+ -- return '<' & doshow(vec) & '>';+ showRet = ReturnSm (Just $ PrimLit "'<'" :&:+ genExprFCall1 doShowId (PrimName $ NSimple vecPar) :&:+ PrimLit "'>'" )+ + defaultSpec = Function defaultId [] vectorTM+ defaultExpr = + ReturnSm (Just $ genExprFCall0 emptyId)+ + +-- | Generate the default functions for a custom tuple type+genTupleFuns :: [TypeMark] -- ^ type of each tuple element+ -> TypeMark -- ^ type of the tuple+ -> [SubProgBody]+genTupleFuns elemTMs tupleTM = + [SubProgBody defaultSpec [] [defaultExpr],+ SubProgBody showSpec [] [showExpr]]+ where tupPar = unsafeVHDLBasicId "tup" + defaultSpec = Function defaultId [] tupleTM+ defaultExpr = + ReturnSm (Just $ Aggregate (replicate tupSize + (ElemAssoc Nothing $ PrimName defaultSN)))+ showSpec = Function showId [IfaceVarDec tupPar tupleTM ] stringTM+ -- return '(' & show(tup.+ showExpr = ReturnSm (Just $+ PrimLit "'('" :&: showMiddle :&: PrimLit "')'")+ where showMiddle = foldr1 (\e1 e2 -> e1 :&: PrimLit "','" :&: e2) $ + map ((genExprFCall1 showId).+ PrimName . + NSelected.+ (NSimple tupPar:.:).+ tupVHDLSuffix) + [1..tupSize]+ tupSize = length elemTMs++-- | Generate the default functions for a custom abst_ext_ type+genAbstExtFuns :: TypeMark -- ^ type of the values nested in AbstExt+ -> TypeMark -- ^ type of the extended values+ -> [SubProgBody]+genAbstExtFuns elemTM absExtTM = + [SubProgBody defaultSpec [] [defaultExpr],+ SubProgBody absentSpec [] [absentExpr] ,+ SubProgBody presentSpec [] [presentExpr],+ SubProgBody fromAbstExtSpec [] [fromAbstExtExpr],+ SubProgBody unsafeFromAbstExtSpec [] [unsafeFromAbstExtExpr],+ SubProgBody isPresentSpec [] [isPresentExpr],+ SubProgBody isAbsentSpec [] [isAbsentExpr],+ SubProgBody showSpec [] [showExpr] ]+ where defaultPar = unsafeVHDLBasicId "default"+ extPar = unsafeVHDLBasicId "extabst"+ defaultSpec = Function defaultId [] absExtTM+ defaultExpr = + ReturnSm (Just $ PrimName $ NSimple absentId)+ absentSpec = Function absentId [] absExtTM+ absentExpr = + ReturnSm (Just $ Aggregate + [ElemAssoc Nothing falseExpr, + ElemAssoc Nothing $ PrimName $ defaultSN ])+ presentSpec = + Function absentId [IfaceVarDec extPar elemTM] absExtTM+ presentExpr = + ReturnSm (Just $ Aggregate [ElemAssoc Nothing trueExpr, + ElemAssoc Nothing $ PrimName $ NSimple extPar ])+ fromAbstExtSpec = Function absentId [IfaceVarDec defaultPar elemTM,+ IfaceVarDec extPar absExtTM] + elemTM+ fromAbstExtExpr = + IfSm (PrimName $ NSelected (NSimple extPar :.: SSimple isPresentId))+ [ReturnSm (Just $ PrimName $ + (NSelected (NSimple extPar :.: SSimple valueId)))]+ []+ (Just $ Else+ [ReturnSm (Just $ PrimName $ NSimple defaultPar)])+ unsafeFromAbstExtSpec = + Function absentId [IfaceVarDec extPar absExtTM] elemTM+ unsafeFromAbstExtExpr =+ ReturnSm (Just $ + PrimName (NSelected (NSimple extPar :.: SSimple valueId)))+ isPresentSpec = + Function absentId [IfaceVarDec extPar absExtTM] booleanTM+ isPresentExpr =+ ReturnSm (Just $+ PrimName (NSelected (NSimple extPar :.: SSimple isPresentId)))+ isAbsentSpec = + Function absentId [IfaceVarDec extPar absExtTM] booleanTM+ isAbsentExpr =+ ReturnSm (Just $+ Not $ PrimName (NSelected (NSimple extPar :.: SSimple isPresentId)))+ showSpec = Function showId [IfaceVarDec extPar absExtTM ] stringTM+ -- if extabs.isPresent + -- return "Prst " & show(extabs.value);+ -- else+ -- return "Abst";+ -- end if; + showExpr = + IfSm (PrimName $ NSelected (NSimple extPar :.: SSimple isPresentId))+ [ReturnSm (Just $ PrimLit "\"Prst \"" :&:+ genExprFCall1 showId (PrimName $ + (NSelected (NSimple extPar :.: SSimple valueId))))]+ []+ (Just $ Else+ [ReturnSm (Just $ PrimLit "\"Abst\"")])++ ++-- | Generate the default functions for a custom enumeration type+genEnumAlgFuns :: TypeMark -- ^ enumeration type+ -> VHDLId -- ^ First enumeration literal of the type+ -> [SubProgBody]+genEnumAlgFuns enumTM firstLit = + [SubProgBody defaultSpec [] [defaultExpr],+ SubProgBody showSpec [] [showExpr]]+ where enumPar = unsafeVHDLBasicId "enum"+ defaultSpec = Function defaultId [] enumTM+ defaultExpr = ReturnSm (Just $ PrimName (NSimple firstLit))+ showSpec = Function showId [IfaceVarDec enumPar enumTM] stringTM+ -- we slice the resulting image in order to eliminate the+ -- leading and trailing slashes+ -- + -- return enumTM'image(enum)(2 to enumTM'image(enum)'length-1);+ showExpr = ReturnSm (Just $ PrimName $ NSlice $ SliceName image+ (ToRange (PrimLit "2")+ ((PrimName $ NAttribute $+ AttribName image lengthId Nothing) :-:+ PrimLit "1")))+ where image = NAttribute$ AttribName (NSimple enumTM) imageId + (Just $ PrimName $ NSimple enumPar)++-- | Apply the range attribute out of a simple name+applyRangeAttrib :: SimpleName -> AttribName+applyRangeAttrib sName = AttribName (NSimple sName) rangeId Nothing+
+ src/ForSyDe/Backend/VHDL/GlobalNameTable.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE TemplateHaskell #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.GlobalNameTable+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Global tranlsation table (symbol table) from Template Haskell Names to VHDL +-- expressions+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.GlobalNameTable (globalNameTable) where++import Data.Bits+import Language.Haskell.TH+++import ForSyDe.AbsentExt+import qualified ForSyDe.Bit as B (not)+import ForSyDe.Bit hiding (not)+import qualified ForSyDe.Backend.VHDL.AST as VHDL+import ForSyDe.Backend.VHDL.AST+import ForSyDe.Backend.VHDL.Constants+import ForSyDe.Backend.VHDL.Generate+import qualified Data.Param.FSVec as V++-- | Global tranlsation table from Template Haskell function and+-- constructor Names to VHDL expressions. The table works like this+--+-- (function, constant constructor name, (arity, function to obtain a+-- VHDL expression+-- provided its+-- arguments are already+-- translated to VHDL ))+globalNameTable :: [(Name, (Int, [VHDL.Expr] -> VHDL.Expr ) )]+globalNameTable = [+-- Unary constructors+ ('Prst , (1, genExprFCall1L presentId ) ),+-- Constant constructors+ ('True , (0, genZeroConsCall trueExpr ) ),+ ('False , (0, genZeroConsCall falseExpr ) ),+ ('H , (0, genZeroConsCall highExpr ) ),+ ('L , (0, genZeroConsCall lowExpr ) ),+ ('Abst , (0, genZeroConsCall (PrimName $ NSimple absentId) ) ),+-- Quaternary functions+ ('V.select , (4, genExprFCall4L selId ) ),+-- Binary functions+ ('(&&) , (2, genBinOpCall And ) ),+ ('(||) , (2, genBinOpCall Or ) ),+ ('(.&.) , (2, genBinOpCall And ) ),+ ('(.|.) , (2, genBinOpCall Or ) ),+ ('xor , (2, genBinOpCall Xor ) ),+ ('(==) , (2, genBinOpCall (:=:) ) ),+ ('(/=) , (2, genBinOpCall (:/=:) ) ),+ ('(<) , (2, genBinOpCall (:<:) ) ), + ('(<=) , (2, genBinOpCall (:<=:) ) ),+ ('(>) , (2, genBinOpCall (:>:) ) ),+ ('(>=) , (2, genBinOpCall (:>=:) ) ), + ('(+) , (2, genBinOpCall (:+:) ) ),+ ('(-) , (2, genBinOpCall (:-:) ) ),+ ('(*) , (2, genBinOpCall (:*:) ) ),+ ('div , (2, genBinOpCall (:/:) ) ),+ ('mod , (2, genBinOpCall Mod ) ),+ ('rem , (2, genBinOpCall Rem ) ),+ ('(^) , (2, genBinOpCall (:**:) ) ),+ ('(V.+>) , (2, genExprFCall2L plusgtId ) ),+ ('(V.<+) , (2, genExprFCall2L ltplusId ) ),+ ('(V.++) , (2, genExprFCall2L plusplusId ) ),+ ('(V.!) , (2, genExprFCall2L exId ) ),+ ('V.take , (2, genExprFCall2L takeId ) ),+ ('V.drop , (2, genExprFCall2L dropId ) ),+ ('V.shiftl , (2, genExprFCall2L shiftlId ) ),+ ('V.shiftr , (2, genExprFCall2L shiftrId ) ),+ ('V.copy , (2, genExprFCall2L copyId ) ),+-- unary functions+ ('B.not , (1, genUnOpCall Not ) ),+ ('not , (1, genUnOpCall Not ) ),+ ('negate , (1, genUnOpCall Neg ) ),+ ('abs , (1, genUnOpCall Abs ) ),+ ('abstExt , (1, genExprFCall1L presentId ) ),+ ('V.singleton , (1, genExprFCall1L singletonId ) ),+ ('V.length , (1, genExprFCall1L lengthId ) ),+ ('V.lengthT , (1, genExprFCall1L lengthId ) ),+ ('V.genericLength , (1, genExprFCall1L lengthId ) ),+ ('V.null , (1, genExprFCall1L isnullId ) ),+ ('V.head , (1, genExprFCall1L headId ) ),+ ('V.last , (1, genExprFCall1L lastId ) ),+ ('V.init , (1, genExprFCall1L initId ) ),+ ('V.tail , (1, genExprFCall1L tailId ) ),+ ('V.rotl , (1, genExprFCall1L rotlId ) ),+ ('V.rotr , (1, genExprFCall1L rotrId ) ),+ ('V.reverse , (1, genExprFCall1L reverseId ) ),+ ('toBitVector8 , (1, genExprFCall1L toBitVector8Id ) ),+ ('toBitVector16 , (1, genExprFCall1L toBitVector16Id ) ),+ ('toBitVector32 , (1, genExprFCall1L toBitVector32Id ) ),+ ('fromBitVector8 , (1, genExprFCall1L fromBitVector8Id ) ),+ ('fromBitVector16 , (1, genExprFCall1L fromBitVector16Id ) ),+ ('fromBitVector32 , (1, genExprFCall1L fromBitVector32Id ) ),+-- constants+ ('V.empty , (0, genExprFCall0L emptyId ) )]+ where genBinOpCall op = \[e1, e2] -> e1 `op` e2+ genUnOpCall op = \[e] -> op e+ genZeroConsCall cons = \[] -> cons
+ src/ForSyDe/Backend/VHDL/GlobalNameTable.hs-boot view
@@ -0,0 +1,7 @@+module ForSyDe.Backend.VHDL.GlobalNameTable (globalNameTable) where+++import Language.Haskell.TH+import qualified ForSyDe.Backend.VHDL.AST as VHDL++globalNameTable :: [(Name, (Int, [VHDL.Expr] -> VHDL.Expr ) )]
+ src/ForSyDe/Backend/VHDL/Modelsim.hs view
@@ -0,0 +1,169 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Modelsim+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Functions to process the VHDL compilation results with Modelsim.+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.Modelsim (compileResultsModelsim,+ executeTestBenchModelsim) where++import ForSyDe.Backend.VHDL.Traverse.VHDLM+import ForSyDe.Backend.VHDL.TestBench++import ForSyDe.System.SysDef+import ForSyDe.OSharing+import ForSyDe.ForSyDeErr+import ForSyDe.Config (getDataDir)++import Data.List (intersperse)+import System.Directory (setCurrentDirectory)+import Control.Monad (liftM, when)+import Control.Monad.State (gets)+import System.Directory (findExecutable, getTemporaryDirectory)+import System.Process (runProcess, waitForProcess)+import System.Exit (ExitCode(..))+import System.IO +import System.FilePath ((</>))+import qualified Language.Haskell.TH as TH (Exp)++-- | Generate a testbench and execute it with Modelsim+-- (Note: the initial and final CWD will be / )+executeTestBenchModelsim :: Maybe Int -- ^ Number of cycles to simulate + -> [[TH.Exp]] -- ^ input stimuli, each signal value+ -- is expressed as a template haskell+ -- expression + -> VHDLM [[String]] -- ^ results, each signal value+ -- is expressed as a string+executeTestBenchModelsim mCycles stimuli= do+ cycles <- writeVHDLTestBench mCycles stimuli+ sysid <- gets (sid.globalSysDef.global)+ -- change to sysid/vhdl/+ liftIO $ setCurrentDirectory (sysid </> "vhdl")+ -- compile the testbench with modelsim+ run_vcom ["-93", "-quiet", "-nologo", "-work", "work", + "test" </> (sysid ++ "_tb.vhd")] + -- execute the testbench and capture the results+ tmpdir <- liftIO getTemporaryDirectory + (file, handle) <- liftIO $ openTempFile tmpdir "tb_out.txt"+ -- we close the temporal file to avoid opening problems with vsim on windows+ liftIO $ hClose handle + run_vsim ["-c", "-std_output", file, "-quiet", + "-do", "run " ++ show (cycles*10) ++ " ns; exit",+ "work." ++ sysid ++ "_tb"]+ handle2 <- liftIO $ openFile file ReadMode+ flatOut <- liftIO $ hGetContents handle2+ -- go back to the original directory+ liftIO $ setCurrentDirectory (".." </> "..")+ parseTestBenchOut flatOut++-- | Compile the generated VHDL code with Modelsim+-- (Note: the initial and final CWD will be /systemName/vhdl )+compileResultsModelsim :: VHDLM ()+compileResultsModelsim = do+ -- Check if modelsim is installed+ installed <- liftIO $ isModelsimInstalled+ when (not installed) (throwFError ModelsimFailed) + -- get the name of the vhdl files to compile+ sys <- gets (globalSysDef.global)+ let sysId = sid sys+ syslib = sysId ++ "_lib"+ libFile = syslib </> (syslib ++ ".vhd")+ workFiles = ("work" </> (sysId ++ ".vhd")) :+ map (("work"</>).(++".vhd").sid.readURef.unPrimSysDef)+ (subSys sys)+ -- get the modelsim directory of ForSyDe's vhdl library+ -- (generated during installation)+ dataPath <- liftIO $ getDataDir++ -- map the directory to the logical name forsyde+ let modelsimForSyDe = dataPath </> "lib" </> "modelsim"+ run_vmap ["forsyde", modelsimForSyDe]+ + -- compile the library of current model+ let modelsimLib = syslib </> "modelsim"+ run_vlib [modelsimLib]+ run_vcom ["-93", "-quiet", "-nologo", "-work", modelsimLib, libFile]+ -- map the directory of the library to its logical name+ run_vmap [syslib, modelsimLib]+ + -- compile the work files+ -- NOTE: Since vcom doesn't figure out+ -- the compilation order (according to compoment dependencies),+ -- we first compile the entities and then the architectures.+ -- Another option would be keeping a dependency tree in SysDef+ -- and execute vcom using a depth search (currently we keep+ -- all the subsystems in a flatenned list) + let modelsimWork = "work" </> "modelsim"+ run_vlib [modelsimWork]+ run_vcom ("-93" : "-quiet" : "-nologo" : "-work" : modelsimWork : + "-just" : "e" : workFiles)+ run_vcom ("-93" : "-quiet" : "-nologo" : "-work" : modelsimWork : + "-just" : "a" : workFiles)+ -- map the directory work library to its logical name+ run_vmap ["work", modelsimWork]+ ++++-- | Run vlib+run_vlib :: [String] -- ^ arguments+ -> VHDLM ()+run_vlib = runModelsimCommand "vlib"++-- | Run vmap+run_vmap :: [String] -- ^ arguments+ -> VHDLM ()+run_vmap = runModelsimCommand "vmap"+++-- | Run vmap+run_vcom :: [String] -- ^ arguments+ -> VHDLM ()+run_vcom = runModelsimCommand "vcom"++-- | Run vsim+run_vsim :: [String] -- ^ arguments+ -> VHDLM ()+run_vsim = runModelsimCommand "vsim"++-- | run a ModelSim command+runModelsimCommand :: String -- ^ Command to execute + -> [String] -- ^ Command arguments+ -> VHDLM ()+runModelsimCommand command args = do+ success <- liftIO $ runWait msg command args+ when (not success) (throwFError ModelsimFailed)+ where msg = "Running: " ++ command ++ " " ++ (concat $ intersperse " " args)+++-- | Run a process, previously announcing a message and waiting for it+-- to finnish its execution.+runWait :: String -- ^ message to show+ -> FilePath -- ^ command to execute + -> [String] -- ^ command arguments+ -> IO Bool -- ^ Did the execution end succesfully?+runWait msg proc args = do+ putStrLn msg + h <- runProcess proc args Nothing Nothing Nothing Nothing Nothing+ code <- waitForProcess h+ return $ code == ExitSuccess +++-- Look for modelsim executables+isModelsimInstalled :: IO Bool+isModelsimInstalled = executablePresent "vlib" <&&> + executablePresent "vmap" <&&> + executablePresent "vcom" <&&>+ executablePresent "vsim"+ where executablePresent = (liftM (maybe False (\_-> True))) .findExecutable++-- | short-circuit and for monads+(<&&>) :: Monad m => m Bool -> m Bool -> m Bool+x <&&> y = do p <- x+ if p then y else return False
+ src/ForSyDe/Backend/VHDL/Ppr.hs view
@@ -0,0 +1,480 @@+{-# LANGUAGE FlexibleInstances #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Ppr+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- VHDL pretty-printing instances.+--+-----------------------------------------------------------------------------+++-- FIXME: we could avoid the LANGUAGE extensions by adding ppr_list to the Ppr +-- class (see Language.Haskell.TH.Ppr)++module ForSyDe.Backend.VHDL.Ppr () where++import ForSyDe.Backend.Ppr++import ForSyDe.Backend.VHDL.AST++import Text.PrettyPrint.HughesPJ hiding (Mode)+++-- | Number of spaces used for indentation+nestVal :: Int+nestVal = 5++instance Ppr a => Ppr (Maybe a) where+ ppr (Just a) = ppr a+ ppr Nothing = empty ++instance (Ppr a, Ppr b) => Ppr (a,b) where+ ppr (a,b) = ppr a <+> ppr b++instance Ppr VHDLId where+ ppr = text.fromVHDLId+ ++instance Ppr DesignFile where+ ppr (DesignFile cx lx) = vNSpaces spaces (ppr_list ($+$) cx) + (ppr_list (vNSpaces spaces) lx) $+$+ vSpace+ where spaces = 2+++ +instance Ppr ContextItem where+ ppr (Library id) = text "library" <+> ppr id <> semi+ ppr (Use name) = text "use" <+> ppr name <> semi+ ++instance Ppr LibraryUnit where+ ppr (LUEntity entityDec) = ppr entityDec+ ppr (LUArch archBody) = ppr archBody+ ppr (LUPackageDec packageDec) = ppr packageDec + ppr (LUPackageBody packageBody) = ppr packageBody++instance Ppr EntityDec where+ ppr (EntityDec id ifaceSigDecs) = + text "entity" <+> idDoc <+> text "is" $+$+ nest nestVal (ppr ifaceSigDecs) $+$+ text "end entity" <+> idDoc <> semi+ where idDoc = ppr id ++instance Ppr [IfaceSigDec] where+-- FIXME: improve pretty printing of the+-- declarations+-- This:+-- S1 : bit+-- Ssdds : bit+-- should really be printed as+-- S1 : bit+-- Ssdds : bit+ ppr [] = empty+ ppr decs = text "port" <+> (parens (ppr_list vSemi decs) <> semi)+++instance Ppr IfaceSigDec where+ ppr (IfaceSigDec id mode typemark) = + ppr id <+> colon <+> ppr mode <+> ppr typemark+++instance Ppr Mode where+ ppr In = text "in"+ ppr Out = text "out"++instance Ppr ArchBody where+ ppr (ArchBody id enName decs conSms) = + text "architecture" <+> idDoc <+> text "of" <+> ppr enName <+> text "is" $+$+ nest nestVal (ppr decs) $+$+ text "begin" $+$+ nest nestVal (ppr_list (vNSpaces 1) conSms) $+$+ text "end architecture" <+> idDoc <> semi+ where idDoc = ppr id++instance Ppr PackageDec where+ ppr (PackageDec id decs) =+ text "package" <+> idDoc <+> text "is" $+$+ vSpace $++$+ nest nestVal (ppr_list (vNSpaces 1) decs) $++$+ vSpace $+$+ text "end package" <+> idDoc <> semi+ where idDoc = ppr id ++instance Ppr PackageDecItem where+ ppr (PDITD typeDec) = ppr typeDec+ ppr (PDISD subtypeDec) = ppr subtypeDec+ ppr (PDISS subProgSpec) = ppr subProgSpec <> semi++instance Ppr PackageBody where+ ppr (PackageBody id decs) =+ text "package body" <+> idDoc <+> text "is" $+$+ vSpace $++$+ nest nestVal (ppr_list (vNSpaces 1) decs) $++$+ vSpace $+$+ text "end package body" <+> idDoc <> semi+ where idDoc = ppr id ++instance Ppr SubtypeDec where+ ppr (SubtypeDec id si) = text "subtype" <+> ppr id <+> text "is" <+> ppr si <> semi++instance Ppr SubtypeIn where+ ppr (SubtypeIn tm mCons) = ppr tm <+> (ppr mCons)+++instance Ppr Range where+ ppr (AttribRange an) = ppr an+ ppr (ToRange exp1 exp2) = ppr exp1 <+> text "to" <+> ppr exp2+++instance Ppr IndexConstraint where+ ppr (IndexConstraint dr) = parens (ppr_list hComma dr)+ ++instance Ppr TypeDec where+ ppr (TypeDec id typeDef) = + hang (text "type" <+> ppr id <+> text "is") nestVal (ppr typeDef <> semi)++instance Ppr TypeDef where+ ppr (TDA arrayTD) = ppr arrayTD+ ppr (TDR recordTD) = ppr recordTD+ ppr (TDE enumTD) = ppr enumTD++instance Ppr ArrayTypeDef where+ ppr (UnconsArrayDef unconsIxs elemsTM) = + text "array" <+> parens (ppr_list hComma $ map pprUnconsRange unconsIxs) <+>+ text "of" <+> ppr elemsTM+ where pprUnconsRange tm = ppr tm <+> text "range <>"++ ppr (ConsArrayDef consIxs elemsTM) = + text "array" <+> ppr consIxs <+> text "of" <+> ppr elemsTM ++instance Ppr RecordTypeDef where+ ppr (RecordTypeDef elementDecs) =+ text "record" <+> (ppr_list ($+$) elementDecs) $+$ + text "end record"++instance Ppr ElementDec where+ ppr (ElementDec id tm) = ppr id <+> colon <+> ppr tm <> semi ++instance Ppr EnumTypeDef where+ ppr (EnumTypeDef ids) = lparen <> ppr_list hComma ids <> rparen++instance Ppr VHDLName where+ ppr (NSimple simple) = ppr simple+ ppr (NSelected selected) = ppr selected+ ppr (NIndexed indexed) = ppr indexed+ ppr (NSlice slice) = ppr slice + ppr (NAttribute attrib) = ppr attrib++instance Ppr SelectedName where+ ppr (prefix :.: suffix) = ppr prefix <> dot <> ppr suffix++instance Ppr Suffix where+ ppr (SSimple simpleName) = ppr simpleName+ ppr All = text "all"++instance Ppr IndexedName where+ ppr (IndexedName prefix indexList) = + ppr prefix <> parens ( ppr_list hComma indexList )++instance Ppr SliceName where+ ppr (SliceName prefix discreteRange) = ppr prefix <> parens (ppr discreteRange)++instance Ppr AttribName where+ ppr (AttribName prefix simpleName mExpr) = + ppr prefix <> char '\'' <> ppr simpleName <> parensNonEmpty (ppr mExpr)++instance Ppr [BlockDecItem] where+ ppr = ppr_list ($+$)++instance Ppr BlockDecItem where+ ppr (BDISPB subProgBody) = ppr subProgBody+ ppr (BDISD sigDec) = ppr sigDec+++instance Ppr SubProgBody where+ ppr (SubProgBody subProgSpec decItems statements) = + ppr subProgSpec <+> text "is" $+$+ nest nestVal (ppr_list ($+$) decItems) $+$+ text "begin" $+$+ nest nestVal (ppr_list ($+$) statements) $+$+-- TODO, show the id here+ text "end" <> semi+++instance Ppr SubProgDecItem where+ ppr (SPVD vd) = ppr vd+ ppr (SPSB sb) = ppr sb++instance Ppr VarDec where+ ppr (VarDec id st mExpr) = + text "variable" <+> ppr id <+> colon <+> ppr st <+>+ (text ":=" <++> ppr mExpr) <> semi++instance Ppr SubProgSpec where+-- FIXME: improve pretty printing of the+-- declarations+-- This:+-- (S1 : bit;+-- Ssdds : bit)+-- should really be printed as+-- (S1 : bit;+-- Ssdds : bit)+ ppr (Function name decList returnType) =+ text "function" <+> ppr name <+> (parensNonEmpty (ppr_decs decList) $+$+ text "return" <+> ppr returnType)+ where ppr_decs ds = ppr_list vSemi ds++ ++instance Ppr IfaceVarDec where+ ppr (IfaceVarDec id typemark) = ppr id <+> colon <+> ppr typemark++instance Ppr SeqSm where+ ppr (IfSm cond sms elseIfs maybeElse) = + text "if" <+> ppr cond <+> text "then" $+$+ nest nestVal (ppr sms) $+$+ ppr elseIfs $+$+ ppr maybeElse $+$+ text "end if" <> semi+ ppr (CaseSm patern alts) = text "case" <+> ppr patern <+> text "is" $+$+ nest nestVal (ppr alts) $+$+ text "end case" <> semi+ ppr (ReturnSm maybeExpr) = text "return" <+> ppr maybeExpr <> semi+ ppr (ForSM id dr sms) = + text "for" <+> ppr id <+> text "in" <+> ppr dr <+> text "loop" $+$+ nest nestVal (ppr sms) $+$+ text "end loop" <> semi+ ppr (target := orig) = ppr target <+> text ":=" <+> ppr orig <> semi+ ppr (WaitFor expr) = text "wait for" <+> ppr expr <> semi+ ppr (targ `SigAssign` orig) = ppr targ <+> text "<=" <+> ppr orig <> semi+ ppr (ProcCall name assocs) = + ppr name <> parensNonEmpty (commaSep assocs) <> semi++instance Ppr [SeqSm] where+ ppr = ppr_list ($+$)++instance Ppr [ElseIf] where+ ppr = ppr_list ($+$)++instance Ppr ElseIf where+ ppr (ElseIf cond sms) = text "elseif" <+> ppr cond <+> text "then" $+$+ nest nestVal (ppr sms)++instance Ppr Else where+ ppr (Else sms) = text "else" $+$+ nest nestVal (ppr sms)+++instance Ppr [CaseSmAlt] where+ ppr = ppr_list ($+$)++instance Ppr Choice where+ ppr (ChoiceE expr) = ppr expr+ ppr Others = text "others" ++instance Ppr CaseSmAlt where+ ppr (CaseSmAlt alts sms) = + text "when" <+> ppr_list joinAlts alts <+> text "=>" $+$+ nest nestVal (ppr sms)+ where joinAlts a1 a2 = a1 <+> char '|' <+> a2++instance Ppr SigDec where+ ppr (SigDec id typemark mInit) = + text "signal" <+> ppr id <+> colon <+> ppr typemark <+> + (text ":=" <++> ppr mInit) <> semi++instance Ppr [ConcSm] where+ ppr = ppr_list ($$)+ +instance Ppr ConcSm where+ ppr (CSBSm blockSm) = ppr blockSm+ ppr (CSSASm conSigAssignSm) = ppr conSigAssignSm+ ppr (CSISm compInsSm) = ppr compInsSm+ ppr (CSPSm procSm) = ppr procSm++instance Ppr BlockSm where+ ppr (BlockSm label ifaceSigDecs pMapAspect blockDecItems concSms) =+ labelDoc <+> colon <+> text "block" $+$+ nest nestVal (ppr ifaceSigDecs) $+$+ nest nestVal (ppr pMapAspect) <> semi $+$+ nest nestVal (ppr blockDecItems) $+$+ text "begin" $+$+ nest nestVal (ppr concSms) $+$+ text "end block" <+> labelDoc <> semi+ where labelDoc = ppr label+ ++instance Ppr PMapAspect where+ ppr (PMapAspect assocs) = text "port map" $$ + (nest identL $ parens (ppr_list vComma assocs))+ where identL = length "port map "+ ++instance Ppr AssocElem where+ ppr (formalPart :=>: actualPart) = formalPartDoc <+> ppr actualPart+ where formalPartDoc = maybe empty (\fp -> ppr fp <+> text "=>") formalPart++instance Ppr ActualDesig where+ ppr (ADName name) = ppr name+ ppr (ADExpr expr) = ppr expr+ ppr Open = text "open"++instance Ppr ConSigAssignSm where+ ppr (target :<==: cWforms) = ppr target <+> text "<=" <+> (ppr cWforms <> semi)+++instance Ppr ConWforms where+ ppr (ConWforms whenElses wform lastElse) = ppr_list ($+$) whenElses $+$+ ppr wform <+> ppr lastElse++instance Ppr WhenElse where+ ppr (WhenElse wform expr) = ppr wform <+> text "when" <+> + ppr expr <+> text "else"++instance Ppr When where+ ppr (When cond) = text "when" <+> ppr cond++instance Ppr Wform where+ ppr (Wform elems) = ppr_list vComma elems+ ppr Unaffected = text "unaffected"++instance Ppr WformElem where+ ppr (WformElem exp mAfter) = ppr exp <+> (text "after" <++> ppr mAfter)+++instance Ppr CompInsSm where+ ppr (CompInsSm label insUnit assocElems) =+ ppr label <+> colon <+> (ppr insUnit $+$+ nest nestVal (ppr assocElems) <> semi)++instance Ppr ProcSm where+ ppr (ProcSm label sensl seqSms) =+ ppr label <+> colon <+> text "process" <+> + parensNonEmpty (ppr_list hComma sensl) $+$+ text "begin" $+$+ nest nestVal (ppr seqSms) $+$+ text "end process" <+> labelDoc <> semi+ where labelDoc = ppr label++instance Ppr InsUnit where+ ppr (IUEntity name) = text "entity" <+> ppr name++-- FIXME, remove parenthesis according to precedence+instance Ppr Expr where+ ppr = pprExprPrec 0 ""+++-- | Prettyprint an binary infix operator +pprExprPrecInfix :: Int -- ^ Accumulated precedence value (initialized to 0)+ -> String -- ^ Enclosing operator (initialized to \"\")+ -> Int -- ^ Precedence of current infix operator + -> Expr -- ^ lhs expression+ -> String -- ^ operator name+ -> Expr -- ^ rhs expression+ -> Doc+-- To avoid priting parenthesis based on the left+-- associativity of all operators within the same precedence class, +-- the precedence passed to the left branch is curr instead of+-- curr+1.+--+-- However, the VHDL grammar sometimes doesn't allow it +-- e.g. "and a or b and d" is illegal. In fact,+-- you can only put two operators together without parenthesis+-- in some cases:+-- +-- * logical operators: "and", "or", "xor", "xnor", but cannot be mixed up.+-- * relational operators: none+-- * shift operators: none+-- * adding operators: all, can be mixed up+-- * multiplying operator: all, can be mixed up+-- * misc operator: none+--+-- Thus, we keep track of the enclosing+-- operator, and skip parenthesis according to left parsing associativity+-- in the cases stated above.+--+-- Note that we are only making use of syntactic associativity. e.g.+-- even if "+" is semantially associative: a+(b+c)=(a+b)+c,+-- we will only skip parenthesis in (a+b)+c++pprExprPrecInfix ac encop curr lhs op rhs = + parensIf (ac>curr || (ac == curr && not skipParenSameLevel)) $+ sep [pprExprPrec curr op lhs <+> text op, pprExprPrec (curr+1) op rhs]+ where skipParenSameLevel = curr == plusPrec || curr == multPrec ||+ (encop == op && op `elem` ["and","or","xor","xnor"])++-- | Prettyprint unary prefix operators+pprExprPrecPrefix :: Int -- ^ Accumulated precedence value (initialized to 0)+ -> Int -- ^ Precedence of current infix operator+ -> String -- ^ operator name+ -> Expr -- ^ operator argument+ -> Doc+pprExprPrecPrefix ac curr op arg = parensIf (ac>curr) $+ text op <+> pprExprPrec (curr+1) op arg+++-- | Prints an expression taking precedence and left associativity+-- in account+pprExprPrec :: Int -- ^ Accumulated precedence value (initialized to 0)+ -> String -- ^ Enclosing operator+ -> Expr -- ^ Expression curently prettyprinted + -> Doc+-- Logical operations+pprExprPrec p e (And e1 e2) = pprExprPrecInfix p e logicalPrec e1 "and" e2+pprExprPrec p e (Or e1 e2) = pprExprPrecInfix p e logicalPrec e1 "or" e2+pprExprPrec p e (Xor e1 e2) = pprExprPrecInfix p e logicalPrec e1 "xor" e2+pprExprPrec p e (Nand e1 e2) = pprExprPrecInfix p e logicalPrec e1 "nand" e2+pprExprPrec p e (Nor e1 e2) = pprExprPrecInfix p e logicalPrec e1 "nor" e2+pprExprPrec p e (Xnor e1 e2) = pprExprPrecInfix p e logicalPrec e1 "xnor" e2+-- Relational Operators+pprExprPrec p e (e1 :=: e2) = pprExprPrecInfix p e relationalPrec e1 "=" e2+pprExprPrec p e (e1 :/=: e2) = pprExprPrecInfix p e relationalPrec e1 "/=" e2+pprExprPrec p e (e1 :<: e2) = pprExprPrecInfix p e relationalPrec e1 "<" e2+pprExprPrec p e (e1 :<=: e2) = pprExprPrecInfix p e relationalPrec e1 "<=" e2+pprExprPrec p e (e1 :>: e2) = pprExprPrecInfix p e relationalPrec e1 ">" e2+pprExprPrec p e (e1 :>=: e2) = pprExprPrecInfix p e relationalPrec e1 ">=" e2+-- Shift Operators+pprExprPrec p e (Sll e1 e2) = pprExprPrecInfix p e shiftPrec e1 "sll" e2+pprExprPrec p e (Srl e1 e2) = pprExprPrecInfix p e shiftPrec e1 "srl" e2+pprExprPrec p e (Sla e1 e2) = pprExprPrecInfix p e shiftPrec e1 "sla" e2+pprExprPrec p e (Sra e1 e2) = pprExprPrecInfix p e shiftPrec e1 "sra" e2+pprExprPrec p e (Rol e1 e2) = pprExprPrecInfix p e shiftPrec e1 "rol" e2+pprExprPrec p e (Ror e1 e2) = pprExprPrecInfix p e shiftPrec e1 "ror" e2+-- Adding Operators+pprExprPrec p e (e1 :+: e2) = pprExprPrecInfix p e plusPrec e1 "+" e2+pprExprPrec p e (e1 :-: e2) = pprExprPrecInfix p e plusPrec e1 "-" e2+pprExprPrec p e (e1 :&: e2) = pprExprPrecInfix p e plusPrec e1 "&" e2+-- Sign Operators+pprExprPrec p _ (Neg e) = pprExprPrecPrefix p signPrec "-" e +pprExprPrec p _ (Pos e) = pprExprPrecPrefix p signPrec "+" e +-- Multiplying Operators+pprExprPrec p e (e1 :*: e2) = pprExprPrecInfix p e multPrec e1 "*" e2+pprExprPrec p e (e1 :/: e2) = pprExprPrecInfix p e multPrec e1 "/" e2+pprExprPrec p e (Mod e1 e2) = pprExprPrecInfix p e multPrec e1 "mod" e2+pprExprPrec p e (Rem e1 e2) = pprExprPrecInfix p e multPrec e1 "rem" e2+-- Miscellaneous Operators+pprExprPrec p e (e1 :**: e2) = pprExprPrecInfix p e miscPrec e1 "**" e2+pprExprPrec p _ (Abs e) = pprExprPrecPrefix p signPrec "abs" e +pprExprPrec p _ (Not e) = pprExprPrecPrefix p signPrec "not" e +-- Primary expressions+pprExprPrec _ _ (PrimName name) = ppr name+pprExprPrec _ _ (PrimLit lit) = text lit+pprExprPrec _ _ (PrimFCall fCall) = ppr fCall+-- Composite-type expressions+pprExprPrec _ _ (Aggregate assocs) = parens (ppr_list hComma assocs)++instance Ppr ElemAssoc where+ ppr (ElemAssoc mChoice expr) = (ppr mChoice <++> text "=>") <+> ppr expr++instance Ppr FCall where+ ppr (FCall name assocs) = + ppr name <> parensNonEmpty (commaSep assocs)+
+ src/ForSyDe/Backend/VHDL/Quartus.hs view
@@ -0,0 +1,116 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Quartus+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Functions to process the VHDL compilation results with Altera's Quartus II+-- software.+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.Quartus + (callQuartus) where++import ForSyDe.ForSyDeErr+import ForSyDe.Config (getDataDir)+import ForSyDe.OSharing (readURef)+import ForSyDe.System.SysDef (subSys,sid,unPrimSysDef)++import ForSyDe.Backend.VHDL.Traverse.VHDLM ++import System.IO+import System.Directory+import System.Process+import System.FilePath+import Control.Monad.State+import System.Exit (ExitCode(..))++++-- | Analyze the results with Quartus+-- (Note: the initial and final CWD will be /systemName/vhdl )+callQuartus :: VHDLM ()+callQuartus = do+ mQuartus <- gets (execQuartus.ops.global)+ -- is it necessary to call quartus?+ case mQuartus of+ Nothing -> return ()+ -- Yes, we create the tcl script and call quartus_sh checking if it+ -- exists in the system+ Just ops -> do+ mPath <- liftIO $ findExecutable "quartus_sh"+ case mPath of+ Nothing -> do liftIO $ hPutStrLn stderr "Error: quartus_sh not found"+ throwFError QuartusFailed+ Just _ -> do contents <- gen_quartus_tcl ops+ liftIO $ writeFile "quartus.tcl" contents+ liftIO $ putStrLn "Running quartus_sh -t quartus.tcl"+ code <- liftIO $ waitForProcess =<< runCommand + "quartus_sh -t quartus.tcl" + case code of+ ExitFailure _ -> throwFError QuartusFailed+ _ -> return ()+ +-- | Generate the content of quartus.tcl+-- Note that, even in windows, the tcl interpreter requires pathnames+-- to use \"/\" instead of \"\\\"+gen_quartus_tcl :: QuartusOps -> VHDLM String+gen_quartus_tcl (QuartusOps act mFMax mFamDev assigs) = do+ sysName <- gets (sid.globalSysDef.global)+ dataPath <- liftIO $ getDataDir+ recursive <- isRecursiveSet+ subs <- gets (subSys.globalSysDef.global)+ let libDir = (changeSlashes dataPath) ++ "/lib"+ sysLib = sysName ++ "_lib"+ return $ unlines (+ packages +++ [projectNew sysName] ++ + mDefault mFMax fmax +++ mDefault mFamDev famDev +++ map mkAssig assigs +++ [topLevelEntity sysName,+ includeVHDLFile ("work/" ++ sysName ++ ".vhd") Nothing,+ includeVHDLFile ('"' : (libDir ++ "/forsyde.vhd") ++ "\"") (Just "forsyde"),+ includeVHDLFile (sysLib ++ "/" ++ sysLib ++ ".vhd") (Just sysLib)] +++ (if recursive then+ map (\s -> includeVHDLFile + ((("work/"++).(++".vhd").sid.readURef.unPrimSysDef) s)+ Nothing) subs+ else []) +++ [actionCmd act]+ )+ where mDefault m f = maybe [] f m+ actionCmd act = case act of+ AnalysisAndElaboration -> + "execute_flow -analysis_and_elaboration"+ AnalysisAndSynthesis ->+ "execute_module -tool map"+ FullCompilation ->+ "execute_flow -compile"+ fmax max = ["set_global_assignment -name FMAX_REQUIREMENT \"" ++ + show max ++ " MHz\""]+ famDev (fam, mDev) = + ["set_global_assignment -name FAMILY " ++ show fam] +++ case mDev of+ Nothing -> []+ Just dev -> ["set_global_assignment -name DEVICE " ++ show dev]+ mkAssig (vhdlPin, fpgaPin) = "set_location_assignment " ++ + fpgaPin ++ " -to " ++ vhdlPin+ packages = ["load_package project", "load_package flow"]+ includeVHDLFile :: FilePath -- ^ system name+ -> Maybe String -- ^ what library to include the + -- file in+ -> String+ includeVHDLFile file mLib = + "set_global_assignment -name VHDL_FILE " ++ file +++ maybe "" (" -library "++) mLib+ topLevelEntity name = + "set_global_assignment -name TOP_LEVEL_ENTITY " ++ name+ projectNew name = "project_new " ++ name ++ " -overwrite" + changeSlashes [] = []+ changeSlashes ('\\':xs) = '/' : changeSlashes xs+ changeSlashes (x:xs) = x : changeSlashes xs +
+ src/ForSyDe/Backend/VHDL/TestBench.hs view
@@ -0,0 +1,220 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.TestBench+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Functions used to generate a VHDL test bech.+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.TestBench + (writeVHDLTestBench,+ parseTestBenchOut) where+++import ForSyDe.Backend.VHDL.Constants+import ForSyDe.Backend.VHDL.AST+import ForSyDe.Backend.VHDL.Translate+import ForSyDe.Backend.VHDL.Traverse.VHDLM+import ForSyDe.Backend.VHDL.Generate+import ForSyDe.Backend.VHDL.FileIO++import ForSyDe.Ids+import ForSyDe.System.SysDef++import qualified Language.Haskell.TH as TH (Exp)+import Control.Monad.State+import Data.List (transpose)+import System.Directory+import System.FilePath+++-- | Parse the output of the testbench (a tab separated files)+-- into strings denoting the individual output signals+parseTestBenchOut :: String -- ^ String containing the complete output file+ -> VHDLM [[String]] -- ^ output signal values in form + -- of strings+parseTestBenchOut str = do+ outN <- gets (length.oIface.globalSysDef.global)+ case tabSeparatedRows of+ [] -> return (replicate outN [])+ _ -> return $ transpose tabSeparatedRows+ where tabSeparatedRows = ((map (unintersperse '\t')).lines) str + unintersperse _ [] = [] + unintersperse e (c:cs) + -- the null check makes unintersperse imposible to define with foldr+ -- or unfoldr+ | c == e = if null cs then [[],[]] + else [] : unintersperse e cs+ | otherwise = let rest = unintersperse e cs in+ case rest of+ [] -> [[c]]+ (a:as) -> (c:a):as++-- | write a test bench, using a clock cycle of 10 ns+-- (Note: the initial and final CWD will be / )+writeVHDLTestBench :: Maybe Int -- ^ Number of cycles to simulate+ -- if 'Nothing' the number will be determined+ -- by the length of the input stimulti.+ -- Useful when the system to simulate doesn't+ -- have inputs or the inputs provided are + -- infinite+ -> [[TH.Exp]] -- ^ Input stimuli (one list per signal)+ -> VHDLM Int -- ^ Number of cycles simulated+writeVHDLTestBench mCycles stimuli = do+ sys <- gets (globalSysDef.global)+ let sysId = sid sys+ cxt = genVHDLTestBenchContext sysId+ ent = genVHDLTestBenchEntity sysId+ (arch, cycles) <- genVHDLTestBenchArch mCycles stimuli+ let design = DesignFile cxt [LUEntity ent, LUArch arch]+ tbdir = sysId </> "vhdl" </> "test"+ tbpath = tbdir </> (sysId ++ "_tb.vhd")+ liftIO $ createDirectoryIfMissing True tbdir+ liftIO $ writeDesignFile design tbpath+ return cycles++-- | Generate the Context Clause+genVHDLTestBenchContext :: SysId -- ^ Main system Id+ -> [ContextItem]+genVHDLTestBenchContext id = commonContextClause +++ [Library libId,+ Use $ NSelected (NSimple libId :.: SSimple typesId) :.: All,+ Use $ NSelected (NSimple stdId :.: SSimple textioId) :.: All]+ where libId = unsafeVHDLBasicId (id ++ "_lib")+ +-- | Generates an empty entity fot the testbench+genVHDLTestBenchEntity :: SysId -- ^ Main system Id + -> EntityDec+genVHDLTestBenchEntity id = EntityDec (unsafeVHDLBasicId (id ++ "_tb")) []++--------------------------+-- Test Bench Architecture+--------------------------+++-- | generate the architecture+genVHDLTestBenchArch :: Maybe Int -- ^ Maximum number of cycles+ -> [[TH.Exp]] -- ^ Input stimuli + -> VHDLM (ArchBody, Int) -- ^ Number of cycles simulated+genVHDLTestBenchArch mCycles stimuli = do+ sys <- gets (globalSysDef.global)+ let sysId = sid sys+ iface = iIface sys+ oface = oIface sys+ l = logic sys+ iIds = map fst iface+ iVHDLIds = map unsafeVHDLExtId iIds+ oIds = map fst oface+ -- Get the signal declarations for the input signals+ iDecs <- mapM + (\(pId, t) -> transVHDLName2SigDec (unsafeVHDLExtId pId) t Nothing) iface+ let finalIDecs = iDecs ++ + [SigDec clockId std_logicTM (Just $ PrimLit "'0'"),+ SigDec resetId std_logicTM (Just $ PrimLit "'0'")]+ -- Get the component instantiation and the signal declarations for the output+ -- signals+ (mIns, outDecs) <- + transSysIns2CompIns l+ (unsafeVHDLBasicId "totest") + iVHDLIds + (map (\(id, t) -> (unsafeVHDLExtId id,t)) oface)+ sysId+ iIds+ oIds+ -- Generate the signal assignments+ (stimuliAssigns, cycles) <- genStimuliAssigns mCycles stimuli iVHDLIds+ -- Add an assignment to turn off the reset signal after 3 ns+ -- (everything lower than 5 ns should work)+ let finalAssigns = + (NSimple resetId :<==: + ConWforms [] + (Wform [WformElem (PrimLit "'1'") (Just $ PrimLit "3 ns")])+ Nothing) : stimuliAssigns+ -- Get the two processes (clock and output)+ clkProc = genClkProc+ outputProc = genOutputProc (map unsafeVHDLExtId oIds)+ -- return the architecture+ return $ (ArchBody + (unsafeVHDLBasicId "test") + (NSimple $ unsafeVHDLBasicId (sysId ++ "_tb"))+ (map BDISD (finalIDecs ++ outDecs))+ ( maybe [] (\s -> [CSISm s]) mIns ++ + ( (CSPSm clkProc) : (CSPSm outputProc) : (map CSSASm finalAssigns) ) ),+ cycles)++-- | generate the assignments for the input stimuli+genStimuliAssigns :: Maybe Int -- ^ Maximum number of cycles+ -> [[TH.Exp]] -- ^ Input stimuli + -> [VHDLId] -- ^ Input signal ids+ -> VHDLM ([ConSigAssignSm], Int) -- ^ (Assignments,+ -- number of cycles + -- simulated)+-- if the number of input signas is zero+genStimuliAssigns mCycles [] _ = return ([], maybe 0 id mCycles)++-- if the nu,ber of input signals is /= zero+genStimuliAssigns mCycles stimuli signals = do+ let genWformElem time thExp = + do vExp <- transExp2VHDL thExp+ return (WformElem vExp (Just $ PrimLit (show time ++ " ns")))+ wformElems <- mapM (zipWithM genWformElem ([0,10..] :: [Int])) stimuli+ let (normWformElems, cycles) = normalize maxCycles wformElems+ if cycles == 0 + then return ([],0)+ else return + (zipWith + (\s elems -> NSimple s :<==: ConWforms [] (Wform elems) Nothing)+ signals + normWformElems,+ cycles)+ where maxCycles = maybe (-1) id mCycles + -- FIXME: this is not efficient at all+ -- Normalize a matrix. Make sure that all the rows in a matrix have the+ -- same length, setting a maximum row length (0 establishes no limit)+ normalize :: Int -- ^ maximum row-length to process + -> [[a]] -- ^ input matrix+ -> ([[a]], Int) -- ^ (output matrix, maximum row length)+ normalize max xss+ | any null xss || max == 0 = (replicate l [], 0)+ | otherwise = let (transres, acum) = normalize' max (transpose xss)+ in (transpose transres, acum)+ where l = length xss+ normalize' max (xs:xss)+ | length xs == l && max /= 0 =+ let (nextlist, nextacum) = normalize' (max-1) xss+ in (xs : nextlist, nextacum+1)+ normalize' _ _ = ([], 0)++-- | generates a clock process with a period of 10ns+genClkProc :: ProcSm+genClkProc = ProcSm (unsafeVHDLBasicId "clkproc") [] sms+ where sms = -- wait for 5 ns -- (half a cycle)+ [WaitFor $ PrimLit "5 ns",+ -- clk <= not clk;+ NSimple clockId `SigAssign` + Wform [WformElem (Not (PrimName $ NSimple clockId)) Nothing]]++-- | generate the output process+genOutputProc :: [VHDLId] -- ^ output signals+ -> ProcSm +genOutputProc outs = + ProcSm (unsafeVHDLBasicId "writeoutput") + [clockId]+ [IfSm clkPred (writeOuts outs) [] Nothing]+ where clkPred = PrimName (NAttribute $ AttribName (NSimple clockId) + eventId+ Nothing ) `And` + (PrimName (NSimple clockId) :=: PrimLit "'1'")+ writeOuts [] = []+ writeOuts [i] = [writeOut i (PrimLit "LF")]+ writeOuts (i:is) = writeOut i (PrimLit "HT") : writeOuts is+ writeOut outSig suffix = + genExprProcCall2 writeId + (PrimName $ NSimple outputId)+ (genExprFCall1 showId (PrimName $ NSimple outSig) :&: + suffix)
+ src/ForSyDe/Backend/VHDL/Translate.hs view
@@ -0,0 +1,827 @@+{-# LANGUAGE TemplateHaskell, TypeOperators #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Traverse+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Functions to translate elements of the intermediate system +-- representation to elements of the VHDL AST.+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.Translate where++import ForSyDe.Backend.VHDL.AST+import qualified ForSyDe.Backend.VHDL.AST as VHDL+import ForSyDe.Backend.VHDL.Constants+import ForSyDe.Backend.VHDL.Generate+import ForSyDe.Backend.VHDL.Traverse.VHDLM++import ForSyDe.Ids+import ForSyDe.AbsentExt+import ForSyDe.Signal+import ForSyDe.Bit hiding (not)+import qualified ForSyDe.Bit as B+import ForSyDe.ForSyDeErr+import ForSyDe.System.SysDef+import ForSyDe.Process.ProcFun+import ForSyDe.Process.ProcVal+import ForSyDe.Process.ProcType++import Data.Typeable.TypeRepLib (unArrowT)++import Data.Int+import Data.Char (digitToInt)+import Data.List (intersperse)+import Data.Maybe (isJust, fromJust)+import Control.Monad.State+import qualified Data.Set as S+import qualified Language.Haskell.TH as TH+import Language.Haskell.TH hiding (global)+import qualified Data.Traversable as DT+import Data.Typeable+import qualified Data.Param.FSVec as V+import Text.Regex.Posix ((=~))++import Data.TypeLevel.Num.Reps++-- | Translate a System Definition to an Entity, explicitly returning+-- the VHDL identifiers of its output signals.+transSysDef2Ent :: SysLogic -- ^ logic of the system + -> SysDefVal -- ^ system to translate + -> VHDLM EntityDec+transSysDef2Ent logic sysDefVal = do+ entId <- transSysId2VHDL (sid sysDefVal)+ inDecs <- mapM (uncurry $ transPort2IfaceSigDec In) (iIface sysDefVal) + outDecs <- mapM (uncurry $ transPort2IfaceSigDec Out) (oIface sysDefVal)+ -- clock and reset implicit declarations+ let implicitDecs = if logic == Sequential then + [IfaceSigDec resetId In std_logicTM, + IfaceSigDec clockId In std_logicTM]+ else []+ return $ EntityDec entId (implicitDecs ++ inDecs ++ outDecs) + +-- | Translate a 'ZipwithNSY' process to a block returning a declaration of+-- the resulting signal.+transZipWithN2Block :: Label -- ^ process identifier+ -> [VHDLId] -- ^ input signals+ -> Loc -- ^ location of the inner function+ -> TypedProcFunAST -- ^ AST of the inner function+ -> VHDLId -- ^ output signal+ -> VHDLM (BlockSm, SigDec)+transZipWithN2Block vPid ins loc ast out = do+ -- Translate the process function+ (f,fName , inFPars, inFTypes, retFType) <- + withProcFunC ((name.tpast) ast) loc $ transProcFun2VHDL ast + -- Generate the formal parameters of the block+ let inPars = map (\n -> unsafeIdAppend vPid ("_in" ++ show n)) [1..length ins]+ outPar = unsafeIdAppend vPid "_out"+ -- Generate the port interface of the block + inDecs = zipWith (\par typ -> IfaceSigDec par In typ) inPars inFTypes+ outDec = IfaceSigDec outPar Out retFType+ iface = inDecs ++ [outDec]+ -- Generate the port map+ pMap = genPMap (inPars ++ [outPar]) (ins ++ [out])+ -- Generate the function call and signal assignment+ outAssign = genFCallAssign out fName inFPars ins+ return (BlockSm vPid iface pMap [BDISPB f] [CSSASm outAssign],+ SigDec out retFType Nothing)++ +-- | Translate a 'ZipwithxSY' process to a block returning a declaration of+-- the resulting signal.+transZipWithx2Block :: Label -- ^ process identifier+ -> [VHDLId] -- ^ input signals+ -> Loc -- ^ location of the inner function+ -> TypedProcFunAST -- ^ AST of the inner function+ -> VHDLId -- ^ output signal+ -> VHDLM (BlockSm, SigDec)+transZipWithx2Block vPid ins loc ast out = do+ -- Translate the process function+ (f, fName, [inFPar], [inFType], retFType) <- + withProcFunC ((name.tpast) ast) loc $ transProcFun2VHDL ast+ -- Figure out the type of the inputs from the + -- function's input vector type (horrible hack, but it works)+ let [[_,suffix]] = (fromVHDLId inFType) =~ "^fsvec_[0-9]*_(.*)$" + inType = unsafeVHDLBasicId $ suffix+ -- Generate the formal parameters of the block+ inPars = map (\n -> unsafeIdAppend vPid ("_in" ++ show n)) [1..length ins]+ outPar = unsafeIdAppend vPid "_out"+ -- Generate the port interface of the block + inDecs = map (\par -> IfaceSigDec par In inType) inPars+ outDec = IfaceSigDec outPar Out retFType+ iface = inDecs ++ [outDec]+ -- Generate the port map+ pMap = genPMap (inPars ++ [outPar]) (ins ++ [out])+ -- Generate the function call and signal assignment+ aggregate = Aggregate $+ map (\e -> ElemAssoc Nothing (PrimName(NSimple e))) inPars + fCall = PrimFCall $ FCall (NSimple fName) + [Just inFPar :=>: ADExpr aggregate]+ outAssign = genExprAssign outPar fCall+ return (BlockSm vPid iface pMap [BDISPB f] [CSSASm outAssign],+ SigDec out retFType Nothing)+ +-- | Translate a 'UnzipNSY' process to a block returning a declaration of+-- the resulting signal.+transUnzipNSY2Block :: Label -- ^ process identifier+ -> VHDLId -- ^ input signal+ -> [VHDLId] -- ^ output signals+ -> [TypeRep] -- ^ output signal types+ -> VHDLM (BlockSm, [SigDec])+transUnzipNSY2Block vPid inSig outSigs outTRTypes = do+ -- Generate the formal parameters of the block+ let inPar = unsafeIdAppend vPid "_in"+ outPars = map (\n -> unsafeIdAppend vPid ("_out" ++ show n)) + [1..length outSigs]+ -- Generate the port interface of the block+ nOuts = length outSigs+ tupTyCon = mkTyCon $ replicate (nOuts-1) ','+ inTRType = tupTyCon `mkTyConApp` outTRTypes + outTMTypes <- mapM transTR2TM outTRTypes+ inTMType <- transTR2TM inTRType+ let inDec = IfaceSigDec inPar In inTMType+ outDecs = zipWith (\par typ -> IfaceSigDec par Out typ) outPars outTMTypes+ iface = inDec : outDecs+ -- Generate the port map+ pMap = genPMap (inPar : outPars) (inSig : outSigs)+ -- Generate the signal assignments+ genOrigExp n = (PrimName $ NSelected + (NSimple inPar :.: tupVHDLSuffix n))+ genOutAssign outSig n = CSSASm $ genExprAssign outSig (genOrigExp n)+ outAssigns = zipWith genOutAssign outPars [(1::Int)..] + return (BlockSm vPid iface pMap [] outAssigns,+ zipWith (\sig typ -> SigDec sig typ Nothing) outSigs outTMTypes)++++-- | Translate a 'UnzipxSY' process to a block returning a declaration of+-- the resulting signal.+transUnzipxSY2Block :: Label -- ^ process identifier+ -> VHDLId -- ^ input signal+ -> [VHDLId] -- ^ output signals+ -> TypeRep -- ^ type of vector elements+ -> Int -- ^ vector Size+ -> VHDLM (BlockSm, [SigDec])+transUnzipxSY2Block vPid inSig outSigs elemTR vSize = do + -- Generate the formal parameters of the block+ let inPar = unsafeIdAppend vPid "_in"+ outPars = map (\n -> unsafeIdAppend vPid ("_out" ++ show n)) + [1..length outSigs]+ -- Generate the port interface of the block+ inTRType = fSVecTyCon `mkTyConApp` [transInt2TLNat vSize, elemTR] + inTMType <- transTR2TM inTRType+ elemTM <- transTR2TM elemTR+ let inDec = IfaceSigDec inPar In inTMType+ outDecs = map (\par -> IfaceSigDec par Out elemTM) outPars + iface = inDec : outDecs+ -- Generate the port map+ pMap = genPMap (inPar : outPars) (inSig : outSigs)+ -- Generate the signal assignments+ genOrigExp n = + PrimName $ NIndexed (NSimple inPar `IndexedName` [PrimLit $ show n])+ genOutAssign outSig n = CSSASm $ genExprAssign outSig (genOrigExp n)+ outAssigns = zipWith genOutAssign outPars [(0::Int)..] + return (BlockSm vPid iface pMap [] outAssigns,+ map (\sig -> SigDec sig elemTM Nothing) outSigs)+++++-- | Translate a 'DelaySY' process to a block returning a declaration of+-- the resulting signal.+transDelay2Block :: Label -- ^ process identifier+ -> VHDLId -- ^ input signal+ -> ProcValAST -- ^ AST of the initial value + -- of the delay process+ -> VHDLId -- ^ output signal+ -> VHDLM (BlockSm, SigDec)+transDelay2Block vPid inS (ProcValAST exp tr enums) outS = do+ -- Add the enumerated types associated with the value to the global results+ addEnumTypes enums+ -- Get the type of the initial value+ initTR <- transTR2TM tr+ -- Translate the initial value+ initExp <- withProcValC exp $ withInitTransNameSpace $ (transExp2VHDL exp)+ -- Build the block+ let formalIn = unsafeIdAppend vPid "_in"+ formalOut = unsafeIdAppend vPid "_out"+ iface = [IfaceSigDec resetId In std_logicTM,+ IfaceSigDec clockId In std_logicTM, + IfaceSigDec formalIn In initTR,+ IfaceSigDec formalOut Out initTR] + assocs = [Just resetId :=>: ADName (NSimple resetId),+ Just clockId :=>: ADName (NSimple clockId),+ Just formalIn :=>: ADName (NSimple inS),+ Just formalOut :=>: ADName (NSimple outS)]+ sigAssign = CSSASm (NSimple formalOut :<==: + (ConWforms [whenElseReset] inWform (Just whenRE)))+ whenElseReset = WhenElse (Wform [WformElem initExp Nothing])+ (PrimName (NSimple resetId) :=: PrimLit "'0'")+ inWform = Wform [WformElem (PrimName $ NSimple formalIn) Nothing]+ whenRE = When (PrimFCall $ FCall (NSimple $ unsafeVHDLBasicId "rising_edge") + [Nothing :=>: ADName (NSimple clockId) ])+ return (BlockSm vPid iface (PMapAspect assocs) [] [sigAssign],+ SigDec outS initTR Nothing)++-- | Translate a System instance into a VHDL component instantion+-- returning the declartion of the output signals+transSysIns2CompIns :: SysLogic -- ^ parent system logic+ -> Label -- ^ instance identifier+ -> [VHDLId] -- ^ input signals+ -> [(VHDLId, TypeRep)] -- ^ output signals+ -> SysId -- ^ parent system identifier+ -> [PortId] -- ^ parent input identifiers+ -> [PortId] -- ^ parent output identifiers+ -> VHDLM (Maybe CompInsSm, [SigDec])+transSysIns2CompIns logic vPid ins typedOuts parentId parentInIds parentOutIds = do+ if length ins == 0 && length typedOuts == 0 + then return (Nothing, []) + else do+ -- Create the declarations for the signals+ decs <- mapM (\(name,typ) -> transVHDLName2SigDec name typ Nothing) typedOuts+ -- Create the portmap + vParentId <- transSysId2VHDL parentId+ vParentInIds <- liftEProne $ mapM mkVHDLExtId parentInIds+ vParentOutIds <- liftEProne $ mapM mkVHDLExtId parentOutIds+ let implicitAssocIds = if logic == Sequential then [resetId, clockId] else []+ assocs = genAssocElems + (implicitAssocIds ++ vParentInIds ++ vParentOutIds)+ (implicitAssocIds ++ ins ++ map fst typedOuts)+ entityName = NSelected (NSimple workId :.: SSimple vParentId)+ instantiation = CompInsSm vPid (IUEntity entityName) (PMapAspect assocs)+ return (Just instantiation, decs)+++-- | Translate a VHDL Signal to a VHDL Signal declaration+transVHDLName2SigDec :: SimpleName -- ^ Signal name + -> TypeRep -- ^ Type of the intermediate signal + -> Maybe TH.Exp -- ^ Maybe an initializer expression for the signal+ -> VHDLM SigDec+transVHDLName2SigDec vId tr mExp = do+ tm <- transTR2TM tr+ mVExp <- DT.mapM (\e -> withInitTransNameSpace (transExp2VHDL e)) mExp+ return $ SigDec vId tm mVExp++++-------------------------+-- Identifier translation+-------------------------+++-- | Translate a VHDL identifier and a type to an interface signal declaration+transVHDLId2IfaceSigDec :: Mode -> VHDLId -> TypeRep -> VHDLM IfaceSigDec+transVHDLId2IfaceSigDec m vid trep = do + tm <- transTR2TM trep+ return $ IfaceSigDec vid m tm+ + +-- | Translate a Port to a VHDL Interface signal declaration+transPort2IfaceSigDec :: Mode -> PortId -> TypeRep -> VHDLM IfaceSigDec+transPort2IfaceSigDec m pid trep = do + sid <- transPortId2VHDL pid+ transVHDLId2IfaceSigDec m sid trep++-- | Translate a local TH name to a VHDL Identifier+transTHName2VHDL :: TH.Name -> VHDLM VHDLId +transTHName2VHDL = transPortId2VHDL . nameBase ++-- | Translate a system identifier to a VHDL identifier+transSysId2VHDL :: SysId -> VHDLM VHDLId+transSysId2VHDL = transPortId2VHDL++-- | Translate a process identifier to a VHDL identifier+transProcId2VHDL :: ProcId -> VHDLM VHDLId+transProcId2VHDL = transPortId2VHDL++-- | translate a port identifier to a VHDL Identifier+transPortId2VHDL :: PortId -> VHDLM VHDLId+transPortId2VHDL str = liftEProne $ mkVHDLExtId str+++-------------------+-- Type translation +-------------------++-- | translate a 'TypeRep' to a VHDL 'TypeMark'+-- We don't distinguish between a type and its version nested in 'Signal'+-- since it makes no difference in VHDL+transTR2TM :: TypeRep -> VHDLM TypeMark+transTR2TM rep + -- Is it a Signal?+ | isSignal = transTR2TM nestedTR+ -- Is it a primitive type?+ | isJust mPrimitiveTM = return $ fromJust mPrimitiveTM+ -- Non-Primitive type, try to translate it+ | otherwise = customTR2TM rep+ where (isSignal, nestedTR) = let (tc,~[tr]) = splitTyConApp rep+ in (tc == signalTyCon, tr)+ signalTyCon = (typeRepTyCon.typeOf) (undefined :: Signal ())+ mPrimitiveTM = lookup rep primTypeTable +++-- | Translate a custom 'TypeRep' to a VHDL 'TypeMark'+customTR2TM :: TypeRep -> VHDLM TypeMark+customTR2TM rep = do+ -- Check if it was previously translated+ mTranslated <- lookupCustomType rep+ case mTranslated of+ -- Not translated previously+ Nothing -> do+ -- translate it+ e <- doCustomTR2TM rep+ -- update the translation table and the accumulated type declarations+ addCustomType rep e+ -- return the translation+ case e of+ Left (TypeDec id _) -> return id+ Right (SubtypeDec id _) -> return id+ -- Translated previously+ Just tm -> return tm+ +-- | Really do the translation (customTR2TM deals with caching)+doCustomTR2TM :: TypeRep -> VHDLM (Either TypeDec SubtypeDec)++-- | FSVec?+-- FSVecs are translated to subtypes of unconstrained vectors.+-- All FSVec operations are translated as operations for the+-- unconstrained type.+doCustomTR2TM rep | isFSVec = do+ -- Translate the type of the elements contained in the vector+ valTM <- transTR2TM valueType+ -- Build the unconstrained vector identifier+ let vectorId = unsafeVHDLBasicId ("fsvec_"++ fromVHDLId valTM)+ -- Obtain the unconstrained vector together with its functions and add them+ -- to the global traversing-results (if this wasn't previously done):+ -- * Check if the unconstrained array was previously translated+ vecs <- gets (transUnconsFSVecs.global)+ -- * if it wasn't ...+ when (not $ elem valueType vecs) $ do+ -- create the unconstrained vector type and add it to the global+ -- results. _Only_ if we are not working with "FSVec _ Bit" becuase+ -- "type fsvec_std_logic" is already included in forsyde.vhd.+ when (valueType /= typeOf (undefined :: Bit))+ (addTypeDec $ TypeDec vectorId (TDA (UnconsArrayDef [fsvec_indexTM] valTM)))+ -- Add the default functions for the unconstrained+ -- vector type to the global results+ let funs = genUnconsVectorFuns valTM vectorId+ mapM_ addSubProgBody funs+ -- Mark the unconstrained array as translated+ addUnconsFSVec valueType++ -- Create the vector subtype identifier+ let subvectorId = unsafeVHDLBasicId ("fsvec_" ++ show size ++ "_" +++ fromVHDLId valTM)+ -- Create the vector subtype declaration+ return $ Right $ + SubtypeDec subvectorId (SubtypeIn vectorId + (Just $ IndexConstraint [ToRange (PrimLit "0")+ (PrimLit (show $ size-1))]))+ where (cons, ~[sizeType,valueType]) = splitTyConApp rep+ isFSVec = cons == fSVecTyCon+ size = transTLNat2Int sizeType+++-- | Tuple?+doCustomTR2TM rep | isTuple = do+ -- Create the elements of the record+ fieldTMs <- mapM transTR2TM args+ let elems = zipWith (\fieldId fieldTM -> ElementDec fieldId fieldTM )+ [tupVHDLIdSuffix n | n <- [1..]] fieldTMs + -- Create the Type Declaration identifier+ recordId = unsafeVHDLBasicId $ + (tupStrSuffix $ length fieldTMs) ++ "_" ++ + (concatMap fromVHDLId.intersperse (unsafeVHDLBasicId "_")) fieldTMs+ -- Add the default functions for the tuple type to the global results+ funs = genTupleFuns fieldTMs recordId+ mapM_ addSubProgBody funs+ -- Create the record+ return $ Left $ (TypeDec recordId (TDR $ RecordTypeDef elems))+ where (cons, args) = splitTyConApp rep+ conStr = tyConString cons+ isTuple = all (==',') conStr+ ++-- | AbstExt?+doCustomTR2TM rep | isAbsExt = do+ -- Create the elements of the record+ valueTM <- transTR2TM valueTR+ let elems = [ElementDec isPresentId booleanTM,+ ElementDec valueId valueTM ]+ + -- Create the Type Declaration identifier+ recordId = unsafeVHDLBasicId $ + "abs_ext_" ++ fromVHDLId valueTM+ -- Add the default functions for the vector type to the global results+ funs = genAbstExtFuns valueTM recordId+ mapM_ addSubProgBody funs+ -- Return the resulting the record+ return $ Left $ (TypeDec recordId (TDR $ RecordTypeDef elems))+ where (cons, ~[valueTR]) = splitTyConApp rep+ absExtTyCon = (typeRepTyCon.typeOf) (undefined :: AbstExt ())+ isAbsExt = cons == absExtTyCon ++-- | Finally, it is an Enumerated algebraic type +-- or an unkown custom type (in that case we throw an error)+--+-- NOTE: It would be cleaner to have a different clauses for each case but+-- since we need to access the state to check if it's an enumerated +-- algebraic type, we cannot do it.+doCustomTR2TM rep = do+ -- Get the accumulated Enumerated Algebraic Types+ eTys <- gets (enumTypes.global)+ -- Check if current Type representation can be found in eTys+ let equalsRep (EnumAlgTy name _) = name == (tyConString.typeRepTyCon) rep + case (S.toList.(S.filter equalsRep)) eTys of+ -- Found!+ [enumDef] -> liftM Left $ enumAlg2TypeDec enumDef + -- Not found, unkown custom type+ _ -> throwFError $ UnsupportedType rep++-- | Transform an enumerated Algebraic type to a VHDL+-- TypeMark adding its default function to the global results+enumAlg2TypeDec :: EnumAlgTy -- ^ Enumerated type definition+ -> VHDLM TypeDec+enumAlg2TypeDec (EnumAlgTy tn cons) = do+ -- Get the TypeMark+ tMark <- liftEProne $ mkVHDLExtId tn+ -- Get the enumeration literals+ enumLits@(firstLit:_) <- liftEProne $ mapM mkVHDLExtId cons+ -- Add the default functions for the enumeration type+ let funs = genEnumAlgFuns tMark firstLit+ mapM_ addSubProgBody funs+ -- Create the enumeration type+ return (TypeDec tMark (TDE $ EnumTypeDef enumLits))+ +-- | Translation table for primitive types+primTypeTable :: [(TypeRep, TypeMark)]+primTypeTable = [-- Commented out due to representation overflow+ -- (typeOf (undefined :: Int64), int64TM) ,+ (typeOf (undefined :: Int32), int32TM) ,+ (typeOf (undefined :: Int16), int16TM) ,+ (typeOf (undefined :: Int8) , int8TM) ,+ (typeOf (undefined :: Bool) , booleanTM) ,+ (typeOf (undefined :: Bit) , std_logicTM)]++---------------------------------------+-- Translating functions and expresions+---------------------------------------++------------------------+-- Translating functions+------------------------+++-- | Throw a function error+funErr :: VHDLFunErr -> VHDLM a+funErr err = throwFError $ UntranslatableVHDLFun err++-- | Translate a typed function ast to VHDL+transProcFun2VHDL :: TypedProcFunAST -- ^ input ast+ -> VHDLM (SubProgBody, VHDLId, [VHDLId], [TypeMark], TypeMark)+ -- ^ Function, Function name, name of inputs, type of inputs, return type +transProcFun2VHDL (TypedProcFunAST fType fEnums fAST) = do+ -- Add the enumerated types associated with the function to the global results+ addEnumTypes fEnums+ -- Check if the procFunAST fullfils the restrictions of the VHDL Backend+ -- FIXME: translate the default arguments+ (fName, fInputPats, fBodyExp) <- checkProcFunAST fAST+ -- Get the function spec and initialize the translation namespace+ (fSpec, fVHDLName, fVHDLPars, argsTM, retTM) <- + transProcFunSpec fName fType fInputPats+ -- Translate the function's body+ bodySm <- transFunBodyExp2VHDL fBodyExp+ let fBody = SubProgBody fSpec [] [bodySm]+ return (fBody, fVHDLName, fVHDLPars, argsTM, retTM)+++-- | Check if a process function AST fulfils the VHDL backend restrictions.+-- It returs the function TH-name its input paterns and its body expression. +checkProcFunAST :: ProcFunAST+ -> VHDLM (Name, [Pat], Exp)+-- FIXME: translate the default arguments!+checkProcFunAST (ProcFunAST thName [Clause pats (NormalB exp) []] []) =+ return (thName, pats, exp)+checkProcFunAST (ProcFunAST _ _ (_:_)) =+ intError "ForSyDe.Backend.VHDL.Translate.checkProcFunSpec" + (UntranslatableVHDLFun $ GeneralErr (Other "default parameters are not yet supported"))+checkProcFunAST (ProcFunAST _ [Clause _ _ whereConstruct@(_:_)] _) = + funErr (FunWhereConstruct whereConstruct)+checkProcFunAST (ProcFunAST _ [Clause _ bdy@(GuardedB _) _] _) = + funErr (FunGuardedBody bdy)+checkProcFunAST (ProcFunAST _ clauses@(_:_:_) _) = + funErr (MultipleClauses clauses)+-- cannot happen+checkProcFunAST (ProcFunAST _ [] _) = + -- FIXME, use a custom error+ intError "ForSyDe.Backend.VHDL.Translate.checkProcFunSpec" + (UntranslatableVHDLFun $ GeneralErr (Other "inconsistentency"))++++-- | Get the spec of a VHDL function from the Haskell function name, its type +-- and its input patterns. This function also takes care of initalizing the +-- translation namespace.+transProcFunSpec :: TH.Name -- ^ Function name+ -> TypeRep -- ^ Function type+ -> [Pat] -- ^ input patterns + -> VHDLM (SubProgSpec, VHDLId, [VHDLId], [TypeMark], TypeMark)+-- ^ translated function spec, function name, inpt parameters, input types+-- and return types+transProcFunSpec fName fType fPats = do+ -- FIXME: translate the default arguments!+ -- Get the input and output types+ let (argsTR, retTR) = unArrowT fType+ -- Check that the number of patterns equal the function parameter number+ expectedN = length argsTR+ actualN = length fPats+ when (expectedN /= actualN) (funErr $ InsParamNum actualN)+ -- Get a VHDL identifier for each input pattern and+ -- initialize the translation namespace+ fVHDLParIds <- mapM transInputPat2VHDLId fPats + -- Translate the function name+ fVHDLName <- transTHName2VHDL fName + -- Translate the types+ argsTM <- mapM transTR2TM argsTR+ retTM <- transTR2TM retTR+ -- Create the spec+ let iface = zipWith (\name typ -> IfaceVarDec name typ) fVHDLParIds argsTM+ fSpec = Function fVHDLName iface retTM+ -- Finally, return the results+ return (fSpec, fVHDLName, fVHDLParIds, argsTM, retTM)+ +-- | Translate an input pattern to a VHDLID, +-- making the necessary changes in the translation namespace+transInputPat2VHDLId :: TH.Pat -> VHDLM VHDLId+transInputPat2VHDLId pat = do+ -- Get the parameter identifier+ id <- case pat of+ -- if we get a variable or and @ patterm, we just translate it to VHDL+ VarP name -> transTHName2VHDL name+ AsP name _ -> transTHName2VHDL name+ -- otherwise, generate a fresh identifier+ _ -> genFreshVHDLId++ -- Prepare the namespace for the pattern+ preparePatNameSpace (NSimple id) pat+ -- Finally return the generated id+ return id +++-- | prepare the translation namespace for an input pattern+preparePatNameSpace :: Prefix -- ^ name prefix obtained so far + -> Pat -- ^ pattern + -> VHDLM ()+-- NOTE: a good alternative to adding selected names to the+-- translation table would be declaring a variable+-- assignment. It would probably make the generated code more+-- readable but at the same time, it requires knowing the+-- pattern type, and TH's AST is unfortunately not+-- type-annotated which would make things more difficult.++-- variable pattern+preparePatNameSpace prefix (VarP name) = + addTransNamePair name 0 (\[] -> PrimName prefix)++-- '@' pattern +preparePatNameSpace prefix (AsP name pat) = do+ addTransNamePair name 0 (\[] -> PrimName prefix)+ preparePatNameSpace prefix pat++-- wildcard pattern+preparePatNameSpace _ WildP = return () ++-- tuple pattern +preparePatNameSpace prefix (TupP pats) = do+ let prepTup n pat = preparePatNameSpace + (NSelected (prefix :.: tupVHDLSuffix n)) pat+ zipWithM_ prepTup [1..] pats++-- AbstExt patterns++-- Since we only support one clause per function+-- they are not really useful, but we accept them anyways +-- FIXME: true, they are not useful, but again, since we only support one+-- clause per function they denote a programming error. Should they+-- really be supported?+preparePatNameSpace prefix (ConP name ~[pat]) | isAbstExt name = + when isPrst (preparePatNameSpace (NSelected (prefix :.: valueSuffix)) pat) + where isAbstExt name = isPrst || name == 'Abst+ isPrst = name == 'Prst++-- Unary Constructor patterns+-- We try an enumerated type patterns +-- otherwise we throw an unknown constructor pattern error+preparePatNameSpace _ pat@(ConP name []) = do+ mId <- getEnumConsId name+ case mId of + -- it is an enumerated data constructor, however, since we only admit+ -- one clause per function there is nothing to do about it+ Just _ -> return ()+ -- it is an unknown data constructor+ Nothing -> funErr $ UnsupportedFunPat pat++-- otherwise the pattern is not supported+preparePatNameSpace _ pat = funErr $ UnsupportedFunPat pat++++--------------------------+-- Translating expressions+--------------------------++-- | Throw an expression error+expErr :: Exp -> VHDLExpErr -> VHDLM a+expErr exp err = throwFError $ UntranslatableVHDLExp exp err+++-- | Create the unique statement of a VHDL from a TH expression.+transFunBodyExp2VHDL :: TH.Exp -> VHDLM SeqSm+transFunBodyExp2VHDL (CondE condE thenE elseE) = + do condVHDLE <- transExp2VHDL condE + thenVHDLSm <- transFunBodyExp2VHDL thenE + elseVHDLSm <- transFunBodyExp2VHDL elseE + return (IfSm condVHDLE [thenVHDLSm] [] (Just $ Else [elseVHDLSm]))+transFunBodyExp2VHDL caseE@(CaseE exp matches) = + do caseVHDLE <- transExp2VHDL exp + caseSmAlts <- mapM (transMatch2VHDLCaseSmAlt caseE) matches+ return (CaseSm caseVHDLE caseSmAlts)+-- In other case it is an expression returned directly+transFunBodyExp2VHDL e = + do vHDLe <- transExp2VHDL e + return (ReturnSm $ Just vHDLe)++-- | Translate a case alternative from Haskell to VHDL+transMatch2VHDLCaseSmAlt :: TH.Exp -> TH.Match -> VHDLM CaseSmAlt+-- FIXME: the exp passed (which contains the full case expression for+-- error reporting purposes) should be part of the context once VHDLM+-- is reworked+transMatch2VHDLCaseSmAlt contextExp (Match pat (NormalB matchExp) []) =+ do sm <- transFunBodyExp2VHDL matchExp+ case pat of+ -- FIXME: support pattern matching with tuples, AbsExt, + -- and enumerated types+ WildP -> return $ CaseSmAlt [Others] [sm] + LitP lit -> do vHDLExp <- transExp2VHDL (LitE lit)+ return $ CaseSmAlt [ChoiceE vHDLExp] [sm]+ -- FIXME: check! this case introduces new names into scope+ VarP name -> do vHDLExp <- transExp2VHDL (VarE name)+ return $ CaseSmAlt [ChoiceE vHDLExp] [sm]+ _ -> expErr contextExp $ UnsupportedCasePat pat+transMatch2VHDLCaseSmAlt contextExp (Match _ _ whereDecs@(_:_)) =+ expErr contextExp $ CaseWhereConstruct whereDecs+transMatch2VHDLCaseSmAlt contextExp (Match _ bdy@(GuardedB _) _) =+ expErr contextExp $ CaseGuardedBody bdy+++-- | Translate a Haskell expression to a VHDL expression+transExp2VHDL :: TH.Exp -> VHDLM VHDL.Expr+++-- TypeLevel-package numerical constant aliases+transExp2VHDL (VarE name) | isTypeLevelAlias = do+ let constant = nameBase name+ ([baseSym], val) = splitAt 1 constant+ basePrefix = case baseSym of+ 'b' -> "2#" + 'o' -> "8#" + 'h' -> "16#"+ 'd' -> ""+ _ -> error "unexpected base symbol"+ return (PrimLit $ basePrefix ++ val) + where isTypeLevelAlias = (show name =~ aliasPat)+ aliasPat = "^Data\\.TypeLevel\\.Num\\.Aliases\\.(b[0-1]+|o[0-7]+|d[0-9]+|h[0-9A-F]+)$"++++-- A FSVec generated with Template Haskell +transExp2VHDL (VarE unsafeFSVecCoerce `AppE` _ `AppE` (ConE con `AppE` ListE exps)) + | show unsafeFSVecCoerce == "Data.Param.FSVec.unsafeFSVecCoerce" &&+ show con == "Data.Param.FSVec.FSVec" = do+ vhdlExps <- mapM transExp2VHDL exps+ return $ Aggregate (map (\e -> ElemAssoc Nothing e) vhdlExps)+++-- Is it function/constructor application, a constant+-- or an unkown name.+transExp2VHDL e | isConsOrFun =+ do -- get the symbol table (name translation table)+ nameTable <- gets (nameTable.transNameSpace.local)+ case lookup name nameTable of+ -- found name+ Just (arity, transF) -> + if arity /= numArgs + then expErr e $ CurryUnsupported arity numArgs+ else do exps <- mapM transExp2VHDL args+ return $ transF exps+ -- Didn't find the name in the global table+ Nothing -> do + -- Check if it is a user-defined enumerated data constructor + mId <- getEnumConsId name+ case mId of+ Just id -> return $ PrimName (NSimple id)+ Nothing -> expErr e $ UnkownIdentifier name+ where (f,args,numArgs) = unApp e + mName = getName f+ name = fromJust mName+ isConsOrFun = isJust mName + getName (VarE n) = Just n+ getName (ConE n) = Just n+ getName _ = Nothing++++-- Literals+transExp2VHDL (LitE (IntegerL integer)) = (return.transInteger2VHDL) integer+transExp2VHDL (LitE (IntPrimL integer)) = (return.transInteger2VHDL) integer++-- Unsupported literal +transExp2VHDL lit@(LitE _) = expErr lit $ UnsupportedLiteral++-- Infix expressions+transExp2VHDL (InfixE (Just argl) f@(VarE _) (Just argr)) = + transExp2VHDL $ f `AppE` argl `AppE` argr++-- Sections (unsupported)+transExp2VHDL infixExp@(InfixE _ (VarE _) _) = expErr infixExp Section++-- Tuples: e.g. (1,2)+transExp2VHDL (TupE exps) = do+ vExps <- mapM transExp2VHDL exps+ return $ Aggregate $ map (\expr -> ElemAssoc Nothing expr) vExps++-- Unsupported expressions+transExp2VHDL lamE@(LamE _ _) = expErr lamE LambdaAbstraction+transExp2VHDL condE@(CondE _ _ _) = expErr condE Conditional+transExp2VHDL letE@(LetE _ _) = expErr letE Let+transExp2VHDL caseE@(CaseE _ _) = expErr caseE Case+transExp2VHDL doE@(DoE _) = expErr doE Do +transExp2VHDL compE@(CompE _) = expErr compE ListComprehension+transExp2VHDL arithSeqE@(ArithSeqE _) = expErr arithSeqE ArithSeq +transExp2VHDL listE@(ListE _) = expErr listE List +transExp2VHDL sigE@(SigE _ _) = expErr sigE Signature +transExp2VHDL reConE@(RecConE _ _) = expErr reConE Record +transExp2VHDL recUpE@(RecUpdE _ _) = expErr recUpE Record++-- The rest of expressions are not valid in practice and thus, not supported +-- (e.g. InfixE Nothing (RecConE _ _) _+transExp2VHDL exp = expErr exp Unsupported+ ++-- | Translate an integer to VHDL+transInteger2VHDL :: Integer -> Expr+transInteger2VHDL = PrimLit . show +++--------------------+-- Helper Functions+--------------------++-- Translate the TypeRep of a type-level natural (e.g: D1 :* D2) to a number+-- Make sure you don't supply an incorrect TypeRep or the function will break+transTLNat2Int :: TypeRep -> Int+transTLNat2Int tr+ -- Digit+ | isDigit = (digitToInt.last.tyConString) cons+ -- Connective+ | otherwise = 10 * (transTLNat2Int prefix) + (transTLNat2Int lastDigit) + where (cons, args@(~[prefix, lastDigit])) = splitTyConApp tr+ isDigit = null args+++-- Tranlate an Into to the TypeRep of a type-level natural (e.g: D1 :* D2)+transInt2TLNat :: Int -> TypeRep+transInt2TLNat n+ | n < 0 = intError fName (Other "negative index")+ | n < 10 = digit n+ | otherwise = mkTyConApp conTyCon [transInt2TLNat suffix, digit last]+ where fName = "ForSyDe.Backend.VHDL.Translate.transInt2TLNat"+ (suffix, last) = n `divMod` 10 + digit 0 = typeOf (undefined :: D0)+ digit 1 = typeOf (undefined :: D1)+ digit 2 = typeOf (undefined :: D2)+ digit 3 = typeOf (undefined :: D3)+ digit 4 = typeOf (undefined :: D4)+ digit 5 = typeOf (undefined :: D5)+ digit 6 = typeOf (undefined :: D6)+ digit 7 = typeOf (undefined :: D7)+ digit 8 = typeOf (undefined :: D8)+ digit 9 = typeOf (undefined :: D9)+ -- Just to hush the compiler warnings+ digit _ = undefined+ conTyCon = (typeRepTyCon.typeOf) (undefined :: () :* ())++-- Type constructor of FSVec+fSVecTyCon :: TyCon+fSVecTyCon =(typeRepTyCon.typeOf) (undefined :: V.FSVec () ())++-- unApply an expression and obtain the number of arguments found+unApp :: Exp -> (Exp, [Exp], Int)+unApp e = (first, rest, n)+ where (first:rest, n) = unAppAc ([],0) e+ unAppAc (xs,n) (f `AppE` arg) = unAppAc (arg:xs, n+1) f+ unAppAc (xs,n) f = (f:xs,n)
+ src/ForSyDe/Backend/VHDL/Traverse.hs view
@@ -0,0 +1,239 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Traverse+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides specialized Netlist traversing functions aimed at+-- VHDL compilation.+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.Traverse + (writeVHDLM,+ module ForSyDe.Backend.VHDL.Traverse.VHDLM) where++import ForSyDe.Backend.VHDL.Traverse.VHDLM+import ForSyDe.Backend.VHDL.Translate+import ForSyDe.Backend.VHDL.Generate+import ForSyDe.Backend.VHDL.FileIO+import ForSyDe.Backend.VHDL.AST+import ForSyDe.Backend.VHDL.Quartus (callQuartus)+import ForSyDe.Backend.VHDL.Modelsim++import ForSyDe.ForSyDeErr+import ForSyDe.System.SysDef+import ForSyDe.Process.ProcVal+import ForSyDe.Process.ProcFun+import ForSyDe.Netlist.Traverse+import ForSyDe.Netlist+import ForSyDe.OSharing++import Control.Monad.State+import System.Directory+import System.FilePath+import Data.Maybe (fromJust, isJust)++-- | Internal VHDL-Monad version of 'ForSyDe.Backend.writeVHDL'+-- (Note: the initial and final CWD will be / )+writeVHDLM :: VHDLM ()+writeVHDLM = do+ -- create and change to systemName/vhdl/work+ rootDir <- gets (sid.globalSysDef.global)+ let workDir = rootDir </> "vhdl" </> "work"+ liftIO $ createDirectoryIfMissing True workDir+ liftIO $ setCurrentDirectory workDir+ -- write the local results for the first-level entity+ writeLocalVHDLM+ -- if we are in recursive mode, also write the local results+ -- for the rest of the subsystems+ rec <- isRecursiveSet+ when rec $ do subs <- gets (subSys.globalSysDef.global)+ let writeSub s = + withLocalST (initLocalST ((readURef.unPrimSysDef) s))+ writeLocalVHDLM + mapM_ writeSub subs+ -- create and change to systemName/vhdl/systemName_lib+ -- (remember we are in workDir)+ let libDir = ".." </> rootDir ++ "_lib"+ liftIO $ createDirectoryIfMissing True libDir+ liftIO $ setCurrentDirectory $ libDir+ -- write the global results+ writeGlobalVHDLM+ -- change to systemName/vhdl+ liftIO $ setCurrentDirectory ".."+ -- call quartus if necessary+ callQuartus+ -- analyze with modelsim if necessary+ compile <- isCompileModelsimSet+ when compile compileResultsModelsim+ -- go back to the original directory+ liftIO $ setCurrentDirectory (".." </> "..")+ +-- | Write the global traversing results (i.e. the library design file)+-- accumulated in the state of the monad+writeGlobalVHDLM :: VHDLM ()+writeGlobalVHDLM = do+ gSysId <- gets (sid.globalSysDef.global)+ debugMsg $ "Generating global system library for `" ++ gSysId ++ "' ...\n"+ globalRes <- gets (globalRes.global)+ -- We can create the id unsafely because sysId was already checked in+ -- transSysDef2Ent+ let libName = gSysId ++ "_lib"+ libDesignFile = genLibDesignFile globalRes+ liftIO $ writeDesignFile libDesignFile (libName ++ ".vhd")+++-- | Traverse the netlist and write the local results (i.e. system design files)+writeLocalVHDLM :: VHDLM ()+writeLocalVHDLM = do+ gSysDefVal <- gets (globalSysDef.global)+ lSysDefVal <- gets (currSysDef.local)+ let lSysDefId = sid lSysDefVal+ debugMsg $ "Compiling system definition `" ++ lSysDefId ++ "' ...\n"+ -- Obtain the netlist of the system definition + let nl = netlist lSysDefVal+ -- Traverse the netlist, and get the traversing results+ intOutsInfo <- traverseVHDLM nl + LocalTravResult decs stms <- gets (localRes.local)+ let finalLogic = logic lSysDefVal+ -- Obtain the entity declaration of the system and the VHDL identifiers+ -- of the output signals.+ entity@(EntityDec _ eIface) <- transSysDef2Ent finalLogic lSysDefVal + -- For each output signal, we need an assigment between its intermediate+ -- signal and the final output signal declared in the entity interface.+ let outIds = mapFilter (\(IfaceSigDec id _ _) -> id) + (\(IfaceSigDec _ m _) -> m == Out) eIface+ outAssigns = genOutAssigns outIds intOutsInfo+ finalRes = LocalTravResult decs (stms ++ outAssigns)+ -- Finally, generate the design file+ sysDesignFile = genSysDesignFile (sid gSysDefVal) entity finalRes+ -- and write it to disk+ liftIO $ writeDesignFile sysDesignFile (lSysDefId ++ ".vhd") + where mapFilter f p = foldr (\x ys -> if p x then (f x):ys else ys) []++-- | Traverse the netlist of a System Definition, +-- returning the (implicit) final traversing state and a list+-- containing the 'IntSignalInfo' of each output of the system+traverseVHDLM :: Netlist [] -> VHDLM [IntSignalInfo]+traverseVHDLM = traverseSEIO newVHDL defineVHDL++-- | \'new\' traversing function for the VHDL backend+newVHDL :: NlNode NlSignal -> VHDLM [(NlNodeOut, IntSignalInfo)]+newVHDL node = case node of+ -- FIXME: Skip the case, basing the generation of tags on+ -- outTags + InPort id -> do vId <- transPortId2VHDL id+ return [(InPortOut, vId)]+ Proc pid proc -> withProcC pid $ do+ -- Obtain the VHDL id of the process+ vpid <- transProcId2VHDL pid+ -- function to create an intermediate signal out of the process+ -- identifier and a string suffix+ let procSuffSignal sigSuffix = unsafeIdAppend vpid sigSuffix+ -- Multiple output tags, add a numeric suffix specifying the output+ multOutTags = + zipWith (\tag n -> (tag, procSuffSignal $ outSuffix ++ show n))+ (outTags node) [(1::Int)..]+ case proc of+ Const _ -> return [(ConstOut, procSuffSignal outSuffix)]+ ZipWithNSY _ _ -> return [(ZipWithNSYOut, procSuffSignal outSuffix)]+ ZipWithxSY _ _ -> return [(ZipWithxSYOut, procSuffSignal outSuffix)]+ UnzipNSY _ _ _ -> return multOutTags+ UnzipxSY _ _ _ _ -> return multOutTags + DelaySY _ _ -> return [(DelaySYOut, procSuffSignal outSuffix)]+ SysIns _ _ ->+ -- Note: Here we could use the name of the System outputs instead of+ -- instanceid_out_n but ... that could cause+ -- clashes with the oher signal names (we only check for the+ -- of the uniqueness of all process ids within a system when + -- creating it). We could check for those clashes but it would be+ -- ineffective and ilogical.+ return multOutTags+ where outSuffix = "_out" + +-- | \'define\' traversing function for the VHDL backend+defineVHDL :: [(NlNodeOut, IntSignalInfo)] + -> NlNode IntSignalInfo + -> VHDLM ()+defineVHDL outs ins = do + case (outs,ins) of+ (_, InPort _) -> return ()+ (outs, Proc pid proc) -> withProcC pid $ do+ -- We can unsafely transform the pid to a VHDL identifier because+ -- it was checked in newVHDL+ let vPid = unsafeVHDLExtId pid+ case (outs, proc) of+ ([(ConstOut, intSig)], Const ProcVal{valAST=ast}) -> do+ -- Generate a Signal declaration for the constant+ let cons = expVal ast+ dec <- withProcValC cons $ transVHDLName2SigDec + intSig (expTyp ast) (Just cons)+ addSigDec dec+ ([(ZipWithNSYOut, intOut)], ZipWithNSY f intIns) -> do + -- Translate the zipWithN process to a block+ -- and get the declaration of its output signal+ (block, dec) <- transZipWithN2Block vPid intIns (tpfloc f) (tast f) intOut+ addStm $ CSBSm block+ -- Generate a signal declaration for the resulting signal+ addSigDec dec+ ([(ZipWithxSYOut, intOut)], ZipWithxSY f intIns) -> do+ -- Translate the zipWithx process to a block+ -- and get the declaration of its output signal+ (block, dec) <- transZipWithx2Block vPid intIns (tpfloc f) (tast f) intOut+ addStm $ CSBSm block+ -- Generate a signal declaration for the resulting signal+ addSigDec dec + (intOuts, UnzipNSY outTypes _ intIn) -> do+ -- Translate the zipWithNSY process to a block+ -- and get the declaration of its output signal+ (block, decs) <- transUnzipNSY2Block vPid intIn (map snd intOuts) outTypes + addStm $ CSBSm block+ -- Generate a signal declaration for the resulting signals+ mapM_ addSigDec decs+ (intOuts, UnzipxSY typ size _ intIn) -> do+ -- Translate the UnzipxSY process to a block+ -- and get the declaration of its output signal+ (block, decs) <- transUnzipxSY2Block vPid intIn (map snd intOuts) typ size + addStm $ CSBSm block+ -- Generate a signal declaration for the resulting signals+ mapM_ addSigDec decs+ ([(DelaySYOut, intOut)], DelaySY initExp intIn) -> do+ -- Translate the delay process to a block+ -- and get the declaration of its output signal+ (block, dec) <- transDelay2Block vPid intIn (valAST initExp) intOut+ addStm $ CSBSm block+ -- Generate a signal declaration for the resulting delayed signal+ addSigDec dec + + (intOuts, SysIns pSys intIns) -> do+ let parentSysRef = unPrimSysDef pSys+ parentSysVal = readURef parentSysRef+ parentLogic = logic parentSysVal+ parentInIface = iIface parentSysVal+ parentOutIface = oIface parentSysVal+ typedOuts = zipWith (\(_, t) (_, int) -> (int,t)) parentOutIface+ intOuts + parentId = sid parentSysVal + -- Translate the instance to a component instantiation + -- and get the declaration of the output signals+ (mCompIns, decs) <- transSysIns2CompIns parentLogic + vPid + intIns + typedOuts + parentId + (map fst parentInIface) + (map fst parentOutIface)+ when (isJust mCompIns) (addStm $ CSISm $ fromJust mCompIns)+ -- Generate a signal declaration for each of the resulting signals+ mapM_ addSigDec decs++-- Othewise there is a problem of inconsisten tags+ _ -> intError "ForSyDe.Backend.VHDL.Traverse.defineVHDL" InconsOutTag+++++
+ src/ForSyDe/Backend/VHDL/Traverse/VHDLM.hs view
@@ -0,0 +1,557 @@+{-# LANGUAGE FlexibleContexts #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Backend.VHDL.Traverse.VHDLM+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- 'VHDM' (VHDL Monad), related types and functions+--+-----------------------------------------------------------------------------+module ForSyDe.Backend.VHDL.Traverse.VHDLM where++import ForSyDe.Backend.VHDL.AST+import qualified ForSyDe.Backend.VHDL.AST as VHDL+import {-# SOURCE #-} ForSyDe.Backend.VHDL.GlobalNameTable (globalNameTable)++import ForSyDe.Ids+import ForSyDe.ForSyDeErr+import ForSyDe.System.SysDef (SysDefVal(..))+import ForSyDe.Netlist.Traverse (TravSEIO)+import ForSyDe.Process.ProcType (EnumAlgTy(..))++import Data.Generics (tyconModule)+import Data.Maybe (fromJust)+import qualified Data.Set as S (filter)+import Data.Set (Set, union, empty, toList)+import Control.Monad.State+import Language.Haskell.TH (nameBase, nameModule, Name, Exp)+import Data.Typeable (TypeRep)++-------------------------------------+-- How does the VHDL Backend work? --+-------------------------------------+-- FIXME: This documentation is a bit outated+-- All the types used in the the System Defintion are translated to VHDL+-- put into Package, the into a Design File and written to disk.+--+-- The System Definition itself is translated to another VHDL Design File and +-- written to disk.+--+-- This Design File will contain only two library units;+-- an Entity Declaration and an Architecture.+-- 1) The Entity Declaration can be obtained from the SysDef directly (without+-- traversing the netlist)+-- 2) The Architecture (or more specifically, its declarations and+-- the statements) is obtained from the netlist by traversing it. +--+-- The state of the traversal is composed by +-- * list of type defintions translated during the traversal+-- * table of equivalence between Haskell types and the VHDL identifier+-- of its translated type (used to avoid translating the same type+-- multiple times)+-- * the list of declarations of the architecture+-- * the list of statements of the architecture +-- * a table of System Definition references, used to keep track of the+-- system definitions (corresponding to one or more instances in the +-- netlist) whose code was already generated.+--+-- For each process (netlist node) found during the traversal:+-- * A signal declaration is generated for each output and added to+-- the list of architecture declarations.+-- * A VHDL block including the translation of the process is generated+-- and added to the list of architecture statements.+--+-- In the special case of finding a System Instance+-- 1) a port map statement is generated and added to the list of +-- architecture statements.+-- 2) the System Definition table is used to check if the Design File of+-- the System Definition associated with the instance was written to +-- disk.+-- 3) if the the associated System Definition wasn't in the table+-- 1) generate and write to disk the corresponding Design File+-- 2) add the System Definition to the table++-----------------+-- TransNameSpace+-----------------++-- | Translation namespace.+--+-- This type provides the number of fresh names already generated and+-- a tranlsation table from Template Haskell Names to VHDL Expressions (a symbol table). +-- It only makes sense in a process-function context.+data TransNameSpace = TransNameSpace + {freshNameCount :: Int,+ nameTable :: [(Name, (Int, [VHDL.Expr] -> VHDL.Expr ) )] }+ -- The table entries work as follows:+ -- (Template Haskell Name (table key), + -- (Arity, function with which to construct the translated VHDL expression given its + -- arguments already translated to VHDL ))++-- | Initial trnaslation namespace for functions+initTransNameSpace :: TransNameSpace+initTransNameSpace = TransNameSpace 0 globalNameTable++-----------+-- VHDLM --+-----------++-- | VHDL backend monad+type VHDLM a = TravSEIO VHDLTravST ContextErr a++----------------+-- VHDLTravST --+----------------++-- | VHDL traversing State. (see 'ForSyDe.Netlist.Traverse.traverseSIO')+data VHDLTravST = VHDLTravST+ {local :: LocalVHDLST, -- Local State (related to the system currently + -- compiled)+ global :: GlobalVHDLST} -- Global state (related to all systems being + -- recursively compiled) ++data LocalVHDLST = LocalVHDLST+ {currSysDef :: SysDefVal, -- System definition which is currently + -- being compiled+ context :: Context, -- Error Context+ transNameSpace :: TransNameSpace, -- Translation namespace for functions+ -- It only makes sense+ -- in a process-function context + localRes :: LocalTravResult} -- Result accumulated during the + -- traversal of current System Definition + -- netlist+++++-- | initialize the local state+initLocalST :: SysDefVal -> LocalVHDLST+initLocalST sysDefVal = + LocalVHDLST sysDefVal (SysDefC (sid sysDefVal) (loc sysDefVal)) + initTransNameSpace emptyLocalTravResult++-- | Execute certain operation with a concrete local state.+-- The initial local state is restored after the operation is executed+withLocalST :: LocalVHDLST -> VHDLM a -> VHDLM a+withLocalST l' action = do+ -- get the initial local state+ st <- get+ let l = local st+ -- set the modified state+ put st{local=l'}+ -- execute the action+ res <- action+ -- restore the initial local state+ st' <- get + put st'{local=l}+ -- return the result+ return res++-- | Execute certain operation with the initial translation namespace+-- The initial namespace is restored after the operation is executed+withInitTransNameSpace :: VHDLM a -> VHDLM a+withInitTransNameSpace action = do+ -- get the initial name space+ st <- get+ let l = local st+ ns = transNameSpace l+ -- set the empty name space+ put st{local=l{transNameSpace=initTransNameSpace}}+ -- execute the action+ res <- action+ -- restore the initial name table+ st' <- get+ let l' = local st'+ put st'{local=l'{transNameSpace=ns}}+ -- return the result+ return res+ + ++data GlobalVHDLST = GlobalVHDLST+ {globalSysDef :: SysDefVal, -- global system definition + -- (the first-level system being compiled)+ ops :: VHDLOps, -- Compilation options+ globalRes :: GlobalTravResult, -- Result accumulated during the + -- whole compilation+ enumTypes :: Set EnumAlgTy, -- Set of the enumerated+ -- algebraic types accumulated+ -- by all ProcFuns and ProcVals+ -- in the system + typeTable :: [(TypeRep, TypeMark)], -- Type translation table+ transUnconsFSVecs :: [TypeRep]} -- Unconstrained FSVecs previously translated.+ -- Each unconstrained FSVec is represented by + -- the 'TypeRep' of its elements+++-- | Empty initial traversing state+initGlobalVHDLST :: SysDefVal -> GlobalVHDLST+initGlobalVHDLST sysDefVal = + GlobalVHDLST sysDefVal defaultVHDLOps emptyGlobalTravResult empty [] []++-- | Empty initial traversing state +initVHDLTravST :: SysDefVal -> VHDLTravST+initVHDLTravST sysDefVal = + VHDLTravST (initLocalST sysDefVal) (initGlobalVHDLST sysDefVal)++-------------+-- TravResult+-------------++-- | Local result accumulated during the traversal of a netlist+data LocalTravResult = LocalTravResult + {archDecs :: [BlockDecItem], -- generated architecture declarations + archSms :: [ConcSm] } -- generated architecture statements++++-- | empty local VHDL compilation result+emptyLocalTravResult :: LocalTravResult+emptyLocalTravResult = LocalTravResult [] []+++-- | Global Results accumulated throughout the whole compilation+data GlobalTravResult = GlobalTravResult + {typeDecs :: [TypeDec], -- Types translated during the traversal+ subtypeDecs :: [SubtypeDec], -- Subtypes translated during the traversal+ subProgBodies :: [SubProgBody] } -- Functions or procedures generated during+ -- the traversal++++-- | empty global VHDL compilation result+emptyGlobalTravResult :: GlobalTravResult+emptyGlobalTravResult = GlobalTravResult [] [] []+++----------+-- VHDLOps+----------++-- | VHDL Compilation options+data VHDLOps = VHDLOps {debugVHDL :: VHDLDebugLevel, -- ^ Debug mode+ recursivityVHDL :: VHDLRecursivity, + execQuartus :: Maybe QuartusOps, -- ^ Analyze the generated code with Quartus+ compileModelsim :: Bool -- ^ Compile the generated code with Modelsim+ }+ deriving (Eq, Show)++-- | Debug level+data VHDLDebugLevel = VHDLNormal | VHDLVerbose+ deriving (Eq, Ord, Show)++-- | Print a message to stdout if in verbose mode+debugMsg :: String -> VHDLM ()+debugMsg str = do+ debugLevel <- gets (debugVHDL.ops.global)+ when (debugLevel > VHDLNormal) + (liftIO $ putStr ("DEBUG: " ++ str))++-- | Recursivity, should the parent systems of system instances be compiled as +-- well?+data VHDLRecursivity = VHDLRecursive | VHDLNonRecursive+ deriving (Eq, Show)++-------------+-- QuartusOps+-------------++-- Quartus options++-- | Options passed to Quartus II by the VHDL Backend. Most of them are optional+-- and Quartus will use a default value.+--+-- It contains:+-- +-- * What action to perform+--+-- * Optinally, the minimum acceptable clock frequency (fMax) expressed in MHz+--+-- * FPGA family and specific device model (both are independently optional).+--+-- * Pin assignments, in the form (VHDL Pin, FPGA Pin). Note+-- that Quartus will automatically split composite VHDL ports +--- (arrays and records) in various pins with different logical names. +data QuartusOps = + QuartusOps {action :: QuartusAction,+ fMax :: Maybe Int,+ fpgaFamiliyDevice :: Maybe (String, Maybe String),+ pinAssigs :: [(String,String)] }+ deriving (Eq, Show)++-- | Action to perform by Quartus+data QuartusAction = AnalysisAndElaboration -- ^ Analysis and eleboration flow+ | AnalysisAndSynthesis -- ^ Call map executable + | FullCompilation -- ^ Compile flow+ deriving (Eq, Show)++-- | Options to check if the model is synthesizable, all options except+-- the action to take are set to default. +checkSynthesisQuartus :: QuartusOps+checkSynthesisQuartus = QuartusOps AnalysisAndSynthesis Nothing Nothing [] +++-- | Check if we are in recursive mode+isRecursiveSet :: VHDLM Bool+isRecursiveSet = do + recOp <- gets (recursivityVHDL.ops.global)+ return $ recOp == VHDLRecursive++-- | Check if we want to compile the results with modelsim+isCompileModelsimSet :: VHDLM Bool+isCompileModelsimSet = gets (compileModelsim.ops.global)++-- | Default traversing options+defaultVHDLOps :: VHDLOps+defaultVHDLOps = VHDLOps VHDLNormal VHDLRecursive Nothing False+++-- | Set VHDL options inside the VHDL monad+setVHDLOps :: VHDLOps -> VHDLM ()+setVHDLOps options = modify (\st -> st{global=(global st){ops=options}})+++-------------------------------------+-- Useful functions in the VHDL Monad+-------------------------------------+++-- | Add a signal declaration to the 'LocalTravResult' in the State+addSigDec :: SigDec -> VHDLM ()+addSigDec dec = modify addFun + -- FIXME: use a queue for the declarations+ where addFun st = st{local=l{localRes=r{archDecs=ads ++ [BDISD dec]}}}+ where l = local st+ r = localRes l+ ads = archDecs r +++-- | Add a statement to the 'LocalTravResult' in the State+addStm :: ConcSm -> VHDLM ()+addStm sm = modify addFun+ -- FIXME: use a queue for the statements+ where addFun st = st{local=l{localRes=r{archSms=aSms ++ [sm]}}}+ where l = local st+ r = localRes l+ aSms = archSms r ++ +-- | Find a previously translated custom type+lookupCustomType :: TypeRep -> VHDLM (Maybe SimpleName)+lookupCustomType rep = do+ transTable <- gets (typeTable.global)+ return $ lookup rep transTable+++-- | Add enumerated types to the global state+addEnumTypes :: Set EnumAlgTy -> VHDLM ()+addEnumTypes newETs = do+ globalST <- gets global + let oldETs = enumTypes globalST+ modify (\st -> st{global = globalST {enumTypes = oldETs `union` newETs}})+ +-- | Check if a Template haskell 'Name' corresponding to+-- a Enumerated-type data constructor is present in the enumerated+-- types accumulated in the global state and return the corresponding+-- VHDL identifier.+getEnumConsId :: Name -> VHDLM (Maybe VHDLId)+getEnumConsId consName = do+ let consModule = (fromJust.nameModule) consName+ consBase = nameBase consName+ enums <- gets (enumTypes.global)+ let matchesName (EnumAlgTy dataName enums) = + tyconModule dataName == consModule && elem consBase enums+ case (toList.(S.filter matchesName)) enums of+ [] -> return Nothing+ [_] -> liftM Just (liftEProne $ mkVHDLExtId consBase) + -- _ -> this shouldn't happen since the enumerated types stored are unique+ _ -> intError "ForSyDe.Backend.VHDL.Traverse.VHDLM.getEnum" + (UntranslatableVHDLFun $ GeneralErr (Other "pattern match inconsistency"))+++-- | Add a cutom type to the global results and type translation table+addCustomType :: TypeRep -> Either TypeDec SubtypeDec -> VHDLM ()+addCustomType rep eTD = do+ globalST <- gets global + let transTable = typeTable globalST+ gRes = globalRes globalST + tDecs = typeDecs gRes+ stDecs = subtypeDecs gRes+ -- FIXME: use queues+ modify (\st -> st{global = + case eTD of+ Left td@(TypeDec id _) -> + globalST+ {typeTable = transTable ++ [(rep, id)],+ globalRes = gRes{typeDecs = tDecs ++ [td]}}+ Right std@(SubtypeDec id _) -> + globalST+ {typeTable = transTable ++ [(rep, id)],+ globalRes = gRes{subtypeDecs = stDecs ++ [std]}}+ })++-- | Add type declaration to the global results+addTypeDec :: TypeDec -> VHDLM ()+addTypeDec td = do+ globalST <- gets global + let gRes = globalRes globalST + tDecs = typeDecs gRes+ -- FIXME: use queues+ modify (\st -> st{global = globalST{globalRes = gRes{typeDecs = tDecs ++ [td]}}})+++-- | Add subtype declaration to the global results+addSubtypeDec :: SubtypeDec -> VHDLM ()+addSubtypeDec std = do+ globalST <- gets global + let gRes = globalRes globalST + stDecs = subtypeDecs gRes+ -- FIXME: use queues+ modify (\st -> st{global = globalST{+ globalRes = gRes{subtypeDecs = stDecs ++ [std]}}})+++-- | Add an unconstrained FSVec to the global results+addUnconsFSVec :: TypeRep -> VHDLM ()+addUnconsFSVec trep = do+ globalST <- gets global + -- FIXME: use queues+ modify (\st -> st{global = + globalST{+ transUnconsFSVecs = (transUnconsFSVecs globalST) ++ [trep]}})++-- | Add a subprogram to the global results+addSubProgBody :: SubProgBody -> VHDLM ()+addSubProgBody newBody = do+ globalST <- gets global + let gRes = globalRes globalST + bodies = subProgBodies gRes+ -- FIXME: use queues+ modify (\st -> st{global = globalST+ {globalRes = gRes{subProgBodies = bodies ++ [newBody]}}})+++-- | Add a TH-name (arity, VHDL expression construtor fucntion) pair to the translation namespace table+addTransNamePair :: Name -> Int -> ([Expr] -> Expr) -> VHDLM ()+addTransNamePair thName arity vHDLFun = do+ lState <- gets local+ let ns = transNameSpace lState+ table = nameTable ns+ modify (\st -> st{local=lState{transNameSpace=ns{+ nameTable=(thName,(arity,vHDLFun)):table}}})++-- | Get a fresh VHDL Identifier and increment the+-- tranlation-namespace-count of freshly generated identifiers.+--+-- Note that all user-supplied identifiers (process ids, port ids,+-- and function parameters) are translated to extended VHDL+-- identifiers. That, together with the fact that basic and extended+-- VHDL identifers live in different namespaces, guarantees that+-- freshly generated basic VHDL identifiers cannot clash with the+-- ones supplied by the frontend.+genFreshVHDLId :: VHDLM VHDLId+genFreshVHDLId = do+ lState <- gets local+ let ns = transNameSpace lState+ count = freshNameCount ns+ modify (\st -> st{local=lState{transNameSpace=ns{freshNameCount=count+1}}})+ return $ unsafeVHDLBasicId ("fresh_" ++ show count) ++-- | Lift an 'EProne' value to the VHDL monad setting current error context+-- for the error+-- liftEProne :: EProne a -> VHDLM a+liftEProne :: EProne a -> VHDLM a+liftEProne ep = do+ cxt <- gets (context.local)+ either (throwError.(ContextErr cxt)) return ep++-- | Throw a ForSyDe error, setting current error context+throwFError :: ForSyDeErr -> VHDLM a+throwFError = liftEProne.Left++++-- | Execute certain operation with a concrete process context.+-- The initial context is restored after the operation is executed+-- Note: the initial context must be a system context or 'InconsistenContexts'+-- will be raised.+withProcC :: ProcId -> VHDLM a -> VHDLM a+withProcC pid action = do+ -- get the initial context+ st <- get+ let l = local st+ c = context l+ -- set the modified name context+ put st{local=l{context=setProcC pid c}}+ -- execute the action+ res <- action+ -- restore the initial name context+ st' <- get+ let l' = local st'+ put st'{local=l'{context=c}}+ -- return the result+ return res++++-- | Execute certain operation with a concrete process function context.+-- The initial context is restored after the operation is executed+-- Note: the initial context must be a process context or +-- 'InconsistenContexts' will be raised.+withProcFunC :: Name -> Loc -> VHDLM a -> VHDLM a+withProcFunC name loc action = do+ -- get the initial context+ st <- get+ let l = local st+ c = context l+ -- set the modified context+ put st{local=l{context=setProcFunC name loc c}}+ -- execute the action+ res <- action+ -- restore the initial context+ st' <- get+ let l' = local st'+ put st'{local=l'{context=c}}+ -- return the result+ return res++++-- | Execute certain operation with a concrete process function context.+-- The initial context is restored after the operation is executed+-- Note: the initial context must be a process context or +-- 'InconsistenContexts' will be raised.+withProcValC :: Exp -> VHDLM a -> VHDLM a+withProcValC exp action = do+ -- get the initial context+ st <- get+ let l = local st+ c = context l+ -- set the modified context+ put st{local=l{context=setProcValC exp c}}+ -- execute the action+ res <- action+ -- restore the initial context+ st' <- get+ let l' = local st'+ put st'{local=l'{context=c}}+ -- return the result+ return res+++----------------+-- IntSignalInfo+----------------++-- | Intermediate signal information. Tag generated for each output of each+-- node found during the traversal. +-- (see ForSyDe.Netlist.Traverse.traverseSIO).+-- It contains the VHDL intemediate signal name associated with the process +-- output.+type IntSignalInfo = SimpleName+
+ src/ForSyDe/Bit.hs view
@@ -0,0 +1,169 @@+{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, MultiParamTypeClasses,+ FunctionalDependencies, TypeSynonymInstances #-} +-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Bit+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- 'Bit' Datatype. Note that the 'Num' instance is phony and shouldn't be used+-- +-----------------------------------------------------------------------------+module ForSyDe.Bit (Bit(..), + not, + bitToBool, + boolToBit,+ toBitVector8,+ fromBitVector8,+ toBitVector16,+ fromBitVector16,+ toBitVector32,+ fromBitVector32,+ toBitVector64,+ fromBitVector64) where++import Language.Haskell.TH.Lift+import Data.Int+import Data.Bits+import Data.Generics (Data, Typeable)+import Prelude hiding (not)++import Data.Param.FSVec (FSVec, reallyUnsafeVector)+import qualified Data.Param.FSVec as V+import Data.TypeLevel.Num (D8,D16,D32,D64,Nat)++data Bit = H -- ^ High value + | L -- ^ Low value+ deriving (Eq, Show, Data, Typeable)++$(deriveLift1 ''Bit)++-- | Not operation over bits+not :: Bit -> Bit+not = complement+++instance Bits Bit where+ H .&. x = x+ L .&. _ = L+ H .|. _ = H+ L .|. x = x+ xor H L = H+ xor L H = H+ xor _ _ = L+ complement L = H+ complement H = L+ shift x 0 = x+ shift _ _ = L+ rotate x _ = x+ bitSize _ = 1+ isSigned _ = False+++-- Phony instance of Num+instance Num Bit where+ H + L = H+ H + H = L+ L + x = x+ -- since they are unsigned and there are only two elements, (-) == (+)+ (-) = (+)+ -- multiplication is equivalent to (.&.)+ (*) = (.&.)+ -- since a bit is unsigned, it is equivalent to identity+ abs = id+ signum _ = L+ fromInteger n = if n<=0 then L else H++-- | Convert a bit to a boolean+bitToBool :: Bit -> Bool+bitToBool H = True+bitToBool L = False++-- | Convert a boolean to a bit+boolToBit :: Bool -> Bit+boolToBit True = H+boolToBit False = L++toBitVector8 :: Int8 -> FSVec D8 Bit+toBitVector8 = reallyUnsafeToBitVector+ +fromBitVector8 :: FSVec D8 Bit -> Int8+fromBitVector8 = fromBitVectorDef 0+++toBitVector16 :: Int16 -> FSVec D16 Bit+toBitVector16 = reallyUnsafeToBitVector+ +fromBitVector16 :: FSVec D16 Bit -> Int16+fromBitVector16 = fromBitVectorDef 0+++toBitVector32 :: Int32 -> FSVec D32 Bit+toBitVector32 = reallyUnsafeToBitVector+ +fromBitVector32 :: FSVec D32 Bit -> Int32+fromBitVector32 = fromBitVectorDef 0+++toBitVector64 :: Int64 -> FSVec D64 Bit+toBitVector64 = reallyUnsafeToBitVector+ +fromBitVector64 :: FSVec D64 Bit -> Int64+fromBitVector64 = fromBitVectorDef 0+++{- This would have been much more convenient+ But it makes things really complicated int he VHDL+ backend++-- | Datatypes which can be converted to and from+-- vectors of bits+class BitStream d s | d -> s where+ -- | convert a data type to a bit vector+ toBitVector :: d -> FSVec s Bit+ -- | get a datatype from a bit vector+ fromBitVector :: FSVec s Bit -> d++instance BitStream Int8 D8 where+ toBitVector = reallyUnsafeToBitVector+ fromBitVector = fromBitVectorDef 0+++instance BitStream Int16 D16 where+ toBitVector = reallyUnsafeToBitVector+ fromBitVector = fromBitVectorDef 0+++instance BitStream Int32 D32 where+ toBitVector = reallyUnsafeToBitVector+ fromBitVector = fromBitVectorDef 0+++instance BitStream Int64 D64 where+ toBitVector = reallyUnsafeToBitVector+ fromBitVector = fromBitVectorDef 0+-}++-------------------+-- Helper functions+-------------------+reallyUnsafeToBitVector :: Bits a => a -> FSVec s Bit+reallyUnsafeToBitVector x = + reallyUnsafeVector $ map (boolToBit.(testBit x)) [size-1,size-2..0]+ where size = bitSize x++-- | version of fromBitVector supplying a default initial value from which to +-- start working+fromBitVectorDef :: (Bits a, Nat s) => a -> FSVec s Bit -> a+fromBitVectorDef def vec = fst $ V.foldr f (def, 0) vec+ where f e (ac, pos) = (copyBit e ac pos, pos+1)+ copyBit H = setBit+ copyBit L = clearBit+ ++ +
+ src/ForSyDe/Config.hs view
@@ -0,0 +1,23 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Config+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Configuration values of ForSyDe+--+-----------------------------------------------------------------------------+module ForSyDe.Config (maxTupleSize, module Paths_ForSyDe) where++import Paths_ForSyDe ++-- | Maximum tuple size+maxTupleSize :: Int+-- 62: this is the GHC-hardcoded value as of version 6.8.2+-- in the future there will be a way to avoid hardcoding this value.+-- See: http://hackage.haskell.org/trac/ghc/ticket/2364+maxTupleSize = 62
+ src/ForSyDe/DFT.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE ScopedTypeVariables, FlexibleContexts #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.DFT+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module includes the standard Discrete Fourier Transform (DFT)+-- function, and a fast Fourier transform (FFT) algorithm, for+-- computing the DFT, when the input vectors' length is a power of 2.+-----------------------------------------------------------------------------+module ForSyDe.DFT(dft, fft) where+++import qualified Data.Param.FSVec as V+import Data.Param.FSVec +import Data.TypeLevel (Nat, IsPowOf, D2)+import Data.Complex+++-- | The function 'dft' performs a standard Discrete Fourier Transformation+dft :: forall s . Nat s => FSVec s (Complex Double) -> FSVec s (Complex Double)+dft v = V.map (bigX_k v) nVector+ where+ lT = V.lengthT v+ lV = V.genericLength v+ -- FIXME: dft does not type-check without this type signature:+ -- learn why!+ nVector :: Num a => FSVec s a+ nVector = kVector lT+ fullCircle = V.map (\n -> -2*pi*n/lV) nVector+ bigX_k v k = sumV (V.zipWith (*) v (bigW k))+ bigW k = V.map (** k) (V.map cis fullCircle)+ sumV = V.foldl (+) (0:+ 0)+++-- | The function 'fft' implements a fast Fourier transform (FFT) algorithm, +-- for computing the DFT, when the size N is a power of 2.+fft :: (Nat s, IsPowOf D2 s) => + FSVec s (Complex Double) -> FSVec s (Complex Double)+fft v = V.map (bigX v) (kVector lT)+ where lT = V.lengthT v++kVector :: (Num a, Nat s) => s -> FSVec s a +kVector s = V.iterate s (+1) 0 +++bigX :: (Nat s, IsPowOf D2 s) => + FSVec s (Complex Double) -> Integer -> Complex Double+-- since there are no output length constraints (no vector is being returned)+-- we can simply obtain the list inside the vector and work with it directly+bigX v k = bigX' (V.genericLength v) (V.fromVector v) k+ where bigX' :: Integer -> [Complex Double] -> Integer -> Complex Double+ -- The first argument is the length of the list (bigN)+ bigX' _ (x0:[x1]) k | even k = x0 + x1 * bigW 2 0+ | odd k = x0 - x1 * bigW 2 0+ bigX' l xs k = bigF_even + bigF_odd * bigW l k+ where bigF_even = bigX' halfl (evens xs) k+ bigF_odd = bigX' halfl (odds xs) k+ halfl = l `div` 2++bigW :: Integer -> Integer -> Complex Double+bigW bigN k = cis (-2 * pi * (fromInteger k) / (fromInteger bigN))++evens :: [a] -> [a]+evens [] = []+evens [v1] = [v1] +evens (v1:_:v) = v1 : evens v++odds :: [a] -> [a]+odds [] = []+odds [_] = []+odds (_:v2:v) = v2 : odds v++
+ src/ForSyDe/FIR.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE TemplateHaskell, RelaxedPolyRec, PatternGuards #-}+-- The PatternGuards are used to hush innapropiate compiler warnings+-- see http://hackage.haskell.org/trac/ghc/ticket/2017+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.FIR+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module implements FIR filters for the synchronous computational model.+-----------------------------------------------------------------------------+module ForSyDe.FIR (fir) where++import ForSyDe.Ids+import ForSyDe.Signal+import ForSyDe.Process++import Data.TypeLevel.Num (Nat, Pos)+import Data.Param.FSVec hiding ((++))+import qualified Data.Param.FSVec as V+import Data.Typeable++-- | +-- All kinds of FIR-filters can now be modeled by means of 'fir'. The+-- only argument needed is the list of coefficients, which is given as+-- a vector of any size. To illustrate this, an 8-th order band pass+-- filter is modeled as follows.+--+-- > bp = fir "fir Id" $(vectorTH [0.06318761339784, 0.08131651217682, 0.09562326700432, +-- > 0.10478344432968, 0.10793629404886, 0.10478344432968, +-- > 0.09562326700432, 0.08131651217682, 0.06318761339784 ])+-- ++fir :: (Fractional b, ProcType b, Pos s, Typeable s) => + ProcId -> FSVec s b -> Signal b -> Signal b+fir id h = innerProd (id ++ "_innerProd") h . sipo (id ++ "_sipo") k 0.0+ where k = V.lengthT h++sipo :: (Pos s, Typeable s, Fractional a, ProcType a) =>+ ProcId -> s -> a -> Signal a -> FSVec s (Signal a)+sipo id n s0 = unzipxSY (id ++ "_unzipxSY") . scanldSY (id ++ "_scanldSY") srV initState+ where initState = V.copy n s0+ srV = $(newProcFun [d| srV :: Pos s => FSVec s a -> a -> FSVec s a+ srV v a = V.shiftr v a |])++innerProd :: (Fractional a, ProcType a, Nat s, Typeable s) =>+ ProcId -> FSVec s a -> FSVec s (Signal a) -> Signal a+innerProd id h = zipWithxSY id (ipV `defArgVal` h)+ where ipV = $(newProcFun + -- We could make the inner product in one traverse + -- but FSVecs don't allow recursive calls+ -- (they don't allow to check the constraints statically)+ -- Thus, we traverse the vector twice+ [d| ipV :: (Nat s, Num a) => FSVec s a -> FSVec s a -> a+ ipV v1 v2 = + V.foldl (+) 0 $ V.zipWith (*) v1 v2 |])+++
+ src/ForSyDe/ForSyDeErr.hs view
@@ -0,0 +1,457 @@+{-# LANGUAGE FlexibleContexts #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.ForSyDeErr+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- ForSyDe error-related types and functions.+--+-----------------------------------------------------------------------------+module ForSyDe.ForSyDeErr + (ForSyDeErr(..),+ ContextErr(..),+ VHDLFunErr(..),+ VHDLExpErr(..),+ Context(..),+ setProcC,+ setProcFunC,+ setProcValC,+ Loc,+ EProne,+ liftEither,+ uError,+ intError,+ qError,+ qGiveUp,+ qPutTraceMsg,+ printError,+ printVHDLError,+ printGraphMLError,+ module Control.Monad.Error,+ module Debug.Trace) where+++import ForSyDe.Ids++import Data.Maybe (fromMaybe)+import Debug.Trace+import Control.Monad.Error +import Data.Dynamic+import Data.Typeable+import Language.Haskell.TH.Syntax +import Language.Haskell.TH.Ppr+import Language.Haskell.TH.PprLib+import Text.PrettyPrint.HughesPJ (render)++-------------+-- ForSyDeErr+-------------++-- | All Errors thrown or displayed in ForSyDe+data ForSyDeErr = + -- Used in ForSyDe.ForSyDeErr + InconsistentContexts |+ -- Used in ForSyDe.Netlist+ EvalErr String |++ -- Used in ForSyDe.System.*+ -- | Not a variable name+ NonVarName Name | + -- | Incompatible system function+ IncomSysF Name Type | + -- | Incompatible input interface length + InIfaceLength (SysId,Int) ([String],Int) | + -- | Incompatible output interface length+ OutIfaceLength (SysId,Int) ([String],Int) |+ -- | Multiply defined port identifier + MultPortId PortId |+ -- | Multiply defined process identifier + MultProcId ProcId |+ -- | The system contains components from different subsystems with+ -- the same Identifiers + SubSysIdClash SysId (Maybe Loc) (Maybe Loc) |+ -- | Not a SysDef variable+ NonSysDef Name Type |++ -- Used in ForSyDe.Proc.ProcFun + -- | Incorrect Declarations provided to create a ProcFun+ IncorrProcFunDecs [Dec] |++ -- Used in ForSyDe.Netlist.Traversable + -- | Inconsistent output tag+ InconsOutTag |++ -- Used in ForSyDe.Backend.Simulate+ -- | Inconsistent System Definition Port+ InconsSysDefPort PortId | + -- | Dynamic type mismatch+ DynMisMatch Dynamic TypeRep |+ -- | Signature mismatch+ SigMisMatch Type |+ -- | Simulation input signals length mismatch+ InLengthMisMatch Int Int | ++ -- Used in ForSyDe.Backend.VHDL.*+ -- | Empty VHDL identifier+ EmptyVHDLId |+ -- | Incorrect Basic VHDL Identifier+ IncVHDLBasId String |+ -- | Incorrect Extended VHDL Identifier+ IncVHDLExtId String |+ -- | Function untranslatable to VHDL (function name and error raised)+ UntranslatableVHDLFun VHDLFunErr |+ -- | Expresion untranslatable to VHDL+ UntranslatableVHDLExp Exp VHDLExpErr |+ -- Common Backend errors + -- | UnsUpported type+ UnsupportedType TypeRep |+ -- | Reserved identifier+ ReservedId String |+ -- | Unsupported process+ UnsupportedProc |+ -- | Quartus Failed+ QuartusFailed |+ -- | Modelsim Failed+ ModelsimFailed |++ -- | Other Errors+ Other String ++-- | Function translation errors in the VHDL backend+data VHDLFunErr =+ -- | Insufficient number of parameters + InsParamNum Int |+ -- | Unsupported input pattern in function + UnsupportedFunPat Pat |+ -- | Multiple clauses+ MultipleClauses [Clause] |+ -- | Guards in case alternatives are not supported+ FunGuardedBody Body |+ -- | Where constructs in case alternatives are not supported+ FunWhereConstruct [Dec] |+ -- | A general Error which applies to a function+ -- (e.g. its name or parameters are not a VHDL identifier,+ -- an error in an inner expression ... )+ GeneralErr ForSyDeErr+++instance Show VHDLFunErr where+ show (FunGuardedBody body) = "guards are not supported in functions:\n" +++ (render.to_HPJ_Doc.(pprBody True)) body+ show (FunWhereConstruct decs) = + "where constructs are not supported in functions:\n" +++ (render.to_HPJ_Doc.where_clause) decs + show (InsParamNum n) = "insufficient number of parameters (" ++ show n ++ ")"+ show (UnsupportedFunPat pat) = + "input pattern `" ++ pprint pat ++ "' is not supported"+ show (MultipleClauses cs) = "multiple clauses (" ++ + (show.length) cs ++ "):\n" ++ pprint cs+ show (GeneralErr err) = show err++-- | Expression translation errors in the VHDL backend+data VHDLExpErr =+ -- | Guards in case alternatives are not supported+ CaseGuardedBody Body |+ -- Unsupported case pattern + UnsupportedCasePat Pat |+ -- | Where constructs in case alternatives are not supported+ CaseWhereConstruct [Dec] |+ -- | Currification not supported function arguments must be fully supplied+ CurryUnsupported Int Int |+ -- | Unkown identifier+ UnkownIdentifier Name |+ -- Unsupported literal+ UnsupportedLiteral |+ -- Sections are not supported+ Section |+ -- Lambda Abstractions are not supported+ LambdaAbstraction |+ -- Conditional expressions are only supported in a function body+ Conditional |+ -- Let expressions are not supported+ Let |+ -- Case expressions are only supported in a function body+ Case |+ -- Do expressions are not supported+ Do |+ -- List comprehensions are not supported+ ListComprehension |+ -- Arithmetic sequences are not supported+ ArithSeq |+ -- Lists are not supported+ List |+ -- Signature expressiosn are not supported+ Signature |+ -- Record expressions are not supported+ Record |+ -- Unsupported expression generic error+ -- it shouldn't be raised, just for pattern completeness+ Unsupported++instance Show VHDLExpErr where+ show (CaseGuardedBody body) = + "guards are not supported in case alternatives:\n" +++ (render.to_HPJ_Doc.(pprBody True)) body+ show (UnsupportedCasePat pat) = "unsupported case pattern: `" ++ + pprint pat ++ "'"+ show (CaseWhereConstruct decs) = + "where constructs are not supported in case alternatives:\n" +++ (render.to_HPJ_Doc.where_clause) decs + show (CurryUnsupported expected real) =+ "Currification is not supported, all arguments must be fully supplied\n"+++ " Expected arguments: " ++ show expected ++ " Provided arguments: " ++ + show real + show (UnkownIdentifier name) = "unkown identifier `" ++ pprint name ++ "'"+ show UnsupportedLiteral = "unsupported literal"+ + show Section = "sections are not supported"+ show LambdaAbstraction = "lambda abstractions are not supported"+ show Conditional = "conditional expressions are only supported within" + ++ " a function body"+ show Let = "let expressions are not supported"+ show Case = "case expressions are only supported within" + ++ " a function body"+ show Do = "do expressions are not suupported"+ show ListComprehension = "list comprehensions are not supported"+ show ArithSeq = "arithmetic sequences are not supported"+ show List = "lists are not supported" + show Signature = "signature expressions are not supported"+ show Record = "record expressions are not supported"+ show Unsupported = "unsupported expression"++-- | Show errors+instance Show ForSyDeErr where+ show InconsistentContexts = "Inconsistent contexts"+ show (EvalErr str) = "Non evaluable node (" ++ show str ++ ")"+ show (NonVarName name) = show name ++ " is not a variable name."+ show (IncomSysF fName inctype) = + "Incompatible system function type\n"+++ show strFName ++ " was expected to have type:\n" +++ " Signal i1 -> Signal i2 -> ..... -> Signal in ->\n" +++ " (Signal o1, Signal o2, ... , Signal om)\n" +++ " with n <- |N U {0} and m <- |N U {0}\n" ++ + " i1 .. in, o1 .. im monomorphic types\n" +++ "However " ++ strFName ++ " has type\n " +++ " " ++ pprint inctype+ where strFName = show fName+ show (InIfaceLength sysInInfo portIdsInInfo) =+ showIfaceLength "input interface" sysInInfo portIdsInInfo+ show (OutIfaceLength sysOutInfo portIdsOutInfo) =+ showIfaceLength "output interface" sysOutInfo portIdsOutInfo+ show (MultPortId portId) = + "Multiply defined port identifier " ++ show portId+ show (MultProcId procId) = + "Multiply defined process identifier " ++ show procId+ show (SubSysIdClash subSysId mLoc1 mLoc2) =+ "System contains components of different subsystems " ++ + "(defined at locations " ++ finalLoc1 ++ " and " ++ finalLoc2 ++ ") " +++ "which share the same system identifier (`"++subSysId++")"+ where finalLoc1 = fromMaybe "<unkown>" mLoc1+ finalLoc2 = fromMaybe "<unkown>" mLoc2 + show (NonSysDef name t) = + "A variable with SysDef type was expected\n" +++ "However " ++ show name ++ " has type " ++ pprint t+ show (IncorrProcFunDecs decs) =+ "Only a function declaration (possibly precedeeded by a signature)" ++ + "is accepted\n"++ + "The specific, incorrect declarations follow:\n" +++ pprint decs+ show InconsOutTag = "Inconsistent output tag"+ show (InconsSysDefPort id) = "Inconsistent port in SysDef: " ++ show id+ show (DynMisMatch dyn rep) = + "Type matching error in dynamic value with typerep " ++ + show (dynTypeRep dyn) +++ "\n(Expected type: " ++ show rep ++ " )."+ show (SigMisMatch t) = + "Signal mismatch: expected a Signal type but got " ++ pprint t + show (InLengthMisMatch l1 l2) = + "Cannot simulate: simulation arguments length-mismatch: " ++ + show l1 ++ " /= " ++ show l2+ show EmptyVHDLId = "Empty VHDL identifier"+ show (IncVHDLBasId id) = "Incorrect VHDL basic identifier " ++ + "`" ++ id ++ "'"+ show (IncVHDLExtId id) = "Incorrect VHDL extended identifier " ++ + "`" ++ id ++ "'"+ show (UnsupportedType tr) = "Unsupported type " ++ show tr+ show (ReservedId str) = "Identifier `" ++ str ++ "' is reserved"+ show UnsupportedProc = "Unsupported process"+ show (UntranslatableVHDLFun err) = + "Untranslatable function: " ++ show err + show (UntranslatableVHDLExp exp err) = + "Untranslatable expression `" ++ pprint exp ++ "': " ++ show err + show QuartusFailed = "Quartus failed"+ show ModelsimFailed = "Modelsim failed"+ show (Other str) = str ++-- | help function for the show instance+showIfaceLength :: String -> (SysId, Int) -> ([String],Int) -> String+showIfaceLength ifaceMsg (sysName, sysIfaceL) (ifaceIds, ifaceL) = + "Incorrect length of " ++ ifaceMsg ++ " (" ++ show ifaceL ++ ")\n" +++ " " ++ show ifaceIds ++ "\n" ++ + sysName ++ " expects an " ++ show ifaceMsg ++ " length of " +++ show sysIfaceL ++-----------------+-- Context Error+-----------------++-- | A context error: a 'ForSyDeErr' with context information (indicating where+-- the error ocurred)+data ContextErr = ContextErr Context ForSyDeErr++-- | A context: it indicates where an error ocurred.+data Context =+ -- | Empty context + EmptyC | + -- | In a System definition + SysDefC SysId (Maybe Loc) | + -- | In a Process+ ProcC SysId (Maybe Loc) ProcId | + -- | In a Proces Function+ ProcFunC SysId (Maybe Loc) ProcId Name Loc | + -- | In a Process value+ ProcValC SysId (Maybe Loc) ProcId Exp++-- | type indicating a location in the user's source+-- code+type Loc = String++-- | Set a process context from a system context+setProcC :: ProcId -- ^ Identifier of the process+ -> Context -- ^ system context+ -> Context+setProcC pid (SysDefC sysid mSysloc) = ProcC sysid mSysloc pid +setProcC _ _ = intError funName InconsistentContexts+ where funName = "ForSyDe.ForSyDeErr.setProcC" ++-- | Set a process function context from a process context +setProcFunC :: Name -- ^ Function name+ -> Loc -- ^ Function location+ -> Context -- ^ system context+ -> Context+setProcFunC name loc (ProcC sysid sysloc pid) = + ProcFunC sysid sysloc pid name loc+setProcFunC _ _ _ = intError funName InconsistentContexts+ where funName = "ForSyDe.ForSyDeErr.setProcFunC" ++-- | Set a process value context from a process context +setProcValC :: Exp -- ^ Expression value+ -> Context -- ^ system context+ -> Context+setProcValC exp (ProcC sysid sysloc pid) = ProcValC sysid sysloc pid exp+setProcValC _ _ = intError funName InconsistentContexts+ where funName = "ForSyDe.ForSyDeErr.setProcValC" ++instance Show Context where+ show EmptyC = ""+ show (SysDefC id mLoc) = "system definition `" ++ id ++ + "' (created in " ++ finalLoc ++ ")"+ where finalLoc = fromMaybe "<unkown>" mLoc+ show (ProcC sysid sysloc pid) = "process `" ++ pid ++ "' belonging to " ++ + show (SysDefC sysid sysloc)+ show (ProcFunC sysid sysloc pid fName fLoc) = + "process function `" ++ pprint fName ++ "' (created in " ++ fLoc ++ ") " +++ " used by " ++ show (ProcC sysid sysloc pid)+ show (ProcValC sysid sysloc pid valExp) =+ "process argument `" ++ pprint valExp ++ "' used by "+ ++ show (ProcC sysid sysloc pid)+ ++instance Show ContextErr where+ show (ContextErr cxt err) = case cxt of+ EmptyC -> show err+ _ -> show err ++ "\nin " ++ show cxt++--------------+-- Error Monad+--------------++-- | We make ForSyDeErr an instance of the Error class to be able to throw it+-- as an exception.+instance Error ForSyDeErr where+ noMsg = Other "An Error has ocurred"+ strMsg = Other+++instance Error ContextErr where+ noMsg = ContextErr EmptyC noMsg+ strMsg = \str -> ContextErr EmptyC (strMsg str)++-- | 'EProne' represents failure using Left ForSyDeErr or a successful +-- result of type a using Right a+-- +-- 'EProne' is implicitly an instance of +-- ['MonadError'] (@Error e => MonadError e (Either e)@)+-- ['Monad'] (@Error e => Monad (Either e)@)+type EProne = Either ForSyDeErr+-- FIXME: Rethink Eprone so that it takes contexts in account++-------------------+-- Helper functions+-------------------++-- | Throws a an error caused by improper use of a user-exported function+uError :: String -- ^ User-exported function which cuased the error + -> ForSyDeErr -- ^ Error to show+ -> a+uError funName err = error $ "User error in " ++ funName ++ ": " ++ + show err ++ "\n"+++-- | Throws an internal error+intError :: String -- ^ Function which caused the internal error + -> ForSyDeErr -- ^ Error to show+ -> a+intError funName err = error $ "Internal error in " ++ funName ++ ": " ++ + show err ++ "\n" +++ "Please report!"++-- | lift an Either expression to an Error Monad+liftEither :: MonadError e m => Either e a -> m a+liftEither = either throwError return++++-- | An error reporting function for Quasi monads+-- Executing in the monad will stop inmideately after calling qError+-- Note, it does not work for GHC<6.8+-- see <http://hackage.haskell.org/trac/ghc/ticket/1265>+qError :: Quasi m => String -- ^ The name of the function + -- called in the splice + -> ForSyDeErr -- ^ Error to show+ -> m a+qError fname err = fail $ "Error when calling " ++ fname ++ ":\n" ++ + show err+++-- | Stop execution, find the enclosing qRecover+-- if a recover is not found, it is considered as an internal error+-- and the string provided will used as a reference to +-- the origin of the error.+-- Note, it does not work for GHC<6.8+-- see <http://hackage.haskell.org/trac/ghc/ticket/1265>+qGiveUp :: Quasi m => String -> m a+qGiveUp name = fail $ "qGiveUp: Internal error in " ++ name ++ + ", please report."++-- | Output a trace message in a quasi monad (similar to 'putTraceMsg')+qPutTraceMsg :: Quasi m => String -> m ()+qPutTraceMsg msg = qRunIO (putTraceMsg msg)+++-- | Print an Error+printError :: Show a => a -> IO ()+printError = putStrLn.("Error: "++).show++-- | Print a VHDL compilation error+printVHDLError :: Show a => a -> IO b+printVHDLError = error.("VHDL Compilation Error: "++).show++-- | Print a GraphML compilation error+printGraphMLError :: Show a => a -> IO ()+printGraphMLError = putStrLn.("VHDL Compilation Error: "++).show
+ src/ForSyDe/Ids.hs view
@@ -0,0 +1,23 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Ids+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- ForSyDe identifier types+--+-----------------------------------------------------------------------------+module ForSyDe.Ids where++-- | A process identifier+type ProcId = String++-- | A Port identifier+type PortId = String++-- | A System identifier+type SysId = String
+ src/ForSyDe/Netlist.hs view
@@ -0,0 +1,251 @@+{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Netlist+-- Copyright : (c) Sam Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides a definition for the netlist of a system description, +-- which is used as the intermediate representation of the embedded compiler.+-- +-- The netlist is modelled as a directed cyclic graph whose nodes +-- are shared using Observable Sharing ("ForSyDe.OSharing").+--+-- /This module is based on Lava2000/: <http://www.cs.chalmers.se/~koen/Lava/>+-- +-----------------------------------------------------------------------------++module ForSyDe.Netlist where+++import ForSyDe.Ids+import ForSyDe.OSharing (URef, newURef, readURef)+import {-# SOURCE #-} ForSyDe.System.SysDef + (SysDef(..), PrimSysDef(..), oIface)+import ForSyDe.Process.ProcFun (TypedProcFun(..))+import ForSyDe.ForSyDeErr+import ForSyDe.Process.ProcVal (ProcVal(..))++import Data.Dynamic+++-----------+-- Netlist+-----------+++-- | The netlist of a system is modelled as a directed cyclic graph but is+-- really equivalently implemented as a set of (possibly overlapping) trees+-- capable of sharing nodes between them.+--+-- There is no specific data structure for the netlist itself. Instead, a+-- netlist is simply represented by its outputs. Each output is the root node+-- of a tree ('NlTree'). The NlTrees can (and probably will) have common nodes.+--+-- It is important to note that, due to the use of trees, the only way to+-- traverse a 'Netlist' is from its outputs to its inputs.++newtype Netlist container = Netlist {netlistOuts :: (container NlTree)}++++----------+-- NlNode+----------++-- | A node of the netlist can be either a process, component instances or+-- special nodes to help traversing the graph. +--+-- Since the netlist graph is implemented with trees, they only store+-- information about their inputs (which are their child nodes in the tree).++data NlNode inputi =+ -- Ports+ InPort PortId | -- ^ Input Ports of the system + -- Processes+ Proc ProcId (NlProc inputi)+++-- | A process node+-- Note that vectors and transformed to lists puls an Int parameter +-- indicating its size+data NlProc inputi =+ -- Constant signal + Const ProcVal | -- ^ A signal with constant value+ -- During all its periods + + -- | mapSY and zipWithSY processes+ ZipWithNSY (TypedProcFun Dynamic) -- Process function in dynamic form+ [inputi] | + + -- | Vector version of zipWithNSY+ ZipWithxSY (TypedProcFun ([Dynamic] -> Dynamic)) -- Process function + -- with dynamic arguments + [inputi] | + + -- ^ Inverse of ZipWithNSY+ UnzipNSY [TypeRep] -- Type of the elements in the input tuple+ -- (type of outputs)+ (Dynamic -> [Dynamic]) -- Dynamic version of the unzipping function+ -- for the concrete, monomorphic types+ -- of the process+ inputi | + + -- | Vector version of UnzipSY+ UnzipxSY TypeRep -- Type of elements in the input vector+ -- (and type of the outputs)+ Int -- Size of output vector (Number of output signals)+ (Dynamic -> [Dynamic]) + inputi | ++ -- | delaySY process+ DelaySY ProcVal inputi | + + -- A System Instance is considered a special process+ + -- | System Instance+ SysIns PrimSysDef [inputi] + + ++---------+-- NlEdge+---------++-- FIXME: The NLNodeOut should merely be an integer++-- | The node connection is carried out by directed edges modelled as +-- Unsafe Unmutable References (allowing to share nodes) connected +-- in the output->input direction (remember we are using trees). +-- Since the node to which the edge is directed can have various outputs +-- (e.g a system instance) the edge is tagged to indicate to what +-- output it refers to.+data NlEdge node = NlEdge (ForSyDe.OSharing.URef node) NlNodeOut+ ++-- FIXME: output tags are ugly, create a variant of NlNode which takes outputs in account++-- | The different outputs which the different nodes can have+data NlNodeOut = InPortOut |+ ConstOut |+ ZipWithNSYOut |+ ZipWithxSYOut |+ UnzipNSYOut Int |+ UnzipxSYOut Int |+ DelaySYOut |+ SysInsOut PortId + deriving (Show, Eq) ++-- | Get the output tags of a node+outTags :: NlNode a -> [NlNodeOut]+outTags (InPort _) = [InPortOut]+outTags (Proc _ proc) =+ case proc of+ Const _ -> [ConstOut]+ ZipWithNSY _ _ -> [ZipWithNSYOut]+ ZipWithxSY _ _ -> [ZipWithxSYOut] + UnzipNSY types _ _ -> map UnzipNSYOut [1..length types]+ UnzipxSY _ nout _ _ -> map UnzipxSYOut [1..nout]+ DelaySY _ _ -> [DelaySYOut]+ SysIns primSysDefRef _ -> + map (SysInsOut . fst) ((oIface . readURef . unPrimSysDef) primSysDefRef)++ ++------------+-- NlTree+------------++-- | We tie the knot to connect nodes through 'NlEdge's, building a Tree which+-- can have shared nodes. +--+-- That is done by storing 'NlTree's as the the input information of each node+-- of the tree. Child nodes of the tree are closer to the inputs of the system+-- and parents are closer to the outputs.++newtype NlTree = NlTree {rootEdge :: (NlEdge (NlNode NlTree))}++-----------+-- NlSignal+-----------++-- | A 'NlTree', or more preciselly its root 'NlEdge', is after all, how+-- signals are implemented in the netlist.+type NlSignal = NlTree++-- | Get the tag of a signal+nlSignalNlOut :: NlSignal -> NlNodeOut+nlSignalNlOut (NlTree (NlEdge _ tag)) = tag++---------+-- Signal+---------+++-- | A signal can be seen as wire which carries values of certain type +-- and which can be connected and processed by the two computational +-- entities of a ForSyDe system: processes and block instances.+--++-- A Signal is internally represented as an edge of the graph representing+-- the system netlist. +-- The phantom type parameter ensures type-consistency for the signal+-- processing functions. ++newtype Signal a = Signal {unSignal :: NlSignal}+ deriving Typeable+++-------------------+-- Helper functions+-------------------++-- FIXME: All these newWhatever functions probably shouldn't be here++-- | Generate a signal pointing to an 'InPort' node+newInPort :: PortId -> NlSignal+newInPort id = NlTree (NlEdge (newURef (InPort id)) InPortOut)+++-- | Generate a reference to a new 'SysIns' node+newSysIns :: ProcId -> SysDef a -> [NlSignal] + -> URef (NlNode NlSignal)+newSysIns id (SysDef primSysDef) inputInfo = + newURef (Proc id (SysIns primSysDef inputInfo)) ++-- | Generate the output signal of a node+newNodeOutSig :: URef (NlNode NlSignal) -- ^ Reference to the node + -> NlNodeOut -- ^ Output tag+ -> NlSignal+newNodeOutSig ref mTag = NlTree (NlEdge ref mTag)+++-- | Evaluate the output of a process within a synchronous period+-- The inputs and outputs are given in dynamic form+eval :: NlNode Dynamic -> [(NlNodeOut, Dynamic)]+eval node = case node of+ InPort _ -> intError evalStr (EvalErr "InPort")+ Proc _ proc -> case proc of+ Const pv -> [(ConstOut, dyn pv)]+ ZipWithNSY fun dynArgs+ -> [(ZipWithNSYOut, foldl1 dynApp ((tval fun) : dynArgs))] + ZipWithxSY fun dynListArg+ -> [(ZipWithxSYOut, (tval fun) dynListArg)]+ UnzipNSY _ fun dynArg+ -> zipWith (\n dyn -> (UnzipNSYOut n, dyn))+ [1..] + (fun dynArg) + UnzipxSY _ _ fun dynArg+ -> zipWith (\n dyn -> (UnzipxSYOut n, dyn))+ [1..] + (fun dynArg) + DelaySY _ _ + -> intError evalStr (EvalErr "DelaySY")+ SysIns _ _ + -> intError evalStr (EvalErr "SysIns")+ + where evalStr = "ForSyDe.Netlist.eval"
+ src/ForSyDe/Netlist/Traverse.hs view
@@ -0,0 +1,194 @@+{-# LANGUAGE ScopedTypeVariables #-} +-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Netlist.Traverse+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (LSTV)+--+-- This module provides traversing operations for 'ForSyDe.Netlist'+--+--+-- /This module is based on Lava2000/: <http://www.cs.chalmers.se/~koen/Lava/>+-- +-----------------------------------------------------------------------------+module ForSyDe.Netlist.Traverse where+++import ForSyDe.Netlist+import ForSyDe.OSharing+import ForSyDe.ForSyDeErr+++import Data.Maybe (fromMaybe)+-- qualified to avoid nameclash+import qualified Data.Foldable as DF (Foldable(foldMap), toList)+import Data.Monoid (mempty)+-- qualified to avoid nameclash+import qualified Data.Traversable as DT (Traversable(traverse,mapM)) +import Control.Applicative (pure, (<$>))+import Control.Monad.State+import Data.List (lookup)+import Control.Monad.ST (ST)++-- Instances to traverse a netlist Node (and implicitly the whole netlist)++instance DF.Foldable NlProc where+ foldMap _ (Const _) = mempty + foldMap f (ZipWithNSY _ is) = DF.foldMap f is+ foldMap f (ZipWithxSY _ is) = DF.foldMap f is+ foldMap f (UnzipNSY _ _ i) = f i+ foldMap f (UnzipxSY _ _ _ i) = f i + foldMap f (DelaySY _ i) = f i+ foldMap f (SysIns _ i) = DF.foldMap f i++++instance DF.Foldable NlNode where+ foldMap _ (InPort _) = mempty+ foldMap f (Proc _ proc) = DF.foldMap f proc++instance Functor NlProc where+ fmap _ (Const val) = Const val+ fmap f (ZipWithNSY pf is) = ZipWithNSY pf (fmap f is)+ fmap f (ZipWithxSY pf is) = ZipWithxSY pf (fmap f is)+ fmap f (UnzipNSY ts pf i) = UnzipNSY ts pf (f i)+ fmap f (UnzipxSY t n pf i) = UnzipxSY t n pf (f i) + fmap f (DelaySY c i) = DelaySY c (f i)+ fmap f (SysIns def is) = SysIns def (fmap f is)++++instance Functor NlNode where+ fmap _ (InPort id) = InPort id+ fmap f (Proc id proc) = Proc id (fmap f proc) ++instance DT.Traversable NlProc where+ traverse _ (Const val) = pure (Const val) + traverse f (ZipWithNSY pf is) = ZipWithNSY pf <$> DT.traverse f is+ traverse f (ZipWithxSY pf is) = ZipWithxSY pf <$> DT.traverse f is+ traverse f (UnzipNSY ts pf i) = UnzipNSY ts pf <$> f i+ traverse f (UnzipxSY t n pf i) = UnzipxSY t n pf <$> f i+ traverse f (DelaySY c i) = DelaySY c <$> f i+ traverse f (SysIns def is) = SysIns def <$> DT.traverse f is+++++instance DT.Traversable NlNode where+ traverse _ (InPort id) = pure (InPort id)+ traverse f (Proc id proc) = Proc id <$> DT.traverse f proc +++-- | Traversing monad, stacking state and error transformers over IO+type TravSEIO s e a = (StateT s (ErrorT e IO)) a++++-- | traverseSIO traverses a netlist and returns a final user-defined +-- traversing state (@s@) given:+-- new: generates a new (and normally unique) tag for the outputs of each +-- netlist node given the traversing state (which is possibly updated +-- as well).+-- define: given the output tags of a node, current iteration state, +-- and the output tags of its children, @define@+-- generates the netlist of that node, possibly updating +-- the traversing state+-- FIXME: shoudn't the arguments of define go the other way around?+-- first inputs then outputs.+-- FIXME: why are tags needed in define? [oinfo] should be enough.+-- tags are ugly in general (see the pattern matches) fix this problem.+traverseSEIO :: (DT.Traversable container, Error e) => + (NlNode NlSignal -> TravSEIO s e [(NlNodeOut, oinfo)]) -- ^ new+ -> ([(NlNodeOut, oinfo)] -> NlNode oinfo -> TravSEIO s e ()) -- ^ define+ -> Netlist container + -> TravSEIO s e (container oinfo)+traverseSEIO new define (Netlist rootSignals) =+ do uRefTable <- liftIO $ newURefTableIO++ let gather (NlTree (NlEdge nodeRef tag)) =+ do visited <- liftIO $ queryIO uRefTable nodeRef+ case visited of+ Just infoPairs -> return (specifyOut tag infoPairs)+ Nothing -> do + let node = readURef nodeRef+ infoPairs <- new node+ liftIO $ addEntryIO uRefTable nodeRef infoPairs+ childInfo <- DT.mapM gather node+ define infoPairs childInfo+ return (specifyOut tag infoPairs)++ specifyOut :: NlNodeOut -> [(NlNodeOut, a)] -> a+ specifyOut tag pairs = fromMaybe err maybeOut+ where funName = "ForSyDe.NetList.Traverse.traverseIO"+ err = intError funName InconsOutTag+ maybeOut = lookup tag pairs++ DT.mapM gather rootSignals++-- | Traversing monad, stacking state and error transformers over ST+type TravSEST s e st a = (StateT s (ErrorT e (ST st))) a++-- | 'ST'-monad version of 'traverseSEIO'+traverseSEST :: (DT.Traversable container, Error e) => + (NlNode NlSignal -> TravSEST s e st [(NlNodeOut, oinfo)]) -- ^ new+ -> ([(NlNodeOut, oinfo)] -> NlNode oinfo -> TravSEST s e st ()) -- ^ define+ -> Netlist container + -> TravSEST s e st (container oinfo)+traverseSEST new define (Netlist rootSignals) =+ do let lift2 = lift.lift+ uRefTable <- lift2 $ newURefTableST+ let gather (NlTree (NlEdge nodeRef tag)) =+ do visited <- lift2 $ queryST uRefTable nodeRef+ case visited of+ Just infoPairs -> return (specifyOut tag infoPairs)+ Nothing -> do + let node = readURef nodeRef+ infoPairs <- new node+ lift2 $ addEntryST uRefTable nodeRef infoPairs+ childInfo <- DT.mapM gather node+ define infoPairs childInfo+ return (specifyOut tag infoPairs)++ specifyOut :: NlNodeOut -> [(NlNodeOut, a)] -> a+ specifyOut tag pairs = fromMaybe err maybeOut+ where funName = "ForSyDe.NetList.Traverse.traverseIO"+ err = intError funName InconsOutTag+ maybeOut = lookup tag pairs++ DT.mapM gather rootSignals++-- deprecated, do not use+traverseST :: DT.Traversable container => + (NlNode NlSignal -> ST s [(NlNodeOut, oinfo)]) + -> ([(NlNodeOut, oinfo)] -> NlNode oinfo -> ST s ()) + -> Netlist container + -> ST s (container oinfo)+traverseST new define (Netlist rootSignals) =+ do uRefTable <- newURefTableST++ let gather (NlTree (NlEdge nodeRef tag)) =+ do visited <- queryST uRefTable nodeRef+ case visited of+ Just infoPairs -> return (specifyOut tag infoPairs)+ Nothing -> do let node = readURef nodeRef+ infoPairs <- new node+ addEntryST uRefTable nodeRef infoPairs+ childInfo <- DT.mapM gather node+ define infoPairs childInfo+ return (specifyOut tag infoPairs)++ specifyOut :: NlNodeOut -> [(NlNodeOut, a)] -> a+ specifyOut tag pairs = fromMaybe err maybeOut+ where funName = "ForSyDe.NetList.Traverse.traverseST"+ err = intError funName InconsOutTag+ maybeOut = lookup tag pairs++ DT.mapM gather rootSignals++-- | Obtain the arguments of a node+arguments :: NlNode a -> [a]+arguments = DF.toList
+ src/ForSyDe/OSharing.hs view
@@ -0,0 +1,207 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.OSharing+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides support for Observable Sharing: <http://www.cs.chalmers.se/~koen/pubs/entry-asian99-lava.html>+-- +-- It provides:+--+-- * 'URef': Unsafe Unmutable references, using them causes side effects.+--+-- * 'URefTable': a table were 'URef's are used as key and can store+-- any value.+-- +-- /This Module was taken from Lava2000's/ @Ref.hs@ /module/:+-- <http://www.cs.chalmers.se/~koen/Lava/>+-- +-- IMPORTANT WARNING: Even if all the functions causing side effects+-- are set as NOINLINE and that all currently known+-- Haskell compilers are based in graph reduction+-- (i.e. referential transparency will be preserved if +-- sharing is), there are other optimisations than inlining+-- that can break Observable Sharing, e.g. Common +-- Subexpression Elimination (CSE).+-----------------------------------------------------------------------------+module ForSyDe.OSharing+ ( -- Unsafe references+ URef, + newURef, + readURef, + -- Tables of Unsafe References (IO version)+ URefTableIO, + newURefTableIO, + addEntryIO, + queryIO,+ -- Tables of Unsafe References (IO version)+ URefTableST,+ newURefTableST,+ addEntryST,+ queryST,+ -- Memoizating functions+ memoURef,+ memoURefIO,+ memoURefST)+ where++import ForSyDe.OSharing.UDynamic++import System.IO (fixIO)+import System.IO.Unsafe (unsafePerformIO)+import Data.IORef (IORef, newIORef, readIORef, writeIORef)+import Control.Monad.ST++++-- | An Unsafe Unmutable Reference to a value of type a +--+-- An 'URef' is implemented as follows: it has two pieces of information. The+-- first one is an updatable list of entries for each table it is a member in.+-- Since the types of the Tables vary, the URef has no idea what type of+-- values it is supposed to store. So we use dynamic types.+--+-- Since it is an updatable list, it is an IORef, which we also use to compare+-- two 'URef's. The second part is just the value the URef is pointing at (this+-- can never change anyway since references are unmutable).+--+-- FIXME: why IORef? it should maybe be STRef?+-- Besides: Is it guaranteed that the values of an IORef+-- are not changed by the garbage collector?+data URef a+ = URef (IORef [(URefTableTag, UDynamic)]) a++instance Eq (URef a) where+ URef r1 _ == URef r2 _ = r1 == r2++instance Show a => Show (URef a) where+ showsPrec _ (URef _ a) = showChar '{' . shows a . showChar '}'+++-- | Create a new Unsafe Unmutable Reference to a Haskell object+--+-- This operation, as explained in the Observable sharing paper, can cuase+-- side-effects, since the value returned (the 'URef') is not determined by+-- the arguments of the function (i.e. different calls to 'newURef' with+-- the same argument return different 'URef's). +newURef :: a -> URef a+newURef a = unsafePerformIO $+ do r <- newIORef []+ return (URef r a)+{-# NOINLINE newURef #-}++-- | Read the value pointed by the 'URef'.+readURef :: URef a -> a+readURef (URef _ a) = a++--------------+-- URefTableIO +--------------++-- | A unique identifier which univocally designates a table +type URefTableTag+ = IORef ()+++-- | A 'URefTable' a b +-- +-- * Unsafe References to a value of type "a" (key of the table)+-- * Values of type "b" associated to each key+-- +-- Here is how we implement Tables of URefs:+--+-- A Table is nothing but a unique tag, of type TableTag. TableTag can be+-- anything, as long as it is easy to create new ones, and we can compare them+-- for equality. (I chose IORef ()).+--+-- So how do we store URefs in a Table? We do not want the Tables keeping+-- track of their URefs (which would be disastrous when the table becomes big,+-- and we would not have any garbage collection).+--+-- Instead, every URef keeps track of the value it has in each table it is+-- in. This has the advantage that we have a constant lookup time (if the+-- number of Tables we are using is small), and we get garbage collection of+-- table entries for free.+newtype URefTableIO a b+ = URefTableIO URefTableTag+ deriving Eq++-- | Create a new table+newURefTableIO :: IO (URefTableIO a b)+newURefTableIO = URefTableIO `fmap` newIORef ()++-- | Query the value corresponding to an 'URef' +queryIO :: URefTableIO a b -> URef a -> IO (Maybe b)+queryIO (URefTableIO t) (URef r _) =+ do list <- readIORef r+ return (unsafeFromUDyn `fmap` lookup t list)++-- | Add an ('URef' a, b) pair entry to the table +addEntryIO :: URefTableIO a b -- ^ key of the entry + -> URef a + -> b -- ^ value of the entry + -> IO () +addEntryIO (URefTableIO t) (URef r _) b =+ do list <- readIORef r+ writeIORef r ((t, unsafeToUDyn b) : filter ((/= t) . fst) list)++--------------+-- URefTableST+--------------++-- | 'ST' version of 'URefTableIO'+newtype URefTableST s a b+ = URefTableST (URefTableIO a b)+ deriving Eq++-- | 'ST' version of 'newURefTableIO'+newURefTableST :: ST s (URefTableST s a b)+newURefTableST = unsafeIOToST (URefTableST `fmap` newURefTableIO)++-- | 'ST' version of 'queryIO'+queryST :: URefTableST s a b -> URef a -> ST s (Maybe b)+queryST (URefTableST tab) r = unsafeIOToST (queryIO tab r)++-- | 'ST' version of 'addEntryIO'+addEntryST :: URefTableST s a b -> URef a -> b -> ST s ()+addEntryST (URefTableST tab) r b = unsafeIOToST (addEntryIO tab r b)++--------------------------------+-- Memoization of URef functions+--------------------------------++-- | Generates a memoizated version of a function taking 'URef' values +memoURef :: (URef a -> b) -> (URef a -> b)+memoURef f = unsafePerformIO . memoURefIO (return . f)+{-# NOINLINE memoURef #-}++-- | 'IO' version of 'memoURef'+memoURefIO :: (URef a -> IO b) -> (URef a -> IO b)+memoURefIO f = unsafePerformIO $+ do tab <- newURefTableIO+ let f' r = do mb <- queryIO tab r+ case mb of+ Just b -> do return b+ Nothing -> fixIO $ \b ->+ do addEntryIO tab r b+ f r+ return f'+{-# NOINLINE memoURefIO #-}++-- | 'ST' version of 'memoURef'+memoURefST :: (URef a -> ST s b) -> (URef a -> ST s b)+memoURefST f = unsafePerformST $+ do tab <- newURefTableST+ let f' r = do mb <- queryST tab r+ case mb of+ Just b -> do return b+ Nothing -> fixST $ \b ->+ do addEntryST tab r b+ f r+ return f'+ where unsafePerformST = unsafePerformIO . unsafeSTToIO+{-# NOINLINE memoURefST #-}
+ src/ForSyDe/OSharing/UDynamic.hs view
@@ -0,0 +1,54 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.OSharing+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (GHC libraries)+--+-- This module provides support for unsafe dynamic typing.+--+-- Use with care. Normally, "Data.Dynamic" is preferred since it provides a+-- safe casting operation thanks to the use of "Data.Typeable". +--+-- /This module is based on Lava2000/: <http://www.cs.chalmers.se/~koen/Lava/>+-- +-----------------------------------------------------------------------------+module ForSyDe.OSharing.UDynamic + (UDynamic, + unsafeToUDyn,+ unsafeFromUDyn)+ + where++import Unsafe.Coerce (unsafeCoerce)+import GHC.Base (Any)++-- | A value of type 'UDynamic' (from Unsafe Dynamic) can+-- implicitly any Haskell value. +--+-- It is unsafe because, as opposed to 'Data.Dynamic', +--- it does not encapsule type information and does+-- it makes unsafe to cast a 'UDynamic' back to its original Haskell type.+data UDynamic = UDynamic Any++-- | Converts an arbitrary value into an object of type 'UDynamic'.+-- It is unsafe because it does not provide type information during the +-- transformation+unsafeToUDyn :: a -> UDynamic+unsafeToUDyn a = UDynamic (unsafeCoerce a)++-- | Converts a 'UDynamic' object back into an ordinary Haskell value.+-- It is unsafe because there is no way to unsure converting+-- back to the correct original Haskell type. Thus, this+-- function should be used with care since it can cuase disastrous errors.+-- +-- e.g. disastrousCast :: a -> b+-- disastrousCast = unsafeToDyn . unsafeFromDyn+--+-- The following program would coredump+-- main = putStr (disastrousCast 1 :: String) +unsafeFromUDyn :: UDynamic -> a+unsafeFromUDyn (UDynamic obj) = unsafeCoerce obj
+ src/ForSyDe/Process.hs view
@@ -0,0 +1,24 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Process+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Publicly usable functions to create primitive processes. (Reexports +-- "ForSyDe.Process.SynchProc")+-- +-----------------------------------------------------------------------------+module ForSyDe.Process + (ProcFun, newProcFun, defArgVal, defArgPF,+ ProcType,+ module ForSyDe.Process.SynchProc) where++import ForSyDe.Process.ProcFun (ProcFun, newProcFun, defArgVal, defArgPF)++import ForSyDe.Process.SynchProc +import ForSyDe.Process.ProcType (ProcType)+import ForSyDe.Process.ProcType.Instances ()
+ src/ForSyDe/Process/ProcFun.hs view
@@ -0,0 +1,163 @@+{-# LANGUAGE TemplateHaskell #-} +-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Process.ProcFun+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- This module provides a type ('ProcFun') to store the functions passed+-- to process constructors.+--+----------------------------------------------------------------------------- +module ForSyDe.Process.ProcFun + (ProcFun(..),+ ProcFunAST(..),+ newProcFun, + defArgVal,+ defArgPF,+ TypedProcFun(..),+ TypedProcFunAST(..),+ procFun2Dyn,+ contProcFun2Dyn,+) where++import ForSyDe.Process.ProcType+import ForSyDe.Process.ProcVal (ProcValAST, mkProcValAST)+import ForSyDe.ForSyDeErr++import Language.Haskell.TH+import Language.Haskell.TH.Syntax+import Language.Haskell.TH.LiftInstances ()+import Data.Dynamic+import Data.Maybe (fromJust)+import Data.Set (Set)+-----------+-- ProcFun+-----------++-- | A Process Function +data ProcFun a = + ProcFun {val :: a, -- ^ Value of the function+ pfloc :: Loc, -- ^ where was it created+ ast :: ProcFunAST} -- ^ AST of the function++++-- | A process Function AST+data ProcFunAST = + ProcFunAST {name :: Name, -- ^ Function Name + -- (FIXME: maybe just a String?) + cls :: [Clause], -- ^ Function clauses + pars :: [DefArg]} -- ^ Default parameters+++-- | A process Function default argument+-- Either a process function AST or a value AST+data DefArg = FunAST ProcFunAST | ValAST ProcValAST++++-- | Sets a default value for an argument of the process function+defArgVal :: (Lift a, ProcType a) => ProcFun (a -> b) -> a -> ProcFun b+-- FIXME: inneficient, use a queue data structure+defArgVal pf v = + pf{ ast = astPF {pars = ((pars astPF) ++ [ValAST (mkProcValAST v)])}, + val = (val pf) v} + where astPF = ast pf++-- | Sets a default value for an argument of the process function +-- when the argument is a process function itself+defArgPF :: ProcFun (a -> b) -> ProcFun a -> ProcFun b+defArgPF pf v = pf{ ast = astPF {pars = ((pars astPF) ++ [FunAST (ast v)])}, + val = (val pf) (val v)} + where astPF = ast pf + +-- | Template Haskell constructor for 'ProcFun', here is an example on how to use it+--+-- @+-- plus1Fun :: ProcFun (Int -> Int)+-- plus1Fun = $(newProcFun [d| plus1 :: Int -> Int+-- plus1 n = n + 1 |])+-- @+newProcFun :: Q [Dec] -> ExpQ+newProcFun fDecQs = do + fDecs <- fDecQs + -- Check for the declarations to be correct+ (name, cls) <- recover (currErr $ IncorrProcFunDecs fDecs) + (checkDecs fDecs)+ -- Generate the main expression+ errInfo <- qCurrentModule+ exp <- [| let fName = name+ fClauses = cls + in ProcFun $(varE name)+ errInfo + (ProcFunAST fName fClauses []) |]+ -- Add the function declarations to the expression+ return $ LetE fDecs exp + where currErr = qError "newProcFun"++----------------+-- TypedProcFun+----------------+++-- | A ProcFun bundled with its type representation. This type is not+-- exported to the end user. Only used internally.+data TypedProcFun a = + TypedProcFun {tval :: a, -- ^ Value of the function+ tpfloc :: Loc,+ tast :: TypedProcFunAST} -- ^ AST of the function+++-- | A ProcFunAST bundled with its type representation:+-- Why a TypeRep and not the Type provided by Template Haskell?+-- We could use the type signature provided by TH but ...+-- 1) We don't want to force the user to provide a signature+-- 2) We don't want to handle polymorphic types. We just want the+-- monomorphic type used by the process using the procfun.+-- Why not just including the 'TypeRep' in ProcFunAST?+-- We need the context of the process to know what monomorphic types are +-- going to be used. Thus it is imposible to guess the TypeRep within+-- the code of newProcFun.+data TypedProcFunAST = + TypedProcFunAST {tptyp :: TypeRep, -- function type+ tpEnums :: Set EnumAlgTy, -- enumerated types associated + -- with the function+ tpast :: ProcFunAST}++-- | transform a ProcFun into a Dynamic TypedProcFun+procFun2Dyn :: Typeable a => Set EnumAlgTy -> ProcFun a -> TypedProcFun Dynamic+procFun2Dyn s (ProcFun v l a) = + TypedProcFun (toDyn v) l (TypedProcFunAST (typeOf v) s a)++-- FIXME: probably not needed+-- | tranform the arguments and return value of+-- a ProcFun to dynamic+contProcFun2Dyn :: (Typeable1 container,+ Typeable b,+ Functor container, + Typeable a) =>+ Set EnumAlgTy ->+ ProcFun (container a -> b) -> + TypedProcFun (container Dynamic -> Dynamic)+contProcFun2Dyn s (ProcFun v l a) = + TypedProcFun (fmapDyn v) l (TypedProcFunAST (typeOf v) s a)+ where fmapDyn f cont = toDyn (f (fmap (fromJust.fromDynamic) cont)) +++----------------------------+-- Internal Helper Functions+----------------------------++-- | Check the decarations passed to newProcFun to be correct+checkDecs :: [Dec] -> Q (Name, [Clause])+checkDecs [FunD name2 cls] = return (name2, cls) +-- in case a signature is provided+checkDecs [SigD name1 _, FunD name2 cls] | name1 == name2 = + return (name1, cls) +checkDecs _ = qGiveUp name+ where name = "ForSyDe.Process.ProcFun.checkDecs"
+ src/ForSyDe/Process/ProcType.hs view
@@ -0,0 +1,196 @@+{-# LANGUAGE TemplateHaskell #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Process.ProcType+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (non-standard instances)+--+-- This module includes and exports, the internal definition, instantiations+-- and related types of 'ProcType', a class used to constrain the arguments+-- taken by process constructors.+----------------------------------------------------------------------------- +module ForSyDe.Process.ProcType (+ EnumAlgTy(..), + ProcType(..), + genTupInstances) where++import Control.Monad (replicateM)+import Data.List (intersperse)+import Data.Generics+import Data.Set (Set, union)+import Language.Haskell.TH+import Language.Haskell.TH.Syntax (Lift(..))+import Text.ParserCombinators.ReadP++-- | Data type describing an algebraic enumerated type (i.e. an algrebraic +-- type whose data constructors have arity zero)+data EnumAlgTy = EnumAlgTy String [String] + deriving Show++instance Eq EnumAlgTy where+ (EnumAlgTy d1 _) == (EnumAlgTy d2 _) = d1 == d2++instance Ord EnumAlgTy where+ (EnumAlgTy d1 _) `compare` (EnumAlgTy d2 _) = d1 `compare` d2++-- | Class used to constrain the arguments (values and 'ProcFun's) taken by+-- process constructors+class (Data a, Lift a) => ProcType a where+ -- | Get the associated enumerated type-definitions of certain value, + -- taking nesting in account. + -- + -- For example: + --+ -- + -- > module MyMod where+ -- >+ -- > data Colour = Blue | Red+ -- > deriving (Data, Typeable)+ -- > data Shapes = Circle | Square+ -- > deriving (Data, Typeable)+ -- >+ -- > getEnums (Prst Blue, Circle) = + -- > fromList [EnumAlgTy "MyMod.Colour" ["Blue", "Red"],+ -- > EnumAlgTy "MyMod.Shapes" ["Circle", "Square"]]+ getEnums :: a -> Set EnumAlgTy+ -- | Read a process type+ readProcType :: ReadP a++-- Function to automatically generate ProcType, Data, Lift and+-- Typeable instances for tuples (with 2 or more elements) with+-- Template Haskell. For example, in the case of 2 elements, the code+-- generated would be:+--+-- @+-- instance (ProcType o1, ProcType o2) => ProcType (o1, o2) where+-- getEnums _ = getEnums (undefined :: a) `union` getEnums (undefined :: b) +-- readProcType = do+-- skipSpaces >> char '('+-- o1 <- readProcType+-- skipSpaces >> char ','+-- o2 <- readProcType+-- skipSpaces >> char ')'+-- return (o1,o2)+--+-- The next two are only necessary for tuples with more than 7 elements+--+-- instance (Typeable o1, Typeable o2) => Typeable (o1, o2) where+-- typeOf _ = mkTyCon "," `mkTyConApp` +-- [typeOf (undefined :: o1), typeOf (undefined :: o2)]+--+-- instance (Data o1, Data o2) => Data (o1, o2) where+-- gfoldl k z (o1, o2) = z (,) `k` o1 `k` o2+-- gunfold k z _ = k (k (z (,) ))+-- toConstr a = mkConstr (dataTypeOf a) "(,)" [] Prefix+-- dataTypeOf a = mkDataType "Data.Tuple.(,)" [toConstr a]+--+-- FIXME: This won't be necessary once the Data a => Lift a instance is created+--+-- instance (Lift o1, Lift o2) => Lift (o1, o2) where+-- lift (o1, o2) = tupE [lift o1, lift o2]+-- @+genTupInstances :: Int -- ^ number of outputs to generate+ -> Q [Dec]+genTupInstances n = do+ -- Generate N o names+ outNames <- replicateM n (newName "o")+ let tupType = foldl accumApp (tupleT n) outNames+ accumApp accumT vName = accumT `appT` varT vName + if n <= 7 + then sequence [genProcTypeIns outNames tupType]+ else sequence [genTypeableIns outNames tupType,+ genDataIns outNames tupType]+ -- genLiftIns outNames tupType,+ --genProcTypeIns outNames tupType]++ where + undef t = sigE [| undefined |] (varT t)+ genProcTypeIns :: [Name] -> Q Type -> Q Dec+ genProcTypeIns names tupType = do+ let getEnumsExpr = + foldr1 (\e1 e2 -> infixE (Just e1) + (varE 'union)+ (Just e2) )+ (map (\n -> varE 'getEnums `appE` undef n) names) + getEnumsD = funD 'getEnums [clause [wildP] (normalB getEnumsExpr) []] + readProcTypeExpr = doE $ + noBindS [| skipSpaces >> char '(' |] : + (intersperse (noBindS [| skipSpaces >> char ',' |]) + (map (\n -> bindS (varP n) [| readProcType |]) names) +++ [noBindS [| skipSpaces >> char ')' |],+ noBindS [| return $(tupE $ map varE names) |] ] )+ readProcTypeD = funD 'readProcType + [clause [] (normalB readProcTypeExpr) []]+ procTypeCxt = map (\vName -> conT ''ProcType `appT` varT vName) names +++ map (\vName -> conT ''Data `appT` varT vName) names +++ map (\vName -> conT ''Lift `appT` varT vName) names+ instanceD (cxt procTypeCxt) + (conT ''ProcType `appT` tupType) + [getEnumsD, readProcTypeD]+ genDataIns :: [Name] -> Q Type -> Q Dec+ genDataIns names tupType = do+ k <- newName "k"+ c <- newName "c"+ z <- newName "z"+ a <- newName "a"+ let tupCons = conE tupName+ tupName = tupleDataName n+ gfoldlExpr = foldl (\acum n -> infixE (Just acum)+ (varE k)+ (Just $ varE n))+ (varE z`appE` tupCons) + names + gfoldlD = funD 'gfoldl + [clause [varP k, varP z, tupP (map varP names)] + (normalB gfoldlExpr) []] + gunfoldExpr = let nKs 0 = (varE z `appE` tupCons)+ nKs n = varE k `appE` (nKs (n-1))+ in nKs n+ gunfoldD = funD 'gunfold + [clause [varP k, varP z, wildP] (normalB gunfoldExpr) []] + toConstrExpr = [| mkConstr (dataTypeOf $(varE a))+ $(litE $ stringL (nameBase tupName))+ [] + Prefix |]+ toConstrD = funD 'toConstr+ [clause [varP a] (normalB toConstrExpr) []]+ dataTypeOfExpr = [| mkDataType $(litE $ stringL (show tupName)) + [toConstr $(varE a)] |] + dataTypeOfD = funD 'dataTypeOf+ [clause [varP a] (normalB dataTypeOfExpr) []]+ dataCxt = map (\vName -> conT ''Data `appT` varT vName) names + instanceD (cxt dataCxt) + (conT ''Data `appT` tupType) + [gfoldlD, gunfoldD, toConstrD, dataTypeOfD]+ genTypeableIns :: [Name] -> Q Type -> Q Dec+ genTypeableIns names tupType = do+ -- generate n-1 commas to be consistent with the (faulty) instances+ -- of tuples from 2 to 7 elements+ let strRep = replicate (n-1) ','+ typeOfExpr = [| mkTyCon + $(litE $ stringL strRep)+ `mkTyConApp`+ $(listE $ map (\n -> varE 'typeOf `appE` undef n) names)+ |]+ typeOfD = funD 'typeOf+ [clause [wildP] (normalB typeOfExpr) []]+ typeableCxt = map (\vName -> conT ''Typeable `appT` varT vName) names+ instanceD (cxt typeableCxt) + (conT ''Typeable `appT` tupType) + [typeOfD]+ genLiftIns :: [Name] -> Q Type -> Q Dec+ genLiftIns names tupType = do+ let liftExpr = + varE 'tupE `appE` listE (map (\n -> varE 'lift `appE` varE n) names)+ liftD = funD 'lift + [clause [tupP (map varP names)] (normalB liftExpr) []]+ liftCxt = map (\vName -> conT ''Lift `appT` varT vName) names+ instanceD (cxt liftCxt) + (conT ''Lift `appT` tupType) + [liftD]++
+ src/ForSyDe/Process/ProcType/Instances.hs view
@@ -0,0 +1,116 @@+{-# LANGUAGE ScopedTypeVariables, FlexibleInstances,+ UndecidableInstances, OverlappingInstances, TemplateHaskell #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.System.SysFun.Instances+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- This module provides the 'ProcType' instances (and 'Data',+-- 'Typeable' and 'Lift' when necessary) . It cannot be included in+-- "ForSyDe.Process.ProcType" directly due to a Template Haskell bug+-- which prevents Template Haskell from executing functions defined in+-- the same module: <http://hackage.haskell.org/trac/ghc/ticket/1800>+--+----------------------------------------------------------------------------- +module ForSyDe.Process.ProcType.Instances where++import ForSyDe.Config (maxTupleSize)+import ForSyDe.Process.ProcType+import ForSyDe.AbsentExt++import Data.TypeLevel.Num.Sets (Nat, toInt)+import Data.Param.FSVec (FSVec, reallyUnsafeVector)+++import Data.Generics+import Control.Monad (liftM, liftM2, mzero)+import Text.ParserCombinators.ReadP+import Data.Set (empty, singleton)+import Language.Haskell.TH.Syntax (Lift(..), runIO)++-------------------------------------------------------------+-- Checking if a member of Data belongs to an enumerated type+-------------------------------------------------------------++-- | Phony type used to check if a data constructor is enumerate (has )+newtype IsConsEnum a = IsConsEnum {unIsConsEnum :: Bool}++-- | Tell if a member of "Data" belongs to an enumerated type+isConsEnum :: Data a => Constr -> IsConsEnum a+isConsEnum = gunfold (\_ -> IsConsEnum False) (\_ -> IsConsEnum True) ++-- | Tell if a member of "Data" belongs to an enumerated type+-- and return its description.+getEnumAlgTy :: forall a . Data a => a -> Maybe EnumAlgTy+getEnumAlgTy a = case dataTypeRep dt of+ AlgRep cons -> do + strs <- mapM (\c -> toMaybe (unIsConsEnum (isConsEnum c :: IsConsEnum a)) + (showConstr c)) cons + return (EnumAlgTy dn strs)+ _ -> Nothing+ where dt = dataTypeOf a+ dn = dataTypeName dt+ toMaybe bool c = if bool then Just c else Nothing++-------------+-- Instances+-------------++instance (Lift a, Data a) => ProcType a where+ getEnums _ = maybe empty singleton (getEnumAlgTy (undefined :: a))+ -- We add parenthesis and try to use gread. + -- In addition, since gread is broken for unit (), we create or own parser+ readProcType = do skipSpaces+ -- get all the input while no separator is found+ str <- munch1 (\c -> not (elem c " ,()<>" )) + gReadUnaryCons str+ where -- Generically read a unary constructor (possibly an integer, float etc .. )+ gReadUnaryCons :: forall a . Data a => String -> ReadP a+ gReadUnaryCons str = do + cons <- maybe mzero return $ readConstr (dataTypeOf (undefined :: a)) str+ fromConstrM (fail "readProcType: non-unary constructor found") cons++++instance (Typeable s, Nat s, ProcType a) => ProcType (FSVec s a) where+ getEnums _ = getEnums (undefined :: a)+ readProcType = do+ skipSpaces + char '<'+ elems <- countSepBy (toInt (undefined :: s))+ readProcType + (skipSpaces >> char ',' >> skipSpaces)+ char '>'+ return (reallyUnsafeVector elems)+ where countSepBy n p sep = + if n == 0 + then return []+ else liftM2 (:) p (sequence (replicate (n-1) (sep >> p))) + ++instance ProcType a => ProcType (AbstExt a) where+ getEnums _ = getEnums (undefined :: a)+ readProcType = skipSpaces >> (absP <++ prstP)+ where absP = do string "Abst" + return Abst+ prstP = do string "Prst"+ skipSpaces+ v <- readProcType+ return $ Prst v++-- Tuple instances+$(let concatMapM f xs = liftM concat (mapM f xs) + msg = "Generating and compiling " ++ show (maxTupleSize -2) ++ + " tuple instances of " +++ show ''ProcType ++ + ", this might take some time ... \n"+ in runIO (putStrLn $ msg) >>+ concatMapM genTupInstances [2..maxTupleSize])+++
+ src/ForSyDe/Process/ProcVal.hs view
@@ -0,0 +1,48 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Process.ProcVal+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- This module provides a type ('ProcVal') to store the value arguments passed+-- to process constructors.+--+----------------------------------------------------------------------------- +module ForSyDe.Process.ProcVal where+++import ForSyDe.Process.ProcType++import Data.Typeable (Typeable(..), TypeRep)+import Data.Dynamic (toDyn, Dynamic)+import Data.Set+import Language.Haskell.TH (Exp, runQ)+import Language.Haskell.TH.Syntax (Lift(..))+import System.IO.Unsafe (unsafePerformIO)+++data ProcVal = ProcVal + {dyn :: Dynamic, -- Dynamic value + valAST :: ProcValAST} -- its AST++data ProcValAST = ProcValAST+ {expVal :: Exp, -- Its AST representation+ expTyp :: TypeRep, -- Type of the expression + expEnums :: Set EnumAlgTy} -- Enumerated types associated+ -- with the expression++-- | 'ProcVal' constructor+mkProcVal :: (Lift a, ProcType a) => a -> ProcVal+-- FIXME: would unsafePerformIO cause any harm to get the exp out of the+-- Q monad in this context?+mkProcVal val = ProcVal (toDyn val) (mkProcValAST val) ++mkProcValAST :: (Lift a, ProcType a) => a -> ProcValAST +-- FIMXE: the unsafePerformIO won't be needed once the Data a => Lift a+-- instance is created+mkProcValAST val = ProcValAST (unsafePerformIO.runQ.lift $ val) (typeOf val) + (getEnums val)
+ src/ForSyDe/Process/SynchProc.hs view
@@ -0,0 +1,875 @@+{-# LANGUAGE TemplateHaskell, ScopedTypeVariables, RelaxedPolyRec,+ PatternGuards #-}+-- The PatternGuards are used to hush innapropiate compiler warnings+-- see http://hackage.haskell.org/trac/ghc/ticket/2017+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Process.SynchProc+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- This module provides the synchronous process constructors of+-- ForSyDe and some useful synchronous processes.+--+----------------------------------------------------------------------------- +module ForSyDe.Process.SynchProc (+ -- * Combinational process constructors+ -- | Combinational process constructors are used for processes that do not + -- have a state.+ constSY, mapSY, zipWithSY, zipWith3SY, + zipWith4SY, zipWith5SY, zipWith6SY, zipWithxSY, + -- * Sequential process constructors+ -- | Sequential process constructors are used for processes that have a state.+ -- One of the input parameters is the initial state.+ delaySY, delaynSY,+ scanlSY, scanl2SY, scanl3SY, scanldSY, scanld2SY,+ scanld3SY, mooreSY, moore2SY, moore3SY, mealySY,+ mealy2SY, mealy3SY, sourceSY, + filterSY, fillSY, holdSY,+ -- * Synchronous Processes+ -- | The library contains a few simple processes that are applicable to many + -- cases.+ whenSY, zipSY, zip3SY, zip4SY, zip5SY, zip6SY, + unzipSY, unzip3SY, unzip4SY, unzip5SY, unzip6SY,+ zipxSY, unzipxSY, mapxSY, + fstSY, sndSY, groupSY) where+++import ForSyDe.Ids+import ForSyDe.System+import ForSyDe.Process.ProcType+import ForSyDe.Process.ProcType.Instances()+import ForSyDe.Process.ProcFun+import ForSyDe.Process.ProcVal+import ForSyDe.OSharing+import ForSyDe.Netlist+import ForSyDe.AbsentExt++import qualified Data.Param.FSVec as V+import Data.Param.FSVec hiding ((++), map)+import Data.TypeLevel (Nat, toInt)++import Data.Set (union)+import Data.Maybe+import Data.Dynamic+import Data.Typeable++-----------------------------------+-- Synchronous Process Constructors+-----------------------------------++---------------------------------------- +-- -- +-- COMBINATIONAL PROCESS CONSTRUCTORS -- +-- -- +----------------------------------------+++-- | Creates a constant process. A process which outputs the +-- same signal value in every clock cycle.+constSY :: ProcType a => + ProcId -- ^ Identifier of the process+ -> a -- ^ Value to output+ -> Signal a -- ^ Resulting output signal+constSY id v = Signal (newNodeOutSig nodeRef ConstOut) + where nodeRef = newURef $ Proc id $ Const (mkProcVal v)+++++-- | The process constructor 'mapSY' takes an identifier and a +-- combinational function as arguments and returns a process with one +-- input signal and one output signal. +mapSY :: forall a b . (ProcType a, ProcType b) =>+ ProcId -- ^ Identifier of the process + -> ProcFun (a -> b) -- ^ Function applied to the input signal + -- in every cycle+ -> Signal a -- ^ Input 'Signal' + -> Signal b -- ^ Output 'Signal'+mapSY id f s = Signal (newNodeOutSig nodeRef ZipWithNSYOut) + where nodeRef = newURef $ Proc id $ ZipWithNSY dynPF [unSignal s]+ dynPF = procFun2Dyn (getEnums (undefined ::a) `union`+ getEnums (undefined ::b)) + f ++-- | The process constructor 'zipWithSY' takes an identifier and a +-- combinational function as arguments and returns a process with +-- two input signals and one output signal.+zipWithSY :: forall a b c . (ProcType a, ProcType b, ProcType c) => + ProcId -- ^ Identifier of the process+ -> ProcFun (a -> b -> c) -- ^ Function applied to the input signals + -- in every cycle+ -> Signal a -- ^ First input 'Signal'+ -> Signal b -- ^ Second input 'Signal'+ -> Signal c -- ^ Output Signal +zipWithSY id f s1 s2 = Signal (newNodeOutSig nodeRef ZipWithNSYOut)+ where nodeRef = newURef $ Proc id $ + ZipWithNSY dynPF [unSignal s1,unSignal s2]+ dynPF = procFun2Dyn (getEnums (undefined ::a) `union`+ getEnums (undefined ::b) `union`+ getEnums (undefined ::c) ) + f ++-- | The process constructor 'zipWith3SY' takes an identifier and a +-- combinational function as arguments and returns a process with +-- three input signals and one output signal. +zipWith3SY :: forall a b c d.+ (ProcType a, ProcType b, ProcType c, ProcType d) => + ProcId -- ^ Identifier of the process+ -> ProcFun (a -> b -> c -> d) -- ^ Function applied to the input + -- signals in every cycle+ -> Signal a -- ^ First input 'Signal'+ -> Signal b -- ^ Second input 'Signal'+ -> Signal c -- ^ Third input 'Signal'+ -> Signal d -- ^ Output Signal +zipWith3SY id f s1 s2 s3 = Signal (newNodeOutSig nodeRef ZipWithNSYOut)+ where nodeRef = newURef $ Proc id $ + ZipWithNSY dynPF + [unSignal s1, + unSignal s2, + unSignal s3]+ dynPF = procFun2Dyn (getEnums (undefined ::a) `union`+ getEnums (undefined ::b) `union`+ getEnums (undefined ::c) `union`+ getEnums (undefined ::d)) + f +++-- | The process constructor 'zipWith4SY' takes an identifier and a +-- combinational function as arguments and returns a process with +-- four input signals and one output signal. +zipWith4SY ::forall a b c d e. + (ProcType a, ProcType b, ProcType c, ProcType d, ProcType e) => + ProcId -- ^ Identifier of the process+ -> ProcFun (a -> b -> c -> d -> e) -- ^ Function applied to the + -- input signals in every cycle+ -> Signal a -- ^ First input 'Signal'+ -> Signal b -- ^ Second input 'Signal'+ -> Signal c -- ^ Third input 'Signal'+ -> Signal d -- ^ Fourth input 'Signal'+ -> Signal e -- ^ Output Signal +zipWith4SY id f s1 s2 s3 s4 = Signal (newNodeOutSig nodeRef ZipWithNSYOut)+ where nodeRef = newURef $ Proc id $ + ZipWithNSY dynPF + [unSignal s1, + unSignal s2, + unSignal s3,+ unSignal s4]+ dynPF = procFun2Dyn (getEnums (undefined ::a) `union`+ getEnums (undefined ::b) `union`+ getEnums (undefined ::c) `union`+ getEnums (undefined ::d) `union`+ getEnums (undefined ::e) ) + f +-- | The process constructor 'zipWith5SY' takes an identifier and a +-- combinational function as arguments and returns a process with +-- five input signals and one output signal. +zipWith5SY :: forall a b c d e f.+ (ProcType a, ProcType b, ProcType c, ProcType d, ProcType e,+ ProcType f) => + ProcId -- ^ Identifier of the process+ -> ProcFun (a -> b -> c -> d -> e -> f) + -- ^ Function applied to the + -- input signals in every cycle+ -> Signal a -- ^ First input 'Signal'+ -> Signal b -- ^ Second input 'Signal'+ -> Signal c -- ^ Third input 'Signal'+ -> Signal d -- ^ Fourth input 'Signal'+ -> Signal e -- ^ Fifth input 'Signal'+ -> Signal f -- ^ Output Signal +zipWith5SY id f s1 s2 s3 s4 s5 = Signal (newNodeOutSig nodeRef ZipWithNSYOut)+ where nodeRef = newURef $ Proc id $ + ZipWithNSY dynPF + [unSignal s1, + unSignal s2, + unSignal s3,+ unSignal s4,+ unSignal s5]+ dynPF = procFun2Dyn (getEnums (undefined ::a) `union`+ getEnums (undefined ::b) `union`+ getEnums (undefined ::c) `union`+ getEnums (undefined ::d) `union`+ getEnums (undefined ::e) `union`+ getEnums (undefined ::f) ) + f +++-- | The process constructor 'zipWith6SY' takes an identifier and a +-- combinational function as arguments and returns a process with +-- five input signals and one output signal. +zipWith6SY :: forall a b c d e f g.+ (ProcType a, ProcType b, ProcType c, ProcType d, ProcType e,+ ProcType f, ProcType g) => + ProcId -- ^ Identifier of the process+ -> ProcFun (a -> b -> c -> d -> e -> f -> g) + -- ^ Function applied to the + -- input signals in every cycle+ -> Signal a -- ^ First input 'Signal'+ -> Signal b -- ^ Second input 'Signal'+ -> Signal c -- ^ Third input 'Signal'+ -> Signal d -- ^ Fourth input 'Signal'+ -> Signal e -- ^ Fifth input 'Signal'+ -> Signal f -- ^ Sixth input 'Signal'+ -> Signal g -- ^ Output Signal +zipWith6SY id f s1 s2 s3 s4 s5 s6 = Signal (newNodeOutSig nodeRef ZipWithNSYOut)+ where nodeRef = newURef $ Proc id $ + ZipWithNSY dynPF + [unSignal s1, + unSignal s2, + unSignal s3,+ unSignal s4,+ unSignal s5,+ unSignal s6]+ dynPF = procFun2Dyn (getEnums (undefined ::a) `union`+ getEnums (undefined ::b) `union`+ getEnums (undefined ::c) `union`+ getEnums (undefined ::d) `union`+ getEnums (undefined ::e) `union`+ getEnums (undefined ::f) `union`+ getEnums (undefined ::g) ) + f ++-- | The process constructor 'mapxSY' creates a process network that maps a +-- function onto all signals in a vector of signals. The identifier is used +-- as the identifier prefix of the processes created (a number starting with 1+-- will be appended to each identifier)+mapxSY :: (Nat s, ProcType a, ProcType b) => + ProcId+ -> ProcFun (a -> b) + -> FSVec s (Signal a) + -> FSVec s (Signal b)+mapxSY id f = V.zipWith (\n s -> mapSY (id ++ show n) f s) + (V.reallyUnsafeVector [(1::Int)..]) ++-- | The process constructor 'zipWithxSY' works as 'zipWithSY', but takes a +-- vector of signals as input. +zipWithxSY :: forall s a b . + (Nat s, Typeable s, ProcType a, ProcType b) => + ProcId+ -> ProcFun (FSVec s a -> b) + -> FSVec s (Signal a) + -> Signal b+zipWithxSY id f sv = Signal (newNodeOutSig nodeRef ZipWithxSYOut)+ where nodeRef = newURef $ Proc id $ + ZipWithxSY (vecProcFun2List dynPF) + (map unSignal (V.fromVector sv)) + -- Transform the vector argument of a procfun into a list+ vecProcFun2List :: TypedProcFun (FSVec s' a' -> b') -> + TypedProcFun ([a'] -> b')+ vecProcFun2List f = f{tval = \x -> (tval f) (reallyUnsafeVector x)}+ dynPF = contProcFun2Dyn (getEnums (undefined ::a) `union`+ getEnums (undefined ::b) )+ f+ ++-------------------------------------+-- --+-- SEQUENTIAL PROCESS CONSTRUCTORS --+-- --+------------------------------------- ++-- | The process constructor 'delaySY' delays the signal one event cycle +-- by introducing an initial value at the beginning of the output signal. +-- Note, that this implies that there is one event (the first) at the +-- output signal that has no corresponding event at the input signal. +-- One could argue that input and output signals are not fully synchronized,+-- even though all input events are synchronous with a corresponding output +-- event. However, this is necessary to initialize feed-back loops.+delaySY :: ProcType a => + ProcId -- ^ Identifier of the process+ -> a -- ^ Initial value+ -> Signal a -- ^ 'Signal' to be delayed + -> Signal a -- ^ Resulting delayed 'Signal'+delaySY id v s = Signal (newNodeOutSig nodeRef DelaySYOut)+ where procVal = mkProcVal v+ nodeRef = newURef $ Proc id $ DelaySY procVal (unSignal s)+++-- | The process constructor 'delaynSY' delays the signal n events by +-- introducing n identical default values. It creates a chain of 'delaySY'+-- processes.+delaynSY :: ProcType a =>+ ProcId -- ^ Identifier+ -> a -- ^Initial state+ -> Int -- ^ Number of Delay cycles + -> Signal a -- ^Input signal+ -> Signal a -- ^Output signal+delaynSY id e n = instantiate id delaynSys+ where delaynSys = newSysDef delaynSysF ("delay"++show n++"SY_"++id) + ["in1"] ["out1"]+ delaynSysF s = (\(a,_,_) -> a) $ delaynSYacum (s, 1, n)+ delaynSYacum acum@(lastSig, curr, max)+ | curr > max = acum+ | otherwise = + delaynSYacum (delaySY ("delay" ++ show curr) e lastSig, curr+1, max)+ +++-- | The process constructor 'scanlSY' is used to construct a finite state +-- machine process without output decoder. It takes an initial value and +-- a function for the next state decoder. The process constructor behaves +-- similar to the Haskell prelude function 'scanlSY' and has the value of +-- the new state as its output value as illustrated by the +-- following example. +-- +-- This is in contrast to the function 'scanldSY', which has its current +-- state as its output value. +scanlSY :: (ProcType a, ProcType b) =>+ ProcId -- ^Process Identifier+ -> ProcFun (a -> b -> a) -- ^Combinational function for next + -- state decoder+ -> a -- ^Initial state+ -> Signal b -- ^ Input signal + -> Signal a -- ^ Output signal+scanlSY id f mem = instantiate id scanlSys+ where scanlSys = newSysDef scanlSysF ("scanlSY_"++id) ["in1"] ["out1"]+ scanlSysF s = s'+ where s' = zipWithSY "zipWith" f (delaySY "delay" mem s') s +++-- | The process constructor 'scanl2SY' behaves like 'scanlSY', but has two +-- input signals.+scanl2SY :: (ProcType a, ProcType b, ProcType c) =>+ ProcId -- ^Process Identifier+ -> ProcFun (a -> b -> c -> a) -- ^Combinational function for next + -- state decoder+ -> a -- ^Initial state+ -> Signal b -- ^ First Input signal + -> Signal c -- ^ Second Input signal+ -> Signal a -- ^ Output signal+scanl2SY id f mem = instantiate id scanl2Sys+ where scanl2Sys = newSysDef scanl2SysF ("scanl2SY_"++id) + ["in1", "in2"] ["out1"]+ scanl2SysF s1 s2 = s'+ where s' = zipWith3SY "zipWith" f (delaySY "delay" mem s') s1 s2 ++++-- | The process constructor 'scanl2SY' behaves like 'scanlSY', but has two +-- input signals.+scanl3SY :: (ProcType a, ProcType b, ProcType c, ProcType d) =>+ ProcId -- ^Process Identifier+ -> ProcFun (a -> b -> c -> d -> a) -- ^Combinational function for next + -- state decoder+ -> a -- ^Initial state+ -> Signal b -- ^ First Input signal + -> Signal c -- ^ Second Input signal+ -> Signal d -- ^ Third Input signal+ -> Signal a -- ^ Output signal+scanl3SY id f mem = instantiate id scanl3Sys+ where scanl3Sys = newSysDef scanl3SysF ("scanl3SY_"++id) + ["in1", "in2", "in3"] ["out1"]+ scanl3SysF s1 s2 s3 = s'+ where s' = zipWith4SY "zipWith" f (delaySY "delay" mem s') s1 s2 s3++++-- | The process constructor 'scanldSY' is used to construct a finite state+-- machine process without output decoder. It takes an initial value and a+-- function for the next state decoder. The process constructor behaves+-- similarly to the Haskell prelude function 'scanlSY'. In contrast to the+-- process constructor 'scanlSY' here the output value is the current state+-- and not the one of the next state.+scanldSY :: (ProcType a, ProcType b) => + ProcId+ -> ProcFun (a -> b -> a) -- ^Combinational function + -- for next state decoder+ -> a -- ^Initial state+ -> Signal b -- ^ Input signal + -> Signal a -- ^ Output signal+scanldSY id f mem = instantiate id scanldSys+ where scanldSys = newSysDef scanldSysF ("scanlSY_"++id) ["in1"] ["out1"]+ scanldSysF s = s'+ where s' = delaySY "delay" mem $ zipWithSY "zipWith" f s' s +++-- | The process constructor 'scanld2SY' behaves like 'scanldSY', but has +-- two input signals.+scanld2SY :: (ProcType a, ProcType b, ProcType c) => + ProcId+ -> ProcFun (a -> b -> c -> a) -- ^Combinational function + -- for next state decoder+ -> a -- ^Initial state+ -> Signal b -- ^ First Input signal+ -> Signal c -- ^ Second Input signal+ -> Signal a -- ^ Output signal+scanld2SY id f mem = instantiate id scanld2Sys+ where scanld2Sys = newSysDef scanld2SysF ("scanld2SY_"++id) + ["in1", "in2"] ["out1"]+ scanld2SysF s1 s2 = s'+ where s' = delaySY "delay" mem $ zipWith3SY "zipWith" f s' s1 s2 ++++-- | The process constructor 'scanld2SY' behaves like 'scanldSY', but has +-- two input signals.+scanld3SY :: (ProcType a, ProcType b, ProcType c, ProcType d) => + ProcId+ -> ProcFun (a -> b -> c -> d -> a) -- ^Combinational function + -- for next state decoder+ -> a -- ^Initial state+ -> Signal b -- ^ First Input signal+ -> Signal c -- ^ Second Input signal+ -> Signal d -- ^ Second Input signal+ -> Signal a -- ^ Output signal+scanld3SY id f mem = instantiate id scanld3Sys+ where scanld3Sys = newSysDef scanld3SysF ("scanld3SY_"++id) + ["in1", "in2", "in3"] ["out1"]+ scanld3SysF s1 s2 s3 = s' + where s' = delaySY "delay" mem $ zipWith4SY "zipWith" f s' s1 s2 s3 ++++-- | The process constructor 'mooreSY' is used to model state machines+-- of \"Moore\" type, where the output only depends on the current+-- state. The process constructor is based on the process constructor+-- 'scanldSY', since it is natural for state machines in hardware, that+-- the output operates on the current state and not on the next+-- state. The process constructors takes a function to calculate the+-- next state, another function to calculate the output and a value for+-- the initial state.+--+-- In contrast the output of a process created by the process constructor+-- 'mealySY' depends not only on the state, but also on the input values.+mooreSY :: (ProcType a, ProcType b, ProcType c) =>+ ProcId+ -> ProcFun (a -> b -> a) -- ^ Combinational function for+ -- next state decoder+ -> ProcFun (a -> c) -- ^Combinational function for output decoder+ -> a -- ^Initial state+ -> Signal b -- ^Input signal+ -> Signal c -- ^Output signal+mooreSY id nextState output initial = instantiate id mooreSys+ where mooreSys = newSysDef mooreSysF ("mooreSY_"++id)+ ["in1"] ["out1"] + mooreSysF = mapSY "map" output . scanldSY "mooreScan" nextState initial+++-- | The process constructor 'moore2SY' behaves like 'mooreSY', but has two +-- input signals.+moore2SY :: (ProcType a, ProcType b, ProcType c, ProcType d) =>+ ProcId+ -> ProcFun (a -> b -> c -> a) -- ^ Combinational function for+ -- next state decoder+ -> ProcFun (a -> d) -- ^Combinational function for output decoder+ -> a -- ^Initial state+ -> Signal b -- ^First Input signal+ -> Signal c -- ^Second Input signal+ -> Signal d -- ^Output signal+moore2SY id nextState output initial = instantiate id moore2Sys+ where moore2Sys = newSysDef moore2SysF ("moore2SY_"++id)+ ["in1", "in2"] ["out1"] + moore2SysF i1 i2 = + mapSY "map" output $ scanld2SY "mooreScan" nextState initial i1 i2+++++-- | The process constructor 'moore2SY' behaves like 'mooreSY', but has two +-- input signals.+moore3SY :: (ProcType a, ProcType b, ProcType c, ProcType d, ProcType e) =>+ ProcId+ -> ProcFun (a -> b -> c -> d -> a) -- ^ Combinational function for+ -- next state decoder+ -> ProcFun (a -> e) -- ^Combinational function for output decoder+ -> a -- ^Initial state+ -> Signal b -- ^First Input signal+ -> Signal c -- ^Second Input signal+ -> Signal d -- ^Third Input signal+ -> Signal e -- ^Output signal+moore3SY id nextState output initial = instantiate id moore3Sys+ where moore3Sys = newSysDef moore3SysF ("moore3SY_"++id)+ ["in1", "in2", "in3"] ["out1"] + moore3SysF i1 i2 i3 = + mapSY "map" output $ scanld3SY "mooreScan" nextState initial i1 i2 i3+++-- | The process constructor 'melaySY' is used to model state machines of+-- \"Mealy\" type, where the output only depends on the current state and+-- the input values. The process constructor is based on the process+-- constructor 'scanldSY', since it is natural for state machines in+-- hardware, that the output operates on the current state and not on the+-- next state. The process constructors takes a function to calculate the+-- next state, another function to calculate the output and a value for the+-- initial state.+--+-- In contrast the output of a process created by the process constructor +-- 'mooreSY' depends only on the state, but not on the input values.+mealySY :: (ProcType a, ProcType b, ProcType c) => + ProcId+ -> ProcFun (a -> b -> a) -- ^Combinational function for next + -- state decoder + -> ProcFun (a -> b -> c) -- ^Combinational function for output decoder+ -> a -- ^Initial state+ -> Signal b -- ^Input signal + -> Signal c -- ^Output signal+mealySY id nextState output initial = instantiate id mealySys+ where mealySys = newSysDef mealySysF ("mealySY_"++id) ["in1"] ["out1"]+ mealySysF i = zipWithSY "zipWith" output state i+ where state = scanldSY "scanld" nextState initial i++-- | The process constructor 'mealy2SY' behaves like 'mealySY', but has +-- two input signals.+mealy2SY :: (ProcType a, ProcType b, ProcType c, ProcType d) => + ProcId+ -> ProcFun (a -> b -> c -> a) -- ^Combinational function for next + -- state decoder + -> ProcFun (a -> b -> c -> d) -- ^Combinational function for output + -- decoder+ -> a -- ^Initial state+ -> Signal b -- ^First Input signal+ -> Signal c -- ^Second Input signal + -> Signal d -- ^Output signal+mealy2SY id nextState output initial = instantiate id mealy2Sys+ where mealy2Sys = newSysDef mealy2SysF ("mealySY_"++id) + ["in1", "in2"] ["out1"]+ mealy2SysF i1 i2 = zipWith3SY "zipWith" output state i1 i2+ where state = scanld2SY "scanld" nextState initial i1 i2+ +++-- | The process constructor 'mealy2SY' behaves like 'mealySY', but has +-- two input signals.+mealy3SY :: (ProcType a, ProcType b, ProcType c, ProcType d, + ProcType e) => + ProcId+ -> ProcFun (a -> b -> c -> d -> a) -- ^Combinational function for next + -- state decoder + -> ProcFun (a -> b -> c -> d -> e) -- ^Combinational function for + -- output decoder+ -> a -- ^Initial state+ -> Signal b -- ^First Input signal+ -> Signal c -- ^Second Input signal + -> Signal d -- ^Third Input signal + -> Signal e -- ^Output signal+mealy3SY id nextState output initial = instantiate id mealy3Sys+ where mealy3Sys = newSysDef mealy3SysF ("mealySY_"++id) + ["in1", "in2", "in3"] ["out1"]+ mealy3SysF i1 i2 i3 = zipWith4SY "zipWith" output state i1 i2 i3+ where state = scanld3SY "scanld" nextState initial i1 i2 i3+ +++-- | The process constructor 'filterSY' discards the values who do not fulfill a predicate given by a predicate function and replaces them with absent events.+filterSY :: ProcType a =>+ ProcId+ -> ProcFun (a -> Bool) -- ^ Predicate function+ -> Signal a -- ^ Input signal+ -> Signal (AbstExt a) -- ^ Output signal+filterSY id pred = mapSY id (filterer `defArgPF` pred) + where filterer = + $(newProcFun [d| filterer :: (a -> Bool) -> a -> AbstExt a+ filterer pred val = + if pred val then Prst val + else Abst |])++-- | The process 'sourceSY' takes a function and an initial state and generates+-- an infinite signal starting with the initial state as first output +-- followed by the recursive application of the function on the current +-- state. The state also serves as output value. +-- +-- The process that has the infinite signal of natural numbers as output is +-- con structed by +-- +-- sourceSY \"naturals\" (+1) 0+sourceSY :: ProcType a =>+ ProcId + -> ProcFun (a -> a) + -> a + -> Signal a+sourceSY id f s0 = instantiate id sourceSys+ where sourceSys = newSysDef sourceSysF ("sourceSY_"++id) + [] ["out1"]+ sourceSysF = o + where o = delaySY "delay" s0 s+ s = mapSY "map" f o+++++-- | The process constructor 'fillSY' creates a process that 'fills' a signal +-- with present values by replacing absent values with a given value. The +-- output signal is not any more of the type 'AbstExt'. +fillSY :: ProcType a =>+ ProcId+ -> a -- ^Default value + -> Signal (AbstExt a) -- ^Absent extended input signal + -> Signal a -- ^Output signal +fillSY id v s = mapSY id (replaceAbst `defArgVal` v) s+ where replaceAbst :: ProcFun (a -> AbstExt a -> a)+ replaceAbst = $(newProcFun + [d| replaceAbst :: a -> AbstExt a -> a+ replaceAbst x y = fromAbstExt x y |]) ++-- | The process constructor 'holdSY' creates a process that 'fills' a signal +-- with values by replacing absent values by the preceding present value. +-- Only in cases, where no preceding value exists, the absent value is +-- replaced by a default value. The output signal is not any more of the +-- type 'AbstExt'.+holdSY :: ProcType a => + ProcId -- ^Default value + -> a+ -> Signal (AbstExt a) -- ^Absent extended input signal + -> Signal a -- ^Output signal+holdSY id a s = scanlSY id hold a s+ where hold = $(newProcFun [d| hold :: a -> AbstExt a -> a+ hold a abs = fromAbstExt a abs |])++---------------------------+-- --+-- SYNCHRONOUS PROCESSES --+-- --+---------------------------+++-- | The process constructor 'whenSY' creates a process that synchronizes a +-- signal of absent extended values with another signal of absent extended +-- values. The output signal has the value of the first signal whenever an +-- event has a present value and 'Abst' when the event has an absent value.+whenSY :: (ProcType a, ProcType b) => + ProcId+ -> Signal (AbstExt a) -> Signal (AbstExt b) -> Signal (AbstExt a)+whenSY id = zipWithSY id whenF + where whenF = $(newProcFun [d| whenF :: AbstExt a -> AbstExt b -> AbstExt a+ whenF v1 v2 = if isAbsent v2+ then Abst+ else v1 |])+++-- | The process 'zipSY' \"zips\" two incoming signals into one signal of +-- tuples.+zipSY :: (ProcType a, ProcType b) => + ProcId+ -> Signal a + -> Signal b + -> Signal (a,b)+zipSY id = zipWithSY id tup2+ where tup2 :: ProcFun (a -> b -> (a,b))+ tup2 = $(newProcFun [d| tup2 :: a -> b -> (a,b)+ tup2 a b = (a,b) |])++-- | The process 'zip3SY' works as 'zipSY', but takes three input signals.+zip3SY :: (ProcType a, ProcType b, ProcType c) => + ProcId ->+ Signal a -> + Signal b -> + Signal c ->+ Signal (a,b,c)+zip3SY id = zipWith3SY id tup3+ where tup3 :: ProcFun (a -> b -> c -> (a,b,c))+ tup3 = $(newProcFun [d| tup3 :: a -> b -> c -> (a,b,c)+ tup3 a b c = (a,b,c) |])+++-- | The process 'zip4SY' works as 'zipSY', but takes four input signals.+zip4SY :: (ProcType a, ProcType b, ProcType c, ProcType d) => + ProcId -> + Signal a -> + Signal b -> + Signal c ->+ Signal d ->+ Signal (a,b,c,d)+zip4SY id = zipWith4SY id tup4+ where tup4 :: ProcFun (a -> b -> c -> d -> (a,b,c,d))+ tup4 = $(newProcFun [d| tup4 :: a -> b -> c -> d -> (a,b,c,d)+ tup4 a b c d = (a,b,c,d) |])+++-- | The process 'zip5SY' works as 'zipSY', but takes five input signals.+zip5SY :: (ProcType a, ProcType b, ProcType c, ProcType d, ProcType e) => + ProcId ->+ Signal a -> + Signal b -> + Signal c ->+ Signal d ->+ Signal e ->+ Signal (a,b,c,d,e)+zip5SY id = zipWith5SY id tup5+ where tup5 :: ProcFun (a -> b -> c -> d -> e -> (a,b,c,d,e))+ tup5 = $(newProcFun [d| tup5 :: a -> b -> c -> d -> e -> (a,b,c,d,e)+ tup5 a b c d e = (a,b,c,d,e) |])+++-- | The process 'zip6SY' works as 'zipSY', but takes six input signals.+zip6SY :: (ProcType a, ProcType b, ProcType c, ProcType d, ProcType e, + ProcType f) =>+ ProcId -> + Signal a -> + Signal b -> + Signal c ->+ Signal d ->+ Signal e ->+ Signal f ->+ Signal (a,b,c,d,e,f)+zip6SY id = zipWith6SY id tup6+ where tup6 :: ProcFun (a -> b -> c -> d -> e -> f -> (a,b,c,d,e,f))+ tup6 = $(newProcFun [d| tup6 :: a -> b -> c -> d -> e -> f -> + (a,b,c,d,e,f)+ tup6 a b c d e f = (a,b,c,d,e,f) |])+++-- | The process 'unzipSY' \"unzips\" a signal of tuples into two signals.+unzipSY :: forall a b . (ProcType a, ProcType b) => + ProcId+ -> Signal (a,b) + -> (Signal a,Signal b)+unzipSY id s = (Signal (newNodeOutSig nodeRef (UnzipNSYOut 1)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 2)))+ where ts = [typeOf (undefined :: a), typeOf (undefined :: b)]+ nodeRef = newURef $ Proc id $ + UnzipNSY ts untup (unSignal s)+ untup :: Dynamic -> [Dynamic]+ untup i = let (t1,t2) = ((fromJust.fromDynamic) i) :: (a,b) + in [toDyn t1, toDyn t2]++++-- | The process 'unzip3SY' \"unzips\" a signal of tuples into three signals.+unzip3SY :: forall a b c . (ProcType a, ProcType b, ProcType c) => + ProcId + -> Signal (a,b,c) + -> (Signal a, Signal b, Signal c)+unzip3SY id s = (Signal (newNodeOutSig nodeRef (UnzipNSYOut 1)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 2)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 3)))+ where ts = [typeOf (undefined :: a), typeOf (undefined :: b),+ typeOf (undefined :: c)]+ nodeRef = newURef $ Proc id $ + UnzipNSY ts untup3 (unSignal s)+ untup3 :: Dynamic -> [Dynamic]+ untup3 i = let (t1,t2,t3) = ((fromJust.fromDynamic) i) :: (a,b,c) + in [toDyn t1, toDyn t2, toDyn t3]+++-- | The process 'unzip4SY' \"unzips\" a signal of tuples into four signals.+unzip4SY :: forall a b c d . (ProcType a, ProcType b, ProcType c, + ProcType d) => + ProcId + -> Signal (a,b,c,d) + -> (Signal a, Signal b, Signal c, Signal d)+unzip4SY id s = (Signal (newNodeOutSig nodeRef (UnzipNSYOut 1)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 2)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 3)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 4)))+ where ts = [typeOf (undefined :: a), typeOf (undefined :: b),+ typeOf (undefined :: c), typeOf (undefined :: d)]+ nodeRef = newURef $ Proc id $ + UnzipNSY ts untup4 (unSignal s)+ untup4 :: Dynamic -> [Dynamic]+ untup4 i = let (t1,t2,t3,t4) = ((fromJust.fromDynamic) i) :: (a,b,c,d)+ in [toDyn t1, toDyn t2, toDyn t3, toDyn t4]+++-- | The process 'unzip5SY' \"unzips\" a signal of tuples into five signals.+unzip5SY :: forall a b c d e . (ProcType a, ProcType b, ProcType c, + ProcType d, ProcType e) => + ProcId + -> Signal (a,b,c,d,e) + -> (Signal a, Signal b, Signal c, Signal d, Signal e)+unzip5SY id s = (Signal (newNodeOutSig nodeRef (UnzipNSYOut 1)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 2)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 3)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 4)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 5)))+ where ts = [typeOf (undefined :: a), typeOf (undefined :: b),+ typeOf (undefined :: c), typeOf (undefined :: d),+ typeOf (undefined :: e)]+ nodeRef = newURef $ Proc id $ + UnzipNSY ts untup5 (unSignal s)+ untup5 :: Dynamic -> [Dynamic]+ untup5 i = let (t1,t2,t3,t4,t5) + = ((fromJust.fromDynamic) i) :: (a,b,c,d,e)+ in [toDyn t1, toDyn t2, toDyn t3, toDyn t4, toDyn t5]+++-- | The process 'unzip6SY' \"unzips\" a signal of tuples into six signals.+unzip6SY :: forall a b c d e f . (ProcType a, ProcType b, ProcType c, + ProcType d, ProcType e, ProcType f) => + ProcId + -> Signal (a,b,c,d,e,f) + -> (Signal a, Signal b, Signal c, Signal d, Signal e, Signal f)+unzip6SY id s = (Signal (newNodeOutSig nodeRef (UnzipNSYOut 1)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 2)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 3)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 4)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 5)),+ Signal (newNodeOutSig nodeRef (UnzipNSYOut 6)))+ where ts = [typeOf (undefined :: a), typeOf (undefined :: b),+ typeOf (undefined :: c), typeOf (undefined :: d),+ typeOf (undefined :: e), typeOf (undefined :: f)]+ nodeRef = newURef $ Proc id $ + UnzipNSY ts untup6 (unSignal s)+ untup6 :: Dynamic -> [Dynamic]+ untup6 i = let (t1,t2,t3,t4,t5,t6) + = ((fromJust.fromDynamic) i) :: (a,b,c,d,e,f)+ in [toDyn t1, toDyn t2, toDyn t3, toDyn t4, toDyn t5, + toDyn t6]++-- | The process 'zipxSY' \"zips\" a signal of vectors into a vector of signals.+zipxSY :: (Nat s, Typeable s, ProcType a) =>+ ProcId+ -> FSVec s (Signal a) + -> Signal (FSVec s a)+zipxSY id = zipWithxSY id vectId + where vectId = $(newProcFun [d| vectId :: FSVec s a -> FSVec s a+ vectId v = v |]) ++-- | The process 'unzipxSY' \"unzips\" a vector of n signals into a signal of +-- vectors.+unzipxSY :: forall s a . (Typeable s, Nat s, ProcType a) => + ProcId+ -> Signal (FSVec s a) + -> FSVec s (Signal a)+unzipxSY id vs = V.map (\tag -> Signal (newNodeOutSig nodeRef tag) )+ (reallyUnsafeVector [UnzipxSYOut i | i <- [1..n]])+ where n = toInt (undefined :: s)+ t = typeOf (undefined :: a)+ nodeRef = newURef $ Proc id $+ UnzipxSY t n unvector (unSignal vs)+ unvector :: Dynamic -> [Dynamic]+ unvector i = let v = ((fromJust.fromDynamic) i) :: FSVec s a+ in map toDyn (V.fromVector v)++-- | The process 'fstSY' selects always the first value from a signal of pairs+fstSY :: (ProcType a, ProcType b) => ProcId -> Signal (a,b) -> Signal a+fstSY id = mapSY id first+ where first = $(newProcFun [d| first :: (a,b) -> a+ first (a,_) = a |])+++-- | The process 'sndSY' selects always the second value from a signal of pairs+sndSY :: (ProcType a, ProcType b) => ProcId -> Signal (a,b) -> Signal b+sndSY id = mapSY id second+ where second = $(newProcFun [d| second :: (a,b) -> b+ second (_,b) = b |])++++-- | The function 'groupSY' groups values into a vector of size n, which takes +-- n cycles. While the grouping takes place the output from this process +-- consists of absent values.+groupSY :: forall k a . (Nat k, Typeable k, ProcType a) => + ProcId -> k -> Signal a -> Signal (AbstExt (FSVec k a))+groupSY id k = mooreSY id (f `defArgVal` kV) (g `defArgVal` kV) s0 + where+ kV = toInt k+ -- FIXME, FIXME, this won't work in th VHDL backend+ -- due to the undefined and probably unsafeReplace+ s0 = (0, V.copy k (undefined :: a)) + f = $(newProcFun [d| f :: Nat k' => Int -> (Int, FSVec k' a') -> a' -> + (Int, FSVec k' a')+ f k (count,v) a =+ (count+1 `mod` k, unsafeReplace v count a) |])+ g = $(newProcFun [d| g :: Nat k' => Int -> (Int, FSVec k' a') -> AbstExt (FSVec k' a') + g k (count,v) = if k-1 == count then Prst v else Abst |])+ unsafeReplace :: Nat s => FSVec s a' -> Int -> a' ->FSVec s a'+ unsafeReplace v i a = + reallyUnsafeVector $ unsafeReplace' (fromVector v) i a+ where unsafeReplace' [] _ _ = []+ unsafeReplace' (_:xs) 0 y = (y:xs)+ unsafeReplace' (x:xs) n y = x : (unsafeReplace' xs (n - 1) y)+
+ src/ForSyDe/Shallow.hs view
@@ -0,0 +1,43 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+--+-- Shallow-embedded implementation of ForSyDe (see "ForSyDe.Shallow.Signal"). +--+-- Unlike systems built using the deep-embedded Signal type of ForSyDe+-- (see 'ForSyDe.Signal'), systems built with 'ForSyDe.Shallow.Signal'+-- can make use of new and experimental features such as multiple,+-- heterogeneous MoCs (Models of Computation) other than the Synchronous+-- MoC (the only Model of Computation currently supported by deep-embdded+-- ForSyDe). However, as an important tradeoff, 'ForSyDe.Shallow.Signal'+-- is unaware of the resulting system structure, only allowing simulation +-- (i.e. a VHDL or GraphML backend is impossible to implement).+-- +-- The shallow implementation of ForSyDe consists of three main libraries:+-- +-- * "ForSyDe.Shallow.CoreLib" contains the basic definitions and+-- functions such as events and signals.+--+-- * "ForSyDe.Shallow.MoCLib" defines the models of computations+-- included in ForSyDe.+--+-- * "ForSyDe.Shallow.UtilityLib" provides several additional modules+-- that are useful and convenient in practice. Their status is+-- experimental.+--+-----------------------------------------------------------------------------+module ForSyDe.Shallow(module ForSyDe.Shallow.CoreLib+ , module ForSyDe.Shallow.MoCLib+ , module ForSyDe.Shallow.UtilityLib+ ) where++import ForSyDe.Shallow.CoreLib+import ForSyDe.Shallow.MoCLib+import ForSyDe.Shallow.UtilityLib
+ src/ForSyDe/Shallow/AbsentExt.hs view
@@ -0,0 +1,88 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.AbsentExt+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- The 'AbstExt' is used to extend existing data types with the value+-- \'absent\', which models the absence of a value.+-- +-----------------------------------------------------------------------------+module ForSyDe.Shallow.AbsentExt( + AbstExt (Abst, Prst), fromAbstExt, abstExt, psi, + isAbsent, isPresent, abstExtFunc)+ where+++++-- |The data type 'AbstExt' has two constructors. The constructor 'Abst' is used to model the absence of a value, while the constructor 'Prst' is used to model present values.+data AbstExt a = Abst + | Prst a deriving (Eq)++++-- |The function 'fromAbstExt' converts a value from a extended value.+fromAbstExt :: a -> AbstExt a -> a+-- |The functions 'isPresent' checks for the presence of a value.+isPresent :: AbstExt a -> Bool+-- |The functions 'isAbsent' checks for the absence of a value.+isAbsent :: AbstExt a -> Bool+-- |The function 'abstExtFunc' extends a function in order to process absent extended values. If the input is (\"bottom\"), the output will also be (\"bottom\").+abstExtFunc :: (a -> b) -> AbstExt a -> AbstExt b+-- | The function 'psi' is identical to 'abstExtFunc' and should be used in future.+psi :: (a -> b) -> AbstExt a -> AbstExt b+-- | The function 'abstExt' converts a usual value to a present value. +abstExt :: a -> AbstExt a+++++++-- Implementation of Library Functions++-- | The data type 'AbstExt' is defined as an instance of 'Show' and 'Read'. \'_\' represents the value 'Abst' while a present value is represented with its value, e.g. 'Prst' 1 is represented as \'1\'.+instance Show a => Show (AbstExt a) where+ showsPrec _ x = showsAbstExt x++showsAbstExt :: Show a => AbstExt a -> [Char] -> [Char]+showsAbstExt Abst = (++) "_" +showsAbstExt (Prst x) = (++) (show x)++instance Read a => Read (AbstExt a) where+ readsPrec _ x = readsAbstExt x ++readsAbstExt :: (Read a) => ReadS (AbstExt a)+readsAbstExt s = [(Abst, r1) | ("_", r1) <- lex s]+ ++ [(Prst x, r2) | (x, r2) <- reads s]++abstExt v = Prst v++fromAbstExt x Abst = x +fromAbstExt _ (Prst y) = y ++isPresent Abst = False+isPresent (Prst _) = True++isAbsent = not . isPresent++abstExtFunc f = f' + where f' Abst = Abst+ f' (Prst x) = Prst (f x)+++psi = abstExtFunc+++++++++
+ src/ForSyDe/Shallow/AdaptivityLib.hs view
@@ -0,0 +1,26 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.AdaptivityLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Adaptivity Library, yet to be completed.+-- +-----------------------------------------------------------------------------+module ForSyDe.Shallow.AdaptivityLib (applyfSY, applyfU) where++import ForSyDe.Shallow.Signal+import ForSyDe.Shallow.SynchronousLib+import ForSyDe.Shallow.UntimedLib++applyfSY :: Signal (a -> b) -> Signal a -> Signal b+applyfSY = zipWithSY apply+ where apply f x = f x++applyfU :: Int -> Signal ([a] -> [b]) -> Signal a -> Signal b+applyfU tokenNum = comb2UC tokenNum apply+ where apply f x = f x
+ src/ForSyDe/Shallow/BitVector.hs view
@@ -0,0 +1,122 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.BitVector+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- It defines the bit vector operations from\/to integer.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.BitVector(+ -- *Polynomial data type+ BitVector, Parity(..),+ -- *Bit-vector and integer transformations+ intToBitVector, bitVectorToInt,+ -- *Add even\/odd parity bit+ addEvenParityBit, addOddParityBit, addParityBit,+ -- *Remove parity bit+ removeParityBit,+ -- *Check the even\/odd parity of the bit-vector+ isEvenParity, isOddParity,+ -- *Judge the form sanity of the bit-vector+ isBitVector+ )+ where++import ForSyDe.Shallow.Vector++type BitVector = Vector Integer++-- |To judge whether the input bit-vector is in a proper form.+isBitVector :: (Num t) =>+ Vector t -- ^Input bit-vector+ -> Bool -- ^Output boolean value+isBitVector NullV = True+isBitVector (x:>xs) = (x == 0 || x == 1) && isBitVector xs++-- |To transform the input integer to a bit-vector with specified number of+-- bits.+intToBitVector :: Int -- ^Num of the bits+ -> Integer -- ^The input integer+ -> BitVector -- ^The output bit-vector+intToBitVector bits n | n >= 0 && n < 2^(bits-1) + = intToBitVector' bits n+intToBitVector bits n | n < 0 && abs n <= 2^(bits-1) + = intToBitVector' bits (n + 2^bits)+intToBitVector _ _ | otherwise = + error "intToBitvector : Number out of range!" ++-- |Helper function of 'intToBitVector'.+intToBitVector' :: (Num a, Ord a1, Num a1, Integral t) => + t -> a1 -> Vector a+intToBitVector' 0 _ = NullV+intToBitVector' bits n = if (n >= 2^(bits-1)) then+ 1 :> intToBitVector' (bits-1) (n - 2^(bits-1))+ else + 0 :> intToBitVector' (bits-1) n++-- |To transform the input bit-vecotr to an integer.+bitVectorToInt :: BitVector -> Integer+bitVectorToInt (1:>xv) | isBitVector xv + = bitVectorToInt' xv (lengthV xv) - 2^(lengthV xv) +bitVectorToInt (0:>xv) | isBitVector xv + = bitVectorToInt' xv (lengthV xv)+bitVectorToInt _ = error "bitVectorToInt: Vector is not a BitVector!"+++-- |Helper function of 'bitVectorToInt'.+bitVectorToInt' :: (Integral a, Num t) => Vector t -> a -> t+bitVectorToInt' NullV _ = 0+bitVectorToInt' (x:>xv) bit = x * 2^(bit-1) + bitVectorToInt' xv (bit-1)++data Parity = Even | Odd deriving (Show, Eq)++-- |To add even parity bit on the bit-vector in the tail.+addEvenParityBit :: Num a => Vector a -> Vector a+addEvenParityBit = addParityBit Even+-- |To add odd parity bit on the bit-vector in the tail.+addOddParityBit :: Num a => Vector a -> Vector a+addOddParityBit = addParityBit Odd++addParityBit :: Num a => Parity -> Vector a -> Vector a+addParityBit p v + | isBitVector v = case p of+ Even -> resZero even+ Odd -> resZero (not even)+ | otherwise = error "addParity: Vector is not a BitVector" + where even = evenNumber v + resZero b = v <+> unitV (if b then 0 else 1)+++-- |To remove the parity bit in the tail.+removeParityBit :: Num t => Vector t -> Vector t+removeParityBit v + | isBitVector v = takeV (lengthV v - 1) v+ | otherwise = error "removeParityBit: Vector is not a BitVector "++-- |To check the even parity of the bit-vector.+isEvenParity :: Num t => Vector t -> Bool+isEvenParity = isParityCorrect Even++-- |To check the odd parity of the bit-vector.+isOddParity :: Num t => Vector t -> Bool+isOddParity = isParityCorrect Odd++isParityCorrect :: Num t => Parity -> Vector t -> Bool +isParityCorrect Even xv = evenNumber xv+isParityCorrect Odd xv = not $ evenNumber xv ++evenNumber :: Num t => Vector t -> Bool+evenNumber NullV = True+evenNumber (0:>xv) = xor False (evenNumber xv)+evenNumber (1:>xv) = xor True (evenNumber xv)+evenNumber (_:>_) = error "evenNumber: Vector is not a BitVector "+ +xor :: Bool -> Bool -> Bool+xor True False = True+xor False True = True+xor _ _ = False +
+ src/ForSyDe/Shallow/CTLib.hs view
@@ -0,0 +1,1040 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.CTLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This is the ForSyDe library for continuous time MoC (CT-MoC).+-- Revision: $Revision: 1.7 $+-- Id: $Id: CTLib.hs,v 1.7 2007/07/11 08:38:34 axel Exp $+-- It is still experimental.+-- Right now there are only constructors 'combCT', 'combCT2', 'delayCT', +-- 'shiftCT', 'mealyCT', 'mooreCT', 'scaleCT', 'addCT', 'multCT' and 'absCT'.+--+-- The main idea is to represent continuous time signals as functions+-- @Real --> a@ with @a@ being a numerical type. This allows us to represent a +-- continuous time signal without loss of information because no sampling or +-- ADC is required. The sampling occurs only when a signal is evaluated, +-- for instance when it is plotted. +-- +-- Thus, a /signal/ is represented as a sequence of functions and intervals. For+-- instance a signal +-- +-- @s = \<(sin,[0,100])\>@ +--+-- represents a sinus signal in the interval between 0 and 100. The signal +--+-- @s2 = \<(f1(x)=2x, [0,2]), (f2(x)=3+x,[2,4])\>@+--+-- defines a signal that is defined by function @f1@ in the interval @[0,2]@ +-- and by function @f2@ in the interval @[2,4]@. +--+-- A /process/ transforms the incoming functions into outgoing functions. +-- The approach is described in more detail in the ANDRES deliverable D1.1a.+-- Here we only briefly comment the main functions and constructors.+----------------------------------------------------------------------------+module ForSyDe.Shallow.CTLib (+-- module ForSyDe.Shallow.CoreLib,+ -- * The signal data type+ SubsigCT(..), + timeStep,+ -- * Primary process constructors+ combCT, combCT2, mooreCT, mealyCT, delayCT, shiftCT, initCT,+ -- * Derived process constructors+ -- | These constructors instantiate very useful processes.+ -- They could be defined in terms of the basic constructors+ -- but are typically defined in a more direct way for + -- the sake of efficieny.+ scaleCT, addCT, multCT, absCT,+ -- * Convenient functions and processes+ -- | Several helper functions are available to obtain parts+ -- of a signal, the duration, the start time of a signal, and+ -- to generate a sine wave and constant signals.+ takeCT, dropCT, duration, startTime, sineWave, constCT, zeroCT,+ -- * AD and DA converters+ DACMode(..), a2dConverter, d2aConverter,+ -- * Some helper functions+ applyF1, applyF2, applyG1, cutEq, + -- * Sampling, printing and plotting+ -- $plotdoc+ plot, plotCT, plotCT' ,showParts, vcdGen)+ where++import ForSyDe.Shallow.CoreLib+import System.Cmd+import System.Time+import System.IO+import System.Directory+--import Control.Exception+import Data.Ratio+import Numeric()++-- The revision number of this file:+revision :: String+revision=filter (\ c -> (not (c=='$'))) "$Revision: 1.7 $, $Date: 2007/07/11 08:38:34 $"++-- |The type of a sub-signal of a continuous signal. It consisits of the +-- function and the interval on which the function is defined.+-- The continuous time signal is then defined as a sequence of SubsigCT +-- elements: Signal SubsigCT+data (Num a) => + SubsigCT a = SubsigCT ((Rational -> a), -- The function Time -> Value+ (Rational,Rational)) -- The interval on which the+ -- function is defined++instance (Num a) => Show (SubsigCT a) where+ show ss = show (sampleSubsig timeStep ss)++--unit :: String -- all time numbers are in terms of this unit.+--unit = "sec" ++-- | This constant gives the default time step for sampling and plotting.+-- Its value is 10ns.+timeStep :: Rational +timeStep = 10.0e-9++-----------------------------------------------------------------------+-- |'combCT' is a process constructor with one input and one output signal.+-- It instantiates a combinatorial, stateless process.+combCT :: (Num a) =>+ Rational -- ^The partitioning of the input signal. In other words+ -- this gives the time period which is consumed by the+ -- process during each evaluation cycle.+ -> ((Rational -> a) -> (Rational -> a)) -- ^The function that + -- defines the process + -- behaviour+ ->Signal (SubsigCT a) -- ^The input signal+ -> Signal (SubsigCT a) -- ^The output signal of the process.+combCT _ _ NullS = NullS+combCT c f s | (duration (takeCT c s)) < c = NullS+ | otherwise = applyF1 f (takeCT c s) +-+ combCT c f (dropCT c s)++-- |'combCT2' is a process constructor just like 'combCT' but operates on+-- two input signals.+combCT2 :: (Num a) =>+ Rational -- ^The partitioning of both input signals+ -> ((Rational -> a) -> (Rational -> a) -> (Rational->a)) + -- ^The function defining the process behaviour.+ -> Signal (SubsigCT a) -- ^The first input signal+ -> Signal (SubsigCT a) -- ^The second input signal+ -> Signal (SubsigCT a) -- ^The output signal of the process+combCT2 _ _ NullS _ = NullS+combCT2 _ _ _ NullS = NullS+combCT2 c f s1 s2 | (duration (takeCT c s1)) < c+ || (duration (takeCT c s2)) < c = NullS+ | startTime s1 /= startTime s2 + && abs(startTime s1 - startTime s2) > 0+ = error ("combCT2: s1 and s2 have not identical start"+ ++ " times: startTime s1 = "+ ++ (show (startTime s1)) ++ ", startTime s2 = "+ ++ (show (startTime s2)) ++ ";")+ | otherwise = applyF2 f s1' s2'+ +-+ combCT2 c f (dropCT c s1) (dropCT c s2)+ where (s1',s2') = cutEq (takeCT c s1) (takeCT c s2)++---+-- |'delayCT' is a delay process which simply delays the+-- output but does not buffer it. The value at each time t is the same as +-- for the input signal, after the initial delay.+delayCT :: (Num a) =>+ Rational -- ^ The delay+ -> Signal (SubsigCT a) -- ^ The input signal+ -> Signal (SubsigCT a) -- ^ The output signal+delayCT _ NullS = NullS+delayCT delay (SubsigCT (f,(a,b)) :- s) + = SubsigCT (f,(a+delay, b+delay)) :- delayCT delay s+++----+-- |'shiftCT' shifts the shape of the input signal by delay +-- to the right.+shiftCT :: (Num a) =>+ Rational -- ^ The delay+ -> Signal (SubsigCT a) -- ^ The input signal+ -> Signal (SubsigCT a) -- ^ The output signal+shiftCT _ NullS = NullS+shiftCT 0 s = s+shiftCT delay s = shiftCT' delay (dropCT delay s) -- The new signal shall+ -- only start delay + -- seconds later.+ where + shiftCT' _ NullS = NullS+ shiftCT' delay (SubsigCT (f,(a,b)) :- s) + = SubsigCT (f',(a,b)) :- (shiftCT' delay s)+ where f' x = f (x-delay)++----+-- | initCT takes an initial signal, outputs it and then copies its second +-- input signal, which is delayed by the duration of the initial signal.+-- The delay is realized by 'delayCT' +initCT :: (Num a) => + Signal (SubsigCT a) -- ^ The initial signal output first.+ -> Signal (SubsigCT a) -- ^ Then this signal is output, but delayed.+ -> Signal (SubsigCT a) -- ^ The concatation of the two inputs.+initCT s0 s1 = s0 +-+ (delayCT (duration s0) s1)++-----------------------------------------------------------------------------+-- |The state-full constructor 'mealyCT' resembles a Mealy machine.+mealyCT :: (Num b, Num c) =>+ (a -> Rational) -- ^The gamma function which defines+ -- the partitioning of the input+ -- signal. + -> (a -> (Rational -> b) -> a) -- ^The next state function g+ -> (a -> (Rational -> b) -> (Rational -> c))+ -- ^The output encoding function f + -> a -- ^The initial state+ -> Signal (SubsigCT b) -- ^The input signal+ -> Signal (SubsigCT c) -- ^The output signal+mealyCT _ _ _ _ NullS = NullS+mealyCT gamma g f w s+ | (duration (takeCT c s)) < c = NullS+ | otherwise = applyF1 (f w) (takeCT c s) + +-+ mealyCT gamma g f w' (dropCT c s)+ where c = gamma w+ w' = applyG1 g w (takeCT c s)++-- |The state-full constructor 'mooreCT' resembles a Moore machine.+mooreCT :: (Num b, Num c) =>+ (a -> Rational) -- ^The gamma function which defines+ -- the partitioning of the input+ -- signal. + -> (a -> (Rational -> b) -> a) -- ^The next state function g+ -> (a -> (Rational -> c))+ -- ^The output encoding function f + -> a -- ^The initial state+ -> Signal (SubsigCT b) -- ^The input signal+ -> Signal (SubsigCT c) -- ^The output signal+mooreCT _ _ _ _ NullS = NullS+mooreCT gamma g f w s+ | (duration (takeCT c s)) < c = NullS+ | otherwise = (SubsigCT ((f w),(a,b))) + :- mooreCT gamma g f w' (dropCT c s)+ where c = gamma w+ a = startTime s+ b = a + c+ w' = applyG1 g w (takeCT c s)++-------------------------------------------------------------------------+-- Some useful process constructors:+-- +-- |'scaleCT' amplifies an input by a constant factor:+scaleCT :: (Num a) =>+ a -- ^The scaling factor+ -> Signal (SubsigCT a) -- ^The input signal+ -> Signal (SubsigCT a) -- ^The output signal of the process+scaleCT k = applyF1 f'+ where f' f x = k * (f x)++-- scaleCT' has the same functionality as scaleCT but operates with a+-- given signal partitioning rather than on the +-- SubsigCT elements.+--scaleCT' :: (Num a) =>+-- Rational -- The sampling period+-- -> a -- The scaling factor+-- -> Signal (SubsigCT a) -> Signal (SubsigCT a)+--scaleCT' step k = combCT step f+-- where f g = f'+-- where f' x = k * (g x)++-- |'addCT' adds two input signals together.+addCT :: (Num a) =>+ Signal (SubsigCT a) -- ^The first input signal+ -> Signal (SubsigCT a) -- ^The second input signal+ -> Signal (SubsigCT a) -- ^The output signal+addCT s1 s2 = applyF2 f s1' s2'+ where (s1',s2') = cutEq s1 s2+ f g1 g2 = f'+ where f' x = (g1 x) + (g2 x)+ +-- addCT' has the same functionality as addCT but operates with a+-- given signal partitioning rather than on the SubsigCT elements.+-- addCT' :: (Num a) =>+-- Rational -- The sampling period+-- -> Signal (SubsigCT a) -- The first input signal+-- -> Signal (SubsigCT a) -- The second input signal+-- -> Signal (SubsigCT a) -- The output signal+-- addCT' step = combCT2 step f+-- where f g1 g2 = f'+-- where f' x = (g1 x) + (g2 x)+ +-- |'multCT' multiplies two input signals together.+multCT :: (Num a) =>+ Signal (SubsigCT a) -- ^The first input signal+ -> Signal (SubsigCT a) -- ^The second input signal+ -> Signal (SubsigCT a) -- ^The output signal+multCT s1 s2 = applyF2 f s1' s2'+ where (s1',s2') = cutEq s1 s2+ f g1 g2 = f'+ where f' x = (g1 x) * (g2 x)++-- multCT' has the same functionality as multCT but operates with a+-- given signal partitioning rather than on the SubsigCT elements.+-- multCT' :: (Num a) =>+-- Rational -- The sampling period+-- -> Signal (SubsigCT a) -- The first input signal+-- -> Signal (SubsigCT a) -- The second input signal+-- -> Signal (SubsigCT a) -- The output signal+-- multCT' step = combCT2 step f+-- where f g1 g2 = f'+-- where f' x = (g1 x) * (g2 x)++-- |'absCT' takes the absolute value of a signal.+absCT :: (Num a,Ord a) =>+ Signal (SubsigCT a) -- ^The input signal+ -> Signal (SubsigCT a) -- ^The output signal+absCT = applyF1 f+ where f g = f'+ where f' x | (g x) <= 0 = (-1) * (g x)+ | otherwise = (g x)++-- | 'sineWave' generates a sinus signal with the given frequency defined+-- over a given period. The function is defined as @f(x)=sin(2*pi*freq*x)@.+sineWave :: (Floating a) =>+ Rational -- ^The frequency+ -> (Rational,Rational) -- ^The interval of the signal+ -> Signal (SubsigCT a) -- ^The generated signal+sineWave freq timeInterval + = signal [SubsigCT (sineFunction, timeInterval)]+ where + sineFunction :: (Floating a) => Rational -> a+ --sineFunction t = sin (2*pi * freq * t)+ sineFunction t = (sin (2*pi * (fromRational (freq * t))))+-- | constCT generates a constant signal for a given time duration.+constCT :: (Num a) => + Rational -- ^ The time duration of the generated signal.+ -> a -- ^ The constant value of the signal.+ -> Signal (SubsigCT a) -- ^ The resulting signal.+constCT t c = signal [SubsigCT ((\_->c), (0,t))]++-- | zeroCT generates a constant 0 signal for the given time duration.+zeroCT :: (Num a) => + Rational -- ^ The time duration+ -> Signal (SubsigCT a) -- ^ The generated signal.+zeroCT t = constCT t 0++-----------------------------------------------------------------------------+-- DA and AD converter processes:+--+-- |For the digital-analog conversion we have two different possibilities+-- which is determined by this data type 'DACMode'.+data DACMode = DAlinear -- ^linear interpolation+ | DAhold -- ^the last digital value is frozen+ deriving (Show, Eq)++{- |'d2aConverter' converts an untimes or synchronous signal into a + continuous time signal.+ The process 'd2aConverter' converts a signal of the digital domain+ into a continuous time signal. There are two modes, 'DAlinear',+ which makes a smooth transition between adjacent digital values and+ 'DAhold', where the analog value directly follows the digital+ value. This means that in 'DAhold'-mode a staircase function+ remains a staircase function, while in 'DAlinear' the staircase+ function would resemble at least partially a /saw tooth/-curve. ++ The resolution of the converter is given by the parameter+ 'timeStep'.++ Note, that the process 'd2aConverter' is an ideal component, i.e. there+ are no losses due to a limited resolution due to a fixed number of bits. +-}+d2aConverter :: (Fractional a) =>+ DACMode -- ^Mode of conversion+ -> Rational -- ^Duration of input signal+ -> Signal a -- ^Input signal (untimed MoC)+ -> Signal (SubsigCT a) -- ^Output signal (continuous time MoC)+d2aConverter mode c xs+ | mode == DAlinear = d2aLinear c 0.0 xs+ | otherwise = d2aHolder c 0.0 xs+ where+ d2aHolder :: (Num a) => + Rational -> Rational -> Signal a -> Signal (SubsigCT a)+ d2aHolder _ _ NullS = NullS+ d2aHolder c holdT (x:-xs) = (SubsigCT (constRationalF x,(holdT,holdT+c)) )+ :- d2aHolder c (holdT+c) xs++ d2aLinear :: (Fractional a) =>+ Rational -> Rational -> Signal a -> Signal (SubsigCT a)+ d2aLinear _ _ NullS = NullS+ d2aLinear _ _ (_:-NullS) = NullS+ d2aLinear c holdT (x:-y:-xs) = + (SubsigCT (linearRationalF c holdT x y,(holdT,holdT+c)) )+ :- d2aLinear c (holdT+c) (y:-xs)+++constRationalF :: (Num a) => a -> Rational -> a+constRationalF = (\x _->x)++linearRationalF :: (Fractional a) =>+ Rational -> Rational -> a -> a -> Rational -> a+linearRationalF c holdT m n x = (1-alpha)*m + alpha*n+ where alpha :: (Fractional a) => a+ alpha = fromRational ((x-holdT)/c)++{- | The process 'a2dConverter' converts a continuous time signal to+ an untimed or synchronous signal. The first parameter gives the+ sampling period of the converter.++ Note, that the process 'a2dConverter' is an ideal component,+ i.e. there are no losses due to a limited resolution due to a fixed+ number of bits. +-}+a2dConverter :: (Num a) =>+ Rational -- ^Sampling Period+ -> Signal (SubsigCT a) -- ^Input signal (continuous time)+ -> Signal a -- ^Output signal (untimed)+a2dConverter _ NullS = NullS+a2dConverter c s | (duration (takeCT c s)) < c = NullS+ | otherwise = f (takeCT c s)+ +-+ a2dConverter c (dropCT c s)+ where f :: (Num a ) => Signal (SubsigCT a) -> Signal a+ f NullS = NullS+ f (SubsigCT (g,(a,_)) :- _) = signal [g a]++--------------------------------------------------------------------+-- Helpter functions for the CT MoC:+-- | applyF1 applies a function on a sub-signal, which means the function of +-- the subsignal is transformed to another function:+applyF1 :: (Num a, Num b) =>+ ((Rational -> a) -> (Rational -> b)) -- The transformer+ -> Signal (SubsigCT a) -- The input signal+ -> Signal (SubsigCT b) -- The output signal+applyF1 _ NullS = NullS+applyF1 f (ss :- s) = (applyF' f ss) :- (applyF1 f s)+ where applyF' :: (Num a, Num b) =>+ ((Rational -> a) -> (Rational -> b)) + -> (SubsigCT a) -> (SubsigCT b)+ applyF' f (SubsigCT (f',(a,b))) = SubsigCT ((f f'), (a,b))++-- | applyF2 works just like applyF1 but operates on two incoming signals.+applyF2 :: (Num a, Num b, Num c) =>+ ((Rational -> a) -> (Rational->b) -> (Rational -> c))+ -> Signal (SubsigCT a) + -> Signal (SubsigCT b) + -> Signal (SubsigCT c) +applyF2 _ NullS _ = NullS+applyF2 _ _ NullS = NullS+applyF2 f (ss1 :- s1) (ss2 :- s2) = (applyF' f ss1 ss2) :- (applyF2 f s1 s2)+ where applyF' f (SubsigCT (f1,(a,b))) (SubsigCT (f2,(c,d))) + | (a==c) && (b==d) + || (abs (a-c)< 0)+ || (abs (b-d)< 0)+ = SubsigCT ((f f1 f2), (a,b))+ + | otherwise = error ("applyF2: The two subintervals are"+ ++ " not identical: (a,b) = ("+ ++ (show a) ++ ", "+ ++ (show b) ++ "); (c,d) = ("+ ++ (show c) ++ ", "+ ++ (show d) ++ ").")++-- | applyG1 is used to apply a next-state function. A very interesting+-- question is, what should be an argument to the next-state function: +-- the incoming function, defining the value of the input signal?+-- or the incoming function and the incoming interval?+-- or the value of the incoming signal at a particular point, e.g. at the +-- left most point of the interval?+-- To give the next-state function the interval itself as argument, would mean+-- that the process becomes time variant process, i.e. its behaviour is +-- dependent on the absolute time values. This is not a good thing to have!+-- Another possibility may be to give a sub-signal that is relative to the +-- current evaluation, i.e. the left most point is always 0. Would that make+-- sense?+applyG1 :: (Num b) =>+ (a -> (Rational -> b) -> a) -> a -> Signal (SubsigCT b) -> a+applyG1 _ w NullS = w+applyG1 g w (ss :- _) = applyG1' g w ss+ where + applyG1' :: (Num b) =>+ (a -> (Rational -> b) -> a) -> a -> (SubsigCT b) -> a+ applyG1' g w (SubsigCT (f, (_,_))) = g w f++-- | cutEq partitions the two signals such that the partitioning are identical+-- in both result signals, but only up to the duration of the shorter of the +-- two signals:+cutEq :: (Num a, Num b) =>+ Signal (SubsigCT a) -> Signal (SubsigCT b) + -> (Signal (SubsigCT a), Signal (SubsigCT b))+cutEq NullS s2 = (NullS, s2) +cutEq s1 NullS = (s1, NullS) +cutEq s1 s2 = unzipCT (cutEq' s1 s2)+ where + cutEq' :: (Num a, Num b) =>+ Signal (SubsigCT a) -> Signal (SubsigCT b) + -> Signal ((SubsigCT a), (SubsigCT b))+ cutEq' NullS _ = NullS+ cutEq' _ NullS = NullS+ cutEq' (ss1:-s1) (ss2:-s2) + | dur1 == dur2 = (ss1,ss2) :- (cutEq' s1 s2)+ | dur1 < dur2 = (ss1, takeSubSig dur1 ss2) + :- (cutEq' s1 ((dropSubSig dur1 ss2) :- s2))+ | dur1 > dur2 = (takeSubSig dur2 ss1, ss2) + :- (cutEq' ((dropSubSig dur2 ss1) :- s1) s2)+ | otherwise = error ("cutEq' pattern match error: dur1="++(show dur1)+ ++ ", dur2="++ (show dur2)++";")+ where dur1 = durationSS ss1+ dur2 = durationSS ss2+ unzipCT :: Num a =>+ Signal ((SubsigCT a), (SubsigCT b)) + -> (Signal (SubsigCT a), Signal (SubsigCT b))+ unzipCT NullS = (NullS, NullS)+ unzipCT ((ss1,ss2) :- s) = (ss1:-s1, ss2:-s2)+ where (s1,s2) = unzipCT s++-- The take and drop functions on CT signals:+takeCT :: (Num a) => + Rational -> Signal (SubsigCT a) -> Signal (SubsigCT a)+takeCT _ NullS = NullS+takeCT 0 _ = NullS+takeCT c (ss:-s) | (durationSS ss) >= c = (takeSubSig c ss) :- NullS+ | otherwise = ss :- (takeCT (c - (durationSS ss)) s)++dropCT :: (Num a) =>+ Rational -> Signal (SubsigCT a) -> Signal (SubsigCT a)+dropCT _ NullS = NullS+dropCT 0 s = s+dropCT c (ss:-s) | (durationSS ss > c) = dropSubSig c ss :- s+ | otherwise = dropCT (c - (durationSS ss)) s++-- The interval length of a signal:+duration :: (Num a) => Signal (SubsigCT a) -> Rational+duration NullS = 0+duration (ss:- s) = (durationSS ss) + (duration s)++-- The interval length of a sub-signal:+durationSS :: (Num a) => (SubsigCT a) -> Rational+durationSS (SubsigCT (_, (a,b))) = b-a++-- The start time of a signal:+startTime :: (Num a) => Signal (SubsigCT a) -> Rational+startTime NullS = 0+startTime (SubsigCT (_,(a,_)) :- _) = a++-- The take and drop functions for sub-signals:+takeSubSig :: (Num a) => Rational -> (SubsigCT a) -> (SubsigCT a)+takeSubSig c (SubsigCT (f,(a,b))) | c >= (b-a) = SubsigCT (f,(a,b))+ | otherwise = SubsigCT (f,(a,a+c))+++dropSubSig :: (Num a) => Rational -> (SubsigCT a) -> (SubsigCT a)+dropSubSig c (SubsigCT (f,(a,b))) | c > (b-a) = SubsigCT (f,(b,b))+ | otherwise = SubsigCT (f,(a+c,b))++-----------------------------------------------------------------------+-- Functions to display and plot signals:+-----------------------------------------------------------------------+{- $plotdoc+ Several functions are available to display a signal in textual or + graphics form. All displaying of signals is based on sampling and + evaluation the signal at regular sampling points. ++ The function 'sample' evaluates the signal and returns a list of + (time,value) pairs, which can be displayed as text or used in any other way.+ + 'showParts' does not evaluate the signal; it only shows how it is + partitioned. Hence, it returns a sequence of intervals.+ + 'plot', 'plotCT' and 'plotCT'' can plot a signal or a list of signals + in a graph. They use @gnuplot@ for doing the actual work.+ They are in the IO monad because they write to the file system.+ + 'plot' is defined in terms of 'plotCT' but it uses the default sampling + period 'timeStep' and it can plot only one signal in a plot.+ + 'plotCT' can plot a list of signals in the same plot.+ 'plotCT' is defined in terms of 'plotCT'' but uses + default label names for the plot.++ 'vcdGen' writes the values of signals in Value Change Dump (VCD) format to + a file. There are public domain wave viewers which understand this format + and can display the signals.+-}++-- |'sample' computes the values of a signal with a given step size. +-- It returns a list with (x, (f x)) pairs of type [(Rational,Rational)].+sample :: (Num a) =>+ Rational -- ^ The sampling period+ -> Signal (SubsigCT a) -- ^The signal to be sampled+ -> [(Rational,a)] -- ^The list of (time,value) pairs of the + -- evaluated signal+sample _ NullS = []+sample step (ss :- s) = sampleSubsig step ss ++ (sample step s)++-- sampleSubsig samples a Subsig signal:+sampleSubsig :: (Num a) => Rational -> (SubsigCT a) -> [(Rational,a)]+sampleSubsig step (SubsigCT (f,(a,b)))+ | b>a = (a,(f a)) : (sampleSubsig step (SubsigCT (f,(a+step,b))))+ | otherwise = []++-- |'showParts' allows to see how a signal is partitioned into sub-signals.+-- It returns the sequence of intervals.+showParts :: (Num a) =>+ Signal (SubsigCT a) -- ^The partitioned signal+ -> [(Double,Double)] -- ^The sequence of intervals+showParts NullS = []+showParts (SubsigCT (_,(a,b)):-s) = (fromRational a,fromRational b) + : (showParts s)++-----------------------------------------------------------------------------+-- |'plot' plots one signal in a graph with the default sampling period +-- of 1\/200 of the duration of the signal.+plot :: (Num a) =>+ Signal (SubsigCT a) -- ^The signal to be plotted.+ -> IO String -- ^A reporting message.+plot s = plotCT step [s]+ where step = (duration s) / 200.0++-- |'plotCT' plots a list of signals in the same graph. The sampling period +-- has to be given as argument. In the graph default label names are used+-- to identify the signals.+plotCT :: (Num a) =>+ Rational -- ^The sampling period+ -> [Signal (SubsigCT a)] -- ^The list of signals to be ploted + -- in the same graph+ -> IO String -- ^A messeage reporting what has been done.+plotCT step sigs = plotCT' step (map (\ s -> (s,"")) sigs)++{- |+ 'plotCT'' is the work horse for plotting and the functions 'plot' and + 'plotCT' use it with specialising arguments.++ 'plotCT'' plots all the signals in the list in one graph. If a label is+ given for a signal, this label appears in the graph. If the label string is + \"\", a default label like \"sig-1\" is used.++ In addition to displaying the graph on the screen, the following files+ are created in directory .\/fig:++ [ct-moc-graph.eps] an eps file of the complete graph++ [ct-moc-graph.pdf] A pdf file of the complete graph+ + [ct-moc-graph-latex.eps] included by ct-moc-graph-latex.tex++ [ct-moc-graph-latex.tex] This is the tex file that should be included+ by your latex document. It in turn includes+ the file ct-moc-graph-latex.eps.+ These two files have to be used together;+ the .eps file contains only the graphics,+ while the .tex file contains the labels and + text.+-}+plotCT' :: (Num a) =>+ Rational -- ^Sampling period+ -> [(Signal (SubsigCT a), String)]+ -- ^A list of (signal,label) pairs. The signals are plotted and+ -- denoted by the corresponding labels in the plot.+ -> IO String -- ^A simple message to report completion+plotCT' _ [] = return []+plotCT' 0 _ = error "plotCT: Cannot compute signal with step=0.\n"+plotCT' step sigs = plotSig (expandSig 1 sigs)+ where + expandSig :: (Num a ) => + Int -> [(Signal (SubsigCT a),String)] + -> [(Int,String,[(Rational,a)])]+ expandSig _ [] = []+ expandSig i ((sig,label):sigs) + = (i, label, (sample step sig)) : (expandSig (i+1) sigs)+ plotSig :: (Num a) => [(Int,String,[(Rational,a)])] -> IO String+ plotSig sigs + = do mkDir "./fig"+ writeDatFiles sigs+ -- We write the gnuplot script to a file;+ -- But we try several times with a different name because + -- with ghc on cygwin we cannot write to a script file while+ -- gnuplot is still running with the old script file:+ fname <- tryNTimes 10 + (\ file -> (writeFile file+ (mkPlotScript (map mkDatFileName sigs))))+ -- We fire up gnuplot:+ system ("gnuplot -persist " ++ fname)+ -- We return some reporting string:+ return ("Signal(s) " ++(mkAllLabels sigs) ++ " plotted.")+ writeDatFiles [] = return ()+ writeDatFiles (s@(_, _, sig): sigs) + = do writeFile (fst (mkDatFileName s)) (dumpSig sig)+ writeDatFiles sigs+ mkDatFileName :: (Int,String,a) -> (String,String)+ mkDatFileName (sigid,label,_) = ("./fig/ct-moc-" ++ (replChar ">" label) + ++(show sigid)++".dat", + (mkLabel label sigid))+ mkLabel :: String -> Int -> String+ mkLabel "" n = "sig-" ++ show n + mkLabel l _ = l+ mkAllLabels :: (Num a) => [(Int,String,[(Rational,a)])] -> String+ mkAllLabels sigs = drop 2 (foldl f "" sigs)+ where f labelString (n,label,_) + = labelString ++ ", " ++ (mkLabel label n)+ replChar :: String -- all characters given in this set are replaced by '_'+ -> String -- the string where characters are replaced+ -> String -- the result string with all characters replaced+ replChar [] s = s+ replChar _ [] = []+ replChar replSet (c:s) | elem c replSet = '_' : (replChar replSet s)+ | otherwise = c : (replChar replSet s)+ dumpSig :: (Num a) => [(Rational,a)] -> String+ dumpSig points = concatMap f points+ where f (x,y) = show ((fromRational x) :: Float) ++ " " + ++ show (y) ++ "\n"++ mkPlotScript :: [(String -- the file name of the dat file+ ,String -- the label for the signal to be drawn+ )] -> String -- the gnuplot script+ mkPlotScript ns = "set xlabel \"seconds\" \n"+ ++ "plot " ++ (f1 ns) ++ "\n"+ ++ "set terminal postscript eps color\n"+ ++ "set output \"" ++ plotFileName++".eps\"\n"+ ++ "replot \n"+ ++ "set terminal epslatex color\n"+ ++ "set output \"" ++ plotFileName++"-latex.eps\"\n"+ ++ "replot\n"+ -- ++ "set terminal pdf\n"+ -- ++ "set output \"fig/ct-moc-graph.pdf\"\n"+ -- ++ "replot\n"+ where f1 :: [(String,String)] -> String+ f1 ((datfilename,label):(n:ns)) + = "\t\"" ++ datfilename+ ++ "\" with linespoints title \""++label++"\",\\\n"+ ++ " " ++ (f1 (n:ns))+ f1 ((datfilename,label):[]) + = "\"" ++ datfilename + ++ "\" with linespoints title \""++label++"\"\n"+ f1 [] = ""+ plotFileName = "fig/ct-moc-graph-" ++ (f2 ns)+ f2 :: [(String,String)] -> String -- f2 generates part of the + -- filename for the eps and + -- latex files, which is + -- determined by the signal+ -- labels.+ f2 [] = ""+ f2 ((_,label):[]) = label+ f2 ((_,label):_) = label ++ "_"+ -- tryNTimes applies a given actions at most n times. Everytime+ -- the action is applied and an error occurrs, it tries again but + -- with a decremented first argument. It also changes the file name+ -- because the file name uses the n as part of the name.+ -- The idea is that the action tries different files to operate on.+ -- The problem was that when gnuplot was called on a gnuplot script+ -- file, it was not possible to write a new script file with the same+ -- name and start a new gnuplot process (at least not with ghc or ghci on + -- cygwin; it worked fine with hugs on cygwin). + -- So we go around the problem here by trying different file names until+ -- we succeed or until the maximum number of attempts have been performed.+ tryNTimes :: Int -> (String -> IO ()) -> IO String+ tryNTimes n a | n <= 0 = error "tryNTimes: not succedded"+ | n > 0 = + do catch (action fname a) (handler a)+ where handler :: (String -> IO()) -> IOError -> IO String+ handler a _ = tryNTimes (n-1) a+ fname = "./fig/ct-moc-" ++ (show n) ++ ".gnuplot"+ action :: String -> (String -> IO ()) -> IO String+ action fname a = do (a fname)+ return fname+ tryNTimes _ _ = error "tryNTimes: Unexpected pattern."++----------------------------------------------------------------------------+{- |+vcdGen dumps the values of a list of signal in VCD (Value Change Dump) format +(IEEE Std 1364-2001), which is part of the Verilog standard +(<http://en.wikipedia.org/wiki/Value_change_dump>).+There are public domain tools to view VCD files. For instance, +GTKWave (<http://home.nc.rr.com/gtkwave/>) is a popular viewer available for+Windows and Linux.++The values are written to the file ./fig/ct-moc.vcd. If the file exists, it+is overwritten. If the directory does not exist, it is created.++-}+vcdGen :: (Num a) + => Rational -- ^Sampling period; defines for what+ -- time stamps the values are written.+ -> [(Signal (SubsigCT a), String)]+ -- ^A list of (signal,label) pairs. The signal values written and+ -- denoted by the corresponding labels.+ -> IO String -- ^A simple message to report completion+vcdGen _ [] = return []+vcdGen 0 _ = error "vcdgen: Cannot compute signals with step=0.\n"+vcdGen step sigs = + do + -- putStr (show (distLabels (expandSig 1 sigs)))+ plotSig (expandSig 1 sigs)+ where + expandSig :: (Num a ) => + Int -> [(Signal (SubsigCT a),String)] + -> [(Int,String,[(Rational,a)])]+ expandSig _ [] = []+ expandSig i ((sig,label):sigs) + = (i, label, (sample step sig)) : (expandSig (i+1) sigs)+ plotSig :: (Num a) => [(Int,String,[(Rational,a)])] -> IO String+ plotSig sigs + = do writeVCDFile sigs+ -- We return some reporting string:+ return ("Signal(s) " ++(mkAllLabels sigs) ++ " dumped.")+ mkLabel :: String -> Int -> String+ mkLabel "" n = "sig-" ++ show n + mkLabel l _ = l+ mkAllLabels sigs = drop 2 (foldl f "" sigs)+ where f labelString (n,label,_) + = labelString ++ ", " ++ (mkLabel label n)+ writeVCDFile :: (Show a) => [(Int,String,[(Rational,a)])] -> IO()+ writeVCDFile sigs+ = do + mkDir "./fig"+ clocktime <- getClockTime+ let {date = calendarTimeToString (toUTCTime clocktime);+ labels = getLabels sigs;+ timescale = findTimescale sigs;}+ in writeFile mkVCDFileName+ ((vcdHeader timescale labels date)+ ++ (valueDump timescale (prepSigValues sigs)))+ mkVCDFileName :: String+ mkVCDFileName = ("./fig/ct-moc.vcd")++mkDir :: String -> IO()+mkDir dir = do dirExists <- doesDirectoryExist dir+ if (not dirExists) + then (createDirectory dir) + else return ()++-- prepSigValues rearranges the [(label,[(time,value)])] lists such +-- that we get a list of time time stamps and for each time stamp +-- we have a list of (label,value) pairs to be dumped:+prepSigValues :: (Show a) => [(Int,String,[(Rational,a)])]+ -> [(Rational,[(String,a)])]+prepSigValues sigs = f2 (distLabels sigs)+ where + -- f2 transforms a [[(label,time,value)]] + -- into a [(time, [label,value])] structure:+ f2 :: (Show a) + => [[(String,Rational,a)]] -> [(Rational,[(String,a)])]+ f2 [] = []+ f2 ([]:_) = [] + f2 xs = f3 hdxs : f2 tailxs+ where + -- here we take all first elements of the lists in xs+ -- and the tail of the lists in xs:+ (hdxs,tailxs) = (map g1 xs,+ map (\ (_:ys)-> ys) xs)+ g1 [] = error ("prepSig.f2.g1: first element of xs is empty:"+ ++ "xs="++show xs)+ g1 (y:_) = y+ f3 :: (Show a) + => [(String,Rational,a)] -> (Rational,[(String,a)])+ f3 (valList@((_, time, _):_)) = (time, f4 time valList)+ f3 [] = error ("prepSigValues.f2.f3: "+ ++ "empty (label,time,value)-list")+ f4 :: (Show a) + => Rational -> [(String,Rational,a)] -> [(String,a)]+ f4 _ [] = []+ f4 time ((label,time1,value):valList) + | time == time1 = (label,value) : f4 time valList+ | otherwise + = error ("prepSigValues: Time stamps in different"+ ++ " signals do not match: time="+ ++(show time)++", time1="++(show time1)+ ++", label="++label++", value="++(show value)+ ++"!")+-- distLabels inserts the labels into its corresponding +-- (time,value) pair list to get a (label,time,value) triple:+distLabels :: [(Int,String,[(Rational,a)])] + -> [[(String,Rational,a)]]+distLabels [] = []+distLabels ((_,label,valList):sigs) + = (map (\ (t,v) -> (label,t,v)) valList) : (distLabels sigs)+getLabels :: [(Int,String,[(Rational,a)])] -> [String]+getLabels = map (\(_,label,_)-> label)+vcdHeader :: Rational -> [String] -> String -> String+vcdHeader timescale labels date = "$date\n"+ ++ date ++ "\n"+ ++ "$end\n"+ ++ "$version\n"+ ++ "ForSyDe CTLib " ++ revision ++ "\n"+ ++ "$end\n"+ ++ "$timescale 1 " ++ (timeunit timescale) ++ " $end\n"+ ++ "$scope module top $end\n"+ ++ (concatMap (\ label -> ("$var real 64 "++label+ ++ " " ++ label + ++ " $end\n")) labels)+ ++ "$upscope $end\n"+ ++ "$enddefinitions $end\n"+ ++ "#0\n"+ ++ "$dumpvars\n"+ ++ (concatMap (\ label -> "r0.0 "++label++ "\n") + labels)+ ++ "\n"+valueDump :: (Show a) => Rational -> [(Rational,[(String,a)])] -> String+valueDump _ [] = ""+valueDump timescale ((t,values):valList) + = "#"++(show (g (t/timescale)))++"\n" + ++ (f values) ++ (valueDump timescale valList)+ where + f :: (Show a) => [(String,a)] -> String+ f [] = ""+ f ((l,v):values) = "r"++(show v)++" "++l++"\n" ++ (f values)+ g :: Rational -> Integer+ -- Since the VCD format expects integers for the timestamp, we make+ -- sure that only an integer is printed in decimal format (no exponent):+ g t = round t+++timeunit :: Rational -> String+timeunit timescale | timescale == 1 % 1 = "s"+ | timescale == 1 % 1000 = "ms"+ | timescale == 1 % 1000000 = "us"+ | timescale == 1 % 1000000000 = "ns"+ | timescale == 1 % 1000000000000 = "ps"+ | timescale == 1 % 1000000000000000 = "fs"+ | otherwise = error ("timeunit: unexpected timescale: "+ ++ (show timescale))++findTimescale :: [(Int,String,[(Rational,a)])] -> Rational+findTimescale sigs + = f 1 (concatMap (\ (_,_,valList) -> (fst (unzip valList))) sigs)+ where + f :: Rational -> [Rational] -> Rational+ f scale [] = scale+ f scale (x:xs) | r == 0 = f scale xs+ | otherwise = f (scale/1000) xs+ where (_,r) = (properFraction (abs (x / scale))) + :: (Int,Rational)++-------------------------------------------------------------------------+-----------------------------------------------------------+-- Testing the CT signals and process constructors:++{--+main = testAll+testAll = + do + testScaleCT + testAddCT + testMultCT + testAbsCT + testDelayCT+ testConverters+ testFeedback+-- test scaleCT:+testScaleCT = plotCT' 1E-4 [(toneA, "Tone A"), + ((scaleCT 1.5 toneA), "Tone A x 1.5"),+ ((scaleCT 2.0 toneA), "Tone A x 2.0")]++-- test addCT:+testAddCT = plotCT' 1e-4 [(toneA, "Tone A"),+ (toneE, "Tone E"), + ((addCT toneA toneE), "Tones A+E")]++-- test multCT:+testMultCT = plotCT' 1e-4 [(toneA, "Tone A"),+ (toneE, "Tone E"), + ((multCT toneA toneE), "Tones A x E")]++-- test absCT:+testAbsCT = plotCT' 1E-4 [(toneA, "Tone A"), + ((absCT toneA), "abs (Tone A)")]++-- test delayCT:+testDelayCT = plotCT' 1E-4 + [(toneA, "Tone A"), + (takeCT 0.02 ((delayCT 0.0025 toneA)), + "Tone A delayed by 2.5ms"),+ (takeCT 0.02 ((shiftCT 0.003 toneA)), "Tone A shifted by 3ms")]++-- test a2dConverter:+testConverters = + do (plotCT' 1e-4+ [(toneA, "Tone A"),+ (d2aConverter DAlinear 1e-3 (a2dConverter 1e-3 toneA),+ "Tone A (A->D->A) converted with linear mode, 1ms sampling period")])+ (plotCT' 1e-4+ [(toneA, "Tone A"),+ (d2aConverter DAhold 1e-3 (a2dConverter 1e-3 toneA),+ "Tone A (A->D->A) converted with hold mode, 1ms sampling period")])++-- test a feed back loop:+block sin = [sin,s1,s2,sout]+ where sout = p2 s1+ s1 = p1 sin s2+ s2 = p3 sout+ -- The individual processes:+ p1 :: Signal (SubsigCT Double) -> Signal (SubsigCT Double)+ -> Signal (SubsigCT Double)+ p2,p3 :: Signal (SubsigCT Double) -> Signal (SubsigCT Double)+ p1 = addCT+ p2 = scaleCT 0.5+ p3 = initCT (zeroCT 0.0005)+testFeedback = plotCT' 0.0001 ss+ where ss = [(sin, "sin"), (s1, "s1"), (s2, "s2"), (sout, "sout")]+ [sin,s1,s2,sout] = block (takeCT 0.005 toneA)++++toneA = sineWave (440.0) (0, 0.02)+toneE = sineWave 520.0 (0, 0.02)+-}++{- Some performance tests on my laptop under cygwin:++***********************************************************************+With ghc:++with +toneA = sineWave (440.0) (0, 2.0)+toneE = sineWave 520.0 (0, 2.0)++****+we make testAll with Double data types on++ghc --make CTLib.hs -O3 -o ttt.exe+time ttt+ +real 0m33.749s+user 0m0.010s+sys 0m0.010s++****+we make testAll with Rational data types on++ghc --make CTLib.hs -O3 -o ttt.exe+time ttt+ +real 0m53.687s+user 0m0.010s+sys 0m0.010s++****+hence the performance penalty when using Rational instead of Double is+1.59 (60%) longer delay.+++************************************************************************+On hugs: (when using 0.2 second long waves, hugs aborted with an out of memory +message both with Double and Rational; but with Double it aborted much faster;)++toneA = sineWave (440.0) (0, 0.02)+toneE = sineWave 520.0 (0, 0.02)++****************+**** with Double:+time runhugs.exe -h500k CTLib.hs++real 0m1.702s+user 0m0.020s+sys 0m0.010s++******************+**** with Rational:++time runhugs.exe -h500k CTLib.hs++real 0m21.501s+user 0m0.010s+sys 0m0.020s++****************+hence we have a factor of 12.5 longer delay with Rational compared to Double.+++-}
+ src/ForSyDe/Shallow/CoreLib.hs view
@@ -0,0 +1,37 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde@kth.se+-- Stability : experimental+-- Portability : portable +-- +-- The CoreLib is the base for all MoC libraries and is a container+-- that includes the following libraries:+-- +-- * "ForSyDe.Shallow.Signal"+-- +-- * "ForSyDe.Shallow.Vector"+-- +-- * "ForSyDe.Shallow.AbsentExt" +-----------------------------------------------------------------------------++module ForSyDe.Shallow.CoreLib( + module ForSyDe.Shallow.Signal,+ module ForSyDe.Shallow.Vector,+ module ForSyDe.Shallow.AbsentExt+ ) where++import ForSyDe.Shallow.Vector+import ForSyDe.Shallow.Signal+import ForSyDe.Shallow.AbsentExt++++++++
+ src/ForSyDe/Shallow/DFT.hs view
@@ -0,0 +1,71 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.DFT+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module includes the standard Discrete Fourier Transform (DFT)+-- function, and a fast Fourier transform (FFT) algorithm, for+-- computing the DFT, when the input vectors' length is a power of 2.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.DFT(dft, fft) where++import ForSyDe.Shallow.Vector+import Data.Complex++-- | The function 'dft' performs a standard Discrete Fourier Transformation+dft :: Int -> Vector (Complex Double) -> Vector (Complex Double)+dft bigN x | bigN == (lengthV x) = mapV (bigX_k bigN x) (nVector x)+ | otherwise = error "DFT: Vector has not the right size!" + where+ nVector x' = iterateV (lengthV x') (+1) 0+ bigX_k bigN' x' k = sumV (zipWithV (*) x' (bigW' k bigN'))+ bigW' k' bigN' = mapV (** k') (mapV cis (fullcircle bigN'))+ sumV = foldlV (+) (0:+ 0)++fullcircle :: Int -> Vector Double +fullcircle n = fullcircle1 0 (fromIntegral n) n+ where+ fullcircle1 l m n' + | l == m = NullV+ | otherwise = -2*pi*l/(fromIntegral n') + :> fullcircle1 (l+1) m n' ++-- | The function 'fft' implements a fast Fourier transform (FFT) algorithm, for computing the DFT, when the size N is a power of 2.+fft :: Int -> Vector (Complex Double) -> Vector (Complex Double)+fft bigN xv | bigN == (lengthV xv) = mapV (bigX xv) (kVector bigN)+ | otherwise = error "FFT: Vector has not the right size!"++kVector :: (Num b, Num a) => a -> Vector b +kVector bigN = iterateV bigN (+1) 0 +++bigX :: Vector (Complex Double) -> Int -> Complex Double+bigX (x0:>x1:>NullV) k | even k = x0 + x1 * bigW 2 0+ | odd k = x0 - x1 * bigW 2 0+bigX xv k = bigF_even k + bigF_odd k * bigW bigN (fromIntegral k)+ where bigF_even k' = bigX (evens xv) k'+ bigF_odd k' = bigX (odds xv) k'+ bigN = lengthV xv++bigW :: Int -> Int -> Complex Double+bigW bigN k = cis (-2 * pi * (fromIntegral k) / (fromIntegral bigN))++evens :: Vector a -> Vector a+evens NullV = NullV+evens (v1:>NullV) = v1 :> NullV+evens (v1:>_:>v) = v1 :> evens v++odds :: Vector a -> Vector a+odds NullV = NullV+odds (_:>NullV) = NullV+odds (_:>v2:>v) = v2 :> odds v+++++
+ src/ForSyDe/Shallow/DomainInterfaces.hs view
@@ -0,0 +1,130 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.DomainInterfaces+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module defines domain interface constructors for the multi-rate computational +-- model.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.DomainInterfaces(downDI, upDI, par2serxDI, ser2parxDI, + par2ser2DI, par2ser3DI, par2ser4DI, + ser2par2DI, ser2par3DI, ser2par4DI) where++import ForSyDe.Shallow.CoreLib+import ForSyDe.Shallow.SynchronousLib+++-- | The domain interface constructor 'downDI' takes a parameter 'k' and downsamples an input signal.+downDI :: Num a => a -> Signal b -> Signal b++-- | The domain interface constructors 'upDI' takes a parameter 'k' and upsamples an input signal.+upDI :: Num a => a -> Signal b -> Signal (AbstExt b)++-- | The domain interface constructor 'par2ser2DI' converts two parallel signals into one signal.+par2ser2DI :: Signal a -> Signal a -> Signal a++-- | The domain interface constructor 'par2ser3DI' converts three parallel signals into one signal+par2ser3DI :: Signal a -> Signal a -> Signal a -> Signal a++-- | The domain interface constructor 'par2ser4DI' converts four parallel signals into one signal+par2ser4DI :: Signal a -> Signal a -> Signal a -> Signal a + -> Signal a+++-- | The domain interface constructor 'par2serxDI' converts n parallel signals into one signal.+par2serxDI :: Vector (Signal a) -> Signal a++-- | The domain interface constructor 'ser2par2DI' converts one signal into two parallel signals.+ser2par2DI :: Signal a -> (Signal (AbstExt a), Signal (AbstExt a))++-- | The domain interface constructor 'ser2par3DI' converts one signal into three parallel signals.+ser2par3DI :: Signal a -> (Signal (AbstExt a), Signal (AbstExt a), Signal (AbstExt a))++-- | The domain interface constructor 'ser2par4DI' converts one signal into four parallel signals.+ser2par4DI :: Signal a + -> (Signal (AbstExt a), Signal (AbstExt a), + Signal (AbstExt a), Signal (AbstExt a))++-- | The domain interface constructors 'ser2parxDI' converts one signal into n parallel signals.+ser2parxDI :: (Num a, Ord a) => a -> Signal (AbstExt b) + -> Vector (Signal (AbstExt b))++-- Implementation++downDI n xs = down1 n 1 xs + where down1 _ _ NullS = NullS+ down1 1 1 (x:-xs) = x :- down1 1 1 xs+ down1 n 1 (x:-xs) = x :- down1 n 2 xs+ down1 n m (_:-xs) = if m == n then+ down1 n 1 xs+ else+ down1 n (m+1) xs ++upDI _ NullS = NullS+upDI n (x:-xs) = (Prst x) :- ((copyS (n-1) Abst) +-+ upDI n xs)++par2ser2DI xs ys = par2ser2DI' (zipSY xs ys)+ where par2ser2DI' NullS = NullS+ par2ser2DI' ((x,y):-xys) = x:-y:-par2ser2DI' xys++par2ser3DI xs ys zs = par2ser3DI' (zip3SY xs ys zs)+ where par2ser3DI' NullS = NullS+ par2ser3DI' ((x,y,z):-xyzs) = x:- y :-z :- par2ser3DI' xyzs++par2ser4DI ws xs ys zs = par2ser4DI' (zip4SY ws xs ys zs)+ where par2ser4DI' NullS = NullS+ par2ser4DI' ((w,x,y,z):-wxyzs) + = w:-x:-y:-z:- par2ser4DI' wxyzs++ser2par2DI = unzipSY . group2SY . delaynSY Abst 2 . mapSY abstExt++ser2par3DI = unzip3SY . group3SY . delaynSY Abst 3 . mapSY abstExt++ser2par4DI = unzip4SY . group4SY . delaynSY Abst 4 . mapSY abstExt+++par2serxDI = par2serxDI' . zipxSY + where par2serxDI' NullS = NullS+ par2serxDI' (xv:-xs) = (signal . fromVector) xv + +-+ par2serxDI' xs ++ser2parxDI n = unzipxSY . delaySY (copyV n Abst) + . filterAbstDI . group n++group2SY :: Signal t -> Signal (t, t)+group2SY NullS = NullS+group2SY (_:-NullS) = NullS+group2SY (x:-y:-xys) = (x, y) :- group2SY xys++group3SY :: Signal t -> Signal (t, t, t)+group3SY NullS = NullS+group3SY (_:-NullS) = NullS+group3SY (_:-_:-NullS) = NullS+group3SY (x:-y:-z:-xyzs) = (x, y, z) :- group3SY xyzs++group4SY :: Signal t -> Signal (t, t, t, t)+group4SY NullS = NullS+group4SY (_:-NullS) = NullS+group4SY (_:-_:-NullS) = NullS+group4SY (_:-_:-_:-NullS) = NullS+group4SY (w:-x:-y:-z:-wxyzs) = (w, x, y, z) :- group4SY wxyzs +++filterAbstDI :: Signal (AbstExt a) -> Signal a+filterAbstDI NullS = NullS+filterAbstDI (Abst:-xs) = filterAbstDI xs+filterAbstDI ((Prst x):-xs) = x :- filterAbstDI xs++group :: (Ord a, Num a) => a -> Signal a1 -> Signal (AbstExt (Vector a1))+group n xs = mapSY (output n) (scanlSY (addElement n) (NullV, 0) xs)+ where addElement m (vs, n) x | n < m = (vs <: x, n+1)+ | n == m = (unitV x, 1)+ | otherwise = error "Vector of wrong size"+ output m (vs, n) | m == n = Prst vs+ | otherwise = Abst+
+ src/ForSyDe/Shallow/FIR.hs view
@@ -0,0 +1,36 @@+----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.FIR+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module implements a FIR filters for the synchronous computational model.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.FIR (firSY) where++import ForSyDe.Shallow.SynchronousLib+import ForSyDe.Shallow.CoreLib++-- | The function firSY implements a FIR-filter for the synchronous computational model. All kinds of FIR-filters can now be modeled by means of 'firSY'. The only argument needed is the list of coefficients, which is given as a vector of any size. To illustrate this, an 8-th order band pass filter is modeled as follows. +--+-- > bp = firSY (vector [0.06318761339784, 0.08131651217682, 0.09562326700432, +-- > 0.10478344432968, 0.10793629404886, 0.10478344432968, +-- > 0.09562326700432, 0.08131651217682, 0.06318761339784 ])+-- +firSY :: Fractional a => Vector a -> Signal a -> Signal a+firSY h = innerProdSY h . sipoSY k 0.0+ where k = lengthV h++sipoSY :: Int -> b -> Signal b -> Vector (Signal b) +sipoSY n s0 = unzipxSY . scanldSY shiftrV initState+ where initState = copyV n s0++innerProdSY :: (Num a) => Vector a -> Vector (Signal a) -> Signal a+innerProdSY coeffs = zipWithxSY (ipV coeffs)+ where ipV NullV NullV = 0+ ipV (h:>hv) (x:>xv) = h*x + ipV hv xv+ ipV _ _ = error "Vector of different length"
+ src/ForSyDe/Shallow/FilterLib.hs view
@@ -0,0 +1,314 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.FilterLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This is the filter library for ForSyDe heterogeneous MoCs - CT-MoC, SR-MoC,+-- and Untimed-MoC.+--+-- The filters at CT-MoC are based on the filters implemented at SR-MoC and Untimed-MoC, +-- which means a signal in CT-MoC is always digitalized by a A\/D converter, processed by +-- digital filters at SR or Untimed domain, and converted back into a CT domain signal by +-- a D\/A converter. A CT-filter is composed of one A\/D converter, one digital filter, and +-- one D\/A converter.+--+-- The implementation of the filters at untimed and synchronous domains follows the+-- way in a paper /An introduction to Haskell with applications to digital signal processing, +-- David M. Goblirsch, in Proceedings of the 1994 ACM symposium on Applied computing./,+-- where the details of the FIR\/IIR, AR, and ARMA filters are introduced. The ARMA filter+-- is the kernel part of our general linear filter 'zLinearFilter' in Z-domain at SR\/Untimed+-- MoC, and is also the kernel digital filter for the linear filter 'sLinearFilter' in +-- S-domain at CT-MoC.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.FilterLib (+ -- *FIR filter+ firFilter,+ -- *AR and ARMA filter trim+ arFilterTrim, armaFilterTrim,+ -- *The solver mode+ SolverMode(..),+ -- *The general linear filter in S-domain+ sLinearFilter,+ -- *The general linear filter in Z-domain+ zLinearFilter,+ -- *s2z domain coefficient tranformation+ s2zCoef,+ -- *The Z-domain to ARMA coefficient tranformation+ h2ARMACoef+ )+ where ++import ForSyDe.Shallow.MoCLib+--import ForSyDe.Shallow.CTLib+import ForSyDe.Shallow.CoreLib+import ForSyDe.Shallow.PolyArith+import Data.List (zipWith5)+import Control.Monad.Instances () -- Monad instance for (-> r)++-- |The FIR filter. Let '[x_n]' denote the input signal, '[y_n]' denote the ouput+-- signal, and '[h_n]' the impulse response of the filter. Suppose the length of+-- the impulse responses is M samples. The formula for '[y_n]' is +-- $sum_{k=0}^{M-1} h_k*x_{n-k}$.+firFilter :: (Num a) => [a] -- ^Coefficients of the FIR filter+ -> Signal a -- ^Input signal+ -> Signal a -- ^Output signal+firFilter hs xs = mealySY stateF (outF hs) (repeatN (length hs) 0) xs+ where+ stateF xs0 x = fixedList xs0 x+ outF hs xs0 x = iprod hs $ fixedList xs0 x++-- |The autoregressive filter is the simplest IIR filter. It is characterized +-- by a list of numbers '[a_1,a_2,...,a_M]' called the autoregression +-- coefficients and a single number 'b' called the gain. 'M' is the order of +-- the filter. Let '[x_n]' denote the input signal, '[y_n]' denote the ouput+-- signal. The formula for '[y_n]' is $\sum_{k=1}^M {a_k*y_{n-k}+b*x_n}$. +-- Although it is an IIR filter, here we only get the same length of ouput +-- signal as the input signal.+arFilterTrim :: (Num a, Fractional a) => + [a] -- ^Coefficients of the AR filter.+ -> a -- ^The gain+ -> Signal a -- ^Input signal+ -> Signal a -- ^Output signal+arFilterTrim as b xs = + mealySY (stateF as b) (outF as b) (repeatN (length as) 0) xs+ where+ stateF as b xs0 x = fixedList xs0 $ outF as b xs0 x + outF as b xs0 x = b*x + (iprod as xs0)++-- |The ARMA filter combines the FIR and AR filters. Let '[x_n]' denote the +-- input signal, '[y_n]' denote the ouput signal. The formula for '[y_n]' is+-- $\sum_{k=1}^M {a_k*y_{n-k}+b*x_n} + sum_{i=0}^{N-1} b_i*x_{n-i}$. The ARMA+-- filter can be defined as the composition of an FIR filter having the impulse+-- reponse '[b_0,b_1,...,b_N-1]' and an AR filter having the regression +-- coefficients '[a_1,a_2,...,a_M]' and a gain of '1'. Although it is an IIR +-- filter, here we only get the same length of ouput signal as the input signal.+armaFilterTrim :: (Num a, Fractional a) => + [a] -- ^Coefficients of the FIR filter+ -> [a] -- ^Coefficients of the AR filter.+ -> Signal a -- ^Input signal+ -> Signal a -- ^Output signal+armaFilterTrim bs as = arFilterTrim as 1 . firFilter bs+++-- |The solver mode.+data SolverMode = S2Z -- ^Tustin tranfer from s-domain to z-domain+ | RK4 -- ^Runge Kutta 4 with fixed simulation steps+ deriving (Show, Eq)++-- |The general linear filter in S-domain at CT-MoC. As the kernel+-- implementation is in Z-domain, the smapling rate should be specified. +-- It is used on the S-transformation with the following forms, with +-- coefficients for the descending powers of 's' and m < n.+--+-- > b_0*s^m + b_1*s^m-1 + ... + b_m-1*s^1 + b_m*s^0+-- >H(s) = ------------------------------------------------ (Eq 1)+-- > a_0*s^n + a_1*s^n-1 + ... + a_n-1*s^1 + a_n*s^0+--+-- If we multiply both the numerator and the denominator with s^-n, we get +-- another equivelent canonical form+--+-- > b_0*s^m-n + b_1*s^m-n-1 + ... + b_m-1*s^1-n + b_m*s^-n+-- >H(s) = ----------------------------------------------------- (Eq 2)+-- > a_0*s^0 + a_1*s^-1 + ... + a_n-1*s^1-n + a_n*s^-n+--+-- To instantiate a filter, with sampling interval 'T ', we use+--+-- > filter1 = sLinearFilter T [1] [2,1]+-- +-- to get a filter with the transfer function+-- +-- > 1+-- >H(s) = --------+-- > 2*s + 1+-- +-- and+--+-- > filter2 = sLinearFilter T [2,1] [1,2,2]+--+-- to get another filter with the transfer function+-- +-- > 2*s +1+-- >H(s) = ----------------+-- > s^2 + 2*s + 2+--+-- There are two solver modes, 'S2Z' and 'RK4'.+-- Caused by the precision problem, the time interval in CT uses Rational data+-- type and the digital data types in all the domains are Double.+sLinearFilter :: (Num a, Fractional a) =>+ SolverMode -- ^Specify the solver mode+ -> Rational -- ^Fixed simulation interval+ -> [a] -- ^Coefficients of the polynomial numerator in s-domain+ -> [a] -- ^Coefficients of the polynomial denominator in s-domain+ -> Signal (SubsigCT a)-- ^Input CT-signal+ -> Signal (SubsigCT a)-- ^Output CT-signal+sLinearFilter filterMode step bs as inS = outS + where+ -- A2D conversion+ inSDigital = a2dConverter step inS+ -- D2A conversion+ outS = d2aConverter DAhold step outSDigital+ -- Digital filter+ outSDigital | filterMode == S2Z = armaFilterTrim bs' as' inSDigital+ | otherwise = rk4FilterDigital step as bs inSDigital+ where (bs',as') = h2ARMACoef $ s2zCoef step bs as++-- |Digital filter using Runge Kutta 4 solver.+rk4FilterDigital :: Fractional a => + Rational -> [a] -> [a] -> Signal a -> Signal a+rk4FilterDigital step as bs inSDigital = outSDigital+ where+ -- Below are the skeletons of the RK-4 solver, with+ -- input signal 'inSDigital' and output signal 'outSDigital'+ -- Coefficients handling+ as'' = dropWhile (\x -> x==0.0) as+ a0 = head as''+ -- Normalized the coefficients+ as' = reverse $ tail $ map (\x -> -x/a0) as''+ bs' = reverse $ map (\x -> x/a0) bs+ -- Order of the filter+ orderFilter = length as'+ -- The last state function, '0' is for the time + fXn = iprod (0:as')+ -- The functions for the observalbe state matrix 'A'+ stateFunctions = ffn' orderFilter ++ [fXn]+ -- Initial states+ initialStates = repeatN orderFilter 0.0+ inputSteps = signal $ repeat step'+ -- The states signal+ statesSignal = rks4InSY 0.0 initialStates stateFunctions + inputSteps inSDigital --xs+ -- The ouput digital signal + outSDigital = mapSY (iprod bs') statesSignal+ -- The fixed simulation step+ step' = fromRational step++-- The length of the function list is 'n-1' for nth order filter+ffn' :: (Num t, Num t1) => t -> [[t1] -> t1]+ffn' n = ffn 0 n++-- Construct the functions for the diagonal '1'+ffn :: (Num t1, Num t) => Int -> t -> [[t1] -> t1]+ffn _ 1 = []+ffn m n = ff1 m : ffn (m+1) (n-1) ++ff1 :: Num t => Int -> [t] -> t+ff1 m = iprod ([0,0] ++ (repeatN m 0) ++ [1] ++ (repeat 0) )++-- |RK-4 to solve the 1st-order ODEs, with input signal.+rks4InSY :: (Num a, Fractional a) =>+ a -- ^The initial time+ -> [a] -- ^The initial state values+ -> [([a] -> a)] -- ^List of the functions of the ODEs.+ -> Signal a -- ^Input signal of steps+ -> Signal a -- ^Input signal+ -> Signal [a] -- ^Next state signal+rks4InSY x0 ys0 fFs hs us = scanl3SY stateF ys0 xs hs us+ where+ stateF ysn xn h ut = zipWith (+) (repeatN orderODE' 0.0 ++ [ut*h]) $ --Input value+ rks4 h xn fFs ysn + xs = scanldSY (+) x0 hs+ -- Order -1 of the ODEs+ orderODE' = length ys0 - 1++-- |One step RK-4 for the 1st-order ordinary differential equations (ODEs).+rks4 :: (Num a, Fractional a) =>+ a -- ^The step+ -> a -- ^Initial value of time+ -> [[a] -> a] -- ^List of the funcitons of the ODEs.+ -> [a] -- ^List of the value at the current state+ -> [a] -- ^List of the value at the next state+rks4 h x0 fFs ys0 = ys1+ where+ h_2 = h/2.0+ ks1 = map (h*) $ map' (x0:ys0) fFs -- -- map (h *) $ applyFt x0 fFs ys0+ ks2 = map (h*) $ map' (x0+h_2:zipWith (\y k-> y+k/2.0) ys0 ks1) fFs + ks3 = map (h*) $ map' (x0+h_2:zipWith (\y k-> y+k/2.0) ys0 ks2) fFs + ks4 = map (h*) $ map' (x0+h:zipWith (\y k-> y+k) ys0 ks3) fFs + ys1 = zipWith5 (\y0 k1 k2 k3 k4 -> y0 + k1/6 + k2/3 + k3/3 + k4/6)+ ys0 ks1 ks2 ks3 ks4++-- |The general linear filter in Z-domain.+zLinearFilter :: Fractional a => [a] -> [a] -> Signal a -> Signal a+zLinearFilter bs as = armaFilterTrim bs' as'+ where+ bs' = map ((\x y-> y/x ) (head as)) bs+ as' = map ((\x y-> -y/x ) (head as)) $ tail as++-- |s2z domain coefficient tranformation with a specified sampling rate.+-- The Tustin transformation is used for the transfer, with+--+-- > 2(z - 1) +-- > s = ---------- (Eq 3)+-- > T(z + 1)+--+-- in which, 'T' is the sampling interval.+s2zCoef :: (Num a, Fractional a) =>+ Rational -- ^Sampling rate in Z-domain+ -> [a] -- ^Coefficients of the polynomial numerator in s-domain+ -> [a] -- ^Coefficients of the polynomial denominator in s-domain+ -> ([a], [a]) -- ^Tuple of the numerator and denominator + -- coefficients in Z-domain+s2zCoef sampleT bs as = (reverse bs', reverse as')+ where+ (bs',as') = getCoef hZ + bsInv = reverse bs+ asInv = reverse as+ numerator' = foldl (\x y -> addPoly x $ scalePoly (fst y) (snd y)) + (Poly [0]) $ zip bsInv sList+ denominator' = foldl (\x y -> addPoly x $ scalePoly (fst y) (snd y)) + (Poly [0]) $ zip asInv sList+ hZ = divPoly numerator' denominator'+ -- Tustin transform+ s = PolyPair (Poly [-2,2],Poly [fromRational sampleT,fromRational sampleT])+ sList = map (powerPoly s) [0..]++-- |The Z-domain to ARMA coefficient tranformation. It is used on the +-- Z-transfer function+--+-- > b_0*z^m-n + b_1*z^m-n-1 + ... + b_m-1*z^1-n + b_m*z^-n+-- >H(z) = ----------------------------------------------------- (Eq 4)+-- > a_0*z^0 + a_1*z^-1 + ... + a_n-1*z^1-n + a_n*z^-n+--+-- which is normalized as+--+-- > b_0/a_0*z^m-n + b_1/a_0*z^m-n-1 + ... + b_m/a_0*z^-n+-- >H(z) = ------------------------------------------------------- (Eq 5)+-- > 1 + a_1/a_0*z^-1 + ... + a_n-1/a_0*z^1-n + a_n/a_0*z^-n+--+-- The implementation coudl be+--+-- >y(k) = b_0/a_0*x_k+m-n + b_1/a_0*x_k+m-n-1 + ... + b_m/a_0*x_k-n+-- > (Eq 6)+-- > - a_1/a_0*y_k-1 - ... - a_n/a_0*y_k-n+--+-- Then, we could get the coefficients of the ARMA filter.+h2ARMACoef :: (Num a, Fractional a) =>+ ([a], [a]) -- ^Coefficients in Z-domain+ -> ([a], [a]) -- ^Coefficients of the ARMA filter+h2ARMACoef (bs,as) = (scalePolyCoef a0_1 bs, + scalePolyCoef (0-a0_1) $ tail as)+ where+ a0_1 = 1.0/ head as++-- Helper functions++map' :: a -> [a->b] -> [b]+map' = flip $ sequence +++-- |Computes the inner product.+iprod :: Num b => [b] -> [b] -> b+iprod xs ys = sum [x*y | (x, y) <- zip xs ys]++-- |Repeat an element for a given times.+repeatN :: Int -> a -> [a]+repeatN n = take n . repeat++-- |Maintain a fixed length of list like Fifo, except the outputs are ignored.+fixedList :: [a] -> a -> [a]+fixedList xs y = take (length xs) $ y:xs
+ src/ForSyDe/Shallow/Gaussian.hs view
@@ -0,0 +1,68 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.Gaussian+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- We follow the Box-Muller method to generate white gaussian noise, +-- described at: <http://www.dspguru.com/howto/tech/wgn.htm>+-----------------------------------------------------------------------------+module ForSyDe.Shallow.Gaussian (+ pGaussianNoise+ )+where++import ForSyDe.Shallow.UntimedLib+import ForSyDe.Shallow.Signal++import System.Random++-- |To generate an infinite Signal of Gaussian values+pGaussianNoise:: Double -- Mean value of the Gaussian noise+ -> Double -- Variance of the Gaussian noise+ -> Int -- The seed+ -> Signal Double -- Output gaussian noise signal+pGaussianNoise mean variance = mapU 2 gaussianXY . pUnitNormXY+ where+ gaussianXY [x, y] = [mean + sqrt(variance) * x,+ mean + sqrt(variance) * y]+ gaussianXY _ = error "gaussianXY: unexpected pattern."++-- |To get a uniform random variable in the range [0, 1]+uniform :: (Fractional a, RandomGen g, Random a) => + g -> (a, g)+uniform rGen = randomR (0.0,1.0) rGen++-- |To generate an infinite signal of unit normal random variables,+-- with the specified seed+pUnitNormXY :: Int -- The seed+ -> Signal Double -- The infinite ouput signal+pUnitNormXY = mapU 3 unitNormXY . signal . svGenerator . mkStdGen+ where+ unitNormXY [s, v1, v2] = [sqrt(-2 * log(s) / s) * v1,+ sqrt(-2 * log(s) / s) * v2]+ unitNormXY _ = error "pUnitNormXY: Unexpected pattern."+++-- |To generate the s, v1, v2 value+svGenerator :: StdGen -> [Double]+svGenerator s+ | sVal >=1 = []++ svGenerator newStdG+ | otherwise = svVal ++ svGenerator newStdG+ where+ svGen1 = svHelper s+ svVal = fst svGen1+ sVal = head svVal+ newStdG = snd svGen1+ svHelper :: StdGen -> ([Double], StdGen)+ svHelper stdG = ([s, v1, v2], sNew2)+ where+ (u1, sNew1) = uniform stdG+ (u2, sNew2) = uniform sNew1+ v1=2 * u1 -1+ v2=2 * u2 -1+ s = v1*v1 + v2*v2
+ src/ForSyDe/Shallow/Memory.hs view
@@ -0,0 +1,64 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.Model+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module contains the data structure and access+-- functions for the memory model.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.Memory (+ Memory (..), Access (..), + MemSize, Adr, newMem, memState, memOutput+ ) where++import ForSyDe.Shallow.Vector+import ForSyDe.Shallow.AbsentExt++type Adr = Int+type MemSize = Int++-- | The data type 'Memory' is modeled as a vector. +data Memory a = Mem Adr (Vector (AbstExt a)) + deriving (Eq, Show)++-- | The data type 'Access' defines two access patterns.+data Access a = Read Adr -- ^ 'Read adr' reads an address from the memory.+ | Write Adr a -- ^ 'Write Adr a' writes a value into an address.+ deriving (Eq, Show)++-- | The function 'newMem' creates a new memory, where the number of entries is given by a parameter.+newMem :: MemSize -> Memory a++-- | The function 'memState' gives the new state of the memory, after an access to a memory. A 'Read' operation leaves the memory unchanged.+memState :: Memory a -> Access a -> Memory a+++-- | The function 'memOutput' gives the output of the memory after an access to the memory. A 'Write' operation gives an absent value as output.+memOutput :: Memory a -> Access a -> AbstExt a++-- Implementation++newMem size = Mem size (copyV size Abst)++writeMem :: Memory a -> (Int, a) -> Memory a+writeMem (Mem size vs) (i, x) + | i < size && i >= 0 = Mem size (replaceV vs i (abstExt x))+ | otherwise = Mem size vs++readMem :: Memory a -> Int -> (AbstExt a)+readMem (Mem size vs) i + | i < size && i >= 0 = vs `atV` i+ | otherwise = Abst++memState mem (Read _) = mem+memState mem (Write i x) = writeMem mem (i, x)++memOutput mem (Read i) = readMem mem i+memOutput _ (Write _ _) = Abst++
+ src/ForSyDe/Shallow/MoCLib.hs view
@@ -0,0 +1,38 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.MoCLib+-- Copyright : (c) SAM/KTH 2007+-- License : BSD-style (see the file LICENSE)+--+-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable +-- +-- The ForSyDeMoCLib is a container including all MoC libraries and+-- their domain interfaces. It consists of the following libraries:+--+-- * The library for the synchronous MoC: "SynchronousLib". In this+-- version the synchronous library is divided into three libraries:+-- SynchronousLib, SynchronousProcessLib and StochasticLib.+-- +-- * The library for the untimed MoC: "ForSyDe.Shallow.UntimedLib"+-- +-- * The library for the continuous time MoC: "ForSyDe.Shallow.CTLib"+--+-- * The library for the domain interfaces: "ForSyDe.Shallow.DomainInterfaces"+-----------------------------------------------------------------------------+module ForSyDe.Shallow.MoCLib( + module ForSyDe.Shallow.SynchronousLib,+ module ForSyDe.Shallow.SynchronousProcessLib,+ module ForSyDe.Shallow.StochasticLib,+ module ForSyDe.Shallow.CTLib,+ module ForSyDe.Shallow.UntimedLib,+ module ForSyDe.Shallow.DomainInterfaces+ ) where++import ForSyDe.Shallow.StochasticLib+import ForSyDe.Shallow.SynchronousLib+import ForSyDe.Shallow.CTLib+import ForSyDe.Shallow.UntimedLib+import ForSyDe.Shallow.DomainInterfaces+import ForSyDe.Shallow.SynchronousProcessLib
+ src/ForSyDe/Shallow/PolyArith.hs view
@@ -0,0 +1,106 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.PolyArith+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This is the polynomial arithematic library. The arithematic operations include +-- addition, multiplication, division and power. However, the computation time is +-- not optimized for multiplication and is O(n2), which could be considered to be +-- optimized by FFT algorithms later on.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.PolyArith(+ -- *Polynomial data type+ Poly(..),+ -- *Addition, DmMultiplication, division and power operations+ addPoly, mulPoly, divPoly, powerPoly,+ -- *Some helper functions+ getCoef, scalePoly, addPolyCoef, subPolyCoef, scalePolyCoef+ )+ where ++-- |Polynomial data type.+data Num a => Poly a = Poly [a]+ | PolyPair (Poly a, Poly a) deriving (Eq)+++-- |Multiplication operation of polynomials.+mulPoly :: Num a => Poly a -> Poly a -> Poly a+mulPoly (Poly []) _ = Poly []+mulPoly _ (Poly []) = Poly []+-- Here is the O(n^2) version of polynomial multiplication+mulPoly (Poly xs) (Poly ys) = Poly $ foldr (\y zs ->+ let (v:vs) = scalePolyCoef y xs in v :addPolyCoef vs zs) [] ys+mulPoly (PolyPair (a, b)) (PolyPair (c, d)) =+ PolyPair (mulPoly a c, mulPoly b d)+mulPoly (PolyPair (a, b)) (Poly c) =+ PolyPair (mulPoly a (Poly c), b)+mulPoly (Poly c) (PolyPair (a, b)) =+ mulPoly (PolyPair (a, b)) (Poly c)++-- |Division operation of polynomials.+divPoly :: Num a => Poly a -> Poly a -> Poly a+divPoly (Poly a) (Poly b) = PolyPair (Poly a,Poly b)+divPoly (PolyPair (a, b)) (PolyPair (c, d)) =+ mulPoly (PolyPair (a, b)) (PolyPair (d, c))+divPoly (PolyPair (a, b)) (Poly c) =+ PolyPair (a, mulPoly b (Poly c))+divPoly (Poly c) (PolyPair (a, b)) =+ PolyPair (mulPoly b (Poly c), a)++-- |Addition operations of polynomials.+addPoly :: Num a => Poly a -> Poly a -> Poly a+addPoly (Poly a) (Poly b) = Poly $ addPolyCoef a b+addPoly (PolyPair (a, b)) (PolyPair (c, d)) =+ if b==d then -- simplifyPolyPair $+ PolyPair (addPoly a c, d)+ else -- simplifyPolyPair $+ PolyPair (dividedPoly, divisorPoly)+ where+ divisorPoly = if b ==d then b else mulPoly b d+ dividedPoly = if b == d then addPoly a c+ else addPoly (mulPoly a d) (mulPoly b c)+addPoly (Poly a) (PolyPair (c, d) ) =+ addPoly (PolyPair (multiPolyHelper, d)) (PolyPair (c,d) )+ where+ multiPolyHelper = mulPoly (Poly a) d+addPoly abPoly@(PolyPair _) cPoly@(Poly _) = addPoly cPoly abPoly+ +-- |Power operation of polynomials.+powerPoly :: Num a => Poly a -> Int -> Poly a+powerPoly p n = powerX' (Poly [1]) p n+ where+ powerX' :: Num a => Poly a -> Poly a -> Int -> Poly a+ powerX' p' _ 0 = p'+ powerX' p' p n = powerX' (mulPoly p' p) p (n-1)++-- |Some helper functions below.++-- |To get the coefficients of the polynomial.+getCoef :: Num a => Poly a -> ([a],[a])+getCoef (Poly xs) = (xs,[1])+getCoef (PolyPair (Poly xs,Poly ys)) = (xs,ys)+getCoef _ = error "getCoef: Nested fractions found"++scalePoly :: (Num a) => a -> Poly a -> Poly a+scalePoly s p = mulPoly (Poly [s]) p++addPolyCoef :: Num a => [a] -> [a] -> [a]+addPolyCoef = zipWithExt (0,0) (+)+subPolyCoef :: RealFloat a => [a] -> [a] -> [a]+subPolyCoef = zipWithExt (0,0) (-)++scalePolyCoef :: (Num a) => a -> [a] -> [a]+scalePolyCoef s p = map (s*) p++-- |Extended version of 'zipWith', which will add zeros to the shorter list.+zipWithExt :: (a,b) -> (a -> b -> c) -> [a] -> [b] -> [c]+zipWithExt _ _ [] [] = []+zipWithExt (x0,y0) f (x:xs) [] = f x y0 : (zipWithExt (x0,y0) f xs [])+zipWithExt (x0,y0) f [] (y:ys) = f x0 y : (zipWithExt (x0,y0) f [] ys)+zipWithExt (x0,y0) f (x:xs) (y:ys) = f x y : (zipWithExt (x0,y0) f xs ys)+
+ src/ForSyDe/Shallow/Queue.hs view
@@ -0,0 +1,98 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.Queue+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+--+-- This provides two data types, that can be used to model queue+-- structures, such as FIFOs. There is a data type for an queue of+-- infinite size 'Queue' and one for finite size 'FiniteQueue'.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.Queue where++import ForSyDe.Shallow.AbsentExt ++-- | A queue is modeled as a list. The data type 'Queue' modelles an queue of infinite size.+data Queue a = Q [a] deriving (Eq, Show)++-- | The data type 'FiniteQueue' has an additional parameter, that determines the size of the queue.+data FiniteQueue a = FQ Int [a] deriving (Eq, Show)++{-+Table \ref{tab:QueueFunctions} shows the functions an the data types \haskell{Queue} and \haskell{FiniteQueue}.+%+\begin{table}+\label{tab:QueueFunctions}+\begin{tabular}{lll}+\hline+infinite & finite & description \\+\hline+\hline+\haskell{pushQ} & \haskell{pushFQ} & pushes one element on the queue \\+\haskell{pushListQ} & \haskell{pushListFQ} & pushes a list of elements on the queue \\+\haskell{popQ} & \haskell{popFQ} & pops one element from the queue \\+\haskell{queue} & \haskell{finiteQueue} & transforms a list into a queue \\+\hline+\end{tabular}+\caption{Functions on the data types \haskell{Queue} and \haskell{FiniteQueue}}+\end{table}+-}++-- | 'pushQ' pushes one element into an infinite queue.+pushQ :: Queue a -> a -> Queue a++-- | 'pushListQ' pushes a list of elements into an infinite queue.+pushListQ :: Queue a -> [a] -> Queue a++-- | 'popQ' pops one element from an infinite queue.+popQ :: Queue a -> (Queue a, AbstExt a)++-- | 'queue' transforms a list into an infinite queue.+queue :: [a] -> Queue a++-- | 'pushFQ' pushes one element into a finite queue.+pushFQ :: FiniteQueue a -> a -> FiniteQueue a++-- | 'pushListFQ' pushes a list of elements into a finite queue.+pushListFQ :: FiniteQueue a -> [a] -> FiniteQueue a++-- | 'popFQ' pops one element from a finite queue.+popFQ :: FiniteQueue a + -> (FiniteQueue a, AbstExt a)++-- | 'finiteQueue' transforms a list into an infinite queue.+finiteQueue :: Int -> [a] -> FiniteQueue a+++-- Implementation++pushQ (Q q) x = Q (q ++ [x])++pushListQ (Q q) xs = Q (q ++ xs)++popQ (Q []) = (Q [], Abst)+popQ (Q (x:xs)) = (Q xs, Prst x)++queue xs = Q xs++pushFQ (FQ n q) x = if length q < n then+ (FQ n (q ++ [x]))+ else + (FQ n q)++pushListFQ (FQ n q) xs = FQ n (take n (q ++ xs))++popFQ (FQ n []) = (FQ n [], Abst)+popFQ (FQ n (q:qs)) = (FQ n qs, Prst q)+ +finiteQueue n xs = FQ n (take n xs)+++++
+ src/ForSyDe/Shallow/Signal.hs view
@@ -0,0 +1,224 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.Signal+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module defines the shallow-embedded 'Signal' datatype and+-- functions operating on it.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.Signal( Signal (NullS, (:-)), (-:), (+-+), (!-), + signal, fromSignal,+ unitS, nullS, headS, tailS, atS, takeS, dropS,+ lengthS, infiniteS, copyS, selectS, writeS, readS, fanS+ ) where++infixr 5 :-+infixr 5 -:+infixr 5 +-++infixr 5 !-+++-- | A signal is defined as a list of events. An event has a tag and a value. The tag of an event is defined by the position in the list. A signal is defined as an instance of the classes 'Read' and 'Show'. The signal 1 :- 2 :- NullS is represented as \{1,2\}.+data Signal a = NullS+ | a :- Signal a deriving (Eq)++-- | The function 'signal' converts a list into a signal.+signal :: [a] -> Signal a ++-- | The function 'fromSignal' converts a signal into a list.+fromSignal :: Signal a -> [a]++-- | The function 'unitS' creates a signal with one value.+unitS :: a -> Signal a++-- | The function 'nullS' checks if a signal is empty.+nullS :: Signal a -> Bool++-- | The function 'headS' gives the first value - the head - of a signal.+headS :: Signal a -> a++-- | The function 'tailS' gives the rest of the signal - the tail.+tailS :: Signal a -> Signal a++-- | The function 'atS' returns the n-th event in a signal. The numbering of events in a signal starts with 0. There is also an operator version of this function, '(!-)'.+atS :: Int -> Signal a -> a++-- | The function 'takeS' returns the first n values of a signal.+takeS :: Int -> Signal a -> Signal a++-- | The function 'dropS' drops the first $n$ values from a signal.+dropS :: Int -> Signal a -> Signal a++-- | The function 'selectS' takes three parameters, an offset, a stepsize and a signal and returns some elements of the signal such as in the following example:+--+-- @+-- Signal> selectS 2 3 (signal[1,2,3,4,5,6,7,8,9,10])+-- {3,6,9} :: Signal Integer+-- @+selectS :: Int -> Int -> Signal a -> Signal a++-- | The function 'lengthS' returns the length of a 'finite' signal.+lengthS :: Signal b -> Int++-- | The function 'infiniteS' creates an infinite signal. The first argument 'f' is a function that is applied on the current value. The second argument 'x' gives the first value of the signal.+--+-- > Signal> takeS 5 (infiniteS (*3) 1)+-- > {1,3,9,27,81} :: Signal Integer+--+infiniteS :: (a -> a) -> a -> Signal a++-- | The function 'writeS' transforms a signal into a string of the following format:+--+-- @ +-- Signal> writeS (signal[1,2,3,4,5])+-- "1\n2\n3\n4\n5\n" :: [Char]+-- @+writeS :: Show a => Signal a -> [Char]++-- | The function 'readS' transforms a formatted string into a signal.+--+-- @+-- Signal> readS "1\n2\n3\n4\n5\n" :: Signal Int+-- {1,2,3,4,5} :: Signal Int+-- @+readS :: Read a => [Char] -> Signal a++-- | The operator '-:' adds at an element to a signal at the tail.+(-:) :: Signal a -> a -> Signal a++-- | The operator '+-+' concatinates two signals into one signal. +(+-+) :: Signal a -> Signal a -> Signal a +++-- | The function 'copyS' creates a signal with n values 'x'.+copyS :: Num a => a -> b -> Signal b+++-- | The combinator 'fanS' takes two processes 'p1' and 'p2' and and generates a process network, where a signal is split and processed by the processes 'p1' and 'p2'.+fanS :: (Signal a -> Signal b) -> (Signal a -> Signal c) + -> Signal a -> (Signal b, Signal c)++-- Implementation++instance (Show a) => Show (Signal a) where+ showsPrec p NullS = showParen (p > 9) (+ showString "{}")+ showsPrec p xs = showParen (p > 9) (+ showChar '{' . showSignal1 xs)+ where+ showSignal1 NullS+ = showChar '}'+ showSignal1 (y:-NullS) + = shows y . showChar '}'+ showSignal1 (y:-ys) + = shows y . showChar ',' + . showSignal1 ys++instance Read a => Read (Signal a) where+ readsPrec _ s = readsSignal s++readsSignal :: (Read a) => ReadS (Signal a)+readsSignal s = [((x:-NullS), rest) + | ("{", r2) <- lex s,+ (x, r3) <- reads r2,+ ("}", rest) <- lex r3]+ ++ [(NullS, r4) + | ("{", r5) <- lex s,+ ("}", r4) <- lex r5]+ ++ [((x:-xs), r6) + | ("{", r7) <- lex s,+ (x, r8) <- reads r7,+ (",", r9) <- lex r8,+ (xs, r6) <- readsValues r9]++readsValues :: (Read a) => ReadS (Signal a)+readsValues s = [((x:-NullS), r1) + | (x, r2) <- reads s,+ ("}", r1) <- lex r2]+ ++ [((x:-xs), r3) + | (x, r4) <- reads s,+ (",", r5) <- lex r4,+ (xs, r3) <- readsValues r5]++signal [] = NullS+signal (x:xs) = x :- signal xs ++fromSignal NullS = []+fromSignal (x:-xs) = x : fromSignal xs++unitS x = x :- NullS++nullS NullS = True+nullS _ = False++headS NullS = error "headS : Signal is empty"+headS (x:-_) = x++tailS NullS = error "tailS : Signal is empty"+tailS (_:-xs) = xs++atS _ NullS + = error "atS: Signal has not enough elements"+atS 0 (x:-_) = x+atS n (_:-xs) = atS (n-1) xs++(!-) :: Signal a -> Int -> a+(!-) xs n = atS n xs++takeS 0 _ = NullS+takeS _ NullS = NullS+takeS n (x:-xs) | n <= 0 = NullS+ | otherwise = x :- takeS (n-1) xs++dropS 0 NullS = NullS+dropS _ NullS = NullS +dropS n (x:-xs) | n <= 0 = x:-xs+ | otherwise = dropS (n-1) xs+++selectS offset step xs = select1S step (dropS offset xs) + where+ select1S _ NullS = NullS+ select1S st (y:-ys) = y :- select1S st (dropS (st-1) ys) ++(-:) xs x = xs +-+ (x :- NullS)++(+-+) NullS ys = ys+(+-+) (x:-xs) ys = x :- (xs +-+ ys)++lengthS NullS = 0+lengthS (_:-xs) = 1 + lengthS xs++infiniteS f x = x :- infiniteS f (f x)++copyS 0 _ = NullS+copyS n x = x :- copyS (n-1) x++fanS p1 p2 xs = (p1 xs, p2 xs)++writeS NullS = []+writeS (x:-xs) = show x ++ "\n" ++ writeS xs++readS xs = readS' (words xs)+ where+ readS' [] = NullS+ readS' ("\n":ys) = readS' ys+ readS' (y:ys) = read y :- readS' ys+++++++++++++
+ src/ForSyDe/Shallow/StochasticLib.hs view
@@ -0,0 +1,255 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.StochasticLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- The stochastic library provides a few stochastic skeletons, which are+-- relatives to the skeletons of the synchronous library. These skeletons are+-- based on two elementary functions, 'sigmaUn' and 'sigmaGe'+-- which provide stochastic signals. The background and motivation for this+-- approach is described in the paper +--+-- Axel Jantsch, Ingo Sander, and Wenbiao Wu,+-- \"The usage of stochastic processes in embedded system specifications\",+-- In /Proceedings of the Ninth International Symposium on Hardware and Software Codesign/, +-- April 2001 (<http://web.it.kth.se/~axel/papers/2001/codes-2001.pdf>). +--+-- Unfortunately, not all of the suggested skeletons are+-- implemented. In particular, consolidation-based process+-- constructors and all constructors for the untimed and the discrete+-- timed MoCs are missing.+-----------------------------------------------------------------------------++module ForSyDe.Shallow.StochasticLib(+ -- * Select based synchronous process constructors+ selMapSY, selScanlSY, selMealySY, selMooreSY+ -- * Elementary stochastic processes+ , sigmaUn, sigmaGe) where++import ForSyDe.Shallow.SynchronousLib+import ForSyDe.Shallow.Signal+import System.Random++-- | The skeleton 'selMapSY' is a stochastic variant of+-- 'mapSY'. It has an internal stochastic process and selects one+-- out of two combinatorial functions depending on the output of the+-- stochastic process.+selMapSY :: Int -- ^The seed for the stochastic process+ -> (a -> b) -- ^The first alternative function+ -> (a -> b) -- ^The second alternative function+ -> Signal a -- ^The input signal+ -> Signal b -- ^The output signal of the process+selMapSY _ _ _ NullS = NullS+selMapSY seed f0 f1 xs = selmap1 f0 f1 (sigmaUn seed (0,1)) xs+ where selmap1 :: (a->b)->(a->b)->(Signal Int) -> Signal a -> Signal b+ selmap1 _ _ _ NullS = NullS+ selmap1 f0 f1 (s:-ss) (x:-xs) + = (select1 s f0 f1 x) :- (selmap1 f0 f1 ss xs)+ selmap1 _ _ NullS _ = error "selMapSY: empty seed signal."++-- | The skeleton 'selScanlSY' is a stochastic variant of 'scanlSY'.+selScanlSY :: Int -- ^The seed+ -> (a -> b -> a) -- ^The first alternative next-state function+ -> (a -> b -> a) -- ^The second alternative function+ -> a -- ^The initial state+ -> Signal b -- ^The input signal+ -> Signal a -- ^The output signal+selScanlSY _ _ _ _ NullS = NullS+selScanlSY seed f0 f1 mem xs = selscan1 f0 f1 mem (sigmaUn seed (0,1)) xs+ where selscan1 :: (a -> b -> a) -> (a -> b -> a) -> a + -> Signal Int -> Signal b -> Signal a+ selscan1 _ _ _ _ NullS = NullS+ selscan1 f0 f1 mem (s:-ss) (x:-xs)+ = newmem :- (selscan1 f0 f1 newmem ss xs)+ where newmem = (select2 s f0 f1 mem x) + selscan1 _ _ _ NullS _ + = error "selScanlSY: empty seed signal"++select1 :: Int -> (a -> b) -> (a->b) -> a -> b+select1 0 f0 _ x = f0 x+select1 1 _ f1 x = f1 x+select1 s _ _ _ = error ("select1: seed value neither 0 nor 1: " + ++ (show s))++select2 :: Int -> (a -> b -> c) -> (a->b->c) + -> a -> b -> c+select2 0 f0 _ x y = f0 x y+select2 1 _ f1 x y = f1 x y+select2 s _ _ _ _ = error ("select2: seed value neither 0 nor 1: " + ++ (show s))++-- | 'selMooreSY' is the stochastic variant of mooreSY. Both the +-- next-state and the output function is randomly selected based on a +-- uniform distribution.+selMooreSY :: Int -- ^The seed for the next-state function+ -> Int -- ^The seed for the output function+ -> (a -> b -> a) -- ^First alternative for the next-state function+ -> (a -> b -> a) -- ^Second alternative for the next-state function+ -> (a -> c) -- ^First alternative for the output function+ -> (a -> c) -- ^Second alternative for the output function+ -> a -- ^The initial state+ -> Signal b -- ^The input signal+ -> Signal c -- ^The output signal+selMooreSY _ _ _ _ _ _ _ NullS = NullS+selMooreSY seedg seedf g0 g1 f0 f1 w0 s+ = ((selMapSY seedf f0 f1 ) . (selScanlSY seedg g0 g1 w0)) s++-- | 'selMealySY' is the stochastic variant of mealySY. Both the +-- next-state and the output function is randomly selected based on a +-- uniform distribution.+selMealySY :: Int -- ^The seed for the next-state function+ -> Int -- ^The seed for the output function+ -> (a -> b -> a) -- ^First alternative for the next-state function+ -> (a -> b -> a) -- ^Second alternative for the next-state function+ -> (a -> b -> c) -- ^First alternative for the output function+ -> (a -> b -> c) -- ^Second alternative for the output function+ -> a -- ^The initial state+ -> Signal b -- ^The input signal+ -> Signal c -- ^The output signal+selMealySY _ _ _ _ _ _ _ NullS = NullS+selMealySY seedg seedf g0 g1 f0 f1 w0 s+ = ((selMapSY seedf f0' f1' ) . (zipSY s) . (selScanlSY seedg g0 g1 w0)) s+ where f0' (b, a) = f0 a b+ f1' (b, a) = f1 a b+-- |'sigmaUn' generates a signal list of uniformly distributed Int within+-- the given range and with a given seed. +sigmaUn :: Int -- ^The seed+ -> (Int, Int) -- ^The interval from which the stochastic values are + -- taken+ -> Signal Int -- ^The sequence of stochastic values+sigmaUn seed range = signal (stoch range (mkStdGen seed))+ where stoch :: (Int, Int) -> StdGen -> [Int]+ stoch range g = newNum `seq` + (newNum : (stoch range newGen))+ where newNum = (fst (randomR range g)) + newGen = snd (next g)++-- |'sigmaGe' is a more general stochastic process. The first argument is a+-- function f which describes the distribution. For each value v in the+-- given range (r1,r2), f(v) is the probability that v is generated. +--+-- Note, that the user has to make sure that sum(f(v))=1 for v in (r1,r2).+--+-- For illustration consider the following example.+--+-- > pdist :: Float -> Float+-- > pdist d = 1\/\(2**d\)+-- > pdistsum 1 = pdist 1+-- > pdistsum d = \(pdist d\) + \(pdistsum \(d-1\)\)+--+-- > pdistnorm :: Float -> Float -> Float+-- > pdistnorm dmax d = 1\/((pdistsum dmax) * (2**d))+--+-- @pdistnorm dmax d@ gives the probability of a value <= d;+--+-- @pdistnorm dmax dmax@ is always 1.0+--+-- Hence, using pdistnorm as a function in 'sigmaGe' gives an exponantial+-- distribution for values in the range \[0, dmax\].+sigmaGe :: (Float -> Float) -- ^The stochastic distribution+ -> Int -- ^The seed+ -> (Int, Int) -- ^The range+ -> Signal Int -- ^The sequence of stochastic values+sigmaGe f seed (r1,r2) = sigma2 (checkSum f (fromIntegral r1) + (fromIntegral r2)) f seed (r1,r2)+ where sigma2 s f seed (r1,r2) + | s > 0.999 = signal (sigma1 (mkStdGen seed) + (mkdlist f (fromIntegral (r2-r1))))+ | otherwise = error + ("sigmaGe: sum of probabilitites is "+ ++ (show s) ++ ". It must be 1.")+ checkSum :: (Float -> Float) -> Float -> Float -> Float+ checkSum f c max | c == max = f c+ | otherwise = f(c) + (checkSum f (c+1) max)++ sigma1 :: StdGen -> [Float] -> [Int]+ sigma1 g fl = (findk (fst (randomR (0.0,1.0) g)) fl)+ : (sigma1 (snd (next g)) fl)++ findk :: Float -> [Float] -> Int+ findk r fs = findk1 0 r fs++ findk1 k r (f:fs) | r < f = k+ | otherwise = findk1 (k+1) r fs+ findk1 k _ [] = k++ mkdlist :: (Float -> Float) -> Float -> [Float]+ mkdlist f d = scanl (sumf f) 0.0 [1..d]++ sumf :: (Float -> Float) -> Float -> Float -> Float+ sumf g x y = x + (g y)++--pdist :: Float -> Float+--pdist d = 1/(2**d)++--pdistsum 1 = pdist 1+--pdistsum d = (pdist d) + (pdistsum (d-1))++-- The function pdistnorm can be used as a function in sigmaGe for an+-- exponantial distribution of values in the range [0, dmax]:+--pdistnorm :: Float -> Float -> Float+--pdistnorm dmax d = 1/((pdistsum dmax) * (2**d))++--pdnormsum dmax 1 = pdistnorm dmax 1+--pdnormsum dmax d = (pdistnorm dmax d) + (pdnormsum dmax (d-1))+++-----------------------------------------------------------------------------+-- Test section:+--+-- These tests are commented to avoid warnings about not-used functions.+-- But the test functions work and are useful.+-- testAll = "test selMapSY: " ++ testSelMap +-- ++ ", test selMooreSY: " ++ testSelMoore+-- ++ ", test selMealySY: " ++ testSelMealy++-- testSelMap = show so ++ " -> " ++ (cmpSig so (signal [0,3,4,5,4,5,8,9,8,11]))+-- where f0 x = x + 1+-- f1 x = x - 1+-- so = takeS 10 (selMapSY 876876 f0 f1 (signal [1,2..]))++-- testSelMoore = show so ++ " -> " +-- ++ (cmpSig so (signal [10,2,3,-40,-5,0,7,-80,0,-100]))+-- where so = takeS 10 (selMooreSY 7667567 123234 g0 g1 f0 f1 w0 +-- (signal [1,2..]))+-- g0 (0,y) x | even x = (0,x)+-- | otherwise = (1,x)+-- g0 (1,y) x | x `mod` 3 == 0 = (0,x)+-- | otherwise = (1,x)+-- g1 (0,y) x | even x = (1,x)+-- | otherwise = (0, x)+-- g1 (1,y) x | x `mod` 3 == 0 = (0,0)+-- | otherwise = (1,x)+-- f0 (0,y) = y+-- f0 (1,y) = -1 * y+-- f1 (0,y) = 10 * y+-- f1 (1,y) = -10 * y+-- w0 = (0,0)++-- testSelMealy = show so ++ " -> " +-- ++ (cmpSig so (signal [10,2,3,-40,-5,0,7,-80,0,-100]))+-- where so = takeS 10 (selMealySY 7667567 123234 g0 g1 f0 f1 w0 +-- (signal [1,2..]))+-- g0 (0,y) x | even x = (0,x)+-- | otherwise = (1,x)+-- g0 (1,y) x | x `mod` 3 == 0 = (0,x)+-- | otherwise = (1,x)+-- g1 (0,y) x | even x = (1,x)+-- | otherwise = (0, x)+-- g1 (1,y) x | x `mod` 3 == 0 = (0,0)+-- | otherwise = (1,x)+-- f0 (0,y) x = y+-- f0 (1,y) x = -1 * y+-- f1 (0,y) x = 10 * y+-- f1 (1,y) x = -10 * y+-- w0 = (0,0)+--+--+-- cmpSig :: Eq a => Signal a -> Signal a -> String+-- cmpSig s1 s2 | s1 == s2 = "OK"+-- | otherwise = "Not OK"
+ src/ForSyDe/Shallow/SynchronousLib.hs view
@@ -0,0 +1,349 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.SynchronousLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- The synchronuous library defines process constructors and processes+-- for the synchronous computational model. A process constructor is a+-- higher order function which together with combinational function(s)+-- and values as arguments constructs a process.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.SynchronousLib(+ -- * Combinational process constructors+ -- | Combinational process constructors are used for processes that do not have a state.+ mapSY, zipWithSY, zipWith3SY, + zipWith4SY, zipWithxSY, + -- * Sequential process constructors+ -- | Sequential process constructors are used for processes that have a state. One of the input parameters is the initial state.+ delaySY, delaynSY,+ scanlSY, scanl2SY, scanl3SY, scanldSY, scanld2SY,+ scanld3SY, mooreSY, moore2SY, moore3SY, mealySY,+ mealy2SY, mealy3SY, sourceSY, + filterSY, fillSY, holdSY,+ -- * Synchronous Processes+ -- | The library contains a few simple processes that are applicable to many cases.+ whenSY, zipSY, zip3SY, zip4SY, zip5SY, zip6SY, + unzipSY, unzip3SY, unzip4SY, unzip5SY, unzip6SY,+ zipxSY, unzipxSY, mapxSY, + fstSY, sndSY+ ) where++import ForSyDe.Shallow.CoreLib++----------------------------------------+-- --+-- COMBINATIONAL PROCESS CONSTRUCTORS --+-- --+----------------------------------------++-- | The process constructor 'mapSY' takes a combinational function as argument and returns a process with one input signal and one output signal.+mapSY :: (a -> b) -> Signal a -> Signal b+mapSY _ NullS = NullS+mapSY f (x:-xs) = f x :- (mapSY f xs)++-- | The process constructor 'zipWithSY' takes a combinational function as argument and returns a process with two input signals and one output signal.+zipWithSY :: (a -> b -> c) -> Signal a -> Signal b -> Signal c+zipWithSY _ NullS _ = NullS+zipWithSY _ _ NullS = NullS+zipWithSY f (x:-xs) (y:-ys) = f x y :- (zipWithSY f xs ys)++-- | The process constructor 'zipWith3SY' takes a combinational function as argument and returns a process with three input signals and one output signal.+zipWith3SY :: (a -> b -> c -> d) -> Signal a -> Signal b -> Signal c -> Signal d+zipWith3SY _ NullS _ _ = NullS+zipWith3SY _ _ NullS _ = NullS+zipWith3SY _ _ _ NullS = NullS+zipWith3SY f (x:-xs) (y:-ys) (z:-zs) = f x y z + :- (zipWith3SY f xs ys zs)++-- | The process constructor 'zipWith4SY' takes a combinational function as argument and returns a process with four input signals and one output signal.+zipWith4SY :: (a -> b -> c -> d -> e) -> Signal a -> Signal b + -> Signal c -> Signal d -> Signal e+zipWith4SY _ NullS _ _ _ = NullS+zipWith4SY _ _ NullS _ _ = NullS+zipWith4SY _ _ _ NullS _ = NullS+zipWith4SY _ _ _ _ NullS = NullS+zipWith4SY f (w:-ws) (x:-xs) (y:-ys) (z:-zs) + = f w x y z + :- (zipWith4SY f ws xs ys zs)++-- | The process constructor 'mapxSY' creates a process network that maps a function onto all signals in a vector of signals.+mapxSY :: (a -> b) -> Vector (Signal a) -> Vector (Signal b)+mapxSY f = mapV (mapSY f)++-- | The process constructor 'zipWithxSY' works as 'zipWithSY', but takes a vector of signals as input.+zipWithxSY :: (Vector a -> b) -> Vector (Signal a) -> Signal b+zipWithxSY f = mapSY f . zipxSY++++-------------------------------------+-- --+-- SEQUENTIAL PROCESS CONSTRUCTORS --+-- --+-------------------------------------++-- | The process constructor 'delaySY' delays the signal one event cycle +-- by introducing an initial value at the beginning of the output signal. +-- Note, that this implies that there is one event (the first) at the +-- output signal that has no corresponding event at the input signal. +-- One could argue that input and output signals are not fully synchronized,+-- even though all input events are synchronous with a corresponding output +-- event. However, this is necessary to initialize feed-back loops.+delaySY :: a -- ^Initial state + -> Signal a -- ^Input signal+ -> Signal a -- ^Output signal+delaySY e es = e:-es++-- | The process constructor 'delaynSY' delays the signal n events by introducing n identical default values. +delaynSY :: a -- ^Initial state+ -> Int -- ^ Delay cycles + -> Signal a -- ^Input signal+ -> Signal a -- ^Output signal+delaynSY e n xs | n <= 0 = xs+ | otherwise = e :- delaynSY e (n-1) xs ++-- | The process constructor 'scanlSY' is used to construct a finite state machine process without output decoder. It takes an initial value and a function for the next state decoder. The process constructor behaves similar to the Haskell prelude function 'scanlSY' and has the value of the new state as its output value as illustrated by the following example. +--+-- > SynchronousLib> scanldSY (+) 0 (signal [1,2,3,4])+--+-- > {1,3,6,10} :: Signal Integer+-- +-- This is in contrast to the function 'scanldSY', which has its current state as its output value. +scanlSY :: (a -> b -> a) -- ^Combinational function for next state decoder+ -> a -- ^Initial state+ -> Signal b -- ^ Input signal + -> Signal a -- ^ Output signal+scanlSY f mem xs = s'+ where s' = zipWithSY f (delaySY mem s') xs ++-- | The process constructor 'scanl2SY' behaves like 'scanlSY', but has two input signals.+scanl2SY :: (a -> b -> c -> a) -> a -> Signal b -> Signal c -> Signal a+scanl2SY f mem xs ys = s'+ where s' = zipWith3SY f (delaySY mem s') xs ys++-- | The process constructor 'scanl3SY' behaves like 'scanlSY', but has three input signals.+scanl3SY :: (a -> b -> c -> d -> a) -> a -> Signal b + -> Signal c -> Signal d -> Signal a+scanl3SY f mem xs ys zs = s'+ where s' = zipWith4SY f (delaySY mem s') xs ys zs++-- | The process constructor 'scanldSY' is used to construct a finite state machine process without output decoder. It takes an initial value and a function for the next state decoder. The process constructor behaves similar to the Haskell prelude function 'scanlSY'. In contrast to the process constructor 'scanlSY' here the output value is the current state and not the one of the next state.+--+-- > SynchronousLib> scanlSY (+) 0 (signal [1,2,3,4])+--+-- > {0,1,3,6} :: Signal Integer+scanldSY :: (a -> b -> a) -- ^Combinational function for next state decoder+ -> a -- ^Initial state+ -> Signal b -- ^ Input signal + -> Signal a -- ^ Output signal+scanldSY f mem xs = s'+ where s' = delaySY mem $ zipWithSY f s' xs +++-- | The process constructor 'scanld2SY' behaves like 'scanldSY', but has two input signals.+scanld2SY :: (a -> b -> c -> a) -> a -> Signal b -> Signal c + -> Signal a+scanld2SY f mem xs ys = s'+ where s' = delaySY mem $ zipWith3SY f s' xs ys++-- | The process constructor 'scanld3SY' behaves like 'scanldSY', but has three input signals.+scanld3SY :: (a -> b -> c -> d -> a) -> a -> Signal b + -> Signal c -> Signal d -> Signal a+scanld3SY f mem xs ys zs = s'+ where s' = delaySY mem $ zipWith4SY f s' xs ys zs++-- | The process constructor 'mooreSY' is used to model state machines of \"Moore\" type, where the output only depends on the current state. The process constructor is based on the process constructor 'scanldSY', since it is natural for state machines in hardware, that the output operates on the current state and not on the next state. The process constructors takes a function to calculate the next state, another function to calculate the output and a value for the initial state. +--+-- In contrast the output of a process created by the process constructor 'mealySY' depends not only on the state, but also on the input values.+mooreSY :: (a -> b -> a) -- ^Combinational function for next state decoder + -> (a -> c) -- ^Combinational function for output decoder+ -> a -- ^Initial state+ -> Signal b -- ^Input signal+ -> Signal c -- ^Output signal+mooreSY nextState output initial + = mapSY output . (scanldSY nextState initial)++-- | The process constructor 'moore2SY' behaves like 'mooreSY', but has two input signals.+moore2SY :: (a -> b -> c -> a) -> (a -> d) -> a -> Signal b + -> Signal c -> Signal d+moore2SY nextState output initial inp1 inp2 =+ mapSY output (scanld2SY nextState initial inp1 inp2)++-- | The process constructor 'moore3SY' behaves like 'mooreSY', but has three input signals.+moore3SY :: (a -> b -> c -> d -> a) -> (a -> e) -> a -> Signal b + -> Signal c -> Signal d -> Signal e+moore3SY nextState output initial inp1 inp2 inp3 =+ mapSY output (scanld3SY nextState initial inp1 inp2 inp3)++-- | The process constructor 'melaySY' is used to model state machines of \"Mealy\" type, where the output only depends on the current state and the input values. The process constructor is based on the process constructor 'scanldSY', since it is natural for state machines in hardware, that the output operates on the current state and not on the next state. The process constructors takes a function to calculate the next state, another function to calculate the output and a value for the initial state. +--+-- In contrast the output of a process created by the process constructor 'mooreSY' depends only on the state, but not on the input values.+mealySY :: (a -> b -> a) -- ^Combinational function for next state decoder + -> (a -> b -> c) -- ^Combinational function for output decoder+ -> a -- ^Initial state+ -> Signal b -- ^Input signal + -> Signal c -- ^Output signal+mealySY nextState output initial sig =+ zipWithSY output state sig+ where state = scanldSY nextState initial sig++-- | The process constructor 'mealy2SY' behaves like 'mealySY', but has two input signals.+mealy2SY :: (a -> b -> c -> a) -> (a -> b -> c -> d) -> a + -> Signal b -> Signal c -> Signal d+mealy2SY nextState output initial inp1 inp2 =+ zipWith3SY output (scanld2SY nextState initial inp1 inp2)+ inp1 inp2 ++-- | The process constructor 'mealy3SY' behaves like 'mealySY', but has three input signals.+mealy3SY :: (a -> b -> c -> d -> a) -> (a -> b -> c -> d -> e) -> a + -> Signal b -> Signal c -> Signal d -> Signal e+mealy3SY nextState output initial inp1 inp2 inp3 =+ zipWith4SY output (scanld3SY nextState initial inp1 inp2 inp3)+ inp1 inp2 inp3 ++-- | The process constructor 'filterSY' discards the values who do not fulfill a predicate given by a predicate function and replaces them with absent events.+filterSY :: (a -> Bool) -- Predicate function+ -> Signal a -- Input signal+ -> Signal (AbstExt a) -- Output signal+filterSY _ NullS = NullS+filterSY p (x:-xs) = if (p x == True) then+ Prst x :- filterSY p xs+ else+ Abst :- filterSY p xs ++-- | The process 'sourceSY' takes a function and an initial state and generates an infinite signal starting with the initial state as first output followed by the recursive application of the function on the current state. The state also serves as output value. +--+-- The process that has the infinite signal of natural numbers as output is constructed by +--+-- > SynchronousLib> takeS 5 (sourceSY (+1) 0)+--+-- > {0,1,2,3,4} :: Signal Integer+sourceSY :: (a -> a) -> a -> Signal a+sourceSY f s0 = o+ where + o = delaySY s0 s+ s = mapSY f o++-- | The process constructor 'fillSY' creates a process that 'fills' a signal with present values by replacing absent values with a given value. The output signal is not any more of the type 'AbstExt'.+fillSY :: a -- ^Default value + -> Signal (AbstExt a) -- ^Absent extended input signal + -> Signal a -- ^Output signal+fillSY a xs = mapSY (replaceAbst a) xs+ where replaceAbst a' Abst = a'+ replaceAbst _ (Prst x) = x++-- | The process constructor 'holdSY' creates a process that 'fills' a signal with values by replacing absent values by the preceding present value. Only in cases, where no preceding value exists, the absent value is replaced by a default value. The output signal is not any more of the type 'AbstExt'.+holdSY :: a -- ^Default value + -> Signal (AbstExt a) -- ^Absent extended input signal + -> Signal a -- ^Output signal+holdSY a xs = scanlSY hold a xs+ where hold a' Abst = a'+ hold _ (Prst x) = x++++---------------------------+-- --+-- SYNCHRONOUS PROCESSES --+-- --+---------------------------++-- | The process constructor 'whenSY' creates a process that synchronizes a signal of absent extended values with another signal of absent extended values. The output signal has the value of the first signal whenever an event has a present value and 'Abst' when the event has an absent value.+whenSY :: Signal (AbstExt a) -> Signal (AbstExt b) + -> Signal (AbstExt a)+whenSY NullS _ = NullS+whenSY _ NullS = NullS+whenSY (_:-xs) (Abst:-ys) = Abst :- (whenSY xs ys)+whenSY (x:-xs) (_:-ys) = x :- (whenSY xs ys)++-- | The process 'zipSY' \"zips\" two incoming signals into one signal of tuples.+zipSY :: Signal a -> Signal b -> Signal (a,b)+zipSY (x:-xs) (y:-ys) = (x, y) :- zipSY xs ys+zipSY _ _ = NullS++-- | The process 'zip3SY' works as 'zipSY', but takes three input signals.+zip3SY :: Signal a -> Signal b -> Signal c -> Signal (a,b,c)+zip3SY (x:-xs) (y:-ys) (z:-zs) = (x, y, z) :- zip3SY xs ys zs+zip3SY _ _ _ = NullS++-- | The process 'zip4SY' works as 'zipSY', but takes four input signals.+zip4SY :: Signal a -> Signal b -> Signal c -> Signal d + -> Signal (a,b,c,d)+zip4SY (w:-ws) (x:-xs) (y:-ys) (z:-zs) = (w, x, y, z) + :- zip4SY ws xs ys zs+zip4SY _ _ _ _ = NullS++-- | The process 'zip5SY' works as 'zipSY', but takes four input signals.+zip5SY :: Signal a -> Signal b -> Signal c -> Signal d -> Signal e+ -> Signal (a,b,c,d,e)+zip5SY (x1:-x1s) (x2:-x2s) (x3:-x3s) (x4:-x4s) (x5:-x5s) + = (x1,x2,x3,x4,x5) :- zip5SY x1s x2s x3s x4s x5s+zip5SY _ _ _ _ _ = NullS++-- | The process 'zip6SY' works as 'zipSY', but takes four input signals.+zip6SY :: Signal a -> Signal b -> Signal c -> Signal d -> Signal e+ -> Signal f -> Signal (a,b,c,d,e,f)+zip6SY (x1:-x1s) (x2:-x2s) (x3:-x3s) (x4:-x4s) (x5:-x5s) (x6:-x6s) + = (x1,x2,x3,x4,x5,x6) :- zip6SY x1s x2s x3s x4s x5s x6s+zip6SY _ _ _ _ _ _ = NullS++-- | The process 'unzipSY' \"unzips\" a signal of tuples into two signals.+unzipSY :: Signal (a,b) -> (Signal a,Signal b)+unzipSY NullS = (NullS, NullS)+unzipSY ((x, y):-xys) = (x:-xs, y:-ys) where (xs, ys) = unzipSY xys++-- | The process 'unzip3SY' works as 'unzipSY', but has three output signals.+unzip3SY :: Signal (a, b, c) -> (Signal a, Signal b, Signal c)+unzip3SY NullS = (NullS, NullS, NullS)+unzip3SY ((x, y, z):-xyzs) = (x:-xs, y:-ys, z:-zs) where+ (xs, ys, zs) = unzip3SY xyzs++-- | The process 'unzip4SY' works as 'unzipSY', but has four output signals.+unzip4SY :: Signal (a,b,c,d) + -> (Signal a,Signal b,Signal c,Signal d)+unzip4SY NullS = (NullS, NullS, NullS, NullS)+unzip4SY ((w,x,y,z):-wxyzs) = (w:-ws, x:-xs, y:-ys, z:-zs) where+ (ws, xs, ys, zs) = unzip4SY wxyzs++-- | The process 'unzip5SY' works as 'unzipSY', but has four output signals.+unzip5SY :: Signal (a,b,c,d,e) + -> (Signal a,Signal b,Signal c,Signal d,Signal e)+unzip5SY NullS = (NullS, NullS, NullS, NullS,NullS)+unzip5SY ((x1,x2,x3,x4,x5):-xs) = (x1:-x1s, x2:-x2s, x3:-x3s, x4:-x4s, x5:-x5s)+ where (x1s, x2s, x3s, x4s,x5s) = unzip5SY xs++-- | The process 'unzip6SY' works as 'unzipSY', but has four output signals.+unzip6SY :: Signal (a,b,c,d,e,f) + -> (Signal a,Signal b,Signal c,Signal d,Signal e,Signal f)+unzip6SY NullS = (NullS, NullS, NullS, NullS,NullS,NullS)+unzip6SY ((x1,x2,x3,x4,x5,x6):-xs) + = (x1:-x1s, x2:-x2s, x3:-x3s, x4:-x4s, x5:-x5s, x6:-x6s)+ where (x1s, x2s, x3s, x4s, x5s, x6s) = unzip6SY xs++-- | The process 'zipxSY' \"zips\" a signal of vectors into a vector of signals.+zipxSY :: Vector (Signal a) -> Signal (Vector a)+zipxSY NullV = NullS+zipxSY (NullS :> xss) = zipxSY xss+zipxSY ((x:-xs) :> xss) = (x :> (mapV headS xss)) + :- (zipxSY (xs :> (mapV tailS xss)))++-- | The process 'unzipxSY' \"unzips\" a vector of signals into a signal of vectors.+unzipxSY :: Signal (Vector a) -> Vector (Signal a)+unzipxSY NullS = NullV+unzipxSY (NullV :- vss) = unzipxSY vss+unzipxSY ((v:>vs) :- vss) = (v :- (mapSY headV vss)) + :> (unzipxSY (vs :- (mapSY tailV vss)))++-- | The process 'fstSY' selects always the first value from a signal of pairs.+fstSY :: Signal (a,b) -> Signal a+fstSY = mapSY fst ++-- | The process 'sndSY' selects always the second value from a signal of pairs.+sndSY :: Signal (a,b) -> Signal b+sndSY = mapSY snd+
+ src/ForSyDe/Shallow/SynchronousProcessLib.hs view
@@ -0,0 +1,115 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.SynchronousProcessLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- The synchronous process library defines processes for the+-- synchronous computational model. It is based on the synchronous+-- library "ForSyDe.Shallow.SynchronousLib".+-----------------------------------------------------------------------------+module ForSyDe.Shallow.SynchronousProcessLib(+ fifoDelaySY, finiteFifoDelaySY,+ memorySY, mergeSY, groupSY, counterSY+ ) where++import ForSyDe.Shallow.SynchronousLib+import ForSyDe.Shallow.CoreLib+import ForSyDe.Shallow.Queue+import ForSyDe.Shallow.Memory++-- | The process 'fifoDelaySY' implements a synchronous model of a+-- FIFO with infinite size. The FIFOs take a list of values at each+-- event cycle and output one value. There is a delay of one cycle.+fifoDelaySY :: Signal [a] -> Signal (AbstExt a)++-- | The process 'finiteFifoDelaySY' implements a FIFO with finite+-- size. The FIFOs take a list of values at each event cycle and+-- output one value. There is a delay of one cycle.+finiteFifoDelaySY :: Int -> Signal [a] -> Signal (AbstExt a)++-- | The process 'memorySY' implements a synchronous memory. It uses+-- access functions of the type 'Read adr' and 'Write adr value'.+memorySY :: Int -> Signal (Access a) -> Signal (AbstExt a) ++-- | The process 'mergeSY' merges two input signals into a single+-- signal. The process has an internal buffer in order to prevent loss+-- of data. The process is deterministic and outputs events according+-- to their time tag. If there are two valid values at on both+-- signals. The value of the first signal is output first.+mergeSY :: Signal (AbstExt a) -> Signal (AbstExt a) + -> Signal (AbstExt a)++-- | The process 'counterSY' implements a counter, that counts from+-- min to max. The process 'counterSY' has no input and its output is+-- an infinite signal.+counterSY :: (Enum a, Ord a) => a -> a -> Signal a++-- | The function 'groupSY' groups values into a vector of size n,+-- which takes n cycles. While the grouping takes place the output+-- from this process consists of absent values.+groupSY :: Int -> Signal a -> Signal (AbstExt (Vector a))++fifoDelaySY xs = mooreSY fifoState fifoOutput (queue []) xs++fifoState :: Queue a -> [a] -> Queue a+fifoState (Q []) xs = (Q xs)+fifoState q xs = fst (popQ (pushListQ q xs))++fifoOutput :: Queue a -> AbstExt a+fifoOutput (Q []) = Abst+fifoOutput (Q (x:_)) = Prst x++finiteFifoDelaySY n xs + = mooreSY fifoStateFQ fifoOutputFQ (finiteQueue n []) xs++fifoStateFQ :: FiniteQueue a -> [a] -> FiniteQueue a+fifoStateFQ (FQ n []) xs = (FQ n xs)+fifoStateFQ q xs = fst (popFQ (pushListFQ q xs))++fifoOutputFQ :: FiniteQueue a -> AbstExt a+fifoOutputFQ (FQ _ []) = Abst+fifoOutputFQ (FQ _ (x:_)) = Prst x++memorySY size xs = mealySY ns o (newMem size) xs+ where + ns mem (Read x) = memState mem (Read x)+ ns mem (Write x v) = memState mem (Write x v)+ o mem (Read x) = memOutput mem (Read x)+ o mem (Write x v) = memOutput mem (Write x v)+++mergeSY xs ys = moore2SY mergeState mergeOutput [] xs ys+ where + mergeState [] Abst Abst = []+ mergeState [] Abst (Prst y) = [y]+ mergeState [] (Prst x) Abst = [x]+ mergeState [] (Prst x) (Prst y) = [x, y]+ mergeState (_:us) Abst Abst = us+ mergeState (_:us) Abst (Prst y) = us ++ [y]+ mergeState (_:us) (Prst x) Abst = us ++ [x]+ mergeState (_:us) (Prst x) (Prst y) = us ++ [x, y]++ mergeOutput [] = Abst+ mergeOutput (u:_) = Prst u ++groupSY k = mealySY f g s0 + where+ s0 = NullV+ f v x | (lengthV v) == 0 = unitV x+ | (lengthV v) == k = unitV x + | otherwise = v <: x+ g v _ | (lengthV v) == 0 = Abst+ g v x | (lengthV v) == k-1 = Prst (v<:x)+ g _ _ | otherwise = Abst+ +counterSY m n = sourceSY f m+ where + f x | x >= n = m+ | otherwise = succ x++
+ src/ForSyDe/Shallow/UntimedLib.hs view
@@ -0,0 +1,200 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.UntimedLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- The untimed library defines process constructors and processes for+-- the untimed computational model. A process constructor is a higher+-- order function which together with combinational function(s) and+-- values as arguments constructs a process.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.UntimedLib( + -- * Combinational process constructors+ -- | Combinational process constructors are used for processes that do not have a state.+ combU, comb2U, comb2UC,+ mapU,+ -- * Sequential process constructors+ -- | Sequential process constructors are used for processes that have a state. One of the input parameters is the initial state.+ scanU, mealyU, mooreU, sourceU, sinkU, initU,+ -- * Zipping and unzipping signals+ zipU, zipUs,+ zipWithU, zipWith3U, zipWith4U,+ unzipU+ )+where++import ForSyDe.Shallow.CoreLib++----------------------------------------+-- --+-- COMBINATIONAL PROCESS CONSTRUCTORS --+-- --+----------------------------------------++combU :: Int -> ([a] -> [b]) -> Signal a -> Signal b+combU = mapU++comb2U :: Int -> Int -> ([a]->[b]->[c]) -> Signal a -> Signal b -> Signal c+comb2U = zipWithU++comb2UC :: Int -> (a->[b]->[c]) -> Signal a -> Signal b -> Signal c+comb2UC = zipWithUC++-- | The first parameter of 'mapU' is a constant integer defining the number of tokens consumed in every evaluation cycle. The second argument is a function on lists of the input type and returning a list of the output type. For instance,+--+-- > r2 = mapU 1 f+-- > where f :: [Int] -> [Int]+-- > f [x] = [2*x]+--+-- defines a process r2 which consumes one token in each evaluation cycle and multiplies it by two.+mapU :: Int -> ([a] -> [b]) -> Signal a -> Signal b+mapU _ _ NullS = NullS+mapU c f xs | lengthS (takeS c xs) < c = NullS+ | otherwise+ = signal (f (takeL c xs)) +-+ (mapU c f (dropS c xs))+ +--mapUC :: Int -> ([a] -> b) -> Signal a -> Signal b+--mapUC _ _ NullS = NullS+--mapUC c f xs | lengthS (takeS c xs) < c = NullS+-- | otherwise +-- = signal [(f (takeL c xs))] +-+ (mapUC c f (dropS c xs))++---------------------------+-- --+-- SYNCHRONOUS PROCESSES --+-- --+---------------------------++-- | 'scanU' has an internal state which is visible at the output. The first argument is a function \'gamma\' which, given the state returns the number of tokens consumed next. The second argument is the next state function and the third is the initial state.+scanU :: (b->Int) -> (b->[a]->b) -> b -> Signal a -> Signal b+scanU _ _ _ NullS = NullS+scanU gamma g state xs + | length as == c = newstate :- scanU gamma g newstate (dropS c xs)+ | otherwise = NullS+ where c = gamma state+ as = takeL c xs+ newstate = g state as++++-- | The process constructor 'mooreU' creates a state machine of Moore type. In addition to the next state function they also have an output encoding function. The output depends directly on the internal state.+mooreU :: (b->Int) -> (b->[a]->b) -> (b -> [c]) -> b -> Signal a -> Signal c+mooreU _ _ _ _ NullS = NullS+mooreU gamma g f state xs+ | length as == c = (signal bs) +-+ mooreU gamma g f newstate (dropS c xs)+ | otherwise = NullS+ where c = gamma state+ as = takeL c xs+ newstate = g state as + bs = f state++-- | The process constructor 'mealyU' creates a state machine of Moore type. In addition to the next state function they also have an output encoding function. The output depends directly on the internal state.+mealyU :: (b->Int) -> (b->[a]->b) -> (b -> [a] -> [c]) -> b + -> Signal a -> Signal c+mealyU _ _ _ _ NullS = NullS+mealyU gamma g f state xs+ | length as == c = (signal bs) + +-+ mealyU gamma g f newstate (dropS c xs)+ | otherwise = NullS+ where c = gamma state+ as = takeL c xs+ newstate = g state as+ bs = f state as+++zipU :: Signal (Int,Int) -> Signal a -> Signal b -> Signal ([a],[b])+zipU NullS _ _ = NullS+zipU _ NullS _ = NullS+zipU _ _ NullS = NullS+zipU ((c1,c2):-cs) xs ys+ | lengthS (takeS c1 xs) == c1 && lengthS (takeS c2 ys) == c2+ = (takeL c1 xs,takeL c2 ys) :- zipU cs (dropS c1 xs) (dropS c2 ys)+ | otherwise = NullS++zipUs :: Int -> Int -> Signal a -> Signal b -> Signal ([a],[b])+zipUs _ _ NullS _ = NullS +zipUs _ _ _ NullS = NullS +zipUs c1 c2 xs ys + | lengthS (takeS c1 xs) == c1 && lengthS (takeS c2 ys) == c2+ = (takeL c1 xs,takeL c2 ys) + :- zipUs c1 c2 (dropS c1 xs) (dropS c2 ys)+ | otherwise = NullS++zipWithU :: Int -> Int -> ([a]->[b]->[c]) -> Signal a -> Signal b -> Signal c+zipWithU _ _ _ NullS _ = NullS+zipWithU _ _ _ _ NullS = NullS+zipWithU c1 c2 f xs ys + | lengthS (takeS c1 xs) == c1 && lengthS (takeS c2 ys) == c2+ = signal (f (takeL c1 xs) (takeL c2 ys))+ +-+ zipWithU c1 c2 f (dropS c1 xs) (dropS c2 ys)+ | otherwise = NullS++zipWithUC :: Int -> (a->[b]->[c]) -> Signal a -> Signal b -> Signal c+zipWithUC _ _ NullS _ = NullS+zipWithUC _ _ _ NullS = NullS+zipWithUC c1 f xs ys+ | lengthS (takeS 1 xs) == 1 && lengthS (takeS c1 ys) == c1+ = signal (f (headS xs) (takeL c1 ys))+ +-+ zipWithUC c1 f (tailS xs) (dropS c1 ys)+ | otherwise = NullS++zipWith3U :: Int -> Int -> Int -> ([a]->[b]->[c]->[d]) -> Signal a -> Signal b -> Signal c -> Signal d+zipWith3U _ _ _ _ NullS _ _ = NullS+zipWith3U _ _ _ _ _ NullS _ = NullS+zipWith3U _ _ _ _ _ _ NullS = NullS+zipWith3U c1 c2 c3 f xs ys zs+ | lengthS (takeS c1 xs) == c1 && lengthS (takeS c2 ys) == c2 && lengthS (takeS c3 zs) == c3+ = signal (f (takeL c1 xs) (takeL c2 ys) (takeL c3 zs))+ +-+ zipWith3U c1 c2 c3 f (dropS c1 xs) (dropS c2 ys) (dropS c3 zs)+ | otherwise = NullS+ +zipWith4U :: Int -> Int -> Int -> Int -> ([a]->[b]->[c]->[d]->[e]) ->+ Signal a -> Signal b -> Signal c -> Signal d -> Signal e+zipWith4U _ _ _ _ _ NullS _ _ _= NullS+zipWith4U _ _ _ _ _ _ NullS _ _ = NullS+zipWith4U _ _ _ _ _ _ _ NullS _ = NullS+zipWith4U _ _ _ _ _ _ _ _ NullS = NullS+zipWith4U c1 c2 c3 c4 f xs ys zs as+ | lengthS (takeS c1 xs) == c1 && lengthS (takeS c2 ys) == c2 + && lengthS (takeS c3 zs) == c3 && lengthS (takeS c4 as) == c4+ = signal (f (takeL c1 xs) (takeL c2 ys) (takeL c3 zs) (takeL c4 as))+ +-+ zipWith4U c1 c2 c3 c4 f (dropS c1 xs) (dropS c2 ys) (dropS c3 zs) (dropS c4 as)+ | otherwise = NullS++unzipU :: Signal ([a],[b]) -> (Signal a,Signal b)+unzipU NullS = (NullS,NullS)+unzipU ((as,bs):-xs) = (signal as +-+ ass, + signal bs +-+ bss)+ where (ass,bss) = unzipU xs++sourceU :: (a->a) -> a -> Signal a+sourceU g state = newstate :- sourceU g newstate+ where newstate = g state++sinkU :: (a->Int) -> (a->a) -> a -> Signal b -> Signal b+sinkU _ _ _ NullS = NullS+sinkU gamma g state xs + | length as == c = sinkU gamma g newstate (dropS c xs)+ | otherwise = NullS+ where as = takeL c xs+ c = gamma state+ newstate = g state+++-- | 'initU' is used to initialise a signal. Its first argument is prepended to its second argument, a signal.+initU :: [a] -> Signal a -> Signal a+initU initial s = (signal initial) +-+ s++takeL :: Int -> Signal a -> [a]+takeL c = fromSignal . (takeS c)++++++
+ src/ForSyDe/Shallow/UtilityLib.hs view
@@ -0,0 +1,54 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.UtilityLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- The ForSyDeUtilityLib is a container including all libraries that+-- are related to the ForSyDe shallow-embedded implementation and+-- either extend the ForSyDe MoC libraries or add additional+-- functionality to ForSyDe.+-- +-- * "ForSyDe.Shallow.DFT"+-- +-- * "ForSyDe.Shallow.Memory"+-- +-- * "ForSyDe.Shallow.Queue"+-- +-- * "ForSyDe.Shallow.BitVector"+--+-- * "ForSyDe.Shallow.FilterLib"+-- +-- * "ForSyDe.Shallow.Gaussian" +-- +-- * "ForSyDe.Shallow.PolyArith" +--+-- * "ForSyDe.Shallow.StochasticLib"+-----------------------------------------------------------------------------+module ForSyDe.Shallow.UtilityLib( + module ForSyDe.Shallow.DFT, + module ForSyDe.Shallow.Memory,+ module ForSyDe.Shallow.Queue+ --module ForSyDe.Shallow.Combinators + --module ForSyDe.Shallow.BitVector+ --module ForSyDe.Shallow.FilterLib,+ --module ForSyDe.Shallow.Gaussian,+ --module ForSyDe.Shallow.PolyArith,+ --module ForSyDe.Shallow.StochasticLib+ ) where++import ForSyDe.Shallow.DFT +import ForSyDe.Shallow.Memory+import ForSyDe.Shallow.Queue+--import ForSyDe.Shallow.Combinators+--import ForSyDe.Shallow.BitVector+--import ForSyDe.Shallow.FilterLib+--import ForSyDe.Shallow.Gaussian+--import ForSyDe.Shallow.PolyArith+--import ForSyDe.Shallow.StochasticLib++
+ src/ForSyDe/Shallow/Vector.hs view
@@ -0,0 +1,398 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Shallow.Vector+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module defines the data type 'Vector' and the+-- corresponding functions. It is a development of the module+-- defined by Reekie. Though the vector is modeled as a list, it+-- should be viewed as an array, i.e. a vector has a fixed+-- size. Unfortunately, it is not possible to have the size of the+-- vector as a parameter of the vector data type, due to restrictions+-- in Haskells type system. Still most operations are defined for+-- vectors with the same size.+-----------------------------------------------------------------------------+module ForSyDe.Shallow.Vector ( + Vector (..), vector, fromVector, unitV, nullV, lengthV,+ atV, replaceV, headV, tailV, lastV, initV, takeV, dropV, + selectV, groupV, (<+>), (<:), mapV, foldlV, foldrV, + -- scanlV, scanrV, meshlV, meshrV, + zipWithV, filterV, zipV, unzipV, + concatV, reverseV, shiftlV, shiftrV, rotrV, rotlV, + generateV, iterateV, copyV --, serialV, parallelV + )+ where++infixr 5 :>+infixl 5 <:+infixr 5 <+>++-- | The data type 'Vector' is modeled similar to a list. It has two data type constructors. 'NullV' constructs the empty vector, while ':>' constructsa vector by adding an value to an existing vector. Using the inheritance mechanism of Haskell we have declared 'Vector' as an instance of the classes 'Read' and 'Show'.+--+-- | This means that the vector 1:>2:>3:>NullV is shown as <1,2,3>.+data Vector a = NullV+ | a :> (Vector a) deriving (Eq)++-- | The function 'vector' converts a list into a vector.+vector :: [a] -> Vector a++-- | The function 'fromVector' converts a vector into a list.+fromVector :: Vector a -> [a]++-- | The function 'unitV' creates a vector with one element. +unitV :: a -> Vector a++-- | The function 'nullV' returns 'True' if a vector is empty. +nullV :: Vector a -> Bool++-- | The function 'lengthV' returns the number of elements in a value. +lengthV :: Vector a -> Int++-- | The function 'atV' returns the n-th element in a vector, starting from zero.+atV :: Num a => Vector b -> a -> b++-- | The function 'replaceV' replaces an element in a vector.+replaceV :: Vector a -> Int -> a -> Vector a++-- | The functions 'headV' returns the first element of a vector.+headV :: Vector a -> a++-- | The function 'lastV' returns the last element of a vector.+lastV :: Vector a -> a++-- | The functions 'tailV' returns all, but the first element of a vector.+tailV :: Vector a -> Vector a ++-- | The function 'initV' returns all but the last elements of a vector.+initV :: Vector a -> Vector a ++-- | The function 'takeV' returns the first n elements of a vector.+takeV :: (Num a, Ord a) => a -> Vector b -> Vector b++-- | The function 'dropV' drops the first n elements of a vector.+dropV :: (Num a, Ord a) => a -> Vector b -> Vector b++++-- | The function 'selectV' selects elements in the vector. The first argument gives the initial element, starting from zero, the second argument gives the stepsize between elements and the last argument gives the number of elements. +selectV :: Int -> Int -> Int -> Vector a -> Vector a+++-- | The function 'groupV' groups a vector into a vector of vectors of size n.+groupV :: Int -> Vector a -> Vector (Vector a)++-- | The operator '(<:)' adds an element at the end of a vector.+(<:) :: Vector a -> a -> Vector a++-- | The operator '(<+>)' concatinates two vectors.+(<+>) :: Vector a -> Vector a -> Vector a+++++-- | The higher-order function 'mapV' applies a function on all elements of a vector.+mapV :: (a -> b) -> Vector a -> Vector b +++-- | The higher-order function 'zipWithV' applies a function pairwise on to vectors.+zipWithV :: (a -> b -> c) -> Vector a -> Vector b -> Vector c+++-- | The higher-order functions 'foldlV' folds a function from the right to the left over a vector using an initial value.+foldlV :: (a -> b -> a) -> a -> Vector b -> a ++-- | The higher-order functions 'foldrV' folds a function from the left to the right over a vector using an initial value.+foldrV :: (b -> a -> a) -> a -> Vector b -> a++-- | The higher-function 'filterV' takes a predicate function and a vector and creates a new vector with the elements for which the predicate is true. +filterV :: (a -> Bool) -> Vector a -> Vector a++-- | The function 'zipV' zips two vectors into a vector of tuples.+zipV :: Vector a -> Vector b -> Vector (a, b)++-- | The function 'unzipV' unzips a vector of tuples into two vectors.+unzipV :: Vector (a, b) -> (Vector a, Vector b)++++-- | The function 'shiftlV' shifts a value from the left into a vector. +shiftlV :: Vector a -> a-> Vector a ++-- | The function 'shiftrV' shifts a value from the right into a vector. +shiftrV :: Vector a -> a -> Vector a++-- | The function 'rotlV' rotates a vector to the left. Note that this fuctions does not change the size of a vector.+rotlV :: Vector a -> Vector a++-- | The function 'rotrV' rotates a vector to the right. Note that this fuction does not change the size of a vector.+rotrV :: Vector a -> Vector a+++-- | The function 'concatV' transforms a vector of vectors to a single vector. +concatV :: Vector (Vector a) -> Vector a++-- | The function 'reverseV' reverses the order of elements in a vector. +reverseV :: Vector a -> Vector a+++-- | The function 'iterateV' generates a vector with a given number of elements starting from an initial element using a supplied function for the generation of elements. +--+-- > Vector> iterateV 5 (+1) 1+--+-- > <1,2,3,4,5> :: Vector Integer+iterateV :: Num a => a -> (b -> b) -> b -> Vector b++-- | The function 'generateV' behaves in the same way, but starts with the application of the supplied function to the supplied value. +--+-- > Vector> generateV 5 (+1) 1+-- +-- > <2,3,4,5,6> :: Vector Integer+generateV :: Num a => a -> (b -> b) -> b -> Vector b++-- | The function 'copyV' generates a vector with a given number of copies of the same element. +--+-- > Vector> copyV 7 5 +-- +-- > <5,5,5,5,5,5,5> :: Vector Integer+copyV :: Num a => a -> b -> Vector b+++{-+-- | The function 'serialV' can be used to construct a serial network of processes.++--|The function \haskell{serialV} and \haskell{parallelV} can be used to construct serial and parallel networks of processes.+\begin{code}+serialV :: Vector (a -> a) -> a -> a+parallelV :: Vector (a -> b) -> Vector a -> Vector b+\end{code}++The functions \haskell{scanlV} and \haskell{scanrV} "scan" a function through a vector. The functions take an initial element apply a functions recursively first on the element and then on the result of the function application.+%+\begin{code}+scanlV :: (a -> b -> a) -> a -> Vector b -> Vector a +scanrV :: (b -> a -> a) -> a -> Vector b -> Vector a+\end{code}++\index{scanlV@\haskell{scanlV}}+\index{scanrV@\haskell{scanrV}}++Reekie also proposed the \haskell{meshlV} and \haskell{meshrV} iterators. They are like a combination of \haskell{mapV} and \haskell{scanlV} or \haskell{scanrV}. The argument function supplies a pair of values: the first is input into the next application of this function, and the second is the output value. As an example consider the expression:+%+\begin{code}+f x y = (x+y, x+y)++s1 = vector [1,2,3,4,5]+\end{code}+%+Here \haskell{meshlV} can be used to calculate the running sum. +%+\begin{verbatim}+Vector> meshlV f 0 s1+(15,<1,3,6,10,15>)+\end{verbatim}++\begin{code}+meshlV :: (a -> b -> (a, c)) -> a -> Vector b -> (a, Vector c)+meshrV :: (a -> b -> (c, b)) -> b -> Vector a -> (Vector c, b)+\end{code}++\index{meshlV@\haskell{meshlV}}+\index{meshrV@\haskell{meshrV}}+-}++instance (Show a) => Show (Vector a) where+ showsPrec p NullV = showParen (p > 9) (+ showString "<>")+ showsPrec p xs = showParen (p > 9) (+ showChar '<' . showVector1 xs)+ where+ showVector1 NullV+ = showChar '>' + showVector1 (y:>NullV) + = shows y . showChar '>'+ showVector1 (y:>ys) + = shows y . showChar ',' + . showVector1 ys+++instance Read a => Read (Vector a) where+ readsPrec _ s = readsVector s++readsVector :: (Read a) => ReadS (Vector a)+readsVector s = [((x:>NullV), rest) | ("<", r2) <- lex s,+ (x, r3) <- reads r2,+ (">", rest) <- lex r3]+ +++ [(NullV, r4) | ("<", r5) <- lex s,+ (">", r4) <- lex r5]+ +++ [((x:>xs), r6) | ("<", r7) <- lex s,+ (x, r8) <- reads r7,+ (",", r9) <- lex r8,+ (xs, r6) <- readsValues r9]++readsValues :: (Read a) => ReadS (Vector a)+readsValues s = [((x:>NullV), r1) | (x, r2) <- reads s,+ (">", r1) <- lex r2]+ +++ [((x:>xs), r3) | (x, r4) <- reads s,+ (",", r5) <- lex r4,+ (xs, r3) <- readsValues r5]++vector [] = NullV+vector (x:xs) = x :> (vector xs)++fromVector NullV = []+fromVector (x:>xs) = x : fromVector xs++unitV x = x :> NullV++nullV NullV = True+nullV _ = False++lengthV NullV = 0+lengthV (_:>xs) = 1 + lengthV xs++replaceV vs n x + | n <= lengthV vs && n >= 0 = takeV n vs <+> unitV x + <+> dropV (n+1) vs+ | otherwise = vs++NullV `atV` _ = error "atV: Vector has not enough elements"+(x:>_) `atV` 0 = x+(_:>xs) `atV` n = xs `atV` (n-1)++headV NullV = error "headV: Vector is empty"+headV (v:>_) = v++tailV NullV = error "tailV: Vector is empty"+tailV (_:>vs) = vs++lastV NullV = error "lastV: Vector is empty"+lastV (v:>NullV) = v+lastV (_:>vs) = lastV vs++initV NullV = error "initV: Vector is empty"+initV (_:>NullV) = NullV+initV (v:>vs) = v :> initV vs++takeV 0 _ = NullV+takeV _ NullV = NullV+takeV n (v:>vs) | n <= 0 = NullV+ | otherwise = v :> takeV (n-1) vs++dropV 0 vs = vs+dropV _ NullV = NullV+dropV n (v:>vs) | n <= 0 = v :> vs+ | otherwise = dropV (n-1) vs++selectV f s n vs | n <= 0 + = NullV+ | (f+s*n-1) > lengthV vs + = error "selectV: Vector has not enough elements"+ | otherwise + = atV vs f :> selectV (f+s) s (n-1) vs++groupV n v + | lengthV v < n = NullV+ | otherwise = selectV 0 1 n v + :> groupV n (selectV n 1 (lengthV v-n) v)++NullV <+> ys = ys+(x:>xs) <+> ys = x :> (xs <+> ys) ++xs <: x = xs <+> unitV x ++mapV _ NullV = NullV+mapV f (x:>xs) = f x :> mapV f xs++zipWithV f (x:>xs) (y:>ys) = f x y :> (zipWithV f xs ys)+zipWithV _ _ _ = NullV++foldlV _ a NullV = a+foldlV f a (x:>xs) = foldlV f (f a x) xs++foldrV _ a NullV = a +foldrV f a (x:>xs) = f x (foldrV f a xs)++filterV _ NullV = NullV+filterV p (v:>vs) = if (p v) then+ v :> filterV p vs+ else + filterV p vs++zipV (x:>xs) (y:>ys) = (x, y) :> zipV xs ys+zipV _ _ = NullV++unzipV NullV = (NullV, NullV)+unzipV ((x, y) :> xys) = (x:>xs, y:>ys) + where (xs, ys) = unzipV xys++shiftlV vs v = v :> initV vs++shiftrV vs v = tailV vs <: v++rotrV NullV = NullV+rotrV vs = tailV vs <: headV vs++rotlV NullV = NullV+rotlV vs = lastV vs :> initV vs++concatV = foldrV (<+>) NullV++reverseV NullV = NullV+reverseV (v:>vs) = reverseV vs <: v++generateV 0 _ _ = NullV+generateV n f a = x :> generateV (n-1) f x + where x = f a++iterateV 0 _ _ = NullV+iterateV n f a = a :> iterateV (n-1) f (f a)++copyV k x = iterateV k id x ++{-+serialV fs x = serialV' (reverseV fs ) x+ where+ serialV' NullV x = x+ serialV' (f:>fs) x = serialV fs (f x)+++parallelV NullV NullV = NullV+parallelV _ NullV + = error "parallelV: Vectors have not the same size!"+parallelV NullV _ + = error "parallelV: Vectors have not the same size!"+parallelV (f:>fs) (x:>xs) = f x :> parallelV fs xs++scanlV _ _ NullV = NullV+scanlV f a (x:>xs) = q :> scanlV f q xs + where q = f a x++scanrV _ _ NullV = NullV+scanrV f a (x:>NullV) = f x a :> NullV+scanrV f a (x:>xs) = f x y :> ys + where ys@(y:>_) = scanrV f a xs++meshlV _ a NullV = (a, NullV)+meshlV f a (x:>xs) = (a'', y:>ys) + where (a', y) = f a x+ (a'', ys) = meshlV f a' xs++meshrV _ a NullV = (NullV, a)+meshrV f a (x:>xs) = (y:>ys, a'') + where (y, a'') = f x a'+ (ys, a') = meshrV f a xs+-}++++++
+ src/ForSyDe/Signal.hs view
@@ -0,0 +1,30 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.Signal+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- +-- This module provides the fundamental data structure for deep-embedded +-- ForSyDe models: 'Signal'.+--+-----------------------------------------------------------------------------+++-- This module is simply used to export Signal to the end user hiding its internal +-- representation+module ForSyDe.Signal (Signal) where+++import ForSyDe.Netlist (Signal)++++ +++
+ src/ForSyDe/System.hs view
@@ -0,0 +1,24 @@+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.System+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- This module provides publicly usable functions to build a system definition+-- and instantiate it.+-- +-----------------------------------------------------------------------------+module ForSyDe.System +(SysDef, newSysDef, newSysDefTH, newSysDefTHName,+ SysFun, SysFunToSimFun, SysFunToIOSimFun,+ instantiate)+where++import ForSyDe.System.SysDef (SysDef, newSysDef, newSysDefTH, newSysDefTHName)+import ForSyDe.System.SysFun (SysFun, SysFunToSimFun, SysFunToIOSimFun)+import ForSyDe.System.SysFun.Instances ()+import ForSyDe.System.Instantiate (instantiate)
+ src/ForSyDe/System/Instantiate.hs view
@@ -0,0 +1,44 @@+{-# LANGUAGE TemplateHaskell #-} +-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.System.Instantiate+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides instantiation capabilities to System Definitions+-- ('SysDef's).through a Template-Haskell-based function: 'instantiate'.+--+-- Thanks to 'instantiate' ForSyDe models have hierarchy capabilities.+--+-----------------------------------------------------------------------------+module ForSyDe.System.Instantiate (instantiate) where++import ForSyDe.Ids (ProcId)+import ForSyDe.OSharing (readURef)+import ForSyDe.Netlist+import ForSyDe.System.SysDef (SysDef)+import ForSyDe.System.SysFun (SysFun(fromListSysFun))+++++-- | Generates an instance of a 'SysDef' in the form of +-- function out of the name of a 'SysDef' with the same type as its +-- system function. The resulting function can then be used to plug the +-- instance to the rest of the system.+instantiate :: SysFun f => ProcId -> SysDef f -> f+instantiate id sysDef = fromListSysFun (instantiateList id sysDef) []+++-------------------+-- Helper Functions+-------------------++instantiateList :: ProcId -> SysDef a -> [NlSignal] -> [NlSignal]+instantiateList id sysDef inSigs = map (\t -> newNodeOutSig instanceSig t) tags + where instanceSig = newSysIns id sysDef inSigs + tags = outTags $ readURef instanceSig
+ src/ForSyDe/System/SysDef.hs view
@@ -0,0 +1,405 @@+{-# LANGUAGE TemplateHaskell #-} +-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.System.SysDef+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides the System Definition type ('SysDef') together with+-- a Template Haskell constructor to build it. +--+-----------------------------------------------------------------------------+module ForSyDe.System.SysDef + (SysDef(..),+ PrimSysDef(..),+ SysDefVal(..), + SysLogic(..),+ newSysDef,+ newSysDefTH,+ newSysDefTHName,+ Iface) where++import ForSyDe.Ids+import ForSyDe.Netlist +import ForSyDe.Netlist.Traverse+import ForSyDe.OSharing+import ForSyDe.ForSyDeErr+import ForSyDe.System.SysFun (checkSysFType, SysFun(..))++import Data.Maybe (isJust, fromJust)+import Control.Monad.Error+import Control.Monad.ST+import Control.Monad.State+import Data.Typeable+import Language.Haskell.TH+import Language.Haskell.TH.LiftInstances ()++++++-- | Interface, describes the input or output ports of the system.+-- Each entry contains the name of the port and its type.+type Iface = [(PortId, TypeRep)]+++-- | We add a phantom parameter to indicate the type of the system +newtype SysDef a = SysDef {unSysDef :: PrimSysDef}++-- | The Primitive System Definition.+-- Instead of just providing the value, a reference is provided+-- to allow sharing between instances.+newtype PrimSysDef = PrimSysDef {unPrimSysDef :: URef SysDefVal}++++-- | Indicates wether a system is combinational or sequential+-- In practice, a system is sequential if if contains a delay process or+-- a sequential system instance, otherwise its combinational.+data SysLogic = Combinational | Sequential+ deriving (Eq, Show)+++-- | The System Definition value+data SysDefVal = SysDefVal + {sid :: SysId, -- ^ Identifier of the System + netlist :: Netlist [], -- ^ System netlist+ subSys :: [PrimSysDef], -- ^ List of all unique nested subsystems+ -- (i.e. flattened tree, without duplicates,+ -- of all the systems in lower levels of the + -- hierarchy)+ logic :: SysLogic, -- ^ 'SysLogic' of the system + + iIface :: Iface, -- ^ Input interface+ oIface :: Iface, -- ^ Output interface + loc :: Maybe Loc} -- ^ Location of the call to newSysDef+ -- which created this System definition+ -- (used for later error reporting)+ -- It will initialized or not depending+ -- on the newSysDef* function used++++-- | 'SysDef' constructor+--+-- Builds a system definition out of a system function describing the system +-- and its port identifers. +newSysDef :: SysFun f => f -- ^ system function + -> SysId -- ^ System identifier + -> [PortId] -- ^ Input interface port identifiers + -> [PortId] -- ^ Output interface port identifiers + -> SysDef f+newSysDef f sysId inIds outIds = either currError id eProneResult+ where currError = uError "newSysDef"+ eProneResult = newSysDefEProne f Nothing sysId inIds outIds++-- | CURRENTLY BROKEN, do not use!+--+-- 'SysDef' constructor, Template Haskell version+--+-- Builds a system definition out of a system function, a system identifiers +-- and its port identifers.+--+-- For example @$(newSysDefTH mySysFun \"mysys\" [\"in1\"] [\"out1\"])@ creates a+-- system definition from system funcion @mySysFun@ which should have +-- one input and output signals.+--+-- The advantage of 'newSysDefTH' over 'newSysDef' is that it +-- reports errors (e.g duplicated port and process identifiers) earlier, +-- at host-language (Haskell) compile-time. +--+-- In addition, due to the use of Template Haskell, 'newSysDefTH' is+-- aware of the source location at which it was called, making+-- further error reports friendlier to the user.+newSysDefTH :: SysFun f => f -- ^ system function + -> SysId -- ^ System identifier + -> [PortId] -- ^ Input interface port identifiers + -> [PortId] -- ^ Output interface port identifiers + -> ExpQ+newSysDefTH f sysId inIds outIds = + case eProneResult of+ Left err -> currError err+ -- unfortunately SysDef can't easily be an instance of Lift + -- due to the unsafe, unmutable references used in observable sharing + -- Right sysDef -> [| sysDef |]+ Right _ -> intError "newSysDefTH" (Other "Unimplemented")+-- FIXME: Fix this function or remove (updating the documentation of+-- newSysDef* in the latter case).+{-+ Right _ -> do+ loc <- currentModule+ [| let iIds = inIds+ oIds = outIds+ (nlist, inTypes, outTypes) = applySysFun f iIds+ in SysDef $ PrimSysDef $ newURef $ SysDefVal sysId+ (Netlist nlist)+ (zip iIds inTypes)+ (zip oIds outTypes)+ (Just loc) |]+-}+ where currError = qError "newSysDefTH"+ eProneResult = newSysDefEProne f Nothing sysId inIds outIds+++-- | 'SysDef' constructor, Template Haskell 'Name' version+--+-- Builds a 'SysDef' out of the name of a system function+-- and its port identifers.+--+-- The system will later be identified by the basename +-- (i.e. unqualified name) of the function.+--+-- For example @$(newSysDefTHName \'mySysFun [\"in1\"] [\"out1\"])@ creates a+-- system definition from system funcion @mySysFun@ which has one input and+-- output signals.+-- +-- The advantage of 'newSysDefTHName' over 'newSysDefTH' is that it +-- doesn't suffer from the Template Haskell bug <http://hackage.haskell.org/trac/ghc/ticket/1800>, or in other words, it allows to declare the system +-- defintion and system function in the same module.+--+-- However, since it doesn't have acces to the system function itself,+-- it can only give early error reports related to incorrect port identifiers+-- (process identifier duplicate errors will be reported at runtime).+newSysDefTHName :: Name -- ^ Name of the system function + -> [PortId] -- ^ Input interface port identifiers + -> [PortId] -- ^ Output interface port identifiers+ -> ExpQ +newSysDefTHName sysFName inIds outIds = do+ sysFInfo <- reify sysFName+ -- Check that a function name was provided+ sysFType <- case sysFInfo of+ VarI _ t _ _ -> return t+ _ -> currError (NonVarName sysFName)+ -- Check that the function complies with the expected type+ -- and extract the port types+ ((inTypes,inN),(outTypes, outN)) <- recover+ (currError $ IncomSysF sysFName sysFType)+ (checkSysFType sysFType)+ -- Check the ports+ let portCheck = checkSysDefPorts (show sysFName)+ (inIds, inN) + (outIds, outN)+ when (isJust portCheck) (currError (fromJust portCheck))+ -- Build the system definition+ errInfo <- currentModule+ let+ -- Input arguments passed to the system function+ -- in order to get the netlist+ inArgs = [ [| Signal $ newInPort $(litE $ stringL id) |] + | id <- inIds ]+ -- The system definition without type signature for the+ -- phantom parameter + untypedSysDef =+ -- The huge let part of this quasiquote is not+ -- really necesary but generates clearer code+ [|let + -- Generate the system netlist+ toList = $(signalTup2List outN)+ outNlSignals = toList $ $(appsE $ varE sysFName : inArgs)+ -- Rest of the system defintion+ inIface = $(genIface inIds inTypes)+ outIface = $(genIface outIds outTypes)+ errorInfo = errInfo+ nlist = Netlist outNlSignals+ (subSys,logic) = either (intError currFun) id+ (checkSysDef nlist) + in SysDef $ PrimSysDef $ newURef $ + SysDefVal (nameBase sysFName)+ nlist+ subSys+ logic+ inIface + outIface + (Just errorInfo) |] + -- We are done, we simply specify the concrete type of the SysDef+ sigE untypedSysDef (return $ ConT ''SysDef `AppT` sysFType)+ where currError = qError currFun+ currFun = "newSysDef"+++ ++----------------------------+-- Internal Helper Functions+----------------------------++-- | Error prone version of 'newSysDef'+newSysDefEProne :: SysFun f => f -- ^ system function + -> Maybe Loc -- ^ Location where the originating + -- call took place (if available)+ -> SysId -- ^ System function + -> [PortId] -- ^ Input interface port identifiers + -> [PortId] -- ^ Output interface port identifiers + -> EProne (SysDef f)+newSysDefEProne f mLoc sysId inIds outIds + -- check the ports for problems+ | isJust portCheck = throwError (fromJust portCheck)+ | otherwise = do+ let nl = Netlist nlist+ (subSys, logic) <- checkSysDef nl+ return (SysDef $ PrimSysDef $ newURef $ SysDefVal sysId+ nl+ subSys+ logic+ (zip inIds inTypes)+ (zip outIds outTypes)+ mLoc)+ where (nlist, inTypes, outTypes) = applySysFun f inIds+ inN = length inIds+ outN = length outIds+ portCheck = checkSysDefPorts sysId (inIds, inN) (outIds, outN) ++-- | Check that the system definition ports match certain lengths and+-- don't containt duplicates+checkSysDefPorts :: SysId -- ^ System currently being checked+ -> ([PortId], Int) -- ^ input ports and expected length+ -> ([PortId], Int) -- ^ output ports and expected length+ -> Maybe ForSyDeErr+checkSysDefPorts sysId (inIds, inN) (outIds, outN) + | inN /= inIdsL = Just $ InIfaceLength (sysId, inN) (inIds, inIdsL)+ | outN /= outIdsL = Just $ OutIfaceLength (sysId, outN) (outIds, outIdsL)+ | isJust (maybeDup) = Just $ MultPortId (fromJust maybeDup)+ | otherwise = Nothing+ where inIdsL = length inIds+ outIdsL = length outIds+ maybeDup = findDup (inIds ++ outIds)+++-- | In order to check the system for identifier duplicates we keep track+-- of the process identifiers and of the accumulated subsytem definitions+data CheckState = CheckState {accumSubSys :: [PrimSysDef],+ accumProcIds :: [ProcId] ,+ accumLogic :: SysLogic }++-- Monad used to traverse the system in order to check that there are no +-- duplicates+type CheckSysM st a = TravSEST CheckState ForSyDeErr st a++-- | Check that the system netlist does not contain process identifier+-- duplicates (i.e. different processes with the same process+-- identifier) or instances of different systems with the same identifier.+-- In case there are no duplicates, the list of nested subsystems together+-- with the the logic is returned.+checkSysDef :: Netlist [] -> EProne ([PrimSysDef], SysLogic)+checkSysDef nl = do+ endSt <- runST (runErrorT + (execStateT (traverseSEST newCheckSys defineCheckSys nl) initState))+ let finalSubSys = accumSubSys endSt+ -- we already checked all the delay processes of the system+ -- but the system can still be sequential if any of the subsystems is + -- sequential+ finalLogic = + if (accumLogic endSt == Sequential) ||+ (any (\s -> (logic.readURef.unPrimSysDef) s == Sequential) finalSubSys)+ then Sequential+ else Combinational+ return (finalSubSys, finalLogic)+ where initState = CheckState [] [] Combinational+ ++defineCheckSys :: [(NlNodeOut, ())] -> NlNode () -> CheckSysM st ()+defineCheckSys _ _= return ()+ +newCheckSys :: NlNode NlSignal -> CheckSysM st [(NlNodeOut, ())]+newCheckSys node = do+ st <- get+ let acIds = accumProcIds st+ acSys = accumSubSys st+ acLog = accumLogic st+ -- check the process Id of current node for duplicates+ acIds' <- case node of + -- input ports don't count as process identifiers+ InPort _ -> return acIds + Proc pid _ -> if pid `elem` acIds + then throwError $ MultProcId pid+ else return (pid:acIds)+ -- If the node is a system instance, check that+ -- the system and all its subsytems are either:+ -- * already in the accumulated systems+ -- * not in the accumulated systems, but have a different system+ -- identifiers+ -- FIXME: in order to avoid making so many comparisons, it+ -- would probably be more efficient to also mark which+ -- subsystems belong to the first hierarchy level in+ -- SysVal (i.e. creating a tree-structure as a reult).+ -- Then, if the system to compare (psys) matches a+ -- root in the accumulated subsystems there would be+ -- no need to continue comparing the childs of psys.+ acSys' <- case node of + Proc _ (SysIns pSys _) -> + liftEither $ + mergeSysIds (pSys:(subSys.readURef.unPrimSysDef) pSys) acSys+ _ -> return acSys+ let acLog' = case node of+ Proc _ (DelaySY _ _) -> Sequential + _ -> acLog+ put $ CheckState acSys' acIds' acLog'+ -- return a phony value for each output of the node+ return $ map (\tag -> (tag,())) (outTags node) ++ where mergeSysIds :: [PrimSysDef] -> [PrimSysDef] -> EProne [PrimSysDef]+ mergeSysIds xs [] = return xs+ mergeSysIds [] xs = return xs+ mergeSysIds (x:xs) ys = do + shouldAdd <- addSysId x ys + if shouldAdd then do rest <- mergeSysIds xs ys+ return (x:rest)+ else mergeSysIds xs ys+ -- should we add the Id to the accumulated ones?+ addSysId :: PrimSysDef -> [PrimSysDef] -> EProne Bool+ addSysId _ [] = return True+ addSysId psdef (x:xs) + -- Both systems are equal+ | unx == unpsdef = return False+ -- Both systems are different, but their ids+ -- are equal+ | sdefid == sid xval = + throwError (SubSysIdClash sdefid (loc sdefval) (loc xval))+ | otherwise = addSysId psdef xs+ where unpsdef = unPrimSysDef psdef+ unx = unPrimSysDef x+ xval = readURef unx+ sdefval = readURef unpsdef+ sdefid = sid sdefval+++-- | Generate a lambda expression to transform a tuple of N 'Signal's into a +-- a list of 'NlSignal's+signalTup2List :: Int -- ^ size of the tuple+ -> ExpQ+signalTup2List n = do -- Generate N signal variable paterns and+ -- variable expressions refering to the same names+ names <- replicateM n (newName "i")+ let tupPat = tupP [conP 'Signal [varP n] | n <- names]+ listExp = listE [varE n | n <- names]+ lamE [tupPat] listExp+++-- | Find a duplicate in a list+findDup :: Eq a => [a] -> Maybe a+findDup [] = Nothing +findDup [_] = Nothing+findDup (x:xs)+ | elem x xs = Just x+ | otherwise = findDup xs+++-- | Generate a TypeRep expression given a Template Haskell Type+-- note that the use of typeOf cannot lead to errors since all the signal+-- types in a system function are guaranteed to be Typeable by construction+type2TypeRep :: Type -> ExpQ+type2TypeRep t = [| typeOf $(sigE [| undefined |] (return t) ) |]++-- | Generate an interface given its identifiers and Template Haskell Types+genIface :: [PortId] -> [Type] -> ExpQ+genIface [] _ = listE []+genIface _ [] = listE []+genIface (i:ix) (t:tx) = do+ ListE rest <- genIface ix tx+ tupExp <- tupE [[| i |], type2TypeRep t]+ return (ListE (tupExp:rest)) +
+ src/ForSyDe/System/SysDef.hs-boot view
@@ -0,0 +1,19 @@+-- SysDef.hs-boot: GHC bootstrapping module for Netlist.hs+-- (it breaks the recursive import loop with Netlist.hs)+-- See "How to compile mutually recursive modules" in GHC's manual for details++module ForSyDe.System.SysDef where++import ForSyDe.OSharing+import ForSyDe.Ids+import Data.Typeable (TypeRep)++type Iface = [(PortId, TypeRep)]++newtype SysDef a = SysDef {unSysDef :: PrimSysDef}++newtype PrimSysDef = PrimSysDef {unPrimSysDef :: URef SysDefVal}++data SysDefVal ++oIface :: SysDefVal -> Iface
+ src/ForSyDe/System/SysFun.hs view
@@ -0,0 +1,312 @@+{-# LANGUAGE TemplateHaskell, ScopedTypeVariables, MultiParamTypeClasses,+ FunctionalDependencies #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.System.SysFun+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides the 'SysFun' class and a Template Haskell +-- function to check whether a 'Type' complies with the expected +-- type of a system function not.+--+----------------------------------------------------------------------------- +module ForSyDe.System.SysFun + (SysFun(..),+ SysFunToSimFun(..), + SysFunToIOSimFun(..),+ funOutInstances, + checkSysFType) where++import ForSyDe.Ids(PortId)+import ForSyDe.Netlist (NlSignal, Signal(..))+import ForSyDe.ForSyDeErr+import ForSyDe.Process.ProcType (ProcType(..))++import Language.Haskell.TH.TypeLib++import Data.Dynamic+import Control.Monad (when, liftM3)+import Text.Regex.Posix ((=~))+import qualified Language.Haskell.TH as TH (Exp)+import Language.Haskell.TH+import Text.ParserCombinators.ReadP (readP_to_S)+++---------------+-- SysFun class+---------------++-- | Class used to describe a System function. It uses the same trick+-- as 'Text.Printf' to implement the variable number of arguments.+class SysFun f where+ -- | Gets the result of applying a system function to input port signals+ -- whose name is given in first argument.+ -- In case the input id list is not long enough, \"default\" will be used+ -- as the id of the remaining ports.+ applySysFun :: f + -> [PortId] -- ^ ids used to build the input ports+ -> ([NlSignal], [TypeRep], [TypeRep])+ -- ^ (output signals returned by the system function,+ -- types of input ports, + -- types of output ports)++ -- | Transforms a primitive-signal-list version of a system function+ -- into a standard system function.+ -- Note the length of input/output lists of the list version must match with + -- the argument number and return tuple size of the system function.+ fromListSysFun :: ([NlSignal] -> [NlSignal]) -- ^ primitive-signal-list sysfun+ -> [NlSignal] -- ^ accumulated primitive signals+ -- (must be initialized to [])+ -> f+ +++-----------------------+-- SysFunToSimFun class+-----------------------++-- | Multiparameter class to transform a System Function into a Simulation +-- Function, able to simulate a System using a list-based representation +-- of its signals.+class SysFun sysFun => + SysFunToSimFun sysFun simFun | sysFun -> simFun, simFun -> sysFun where+ -- | Transforms a dynamic-list version of a simulation function+ -- into a standard simulation function.+ -- Note the length of input/output lists of the list version must match with + -- the argument number and return tuple size of the simulation function.+ fromDynSimFun :: ([[Dynamic]] -> [[Dynamic]]) -- ^ dynamic-list simfun+ -> [[Dynamic]] -- ^ accumulated dynamic values+ -- (must be initialized to [])+ -> simFun++-------------------------+-- SysFunToIOSimFun class+-------------------------++-- | Multiparameter class to transform a System Function into an IO +-- Simulation Function, able to externally simulate a System using a +-- list-based representation of its signals.+class SysFun sysFun => + SysFunToIOSimFun sysFun simFun | + sysFun -> simFun, simFun -> sysFun where+ -- | Transforms a TH/String version of a simulation function into a+ -- standard simulation function. + -- Again, the length of input/output lists of the list version must+ -- match with the argument number and return tuple size of the+ -- simulation function.+ fromTHStrSimFun :: ([[TH.Exp]] -> IO [[String]]) -- ^ TH/String-list simfun+ -> [[TH.Exp]] -- ^ accumulated dynamic values+ -- (must be initialized to [])+ -> simFun++-- Function to automatically generate instances for the system and+-- simulate function outputs with Template Haskell. For example, in+-- the case of 2 outputs, the code generated would be:+--+-- @+-- NOTE: even if all ProcType constraints could be less restrictive (Typeable+-- would do), it makes more sense, and who nows, maybe we end up requiring+-- full ProcType functionality at some point. +--+--+-- instance (ProcType o1, ProcType o2) => SysFun (Signal o1, Signal o2) where+-- applyFun (o1, o2) _ = +-- ([unSignal o1, unSignal o2], [], [typeOf o1, typeOf o2]) +-- fromListSysFun f accum = (Signal o1, Signal o2)+-- where [o1, o2] = f (reverse accum) +--+-- instance (ProcType o1, ProcType o2) => +-- SysFun2SimFun (Signal o1, Signal o2) ([o1], [o2]) where+-- fromDynSimFun f accum = (map unsafeFromDyn o1, map unsafeFromDyn o2)+-- -- use pattern (o1:o2:_) and not not [o1,o2]+-- -- because the second one doesn't when o1 and o2 are infinite lists+-- where (o1:o2:_) = f (reverse accum) +--+-- instance (ProcType o1, ProcType o2) => +-- SysFun2SimFun (Signal o1, Signal o2) (IO ([o1], [o2])) where+-- fromTHStrSimFun f accum = do+-- [o1, o2] <- f (reverse accum)+-- return (map parseProcType o1, map parseProcType o2) +--+--+-- @+funOutInstances :: Int -- ^ number of outputs to generate+ -> Q (Dec, Dec, Dec)+funOutInstances n = do+ -- Generate N output names+ outNames <- replicateM n (newName "o")+ + -- 1) Generate applyFun+ -- Generate an input tuple pattern for applyFun+ -- (o1, o2, ..., on)+ let tupPatApply = tupP (map varP outNames)+ -- Generate the output primitive signal list expression for applyFun+ -- [unsignal o1, unsignal o2, ...., unsignal on]+ outPrimSignalsApply = + listE $ map (\oName -> varE 'unSignal `appE` varE oName) outNames+ -- Generate the output signal types for ApplyFun+ -- [typeOf o1, typeOf o2, ...., typeOf on]+ outTypeRepsApply =+ listE $ map (\oName -> varE 'typeOf `appE` varE oName) outNames+ -- Generate the full output expression+ outEApply = [| ($outPrimSignalsApply, [], $outTypeRepsApply) |]+ -- Finally, the full declaration of applyFun + applySysFunDec = + funD 'applySysFun [clause [tupPatApply, wildP] (normalB outEApply) []]+ -- 2) Generate fromListSysFun+ -- Generate the parameter names+ fParFromSys <- newName "f"+ accumParFromSys <- newName "accum"+ -- Generate the parameter patterns+ let fPatFromSys = varP fParFromSys+ accumPatFromSys = varP accumParFromSys + -- Generate the list pattern: [o1, o2, .., on]+ listPatFromSys = listP $ map varP outNames+ -- Generate the rhs of the where declaration+ whereRHSFromSys = + [| $(varE fParFromSys) (reverse $(varE accumParFromSys)) |]+ -- Generate the where clause declaration+ whereDecFromSys = valD listPatFromSys (normalB whereRHSFromSys) []+ -- Generate output expression: (Signal o1, Signal o2, ..., Signal on)+ outEFromSys = + tupE $ map (\oName -> conE 'Signal `appE` varE oName) outNames+ -- Finally, the full declaration of fromListSysFun+ fromListSysFunDec = + funD 'fromListSysFun [clause [fPatFromSys, accumPatFromSys] + (normalB outEFromSys) + [whereDecFromSys] ] + -- 3) Generate fromDynSimFun reusing parts of fromListSysFun+ -- Generate the list pattern: o1:o2: .. on:_+ listPatFromDynSim = foldr (\oName pat -> infixP (varP oName) '(:) pat) + wildP outNames+ -- Generate the rhs of the where declaration+ whereRHSFromDynSim = + [| $(varE fParFromSys) (reverse $(varE accumParFromSys)) |]+ -- Generate the where clause declaration+ whereDecFromDynSim = valD listPatFromDynSim (normalB whereRHSFromSys) []+ -- Generate output expression: (Signal o1, Signal o2, ..., Signal on)+ outEFromDynSim = tupE $ map + (\oName -> varE 'map `appE` varE 'unsafeFromDyn `appE` varE oName)+ outNames+ -- Finally, the full declaration of fromDynSimFun+ fromDynSimFunDec = + funD 'fromDynSimFun [clause [fPatFromSys, accumPatFromSys] + (normalB outEFromDynSim) + [whereDecFromDynSim] ] + -- 4) Generate fromTHStrSimFun reusing parts of fromListSysFun+ listPatFromTHStrSim = listP $ map varP outNames+ -- Generate the rhs of the where declaration+ doFromTHStrSim = doE $+ [bindS listPatFromDynSim [| $(varE fParFromSys) + (reverse $(varE accumParFromSys)) |],+ noBindS $ + (varE 'return) `appE`+ (tupE $ map + (\oName -> varE 'map `appE` varE 'parseProcType `appE` varE oName)+ outNames) ]+ -- Finally, the full declaration of fromThStrSimFun+ fromTHStrSimFunDec = + funD 'fromTHStrSimFun [clause [fPatFromSys, accumPatFromSys] + (normalB doFromTHStrSim) + [] ] + -- 5) Generate the SysFun instance+ -- We reuse the output signal names for the head type variables+ -- (Signal o1, Signal o2, ..., Signal on)+ signalTupT = if n == 1 then conT ''Signal `appT` varT (head outNames)+ else foldl accumApp (tupleT n) outNames + where accumApp accumT vName = + accumT `appT` (conT ''Signal `appT` varT vName)+ -- Create the ProcType context+ procTypeCxt = map (\vName -> conT ''ProcType `appT` varT vName) outNames++ -- Finally return the instance declaration+ sysFunIns = instanceD (cxt procTypeCxt) + (conT ''SysFun `appT` signalTupT) + [applySysFunDec, fromListSysFunDec]+ -- 6) Generate the SysFun2SimFun instance + listTupT = if n == 1 then listT `appT` varT (head outNames)+ else foldl accumApp (tupleT n) outNames + where accumApp accumT vName = + accumT `appT` (listT `appT` varT vName)+ simFunIns = instanceD (cxt procTypeCxt) + (conT ''SysFunToSimFun `appT` signalTupT `appT` listTupT) + [fromDynSimFunDec]+ -- 7) Generate the SysFun2IOSimFun instance+ ioSimFunIns = instanceD (cxt procTypeCxt)+ (conT ''SysFunToIOSimFun `appT` + signalTupT `appT` + (conT ''IO `appT` listTupT))+ [fromTHStrSimFunDec]+ -- Finally, return the declarations+ liftM3 (,,) sysFunIns simFunIns ioSimFunIns++---------------------------------------------------------------+-- Checking the type of a System Function with Template Haskell+---------------------------------------------------------------++-- | Given a function type expressed with Template Haskell, check+-- whether it complies with the expected type of a system function+-- and, in that case, provide the type and number of the system+-- inputs and outputs.+checkSysFType :: Type -> Q (([Type],Int),([Type],Int))+checkSysFType t = do let (inputTypes, retType, context) = unArrowT t+ (outCons, outTypes, _) = unAppT retType + -- Discard polymorphic system functions+ -- FIXME: We could support polymorphic signals, but it+ -- requires more work and we don't still know if it + -- will be necessary anyway.+ when (isPoly context) (qGiveUp name)+ -- Check that all inputs are signals+ when (not $ all isSignalT inputTypes) (qGiveUp name)+ -- Check the outputs+ outInfo <- checkSysFOutputs (outCons, outTypes)+ return ((inputTypes, length inputTypes), outInfo)+ where name = "ForSyDe.System.checkSysFType"+++-- | Check the output types of the system function given its+-- constructor and its type arguments+checkSysFOutputs :: (Type, [Type]) -> Q ([Type], Int)+-- The system function doesn't output any signals at all+checkSysFOutputs (ConT n, []) | n == ''() = return ([],0)+-- The system function just returns a signal+checkSysFOutputs (ConT s, [arg]) | s == ''Signal = + return ([ConT ''Signal `AppT` arg ], 1)+-- The system function returns various signals in a tuple+-- NOTE: Unfortunatelly due to ghc's bug 1849 TupleT is never returned by reify+-- so we have to match the constructor with a regex+-- FIXME: Update this function whenever the bug is fixed +-- http://hackage.haskell.org/trac/ghc/ticket/1849+checkSysFOutputs (ConT name, outTypes) + | show name =~ "^Data\\.Tuple\\.\\(,+\\)$" = do+ when (not $ all isSignalT outTypes) (qGiveUp checkSysFOutputsNm)+ return (outTypes, length outTypes)+-- Otherwise the function output type is incorrect+checkSysFOutputs _ = qGiveUp checkSysFOutputsNm++checkSysFOutputsNm :: String+checkSysFOutputsNm = "ForSyDe.System.SysFun.checkSysFOutputs"++-- | Check if a type corresponds to a signal+isSignalT :: Type -> Bool+isSignalT ((ConT name) `AppT` _ ) | name == ''Signal = True+isSignalT _ = False++-- | Unsafely transform from a dynamic value+unsafeFromDyn :: forall a . Typeable a => Dynamic -> a+unsafeFromDyn dyn = fromDyn dyn err + where err = intError "unsafeFromDyn" (DynMisMatch dyn targetType) + targetType = typeOf (undefined :: a)++-- | Parse a proctype value+parseProcType :: forall a .ProcType a => String -> a+parseProcType s = + case (readP_to_S readProcType) s of + [(a,_)] -> a+ _ -> error ("parseProcType: error parsing element of type " +++ show (typeOf (undefined :: a)) )
+ src/ForSyDe/System/SysFun/Instances.hs view
@@ -0,0 +1,81 @@+{-# LANGUAGE TemplateHaskell, FlexibleInstances, ScopedTypeVariables,+ MultiParamTypeClasses, UndecidableInstances #-}+-----------------------------------------------------------------------------+-- |+-- Module : ForSyDe.System.SysFun.Instances+-- Copyright : (c) The ForSyDe Team 2007+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : non-portable (Template Haskell)+--+-- This module provides the instances for 'SysFun', it cannot+-- be included in "ForSyDe.System.SysFun" directly due to a Template Haskell+-- bug which prevents Template Haskell from executing functions defined in the+-- same module: <http://hackage.haskell.org/trac/ghc/ticket/1800>+--+----------------------------------------------------------------------------- +module ForSyDe.System.SysFun.Instances () where++import Data.Dynamic+import Control.Monad (liftM)+import Language.Haskell.TH.Syntax (runIO, runQ, lift)+import System.IO.Unsafe (unsafePerformIO)++import ForSyDe.Config (maxTupleSize)+import ForSyDe.System.SysFun (+ SysFun(..), + SysFunToSimFun(..), + SysFunToIOSimFun(..), + funOutInstances)+import ForSyDe.Netlist+-- This aparently unnecesary SysDef import is needed as a workaround for +-- http://hackage.haskell.org/trac/ghc/ticket/1012+import ForSyDe.System.SysDef()+import ForSyDe.Process.ProcType (ProcType(..))+++-- IMPORTANT NOTE: even if all ProcType constraints in SysFun and+-- SysFunToSimFun instances could be less restrictive+-- (Typeable would do), it makes more sense, and who nows,+-- maybe we end up requiring full ProcType functionality at+-- some point.+++-- This three instances are the ones in charge of providing the necessary +-- recursion step needed to support the variable number of arguments.+-- In each step, the system function is provided with a new input signal port+-- until the output signals are obtained.+instance (ProcType a, SysFun f) => SysFun (Signal a -> f) where+ applySysFun f ids = (outSignals, currInType : nextInTypeReps, outTypeReps)+ where (outSignals, nextInTypeReps, outTypeReps) = + case ids of+ [] -> applySysFun (f (Signal (newInPort "default"))) []+ (i:is) -> applySysFun (f (Signal (newInPort i))) is + currInType = typeOf (undefined :: Signal a)+ fromListSysFun f accum s = fromListSysFun f ((unSignal s):accum)++instance (ProcType a, SysFunToSimFun sysFun simFun) => + SysFunToSimFun (Signal a -> sysFun) ([a] -> simFun) where+ fromDynSimFun f accum s = fromDynSimFun f ((map toDyn s):accum)++instance (ProcType a, SysFunToIOSimFun sysFun simFun) => + SysFunToIOSimFun (Signal a -> sysFun) ([a] -> simFun) where+ fromTHStrSimFun f accum s = fromTHStrSimFun f ((map unsafeLift s):accum)+ -- FIXME: This won't be needed once the Data a => Lift a instance+ -- is created+ where unsafeLift = unsafePerformIO.runQ.lift++-- Generate instances for the system function outputs up to the maximum+-- tuple size+$(let concatMapM f xs = liftM concat (mapM f xs) + listFunOutInstances = liftM (\(a,b,c) -> [a,b,c]) . funOutInstances+ msg = "Generating and compiling " ++ show maxTupleSize ++ + " output instances of " +++ show ''SysFun ++ show ''SysFunToSimFun ++ + " and " ++ show ''SysFunToIOSimFun ++ + ", this might take some time ... \n"+ in runIO (putStrLn $ msg) >>+ concatMapM listFunOutInstances [0..maxTupleSize]+ )
+ src/Language/Haskell/TH/Lift.hs view
@@ -0,0 +1,101 @@+{-# LANGUAGE MagicHash, TemplateHaskell #-} +{-# OPTIONS_GHC -fno-warn-deprecations #-}+-- Due to the use of unboxed types, TH, and deprecated Packed Strings+-----------------------------------------------------------------------------+-- |+-- Module : Language.Haskell.TH.Lift+-- Copyright : (c) Ian Lynagh, 2006, (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- Automatically derive Template Haskell's 'Lift' class for datatypes+-- using Template Haskell splices.+-- +-- Based on Lynagh's th-lift package: <http://hackage.haskell.org/cgi-bin/hackage-scripts/package/th-lift>+-----------------------------------------------------------------------------+module Language.Haskell.TH.Lift (deriveLift1, deriveLift) where++import GHC.Exts+import Data.PackedString+import Language.Haskell.TH+import Language.Haskell.TH.Syntax+import Control.Monad (liftM)++modName :: String+modName = "Language.Haskell.TH.Lift"++-- | Automatically generate an instance of 'Lift' for one data type. For example:+-- +-- >{-# LANGUAGE TemplateHaskell #-}+-- >module Colour where+-- >import Language.Haskell.TH.Lift+-- >+-- >data RGB = Red | Green | Blue+-- >+-- >-- Generate the Lift instance of RGB+-- >$(deriveLift1 ''RGB)+deriveLift1 :: Name -> Q [Dec]+deriveLift1 = (liftM (\a -> [a])) . deriveLift ++-- | Version of 'deriveLif1' used to automatically generate instances+-- of Lift for multiple data types. For instance:+--+-- >{-# LANGUAGE TemplateHaskell #-}+-- >module Colour where+-- >import Language.Haskell.TH.Lift+-- >+-- >data RGB = Red | Green | Blue+-- >+-- >data Num a => Pixel a = Pixel a a a+-- >+-- >-- Generate Lift instances for RGB and Pixel+-- >$(mapM deriveLift [''RGB, ''Pixel])+deriveLift :: Name -> Q Dec+deriveLift n+ = do i <- reify n+ case i of+ TyConI (DataD dcxt _ vs cons _) ->+ let ctxt = liftM (++ dcxt) $ + cxt [conT ''Lift `appT` varT v | v <- vs] + typ = foldl appT (conT n) $ map varT vs+ fun = funD 'lift (map doCons cons)+ in instanceD ctxt (conT ''Lift `appT` typ) [fun]+ _ -> error (modName ++ ".deriveLift: unhandled: " ++ pprint i)++doCons :: Con -> Q Clause+doCons (NormalC c sts)+ = do let ns = zipWith (\_ i -> "x" ++ show i) sts [(0::Integer)..]+ con = [| conE c |]+ args = [ [| lift $(varE (mkName n)) |] | n <- ns ]+ e = foldl (\e1 e2 -> [| appE $e1 $e2 |]) con args+ clause [conP c (map (varP . mkName) ns)] (normalB e) []+doCons (InfixC st1 n st2) = doCons (NormalC n [st1,st2])+doCons (RecC n vsts) + = let st (_, s, t) = (s, t)+ in doCons (NormalC n (map st vsts))+doCons c = error (modName ++ ".doCons: Unhandled constructor: " ++ pprint c)++instance Lift Name where+ lift (Name occName nameFlavour) = [| Name occName nameFlavour |]++instance Lift PackedString where+ lift ps = [| packString $(lift $ unpackPS ps) |]++instance Lift NameFlavour where+ lift NameS = [| NameS |]+ lift (NameQ modName) = [| NameQ modName |]+ lift (NameU i) = [| case $( lift (I# i) ) of+ I# i' -> NameU i' |]+ lift (NameL i) = [| case $( lift (I# i) ) of+ I# i' -> NameL i' |]+ lift (NameG nameSpace pkgName modName)+ = [| NameG nameSpace pkgName modName |]++instance Lift NameSpace where+ lift VarName = [| VarName |]+ lift DataName = [| DataName |]+ lift TcClsName = [| TcClsName |]+
+ src/Language/Haskell/TH/LiftInstances.hs view
@@ -0,0 +1,90 @@+{-# LANGUAGE TemplateHaskell #-} +-----------------------------------------------------------------------------+-- |+-- Module : Language.Haskell.TH.LiftInstances+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides 'Lift' instances for all the AST-types defined+-- in "Language.Haskell.Syntax":+-- 'Guard' 'Strict', 'Callconv', 'Safety','Body', 'Con', 'FunDep', 'Foreign', +-- 'Lit', 'Pat', 'Match', 'Stmt', 'Range', 'Clause', 'Type', 'Dec', 'Exp'+--+-- Furthermore it provides a 'Lift' instance of 'Ratio', 'Int8', 'Int16',+-- 'Int32', +-- (essential for some of the other instantiations) and a function (metaLift)+-- which lifts an expression twice, obtaing its meta AST (the AST of the AST)+-- +-----------------------------------------------------------------------------+module Language.Haskell.TH.LiftInstances (metaLift) where++import Language.Haskell.TH.Lift (deriveLift)++import Language.Haskell.TH.Syntax+ (Guard,+ Strict,+ Callconv,+ Safety,+ Body, + Con, + FunDep, + Foreign, + Lit(IntegerL), + Pat, + Match, + Stmt, + Range, + Clause, + Type, + Dec, + Exp(LitE),+ Q,+ Lift(..))++import Control.Monad (mapM)+import Data.Ratio (Ratio)+import Data.Int (Int8, Int16, Int32, Int64)++$(mapM deriveLift + [''Ratio,+ ''Guard,+ ''Strict,+ ''Callconv,+ ''Safety,+ ''Body, + ''Con, + ''FunDep, + ''Foreign, + ''Lit, + ''Pat, + ''Match, + ''Stmt, + ''Range, + ''Clause, + ''Type, + ''Dec, + ''Exp])++instance Lift Int64 where+ lift x = return (LitE (IntegerL (fromIntegral x)))+++instance Lift Int32 where+ lift x = return (LitE (IntegerL (fromIntegral x)))++instance Lift Int16 where+ lift x = return (LitE (IntegerL (fromIntegral x)))++instance Lift Int8 where+ lift x = return (LitE (IntegerL (fromIntegral x)))+++-- | lift twice, getting the meta AST (the AST of the AST)+metaLift :: Lift a => a -> Q Exp+metaLift exp = do expAST <- lift exp+ lift expAST+
+ src/Language/Haskell/TH/TypeLib.hs view
@@ -0,0 +1,203 @@+-----------------------------------------------------------------------------+-- |+-- Module : Language.Haskell.TH.TypeLib+-- Copyright : (c) SAM Group, KTH/ICT/ECS 2007-2008+-- License : BSD-style (see the file LICENSE)+-- +-- Maintainer : forsyde-dev@ict.kth.se+-- Stability : experimental+-- Portability : portable+--+-- This module provides basic functions related to Template-Haskell's 'Type'.+-- +-----------------------------------------------------------------------------+module Language.Haskell.TH.TypeLib + (Context,+ mkContext,+ monoContext,+ isPoly,+ contextVarNames,+ contextConstraints,+ mkForallT, + unArrowT, + unAppT,+ (-->),+ reAppT,+ reArrowT,+ dynTHType,+ thTypeOf,+ typeRep2Type,+ tyCon2Type) + where++import Data.Dynamic+import Data.Typeable+import Language.Haskell.TH (Type(..), Cxt, Name, pprint, mkName)+import Text.Regex.Posix ((=~))++-----------+-- Context+-----------++-- | A 'Context' represents the forall part and constraints of a type+-- (see 'ForallT')+-- For instance, the context of the type+-- @+-- forall a b. (Show a, Show b) => (a,b)+-- @+-- is @forall a b. (Show a, Show b) =>@+-- where @a@ and @b@ are the the context variables and +-- @(Show a, Show b)@ are the context constraints +data Context = Context + [Name] -- Variable names + Cxt -- Constraints (the context itself)++instance Show Context where+-- FIXME: this is really ugly, refactor and improve its look+ showsPrec _ (Context n cxt) = + showVars n . showConstraints cxt + where showVars n = showForall (not (null n)) (showVars' n)+ showVars' (n:ns) = shows n . showChar ' ' . showVars' ns+ showVars' [] = id+ showConstraints c = (\s -> if not (null c) then ' ':s else s).+ showParen (length c > 1) (showConstraints' c) .+ (\s -> if not (null c) then s ++ " =>" else s)+ showConstraints' [c] = shows c+ showConstraints' (c:cx) = showString (pprint c) . showString ", " . + showConstraints' cx+ showConstraints' [] = id+ showForall b s = if b then showString "forall " . s . showChar '.' + else s++-- | 'Context' constructor+mkContext :: [Name] -> Cxt -> Context+mkContext n c = Context n c++-- | Empty context for monomorphic types+monoContext :: Context+monoContext = Context [] []+ +-- | Tells if the context corresponds to a polymorphic type+isPoly :: Context -> Bool+isPoly (Context [] _) = False+isPoly _ = True++-- | Returns the variable names related to a context+contextVarNames :: Context -> [Name]+contextVarNames (Context n _) = n++-- | Returns the context constraints+contextConstraints :: Context -> Cxt+contextConstraints (Context _ cxt) = cxt++-- | Builds a 'ForallT' type out of a context and a type+mkForallT :: Context -> Type -> Type+mkForallT (Context n cxt) t = ForallT n cxt t++--------------------------------+-- Functions to observe a 'Type'+--------------------------------++-- | Obtains the arguments and return type of a given 'Type' +-- (normally a function)+-- together with its 'Context' (non-empty if the type is polymorphic)+unArrowT :: Type -- ^ Type to observe + -> ([Type], Type, Context) -- ^ (args 'Type', ret 'Type', 'Context')+unArrowT (ForallT names cxt t) = let (args,ret) = unArrowT' t + in (args, ret, Context names cxt)+unArrowT t = let (args,ret) = unArrowT' t + in (args, ret, Context [] [])++-- unArrowT for non-Forall Types+unArrowT' :: Type -> ([Type], Type)+unArrowT' ((ArrowT `AppT` first) `AppT` rest) = let (args, ret) = unArrowT' rest+ in (first:args, ret)+unArrowT' t = ([],t)++-- | Obtains the type constructor of a 'Type' together with its+-- arguments and its 'Context' (non-empty if the type is polymorphic)+unAppT :: Type -- ^ Type to observe+ -> (Type, [Type], Context) -- ^ (Constructor, args 'Type', Context)+unAppT (ForallT names cxt t) = let (cons, args) = unAppT' t+ in (cons, args, Context names cxt)+unAppT t = let (cons, args) = unAppT' t+ in (cons, args, Context [] [])++-- unAppT for non-Forall Types +unAppT' :: Type -> (Type, [Type])+unAppT' t = (first,rest)+ where first:rest = unAppT'ac [] t+ -- Since the constructor is a leaf of the Type tree representation,+ -- it is the last element to be gathered and thus, an accumulator+ -- is used to reverse the list to be returned+ unAppT'ac :: [Type] -> Type -> [Type]+ unAppT'ac acum (prefix `AppT` lastarg) = unAppT'ac (lastarg:acum) prefix+ unAppT'ac acum cons = cons:acum+------------------------------+-- Functions to build a 'Type'+------------------------------++-- | Form a function type out of two types+(-->) :: Type -- ^ Argument type+ -> Type -- ^ Return type+ -> Type -- ^ Resulting function+arg --> ret = (ArrowT `AppT` arg) `AppT` ret++-- | Rebuild a type out of a constructor, its argument types and its context+-- (inverse of 'unAppT')+reAppT :: (Type, [Type], Context) -- ^ (Constructor, type arguments, context)+ -> Type -- ^ resulting 'Type'+-- Polymorphic types+reAppT (cons, args, cxt) | isPoly cxt = + mkForallT cxt (reAppT (cons, args, monoContext)) +-- Monomorphic types+reAppT (cons, args, _) = foldl1 AppT (cons:args)++-- | Rebuild a function type out of its argument types, return type+-- and context (inverse of 'ArrowT')+reArrowT :: ([Type], Type, Context) -- ^ (Constructor, type arguments, context)+ -> Type -- ^ resulting 'Type'+-- Polymorphic types+reArrowT (args, ret, cxt) | isPoly cxt = + mkForallT cxt (reArrowT (args, ret, monoContext)) +-- Monomorphic types+reArrowT (args, ret, _) = foldr1 (-->) (args ++ [ret])++ ++-------------------------------------------------------------------+-- Transforming Data.Typeable.TypeRep into Language.Haskell.TH.Type+-------------------------------------------------------------------++dynTHType :: Dynamic -> Type+dynTHType = typeRep2Type . dynTypeRep++-- | Give the template haskell 'Type' of a Typeable object+thTypeOf :: Typeable a => a -> Type+thTypeOf = typeRep2Type . typeOf++-- | Translate a 'TypeRep' to a Template Haskell 'Type'+typeRep2Type :: TypeRep -> Type+typeRep2Type rep = let (con, reps) = splitTyConApp rep+ in reAppT (tyCon2Type con, map typeRep2Type reps, monoContext)+ +-- | Gives the corresponding Template Haskell 'Type' of a 'TyCon'+tyCon2Type :: TyCon -> Type+tyCon2Type = tyConStr2Type . tyConString+++----------------------------+-- Internal Helper Functions+----------------------------++tyConStr2Type :: String -> Type+-- NOTE: The tyCon strings of basic types are not qualified and buggy in +-- some cases.+-- See http://hackage.haskell.org/trac/ghc/ticket/1841+-- FIXME: update this function whenever the bug is fixed+-- FIXME FIXME: This code is incorrect:+-- mkName doesn't generate global names! ''Maybe /= mkName "Data.Maybe.Maybe"+tyConStr2Type "->" = ArrowT+tyConStr2Type tupStr | tupStr =~ "^,+$" = + ConT (mkName $ "Data.Tuple.(" ++ tupStr ++ ")") +tyConStr2Type str = ConT $ mkName str
+ tests/Install.hs view
@@ -0,0 +1,47 @@+module Install (testInstall) where++import Distribution.Simple.SetupWrapper+import System.Process+import System.Directory+import System.FilePath+import System.Exit+import System.IO++-- Test if the ForSyDe project configures, builds, generates+-- the haddock documentation and installs without problems.+-- In order to avoid poisoning the haskell-package databases+-- and the file system, the package is configured with +-- the local prefix "testInstallation/" and registered+-- in a fresh local package database called "testInstallation.conf"+-- Note that this test will only work with ghc because the creation+-- of a new package database relies on ghc-pkg.+-- Also note that the current working directory must be the root of the project.+testInstall :: IO ()+testInstall = do+ cwd <- getCurrentDirectory+ putStrLn "Configuring ForSyDe ..." + setupCWD ["configure","--user","--prefix=" ++ cwd </> "testInstallation",+ "-v0"]+ putStrLn " done.\n" + putStrLn "Building ForSyDe ..." + setupCWD ["build","-v0"]+ putStrLn " done.\n"+ putStrLn "Testing the haddock markup of ForSyDe ... " + setupCWD ["haddock", "-v0"]+ putStrLn " done.\n"+ putStrLn "Copying ForSyDe under testInstallation/ ... "+ setupCWD ["copy", "-v0"]+ putStrLn " done.\n"+ putStrLn ("Registering ForSyDe in fresh package database " +++ "(testInstallation.conf) ...")+ -- Cabal doesn't allow specifying an alternative package database:+ -- http://hackage.haskell.org/trac/hackage/ticket/307+ -- Thus, we register the package by hand using ghc-pkg+ setupCWD ["register", "--gen-pkg-config=ForSyDeconfig","-v0"]+ code <- waitForProcess =<< + runCommand "ghc-pkg -f testInstallation.conf register ForSyDeconfig"+ case code of+ ExitSuccess -> return ()+ e@(ExitFailure _) -> exitWith e+ putStrLn "done."+ where setupCWD command = setupWrapper command Nothing
+ tests/Main.hs view
@@ -0,0 +1,68 @@+-- Main test module, it must be run from the root directory of the project+module Main (main) where++import Install++import Distribution.System+import Control.Monad (liftM)+import System.IO+import System.Environment (getArgs, getEnv)+import System.Process (runCommand, waitForProcess)+import System.Exit+import System.FilePath (splitDirectories, normalise)+++main :: IO ()+main = do+ needed <- testNeeded+ if needed + then + do hSetBuffering stdout LineBuffering+ testInstall+ -- test the properties using the fresh installation+ -- due to many problems with runghc, I decided to compile it first+ putStrLn ("Compiling the unit testbench: " ++ compilePropertiesCmd)+ h1 <- runCommand compilePropertiesCmd+ e1 <- waitForProcess h1+ case e1 of+ ExitSuccess -> do h2 <- runCommand properties+ e2 <- waitForProcess h2+ exitWith e2+ _ -> exitFailure++-- h <- runCommand runPropertiesCmd+-- e <- waitForProcess h+-- exitWith e++ else putStrLn "There is no need to run the test suite."+ where compilePropertiesCmd = + "ghc --make -itests/properties -iexamples -package-conf testInstallation.conf " ++ + "tests/properties/Main.hs -o properties"+ properties = case os of+ Windows _ -> "properties.exe"+ _ -> "./properties"++-- Check if we need to do the tests, This will be true unless an+-- automatic test is done from darcs, in which case we only need+-- to perform the tests if the affected files are ForSyDe.cabal+-- Setup.hs or any file under src/, tests/ or lib/+testNeeded :: IO Bool+testNeeded = do+ mDARCS_FILES <- catch (liftM Just $ getEnv "DARCS_FILES")+ (\_ -> return Nothing)+ case mDARCS_FILES of+ Nothing -> do putStrLn "DARCS_FILES wasn't set by darcs: forcing test."+ return True+ Just multiLine -> (return.checkAffected) multiLine+ where checkAffected str = any affected (lines str) + affected file = let nfile = normalise file in+ nfile `elem` ["Setup.hs", "ForSyDe.cabal"] ||+ firstDir nfile `elem` ["src", "tests", "lib"] + + firstDir filePath = + let sDirName = splitDirectories filePath+ in case sDirName of+ [_] -> ""+ (x:xs) -> x++
+ tests/properties/Main.hs view
@@ -0,0 +1,20 @@+-- Property-testing wrapper module+module Main (main) where+import Test.HUnit+import System.Exit+import System.IO+import VHDLBackend (vhdlBackendTest)+import Shallow (shallowTest)+++main :: IO ()+main = do+ hSetBuffering stdout LineBuffering+ putStrLn "Running ForSyDe's unit test suite"+ runTestCount $ test ["VHDL Backend Test" ~: vhdlBackendTest,+ "Shallow Library Test" ~: shallowTest]+ where runTestCount t = do (c, _) <- myRunTestText t + if errors c /= 0 || failures c /= 0 + then exitFailure + else exitWith ExitSuccess+ myRunTestText = runTestText (PutText (\str _ _ -> putStrLn str) ())
+ tests/properties/Shallow.hs view
@@ -0,0 +1,7 @@+module Shallow (shallowTest) where++import Shallow.SynchronousMoC (synchronousMoCTest)+import Test.HUnit++shallowTest :: Test+shallowTest = test [synchronousMoCTest]
+ tests/properties/Shallow/SynchronousMoC.hs view
@@ -0,0 +1,14 @@+module Shallow.SynchronousMoC (synchronousMoCTest) where++import ForSyDe.Shallow+import Test.HUnit++synchronousMoCTest :: Test+synchronousMoCTest = test [mapSYTest]++mapSYTest :: Test+mapSYTest = "mapSYTest" ~: test $ do putStrLn "Test mapSY"+ expectedOutput @=? + mapSY (+1) (signal [1,2,3])+ where expectedOutput :: Signal Int+ expectedOutput = signal [2,3,4]
+ tests/properties/VHDLBackend.hs view
@@ -0,0 +1,194 @@+{-# LANGUAGE TemplateHaskell #-}+-- VHDL-Backend property testing module+-- ALl the tests are based on asserting that the internal simulation of the system+-- equals the simulation of the generated vhdl code with modelsim+module VHDLBackend (vhdlBackendTest) where+-- import the example-modules+import ALU+import Counter+import ParAddFour+import Multiplexer+import Multiplexer_FSVector+import SeqAddFour+import ButtonEncoder +import ZipTwist+import CarrySelectAdder +import Null+import LFSR++import Control.Monad (liftM, replicateM)+import Data.List (transpose)+import Data.Param.FSVec (vectorTH, reallyUnsafeVector)+import System.Random+import Test.HUnit+import ForSyDe+import Data.Int++vhdlBackendTest :: Test+vhdlBackendTest = test [aluTest, + counterTest,+ parAddFourTest,+ muxTest,+ muxFSVecTest,+ seqAddFourTest,+ buttonEncoderTest,+ zipTwistTest,+ nullTest,+ lfsrTest]++-- systematic test for the ALU+aluTest :: Test+aluTest = "aluTest" ~: outSim <~=?> outVHDL+ where and = $(vectorTH [H,H])+ or = $(vectorTH [H,L])+ add = $(vectorTH [L,H])+ shiftl = $(vectorTH [L,L])+ fourBitCombs = map reallyUnsafeVector (combN 4 [L,H])+ [arg1,arg2] = parCombN 2 fourBitCombs+ l = length arg1+ select = replicate l and +++ replicate l or +++ replicate l add +++ replicate l shiftl+ op1 = arg1 ++ arg1 ++ arg1 ++ arg1+ op2 = arg2 ++ arg2 ++ arg2 ++ arg2+ outSim = simALU select op1 op2+ outVHDL = vhdlTest Nothing aluSys select op1 op2++counterTest :: Test+counterTest = "counterTest" ~: "first 400 outputs" ~: + out400Sim <~=?> out400VHDLSim+ where out400Sim = take 400 simCounter+ out400VHDLSim = vhdlTest (Just 400) counterSys++parAddFourTest :: Test+parAddFourTest = "parAddFourTest" ~: test doTest+ where -- testt the overflows, and 400 different pseudorandom numbers+ lastInt32 :: Num a => a+ lastInt32 = 2147483647+ firstInt32 :: Num a => a+ -- FIXME: this should be -2147483648, but due to bug http://code.google.com/p/forsyde-comp/issues/detail?id=22 it was set to -2147483647+ firstInt32 = -2147483647 + gen400Int32 :: IO [Int32]+ gen400Int32 = do+ let randomInt32 :: IO Int32+ randomInt32 = do+ let getInt32Range :: IO Integer+ getInt32Range = getStdRandom (randomR (firstInt32, lastInt32))+ liftM fromIntegral getInt32Range+ replicateM 400 randomInt32+ doTest :: IO ()+ doTest = do arg1 <- gen400Int32 + arg2 <- gen400Int32+ arg3 <- gen400Int32+ arg4 <- gen400Int32 + arg5 <- gen400Int32 + let sim = simParAddFour (1:(-1):arg1) + -- (firstInt32:lastInt32:arg2)+ -- (lastInt32:firstInt32:arg3)+ arg2+ arg3+ (-1:1:arg4)+ (0:1:arg5)+ simVHDL = vhdlTest Nothing+ parAddFourSys+ (1:(-1):arg1) + -- (firstInt32:lastInt32:arg2)+ -- (lastInt32:firstInt32:arg3)+ arg2+ arg3+ (-1:1:arg4)+ (0:1:arg5)+ resVHDL <- simVHDL+ sim @=? resVHDL +++muxTest :: Test+muxTest = "muxTest" ~: Multiplexer.simMux sel input <~=?> + vhdlTest Nothing Multiplexer.muxSysDef sel input+ where sel = [(L,L),(L,H),(H,L),(H,H)]+ input = [(L,L,L,H),(L,L,H,L),(L,H,L,L),(H,L,L,L)]+ +++muxFSVecTest :: Test+muxFSVecTest = "muxTest" ~: Multiplexer_FSVector.simMux sel input <~=?> + vhdlTest Nothing Multiplexer_FSVector.muxSysDef sel input+ where sel = [$(vectorTH [L,L]),$(vectorTH [L,H]),$(vectorTH [H,L]),$(vectorTH [H,H])]+ input = [$(vectorTH [L,L,L,H]), $(vectorTH [L,L,H,L]), $(vectorTH [L,H,L,L]),+ $(vectorTH [H,L,L,L])]++seqAddFourTest :: Test+seqAddFourTest = "seqAddFourTest" ~: simAddFour input <~=?>+ vhdlTest Nothing addFourSys input+ where input = [-100,-99..100] ++buttonEncoderTest :: Test+buttonEncoderTest = "buttonEncoderTest" ~: simButtonEncoder input <~=?>+ vhdlTest Nothing buttonEncoderSys input+ where input = [(H,L,L,L), (L,H,L,L), (L,L,H,L), (L,L,L,H), (L,L,L,L)]++zipTwistTest :: Test+zipTwistTest = "zipTwistTest" ~: + simZipTwist input1 input2 input3 input4 input5 input6 <~=?> + vhdlTest Nothing zipTwistSys input1 input2 input3 input4 input5 input6+ where input1 = [-100..0]+ input2 = [-10..90]+ input3 = [100..200]+ input4 = [350..450]+ input5 = [-400..(-300)]+ input6 = [-50..50]++nullTest :: Test+-- we don't test quartus here, because it complains about no logic+nullTest = "nullTest" ~: simNull <~=?> writeAndModelsimVHDL Nothing nullSysDef + +lfsrTest :: Test+lfsrTest = "lsfrTest" ~: outSim <~=?> outVHDL+ where take400Tup4 (i1,i2,i3,i4) = (take 400 i1, take 400 i2, take 400 i3,+ take 400 i4)+ outSim = take400Tup4 simlfsr+ outVHDL = vhdlTest (Just 400) lfsrSys++-------------------+-- Helper functions+-------------------+++-- run a vhdl testbench with custom backend options+vhdlTest :: SysFunToIOSimFun sysF simF => Maybe Int -> SysDef sysF -> simF+vhdlTest = writeAndModelsimVHDLOps testVHDLOps++-- testing VHDL options+testVHDLOps :: VHDLOps+testVHDLOps = defaultVHDLOps{execQuartus=Just checkSynthesisQuartus}++-- Compare an IO test with a pure expected result+(<~=?>) :: (Eq a, Show a) => a -> IO a -> Test +expected <~=?> actualM = TestCase $ do a <- actualM+ expected @=? a+++-- | permutation a list+-- Each element of the input list indicates the posibilities of each+-- positional elements in the resulting lists+permut :: [[a]] -> [[a]]+permut [] = []+permut [xs] = map (\x -> [x]) xs+permut (xs:xss) = let res = permut xss+ in concatMap (\e -> map (:e) xs) res++-- | Combinations of 2 elements from a set of values +comb2 :: [a] -> [(a,a)]+comb2 xs = concatMap (\i -> map (\j -> (i,j) ) xs) xs++-- | Parallel combination of N elements+parCombN :: Int -> [a] -> [[a]]+parCombN n xs = transpose $ combN n xs++-- | Combinations os N elements from a set of values+combN :: Int -> [a] -> [[a]]+combN n _ | n <= 0 = []+combN 1 xs = map (\x -> [x]) xs+combN n xs = let res = combN (n-1) xs+ in concatMap (\i -> map (\j -> j:i) xs) res