Initialize hlp22-project

This commit is contained in:
Aadi Desai 2022-02-10 23:15:22 +00:00
commit 6c066b4754
240 changed files with 94824 additions and 0 deletions

1
.env.development Normal file
View file

@ -0,0 +1 @@

245
.gitignore vendored Normal file
View file

@ -0,0 +1,245 @@
# Output folder
app/*.eot
app/*.svg
app/*.woff
app/*.woff2
app/*.ttf
app/main.js*
app/renderer.js*
public/bundle.js*
electron/Content/app/main.js*
electron/Content/app/renderer.js*
# Distribution.
dist/
# Diagrams
*.dprj
# Node
node_modules/
# Ionide
.ionide
# Paket
/.paket/
/paket-files/*
.config/
.vscode/
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Xamarin Studio / monodevelop user-specific
*.userprefs
*.dll.mdb
*.exe.mdb
# Build results
[Dd]ebug/
[Rr]elease/
x64/
[Bb]in/
[Oo]bj/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Other Visual Studio data
.vs/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
#[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.Publish.xml
# Enable nuget.exe in the .nuget folder (though normally executables are not tracked)
!.nuget/NuGet.exe
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
#LightSwitch generated files
GeneratedArtifacts/
_Pvt_Extensions/
ModelManifest.xml
# =========================
# Windows detritus
# =========================
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac desktop service store files
.DS_Store
# ===================================================
# Exclude F# project specific directories and files
# ===================================================
# NuGet Packages Directory
packages/
# Generated documentation folder
docs/output/
# Temp folder used for publishing docs
temp*/
# Test results produced by build
TestResults.xml
TestResult.xml
# Nuget outputs
*.nupkg
release.cmd
release.sh
localpackages/
*.orig
docs/content/license.md
docs/content/release-notes.md
docs/tools/FSharp.Formatting.svclog
.ionide.debug
*.bak
project.lock.json
# Exclude doc generation and logs
docsrc/content/license.md
docsrc/content/release-notes.md
docsrc/tools/FSharp.Formatting.svclog
# FAKE build cache
.fake/
/bin/
/dist/
!/docsrc/tools
!/docsrc/tools/templates
!/docsrc/tools/templates/*
# Fable 3 Output
*.fs.js
*.fs.js.map

5
CountLines.cmd Normal file
View file

@ -0,0 +1,5 @@
@echo on
cls
scc --by-file --large-line-count=2000 --no-large -w --include-ext fs src\renderer\common src\renderer\drawblock src\renderer\ui src\renderer\interface src\renderer\simulator

674
LICENSE Normal file
View file

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

674
LICENSE.md Normal file
View file

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

11
Nuget.Config Normal file
View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- This clears Nuget configuration in the machine to avoid conflicts with Paket -->
<packageSources>
<clear />
<add key="NuGet.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<disabledPackageSources>
<clear />
</disabledPackageSources>
</configuration>

221
README.md Normal file
View file

@ -0,0 +1,221 @@
# Issie - an Interactive Schematic Simulator with Integrated Editor
Issie (Interactive Schematic Simulator with Integrated Editor) is an application for digital circuit design and simulation. It is targeted at students and hobbyists that want to get a grasp of Digital Electronics concepts in a simple and fun way. Issie is designed to be beginner-friendly and guide the users toward their goals via clear error messages and visual clues. Issie is developed and actively used in teaching at Imperial College London.
* If you are just interested in using the application, jump to the [Getting Started](#getting-started) section.
* If you want user documentation and news go to the [web pages](https://tomcl.github.io/issie/).
For more technical info about the project, read on. This documentation is partly based on the excellent [VisUAL2](https://github.com/ImperialCollegeLondon/Visual2) documentation, given the similarity in the technology stack used.
## Introduction
For the Issie website go [here](https://tomcl.github.io/issie/).
The application is mostly written in F#, which gets transpiled to JavaScript via the [Fable](https://fable.io/) compiler. [Electron](https://www.electronjs.org/) is then used to convert the developed web-app to a cross-platform application. [Electron](electronjs.org) provides access to platform-level APIs (such as access to the file system) which would not be available to vanilla browser web-apps.
[Webpack 4](https://webpack.js.org/) is the module bundler responsible for the JavaScript concatenation and automated building process: the electron-webpack build
is automated with the all-in-one electron-webpack package.
The drawing capabilities are provided (now) by a custom schemetic editor library implemented in F# and specialised for digital components.
The choice of F# as main programming language for the app has been dictated by a few factors:
* The success of the [VisUAL2](https://github.com/ImperialCollegeLondon/Visual2), which uses a similar technology stack;
* Strongly typed functional code tends to be easy to maintain and test, as the type-checker massively helps you;
* Imperial College EEE/EIE students learn such language in the 3rd year High-Level-Programming course, hence can maintain the app in the future;
* F# can be used with the powerful [Elmish](https://elmish.github.io/elmish/) framework to develop User Interfaces in a [Functional Reactive Programming](https://en.wikipedia.org/wiki/Functional_reactive_programming) fashion.
## Project Structure
Electron bundles Chromium (View) and node.js (Engine), therefore as in every node.js project, the `package.json` file specifies the (Node) module dependencies.
* dependencies: node libraries that the executable code (and development code) needs
* dev-dependencies: node libraries only needed by development tools
Additionally, the section `"scripts"`:
```
"scripts": {
"compile": "dotnet fable src/main && dotnet fable src/renderer",
"dev": "cd src/main && dotnet fable watch . --run npm run devrenderer",
"devmain": "cd src/main && dotnet fable watch . --run npm run webpackdev",
"devrenderer": "cd src/renderer && dotnet fable watch . --run npm run webpackdev",
"webpackdev": "electron-webpack dev",
"webpack": "electron-webpack",
"dist": "npm run compile && npm run webpack && electron-builder",
}
```
Defines the in-project shortcut commands as a set of `<key> : <value` lines, so that when we use `npm run <stript_key>` it is equivalent to calling `<script_value>`.
For example, in the root of the project, running in the terminal `npm run dev` is equivalent to the command line:
```
cd src/main && dotnet fable watch . --run npm run devrenderer
```
This runs fable 3 to transpile the main process, then (`--run` is an option of fable to run another command) runs script `devrenderer` to transpile to javascript and watch the F# files in the renderer process. After the renderer transpilation is finished
`electron-webpack dev` will be run. This invokes `webpack` to pack and lauch the javascript code, under electron, and also watches for changes in the javascript code, and *hot loads* these on the running application
As result of this, at any time saving an edited F# renderer project file causes (nearly) immediate:
* fable transpile to from F# to javascript file (dependent F# files may also be transpiled)
* webpack hot load of any changed javascript files to the running electron application
The build system depends on a `Fake` file `build.fsx`. Fake is a DSL written in F# that is specialised to automate build tasks. Build.fsx has targets representing build tasks, and normally these are run via `build.cmd` or `build.sh`, instead of using `dotnet fake` directly:
* `build <target>` ==> `dotnet fake build -t <target>`
## Code Structure
The source code consists of two distinct sections transpiled separately to Javascript to make a complete Electron application.
* The electron main process runs the Electron parent process under the desktop native OS, it starts the app process and provides desktop access services to it.
* The electron client (app) process runs under Chromium in a simulated browser environment (isolated from the native OS).
Electron thus allows code written for a browser (HTML + CSS + JavaScript) to be run as a desktop app with the additional capability of desktop filesystem access via communication between the two processes.
Both processes run Javascript under Node.
The `src/Main/Main.fs` source configures electron start-up and is boilerplate. It is transpiled to the root project directory so it can be automatically picked up by Electron.
The remaining app code is arranged in four different sections, each being a separate F# project. This separation allows all the non-web-based code (which can equally be run and tested under .Net) to be run and tested under F# directly in addition to being transpiled and run under Electron.
The project relies on the draw2d JavaScript (node) library, which is extended to support digital electronics components. The extensions are in the `draw2d` sub-folder of the renderer project source files.
The code that turns the F# project source into `renderer.js` is the FABLE compiler followed by the Node Webpack bundler that combines multiple Javascript files into a single `renderer.js`.
The compile process is controlled by the `.fsproj` files (defining the F# source) and `webpack.additions.main.js`, `webpack.additions.renderer.js`
which define how Webpack combines F# outputs for both electron main and electron app processes and where the executable code is put.
This is boilerplate which you do not need to change; normally the F# project files are all that needs to be modified.
## File Structure
### `src` folder
| Subfolder | Description |
|:------------:|:--------------------------------------------------------------------------------------------------:|
| `main/` | Code for the main electron process that sets everything up - not normally changed |
| `Common/` | Provides some common types and utilities used by all other sections, including the WidthInferer |
| `Simulator/` | Contains the logic to analyse and simulate a diagram. |
| `Renderer/` | Contains the UI logic, the wrapper to the JavaScript drawing library and a set of utility function to write/read/parse diagram files. This amd `main` are the only projects that cannot run under .Net, as they contain JavaScript related functionalities. |
### `Tests` folder
Contains numerous tests for the WidthInferer and Simulator. Based on F# Expecto testing library.
### `Static` folder
Contains static files used in the application.
### `Docs` folder
Contains source information copied (or compiled) into the `docs` directory that controls the project
[Github Pages](https://pages.github.com/) website, with url [https://tomcl.github.io/issie/](https://tomcl.github.io/issie/).
## Project versus File in the Issie application
Issie allows the users to create projects and files within those projects. A Issie project is simply a folder named `<project-name>` that contains an empty file named `<project_name>.dprj` (dprj stands for diagram project). The project folder any non-zero number of design files, each named `<component_name>.dgm` (dgm stands for diagram). each deisgn file represents one design sheet of a hierarchical hardware design, sheets can contain, as components, other sheets.
When opening a project, Issie will initially search the given repository for `.dgm` files, parse and load their content, and allow the user to open them in Issie or use them as components in other designs.
## Build Magic
This project uses modern F# / dotnet cross-platform build. The build process does not normally concern a developer, but here is an overview for if it needs to be adjusted.
* Before anything can be built Dotnet & Node.js are manually be (globally) installed. Dotnet includes the `paket` tool which will manage other dotnet-related dependencies. Node.js includes `npm` which will do the same for Node-related dependencies. NB - there are other popular packet managers for Node, e.g. Yarn. They do not mix with npm, so make sure you do not use them. Confusingly, they will sort-of work, but cause install incompatibilities.
* Dotnet dependencies are executable programs or libraries that run under dotnet and are written in C#'. F#, etc.
* Node dependencies are (always) Javascript modules which run under node.
* Initially (the first time `build.cmd` is run) the build tools categorised in `dotnet-tools.json` are installed by `dotnet tool restore`.
* fake (with the F# compiler)
* fable
* Next all the project Dotnet dependencies (`paket.dependencies` for the whole project, selected from by the `paket.references` in each project directory, are loaded by the `paket` packet manager.
* Finally fake runs `build.fsx` (this is platform-independent) which uses `npm` to install all the node (Javascript) dependencies listed in `package.json`. That includes tools like webpack and electron, which run under node, as well as the node libraries that will be used by needed by the running electron app, including electron itself. These are all loaded by the `npm` packet manager.
## Getting Started
If you just want to run the app go to the [releases page](https://github.com/tomcl/issie/releases) and
download and run the latest prebuilt binary for your platform (Windows or Macos). Issie will require in total about 200M of disk space.
* Windows: unzip \*.zip anywhere and double-click the top-level `Issie.exe` application in the unzipped files.
* Macos: Double click the dmg file and run the application inside the folder, or drag and drop this to install.
* The binaries are not signed. You will need to [perform a one-off security bypass](https://www.wikihow.com/Install-Software-from-Unsigned-Developers-on-a-Mac).
###
Issie installs and runs without making system changes - all of its code is inside the directory you download. You can delete this and replace it by a later version of Issie. Each design sheet is stored in a similarly named file under the porject directory. The subdirectory `backup` there contains a large numbers of backup snapshots for design recovery. These are not needed for Issie operation so you can delete them - or even the whole `backup` directory, if you wish.
## Getting Started as Developer
If you want to get started as a developer, follow these steps.
### Development Install Prerequisites
Download and install (if you already have these tools installed just check the version constraints).
* [.Net 6 SDK](https://dotnet.microsoft.com/download/dotnet/5.0). Version >= 6.0
* [Node.js v14](https://nodejs.org/dist/latest-v14.x/). **Version 12 or (preferably) v14 - NOT latest 16**
* Node.js includes the `npm` package manager, so this does not need to be installed separately.
* The lastest LTS version of Node is now v16. That will currently NOT work.
* If you are using a different version of Node for developmnet on oytehr projects, global install
(the default) may interfere with this. You will need to do a more complex local node install.
* (recommended) Visual Studio 2022 which includes F# 6.0
* (recommended) install [hyper.js](https://hyper.is/) to have a good command line interface - anything else you like will do.
### Issie Development
1. Download & unzip the [Issie repo](https://github.com/tomcl/ISSIE), or if contributing clone it locally, or fork it on github and then clone it locally. Make sure you are contributing to the Issie repo - not the Issie parent repo, if cloning (Github desktop gives you this option when you clone).
3. Navigate to the project root directory (which contains this README) in a command-line interpreter. For Windows usage make sure if possible for convenience
that you have a _tabbed_ command-line interpreter that can be started direct from file explorer within a specific directory (by right-clicking on the explorer directory view).
That makes things a lot more pleasant. The new [Windows Terminal](https://github.com/microsoft/terminal) works well.
4. Run `build.cmd` under Windows or `build.sh` under linux or macos. This will download and install all dependencies then launch the application with HMR.
* HMR: the application will automatically recompile and update while running if you save updated source files
* To initialise and reload: `File -> reload page`
* To exit: after you exit the application the auto-compile script will terminate after about 15s
* To recompile the application `npm run dev` or `npm run devfast` (devfast switches off some debugging to make simulation run a lot faster).
* To generate distributable binaries for dev host system `npm run dist`.
* If you have changed node modules use `build dev`. Note that this project uses npm, not yarn. If npm gets stuck use `build cleannode` and try again.
* From time to time run `build killzombies` to terminate orphan node and dotnet processes which accumulate using this dev chain. (Not sure if this is still needed)
#### Development on Macos
In theory the build should work equally well on macos. Practically that is now (10/2021) the case. Having installed the normal prerequisites, and Visual Studio for Mac, which itself has the F# compiler, the one-off setup can be done manually from the various build steps needed:
* git clone to local project directory as normal (with github desktop or command line git - one off)
* dotnet tool restore (build tools - one off)
* dotnet paket install (install dotnet packages one off)
* npm install (install node packages - one off)
* npm run dev (run the dev envt)
One unresolved issue that can occur on Macs is file permission problems. Best practice is for all installation and dev to run under the current (non-admin) user. If any part of the necessary downloaded development files gets written as root then subsequent development commands that modify it will need to be executed using sudo.
```
sudo npm run devfast
```
If possible, try to avoid this, but if necessary it can be done. Probably the better solution is to investigate properly which install steps introduce these root owner files, change the file ownership back to current user with `chown -R <username> <directory>`. Please document any progress made with mac builds (detailing which mac OS) on an issue.
## Reinstalling Compiler and Libraries
To reinstall the build environment (without changing project code) rerun `build.cmd` (Windows) or `build.sh` (Linux and MacOS). You may need first to
run `build killzombies` to remove orphan processes that lock build files.
## Creating binaries
`npm run dist` will generate the correct binaries for your system under `/dist`.
* There is a very rare bug in the code that downloads electron binaries that is sensitive to fast internet access:
going through a VPN makes it go away. It is one-off since the binaries are cached once downloaded. If this hits you
the workaround is to run the build script again using Imperial College VPN. Having downloaded the binaries once
the porblem will go away.
## TODO
* Should Node be upgraded to v14?
* Clean up Paket dependencies

20
RELEASE_NOTES.md Normal file
View file

@ -0,0 +1,20 @@
### v0.5.0 - Issie 1st release
* Change name to Issie - Interative Simulation and Schematic Integrated Editor.
* Mend build system - now HMR works.
* Breaking change - alter size of NOT gates => any old sheet with the NOT gates will crash the software on load.
### v0.4.0 - DECAD 1st release
* Major update to build system.
* Upgrade all packages to latest.
* Mend bug in loading of exact wire and bus positions.
* Change name to DECAD.
### 0.2 - March, 2020
* End of FYP Release
### v0.1-beta
* User feedback release

738
Tests/CanvasStates.fs Normal file
View file

@ -0,0 +1,738 @@
module CanvasStates
open CommonTypes
// Guidelines to create states:
// - draw the diagram you want to test in the actual application, then log its
// state state. Use logStateToFSharp.py to transform the log output into
// a (almost) valid FSharp data structure.
// - write it from scratch. Remember:
// --> each component Id must be unique
// --> each connection Id must be unique
// --> each port Id must be unique
let makeCustomComponent (dep:LoadedComponent) = {
Name = dep.Name
InputLabels = dep.InputLabels
OutputLabels = dep.OutputLabels
}
/// Just a single input node. No conections.
let state1 : CanvasState =
[
{
Id = "input-node0";
Type = Input 1;
Label = "input-node0-label";
InputPorts = [];
OutputPorts = [{
Id = "out-port0";
PortNumber = Some 0;
PortType = PortType.Output;
HostId = "input-node0"
}];
X = 169;
Y = 175
H=50;
W=40;
}
],
[]
/// State1 loaded as a dependency.
let state1Dependency : LoadedComponent = {
Name = "broken-one-input"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = state1
InputLabels = ["input-node0", 1]
OutputLabels = []
}
/// State1 custom component.
let state1CustomComponent : CustomComponentType =
makeCustomComponent state1Dependency
/// Two unconnected input nodes. No conections.
let state2 : CanvasState =
[
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "input-node0-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "input-node1"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "input-node1-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node1"}]; X = 169; Y = 175}
],
[]
/// Simple circuit with one input connected to one output.
let state3 : CanvasState =
[
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175}
],
[
{ Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
]
/// State3 loaded as a dependency.
let state3Dependency : LoadedComponent = {
Name = "input-output"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = state3
InputLabels = ["input-node0-label", 1]
OutputLabels = ["output-node0-label", 1]
}
/// State3 custom component.
let state3CustomComponent : CustomComponentType =
makeCustomComponent state3Dependency
/// Simple circuit with one input connected to two outputs.
let state4 : CanvasState =
[
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-node0-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{ H=50; W=40; Id = "output-node1"; Type = Output 1; Label = "output-node1-label"; InputPorts = [{Id = "output-node1-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node1"}]; OutputPorts = []; X = 364; Y = 175}
],
[
{ Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node0-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
{ Id = "conn1"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node1-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node1"}; Vertices = []}
]
/// Two inputs connected to the same output.
let state5 : CanvasState =
[
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "input-node0-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "input-node1"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "input-node1-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node1"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175}
],
[
{ Id = "conn0"; Source = {Id = "input-node0-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
{ Id = "conn1"; Source = {Id = "input-node1-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node1"}; Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
]
/// Two inputs; one And; one output.
let state6 : CanvasState =
[
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
{ H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
],
[
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
]
/// Two inputs; one And; one output; with extra connection input to output.
let state7 : CanvasState =
[
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
{ H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
],
[
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
{Id = "conn3"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
]
/// Two inputs; one And; one output; with extra connections inputs to and.
let state8 : CanvasState =
[
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
{ H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
],
[
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
{Id = "conn3"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn4"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
]
/// Mux2 with only two connected ports.
let state9 : CanvasState =
[
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
{ H=50; W=40; Id = "mux"; Type = Mux2; Label = ""; InputPorts = [{Id = "mux-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "mux"}; {Id = "mux-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "mux"}; {Id = "mux-in2"; PortNumber = Some 2; PortType = PortType.Input; HostId = "mux"};]; OutputPorts = [{Id = "mux-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "mux"}]; X = 428; Y = 459}
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
],
[
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "mux-in0"; PortNumber = None; PortType = PortType.Input; HostId = "mux"}; Vertices = []}
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "mux-in1"; PortNumber = None; PortType = PortType.Input; HostId = "mux"}; Vertices = []}
{Id = "conn2"; Source = {Id = "mux-out0"; PortNumber = None; PortType = PortType.Output; HostId = "mux"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
]
/// Complex diagram with 3 Ands; one input; one output and 2 cycles (yet all
/// ports are connected prpoerly).
let state10 : CanvasState =
[
{ H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79}
{ H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86}
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187}
{ H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245}
{ H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261}
],
[
{Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
{Id = "conn1"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
{Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
{Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
{Id = "conn4"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
{Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
{Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
]
/// Complex diagram with 3 Ands; one input; one output and 1 cycles with three
/// components (yet all ports are connected prpoerly).
let state11 : CanvasState =
[
{ H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79}
{ H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86}
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187}
{ H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245}
{ H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261}
],
[
{Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
{Id = "conn1"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
{Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
{Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
{Id = "conn4"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
{Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
{Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
]
/// Complex diagram with 3 Ands; one input; one output and no cycles.
let state12 : CanvasState =
[
{ H=50; W=40; Id = "and0"; Type = And; Label = ""; InputPorts = [{Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and0"}; {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and0"}]; OutputPorts = [{Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and0"}]; X = 392; Y = 79}
{ H=50; W=40; Id = "and1"; Type = And; Label = ""; InputPorts = [{Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and1"}; {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and1"}]; OutputPorts = [{Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and1"}]; X = 593; Y = 86}
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output"; InputPorts = [{Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 770; Y = 187}
{ H=50; W=40; Id = "input"; Type = Input 1; Label = "input"; InputPorts = []; OutputPorts = [{Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input"}]; X = 492; Y = 245}
{ H=50; W=40; Id = "and2"; Type = And; Label = ""; InputPorts = [{Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and2"}; {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and2"}]; OutputPorts = [{Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and2"}]; X = 268; Y = 261}
],
[
{Id = "conn0"; Source = {Id = "41d15996-0838-6a41-e974-ee330fd13607"; PortNumber = None; PortType = PortType.Output; HostId = "and1"}; Target = {Id = "25886b76-feee-6892-6637-cc2378fe6094"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
{Id = "conn1"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "5c4d25e1-c067-79d3-adc7-7e141f5a7905"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
{Id = "conn2"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "9697ec8d-b6d3-9f2a-aaaf-0907fd087e05"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
{Id = "conn3"; Source = {Id = "edb944e4-1fe8-e9e2-eaf2-e5278277b29d"; PortNumber = None; PortType = PortType.Output; HostId = "and0"}; Target = {Id = "23f32198-bf52-0456-6be2-1fbe92b36bbf"; PortNumber = None; PortType = PortType.Input; HostId = "and1"}; Vertices = []}
{Id = "conn4"; Source = {Id = "14344e8e-9448-4933-9004-85756859c64d"; PortNumber = None; PortType = PortType.Output; HostId = "input"}; Target = {Id = "aefefef8-61ea-a3cf-49f9-11b858342504"; PortNumber = None; PortType = PortType.Input; HostId = "and2"}; Vertices = []}
{Id = "conn5"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "8e8b684e-664f-5758-15c9-79c84c8fc81a"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
{Id = "conn6"; Source = {Id = "26de501f-4e60-9f61-fce0-6e5fdb131f87"; PortNumber = None; PortType = PortType.Output; HostId = "and2"}; Target = {Id = "d9b40581-2587-506d-1868-8201d3802913"; PortNumber = None; PortType = PortType.Input; HostId = "and0"}; Vertices = []}
]
/// One bit adder.
let state13 : CanvasState =
[
{ H=50; W=40; Id="2953603d-44e4-5c1f-3fb1-698f7863b6b5";Type=Input 1;Label="A";InputPorts=[];OutputPorts=[{Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber= Some 0;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"}];X=97;Y=111}
{ H=50; W=40; Id="170e69f4-b3d7-d9e0-9f1d-6a564ba62062";Type=Input 1;Label="B";InputPorts=[];OutputPorts=[{Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber= Some 0;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"}];X=54;Y=203}
{ H=50; W=40; Id="253e21f0-b062-4858-c315-5a5315cadf45";Type=And;Label="";InputPorts=[{Id="1b2c73d1-b38e-64e6-5b19-e4e7f690a692";PortNumber= Some 0;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; {Id="9fdb22f6-f8eb-829f-68b3-87b9c8577299";PortNumber= Some 1;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}];OutputPorts=[{Id="95a03834-e494-92b2-b8d4-a148e3c0763b";PortNumber= Some 0;PortType=PortType.Output;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}];X=498;Y=208}
{ H=50; W=40; Id="6b7bac71-eec5-4979-834a-c1bfe40d77b9";Type=Xor;Label="";InputPorts=[{Id="6a468f2c-4db4-d3ae-402f-a617885884e7";PortNumber= Some 0;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; {Id="9826a9b5-cd62-51ec-6368-93c4967745f9";PortNumber= Some 1;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}];OutputPorts=[{Id="7cb01ee2-49d4-00b5-7523-14e4de3c5489";PortNumber= Some 0;PortType=PortType.Output;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}];X=501;Y=108}
{ H=50; W=40; Id="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9";Type=Output 1;Label="Sum";InputPorts=[{Id="14b23a60-21ae-374f-d083-41aa2510eeab";PortNumber= Some 0;PortType=PortType.Input;HostId="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9"}];OutputPorts=[];X=691;Y=122}
{ H=50; W=40; Id="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34";Type=Output 1;Label="Carry";InputPorts=[{Id="b9d457f7-dcef-89a1-aa76-b9ba7f9ca3f4";PortNumber= Some 0;PortType=PortType.Input;HostId="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34"}];OutputPorts=[];X=692;Y=223}
],
[
{Id="79df6e40-7ad2-b1d2-cb98-ea5d649ef1cc";Source={Id="7cb01ee2-49d4-00b5-7523-14e4de3c5489";PortNumber=None;PortType=PortType.Output;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"};Target={Id="14b23a60-21ae-374f-d083-41aa2510eeab";PortNumber=None;PortType=PortType.Input;HostId="9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9"}; Vertices = []}
{Id="6b066c26-750b-6eb3-2516-bc122899f846";Source={Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber=None;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"};Target={Id="9fdb22f6-f8eb-829f-68b3-87b9c8577299";PortNumber=None;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; Vertices = []}
{Id="5f7c6896-8fbd-bfaf-ee0f-a677f7804283";Source={Id="1ee439f3-8d23-c049-ff9e-cd8f1b4d3d9d";PortNumber=None;PortType=PortType.Output;HostId="170e69f4-b3d7-d9e0-9f1d-6a564ba62062"};Target={Id="9826a9b5-cd62-51ec-6368-93c4967745f9";PortNumber=None;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; Vertices = []}
{Id="8ed22d89-b542-a182-fef9-1a67170da60e";Source={Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber=None;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"};Target={Id="1b2c73d1-b38e-64e6-5b19-e4e7f690a692";PortNumber=None;PortType=PortType.Input;HostId="253e21f0-b062-4858-c315-5a5315cadf45"}; Vertices = []}
{Id="0cd3f109-22ee-3543-7247-db2b4ffe5fc8";Source={Id="336aab97-a7bd-9a37-9062-56753b57c268";PortNumber=None;PortType=PortType.Output;HostId="2953603d-44e4-5c1f-3fb1-698f7863b6b5"};Target={Id="6a468f2c-4db4-d3ae-402f-a617885884e7";PortNumber=None;PortType=PortType.Input;HostId="6b7bac71-eec5-4979-834a-c1bfe40d77b9"}; Vertices = []}
{Id="3230b338-cdd4-7632-e441-9d2f50df013a";Source={Id="95a03834-e494-92b2-b8d4-a148e3c0763b";PortNumber=None;PortType=PortType.Output;HostId="253e21f0-b062-4858-c315-5a5315cadf45"};Target={Id="b9d457f7-dcef-89a1-aa76-b9ba7f9ca3f4";PortNumber=None;PortType=PortType.Input;HostId="94da6dd7-a263-a3ec-ec76-bfa07b0b0f34"}; Vertices = []}
]
/// Similar to state4, but output nodes have the same label.
let state14 : CanvasState =
[
{ H=50; W=40; Id = "input-node0"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "output-node0"; Type = Output 1; Label = "output-duplicate-label"; InputPorts = [{Id = "output-node0-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{ H=50; W=40; Id = "output-node1"; Type = Output 1; Label = "output-duplicate-label"; InputPorts = [{Id = "output-node1-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output-node1"}]; OutputPorts = []; X = 364; Y = 175}
],
[
{Id = "conn0"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node0-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node0"}; Vertices = []}
{Id = "conn1"; Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "input-node0"}; Target = {Id = "output-node1-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "output-node1"}; Vertices = []}
]
/// Similar to state6, but input nodes have the same label.
let state15 : CanvasState =
[
{ H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-duplicate-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
{ H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-duplicate-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
{ H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
{ H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
],
[
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
]
/// One input and one output, connected to the state3CustomComponent.
let state16 : CanvasState =
[
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "outer-output-node0-label"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{
H=50; W=40; Id = "inp-out-component"; Type = Custom state3CustomComponent; Label = "inp-out-component-label";
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
X = 169; Y = 175
}
],
[
{
Id = "conn0";
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
Vertices = []
}
{
Id = "conn1";
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
Vertices = []
}
]
/// State16 loaded as a dependency.
let state16Dependency : LoadedComponent = {
Name = "nested-input-output"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = state16
InputLabels = ["outer-input-node0-label", 1]
OutputLabels = ["outer-output-node0-label", 1]
}
/// State16 custom component.
let state16CustomComponent : CustomComponentType =
makeCustomComponent state16Dependency
/// One input and one output, connected to the state16CustomComponent, which
/// contains the state3CustomComponent.
let state17 : CanvasState =
[
{ H=50; W=40; Id = "outer-outer-input-node0"; Type = Input 1; Label = "outer-outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "outer-outer-output-node0"; Type = Output 1; Label = "outer-outer-output-node0-label"; InputPorts = [{Id = "outer-outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{
H=50; W=40; Id = "wrapped-inp-out-component"; Type = Custom state3CustomComponent; Label = "wrapped-inp-out-component-label";
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "wrapped-inp-out-component"}];
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "wrapped-inp-out-component"}];
X = 169; Y = 175
}
],
[
{
Id = "conn0";
Source = {Id = "outer-outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-outer-input-node0"};
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "wrapped-inp-out-component"};
Vertices = []
}
{
Id = "conn1";
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "wrapped-inp-out-component"};
Target = {Id = "outer-outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-outer-output-node0"};
Vertices = []
}
]
/// State17 loaded as a dependency.
let state17Dependency : LoadedComponent = {
Name = "doubly-nested-input-output"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = state17
InputLabels = ["outer-outer-input-node0-label", 1]
OutputLabels = ["outer-outer-output-node0-label", 1]
}
/// State17 custom component.
let state17CustomComponent : CustomComponentType =
makeCustomComponent state17Dependency
/// One input and one output, connected to the state17CustomComponent, which
/// contains state16CustomComponent, which contains the state3CustomComponent.
let state18 : CanvasState =
[
{ H=50; W=40; Id = "outer-outer-outer-input-node0"; Type = Input 1; Label = "outer-outer-outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-outer-outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-outer-outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "outer-outer-outer-output-node0"; Type = Output 1; Label = "outer-outer-outer-output-node0-label"; InputPorts = [{Id = "outer-outer-outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-outer-outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{
H=50; W=40; Id = "doubly-wrapped-inp-out-component"; Type = Custom state3CustomComponent; Label = "doubly-wrapped-inp-out-component-label";
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "doubly-wrapped-inp-out-component"}];
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "doubly-wrapped-inp-out-component"}];
X = 169; Y = 175
}
],
[
{
Id = "conn0";
Source = {Id = "outer-outer-outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-outer-outer-input-node0"};
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "doubly-wrapped-inp-out-component"};
Vertices = []
}
{
Id = "conn1";
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "doubly-wrapped-inp-out-component"};
Target = {Id = "outer-outer-outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-outer-outer-output-node0"};
Vertices = []
}
]
/// One input connected to a broken dependency.
let state19 : CanvasState =
[
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "broken-input"; Type = Custom state1CustomComponent; Label = "broken-input-label"; InputPorts = [{Id = "broken-input-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "broken-input"}]; OutputPorts = []; X = 169; Y = 175}
],
[
{
Id = "conn0"
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"}
Target = {Id = "broken-input-port0"; PortNumber = None; PortType = PortType.Input; HostId = "broken-input"}
Vertices = []
}
]
/// Similar to state16, but uses state16CustomComponent instead of
/// state3CustomComponent to create a cycle.
let state20 : CanvasState =
[
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "outer-input-node0-label"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "outer-output-node0-label"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{
H=50; W=40; Id = "inp-out-component"; Type = Custom state16CustomComponent; Label = "inp-out-component-label";
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
X = 169; Y = 175
}
],
[
{
Id = "conn0";
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
Vertices = []
}
{
Id = "conn1";
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
Vertices = []
}
]
// Test a long dependecy cycle.
// state21 --> state22 --> state23 --> state21
let state21CustomComponent : CustomComponentType = {
Name = "21-custom-component"
InputLabels = ["21-inp", 1]
OutputLabels = ["21-out", 1]
}
let state22CustomComponent : CustomComponentType = {
Name = "22-custom-component"
InputLabels = ["22-inp", 1]
OutputLabels = ["22-out", 1]
}
let state23CustomComponent : CustomComponentType = {
Name = "23-custom-component"
InputLabels = ["23-inp", 1]
OutputLabels = ["23-out", 1]
}
/// Simple input-output component that uses state22.
let state21 : CanvasState =
[
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "21-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "21-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{
H=50; W=40; Id = "inp-out-component"; Type = Custom state22CustomComponent; Label = "inp-out-component-label";
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
X = 169; Y = 175
}
],
[
{
Id = "conn0";
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
Vertices = []
}
{
Id = "conn1";
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
Vertices = []
}
]
/// Simple input-output component that uses state23.
let state22 : CanvasState =
[
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "22-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "22-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{
H=50; W=40; Id = "inp-out-component"; Type = Custom state23CustomComponent; Label = "inp-out-component-label";
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
X = 169; Y = 175
}
],
[
{
Id = "conn0";
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
Vertices = []
}
{
Id = "conn1";
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
Vertices = []
}
]
/// Simple input-output component that uses state21.
let state23 : CanvasState =
[
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "23-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "23-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{
H=50; W=40; Id = "inp-out-component"; Type = Custom state21CustomComponent; Label = "inp-out-component-label";
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
X = 169; Y = 175
}
],
[
{
Id = "conn0";
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
Vertices = []
}
{
Id = "conn1";
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
Vertices = []
}
]
let state21Dependency : LoadedComponent = {
Name = "21-custom-component"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = state21
InputLabels = ["21-inp", 1]
OutputLabels = ["21-out", 1]
}
let state22Dependency : LoadedComponent = {
Name = "22-custom-component"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = state22
InputLabels = ["22-inp", 1]
OutputLabels = ["22-out", 1]
}
let state23Dependency : LoadedComponent = {
Name = "23-custom-component"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = state23
InputLabels = ["23-inp", 1]
OutputLabels = ["23-out", 1]
}
/// Simple input-output component that uses state23.
let state24 : CanvasState =
[
{ H=50; W=40; Id = "outer-input-node0"; Type = Input 1; Label = "24-inp"; InputPorts = []; OutputPorts = [{Id = "outer-out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "outer-input-node0"}]; X = 169; Y = 175}
{ H=50; W=40; Id = "outer-output-node0"; Type = Output 1; Label = "24-out"; InputPorts = [{Id = "outer-inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "outer-output-node0"}]; OutputPorts = []; X = 364; Y = 175}
{
H=50; W=40; Id = "inp-out-component"; Type = Custom state23CustomComponent; Label = "inp-out-component-label";
InputPorts = [{Id = "inp-port0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "inp-out-component"}];
OutputPorts = [{Id = "out-port0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "inp-out-component"}];
X = 169; Y = 175
}
],
[
{
Id = "conn0";
Source = {Id = "outer-out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "outer-input-node0"};
Target = {Id = "inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "inp-out-component"};
Vertices = []
}
{
Id = "conn1";
Source = {Id = "out-port0"; PortNumber = None; PortType = PortType.Output; HostId = "inp-out-component"};
Target = {Id = "outer-inp-port0"; PortNumber = None; PortType = PortType.Input; HostId = "outer-output-node0"};
Vertices = []
}
]
/// Similar to state6, but with a missing connection from bottom input to and.
let state25 : CanvasState =
[
{H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
{H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
{H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
{H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
],
[
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
]
/// Similar to state6, but with a missing connection from and to output.
let state26 : CanvasState =
[
{H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
{H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
{H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
{H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
],
[
{Id = "conn0"; Source = {Id = "top-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "top-input"}; Target = {Id = "and-in0"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
{Id = "conn1"; Source = {Id = "bottom-input-out0"; PortNumber = None; PortType = PortType.Output; HostId = "bottom-input"}; Target = {Id = "and-in1"; PortNumber = None; PortType = PortType.Input; HostId = "and"}; Vertices = []}
]
/// Similar to state6, but with both inputs unconnected.
let state27 : CanvasState =
[
{H=50; W=40; Id = "top-input"; Type = Input 1; Label = "input-node0-label"; InputPorts = []; OutputPorts = [{Id = "top-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "top-input"}]; X = 326; Y = 440}
{H=50; W=40; Id = "bottom-input"; Type = Input 1; Label = "input-node1-label"; InputPorts = []; OutputPorts = [{Id = "bottom-input-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "bottom-input"}]; X = 321; Y = 492}
{H=50; W=40; Id = "and"; Type = And; Label = ""; InputPorts = [{Id = "and-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "and"}; {Id = "and-in1"; PortNumber = Some 1; PortType = PortType.Input; HostId = "and"}]; OutputPorts = [{Id = "and-out0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "and"}]; X = 428; Y = 459}
{H=50; W=40; Id = "output"; Type = Output 1; Label = "output-node0-label"; InputPorts = [{Id = "output-in0"; PortNumber = Some 0; PortType = PortType.Input; HostId = "output"}]; OutputPorts = []; X = 610; Y = 469}
],
[
{Id = "conn2"; Source = {Id = "and-out0"; PortNumber = None; PortType = PortType.Output; HostId = "and"}; Target = {Id = "output-in0"; PortNumber = None; PortType = PortType.Input; HostId = "output"}; Vertices = []}
]
// Half adder.
let halfAdderState : CanvasState =
[
{ H=50; W=40; Id = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"; Type = Input 1; Label = "B"; InputPorts = []; OutputPorts = [{Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = Some 0; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}]; X = 100; Y = 195}
{ H=50; W=40; Id = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"; Type = Input 1; Label = "A"; InputPorts = []; OutputPorts = [{Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = Some 0; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}]; X = 100; Y = 100}
{ H=50; W=40; Id = "7227d00f-d329-af58-b769-0bf42ee6f2ef"; Type = And; Label = ""; InputPorts = [{Id = "49c3e9ab-4ad5-0c6c-cda9-987a820ad1c5"; PortNumber = Some 0; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; {Id = "7d121026-401b-72e5-2051-3497b65d99b3"; PortNumber = Some 1; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}]; OutputPorts = [{Id = "45d7d345-38f8-0933-a86c-16159674e4a0"; PortNumber = Some 0; PortType = PortType.Output; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}]; X = 267; Y = 179}
{ H=50; W=40; Id = "5ea2bff6-ee86-e729-5c14-a52b302af517"; Type = Xor; Label = ""; InputPorts = [{Id = "1e8be0a9-1c87-e877-3e7b-a6335f5ddad4"; PortNumber = Some 0; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; {Id = "77dfc4b4-6616-6768-7c35-8c3c1c26acbd"; PortNumber = Some 1; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}]; OutputPorts = [{Id = "27537cac-d2b0-dd3d-e0ee-a6f27d2e793e"; PortNumber = Some 0; PortType = PortType.Output; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}]; X = 267; Y = 97}
{ H=50; W=40; Id = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"; Type = Output 1; Label = "Sum"; InputPorts = [{Id = "26723054-cb13-f8b2-3a5d-ae8224d532e1"; PortNumber = Some 0; PortType = PortType.Input; HostId = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"}]; OutputPorts = []; X = 420; Y = 107}
{ H=50; W=40; Id = "56dd9000-1a54-8040-3e90-33e44ce390b9"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "617c8ca8-d4b3-182f-b8d1-ce7f4b6a5359"; PortNumber = Some 0; PortType = PortType.Input; HostId = "56dd9000-1a54-8040-3e90-33e44ce390b9"}]; OutputPorts = []; X = 420; Y = 189}
],
[
{Id = "5751a3dc-26e0-2df2-d797-af37b357f7bd"; Source = {Id = "27537cac-d2b0-dd3d-e0ee-a6f27d2e793e"; PortNumber = None; PortType = PortType.Output; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Target = {Id = "26723054-cb13-f8b2-3a5d-ae8224d532e1"; PortNumber = None; PortType = PortType.Input; HostId = "0be5c1d8-c5a8-5fad-6e4b-e74e873ce728"}; Vertices = [307.0,117.0; 420.0,117.0]}
{Id = "4d823d53-2991-68a4-a72b-7c3aec1e6b75"; Source = {Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = None; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}; Target = {Id = "7d121026-401b-72e5-2051-3497b65d99b3"; PortNumber = None; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Vertices = [130.0,205.0; 198.5,205.0; 198.5,205.66666666666666; 267.0,205.66666666666666]}
{Id = "3491b238-ea58-d04a-8d55-78b630507094"; Source = {Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = None; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}; Target = {Id = "49c3e9ab-4ad5-0c6c-cda9-987a820ad1c5"; PortNumber = None; PortType = PortType.Input; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Vertices = [130.0,110.0; 170.5,110.0; 170.5,192.33333333333334; 267.0,192.33333333333334]}
{Id = "9c7f868c-0411-eeaf-eefe-9923ae6a66bd"; Source = {Id = "23fcb523-bd9d-0ca1-cb84-6a37779f2dce"; PortNumber = None; PortType = PortType.Output; HostId = "36c5c713-b731-21d0-c2f9-9e9bf4c79048"}; Target = {Id = "1e8be0a9-1c87-e877-3e7b-a6335f5ddad4"; PortNumber = None; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Vertices = [130.0,110.0; 198.5,110.0; 198.5,110.33333333333333; 267.0,110.33333333333333]}
{Id = "c5c8d60b-712d-b182-aaf1-b902c1eb4b7b"; Source = {Id = "0ca8918f-28b0-0892-4335-3a375c35ef15"; PortNumber = None; PortType = PortType.Output; HostId = "50151b16-a5e1-76ca-93d2-c4446a6a6c60"}; Target = {Id = "77dfc4b4-6616-6768-7c35-8c3c1c26acbd"; PortNumber = None; PortType = PortType.Input; HostId = "5ea2bff6-ee86-e729-5c14-a52b302af517"}; Vertices = [130.0,205.0; 198.5,205.0; 198.5,123.66666666666667; 267.0,123.66666666666667]}
{Id = "712471ca-270a-0410-a9e5-a7894a6c2df4"; Source = {Id = "45d7d345-38f8-0933-a86c-16159674e4a0"; PortNumber = None; PortType = PortType.Output; HostId = "7227d00f-d329-af58-b769-0bf42ee6f2ef"}; Target = {Id = "617c8ca8-d4b3-182f-b8d1-ce7f4b6a5359"; PortNumber = None; PortType = PortType.Input; HostId = "56dd9000-1a54-8040-3e90-33e44ce390b9"}; Vertices = [307.0,199.0; 420.0,199.0]}
]
let halfAdderDependency : LoadedComponent = {
Name = "half-adder"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = halfAdderState
InputLabels = ["A", 1; "B", 1]
OutputLabels = ["Cout", 1; "Sum", 1]
}
let halfAdderCustom : CustomComponentType =
makeCustomComponent halfAdderDependency
// Full adder: uses half adder.
let fullAdderState : CanvasState =
[
{ H=50; W=40; Id = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"; Type = Custom {Name = "half-adder"; InputLabels = ["A", 1; "B", 1]; OutputLabels = ["Cout", 1; "Sum", 1]}; Label = "half-adder"; InputPorts = [{Id = "bab6da29-c4fe-adae-c94b-ada53dc9b948"; PortNumber = Some 0; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; {Id = "6ff179d8-a703-eed2-c948-a214c0aff3a9"; PortNumber = Some 1; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}]; OutputPorts = [{Id = "0b68efeb-91be-da25-c7c5-dfa1b76b105b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; {Id = "60b550b8-37d9-a0b8-c55c-cfc0044ef147"; PortNumber = Some 1; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}]; X = 187; Y = 200}
{ H=50; W=40; Id = "2c610c78-72b7-2816-fec5-a53d2fa54742"; Type = Input 1; Label = "A"; InputPorts = []; OutputPorts = [{Id = "51e83d48-e73b-0961-3ebe-f488e7f89326"; PortNumber = Some 0; PortType = PortType.Output; HostId = "2c610c78-72b7-2816-fec5-a53d2fa54742"}]; X = 95; Y = 171}
{ H=50; W=40; Id = "7e461ed2-53f6-c225-e184-91d24532ef33"; Type = Input 1; Label = "B"; InputPorts = []; OutputPorts = [{Id = "1eaa9bb4-0fa1-4fb3-0792-fe36b5d94886"; PortNumber = Some 0; PortType = PortType.Output; HostId = "7e461ed2-53f6-c225-e184-91d24532ef33"}]; X = 95; Y = 265}
{ H=50; W=40; Id = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"; Type = Custom {Name = "half-adder"; InputLabels = ["A", 1; "B", 1]; OutputLabels = ["Cout", 1; "Sum", 1]}; Label = "half-adder"; InputPorts = [{Id = "15575f10-2ec6-6033-cd3a-3ddabda8dbf3"; PortNumber = Some 0; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; {Id = "7cdb3ebb-cfa1-6892-9d35-de8f15cb87ac"; PortNumber = Some 1; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}]; OutputPorts = [{Id = "093b66de-366d-40fc-a3b5-2c2d396d7fb5"; PortNumber = Some 0; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; {Id = "8cbfb956-5d53-aa0f-2546-ff32426901d1"; PortNumber = Some 1; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}]; X = 323; Y = 108}
{ H=50; W=40; Id = "eddfd0f6-f06d-5190-3af9-540371a13391"; Type = Input 1; Label = "Cin"; InputPorts = []; OutputPorts = [{Id = "042a92cb-f8d7-3cca-7519-a0bae85fdb6b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "eddfd0f6-f06d-5190-3af9-540371a13391"}]; X = 100; Y = 70}
{ H=50; W=40; Id = "d8087733-5924-4af4-e67a-2c9630173608"; Type = Or; Label = ""; InputPorts = [{Id = "f812e552-daab-73d0-cfa0-de0190279c8d"; PortNumber = Some 0; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; {Id = "d25307aa-412f-d108-0f70-335b4e331f52"; PortNumber = Some 1; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}]; OutputPorts = [{Id = "93f988ff-3b92-1904-2dcb-17ec5e88178f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}]; X = 481; Y = 196}
{ H=50; W=40; Id = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "17f9e9e2-3040-65ba-9578-b4ea6a8f8b28"; PortNumber = Some 0; PortType = PortType.Input; HostId = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"}]; OutputPorts = []; X = 567; Y = 206}
{ H=50; W=40; Id = "434a7ce9-942f-0939-94eb-8dd7162ad916"; Type = Output 1; Label = "Sum"; InputPorts = [{Id = "f7ed4610-faf3-e0cb-d985-86f6da5fa148"; PortNumber = Some 0; PortType = PortType.Input; HostId = "434a7ce9-942f-0939-94eb-8dd7162ad916"}]; OutputPorts = []; X = 567; Y = 138}
],
[
{Id = "67479e2e-468f-ebe6-7fa8-fe4e7e25efac"; Source = {Id = "51e83d48-e73b-0961-3ebe-f488e7f89326"; PortNumber = None; PortType = PortType.Output; HostId = "2c610c78-72b7-2816-fec5-a53d2fa54742"}; Target = {Id = "bab6da29-c4fe-adae-c94b-ada53dc9b948"; PortNumber = None; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Vertices = [125.0,181.0; 156.0,181.0; 156.0,220.0; 187.0,220.0]}
{Id = "b658d7c4-7b6a-4c9d-7cbc-19f6b25d3631"; Source = {Id = "1eaa9bb4-0fa1-4fb3-0792-fe36b5d94886"; PortNumber = None; PortType = PortType.Output; HostId = "7e461ed2-53f6-c225-e184-91d24532ef33"}; Target = {Id = "6ff179d8-a703-eed2-c948-a214c0aff3a9"; PortNumber = None; PortType = PortType.Input; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Vertices = [125.0,275.0; 156.0,275.0; 156.0,240.0; 187.0,240.0]}
{Id = "c7cf8ab2-7521-b09c-e4f8-4d09f0913d4f"; Source = {Id = "0b68efeb-91be-da25-c7c5-dfa1b76b105b"; PortNumber = None; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Target = {Id = "d25307aa-412f-d108-0f70-335b4e331f52"; PortNumber = None; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Vertices = [247.0,220.0; 364.0,220.0; 364.0,222.66666666666666; 481.0,222.66666666666666]}
{Id = "3330546c-fe28-33c1-5f7a-fb71ba73249b"; Source = {Id = "093b66de-366d-40fc-a3b5-2c2d396d7fb5"; PortNumber = None; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Target = {Id = "f812e552-daab-73d0-cfa0-de0190279c8d"; PortNumber = None; PortType = PortType.Input; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Vertices = [383.0,128.0; 432.0,128.0; 432.0,209.33333333333334; 481.0,209.33333333333334]}
{Id = "18bf5873-fe65-59d4-9c42-4b578bac5dc6"; Source = {Id = "8cbfb956-5d53-aa0f-2546-ff32426901d1"; PortNumber = None; PortType = PortType.Output; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Target = {Id = "f7ed4610-faf3-e0cb-d985-86f6da5fa148"; PortNumber = None; PortType = PortType.Input; HostId = "434a7ce9-942f-0939-94eb-8dd7162ad916"}; Vertices = [383.0,148.0; 567.0,148.0]}
{Id = "026d76ef-92b3-91ae-6873-e2cc505ccb8d"; Source = {Id = "60b550b8-37d9-a0b8-c55c-cfc0044ef147"; PortNumber = None; PortType = PortType.Output; HostId = "6d47f06e-e8ac-1554-9304-e549a85eb9f3"}; Target = {Id = "7cdb3ebb-cfa1-6892-9d35-de8f15cb87ac"; PortNumber = None; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Vertices = [247.0,240.0; 285.0,240.0; 285.0,148.0; 323.0,148.0]}
{Id = "3c37db26-e552-d5fb-10f5-57227c4ec6f5"; Source = {Id = "93f988ff-3b92-1904-2dcb-17ec5e88178f"; PortNumber = None; PortType = PortType.Output; HostId = "d8087733-5924-4af4-e67a-2c9630173608"}; Target = {Id = "17f9e9e2-3040-65ba-9578-b4ea6a8f8b28"; PortNumber = None; PortType = PortType.Input; HostId = "9bf01350-53a9-bb16-1f02-0df29cb60b0f"}; Vertices = [521.0,216.0; 567.0,216.0]}
{Id = "e1f27e7e-d0ae-e207-db0e-59c9a872255d"; Source = {Id = "042a92cb-f8d7-3cca-7519-a0bae85fdb6b"; PortNumber = None; PortType = PortType.Output; HostId = "eddfd0f6-f06d-5190-3af9-540371a13391"}; Target = {Id = "15575f10-2ec6-6033-cd3a-3ddabda8dbf3"; PortNumber = None; PortType = PortType.Input; HostId = "9aacd9e5-45c1-dfdd-5cc2-f464dd3983ec"}; Vertices = [130.0,80.0; 226.5,80.0; 226.5,128.0; 323.0,128.0]}
]
let fullAdderDependency : LoadedComponent = {
Name = "full-adder"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = fullAdderState
InputLabels = ["Cin", 1; "B", 1; "A", 1]
OutputLabels = ["Sum", 1; "Cout", 1]
}
let fullAdderCustom : CustomComponentType =
makeCustomComponent fullAdderDependency
// 2 bit adder: uses full adder.
let twoBitAdderState : CanvasState =
[
{ H=50; W=40; Id = "57604fee-25b0-9498-06f1-3a065d046515"; Type = Custom {Name = "full-adder"; InputLabels = ["Cin", 1; "B", 1; "A", 1]; OutputLabels = ["Sum", 1; "Cout", 1]}; Label = "full-adder"; InputPorts = [{Id = "6a5725f2-f181-d678-371f-7add822462ea"; PortNumber = Some 0; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "13f98ff8-2e41-2aef-cbc8-1ed636c8c8c7"; PortNumber = Some 1; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "025e36fe-41f2-7f7c-08e2-7b1bb047b798"; PortNumber = Some 2; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}]; OutputPorts = [{Id = "c14929a9-b56c-2414-38e6-6fab3127203f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; {Id = "0cb60845-f6b7-4e88-53bc-18e6c06364ca"; PortNumber = Some 1; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}]; X = 298; Y = 129}
{ H=50; W=40; Id = "b2842635-e4ec-3113-9130-d827d48e2875"; Type = Custom {Name = "full-adder"; InputLabels = ["Cin", 1; "B", 1; "A", 1]; OutputLabels = ["Sum", 1; "Cout", 1]}; Label = "full-adder"; InputPorts = [{Id = "ce42647b-a5db-5fa1-9a94-baaeec7416cd"; PortNumber = Some 0; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "3496a30f-e2bf-2b12-576d-cf28201850ff"; PortNumber = Some 1; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "9c0d3115-bf93-6c1c-b5bb-784cd7ca7896"; PortNumber = Some 2; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}]; OutputPorts = [{Id = "f6da6a43-076e-1171-53de-6bef710bcaf8"; PortNumber = Some 0; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; {Id = "04744361-bbe8-ac74-8643-fae2126ed686"; PortNumber = Some 1; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}]; X = 298; Y = 298}
{ H=50; W=40; Id = "78795182-35c4-1c50-2190-6fc944a2adea"; Type = Input 1; Label = "Zero"; InputPorts = []; OutputPorts = [{Id = "8b0b16ed-3a4e-2ade-6e4b-6285b0d7d2c8"; PortNumber = Some 0; PortType = PortType.Output; HostId = "78795182-35c4-1c50-2190-6fc944a2adea"}]; X = 155; Y = 72}
{ H=50; W=40; Id = "69a6ad2a-af19-369f-0483-0e09e6841da3"; Type = Input 1; Label = "B0"; InputPorts = []; OutputPorts = [{Id = "0b74f567-0740-9667-a7e9-3042aeb7ef8f"; PortNumber = Some 0; PortType = PortType.Output; HostId = "69a6ad2a-af19-369f-0483-0e09e6841da3"}]; X = 83; Y = 150}
{ H=50; W=40; Id = "82a03f0b-ae31-b487-ed1b-335e235adeb7"; Type = Input 1; Label = "A1"; InputPorts = []; OutputPorts = [{Id = "e3b566b6-abf4-1446-7267-37d2ad1deed7"; PortNumber = Some 0; PortType = PortType.Output; HostId = "82a03f0b-ae31-b487-ed1b-335e235adeb7"}]; X = 84; Y = 389}
{ H=50; W=40; Id = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"; Type = Input 1; Label = "B1"; InputPorts = []; OutputPorts = [{Id = "d59e003b-088b-cf84-0f93-83c2235b5942"; PortNumber = Some 0; PortType = PortType.Output; HostId = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"}]; X = 84; Y = 324}
{ H=50; W=40; Id = "86372781-c2f4-09f2-406f-f385ee7a47a9"; Type = Input 1; Label = "A0"; InputPorts = []; OutputPorts = [{Id = "0d00e79c-1a98-3744-be2f-b9eb78a1cf5b"; PortNumber = Some 0; PortType = PortType.Output; HostId = "86372781-c2f4-09f2-406f-f385ee7a47a9"}]; X = 83; Y = 200}
{ H=50; W=40; Id = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"; Type = Output 1; Label = "Sum1"; InputPorts = [{Id = "8dcbc0d6-ab44-c2e2-9e26-90ee31fa2e35"; PortNumber = Some 0; PortType = PortType.Input; HostId = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"}]; OutputPorts = []; X = 514; Y = 321}
{ H=50; W=40; Id = "8f5bded5-f46d-722d-6108-03dda4236c01"; Type = Output 1; Label = "Sum0"; InputPorts = [{Id = "3a537f37-4c6d-3c85-48a7-040d6263bebe"; PortNumber = Some 0; PortType = PortType.Input; HostId = "8f5bded5-f46d-722d-6108-03dda4236c01"}]; OutputPorts = []; X = 514; Y = 150}
{ H=50; W=40; Id = "7d948312-376d-1d4b-cf02-90872026be16"; Type = Output 1; Label = "Cout"; InputPorts = [{Id = "bb868347-969a-38d2-2389-2d4ae7b63ce8"; PortNumber = Some 0; PortType = PortType.Input; HostId = "7d948312-376d-1d4b-cf02-90872026be16"}]; OutputPorts = []; X = 514; Y = 389}
],
[
{Id = "9a089fef-870a-53d8-00a0-e954963ac8e1"; Source = {Id = "0cb60845-f6b7-4e88-53bc-18e6c06364ca"; PortNumber = None; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Target = {Id = "ce42647b-a5db-5fa1-9a94-baaeec7416cd"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [370.0,189.0; 399.0,189.0; 399.0,255.75; 278.0,255.75; 278.0,320.5; 298.0,320.5]}
{Id = "77ab7f29-5375-44b2-d66f-b7c21d412c7f"; Source = {Id = "0b74f567-0740-9667-a7e9-3042aeb7ef8f"; PortNumber = None; PortType = PortType.Output; HostId = "69a6ad2a-af19-369f-0483-0e09e6841da3"}; Target = {Id = "13f98ff8-2e41-2aef-cbc8-1ed636c8c8c7"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [113.0,160.0; 214.5,160.0; 214.5,174.0; 298.0,174.0]}
{Id = "dba98b52-cddf-04d3-648a-fa7b915d4f87"; Source = {Id = "d59e003b-088b-cf84-0f93-83c2235b5942"; PortNumber = None; PortType = PortType.Output; HostId = "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1"}; Target = {Id = "3496a30f-e2bf-2b12-576d-cf28201850ff"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [114.0,334.0; 215.0,334.0; 215.0,343.0; 298.0,343.0]}
{Id = "c7ce0fcc-c122-4ce6-3779-0f548cbfab38"; Source = {Id = "f6da6a43-076e-1171-53de-6bef710bcaf8"; PortNumber = None; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Target = {Id = "8dcbc0d6-ab44-c2e2-9e26-90ee31fa2e35"; PortNumber = None; PortType = PortType.Input; HostId = "dbb1f55a-edf3-bde2-4c69-43a02560e17d"}; Vertices = [370.0,328.0; 446.5,328.0; 446.5,331.0; 514.0,331.0]}
{Id = "abc884ae-3a1a-5a35-6f6f-5695d4898759"; Source = {Id = "04744361-bbe8-ac74-8643-fae2126ed686"; PortNumber = None; PortType = PortType.Output; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Target = {Id = "bb868347-969a-38d2-2389-2d4ae7b63ce8"; PortNumber = None; PortType = PortType.Input; HostId = "7d948312-376d-1d4b-cf02-90872026be16"}; Vertices = [370.0,358.0; 446.5,358.0; 446.5,399.0; 514.0,399.0]}
{Id = "3c7b523c-71d3-9378-176c-7c45cfc516cf"; Source = {Id = "c14929a9-b56c-2414-38e6-6fab3127203f"; PortNumber = None; PortType = PortType.Output; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Target = {Id = "3a537f37-4c6d-3c85-48a7-040d6263bebe"; PortNumber = None; PortType = PortType.Input; HostId = "8f5bded5-f46d-722d-6108-03dda4236c01"}; Vertices = [370.0,159.0; 446.5,159.0; 446.5,160.0; 514.0,160.0]}
{Id = "ccb35ae8-54b6-4072-6680-3cc05bb00f95"; Source = {Id = "0d00e79c-1a98-3744-be2f-b9eb78a1cf5b"; PortNumber = None; PortType = PortType.Output; HostId = "86372781-c2f4-09f2-406f-f385ee7a47a9"}; Target = {Id = "025e36fe-41f2-7f7c-08e2-7b1bb047b798"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [113.0,210.0; 214.5,210.0; 214.5,196.5; 298.0,196.5]}
{Id = "11759cef-e928-32c1-e6ec-b44b198d1a2e"; Source = {Id = "e3b566b6-abf4-1446-7267-37d2ad1deed7"; PortNumber = None; PortType = PortType.Output; HostId = "82a03f0b-ae31-b487-ed1b-335e235adeb7"}; Target = {Id = "9c0d3115-bf93-6c1c-b5bb-784cd7ca7896"; PortNumber = None; PortType = PortType.Input; HostId = "b2842635-e4ec-3113-9130-d827d48e2875"}; Vertices = [114.0,399.0; 215.0,399.0; 215.0,365.5; 298.0,365.5]}
{Id = "2ae1f296-5dfb-986e-2c4c-3e3435d750b9"; Source = {Id = "8b0b16ed-3a4e-2ade-6e4b-6285b0d7d2c8"; PortNumber = None; PortType = PortType.Output; HostId = "78795182-35c4-1c50-2190-6fc944a2adea"}; Target = {Id = "6a5725f2-f181-d678-371f-7add822462ea"; PortNumber = None; PortType = PortType.Input; HostId = "57604fee-25b0-9498-06f1-3a065d046515"}; Vertices = [185.0,82.0; 250.5,82.0; 250.5,151.5; 298.0,151.5]}
]
let twoBitAdderDependency : LoadedComponent = {
Name = "2-bit-adder"
FilePath = ""
TimeStamp = System.DateTime.MinValue
WaveInfo = None
CanvasState = twoBitAdderState
InputLabels = ["A0", 1; "B1", 1; "A1", 1; "B0", 1; "Zero", 1]
OutputLabels = ["Cout", 1; "Sum0", 1; "Sum1", 1]
}
let twoBitAdderCustom : CustomComponentType =
makeCustomComponent twoBitAdderDependency

View file

@ -0,0 +1,69 @@
module CanvasStatesMemories
open CommonTypes
open Helpers
let makeData (lst: int list) =
lst
|> List.indexed
|> List.map (fun (a,d) -> int64 a, int64 d)
|> Map
let mem1 = {
AddressWidth = 2
WordWidth = 4
Data = [0; 1; 4; 15] |> makeData
}
/// Synchronous ROM connected to address and output.
let stateMem1 : CanvasState =
[
{H=50;W=40; Id = "322715aa-a1d4-b314-91c7-670d33bca00a";Type = ROM mem1;Label = "";InputPorts = [{Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = Some 0;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];OutputPorts = [{Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = Some 0;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];X = 252;Y = 240};
{H=50;W=40; Id = "4f65afe9-f03c-2b97-fde9-c657ca32f246";Type = Input 2;Label = "addr";InputPorts = [];OutputPorts = [{Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"}];X = 88;Y = 280};
{H=50;W=40; Id = "fbb5aa79-a471-ac24-4201-56ae39d537c6";Type = Output 4;Label = "data";InputPorts = [{Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"}];OutputPorts = [];X = 467;Y = 280}
],
[
{Id = "b5675376-6921-1909-5838-b43891f88fee";Source = {Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = None;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"};Target = {Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = None;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Vertices = [118.0,290.0; 252.0,290.0]};
{Id = "4720848e-5a2e-7203-d4ac-22f9d9d74af3";Source = {Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = None;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Target = {Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = None;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"};Vertices = [332.0,290.0; 467.0,290.0]}
]
/// Numbers from 0 to 255.
let mem2 = {
AddressWidth = 8
WordWidth = 8
Data = [0..pow2(8)-1] |> makeData
}
/// Synchronous ROM connected to address and output. ROM is big.
let stateMem2 : CanvasState =
[
{H=50;W=40; Id = "322715aa-a1d4-b314-91c7-670d33bca00a";Type = ROM mem2;Label = "";InputPorts = [{Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = Some 0;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];OutputPorts = [{Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = Some 0;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"}];X = 252;Y = 240};
{H=50;W=40; Id = "4f65afe9-f03c-2b97-fde9-c657ca32f246";Type = Input 8;Label = "addr";InputPorts = [];OutputPorts = [{Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"}];X = 88;Y = 280};
{H=50;W=40; Id = "fbb5aa79-a471-ac24-4201-56ae39d537c6";Type = Output 8;Label = "data";InputPorts = [{Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"}];OutputPorts = [];X = 467;Y = 280}
],
[
{Id = "b5675376-6921-1909-5838-b43891f88fee";Source = {Id = "453dbdf9-8a50-792d-c6a9-27396ef5b036";PortNumber = None;PortType = PortType.Output;HostId = "4f65afe9-f03c-2b97-fde9-c657ca32f246"};Target = {Id = "3ff66cbf-7662-f666-2823-6459005239f2";PortNumber = None;PortType = PortType.Input;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Vertices = [118.0,290.0; 252.0,290.0]};
{Id = "4720848e-5a2e-7203-d4ac-22f9d9d74af3";Source = {Id = "81f27eec-4619-cb35-ce9a-ac7149a52da8";PortNumber = None;PortType = PortType.Output;HostId = "322715aa-a1d4-b314-91c7-670d33bca00a"};Target = {Id = "d3339319-afbc-c196-6a23-475704cff3ae";PortNumber = None;PortType = PortType.Input;HostId = "fbb5aa79-a471-ac24-4201-56ae39d537c6"};Vertices = [332.0,290.0; 467.0,290.0]}
]
let mem3 = {
AddressWidth = 3
WordWidth = 4
Data = [0; 0; 0; 0; 0; 0; 0; 0] |> makeData
}
/// Fully connected RAM.
let stateMem3 : CanvasState =
[
{H=50;W=40; Id = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60";Type = RAM mem3;Label = "";InputPorts = [{Id = "83ff4d8a-a28e-ebc8-8311-77def91ca935";PortNumber = Some 0;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}; {Id = "0c116a9b-78cd-79a5-c080-dfdc1445334d";PortNumber = Some 1;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}; {Id = "86e5f7cf-657c-9383-54b3-65c156fdf867";PortNumber = Some 2;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}];OutputPorts = [{Id = "c9e983ab-b832-156a-36fd-9ce1d03810d7";PortNumber = Some 0;PortType = PortType.Output;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"}];X = 318;Y = 190};
{H=50;W=40; Id = "1f9704f9-88fc-124c-3ff8-21c36cfb7328";Type = Output 4;Label = "data-out";InputPorts = [{Id = "0af79035-101f-b683-f39c-68a36a7dc33f";PortNumber = Some 0;PortType = PortType.Input;HostId = "1f9704f9-88fc-124c-3ff8-21c36cfb7328"}];OutputPorts = [];X = 647;Y = 230};
{H=50;W=40; Id = "266d8763-6fbf-37c2-6825-d3487153053b";Type = Input 4;Label = "data-in";InputPorts = [];OutputPorts = [{Id = "b155889c-3d6d-8ebf-2b3b-771f1ada3578";PortNumber = Some 0;PortType = PortType.Output;HostId = "266d8763-6fbf-37c2-6825-d3487153053b"}];X = 116;Y = 230};
{H=50;W=40; Id = "81030fc6-2471-a568-160f-922709edeb2e";Type = Input 3;Label = "addr";InputPorts = [];OutputPorts = [{Id = "ceb4382f-d670-912f-87c2-755315a89c87";PortNumber = Some 0;PortType = PortType.Output;HostId = "81030fc6-2471-a568-160f-922709edeb2e"}];X = 116;Y = 138};
{H=50;W=40; Id = "f0769200-24e3-5c7b-3591-c5c3711d9336";Type = Input 1;Label = "write";InputPorts = [];OutputPorts = [{Id = "b8286beb-9cc1-1128-cc1e-813388ca16fc";PortNumber = Some 0;PortType = PortType.Output;HostId = "f0769200-24e3-5c7b-3591-c5c3711d9336"}];X = 116;Y = 322}
],
[
{Id = "04957b14-81b7-83c0-7669-c9c6fc363e00";Source = {Id = "b155889c-3d6d-8ebf-2b3b-771f1ada3578";PortNumber = None;PortType = PortType.Output;HostId = "266d8763-6fbf-37c2-6825-d3487153053b"};Target = {Id = "0c116a9b-78cd-79a5-c080-dfdc1445334d";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,240.0; 318.0,240.0]};
{Id = "d24c03fd-7b01-e68f-0d6f-8ff153791809";Source = {Id = "c9e983ab-b832-156a-36fd-9ce1d03810d7";PortNumber = None;PortType = PortType.Output;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Target = {Id = "0af79035-101f-b683-f39c-68a36a7dc33f";PortNumber = None;PortType = PortType.Input;HostId = "1f9704f9-88fc-124c-3ff8-21c36cfb7328"};Vertices = [448.0,240.0; 647.0,240.0]};
{Id = "63851c98-6945-0718-29c9-94f738246fd3";Source = {Id = "b8286beb-9cc1-1128-cc1e-813388ca16fc";PortNumber = None;PortType = PortType.Output;HostId = "f0769200-24e3-5c7b-3591-c5c3711d9336"};Target = {Id = "86e5f7cf-657c-9383-54b3-65c156fdf867";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,332.0; 232.0,332.0; 232.0,265.0; 318.0,265.0]};
{Id = "69b302c0-11e5-bb4d-291c-077318321d91";Source = {Id = "ceb4382f-d670-912f-87c2-755315a89c87";PortNumber = None;PortType = PortType.Output;HostId = "81030fc6-2471-a568-160f-922709edeb2e"};Target = {Id = "83ff4d8a-a28e-ebc8-8311-77def91ca935";PortNumber = None;PortType = PortType.Input;HostId = "33d42057-a42d-3fc5-5b6c-a9f31e18bb60"};Vertices = [146.0,148.0; 232.0,148.0; 232.0,215.0; 318.0,215.0]}
]

233
Tests/CanvasStatesSync.fs Normal file
View file

@ -0,0 +1,233 @@
module CanvasStatesSync
open CommonTypes
/// Simple DFF connected to an input and an output.
let stateSync1 : CanvasState =
[
{H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 409;Y = 232};
{H=50; W=40;Id = "6e7a2000-439c-108e-df6d-93cff7a41266";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "62496e2e-fa0d-3e2b-46f2-9ee99a141de6";PortNumber = Some 0;PortType = PortType.Output;HostId = "6e7a2000-439c-108e-df6d-93cff7a41266"}];X = 171;Y = 247};
{H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 671;Y = 247}
],
[
{Id = "fe93a564-b9be-2ce5-61a0-89a57d1f4c30";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [459.0,257.0; 671.0,257.0]};
{Id = "e1da6926-1493-ffb0-c85b-c58b00506cd6";Source = {Id = "62496e2e-fa0d-3e2b-46f2-9ee99a141de6";PortNumber = None;PortType = PortType.Output;HostId = "6e7a2000-439c-108e-df6d-93cff7a41266"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [201.0,257.0; 409.0,257.0]}
]
/// stateSync1 loaded as a dependency.
let stateSync1Dependency : LoadedComponent = {
Name = "single-dff"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = stateSync1
InputLabels = ["in", 1]
OutputLabels = ["out", 1]
}
/// stateSync1 custom component.
let stateSync1CustomComponent : CustomComponentType =
CanvasStates.makeCustomComponent stateSync1Dependency
/// Two DFF connected in series.
let stateSync2 : CanvasState =
[
{H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 351;Y = 185};
{H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 752;Y = 200};
{H=50; W=40;Id = "3739e54a-fd21-bf60-8fc2-a3d10108c947";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = Some 0;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"}];X = 200;Y = 200};
{H=50; W=40;Id = "edda6ee1-8b6f-8f37-8177-4c073299a362";Type = DFF;Label = "";InputPorts = [{Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = Some 0;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];OutputPorts = [{Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = Some 0;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];X = 574;Y = 185}
],
[
{Id = "9e2ded72-08fd-c5d2-5bd7-f191c02f0d4d";Source = {Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = None;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [624.0,210.0; 752.0,210.0]};
{Id = "bc1e6ca7-6f71-697d-c81e-53598fcd5b4e";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = None;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Vertices = [401.0,210.0; 574.0,210.0]};
{Id = "9b5af8de-2de5-3a95-7347-316c3f9cfa8d";Source = {Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = None;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [230.0,210.0; 351.0,210.0]}
]
/// Three DFF connected in series.
let stateSync3 : CanvasState =
[
{H=50; W=40;Id = "067434c0-3bf4-f4c4-551b-1001d73b024f";Type = DFF;Label = "";InputPorts = [{Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = Some 0;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];OutputPorts = [{Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = Some 0;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"}];X = 351;Y = 185};
{H=50; W=40;Id = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd";Type = Output 1;Label = "out";InputPorts = [{Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"}];OutputPorts = [];X = 752;Y = 200};
{H=50; W=40;Id = "3739e54a-fd21-bf60-8fc2-a3d10108c947";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = Some 0;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"}];X = 200;Y = 200};
{H=50; W=40;Id = "edda6ee1-8b6f-8f37-8177-4c073299a362";Type = DFF;Label = "";InputPorts = [{Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = Some 0;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];OutputPorts = [{Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = Some 0;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"}];X = 489;Y = 185};
{H=50; W=40;Id = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650";Type = DFF;Label = "";InputPorts = [{Id = "2e1f0297-f4c6-c266-7dbb-d56fc63e386a";PortNumber = Some 0;PortType = PortType.Input;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"}];OutputPorts = [{Id = "e0df158f-e186-c205-8693-9fa92c62d154";PortNumber = Some 0;PortType = PortType.Output;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"}];X = 613;Y = 185}
],
[
{Id = "9e2ded72-08fd-c5d2-5bd7-f191c02f0d4d";Source = {Id = "272e61d9-786c-f609-274c-9990997892cf";PortNumber = None;PortType = PortType.Output;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Target = {Id = "2e1f0297-f4c6-c266-7dbb-d56fc63e386a";PortNumber = None;PortType = PortType.Input;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"};Vertices = [539.0,210.0; 613.0,210.0]};
{Id = "9b5af8de-2de5-3a95-7347-316c3f9cfa8d";Source = {Id = "5c467246-0f2a-0da7-6e92-9f041d1a9fd8";PortNumber = None;PortType = PortType.Output;HostId = "3739e54a-fd21-bf60-8fc2-a3d10108c947"};Target = {Id = "b595ca8e-027e-0024-2855-1169330c53f4";PortNumber = None;PortType = PortType.Input;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Vertices = [230.0,210.0; 351.0,210.0]};
{Id = "bc1e6ca7-6f71-697d-c81e-53598fcd5b4e";Source = {Id = "547be6ee-118d-5bd6-2b3c-37ed3250302f";PortNumber = None;PortType = PortType.Output;HostId = "067434c0-3bf4-f4c4-551b-1001d73b024f"};Target = {Id = "7888376e-2242-39ac-9299-aef7e30f4465";PortNumber = None;PortType = PortType.Input;HostId = "edda6ee1-8b6f-8f37-8177-4c073299a362"};Vertices = [401.0,210.0; 489.0,210.0]};
{Id = "56b29fa5-a6e0-45d1-d2c0-4d3f4d82d94c";Source = {Id = "e0df158f-e186-c205-8693-9fa92c62d154";PortNumber = None;PortType = PortType.Output;HostId = "36fd5a8f-ca4c-eb7e-e0f4-3b89109ad650"};Target = {Id = "5fd06e1a-90ba-64e8-24bf-d69f190a6b2f";PortNumber = None;PortType = PortType.Input;HostId = "a5d52bcd-0a6d-d123-7313-61d0b8b367fd"};Vertices = [663.0,210.0; 752.0,210.0]}
]
/// StateSync1 custom component followed by a DFF.
let stateSync4 : CanvasState =
[
{H=50; W=40;Id = "03e4c81a-4703-d9f5-dfaf-301de006610f";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "0caf419c-354b-78b8-a12b-e5fa450d4fc0";PortNumber = Some 0;PortType = PortType.Output;HostId = "03e4c81a-4703-d9f5-dfaf-301de006610f"}];X = 100;Y = 100};
{H=50; W=40;Id = "781e7d9d-b18c-d614-dbc0-23bac9e617b7";Type = Output 1;Label = "b";InputPorts = [{Id = "a8e8da74-7bd2-f3a8-9ee5-9e8caa1ee0e5";PortNumber = Some 0;PortType = PortType.Input;HostId = "781e7d9d-b18c-d614-dbc0-23bac9e617b7"}];OutputPorts = [];X = 749;Y = 100};
{H=50; W=40;Id = "547051c6-38f6-27ec-7c33-9c3bbee47e6e";Type = DFF;Label = "";InputPorts = [{Id = "7ec9e434-b066-daf3-3308-0a13a97c8880";PortNumber = Some 0;PortType = PortType.Input;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"}];OutputPorts = [{Id = "252c237c-1323-a291-eccb-f94392a37743";PortNumber = Some 0;PortType = PortType.Output;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"}];X = 500;Y = 85};
{H=50; W=40;Id = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b";Type = Custom stateSync1CustomComponent;Label = "main";InputPorts = [{Id = "4c5a5a1a-e7e3-f53b-8059-0dfd34d796b1";PortNumber = Some 0;PortType = PortType.Input;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"}];OutputPorts = [{Id = "05578981-7a96-a101-b726-df761e234abb";PortNumber = Some 0;PortType = PortType.Output;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"}];X = 285;Y = 95}
],
[
{Id = "75474538-c7cb-de96-9fd2-5f55af7af631";Source = {Id = "0caf419c-354b-78b8-a12b-e5fa450d4fc0";PortNumber = None;PortType = PortType.Output;HostId = "03e4c81a-4703-d9f5-dfaf-301de006610f"};Target = {Id = "4c5a5a1a-e7e3-f53b-8059-0dfd34d796b1";PortNumber = None;PortType = PortType.Input;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"};Vertices = [130.0,110.0; 285.0,110.0]};
{Id = "4c146e97-db61-4848-5073-01c3785d2571";Source = {Id = "252c237c-1323-a291-eccb-f94392a37743";PortNumber = None;PortType = PortType.Output;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"};Target = {Id = "a8e8da74-7bd2-f3a8-9ee5-9e8caa1ee0e5";PortNumber = None;PortType = PortType.Input;HostId = "781e7d9d-b18c-d614-dbc0-23bac9e617b7"};Vertices = [550.0,110.0; 749.0,110.0]};
{Id = "50982a96-2ea6-7db7-2eda-6c38456697c4";Source = {Id = "05578981-7a96-a101-b726-df761e234abb";PortNumber = None;PortType = PortType.Output;HostId = "423bb75b-e791-14f9-ecc2-1ac1c73fc55b"};Target = {Id = "7ec9e434-b066-daf3-3308-0a13a97c8880";PortNumber = None;PortType = PortType.Input;HostId = "547051c6-38f6-27ec-7c33-9c3bbee47e6e"};Vertices = [345.0,110.0; 500.0,110.0]}
]
/// A DFF looping to itself via a Not gate. Two output nodes to probe the wires
/// before and after the Not gate. No inputs.
let stateSync5 : CanvasState =
[
{H=50; W=40;Id = "62a3108e-1198-502b-e338-e677815aead3";Type = Output 1;Label = "out1";InputPorts = [{Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = Some 0;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"}];OutputPorts = [];X = 417;Y = 117};
{H=50; W=40;Id = "fc72c05a-5174-0334-aa74-be3ce27c3657";Type = Not;Label = "";InputPorts = [{Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = Some 0;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];OutputPorts = [{Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = Some 0;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];X = 169;Y = 184};
{H=50; W=40;Id = "023094a0-9787-47ce-26af-03086cdc4b15";Type = Output 1;Label = "out2";InputPorts = [{Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = Some 0;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"}];OutputPorts = [];X = 229;Y = 138};
{H=50; W=40;Id = "1a772449-853d-2171-1e47-fb9783b99556";Type = DFF;Label = "";InputPorts = [{Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];OutputPorts = [{Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = Some 0;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];X = 273;Y = 343}
],
[
{Id = "5f42f1e8-0ccd-24e1-04a2-635d957c991b";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = None;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"};Vertices = [199.0,199.0; 214.0,199.0; 214.0,148.0; 229.0,148.0]};
{Id = "dc4cbb8e-e7a8-a008-97a8-0200f8720a81";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = None;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Vertices = [199.0,199.0; 236.0,199.0; 236.0,368.0; 273.0,368.0]};
{Id = "4810ec6b-a9f9-a562-58cf-82f9071755ad";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = None;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Vertices = [323.0,368.0; 343.0,368.0; 343.0,283.5; 149.0,283.5; 149.0,199.0; 169.0,199.0]};
{Id = "3831ffa7-549f-da3b-ab73-20c72e69b5b8";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = None;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"};Vertices = [323.0,368.0; 370.0,368.0; 370.0,127.0; 417.0,127.0]}
]
/// Similar to stateSync5, but with a stateSync1 custom component instead of a
/// DFF. Loop with a synchronous custom component.
let stateSync6 : CanvasState =
[
{H=50; W=40;Id = "62a3108e-1198-502b-e338-e677815aead3";Type = Output 1;Label = "out1";InputPorts = [{Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = Some 0;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"}];OutputPorts = [];X = 417;Y = 117};
{H=50; W=40;Id = "fc72c05a-5174-0334-aa74-be3ce27c3657";Type = Not;Label = "";InputPorts = [{Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = Some 0;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];OutputPorts = [{Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = Some 0;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"}];X = 169;Y = 184};
{H=50; W=40;Id = "023094a0-9787-47ce-26af-03086cdc4b15";Type = Output 1;Label = "out2";InputPorts = [{Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = Some 0;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"}];OutputPorts = [];X = 229;Y = 138};
{H=50; W=40;Id = "1a772449-853d-2171-1e47-fb9783b99556";Type = Custom stateSync1CustomComponent;Label = "";InputPorts = [{Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];OutputPorts = [{Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = Some 0;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"}];X = 273;Y = 343}
],
[
{Id = "5f42f1e8-0ccd-24e1-04a2-635d957c991b";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "0ed71ded-67ad-cd1b-0ff0-a1e167900051";PortNumber = None;PortType = PortType.Input;HostId = "023094a0-9787-47ce-26af-03086cdc4b15"};Vertices = [199.0,199.0; 214.0,199.0; 214.0,148.0; 229.0,148.0]};
{Id = "dc4cbb8e-e7a8-a008-97a8-0200f8720a81";Source = {Id = "63ca8512-31ee-88e6-9d25-8fdc727d2418";PortNumber = None;PortType = PortType.Output;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Target = {Id = "8b78d961-4203-c0ae-3229-c3a02c42065a";PortNumber = None;PortType = PortType.Input;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Vertices = [199.0,199.0; 236.0,199.0; 236.0,368.0; 273.0,368.0]};
{Id = "4810ec6b-a9f9-a562-58cf-82f9071755ad";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "add99bad-5b00-ab97-4f13-2903a14b2f4e";PortNumber = None;PortType = PortType.Input;HostId = "fc72c05a-5174-0334-aa74-be3ce27c3657"};Vertices = [323.0,368.0; 343.0,368.0; 343.0,283.5; 149.0,283.5; 149.0,199.0; 169.0,199.0]};
{Id = "3831ffa7-549f-da3b-ab73-20c72e69b5b8";Source = {Id = "abd2d9ec-a752-cb9d-b97e-afd7e2eea26d";PortNumber = None;PortType = PortType.Output;HostId = "1a772449-853d-2171-1e47-fb9783b99556"};Target = {Id = "3a7fdd4d-59d0-60cf-9eaf-cd2c7fd16264";PortNumber = None;PortType = PortType.Input;HostId = "62a3108e-1198-502b-e338-e677815aead3"};Vertices = [323.0,368.0; 370.0,368.0; 370.0,127.0; 417.0,127.0]}
]
/// Input connected to two outputs. One of the two paths has a DFF in between.
/// Therefore, A to B-Comb is combinatorial path. A to B-Sync is a synchronous
/// path.
let stateSync7 : CanvasState =
[
{H=50; W=40;Id = "ff10125a-601f-e1d5-e379-7eb7c65eb91f";Type = Input 1;Label = "A";InputPorts = [];OutputPorts = [{Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = Some 0;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"}];X = 150;Y = 150};
{H=50; W=40;Id = "2947473e-2eef-864c-217a-dd5c1daaae44";Type = DFF;Label = "";InputPorts = [{Id = "45a6e6f6-ed52-8de9-2fed-9f7a0bbb86dc";PortNumber = Some 0;PortType = PortType.Input;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"}];OutputPorts = [{Id = "25dc0c5b-e047-090b-5c2a-7ac216d80122";PortNumber = Some 0;PortType = PortType.Output;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"}];X = 230;Y = 210};
{H=50; W=40;Id = "794d5154-6969-3f4e-9c8b-4bc17927c28f";Type = Output 1;Label = "B-Comb";InputPorts = [{Id = "dbdd44c2-14e4-449c-4d69-6dd78af61e2c";PortNumber = Some 0;PortType = PortType.Input;HostId = "794d5154-6969-3f4e-9c8b-4bc17927c28f"}];OutputPorts = [];X = 328;Y = 150};
{H=50; W=40;Id = "95452292-b507-ab43-f082-85152d3e4cf2";Type = Output 1;Label = "B-Sync";InputPorts = [{Id = "05a19e53-570c-f02f-0af2-7ba35c4a4b71";PortNumber = Some 0;PortType = PortType.Input;HostId = "95452292-b507-ab43-f082-85152d3e4cf2"}];OutputPorts = [];X = 328;Y = 225}
],
[
{Id = "79418b3f-7ee3-997a-a433-32a9fbb49f18";Source = {Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = None;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"};Target = {Id = "dbdd44c2-14e4-449c-4d69-6dd78af61e2c";PortNumber = None;PortType = PortType.Input;HostId = "794d5154-6969-3f4e-9c8b-4bc17927c28f"};Vertices = [180.0,160.0; 328.0,160.0]};
{Id = "51efab13-f633-205b-8cd4-c3c858ae25d8";Source = {Id = "32b40ca6-c21f-5b84-ca05-38d88b35b567";PortNumber = None;PortType = PortType.Output;HostId = "ff10125a-601f-e1d5-e379-7eb7c65eb91f"};Target = {Id = "45a6e6f6-ed52-8de9-2fed-9f7a0bbb86dc";PortNumber = None;PortType = PortType.Input;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"};Vertices = [180.0,160.0; 205.0,160.0; 205.0,235.0; 230.0,235.0]};
{Id = "10c6a066-34dd-e0e2-d53d-32c34fcddde6";Source = {Id = "25dc0c5b-e047-090b-5c2a-7ac216d80122";PortNumber = None;PortType = PortType.Output;HostId = "2947473e-2eef-864c-217a-dd5c1daaae44"};Target = {Id = "05a19e53-570c-f02f-0af2-7ba35c4a4b71";PortNumber = None;PortType = PortType.Input;HostId = "95452292-b507-ab43-f082-85152d3e4cf2"};Vertices = [280.0,235.0; 328.0,235.0]}
]
/// stateSync7 loaded as a dependency.
let stateSync7Dependency : LoadedComponent = {
Name = "combinatorial-sync"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = stateSync7
InputLabels = ["A", 1]
OutputLabels = ["B-Comb", 1; "B-Sync", 1]
}
/// stateSync7 custom component.
let stateSync7CustomComponent : CustomComponentType =
CanvasStates.makeCustomComponent stateSync7Dependency
/// stateSync7 Not-ed self looped in the synchronous branch. This is a
/// legitimate synchronous circuit and should pass. It is the same showed in
/// the report for the examples about combinatorial loops detection.
let stateSync8 : CanvasState =
[
{H=50; W=40;Id = "eb5353fd-fac6-3b2a-4de8-8949046671d2";Type = Custom stateSync7CustomComponent;Label = "";InputPorts = [{Id = "04f9c8fe-06c2-b485-e181-73aa36617622";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}];OutputPorts = [{Id = "b9f547be-e285-cb90-1803-b8d3a4c0d351";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}; {Id = "9935af7b-9671-60a2-a76a-f00d3a372d6c";PortNumber = Some 1;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"}];X = 302;Y = 256};
{H=50; W=40;Id = "66030e1a-4a97-244a-f0bb-d9e5fd25627f";Type = Output 1;Label = "B";InputPorts = [{Id = "8bfcfe42-be19-e2fa-42ae-25e929cab003";PortNumber = Some 0;PortType = PortType.Input;HostId = "66030e1a-4a97-244a-f0bb-d9e5fd25627f"}];OutputPorts = [];X = 488;Y = 266};
{H=50; W=40;Id = "825b172a-9355-8bf1-10fc-b18f06d4e76b";Type = Not;Label = "";InputPorts = [{Id = "69688e66-1a74-e959-f58a-6085a5ae5c57";PortNumber = Some 0;PortType = PortType.Input;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"}];OutputPorts = [{Id = "7f763373-0473-16b8-75da-f80541b220ec";PortNumber = Some 0;PortType = PortType.Output;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"}];X = 536;Y = 281}
],
[
{Id = "c1ba620c-e715-5f47-d05b-1a6937750f13";Source = {Id = "7f763373-0473-16b8-75da-f80541b220ec";PortNumber = None;PortType = PortType.Output;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"};Target = {Id = "04f9c8fe-06c2-b485-e181-73aa36617622";PortNumber = None;PortType = PortType.Input;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Vertices = [566.0,296.0; 586.0,296.0; 586.0,395.0; 282.0,395.0; 282.0,286.0; 302.0,286.0]};
{Id = "b1a62f29-11d6-957d-da22-f780a247ad24";Source = {Id = "9935af7b-9671-60a2-a76a-f00d3a372d6c";PortNumber = None;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Target = {Id = "69688e66-1a74-e959-f58a-6085a5ae5c57";PortNumber = None;PortType = PortType.Input;HostId = "825b172a-9355-8bf1-10fc-b18f06d4e76b"};Vertices = [374.0,296.0; 536.0,296.0]};
{Id = "ee6ffc42-4a79-edff-3eb2-7008eec7a649";Source = {Id = "b9f547be-e285-cb90-1803-b8d3a4c0d351";PortNumber = None;PortType = PortType.Output;HostId = "eb5353fd-fac6-3b2a-4de8-8949046671d2"};Target = {Id = "8bfcfe42-be19-e2fa-42ae-25e929cab003";PortNumber = None;PortType = PortType.Input;HostId = "66030e1a-4a97-244a-f0bb-d9e5fd25627f"};Vertices = [374.0,276.0; 488.0,276.0]}
]
/// stateSync8 loaded as a dependency.
let stateSync8Dependency : LoadedComponent = {
Name = "fake-combinatorial-loop"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = stateSync8
InputLabels = []
OutputLabels = ["B", 1;]
}
/// stateSync8 custom component.
let stateSync8CustomComponent : CustomComponentType =
CanvasStates.makeCustomComponent stateSync8Dependency
/// StateSync8 connected to an output. Legitmate ciruit that behaves precisely
/// like stateSync8.
let stateSync9 : CanvasState =
[
{H=50; W=40;Id = "16e7b03d-6504-a148-e207-ce99634ee5c5";Type = Custom stateSync8CustomComponent;Label = "loop2";InputPorts = [];OutputPorts = [{Id = "1db2fde2-c823-9ac8-1b7f-5187166934e9";PortNumber = Some 0;PortType = PortType.Output;HostId = "16e7b03d-6504-a148-e207-ce99634ee5c5"}];X = 568;Y = 310};
{H=50; W=40;Id = "a100bada-b27f-15ca-accb-153e717a31f1";Type = Output 1;Label = "B";InputPorts = [{Id = "b2c8d4ef-bb50-3b2b-259b-e6381ca798a4";PortNumber = Some 0;PortType = PortType.Input;HostId = "a100bada-b27f-15ca-accb-153e717a31f1"}];OutputPorts = [];X = 715;Y = 315}
],
[
{Id = "2b617de7-dfcc-0287-1d9e-0f6a3b40de5b";Source = {Id = "1db2fde2-c823-9ac8-1b7f-5187166934e9";PortNumber = None;PortType = PortType.Output;HostId = "16e7b03d-6504-a148-e207-ce99634ee5c5"};Target = {Id = "b2c8d4ef-bb50-3b2b-259b-e6381ca798a4";PortNumber = None;PortType = PortType.Input;HostId = "a100bada-b27f-15ca-accb-153e717a31f1"};Vertices = [618.0,325.0; 715.0,325.0]}
]
/// A fully connected DFFE.
let stateSync10 : CanvasState =
[
{H=50; W=40;Id = "5916f1cf-408e-4186-a839-c80926bfddf0";Type = Input 1;Label = "in";InputPorts = [];OutputPorts = [{Id = "e894fb40-804a-36d1-b2e8-6033afb61dfa";PortNumber = Some 0;PortType = PortType.Output;HostId = "5916f1cf-408e-4186-a839-c80926bfddf0"}];X = 109;Y = 95};
{H=50; W=40;Id = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf";Type = DFFE;Label = "";InputPorts = [{Id = "c766cb8d-a762-04b9-f021-4a9175fdbc01";PortNumber = Some 0;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}; {Id = "2b80cebe-c0af-4905-d443-fd99796ec8df";PortNumber = Some 1;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}];OutputPorts = [{Id = "ecee9ad7-925f-c0b9-26d5-4cf8b96a9be1";PortNumber = Some 0;PortType = PortType.Output;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"}];X = 273;Y = 80};
{H=50; W=40;Id = "cab54371-5e07-9586-eb9b-be8cc417e610";Type = Input 1;Label = "en";InputPorts = [];OutputPorts = [{Id = "4c83ef6d-7267-2732-d828-c508fff7f889";PortNumber = Some 0;PortType = PortType.Output;HostId = "cab54371-5e07-9586-eb9b-be8cc417e610"}];X = 109;Y = 270};
{H=50; W=40;Id = "a2c874bb-eaeb-d62d-8a72-5eeae48db694";Type = Output 1;Label = "out";InputPorts = [{Id = "df5f625f-43c4-28bb-c931-eae047edaa14";PortNumber = Some 0;PortType = PortType.Input;HostId = "a2c874bb-eaeb-d62d-8a72-5eeae48db694"}];OutputPorts = [];X = 495;Y = 95}
],
[
{Id = "7ab86f0a-1b2c-7901-0a12-cbe447f1f06d";Source = {Id = "e894fb40-804a-36d1-b2e8-6033afb61dfa";PortNumber = None;PortType = PortType.Output;HostId = "5916f1cf-408e-4186-a839-c80926bfddf0"};Target = {Id = "c766cb8d-a762-04b9-f021-4a9175fdbc01";PortNumber = None;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Vertices = [139.0,105.0; 273.0,105.0]};
{Id = "04bb7d64-1899-a4f3-6c50-f53ccd84cd49";Source = {Id = "ecee9ad7-925f-c0b9-26d5-4cf8b96a9be1";PortNumber = None;PortType = PortType.Output;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Target = {Id = "df5f625f-43c4-28bb-c931-eae047edaa14";PortNumber = None;PortType = PortType.Input;HostId = "a2c874bb-eaeb-d62d-8a72-5eeae48db694"};Vertices = [353.0,105.0; 495.0,105.0]};
{Id = "de4f03d1-580c-eabb-7439-38b664b89aba";Source = {Id = "4c83ef6d-7267-2732-d828-c508fff7f889";PortNumber = None;PortType = PortType.Output;HostId = "cab54371-5e07-9586-eb9b-be8cc417e610"};Target = {Id = "2b80cebe-c0af-4905-d443-fd99796ec8df";PortNumber = None;PortType = PortType.Input;HostId = "4f90dab4-e43d-3c75-cd2e-27a5ef66ccaf"};Vertices = [139.0,280.938; 313.0,280.938; 313.0,130.0]}
]
/// stateSync7 Not-ed self looped in the combinatorial branch. This is NOT a
/// legitimate circuit, has combinatorial cycle. Similar to stateSync8 but loops
/// with the other output of the custom component.
let stateSync11 : CanvasState =
[
{H=50; W=40;Id = "c9d9659a-4476-de3a-a838-eeab15496c99";Type = Custom stateSync7CustomComponent;Label = "loop1";InputPorts = [{Id = "c52782db-1ac3-f0d5-28ca-02c8410eb78d";PortNumber = Some 0;PortType = PortType.Input;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}];OutputPorts = [{Id = "eda8e4f2-f21b-12fc-b209-ad315b99a851";PortNumber = Some 0;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}; {Id = "627b5ddf-e4ef-5629-70d4-af674cf37b96";PortNumber = Some 1;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"}];X = 508;Y = 245};
{H=50; W=40;Id = "5c24921a-88e9-7bc2-ee89-97fefb694902";Type = Not;Label = "";InputPorts = [{Id = "e16cf7e3-d01f-29e5-8d0d-921194f2f909";PortNumber = Some 0;PortType = PortType.Input;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"}];OutputPorts = [{Id = "50f7aed7-49de-5472-defa-cbf07c2c4f56";PortNumber = Some 0;PortType = PortType.Output;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"}];X = 664;Y = 245};
{H=50; W=40;Id = "68bfdbd5-b91f-9f34-0a32-2f8730856d49";Type = Output 1;Label = "B-Sync";InputPorts = [{Id = "ce17f39f-f79e-d9c5-78dd-379d4be0d3a4";PortNumber = Some 0;PortType = PortType.Input;HostId = "68bfdbd5-b91f-9f34-0a32-2f8730856d49"}];OutputPorts = [];X = 701;Y = 273}
],
[
{Id = "24e0a9c6-5a3a-e5e9-5034-0f831dcbe0f9";Source = {Id = "627b5ddf-e4ef-5629-70d4-af674cf37b96";PortNumber = None;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Target = {Id = "ce17f39f-f79e-d9c5-78dd-379d4be0d3a4";PortNumber = None;PortType = PortType.Input;HostId = "68bfdbd5-b91f-9f34-0a32-2f8730856d49"};Vertices = [580.0,285.0; 640.5,285.0; 640.5,283.0; 701.0,283.0]};
{Id = "bc1f9a51-5ca8-1aa0-b4bd-b86bc9646c20";Source = {Id = "eda8e4f2-f21b-12fc-b209-ad315b99a851";PortNumber = None;PortType = PortType.Output;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Target = {Id = "e16cf7e3-d01f-29e5-8d0d-921194f2f909";PortNumber = None;PortType = PortType.Input;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"};Vertices = [580.0,265.0; 622.0,265.0; 622.0,260.0; 664.0,260.0]};
{Id = "cc7a9da2-f78a-f3e1-1c2f-7323f2b43d15";Source = {Id = "50f7aed7-49de-5472-defa-cbf07c2c4f56";PortNumber = None;PortType = PortType.Output;HostId = "5c24921a-88e9-7bc2-ee89-97fefb694902"};Target = {Id = "c52782db-1ac3-f0d5-28ca-02c8410eb78d";PortNumber = None;PortType = PortType.Input;HostId = "c9d9659a-4476-de3a-a838-eeab15496c99"};Vertices = [694.0,260.0; 714.0,260.0; 714.0,195.5; 488.0,195.5; 488.0,275.0; 508.0,275.0]}
]
/// stateSync11 loaded as a dependency.
let stateSync11Dependency : LoadedComponent = {
Name = "combinatorial-loop"
TimeStamp = System.DateTime.MinValue
WaveInfo = None
FilePath = ""
CanvasState = stateSync11
InputLabels = []
OutputLabels = ["B-Sync", 1;]
}
/// stateSync11 custom component.
let stateSync11CustomComponent : CustomComponentType =
CanvasStates.makeCustomComponent stateSync11Dependency
/// StateSync11 connected to an output. Should spot cycle in the dependency.
let stateSync12 : CanvasState =
[
{H=50; W=40;Id = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f";Type = Custom stateSync11CustomComponent;Label = "loop2-comb";InputPorts = [];OutputPorts = [{Id = "685a78e3-c891-d0c3-f973-1814b01edd28";PortNumber = Some 0;PortType = PortType.Output;HostId = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f"}];X = 354;Y = 215};
{H=50; W=40;Id = "638304a8-99e8-fe4f-4503-b50c64f45756";Type = Output 1;Label = "B-Comb";InputPorts = [{Id = "3b0171fa-dffe-f4c5-5f8c-e365112bae2f";PortNumber = Some 0;PortType = PortType.Input;HostId = "638304a8-99e8-fe4f-4503-b50c64f45756"}];OutputPorts = [];X = 532;Y = 220}
],
[
{Id = "f7c55a63-955e-6edd-0db6-fe320dc02c02";Source = {Id = "685a78e3-c891-d0c3-f973-1814b01edd28";PortNumber = None;PortType = PortType.Output;HostId = "eab95b08-cf95-15b7-ad8f-4eaffcefff6f"};Target = {Id = "3b0171fa-dffe-f4c5-5f8c-e365112bae2f";PortNumber = None;PortType = PortType.Input;HostId = "638304a8-99e8-fe4f-4503-b50c64f45756"};Vertices = [420.0,230.0; 532.0,230.0]}
]

View file

@ -0,0 +1,278 @@
module CanvasStatesWithBuses
open CommonTypes
open CanvasStates
/// Two inputs connected to a MergeWires component. No other connections.
let stateBus1 : CanvasState =
[
{H=50;W=40; Id = "08de9671-756c-44e0-905c-cde5b9a98aa9";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "528c3ccc-9554-6a5b-129f-c88e55478ae2";PortNumber = Some 0;PortType = PortType.Output;HostId = "08de9671-756c-44e0-905c-cde5b9a98aa9"}];X = 100;Y = 100};
{H=50;W=40; Id = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "9de10edf-96be-beb0-2926-45f98b5dccb2";PortNumber = Some 0;PortType = PortType.Output;HostId = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc"}];X = 100;Y = 169};
{H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138}
],
[
{Id = "conn0";Source = {Id = "528c3ccc-9554-6a5b-129f-c88e55478ae2";PortNumber = None;PortType = PortType.Output;HostId = "08de9671-756c-44e0-905c-cde5b9a98aa9"};Target = {Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [130.0,110.0; 180.0,110.0; 180.0,138.0; 230.0,138.0]};
{Id = "conn1";Source = {Id = "9de10edf-96be-beb0-2926-45f98b5dccb2";PortNumber = None;PortType = PortType.Output;HostId = "0b7b0ae5-dcca-f0af-3ba6-68231fdf80fc"};Target = {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [130.0,179.0; 180.0,179.0; 180.0,158.0; 230.0,158.0]}
]
/// A MergeWires connected to a SplitWire 1.
let stateBus2 : CanvasState =
[
{H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138};
{H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138}
],
[
{Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]}
]
/// A MergeWires connected to a SplitWire 1 and a single-bit output node.
let stateBus3 : CanvasState =
[
{H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138};
{H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138}
{H=50;W=40; Id = "7af6a475-990d-015f-e9e0-4a680cc84173";Type = Output 1;Label = "a";InputPorts = [{Id = "cefbb411-481e-d04d-c5a0-02f3921e423f";PortNumber = Some 0;PortType = PortType.Input;HostId = "7af6a475-990d-015f-e9e0-4a680cc84173"}];OutputPorts = [];X = 346;Y = 63}
],
[
{Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]}
{Id = "conn1";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "cefbb411-481e-d04d-c5a0-02f3921e423f";PortNumber = None;PortType = PortType.Input;HostId = "7af6a475-990d-015f-e9e0-4a680cc84173"};Vertices = [270.0,148.0; 308.0,148.0; 308.0,73.0; 346.0,73.0]}
]
/// Like stateBus2 but with a loop.
let stateBus4 : CanvasState =
[
{H=50;W=40; Id = "8caa65e2-97eb-ed9c-cd34-220b1fde3add";Type = MergeWires;Label = "";InputPorts = [{Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = Some 0;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}; {Id = "0d6f9b2f-d511-c08b-3b72-4c23975adeda";PortNumber = Some 1;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];OutputPorts = [{Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = Some 0;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"}];X = 230;Y = 138};
{H=50;W=40; Id = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2";Type = SplitWire 1;Label = "";InputPorts = [{Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = Some 0;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];OutputPorts = [{Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = Some 0;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}; {Id = "58dc5768-a64d-e6d6-36cc-fecdd57b57d7";PortNumber = Some 1;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"}];X = 336;Y = 138}
],
[
{Id = "conn0";Source = {Id = "f8a73708-ed54-cc87-d4d5-0a72745e82c7";PortNumber = None;PortType = PortType.Output;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Target = {Id = "ba539631-cbee-1c40-e2ad-755e3c4893ab";PortNumber = None;PortType = PortType.Input;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Vertices = [270.0,148.0; 336.0,148.0]}
{Id = "conn1";Source = {Id = "9f93cb8f-ad50-a556-57fb-3f1ec4cbdaba";PortNumber = None;PortType = PortType.Output;HostId = "6060cff2-0e4f-d3ac-a8f2-40557eca62b2"};Target = {Id = "6d525499-76f1-001b-3cca-726c4aa9b2ee";PortNumber = None;PortType = PortType.Input;HostId = "8caa65e2-97eb-ed9c-cd34-220b1fde3add"};Vertices = [376.0,138.0; 396.0,138.0; 396.0,138.0; 210.0,138.0; 210.0,138.0; 230.0,138.0]}
]
/// All the bus components in series, properly connected. No other components.
let stateBus6 : CanvasState =
[
{H=50;W=40; Id = "52a4b421-c919-6177-c66c-ec2a77379373";Type = SplitWire 1;Label = "";InputPorts = [{Id = "07e65ee3-58a7-a5e0-724a-0f56f2e528c5";PortNumber = Some 0;PortType = PortType.Input;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}];OutputPorts = [{Id = "8e27936c-75e6-5ad1-777e-6aa111b2d584";PortNumber = Some 0;PortType = PortType.Output;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}; {Id = "1385e5ca-c8e7-b209-402f-b85c42023bdb";PortNumber = Some 1;PortType = PortType.Output;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"}];X = 614;Y = 258};
{H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248};
{H=50;W=40; Id = "66dd284a-9199-fda1-867b-4e6b837a7ae5";Type = MergeWires;Label = "";InputPorts = [{Id = "2ee75313-e4e3-4ab8-9e36-a5089e49278d";PortNumber = Some 0;PortType = PortType.Input;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}; {Id = "a5d69516-6a23-a363-e86f-2fe2a062e722";PortNumber = Some 1;PortType = PortType.Input;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}];OutputPorts = [{Id = "caf8086a-b657-bc0a-5684-a25556b95845";PortNumber = Some 0;PortType = PortType.Output;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"}];X = 153;Y = 258};
{H=50;W=40; Id = "02e33421-bea8-657b-1e17-6e0df31696d5";Type = SplitWire 2;Label = "";InputPorts = [{Id = "ed9727f2-373b-9f23-9293-dacea5a5476b";PortNumber = Some 0;PortType = PortType.Input;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}];OutputPorts = [{Id = "7beda885-b4f4-f5be-ada5-476643c2cec3";PortNumber = Some 0;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}; {Id = "853f0e05-b301-db44-d437-d50abef0065b";PortNumber = Some 1;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"}];X = 531;Y = 248};
{H=50;W=40; Id = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67";Type = MergeWires;Label = "";InputPorts = [{Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}; {Id = "b26122bb-0ce1-8e3e-1021-a9aec7c4c0ca";PortNumber = Some 1;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];OutputPorts = [{Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];X = 329;Y = 258};
{H=50;W=40; Id = "a7db69d3-5a34-e5d2-46d1-19fe8879b625";Type = SplitWire 1;Label = "";InputPorts = [{Id = "075ab754-bff4-ce21-0384-1f46f1ae986a";PortNumber = Some 0;PortType = PortType.Input;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}];OutputPorts = [{Id = "673c4ac0-9c68-6f3c-dfd4-6b129b956357";PortNumber = Some 0;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}; {Id = "3a314510-a373-0c2c-50c1-ac3ce9d5f4f7";PortNumber = Some 1;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"}];X = 438;Y = 258}
],
[
{Id = "conn0";Source = {Id = "caf8086a-b657-bc0a-5684-a25556b95845";PortNumber = None;PortType = PortType.Output;HostId = "66dd284a-9199-fda1-867b-4e6b837a7ae5"};Target = {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [193.0,268.0; 230.0,268.0; 230.0,268.0; 241.0,268.0]};
{Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = None;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Vertices = [281.0,258.0; 329.0,258.0]}
{Id = "conn2";Source = {Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = None;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Target = {Id = "075ab754-bff4-ce21-0384-1f46f1ae986a";PortNumber = None;PortType = PortType.Input;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"};Vertices = [369.0,268.0; 438.0,268.0]};
{Id = "conn3";Source = {Id = "673c4ac0-9c68-6f3c-dfd4-6b129b956357";PortNumber = None;PortType = PortType.Output;HostId = "a7db69d3-5a34-e5d2-46d1-19fe8879b625"};Target = {Id = "ed9727f2-373b-9f23-9293-dacea5a5476b";PortNumber = None;PortType = PortType.Input;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"};Vertices = [478.0,258.0; 531.0,258.0]};
{Id = "conn4";Source = {Id = "853f0e05-b301-db44-d437-d50abef0065b";PortNumber = None;PortType = PortType.Output;HostId = "02e33421-bea8-657b-1e17-6e0df31696d5"};Target = {Id = "07e65ee3-58a7-a5e0-724a-0f56f2e528c5";PortNumber = None;PortType = PortType.Input;HostId = "52a4b421-c919-6177-c66c-ec2a77379373"};Vertices = [571.0,268.0; 614.0,268.0]};
]
/// Non-inferrable loop: MergeWires connected to MergeWires and loop back.
let stateBus7 : CanvasState =
[
{H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248};
{H=50;W=40; Id = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67";Type = MergeWires;Label = "";InputPorts = [{Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = Some 0;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}; {Id = "b26122bb-0ce1-8e3e-1021-a9aec7c4c0ca";PortNumber = Some 1;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];OutputPorts = [{Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = Some 0;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"}];X = 325;Y = 258}
],
[
{Id = "conn0";Source = {Id = "211fd204-86fe-e959-b4fa-129d1b4accb4";PortNumber = None;PortType = PortType.Output;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Target = {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [365.0,268.0; 385.0,268.0; 385.0,307.0; 221.0,307.0; 221.0,268.0; 241.0,268.0]};
{Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "b87776d8-4588-4dc1-3251-342683ee4ba8";PortNumber = None;PortType = PortType.Input;HostId = "eb13d9a8-162b-3ffc-a1d8-e6666edf7a67"};Vertices = [281.0,258.0; 325.0,258.0]}
]
/// Mux connected to two PushBusFirst. Width not inferrable.
let stateBus8 : CanvasState =
[
{H=50;W=40; Id = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d";Type = MergeWires;Label = "";InputPorts = [{Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = Some 0;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}; {Id = "c8e1b3ee-d1c7-e576-6e8e-eca93bb33fce";PortNumber = Some 1;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];OutputPorts = [{Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = Some 0;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"}];X = 241;Y = 248};
{H=50;W=40; Id = "3875f58b-8744-291d-1f4f-bca5b1a1eda5";Type = Mux2;Label = "mux2";InputPorts = [{Id = "6758d0e5-2618-afe4-473b-43c5002abf74";PortNumber = Some 0;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "401a0856-683d-6ed2-c193-53d1761ad7a4";PortNumber = Some 1;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "cf514335-b50d-eb19-c6f5-18303cda0b13";PortNumber = Some 2;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];OutputPorts = [{Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = Some 0;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];X = 145;Y = 190};
{H=50;W=40; Id = "536f5ede-5b98-ce3f-db3e-e96de247a89b";Type = MergeWires;Label = "";InputPorts = [{Id = "b871e19d-2bec-0cc1-8c71-0fbee278bf51";PortNumber = Some 0;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}; {Id = "69b5caec-1da0-9ecb-d7fc-fbd9af66fc23";PortNumber = Some 1;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}];OutputPorts = [{Id = "6b2d64d3-7697-a97f-ed51-f0991d77b6b9";PortNumber = Some 0;PortType = PortType.Output;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"}];X = 336;Y = 237}
],
[
{Id = "conn0";Source = {Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = None;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"};Target = {Id = "94d62be4-60ae-4e5f-add7-3715341617aa";PortNumber = None;PortType = PortType.Input;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Vertices = [175.0,215.0; 208.0,215.0; 208.0,248.0; 241.0,248.0]};
{Id = "conn1";Source = {Id = "cabe29d9-74ea-06b9-8421-8547090727f9";PortNumber = None;PortType = PortType.Output;HostId = "37dd0853-0d7e-ab38-82e7-4e5d6d43ee9d"};Target = {Id = "69b5caec-1da0-9ecb-d7fc-fbd9af66fc23";PortNumber = None;PortType = PortType.Input;HostId = "536f5ede-5b98-ce3f-db3e-e96de247a89b"};Vertices = [281.0,258.0; 308.5,258.0; 308.5,257.0; 336.0,257.0]}
]
/// And connected to a SplitWire 1.
let stateBus9 : CanvasState =
[
{H=50;W=40; Id = "3875f58b-8744-291d-1f4f-bca5b1a1eda5";Type = And;Label = "and";InputPorts = [{Id = "6758d0e5-2618-afe4-473b-43c5002abf74";PortNumber = Some 0;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}; {Id = "401a0856-683d-6ed2-c193-53d1761ad7a4";PortNumber = Some 1;PortType = PortType.Input;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];OutputPorts = [{Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = Some 0;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"}];X = 145;Y = 190};
{H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 262;Y = 205}
],
[
{Id = "conn0";Source = {Id = "6bf59da3-ea8a-30c3-163d-37dbefd821bc";PortNumber = None;PortType = PortType.Output;HostId = "3875f58b-8744-291d-1f4f-bca5b1a1eda5"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [175.0,215.0; 262.0,215.0]}
]
/// Two inputs, packed into a bus, unpacked into two outputs.
let stateBus10 : CanvasState =
[
{H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 336;Y = 205};
{H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205};
{H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175};
{H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245};
{H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "a-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 449;Y = 178};
{H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"; Type = Output 1; Label = "b-out"; InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538"; PortNumber = Some 0; PortType = PortType.Input; HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}]; OutputPorts = []; X = 443; Y = 234}
],
[
{Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]};
{Id = "78ceafbf-cfb8-4442-a6bb-62ed6a1893cd";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [376.0,225.0; 409.5,225.0; 409.5,244.0; 443.0,244.0]};
{Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [376.0,205.0; 412.5,205.0; 412.5,188.0; 449.0,188.0]};
{Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]};
{Id = "35d2c879-dda4-f719-836f-f6daf9803c85";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [275.0,215.0; 336.0,215.0]}
]
/// Two inputs make a bus2, then Push input a to bus, then try to split into 2 single bits (fail).
let stateBus11 : CanvasState =
[
{H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 410;Y = 200};
{H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205};
{H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175};
{H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245};
{H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "a-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 523;Y = 173};
{H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b";Type = Output 1;Label = "b-out";InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = Some 0;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}];OutputPorts = [];X = 517;Y = 229};
{H=50;W=40; Id = "94efe8d3-413b-9390-b627-be7bc91ae2d1";Type = MergeWires;Label = "";InputPorts = [{Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = Some 0;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}; {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = Some 1;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];OutputPorts = [{Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];X = 317;Y = 196}
],
[
{Id = "conn";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [450.0,220.0; 483.5,220.0; 483.5,239.0; 517.0,239.0]};
{Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [450.0,200.0; 503.0,200.0; 503.0,183.0; 523.0,183.0]};
{Id = "conn1";Source = {Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = None;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [357.0,206.0; 383.5,206.0; 383.5,210.0; 410.0,210.0]};
{Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]};
{Id = "3fd09a23-18c1-0edd-b7cb-a70a4b8d42ef";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [275.0,215.0; 296.0,215.0; 296.0,216.0; 317.0,216.0]};
{Id = "d429c2f2-d60c-0dc9-2279-7022dc127783";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,196.0; 317.0,196.0]};
{Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]}
]
/// Pack 4 bits into a bus, then extract them.
let stateBus12 : CanvasState =
[
{H=50;W=40; Id = "772307ab-2941-3343-28a2-faacaa0efc96";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = Some 0;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];OutputPorts = [{Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = Some 0;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}; {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = Some 1;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"}];X = 627;Y = 205};
{H=50;W=40; Id = "74dcc790-927f-ae61-fd63-577c3387de0e";Type = MergeWires;Label = "";InputPorts = [{Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = Some 0;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}; {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = Some 1;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];OutputPorts = [{Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = Some 0;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"}];X = 235;Y = 205};
{H=50;W=40; Id = "94efe8d3-413b-9390-b627-be7bc91ae2d1";Type = MergeWires;Label = "";InputPorts = [{Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = Some 0;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}; {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = Some 1;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];OutputPorts = [{Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"}];X = 299;Y = 195};
{H=50;W=40; Id = "76de964a-124b-5c16-6de1-6158626344ac";Type = Input 1;Label = "a";InputPorts = [];OutputPorts = [{Id = "9dc8cfaa-c989-276a-6703-11196c5c7974";PortNumber = Some 0;PortType = PortType.Output;HostId = "76de964a-124b-5c16-6de1-6158626344ac"}];X = 110;Y = 111};
{H=50;W=40; Id = "a91be585-2d3b-d872-be0f-b416c8eb03d2";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = Some 0;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"}];X = 110;Y = 175};
{H=50;W=40; Id = "9985ebc6-1cd5-8863-1341-1d543d236d38";Type = Input 1;Label = "c";InputPorts = [];OutputPorts = [{Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = Some 0;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"}];X = 110;Y = 245};
{H=50;W=40; Id = "9824ceb8-e999-8e48-9a56-7a4349e495b1";Type = Input 1;Label = "d";InputPorts = [];OutputPorts = [{Id = "712999dd-e970-51b3-f38f-aee70ff42d2d";PortNumber = Some 0;PortType = PortType.Output;HostId = "9824ceb8-e999-8e48-9a56-7a4349e495b1"}];X = 110;Y = 326};
{H=50;W=40; Id = "c16668ed-ec17-3a14-8a4b-dec6c40335b5";Type = MergeWires;Label = "";InputPorts = [{Id = "38d99b30-a219-c37e-df55-04b7240a599e";PortNumber = Some 0;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}; {Id = "2f0c6067-124f-233b-1077-db88900c31cc";PortNumber = Some 1;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}];OutputPorts = [{Id = "6c5a63af-db72-1ece-495d-7a04c88fd1f0";PortNumber = Some 0;PortType = PortType.Output;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"}];X = 364;Y = 205};
{H=50;W=40; Id = "59b45f9c-192c-98ce-da25-a94db45a5790";Type = Output 1;Label = "a-out";InputPorts = [{Id = "e62e040a-bcd2-58f6-39d5-24548811b784";PortNumber = Some 0;PortType = PortType.Input;HostId = "59b45f9c-192c-98ce-da25-a94db45a5790"}];OutputPorts = [];X = 746;Y = 111};
{H=50;W=40; Id = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a";Type = Output 1;Label = "b-out";InputPorts = [{Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = Some 0;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"}];OutputPorts = [];X = 743;Y = 174};
{H=50;W=40; Id = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b";Type = Output 1;Label = "c-out";InputPorts = [{Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = Some 0;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"}];OutputPorts = [];X = 743;Y = 230};
{H=50;W=40; Id = "214620f0-51f6-59fe-1558-ed47fd2c680a";Type = Output 1;Label = "d-out";InputPorts = [{Id = "b6e25648-a9a1-9c9c-935d-5f50a26c6c2b";PortNumber = Some 0;PortType = PortType.Input;HostId = "214620f0-51f6-59fe-1558-ed47fd2c680a"}];OutputPorts = [];X = 743;Y = 315};
{H=50;W=40; Id = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf";Type = SplitWire 1;Label = "";InputPorts = [{Id = "2a6d1069-81da-f185-ad82-3c524819f56a";PortNumber = Some 0;PortType = PortType.Input;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}];OutputPorts = [{Id = "f72513fe-f696-dbae-133b-6c864c7075a2";PortNumber = Some 0;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}; {Id = "8333c9b0-911e-aab3-b7fd-026d97b4a412";PortNumber = Some 1;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"}];X = 546;Y = 195};
{H=50;W=40; Id = "156b43f1-5e54-b058-c716-c5623c5f6e37";Type = SplitWire 3;Label = "";InputPorts = [{Id = "67424fbf-f200-6690-a8e6-450e951d9411";PortNumber = Some 0;PortType = PortType.Input;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}];OutputPorts = [{Id = "58405846-6427-732c-c901-f72f1162b36e";PortNumber = Some 0;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}; {Id = "d40a1df5-6b29-5b4d-486f-925a2d16a615";PortNumber = Some 1;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"}];X = 442;Y = 205}
],
[
{Id = "5a9d111c-acec-3973-01ea-d0590e547b89";Source = {Id = "d40a1df5-6b29-5b4d-486f-925a2d16a615";PortNumber = None;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Target = {Id = "b6e25648-a9a1-9c9c-935d-5f50a26c6c2b";PortNumber = None;PortType = PortType.Input;HostId = "214620f0-51f6-59fe-1558-ed47fd2c680a"};Vertices = [482.0,225.0; 510.5,225.0; 510.5,325.0; 743.0,325.0]};
{Id = "8f3205ca-5911-5a36-68da-4e8ca384c4a2";Source = {Id = "f72513fe-f696-dbae-133b-6c864c7075a2";PortNumber = None;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Target = {Id = "e62e040a-bcd2-58f6-39d5-24548811b784";PortNumber = None;PortType = PortType.Input;HostId = "59b45f9c-192c-98ce-da25-a94db45a5790"};Vertices = [586.0,195.0; 666.0,195.0; 666.0,121.0; 746.0,121.0]};
{Id = "1287faef-e07d-cca5-83c7-3aa3b1265cd8";Source = {Id = "3d87edd9-9572-df33-f8f8-9b77fbdd6bc5";PortNumber = None;PortType = PortType.Output;HostId = "9985ebc6-1cd5-8863-1341-1d543d236d38"};Target = {Id = "edd76daa-336d-7c68-8d94-7bbe30539724";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,255.0; 187.5,255.0; 187.5,225.0; 235.0,225.0]};
{Id = "cfaa960d-99c2-0f40-4ac7-335f6a238e2b";Source = {Id = "7a9bee0a-7ecc-13b6-ed3e-942f32d3c5fb";PortNumber = None;PortType = PortType.Output;HostId = "a91be585-2d3b-d872-be0f-b416c8eb03d2"};Target = {Id = "f4b2f416-0af3-8345-185a-d01b69fdda46";PortNumber = None;PortType = PortType.Input;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Vertices = [140.0,185.0; 187.5,185.0; 187.5,205.0; 235.0,205.0]};
{Id = "56e8c89b-bcbf-e674-a49d-72d06c20a563";Source = {Id = "712999dd-e970-51b3-f38f-aee70ff42d2d";PortNumber = None;PortType = PortType.Output;HostId = "9824ceb8-e999-8e48-9a56-7a4349e495b1"};Target = {Id = "2f0c6067-124f-233b-1077-db88900c31cc";PortNumber = None;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Vertices = [140.0,336.0; 344.0,336.0; 344.0,225.0; 364.0,225.0]};
{Id = "221f1ae2-9beb-5099-bc4c-a3f6c86214d4";Source = {Id = "6df8212b-0639-3d53-61cd-297e74d6bbad";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "ee1bc94e-a726-8868-f25a-25b5fc44b60a";PortNumber = None;PortType = PortType.Input;HostId = "8a9392fc-493b-7e96-72ec-b6f5f11ded8a"};Vertices = [667.0,205.0; 723.0,205.0; 723.0,184.0; 743.0,184.0]};
{Id = "78ceafbf-cfb8-4442-a6bb-62ed6a1893cd";Source = {Id = "5a95b665-510e-848c-c178-e0356b48940a";PortNumber = None;PortType = PortType.Output;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Target = {Id = "a0194620-020c-8897-0207-9d7e9ee2a538";PortNumber = None;PortType = PortType.Input;HostId = "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b"};Vertices = [667.0,225.0; 703.5,225.0; 703.5,240.0; 743.0,240.0]};
{Id = "edc53e8b-8c1e-340f-aaec-7eecf337a9a8";Source = {Id = "9dc8cfaa-c989-276a-6703-11196c5c7974";PortNumber = None;PortType = PortType.Output;HostId = "76de964a-124b-5c16-6de1-6158626344ac"};Target = {Id = "4a1da488-0834-1835-9649-6f4d5c172579";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [140.0,121.0; 279.5,121.0; 279.5,195.0; 299.5,195.0]};
{Id = "3fd09a23-18c1-0edd-b7cb-a70a4b8d42ef";Source = {Id = "6e7f6dfb-770b-1451-a569-1d20cc0785b6";PortNumber = None;PortType = PortType.Output;HostId = "74dcc790-927f-ae61-fd63-577c3387de0e"};Target = {Id = "4f58042b-383e-7557-fa72-8b149ba177a2";PortNumber = None;PortType = PortType.Input;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Vertices = [275.0,215.0; 299.5,215.0]};
{Id = "7aaafe2c-9648-bb9d-95cb-7ed8c8309150";Source = {Id = "3fbb97a2-aab1-b94d-c4cf-d52f8421f3b8";PortNumber = None;PortType = PortType.Output;HostId = "94efe8d3-413b-9390-b627-be7bc91ae2d1"};Target = {Id = "38d99b30-a219-c37e-df55-04b7240a599e";PortNumber = None;PortType = PortType.Input;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Vertices = [339.5,205.0; 364.0,205.0]};
{Id = "4852ec1c-5960-6696-b8c1-650b9517cb56";Source = {Id = "8333c9b0-911e-aab3-b7fd-026d97b4a412";PortNumber = None;PortType = PortType.Output;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Target = {Id = "2332109c-b48a-be65-70fd-662fc00cd0c7";PortNumber = None;PortType = PortType.Input;HostId = "772307ab-2941-3343-28a2-faacaa0efc96"};Vertices = [586.0,215.0; 627.0,215.0]};
{Id = "960e38bd-dd14-5109-ac25-8c701249f48b";Source = {Id = "6c5a63af-db72-1ece-495d-7a04c88fd1f0";PortNumber = None;PortType = PortType.Output;HostId = "c16668ed-ec17-3a14-8a4b-dec6c40335b5"};Target = {Id = "67424fbf-f200-6690-a8e6-450e951d9411";PortNumber = None;PortType = PortType.Input;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Vertices = [404.0,215.0; 442.0,215.0]};
{Id = "6d0843df-f606-4fb5-0349-ae90260e6c28";Source = {Id = "58405846-6427-732c-c901-f72f1162b36e";PortNumber = None;PortType = PortType.Output;HostId = "156b43f1-5e54-b058-c716-c5623c5f6e37"};Target = {Id = "2a6d1069-81da-f185-ad82-3c524819f56a";PortNumber = None;PortType = PortType.Input;HostId = "a3b6ec22-f265-2ec6-fad0-a4259ec4b3cf"};Vertices = [482.0,205.0; 546.0,205.0]}
]
/// A 4 bit input connected to a 4 bit output.
let stateBus13 : CanvasState =
[
{H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 4;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100};
{H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 4;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100}
],
[
{Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]}
]
/// A 4 bit input connected to a 3 bit output.
let stateBus14 : CanvasState =
[
{H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 4;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100};
{H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 3;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100}
],
[
{Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]}
]
/// A 3 bit input connected to a 4 bit output.
let stateBus15 : CanvasState =
[
{H=50;W=40; Id = "9bcba47e-deae-0b3f-2079-a1b124526b00";Type = Input 3;Label = "a";InputPorts = [];OutputPorts = [{Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = Some 0;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"}];X = 100;Y = 100};
{H=50;W=40; Id = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97";Type = Output 4;Label = "b";InputPorts = [{Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = Some 0;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"}];OutputPorts = [];X = 193;Y = 100}
],
[
{Id = "conn";Source = {Id = "f9f6284f-1663-ec81-5c5c-0a6660d1d524";PortNumber = None;PortType = PortType.Output;HostId = "9bcba47e-deae-0b3f-2079-a1b124526b00"};Target = {Id = "ba682a02-30db-a03f-db83-8f3ab1afc6e0";PortNumber = None;PortType = PortType.Input;HostId = "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97"};Vertices = [130.0,110.0; 193.0,110.0]}
]
/// A 2 bit input split into 2 single bit outputs.
let stateBus16 : CanvasState =
[
{H=50;W=40; Id = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5";Type = SplitWire 1;Label = "";InputPorts = [{Id = "a5977d59-b944-6651-bf91-3f3700bca60b";PortNumber = Some 0;PortType = PortType.Input;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}];OutputPorts = [{Id = "de1e9d70-4ce1-c6d9-cb87-30f632c9e1d1";PortNumber = Some 0;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}; {Id = "dc05cdf8-5ef7-c605-6c5b-bb8842c49089";PortNumber = Some 1;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"}];X = 202;Y = 112};
{H=50;W=40; Id = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "28047c34-2af2-867e-9130-6eb128769eef";PortNumber = Some 0;PortType = PortType.Output;HostId = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c"}];X = 102;Y = 112};
{H=50;W=40; Id = "60e2df66-bb8c-53f1-832d-e154c30cf9dd";Type = Output 1;Label = "b";InputPorts = [{Id = "24e75289-91d1-30e7-0ec5-409eb73f9ad3";PortNumber = Some 0;PortType = PortType.Input;HostId = "60e2df66-bb8c-53f1-832d-e154c30cf9dd"}];OutputPorts = [];X = 324;Y = 88};
{H=50;W=40; Id = "85e19389-c087-8b30-6c0a-02f7cc753695";Type = Output 1;Label = "c";InputPorts = [{Id = "99c1d8ae-5e85-fbbf-892d-48acb0fdff82";PortNumber = Some 0;PortType = PortType.Input;HostId = "85e19389-c087-8b30-6c0a-02f7cc753695"}];OutputPorts = [];X = 324;Y = 152}
],
[
{Id = "conn0";Source = {Id = "28047c34-2af2-867e-9130-6eb128769eef";PortNumber = None;PortType = PortType.Output;HostId = "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c"};Target = {Id = "a5977d59-b944-6651-bf91-3f3700bca60b";PortNumber = None;PortType = PortType.Input;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Vertices = [132.0,122.0; 202.0,122.0]};
{Id = "conn1";Source = {Id = "dc05cdf8-5ef7-c605-6c5b-bb8842c49089";PortNumber = None;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Target = {Id = "99c1d8ae-5e85-fbbf-892d-48acb0fdff82";PortNumber = None;PortType = PortType.Input;HostId = "85e19389-c087-8b30-6c0a-02f7cc753695"};Vertices = [242.0,132.0; 283.0,132.0; 283.0,162.0; 324.0,162.0]};
{Id = "conn2";Source = {Id = "de1e9d70-4ce1-c6d9-cb87-30f632c9e1d1";PortNumber = None;PortType = PortType.Output;HostId = "96b167b2-2c40-34e7-d4fc-4a7016c7ddf5"};Target = {Id = "24e75289-91d1-30e7-0ec5-409eb73f9ad3";PortNumber = None;PortType = PortType.Input;HostId = "60e2df66-bb8c-53f1-832d-e154c30cf9dd"};Vertices = [242.0,112.0; 283.0,112.0; 283.0,98.0; 324.0,98.0]}
]
/// 3 bit input merged with 4 bit input, then split in the same way.
let stateBus17 : CanvasState =
[
{H=50;W=40; Id = "6bcdc74a-9d71-3304-537d-1a17f02924eb";Type = Input 3;Label = "in3";InputPorts = [];OutputPorts = [{Id = "9e8b16ba-d450-c228-e64c-d5323cd4ca0a";PortNumber = Some 0;PortType = PortType.Output;HostId = "6bcdc74a-9d71-3304-537d-1a17f02924eb"}];X = 100;Y = 100};
{H=50;W=40; Id = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76";Type = Input 4;Label = "in4";InputPorts = [];OutputPorts = [{Id = "2cf62d71-2b34-ab11-9007-19409fe13b77";PortNumber = Some 0;PortType = PortType.Output;HostId = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76"}];X = 100;Y = 183};
{H=50;W=40; Id = "71d66801-50d5-4316-eb79-9e99a43cdfe4";Type = MergeWires;Label = "";InputPorts = [{Id = "6714352e-6a15-a388-3f3f-27c7cb0e6fc7";PortNumber = Some 0;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}; {Id = "32c34b03-b0f0-16f5-345a-fca3626f16c3";PortNumber = Some 1;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}];OutputPorts = [{Id = "85cc42dd-5ea8-0f62-a421-74d844f4de83";PortNumber = Some 0;PortType = PortType.Output;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"}];X = 190;Y = 138};
{H=50;W=40; Id = "1a6e1bb4-cfe0-77f9-a207-f409168ef210";Type = Output 3;Label = "out3";InputPorts = [{Id = "ca111545-dbcd-e812-b81d-af6e51769f0e";PortNumber = Some 0;PortType = PortType.Input;HostId = "1a6e1bb4-cfe0-77f9-a207-f409168ef210"}];OutputPorts = [];X = 375;Y = 89};
{H=50;W=40; Id = "d2676492-2302-24d9-52eb-6e69e7971339";Type = Output 4;Label = "out4";InputPorts = [{Id = "819cf4ff-57a7-4743-075b-0c07a983a866";PortNumber = Some 0;PortType = PortType.Input;HostId = "d2676492-2302-24d9-52eb-6e69e7971339"}];OutputPorts = [];X = 369;Y = 216};
{H=50;W=40; Id = "bb51f8c6-2c82-5206-eb25-492e15849e81";Type = SplitWire 3;Label = "";InputPorts = [{Id = "4a440c75-75c5-1a5c-93d9-97ca3993683f";PortNumber = Some 0;PortType = PortType.Input;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}];OutputPorts = [{Id = "68ca1398-18c8-cea1-c6c2-61393fb33e08";PortNumber = Some 0;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}; {Id = "be6c9827-eba7-6c19-ca75-7fcb1ac30dc9";PortNumber = Some 1;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"}];X = 254;Y = 138}
],
[
{Id = "9df32195-00b4-9795-3dc1-78fb70d453f2";Source = {Id = "68ca1398-18c8-cea1-c6c2-61393fb33e08";PortNumber = None;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Target = {Id = "ca111545-dbcd-e812-b81d-af6e51769f0e";PortNumber = None;PortType = PortType.Input;HostId = "1a6e1bb4-cfe0-77f9-a207-f409168ef210"};Vertices = [294.0,138.0; 334.5,138.0; 334.5,99.0; 375.0,99.0]};
{Id = "82cc4ce9-7b15-40ac-0226-98a7f8e2fb9a";Source = {Id = "be6c9827-eba7-6c19-ca75-7fcb1ac30dc9";PortNumber = None;PortType = PortType.Output;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Target = {Id = "819cf4ff-57a7-4743-075b-0c07a983a866";PortNumber = None;PortType = PortType.Input;HostId = "d2676492-2302-24d9-52eb-6e69e7971339"};Vertices = [294.0,158.0; 331.5,158.0; 331.5,226.0; 369.0,226.0]};
{Id = "cd13c70f-6037-0cf4-1295-5795e92d745c";Source = {Id = "9e8b16ba-d450-c228-e64c-d5323cd4ca0a";PortNumber = None;PortType = PortType.Output;HostId = "6bcdc74a-9d71-3304-537d-1a17f02924eb"};Target = {Id = "6714352e-6a15-a388-3f3f-27c7cb0e6fc7";PortNumber = None;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Vertices = [130.0,110.0; 160.0,110.0; 160.0,138.0; 190.0,138.0]};
{Id = "7438de0c-bbaf-c1f6-0307-42ece66c6c00";Source = {Id = "2cf62d71-2b34-ab11-9007-19409fe13b77";PortNumber = None;PortType = PortType.Output;HostId = "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76"};Target = {Id = "32c34b03-b0f0-16f5-345a-fca3626f16c3";PortNumber = None;PortType = PortType.Input;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Vertices = [130.0,193.0; 160.0,193.0; 160.0,158.0; 190.0,158.0]};
{Id = "678ffa07-0ed7-7b6f-ba9b-b14839c08a71";Source = {Id = "85cc42dd-5ea8-0f62-a421-74d844f4de83";PortNumber = None;PortType = PortType.Output;HostId = "71d66801-50d5-4316-eb79-9e99a43cdfe4"};Target = {Id = "4a440c75-75c5-1a5c-93d9-97ca3993683f";PortNumber = None;PortType = PortType.Input;HostId = "bb51f8c6-2c82-5206-eb25-492e15849e81"};Vertices = [230.0,148.0; 254.0,148.0]}
]
/// Partially connected Mux2. Top input (2 bits), select (1 bit) anc connection
/// to output (2 bits).
let stateBus18 : CanvasState =
[
{H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125};
{H=50;W=40; Id = "ed12b5d8-556b-515a-cc9d-873960690380";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}];X = 122;Y = 204};
{H=50;W=40; Id = "d7028a8f-83be-0d81-6f0f-19b384caddae";Type = Mux2;Label = "";InputPorts = [{Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = Some 0;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91";PortNumber = Some 1;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = Some 2;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];OutputPorts = [{Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = Some 0;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];X = 244;Y = 156};
{H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 373;Y = 171}
],
[
{Id = "conn-sel";Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = None;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"};Target = {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,214.0; 259.0,214.0; 259.0,201.0]};
{Id = "conn-top-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,135.0; 198.0,135.0; 198.0,172.0; 244.0,172.6]};
{Id = "conn-to-output";Source = {Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = None;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [274.0,181.0; 373.0,181.0]}
]
/// Fully connected Mux, but two inputs have different widths. Similar to
/// stateBus18.
let stateBus19 : CanvasState =
[
{H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125};
{H=50;W=40; Id = "ed12b5d8-556b-515a-cc9d-873960690380";Type = Input 1;Label = "b";InputPorts = [];OutputPorts = [{Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = Some 0;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}];X = 122;Y = 204};
{H=50;W=40; Id = "d7028a8f-83be-0d81-6f0f-19b384caddae";Type = Mux2;Label = "";InputPorts = [{Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = Some 0;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91";PortNumber = Some 1;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = Some 2;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];OutputPorts = [{Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = Some 0;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}];X = 244;Y = 156};
{H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 373;Y = 171}
],
[
{Id = "conn-sel";Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8";PortNumber = None;PortType = PortType.Output;HostId = "ed12b5d8-556b-515a-cc9d-873960690380"};Target = {Id = "f283db84-a1f0-d006-be39-f17be6f8490c";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,214.0; 259.0,214.0; 259.0,201.0]};
{Id = "conn-top-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "108ea909-b27f-24ba-22ea-2faeb061a926";PortNumber = None;PortType = PortType.Input;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Vertices = [152.0,135.0; 198.0,135.0; 198.0,172.0; 244.0,172.6]};
{Id = "conn-to-output";Source = {Id = "5b651087-9b95-3a80-4f99-014f85f0dfdd";PortNumber = None;PortType = PortType.Output;HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [274.0,181.0; 373.0,181.0]}
{Id = "conn-bottom-input"; Source = {Id = "a6010bcb-ba2b-e57f-ca50-39f3d094e3b8"; PortNumber = None; PortType = PortType.Output; HostId = "ed12b5d8-556b-515a-cc9d-873960690380"}; Target = {Id = "38c8c934-d55e-2aff-e61b-5fbf7d7eed91"; PortNumber = None; PortType = PortType.Input; HostId = "d7028a8f-83be-0d81-6f0f-19b384caddae"}; Vertices = [152.0,258.0; 198.0,258.0; 198.0,189.33333333333334; 244.0,189.33333333333334]}
]
/// Partially connected Demux. A 2-bit input, Mux, a 2-bit output.
let stateBus20 : CanvasState =
[
{H=50;W=40; Id = "8078a917-236f-5a40-18a6-8e2d6a1458f5";Type = Input 2;Label = "a";InputPorts = [];OutputPorts = [{Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = Some 0;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"}];X = 122;Y = 125};
{H=50;W=40; Id = "fbfb4202-9816-f214-0401-da18caddeb0f";Type = Demux2;Label = "";InputPorts = [{Id = "2b224026-609a-5eae-6885-ff9820dbae5f";PortNumber = Some 0;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}; {Id = "68043f9b-47e7-793f-fed2-943a7d7336dc";PortNumber = Some 1;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}];OutputPorts = [{Id = "57070484-347e-4701-8c36-f510c2ef150c";PortNumber = Some 0;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}; {Id = "123463bf-7868-9a87-6fb1-36627a3c9bad";PortNumber = Some 1;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"}];X = 254;Y = 110};
{H=50;W=40; Id = "00661085-7d05-4185-09ef-4138ac918ad2";Type = Output 2;Label = "aa";InputPorts = [{Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = Some 0;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"}];OutputPorts = [];X = 401;Y = 117}
],
[
{Id = "conn-to-output";Source = {Id = "57070484-347e-4701-8c36-f510c2ef150c";PortNumber = None;PortType = PortType.Output;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"};Target = {Id = "7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45";PortNumber = None;PortType = PortType.Input;HostId = "00661085-7d05-4185-09ef-4138ac918ad2"};Vertices = [284.0,126.66666666666667; 343.5,126.66666666666667; 343.5,127.0; 401.0,127.0]};
{Id = "conn-to-input";Source = {Id = "cc7c6510-d49b-28d9-e0bc-d5350a2c76a8";PortNumber = None;PortType = PortType.Output;HostId = "8078a917-236f-5a40-18a6-8e2d6a1458f5"};Target = {Id = "2b224026-609a-5eae-6885-ff9820dbae5f";PortNumber = None;PortType = PortType.Input;HostId = "fbfb4202-9816-f214-0401-da18caddeb0f"};Vertices = [152.0,135.0; 254.0,135.0]}
]

View file

@ -0,0 +1,101 @@
module SimulatorMemoriesTests
open CommonTypes
open SimulatorTypes
open CanvasStatesMemories
open NumberHelpers
open Helpers
/// Tuple with: (diagramName, state, loadedComponents, number of clock ticks, inputss).
/// Note that the inputss is a list of inputs. I.e. inputss provides an inputs
/// for every time step. The first set of inputs will be fed before the first
/// clock tick, then second after the second clock tick and so on. If no inputs
/// are provided for a certain iteration, none will fed.
type private TestCaseInput = string * CanvasState * LoadedComponent list * int * ((ComponentId * WireData) list) list
type private IterationOutput = (SimulationIO * WireData) list // Output after every clock tick.
type private TestCaseOutput = Result<IterationOutput list, SimulationError>
type private TestCase = string * TestCaseInput * TestCaseOutput
let private toWD num w = convertIntToWireData w (int64 num)
let private makeStateMem3Input addr dataIn write =
[ (ComponentId "81030fc6-2471-a568-160f-922709edeb2e", toWD addr 3)
(ComponentId "266d8763-6fbf-37c2-6825-d3487153053b", toWD dataIn 4)
(ComponentId "f0769200-24e3-5c7b-3591-c5c3711d9336", toWD write 1) ]
let private makeStateMem3Output dataOut =
[ (ComponentId "1f9704f9-88fc-124c-3ff8-21c36cfb7328", ComponentLabel "data-out", 4), toWD dataOut 4 ]
let testCasesSimulatorMemories : TestCase list = [
"Synchronous ROM connected to address and output",
("main", stateMem1, [], 6, [
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 0 2) ]
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 1 2) ]
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 2 2) ]
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD 3 2) ]
]),
Ok [
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 0 4 ] // Mem[0]
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 0 4 ] // Mem[0]
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 1 4 ] // Mem[1]
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 4 4 ] // Mem[2]
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 15 4 ] // Mem[3]
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 4), toWD 15 4 ] // Mem[3]
]
"Synchronous ROM connected to address and output. ROM is big.",
("main", stateMem2, [], pow2(8)+1, (
[0..pow2(8)-1] |> List.map (fun i ->
[ (ComponentId "4f65afe9-f03c-2b97-fde9-c657ca32f246", toWD i 8) ]
)
)),
Ok (
[ [ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 8), toWD 0 8 ] ] // Mem[0]
@
(
[0..pow2(8)-1] |> List.map (fun i ->
[ (ComponentId "fbb5aa79-a471-ac24-4201-56ae39d537c6", ComponentLabel "data", 8), toWD i 8 ]
)
)
)
"RAM only writes if write flag is set",
("main", stateMem3, [], 10, [
makeStateMem3Input 0 1 0
makeStateMem3Input 0 1 0
makeStateMem3Input 0 1 1 // Turn on write flag. Set to one.
makeStateMem3Input 0 0 1 // Set to zero.
makeStateMem3Input 0 1 1 // Set to one.
makeStateMem3Input 0 0 0 // Turn off write flag. Stays at one.
makeStateMem3Input 0 0 0
makeStateMem3Input 0 0 0
makeStateMem3Input 0 0 0
makeStateMem3Input 0 0 0
]),
Ok [
makeStateMem3Output 0 // Mem[0], unchanged
makeStateMem3Output 0 // Mem[0], unchanged
makeStateMem3Output 0 // Mem[0], unchanged
makeStateMem3Output 1 // Mem[0], set to 1
makeStateMem3Output 0 // Mem[0], set to 0
makeStateMem3Output 1 // Mem[0], set to 1
makeStateMem3Output 1 // Mem[0], stays 1
makeStateMem3Output 1 // Mem[0], stays 1
makeStateMem3Output 1 // Mem[0], stays 1
makeStateMem3Output 1 // Mem[0], stays 1
]
"RAM writes and reads all locations.",
("main", stateMem3, [], 17,
( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Input i (i+1) 1) ) // Write all locations.
@
( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Input i 0 0) ) // Read all locations.
),
Ok (
[ makeStateMem3Output 0 ]
@
( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Output <| i+1) )
@
( [0..pow2(3)-1] |> List.map(fun i -> makeStateMem3Output <| i+1) )
)
]

214
Tests/SimulatorSyncTests.fs Normal file
View file

@ -0,0 +1,214 @@
module SimulatorSyncTests
open CommonTypes
open SimulatorTypes
open CanvasStatesSync
/// Tuple with: (diagramName, state, loadedComponents, number of clock ticks, inputss).
/// Note that the inputss is a list of inputs. I.e. inputss provides an inputs
/// for every time step. The first set of inputs will be fed before the first
/// clock tick, then second after the second clock tick and so on. If no inputs
/// are provided for a certain iteration, none will fed.
type private TestCaseInput = string * CanvasState * LoadedComponent list * int * ((ComponentId * WireData) list) list
type private IterationOutput = (SimulationIO * WireData) list // Output after every clock tick.
type private TestCaseOutput = Result<IterationOutput list, SimulationError>
type private TestCase = string * TestCaseInput * TestCaseOutput
let testCasesSimulatorSync : TestCase list = [
"Simple D-flip-flop, one input, one output (zero)",
("main", stateSync1, [], 5, [
[ (ComponentId "6e7a2000-439c-108e-df6d-93cff7a41266", [Zero]) ]
]),
Ok (
// Check it is zero for 5 ticks.
[(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]
|> List.replicate 5
)
"Simple D-flip-flop, one input, one output (one)",
("main", stateSync1, [], 5, [
[ (ComponentId "6e7a2000-439c-108e-df6d-93cff7a41266", [One]) ]
]),
Ok (
// Tick 0, out is zero.
[[(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]]
@
// Then out is 1 four times.
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]]
|> List.replicate 4)
)
"Two D-flip-flop connected in series, one input, one output (one)",
("main", stateSync2, [], 5, [
[ (ComponentId "3739e54a-fd21-bf60-8fc2-a3d10108c947", [One]) ]
]),
Ok (
// Tick 0 and 1, out is zero.
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]
|> List.replicate 2)
@
// Then out is 1 three times.
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]]
|> List.replicate 3)
)
"Three D-flip-flop connected in series, one input, one output (one)",
("main", stateSync3, [], 5, [
[ (ComponentId "3739e54a-fd21-bf60-8fc2-a3d10108c947", [One]) ]
]),
Ok (
// Tick 0,1 and 2, out is zero.
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [Zero]]
|> List.replicate 3)
@
// Then out is 1 two times.
([(ComponentId "a5d52bcd-0a6d-d123-7313-61d0b8b367fd", ComponentLabel "out", 1), [One]]
|> List.replicate 2)
)
"StateSync1 custom component followed by a DFF (one)",
("main", stateSync4, [stateSync1Dependency], 5, [
[ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ]
]),
Ok (
// Tick 0 and 1, out is zero.
([(ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero]]
|> List.replicate 2)
@
// Then out is 1 three times.
([(ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One]]
|> List.replicate 3)
)
"StateSync1 custom component followed by a DFF, time varying inputs",
("main", stateSync4, [stateSync1Dependency], 10, [
[ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ]
[ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [Zero]) ]
[ (ComponentId "03e4c81a-4703-d9f5-dfaf-301de006610f", [One]) ]
]),
Ok [
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ]
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ]
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // After 2 timesteps, the One arrives.
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [Zero] ] // Back to Zero.
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // Back to One.
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ] // And statys one...
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ]
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ]
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ]
[ (ComponentId "781e7d9d-b18c-d614-dbc0-23bac9e617b7", ComponentLabel "b", 1), [One] ]
]
"A DFF looping to itself via a Not gate. Two output nodes to probe the wires before and after the Not gate.",
("main", stateSync5, [], 4, []),
Ok [
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero]
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ]
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One]
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ]
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero]
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ]
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One]
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ]
]
"Similar to stateSync5, but with a stateSync1 custom component instead of a DFF.",
("main", stateSync6, [stateSync1Dependency], 4, []),
Ok [
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero]
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ]
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One]
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ]
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [Zero]
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [One] ]
[ (ComponentId "62a3108e-1198-502b-e338-e677815aead3", ComponentLabel "out1", 1), [One]
(ComponentId "023094a0-9787-47ce-26af-03086cdc4b15", ComponentLabel "out2", 1), [Zero] ]
]
"A connected to output via both sync and comb paths.",
("main", stateSync7, [], 4, [
[(ComponentId "ff10125a-601f-e1d5-e379-7eb7c65eb91f", [One])]
[(ComponentId "ff10125a-601f-e1d5-e379-7eb7c65eb91f", [Zero])]
]),
Ok [
[ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [One]
(ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ]
[ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero]
(ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [One] ]
[ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero]
(ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ]
[ (ComponentId "794d5154-6969-3f4e-9c8b-4bc17927c28f", ComponentLabel "B-Comb", 1), [Zero]
(ComponentId "95452292-b507-ab43-f082-85152d3e4cf2", ComponentLabel "B-Sync", 1), [Zero] ]
]
"stateSync7 Not-ed self looped in the synchronous branch.",
("main", stateSync8, [stateSync7Dependency], 4, []),
Ok [
[ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [One] ]
[ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [Zero] ]
[ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [One] ]
[ (ComponentId "66030e1a-4a97-244a-f0bb-d9e5fd25627f", ComponentLabel "B", 1), [Zero] ]
]
"stateSync8 wrapped",
("main", stateSync9, [stateSync8Dependency; stateSync7Dependency], 4, []),
Ok [
[ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [One] ]
[ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [Zero] ]
[ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [One] ]
[ (ComponentId "a100bada-b27f-15ca-accb-153e717a31f1", ComponentLabel "B", 1), [Zero] ]
]
"A fully connected DFFE.",
("main", stateSync10, [], 8, [
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero]) // in
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [Zero]) ] // enable
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero])
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [One])
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero])
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [Zero]) ] // turn off enable
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [One])
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // turn on enable again
[ (ComponentId "5916f1cf-408e-4186-a839-c80926bfddf0", [Zero])
(ComponentId "cab54371-5e07-9586-eb9b-be8cc417e610", [One]) ] // set to zero
]),
Ok [
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ]
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ]
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // enabled but zero
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // set to one
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // enable is off
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [One] ] // enable is on again
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // set to zero
[ (ComponentId "a2c874bb-eaeb-d62d-8a72-5eeae48db694", ComponentLabel "out", 1), [Zero] ] // set to zero
]
"StateSync7 Not-ed self looped in the combinatorial branch.",
("main", stateSync11, [stateSync7Dependency], 4, []),
Error {
Msg = "Cycle detected in combinatorial logic."
InDependency = None
ComponentsAffected = ["c9d9659a-4476-de3a-a838-eeab15496c99"; "5c24921a-88e9-7bc2-ee89-97fefb694902"] |> List.map ComponentId
ConnectionsAffected = ["bc1f9a51-5ca8-1aa0-b4bd-b86bc9646c20"; "cc7a9da2-f78a-f3e1-1c2f-7323f2b43d15"] |> List.map ConnectionId
}
"StateSync11 connected to an output. Should spot cycle in the dependency.",
("main", stateSync12, [stateSync11Dependency; stateSync7Dependency], 4, []),
Error {
Msg = "Cycle detected in combinatorial logic."
InDependency = Some "combinatorial-loop"
ComponentsAffected = ["c9d9659a-4476-de3a-a838-eeab15496c99"; "5c24921a-88e9-7bc2-ee89-97fefb694902"] |> List.map ComponentId
ConnectionsAffected = [] // Connections are not inferred in dependencies.
}
]

457
Tests/SimulatorTests.fs Normal file
View file

@ -0,0 +1,457 @@
module SimulatorTests
open CommonTypes
open SimulatorTypes
open CanvasStates
open CanvasStatesWithBuses
open Simulator
/// Tuple with: (diagramName, state, loadedComponents, inputs).
type private SimulatorTestCaseInput = string * CanvasState * LoadedComponent list * (ComponentId * WireData) list
type private SimulatorTestCaseOutput = Result<(SimulationIO * WireData) list, SimulationError>
type private SimulatorTestCase = string * SimulatorTestCaseInput * SimulatorTestCaseOutput
let private makeError msg deps comps conns =
Error {
Msg = msg
InDependency = deps
ComponentsAffected = comps |> List.map ComponentId
ConnectionsAffected = conns |> List.map ConnectionId
}
/// Given a list of N generic elements, associate each element with a bit and
/// return 2^N lists with all the possible bit combinations.
/// A bit is simply a bus with width 1.
let makeAllBitCombinations (lst : 'a list) : (('a * WireData) list) list =
let rec allCombinations lst result stack =
match lst with
| [] -> List.rev stack :: result
| el :: lst' ->
let result = allCombinations lst' result ((el,[Zero]) :: stack)
allCombinations lst' result ((el,[One]) :: stack)
List.rev <| allCombinations lst [] []
/// Auto generate all the testcases for a CanvasState (i.e. a full thruth
/// table). The thruth table considers ALL inputs to be single bit inputs,
/// please do not use this function if not all inputs are like that.
let private createAllTestCases
(title : string)
(diagramName : string)
(state : CanvasState)
(dependencies : LoadedComponent list)
(inputLabels : ComponentId list)
(expectedResults : ((SimulationIO * WireData) list) list)
: SimulatorTestCase list =
let allInputCombinations = makeAllBitCombinations inputLabels
assert(List.length allInputCombinations = List.length expectedResults)
(allInputCombinations, expectedResults)
||> List.map2 (fun inputs outputs ->
sprintf "%s: %A" title inputs,
(diagramName, state, dependencies, inputs),
Ok outputs
)
// The input to a test case is formed by:
// - a CanvasState,
// - a list of loaded dependencies,
// - a list of input values that will be applied to the simulation graph.
// The dependency list and the inputs do not matter since the test has to fail
// in the earlier checks.
let private testCasesSimulatorPortError : SimulatorTestCase list = [
"Unconnected input node",
("", state1, [], []),
makeError
"All ports must have at least one connection."
None
["input-node0"]
[]
"Two unconnected input nodes",
("", state2, [], []),
makeError
"All ports must have at least one connection."
None
["input-node0"]
[]
"Two inputs and one output",
("", state5, [], []),
makeError
"A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component."
None
["output-node0"]
[]
"Two inputs, one And, one output, with extra connection input to output",
("", state7, [], []),
makeError
"A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component."
None
["output"]
[]
"Two inputs, one And, one output, with extra connections inputs to and",
("", state8, [], []),
makeError
"A wire must have precisely one driving component, but 2 were found. If you want to merge wires together use a MergeWires component."
None
["and"]
[]
"Mux2 with only two connected ports",
("", state9, [], []),
makeError
"All ports must have at least one connection."
None
["mux"]
[]
]
let private testCasesSimulatorDuplicatIOError : SimulatorTestCase list = [
"Simple circuit with duplicated output label",
("", state14, [], []),
makeError
"Two Output components cannot have the same label: output-duplicate-label."
None
["output-node0"; "output-node1"]
[]
"Simple And circuit with duplicated input label",
("", state15, [], []),
makeError
"Two Input components cannot have the same label: input-duplicate-label."
None
["top-input"; "bottom-input"]
[]
]
let private testCasesSimulatorCycleError : SimulatorTestCase list = [
"Complex diagram with three Ands and two cycles",
("", state10, [], []),
makeError
"Cycle detected in combinatorial logic."
None
["and2"; "and0"]
["conn5"; "conn4"]
"Complex diagram with three Ands and one long cycle",
("", state11, [], []),
makeError
"Cycle detected in combinatorial logic."
None
["and1"; "and2"; "and0"]
["conn1"; "conn5"; "conn3"]
]
// In the next tests, we have no dependencies.
// The inputs are set since the simulation graph should be fine.
let private testCasesSimulatorOkNoDependencies : SimulatorTestCase list =
createAllTestCases
"Simple circuit with one input and one output"
"main" state3 [] [ComponentId "input-node0"]
[
[(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero]]
[(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One]]
]
@
createAllTestCases
"Simple circuit with one input connected to two outputs"
"main" state4 [] [ComponentId "input-node0"]
[
[
(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero]
(ComponentId "output-node1", ComponentLabel "output-node1-label", 1), [Zero]
]
[
(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One]
(ComponentId "output-node1", ComponentLabel "output-node1-label", 1), [One]
]
]
@
createAllTestCases
"Two inputs; one And; one output"
"main" state6 [] [ComponentId "top-input"; ComponentId "bottom-input"]
[
[(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]]
[(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]]
[(ComponentId "output", ComponentLabel "output-node0-label", 1), [Zero]]
[(ComponentId "output", ComponentLabel "output-node0-label", 1), [One]]
]
@
createAllTestCases
"Weird diagram with a series of and gates"
"main" state12 [] [ComponentId "input"]
[
[(ComponentId "output", ComponentLabel "output", 1), [Zero]]
[(ComponentId "output", ComponentLabel "output", 1), [One]]
]
@
createAllTestCases
"One bit adder (Zero, Zero)"
"main" state13 [] [
ComponentId "2953603d-44e4-5c1f-3fb1-698f7863b6b5"
ComponentId "170e69f4-b3d7-d9e0-9f1d-6a564ba62062"
]
[
[
(ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [Zero]
(ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero]
]
[
(ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [One]
(ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero]
]
[
(ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [One]
(ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [Zero]
]
[
(ComponentId "9aaf18a9-b3ac-bf51-1ed3-625baa1ff6a9", ComponentLabel "Sum", 1), [Zero]
(ComponentId "94da6dd7-a263-a3ec-ec76-bfa07b0b0f34", ComponentLabel "Carry", 1), [One]
]
]
let testCasesSimulatorDependencyError : SimulatorTestCase list =
createAllTestCases
"Broken unused dependency." // Since the dependency is unused the test should pass.
"main" state3 [state1Dependency] [ComponentId "input-node0"]
[
[(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [Zero]]
[(ComponentId "output-node0", ComponentLabel "output-node0-label", 1), [One]]
]
@
[
// Broken dependencies.
"Input connected to broken depdendency.",
("main", state19, [state1Dependency], []),
makeError
"All ports must have at least one connection."
(Some "broken-one-input") [] []
// Dependency cycle.
"Component using itself.",
(state16Dependency.Name, state20, [state16Dependency], []),
makeError
(sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\"." state16Dependency.Name state16Dependency.Name)
None [] []
"Long cycle starting at root.",
(state23Dependency.Name, state23, [state21Dependency; state22Dependency], []),
makeError
(sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\" --> \"%s\" --> \"%s\"." state23Dependency.Name state21Dependency.Name state22Dependency.Name state23Dependency.Name)
None [] []
"Long cycle.",
("main", state24, [state21Dependency; state22Dependency; state23Dependency], []),
makeError
(sprintf "Found a cycle in dependencies: \"%s\" --> \"%s\" --> \"%s\" --> \"%s\"." state23Dependency.Name state21Dependency.Name state22Dependency.Name state23Dependency.Name)
None [] []
// Missing dependencies.
"2 bit full adder missing dependencies",
("2-bit-adder", twoBitAdderState, [], []),
makeError
"Could not resolve dependency: \"full-adder\". Make sure a dependency with such name exists in the current project."
(Some "2-bit-adder") [] []
"2 bit full adder missing half adder dependency",
("2-bit-adder", twoBitAdderState, [fullAdderDependency], []),
makeError
"Could not resolve dependency: \"half-adder\". Make sure a dependency with such name exists in the current project."
(Some "full-adder") [] []
"2 bit full adder missing full adder dependency",
("2-bit-adder", twoBitAdderState, [halfAdderDependency], []),
makeError
"Could not resolve dependency: \"full-adder\". Make sure a dependency with such name exists in the current project."
(Some "2-bit-adder") [] []
]
// Outputs fot the 2bit adder test.
let private zero = [
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero]
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero]
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero]
]
let private one = [
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero]
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One]
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero]
]
let private two = [
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One]
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero]
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero]
]
let private three = [
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One]
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One]
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [Zero]
]
let private four = [
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero]
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero]
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One]
]
let private five = [
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [Zero]
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One]
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One]
]
let private six = [
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One]
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [Zero]
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One]
]
let private seven = [
(ComponentId "dbb1f55a-edf3-bde2-4c69-43a02560e17d", ComponentLabel "Sum1", 1), [One]
(ComponentId "8f5bded5-f46d-722d-6108-03dda4236c01", ComponentLabel "Sum0", 1), [One]
(ComponentId "7d948312-376d-1d4b-cf02-90872026be16", ComponentLabel "Cout", 1), [One]
]
let testCasesSimulatorOkWithDependencies : SimulatorTestCase list =
createAllTestCases
"Simple input-output dependency" "main"
state16 [state3Dependency] [ComponentId "outer-input-node0"]
[
[(ComponentId "outer-output-node0", ComponentLabel "outer-output-node0-label", 1), [Zero]]
[(ComponentId "outer-output-node0", ComponentLabel "outer-output-node0-label", 1), [One]]
]
@
createAllTestCases
"Nested input-output dependency" "main"
state17 [state16Dependency; state3Dependency] [ComponentId "outer-outer-input-node0"]
[
[(ComponentId "outer-outer-output-node0", ComponentLabel "outer-outer-output-node0-label", 1), [Zero]]
[(ComponentId "outer-outer-output-node0", ComponentLabel "outer-outer-output-node0-label", 1), [One]]
]
@
createAllTestCases
"Doubly nested input-output dependency" "main"
state18 [state17Dependency; state16Dependency; state3Dependency] [ComponentId "outer-outer-outer-input-node0"]
[
[(ComponentId "outer-outer-outer-output-node0", ComponentLabel "outer-outer-outer-output-node0-label", 1), [Zero]]
[(ComponentId "outer-outer-outer-output-node0", ComponentLabel "outer-outer-outer-output-node0-label", 1), [One]]
]
@
createAllTestCases
"2 bit adder" "2-bit-adder"
twoBitAdderState [fullAdderDependency; halfAdderDependency] [
ComponentId "78795182-35c4-1c50-2190-6fc944a2adea" // Cin
ComponentId "a63fe5a2-9f4d-e70f-131b-ed35d3f3a9e1" // B1
ComponentId "69a6ad2a-af19-369f-0483-0e09e6841da3" // B0
ComponentId "82a03f0b-ae31-b487-ed1b-335e235adeb7" // A1
ComponentId "86372781-c2f4-09f2-406f-f385ee7a47a9" // A0
]
[
zero;one;two;three;
one;two;three;four;
two;three;four;five;
three;four;five;six;
one;two;three;four;
two;three;four;five;
three;four;five;six;
four;five;six;seven
]
let private testCasesSimulatorBusesError : SimulatorTestCase list = [
"Two inputs make a bus2, then Push input a to bus, then try to split into 2 single bits (fail)",
("main", stateBus11, [], []),
makeError "Wrong wire width. Target port expects a 1 bit(s) signal, but source port produces a 2 bit(s) signal." None [] ["conn"]
"A 4 bit input connected to a 3 bit output",
("main", stateBus14, [], []),
makeError "Wrong wire width. Target port expects a 3 bit(s) signal, but source port produces a 4 bit(s) signal." None [] ["conn"]
"A 3 bit input connected to a 4 bit output",
("main", stateBus15, [], []),
makeError "Wrong wire width. Target port expects a 4 bit(s) signal, but source port produces a 3 bit(s) signal." None [] ["conn"]
]
let private testCasesSimulatorOkWithBuses : SimulatorTestCase list =
createAllTestCases
"Two inputs, packed into a bus, unpacked into two outputs" "main"
stateBus10 [] [
ComponentId "a91be585-2d3b-d872-be0f-b416c8eb03d2" // a
ComponentId "9985ebc6-1cd5-8863-1341-1d543d236d38" // b
]
(makeAllBitCombinations [
(ComponentId "8a9392fc-493b-7e96-72ec-b6f5f11ded8a", ComponentLabel "a-out", 1)
(ComponentId "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b", ComponentLabel "b-out", 1)
])
@
createAllTestCases
"Four inputs, packed into a bus, unpacked into four outputs" "main"
stateBus12 [] [
ComponentId "76de964a-124b-5c16-6de1-6158626344ac" // a
ComponentId "a91be585-2d3b-d872-be0f-b416c8eb03d2" // b
ComponentId "9985ebc6-1cd5-8863-1341-1d543d236d38" // c
ComponentId "9824ceb8-e999-8e48-9a56-7a4349e495b1" // d
]
(makeAllBitCombinations [
(ComponentId "59b45f9c-192c-98ce-da25-a94db45a5790", ComponentLabel "a-out", 1)
(ComponentId "8a9392fc-493b-7e96-72ec-b6f5f11ded8a", ComponentLabel "b-out", 1)
(ComponentId "dfcf6cff-fbac-e54f-7a9d-7059d17e3a0b", ComponentLabel "c-out", 1)
(ComponentId "214620f0-51f6-59fe-1558-ed47fd2c680a", ComponentLabel "d-out", 1)
])
@
[
"A 4 bit input connected to a four bit output (1)",
("main", stateBus13, [], [
ComponentId "9bcba47e-deae-0b3f-2079-a1b124526b00", [One; One; One; One]
]),
[
(ComponentId "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97", ComponentLabel "b", 4), [One; One; One; One]
] |> Ok
"A 4 bit input connected to a four bit output (2)",
("main", stateBus13, [], [
ComponentId "9bcba47e-deae-0b3f-2079-a1b124526b00", [Zero; One; Zero; One]
]),
[
(ComponentId "ad2ef0c3-537e-9d2e-0064-ac6b952e4b97", ComponentLabel "b", 4), [Zero; One; Zero; One]
] |> Ok
"A 2 bit input split into 2 single bit outputs (1)",
("main", stateBus16, [], [
ComponentId "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c", [One; Zero]
]),
[
(ComponentId "60e2df66-bb8c-53f1-832d-e154c30cf9dd", ComponentLabel "b", 1), [One]
(ComponentId "85e19389-c087-8b30-6c0a-02f7cc753695", ComponentLabel "c", 1), [Zero]
] |> Ok
"A 2 bit input split into 2 single bit outputs (2)",
("main", stateBus16, [], [
ComponentId "c6f000db-310f-d8ad-ff5e-938d7c2aaa7c", [Zero; One]
]),
[
(ComponentId "60e2df66-bb8c-53f1-832d-e154c30cf9dd", ComponentLabel "b", 1), [Zero]
(ComponentId "85e19389-c087-8b30-6c0a-02f7cc753695", ComponentLabel "c", 1), [One]
] |> Ok
"3 bit input merged with 4 bit input, then split in the same way",
("main", stateBus17, [], [
ComponentId "6bcdc74a-9d71-3304-537d-1a17f02924eb", [One; Zero; One] // 3 bits.
ComponentId "97c4b56d-4f8c-2b00-fb61-a08cdd01dd76", [Zero; One; Zero; One] // 4 bits.
]),
[
(ComponentId "1a6e1bb4-cfe0-77f9-a207-f409168ef210", ComponentLabel "out3", 3), [One; Zero; One]
(ComponentId "d2676492-2302-24d9-52eb-6e69e7971339", ComponentLabel "out4", 4), [Zero; One; Zero; One]
] |> Ok
]
let testCasesSimulator =
testCasesSimulatorPortError @
testCasesSimulatorCycleError @
testCasesSimulatorDuplicatIOError @
testCasesSimulatorOkNoDependencies @
testCasesSimulatorDependencyError @
testCasesSimulatorOkWithDependencies @
testCasesSimulatorBusesError @
testCasesSimulatorOkWithBuses

18
Tests/TestLib.fs Normal file
View file

@ -0,0 +1,18 @@
module TestLib
open Expecto
/// Create a testcase for unit testing a function.
let testFunction f testData =
let descr, inp, expectedOut = testData
testCase descr <| fun () ->
let actual = f inp
Expect.equal actual expectedOut ""
/// Create an expecto testList from a list of testCases.
let createTestList descr f testCases =
testList descr <| List.map (testFunction f) testCases
/// Run all the previously defined tests.
let runTests () =
runTestsInAssembly defaultConfig [||] |> ignore

84
Tests/Tests.fs Normal file
View file

@ -0,0 +1,84 @@
open TestLib
open Expecto
open Simulator
open BusWidthInferer
open SimulatorTests
open SimulatorSyncTests
open SimulatorMemoriesTests
open WidthInfererTests
open EEExtensions
let runSimulatorTest (diagramName, state, loadedComponents, inputs) =
// Build simulation graph.
match prepareSimulation diagramName state loadedComponents with
| Error e -> Error e
| Ok simData ->
// Feed all the inputs and extract the outputs.
(simData.Graph, inputs)
||> List.fold (fun graph (inputId, bit) -> feedSimulationInput graph inputId bit)
|> extractSimulationIOs simData.Outputs
|> Ok
let safeListItem lst idx =
if idx >= List.length lst then [] else List.item idx lst
let runSimulatorSyncTest (diagramName, state, loadedComponents, ticks, inputss) =
// Build simulation graph.
match prepareSimulation diagramName state loadedComponents with
| Error e -> Error e
| Ok simData ->
let results, graph =
(simData.Graph, [0..ticks-1])
||> List.mapFold (fun graph i ->
// Feed the inputs for this time iteration before the clock
// tick.
let inputs = safeListItem inputss i
let graph =
(graph, inputs)
||> List.fold (fun graph (inputId, bit) ->
feedSimulationInput graph inputId bit)
// Extract output, then feed a new clock tick.
extractSimulationIOs simData.Outputs graph, feedClockTick graph
)
Ok results
[<Tests>]
let simulatorTests =
createTestList "simulator" runSimulatorTest testCasesSimulator
[<Tests>]
let simulatorSyncTests =
createTestList "simulatorSync" runSimulatorSyncTest testCasesSimulatorSync
[<Tests>]
let simulatorMemoriesTests =
createTestList "simulatorMemories" runSimulatorSyncTest testCasesSimulatorMemories
[<Tests>]
let widthInfererTests =
createTestList "widthInferer" inferConnectionsWidth testCasesWidthInferer
let mutable Watches: Map<string,System.Diagnostics.Stopwatch> = Map.empty
/// dotnet core timer function
let stopTimer s =
let timer = Map.tryFind s Watches
match timer with
| None -> failwithf "error: Timer '%s' has been stopped before it was started. timers: %A" s (Map.keys Watches)
| Some stopWatch ->
stopWatch.Stop()
printfn "%s: %.4fms" s stopWatch.Elapsed.TotalMilliseconds
/// dotnet core timer function
let startTimer s =
Watches <- Map.add s (System.Diagnostics.Stopwatch.StartNew()) Watches
/// measure various dotnet core performance stats
/// m = structure size.
/// n = number of iterations.
let displayPerformance m n = Helpers.checkPerformance m n startTimer stopTimer
[<EntryPoint>]
let main argv =
displayPerformance 100 1000000
//TestLib.runTests ()
0

24
Tests/Tests.fsproj Normal file
View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="TestLib.fs" />
<Compile Include="CanvasStates.fs" />
<Compile Include="CanvasStatesWithBuses.fs" />
<Compile Include="CanvasStatesSync.fs" />
<Compile Include="CanvasStatesMemories.fs" />
<Compile Include="WidthInfererTests.fs" />
<Compile Include="SimulatorTests.fs" />
<Compile Include="SimulatorSyncTests.fs" />
<Compile Include="SimulatorMemoriesTests.fs" />
<Compile Include="Tests.fs" />
</ItemGroup>
<!-- Dependencies -->
<ItemGroup>
<PackageReference Include="Expecto.FsCheck" Version="8.13.1" />
</ItemGroup>
<Import Project="..\.paket\Paket.Restore.targets" />
</Project>

184
Tests/WidthInfererTests.fs Normal file
View file

@ -0,0 +1,184 @@
module WidthInfererTests
open CommonTypes
open CanvasStates
open CanvasStatesWithBuses
type private WidthInfererTestCaseInput = CanvasState
type private WidthInfererTestCaseOutput = Result<ConnectionsWidth, WidthInferError>
type private WidhtInfererTestCase = string * WidthInfererTestCaseInput * WidthInfererTestCaseOutput
let private testCasesWidthInfererSimple : WidhtInfererTestCase list = [
"Two unconnected input nodes. No conections", state2,
Ok Map.empty
"Simple circuit with one input connected to one output", state3,
[
ConnectionId "conn0", Some 1
] |> Map.ofList |> Ok
"Simple circuit with one input connected to two outputs", state4,
[
ConnectionId "conn0", Some 1
ConnectionId "conn1", Some 1
] |> Map.ofList |> Ok
"Two inputs; one And; one output", state6,
[
ConnectionId "conn0", Some 1
ConnectionId "conn1", Some 1
ConnectionId "conn2", Some 1
] |> Map.ofList |> Ok
"Partially connected and: missing bottom connections", state25,
[
ConnectionId "conn0", Some 1
ConnectionId "conn2", Some 1
] |> Map.ofList |> Ok
"Partially connected and: missing connection to output", state26,
[
ConnectionId "conn0", Some 1
ConnectionId "conn1", Some 1
] |> Map.ofList |> Ok
"Partially connected and: missing both input connections", state27,
[
ConnectionId "conn2", Some 1
] |> Map.ofList |> Ok
"One input and one output, connected to the state3CustomComponent", state16,
[
ConnectionId "conn0", Some 1
ConnectionId "conn1", Some 1
] |> Map.ofList |> Ok
"Nested custom components", state18,
[
ConnectionId "conn0", Some 1
ConnectionId "conn1", Some 1
] |> Map.ofList |> Ok
]
let private testCasesWidthInfererBuses : WidhtInfererTestCase list = [
"Two inputs connected to a MergeWires component. No other connections", stateBus1,
[
ConnectionId "conn0", Some 1
ConnectionId "conn1", Some 1
] |> Map.ofList |> Ok
"A MergeWires connected to a SplitWire 1.", stateBus2,
[
ConnectionId "conn0", None
] |> Map.ofList |> Ok
"A MergeWires connected to a SplitWire 1 and a single-bit output node", stateBus3,
[
ConnectionId "conn0", None
ConnectionId "conn1", None
] |> Map.ofList |> Ok
"A MergeWires connected to a SplitWire 1, with loop", stateBus4,
[
ConnectionId "conn0", None
ConnectionId "conn1", None
] |> Map.ofList |> Ok
"All the bus components in series, properly connected. No other components", stateBus6,
[
ConnectionId "conn0", None
ConnectionId "conn1", None
ConnectionId "conn2", None
ConnectionId "conn3", None
ConnectionId "conn4", None
] |> Map.ofList |> Ok
"Non-inferrable loop", stateBus7,
[
ConnectionId "conn0", None
ConnectionId "conn1", None
] |> Map.ofList |> Ok
"Mux connected to two MergeWires. Width not inferrable", stateBus8,
[
ConnectionId "conn0", None
ConnectionId "conn1", None
] |> Map.ofList |> Ok
"A 4 bit input connected to a four bit output", stateBus13,
[
ConnectionId "conn", Some 4
] |> Map.ofList |> Ok
"A 2 bit input split into 2 single bit outputs", stateBus16,
[
ConnectionId "conn0", Some 2
ConnectionId "conn1", Some 1
ConnectionId "conn2", Some 1
] |> Map.ofList |> Ok
"3 bit input merged with 4 bit input, then split in the same way", stateBus17,
[
ConnectionId "678ffa07-0ed7-7b6f-ba9b-b14839c08a71", Some 7
ConnectionId "7438de0c-bbaf-c1f6-0307-42ece66c6c00", Some 4
ConnectionId "82cc4ce9-7b15-40ac-0226-98a7f8e2fb9a", Some 4
ConnectionId "9df32195-00b4-9795-3dc1-78fb70d453f2", Some 3
ConnectionId "cd13c70f-6037-0cf4-1295-5795e92d745c", Some 3
] |> Map.ofList |> Ok
"Partially connected Mux2", stateBus18,
[
ConnectionId "conn-sel", Some 1
ConnectionId "conn-top-input", Some 2
ConnectionId "conn-to-output", Some 2
] |> Map.ofList |> Ok
"Partially connected Demux2", stateBus20,
[
ConnectionId "conn-to-input", Some 2
ConnectionId "conn-to-output", Some 2
] |> Map.ofList |> Ok
]
let private testCasesWidthInfererError : WidhtInfererTestCase list = [
"Two inputs connected to the same output", state5,
Error {
Msg = "A wire must have precisely one driving component. If you want to merge two wires together, use a MergeWires component."
ConnectionsAffected = ["conn1"; "conn0"] |> List.map ConnectionId
}
"Two inputs; one And; one output; with extra connection input to output", state7,
Error {
Msg = "A wire must have precisely one driving component. If you want to merge two wires together, use a MergeWires component."
ConnectionsAffected = ["conn3"; "conn2"] |> List.map ConnectionId
}
"And connected to a SplitWire 1", stateBus9,
Error {
Msg = "Wrong wire width. Target port expects a signal with at least 2 bits, but source port produces a 1 bit(s) signal."
ConnectionsAffected = ["conn0"] |> List.map ConnectionId
}
"A 4 bit input connected to a 3 bit output", stateBus14,
Error {
Msg = "Wrong wire width. Target port expects a 3 bit(s) signal, but source port produces a 4 bit(s) signal."
ConnectionsAffected = ["conn"] |> List.map ConnectionId
}
"A 3 bit input connected to a 4 bit output", stateBus15,
Error {
Msg = "Wrong wire width. Target port expects a 4 bit(s) signal, but source port produces a 3 bit(s) signal."
ConnectionsAffected = ["conn"] |> List.map ConnectionId
}
"Fully connected Mux, but two inputs have different widths", stateBus19,
Error {
Msg = "Wrong wire width. The two inputs to a multiplexer are expected to have the same width, but top input has 2 bits and bottom input has 1 bits."
ConnectionsAffected = ["conn-top-input"; "conn-bottom-input"] |> List.map ConnectionId
}
]
let testCasesWidthInferer : WidhtInfererTestCase list =
testCasesWidthInfererSimple @
testCasesWidthInfererBuses @
testCasesWidthInfererError

59
Tests/logStateToFSharp.py Normal file
View file

@ -0,0 +1,59 @@
# Python script that helps transforming the result of logging a file back into
# an f# data structure.
# Useful when writing the CanvasStates for the tests.
import re
state = """
[
{Id = 8078a917-236f-5a40-18a6-8e2d6a1458f5;Type = Input 2;Label = a;InputPorts = [];OutputPorts = [{Id = cc7c6510-d49b-28d9-e0bc-d5350a2c76a8;PortNumber = 0;PortType = Output;HostId = 8078a917-236f-5a40-18a6-8e2d6a1458f5}];X = 122;Y = 125};
{Id = fbfb4202-9816-f214-0401-da18caddeb0f;Type = Demux2;Label = ;InputPorts = [{Id = 2b224026-609a-5eae-6885-ff9820dbae5f;PortNumber = 0;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}; {Id = 68043f9b-47e7-793f-fed2-943a7d7336dc;PortNumber = 1;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}];OutputPorts = [{Id = 57070484-347e-4701-8c36-f510c2ef150c;PortNumber = 0;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}; {Id = 123463bf-7868-9a87-6fb1-36627a3c9bad;PortNumber = 1;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f}];X = 254;Y = 110};
{Id = 00661085-7d05-4185-09ef-4138ac918ad2;Type = Output 2;Label = aa;InputPorts = [{Id = 7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45;PortNumber = 0;PortType = Input;HostId = 00661085-7d05-4185-09ef-4138ac918ad2}];OutputPorts = [];X = 401;Y = 117}
],
[
{Id = 1ef71074-fa16-a068-84a0-18d324e3ada6;Source = {Id = 57070484-347e-4701-8c36-f510c2ef150c;PortNumber = null;PortType = Output;HostId = fbfb4202-9816-f214-0401-da18caddeb0f};Target = {Id = 7bbfa7d3-4718-e6fe-e7e9-8c00e5257f45;PortNumber = null;PortType = Input;HostId = 00661085-7d05-4185-09ef-4138ac918ad2};Vertices = [284,126.66666666666667; 343.5,126.66666666666667; 343.5,127; 401,127]};
{Id = f326a7a3-79d5-4ace-f0cf-606657fc2c42;Source = {Id = cc7c6510-d49b-28d9-e0bc-d5350a2c76a8;PortNumber = null;PortType = Output;HostId = 8078a917-236f-5a40-18a6-8e2d6a1458f5};Target = {Id = 2b224026-609a-5eae-6885-ff9820dbae5f;PortNumber = null;PortType = Input;HostId = fbfb4202-9816-f214-0401-da18caddeb0f};Vertices = [152,135; 254,135]}
]
"""
def applyAll(functions, init):
res = init
for f in functions:
res = f(res)
return res
def addQuotesId(str):
return re.sub(r'Id = ([0-9a-z\-]*)', r'Id = "\1"', str)
def addQuotesLabel(str):
return re.sub(r'Label = ([0-9a-zA-Z\-]*)', r'Label = "\1"', str)
def addPortTypeDot(str):
return re.sub(r'PortType = (Input|Output)', r'PortType = PortType.\1', str)
def replaceNull(str):
return re.sub(r'PortNumber = null;', r'PortNumber = None;', str)
def replacePortNumberSome(str):
return re.sub(r'PortNumber = (\d);', r'PortNumber = Some \1;', str)
def replaceCustomName(str):
return re.sub(r'Name = ([0-9a-zA-Z\-]*)', r'Name = "\1"', str)
def replaceLabels(str):
return re.sub(r'InputLabels = [([0-9a-zA-Z\-]*); ]', r'Label = "\1"', str)
def replaceFloat(str):
return re.sub(r'(\d\d+)(,|;|])', r'\1.0\2', str)
functions = [
addQuotesId,
addQuotesLabel,
addPortTypeDot,
replaceNull,
replacePortNumberSome,
replaceCustomName,
replaceFloat,
]
print(applyAll(functions, state))

13
Tests/paket.references Normal file
View file

@ -0,0 +1,13 @@
group Electron
Fable.Core
Fable.Browser.Dom
Fable.Electron
Fable.Elmish
Fable.Elmish.React
Fable.Elmish.Debugger
Fable.Elmish.HMR
Fable.Node
Fable.Promise
Fable.React
Fulma
Fable.SimpleJson

6
build.cmd Normal file
View file

@ -0,0 +1,6 @@
@echo off
cls
dotnet tool restore
dotnet paket install
:: dotnet restore build.proj
dotnet fake build -t %*

99
build.fsx Normal file
View file

@ -0,0 +1,99 @@
#r "paket: groupref FakeBuild //"
#load ".fake/build.fsx/intellisense.fsx"
#if !FAKE
#r "netstandard"
#r "Facades/netstandard" // https://github.com/ionide/ionide-vscode-fsharp/issues/839#issuecomment-396296095
#endif
open System
open Fake.Core
open Fake.Core.TargetOperators
open Fake.DotNet
open Fake.IO
open Fake.IO.Globbing.Operators
open Fake.IO.FileSystemOperators
open Fake.JavaScript
Target.create "CleanDev" (fun _ ->
!! "src/**/bin"
++ "src/**/obj"
++ "dist"
++ ".fable"
|> Shell.cleanDirs
)
Target.create "Clean" (fun _ ->
!! "src/**/bin"
++ "src/**/obj"
++ "dist"
++ ".fable"
|> Shell.cleanDirs
Target.run 1 "KillZombies" []
)
Target.create "CleanFableJS" <| fun _ ->
!! (__SOURCE_DIRECTORY__ @@ "src/**/*.fs.js")
++ (__SOURCE_DIRECTORY__ @@ "src/**/*.map")
|> Seq.toList
|> File.deleteAll
Target.create "CleanNode" <| fun _ ->
Shell.cleanDir (__SOURCE_DIRECTORY__ @@ "node_modules")
File.delete (__SOURCE_DIRECTORY__ @@ "package-lock.json")
Target.create "DotnetRestore" (fun _ ->
Shell.Exec("dotnet","restore issie.sln") |> ignore)
Target.create "NpmInstall" (fun _ ->
Npm.install id
)
Target.create "Build" (fun _ ->
Npm.run "compile" id
)
Target.create "Dev" (fun _ ->
Npm.run "dev" id
)
Target.create "Dist" (fun _ ->
Npm.run "dist" id
)
Target.create "DistDir" (fun _ ->
Npm.run "dist:dir" id
)
Target.create "KillZombies" <| fun _ ->
Fake.Core.Process.killAllByName "issie.exe"
Fake.Core.Process.killAllByName "node"
Fake.Core.Process.killAllByName "dotnet"
// Build order
"CleanFableJS"
==> "Clean"
"CleanFableJS"
==> "CleanDev"
"CleanDev"
==> "DotnetRestore"
==> "NpmInstall"
==> "Build"
"NpmInstall"
==> "Dev"
"NpmInstall"
==> "Dist"
"NpmInstall"
==> "DistDir"
"CleanFableJS"
==> "dev"
// start build
Target.runOrDefaultWithArguments "Dev"

5
build.fsx.lock Normal file
View file

@ -0,0 +1,5 @@
STORAGE: NONE
RESTRICTION: || (== net6.0) (== netstandard2.0)
NUGET
remote: https://api.nuget.org/v3/index.json
FSharp.Core (6.0.1)

785
build.old.fsx Normal file
View file

@ -0,0 +1,785 @@
// --------------------------------------------------------------------------------------
// FAKE build script
// --------------------------------------------------------------------------------------
#nowarn "0213"
#r "paket: groupref FakeBuild //"
#load "./tools/FSharpLint.fs"
#load "./tools/ElectronTools.fs"
#load "./tools/Updating.fs"
#load "./.fake/build.fsx/intellisense.fsx"
open BlackFox.CommandLine
open Fake.Core
open Fake.Core.TargetOperators
open Fake.DotNet
open Fake.JavaScript
open Fake.IO
open Fake.IO.FileSystemOperators
open Fake.IO.Globbing.Operators
open Fake.Net.Http
open Fake.Tools
open Fantomas.FakeHelpers
open Fantomas.FormatConfig
open Tools.Electron
open Tools.Linting
open Tools.Updating
open System
open System.IO
// The name of the project
// (used by attributes in AssemblyInfo, name of a NuGet package and directory in 'src')
let project = "issie"
// Short summary of the project
// (used as description in AssemblyInfo and as a short summary for NuGet package)
let summary = "Schematic editor and Simulator"
// Author(s) of the project
let author = "tomcl"
// File system information
let solutionFile = "issie.sln"
// Build docs website root
let website = "https://tomcl.github.io/issie/docs"
// Github repository
let repo = @"https://github.com/tomcl/issie"
// Web or JS related fs projects
// Projects that have bindings to other languages where name linting needs to be more relaxed.
let relaxedNameLinting =
[ (__SOURCE_DIRECTORY__ @@ "src/Electron/**/*.fs") ]
let netCoreVersions = [ "netcoreapp3.1" ]
// OS runtime targets
let runTimes = ["win-x64";"linux-x64"]
// Read additional information from the release notes document
let release = ReleaseNotes.load (__SOURCE_DIRECTORY__ @@ "RELEASE_NOTES.md")
// Helper active pattern for project types
let (|Fsproj|Csproj|Vbproj|Shproj|) (projFileName:string) =
match projFileName with
| f when f.EndsWith("fsproj") -> Fsproj
| f when f.EndsWith("csproj") -> Csproj
| f when f.EndsWith("vbproj") -> Vbproj
| f when f.EndsWith("shproj") -> Shproj
| _ -> failwith (sprintf "Project file %s not supported. Unknown project type." projFileName)
let tools = __SOURCE_DIRECTORY__ @@ "tools"
let srcGlob = __SOURCE_DIRECTORY__ @@ "src/**/*.??proj"
let fsSrcGlob = __SOURCE_DIRECTORY__ @@ "src/**/*.fs"
let fsTestGlob = __SOURCE_DIRECTORY__ @@ "tests/**/*.fs"
let bin = __SOURCE_DIRECTORY__ @@ "bin"
let temp = __SOURCE_DIRECTORY__ @@ "temp"
let objFolder = __SOURCE_DIRECTORY__ @@ "obj"
let dist = __SOURCE_DIRECTORY__ @@ "dist"
let fable = __SOURCE_DIRECTORY__ @@ ".fable"
let fsProjGlob =
!! (__SOURCE_DIRECTORY__ @@ "src/**/*.fsproj")
++ (__SOURCE_DIRECTORY__ @@ "tests/**/*.fsproj")
let foldExcludeGlobs (g: IGlobbingPattern) (d: string) = g -- d
let foldIncludeGlobs (g: IGlobbingPattern) (d: string) = g ++ d
let fsSrcAndTest =
!! fsSrcGlob
++ fsTestGlob
-- (__SOURCE_DIRECTORY__ @@ "src/**/obj/**")
-- (__SOURCE_DIRECTORY__ @@ "tests/**/obj/**")
-- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*")
-- (__SOURCE_DIRECTORY__ @@ "src/**/**/AssemblyInfo.*")
let fsRelaxedNameLinting =
let baseGlob s =
!! s
-- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*")
-- (__SOURCE_DIRECTORY__ @@ "src/**/obj/**")
-- (__SOURCE_DIRECTORY__ @@ "tests/**/obj/**")
match relaxedNameLinting with
| [h] when relaxedNameLinting.Length = 1 -> baseGlob h |> Some
| h::t -> List.fold foldIncludeGlobs (baseGlob h) t |> Some
| _ -> None
let failOnBadExitAndPrint (p : ProcessResult) =
if p.ExitCode <> 0 then
p.Errors |> Seq.iter Trace.traceError
failwithf "failed with exitcode %d" p.ExitCode
module dotnet =
let tool optionConfig command args =
DotNet.exec (fun p -> { p with WorkingDirectory = tools} |> optionConfig ) (sprintf "%s" command) args
|> failOnBadExitAndPrint
let femto optionConfig args =
tool optionConfig (!!(__SOURCE_DIRECTORY__ @@ "packages/tooling/Femto/tools/**/**/Femto.dll") |> Seq.head) args
let setCmd f args =
match Environment.isWindows with
| true -> Command.RawCommand(f, Arguments.OfArgs args)
| false -> Command.RawCommand("mono", Arguments.OfArgs (f::args))
let configuration() =
FakeVar.getOrDefault "configuration" "Release"
let getEnvFromAllOrNone (s: string) =
let envOpt (envVar: string) =
if String.isNullOrEmpty envVar then None
else Some(envVar)
let procVar = Environment.GetEnvironmentVariable(s) |> envOpt
let userVar = Environment.GetEnvironmentVariable(s, EnvironmentVariableTarget.User) |> envOpt
let machVar = Environment.GetEnvironmentVariable(s, EnvironmentVariableTarget.Machine) |> envOpt
match procVar,userVar,machVar with
| Some(v), _, _
| _, Some(v), _
| _, _, Some(v)
-> Some(v)
| _ -> None
// --------------------------------------------------------------------------------------
// Initialisation and fixup actions
Target.create "Init" <| fun _ ->
Fake.IO.File.delete (__SOURCE_DIRECTORY__ @@ ".paket/Paket.Restore.Targets")
Fake.IO.Directory.delete (__SOURCE_DIRECTORY__ @@ "packet_files")
Target.create "KillCreated" <| fun _ ->
Fake.Core.Process.killAllCreatedProcesses()
Target.create "KillZombies" <| fun _ ->
Fake.Core.Process.killAllByName "issie.exe"
Fake.Core.Process.killAllByName "node"
Fake.Core.Process.killAllByName "dotnet"
// --------------------------------------------------------------------------------------
// Set configuration mode based on target
Target.create "ConfigDebug" <| fun _ ->
FakeVar.set "configuration" "Debug"
Target.create "ConfigRelease" <| fun _ ->
FakeVar.set "configuration" "Release"
// --------------------------------------------------------------------------------------
// Generate assembly info files with the right version & up-to-date information
Target.create "AssemblyInfo" <| fun _ ->
let getAssemblyInfoAttributes projectName =
[ AssemblyInfo.Title (projectName)
AssemblyInfo.Product project
AssemblyInfo.Description summary
AssemblyInfo.Version release.AssemblyVersion
AssemblyInfo.FileVersion release.AssemblyVersion
AssemblyInfo.Configuration <| configuration()
AssemblyInfo.InternalsVisibleTo (sprintf "%s.Tests" projectName) ]
let getProjectDetails projectPath =
let projectName = Path.GetFileNameWithoutExtension(projectPath)
( projectPath,
projectName,
Path.GetDirectoryName(projectPath),
(getAssemblyInfoAttributes projectName)
)
!! srcGlob
|> Seq.map getProjectDetails
|> Seq.iter (fun (projFileName, _, folderName, attributes) ->
match projFileName with
| Fsproj -> AssemblyInfoFile.createFSharp (folderName </> "AssemblyInfo.fs") attributes
| Csproj -> AssemblyInfoFile.createCSharp ((folderName </> "Properties") </> "AssemblyInfo.cs") attributes
| Vbproj -> AssemblyInfoFile.createVisualBasic ((folderName </> "My Project") </> "AssemblyInfo.vb") attributes
| Shproj -> () )
// --------------------------------------------------------------------------------------
// Update package.json version & name
Target.create "PackageJson" <| fun _ ->
let setValues (current: Json.JsonPackage) =
{ current with
Name = Str.toKebabCase project |> Some
Description = summary |> Some
Version = release.NugetVersion |> Some
Repository =
match current.Repository with
| Some(r) ->
{ r with
Json.RepositoryValue.Type = "git" |> Some
Json.RepositoryValue.Url = repo + ".git" |> Some }
| _ ->
{ Json.RepositoryValue.Type = "git" |> Some
Json.RepositoryValue.Url = repo + ".git" |> Some
Json.RepositoryValue.Directory = None }
|> Some
Author = author |> Some
License = (File.readLine(__SOURCE_DIRECTORY__ @@ "LICENSE.md").Split(' ')) |> Array.head |> Some
Bugs = { Json.BugsValue.Url = (repo + "/issues" |> Some) } |> Some
Homepage = repo |> Some }
Json.setJsonPkg setValues
// --------------------------------------------------------------------------------------
// Copies binaries from default VS location to expected bin folder
// But keeps a subdirectory structure for each project in the
// src folder to support multiple project outputs
Target.create "CopyBinaries" <| fun _ ->
!! srcGlob
-- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj")
-- (__SOURCE_DIRECTORY__ @@ "src/**/Electron.Fable.fsproj")
|> Seq.map (fun f -> ((Path.getDirectory f) @@ "bin" @@ configuration(), "bin" @@ (Path.GetFileNameWithoutExtension f)))
|> Seq.iter (fun (fromDir, toDir) -> Shell.copyDir toDir fromDir (fun _ -> true))
// --------------------------------------------------------------------------------------
// Clean tasks
Target.create "Clean" <| fun _ ->
let clean() =
!! (__SOURCE_DIRECTORY__ @@ "tests/**/bin")
++ (__SOURCE_DIRECTORY__ @@ "tests/**/obj")
++ (__SOURCE_DIRECTORY__ @@ "tools/bin")
++ (__SOURCE_DIRECTORY__ @@ "tools/obj")
++ (__SOURCE_DIRECTORY__ @@ "src/**/bin")
++ (__SOURCE_DIRECTORY__ @@ "src/**/obj")
|> Seq.toList
|> List.append [bin; temp; objFolder; dist; fable]
|> Shell.cleanDirs
TaskRunner.runWithRetries clean 99
Target.create "CleanDocs" <| fun _ ->
let clean() =
Shell.cleanDirs ["docs"]
TaskRunner.runWithRetries clean 99
Target.create "PostBuildClean" <| fun _ ->
let clean() =
!! srcGlob
-- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj")
|> Seq.map (
(fun f -> (Path.getDirectory f) @@ "bin" @@ configuration())
>> (fun f -> Directory.EnumerateDirectories(f) |> Seq.toList )
>> (fun fL -> fL |> List.map (fun f -> Directory.EnumerateDirectories(f) |> Seq.toList)))
|> (Seq.concat >> Seq.concat)
|> Seq.iter Directory.delete
TaskRunner.runWithRetries clean 99
Target.create "PostPublishClean" <| fun _ ->
let clean() =
!! (__SOURCE_DIRECTORY__ @@ "src/**/bin" @@ configuration() @@ "/**/publish")
|> Seq.iter Directory.delete
TaskRunner.runWithRetries clean 99
Target.create "CleanElectronBin" <| fun _ ->
let netCores =
netCoreVersions
|> List.map (fun s -> __SOURCE_DIRECTORY__ @@ "bin/Core" @@ s)
let clean() =
!! (__SOURCE_DIRECTORY__ @@ "bin/Main")
++ (__SOURCE_DIRECTORY__ @@ "bin/Renderer")
++ (__SOURCE_DIRECTORY__ @@ "bin/Common")
++ (__SOURCE_DIRECTORY__ @@ "bin/Simulator")
++ (__SOURCE_DIRECTORY__ @@ "bin/WidthInferer")
|> List.ofSeq
|> Shell.deleteDirs
let runtimeDirs =
runTimes
|> List.map (fun s ->
netCores
|> List.map (fun coreVer -> coreVer @@ s @@ "**"))
|> List.concat
match netCores |> List.tryHead with
| Some(h) ->
!! (h @@ "**")
|> (fun src -> List.fold foldIncludeGlobs src netCores.Tail)
|> (fun src -> List.fold foldExcludeGlobs src runtimeDirs)
|> Seq.iter Shell.rm
| _ -> ()
TaskRunner.runWithRetries clean 99
// --------------------------------------------------------------------------------------
// Restore tasks
let restoreSolution () =
solutionFile
|> DotNet.restore id
Target.create "Restore" <| fun _ ->
TaskRunner.runWithRetries restoreSolution 5
// Add task to make Node.js cli ready
Target.create "YarnInstall" <| fun _ ->
let setParams (defaults:Yarn.YarnParams) =
if Environment.isLinux then
defaults
else
{ defaults with
Yarn.YarnParams.YarnFilePath = (__SOURCE_DIRECTORY__ @@ "packages/tooling/Yarnpkg.Yarn/content/bin/yarn.cmd")
}
Yarn.install setParams
// Build Key.json if necessary from GD_KEY env variable
Target.create "BuildKeys" <| fun _ ->
let jsonPath =
__SOURCE_DIRECTORY__ @@ "src/Core/Key.json"
|> FileInfo.ofPath
let key =
let insertKey s = sprintf "{ \"key\": \"%s\" }" s
getEnvFromAllOrNone "GD_KEY"
|> Option.map (insertKey)
|> defaultArg <| ""
TraceSecrets.register "<GD_KEY Json>" key
if key <> "" && jsonPath.Exists |> not then
File.writeString false jsonPath.FullName key
else ()
// --------------------------------------------------------------------------------------
// Build tasks
Target.create "Build" <| fun _ ->
let setParams (defaults:MSBuildParams) =
{ defaults with
Verbosity = Some(Quiet)
Targets = ["Build"]
Properties =
[
"Optimize", "True"
"DebugSymbols", "True"
"Configuration", configuration()
"Version", release.AssemblyVersion
"GenerateDocumentationFile", "true"
"DependsOnNETStandard", "true"
]
}
restoreSolution()
MSBuild.build setParams solutionFile
Target.create "BuildElectron" <| fun _ ->
Npm.exec "rebuild node-sass" id
Yarn.exec "compile" id
// Run Dev mode
Target.create "Dev" <| fun _ ->
Yarn.exec "dev" id
// Build artifacts
Target.create "DistWin" <| fun _ ->
Yarn.exec "distwin" id
// Build artifacts
Target.create "DistMac" <| fun _ ->
Yarn.exec "distmac" id
// Gets latest docker image to build for linux
Target.create "PullDockerImage" <| fun _ ->
CmdLine.Empty
|> CmdLine.append "pull"
|> CmdLine.append "electronuserland/builder"
|> CmdLine.toString
|> CreateProcess.fromRawCommandLine "docker"
|> CreateProcess.ensureExitCodeWithMessage "Pulling electronuserland/builder docker container failed."
|> Proc.run
|> ignore
// Build artifacts
Target.create "DistLinux" <| fun _ ->
let sandboxPath = @"./node_modules/electron/dist/chrome-sandbox"
CmdLine.Empty
|> CmdLine.append "run"
|> CmdLine.append "--rm"
|> CmdLine.appendRaw (sprintf "-v %s:/project" __SOURCE_DIRECTORY__)
|> CmdLine.appendRaw "-v electron:/root/.cache/electron"
|> CmdLine.appendRaw "-v electron-builder:/root/.cache/electron-builder electronuserland/builder"
|> CmdLine.appendRaw (sprintf "/bin/bash -c \"chown -R root %s && chmod 4755 %s && yarn --link-duplicates --pure-lockfile && yarn distLinux\"" sandboxPath sandboxPath)
|> CmdLine.toString
|> CreateProcess.fromRawCommandLine "docker"
|> CreateProcess.ensureExitCodeWithMessage "Failed to build linux image."
|> Proc.run
|> ignore
// --------------------------------------------------------------------------------------
// Create differentials for updating
Target.create "CreateDiffs" <| fun _ ->
let latestTag = (Git.CommandHelper.runSimpleGitCommand __SOURCE_DIRECTORY__ "describe --tag").Split('-').[0]
let latestRelease =
if Version(release.NugetVersion) <= Version(latestTag.Substring(1)) then
failwith "Cannot create diff of older version"
else
sprintf "https://github.com/Shmew/MordhauBuddy/releases/download/%s" latestTag
let downloadSignature (fi: FileInfo) =
let file =
match fi.Extension with
| ext when ext = ".exe" -> sprintf "MordhauBuddy.Setup.%s%s.sig" (latestTag.Substring(1)) ext
| ext when ext = ".AppImage" -> sprintf "MordhauBuddy-%s%s.sig" (latestTag.Substring(1)) ext
| _ -> failwith "Invalid file extention for generating delta"
sprintf "%s/%s" latestRelease file
|> downloadFile (fi.Directory.FullName @@ file)
!! (__SOURCE_DIRECTORY__ @@ "dist/linux-x64/*.AppImage")
++ (__SOURCE_DIRECTORY__ @@ "dist/win-x64/*.exe")
|> List.ofSeq
|> List.distinct
|> List.iter (fun f ->
let fi = FileInfo.ofPath(f)
genSigNew (sprintf "%s.sig" fi.Name) fi
downloadSignature fi
|> FileInfo.ofPath
|> genDelta fi)
// --------------------------------------------------------------------------------------
// Publish net core applications
Target.create "PublishDotNet" <| fun _ ->
let runPublish (project: string) (framework: string) =
let buildWithRunTime (rt: string) =
let setParams (defaults:MSBuildParams) =
{ defaults with
Verbosity = Some(Quiet)
Targets = ["Publish"]
Properties =
[
"Optimize", "True"
"DebugSymbols", "True"
"Configuration", configuration()
"Version", release.AssemblyVersion
"GenerateDocumentationFile", "true"
"TargetFramework", framework
"SelfContained", "true"
"RuntimeIdentifier", rt
]
}
MSBuild.build setParams project
runTimes |> List.iter buildWithRunTime
!! srcGlob
-- (__SOURCE_DIRECTORY__ @@ "src/**/*.shproj")
-- (__SOURCE_DIRECTORY__ @@ "src/**/*.vbproj")
|> Seq.map
((fun f -> (((Path.getDirectory f) @@ "bin" @@ configuration()), f) )
>>
(fun f ->
Directory.EnumerateDirectories(fst f)
|> Seq.filter (fun frFolder -> frFolder.Contains("netcoreapp"))
|> Seq.map (fun frFolder -> DirectoryInfo(frFolder).Name), snd f))
|> Seq.iter (fun (l,p) -> l |> Seq.iter (runPublish p))
// --------------------------------------------------------------------------------------
// Lint and format source code to ensure consistency
Target.create "Format" <| fun _ ->
let config =
{ FormatConfig.Default with
PageWidth = 120
SpaceBeforeColon = false }
fsSrcAndTest
|> List.ofSeq
|> formatCode config
|> Async.RunSynchronously
|> printfn "Formatted files: %A"
Target.create "Lint" <| fun _ ->
fsSrcAndTest
-- (__SOURCE_DIRECTORY__ @@ "src/**/AssemblyInfo.*")
|> (fun src -> List.fold foldExcludeGlobs src relaxedNameLinting)
|> (fun fGlob ->
match fsRelaxedNameLinting with
| Some(glob) ->
[(false, fGlob); (true, glob)]
| None -> [(false, fGlob)])
|> Seq.map (fun (b,glob) -> (b,glob |> List.ofSeq))
|> List.ofSeq
|> FSharpLinter.lintFiles (__SOURCE_DIRECTORY__ @@ "bin/LintResults.xml")
// --------------------------------------------------------------------------------------
// Validate JavaScript dependencies
Target.create "ValidateJSPackages" <| fun _ ->
let validate () =
fsProjGlob
|> Seq.iter (fun file ->
dotnet.femto id
(sprintf "--resolve %s" file))
TaskRunner.runWithRetries validate 5
// --------------------------------------------------------------------------------------
// Run the unit test binaries
Target.create "RunTests" <| fun _ ->
!! ("tests/**/bin" @@ configuration() @@ "**" @@ "*Tests.exe")
|> Seq.iter (fun f ->
CreateProcess.fromCommand(setCmd f [])
|> CreateProcess.withTimeout (TimeSpan.MaxValue)
|> CreateProcess.ensureExitCodeWithMessage "Tests failed."
|> Proc.run
|> ignore)
// --------------------------------------------------------------------------------------
// Generate Paket load scripts
Target.create "LoadScripts" <| fun _ ->
let frameworks =
__SOURCE_DIRECTORY__ @@ "bin"
|> Directory.EnumerateDirectories
|> Seq.map (fun d ->
Directory.EnumerateDirectories d
|> Seq.map (fun f -> DirectoryInfo(f).Name)
|> List.ofSeq)
|> List.ofSeq
|> List.reduce List.append
|> List.distinct
|> List.reduce (fun acc elem -> sprintf "%s --framework %s" elem acc)
|> function
| e when e.Length > 0 ->
Some (sprintf "--framework %s" e)
| _ -> None
let arguments =
[Some("generate-load-scripts"); frameworks]
|> List.choose id
|> List.reduce (fun acc elem -> sprintf "%s %s" acc elem)
arguments
|> CreateProcess.fromRawCommandLine ((__SOURCE_DIRECTORY__ @@ ".paket") @@ "paket.exe")
|> CreateProcess.withTimeout (TimeSpan.MaxValue)
|> CreateProcess.ensureExitCodeWithMessage "Failed to generate paket load scripts."
|> Proc.run
|> ignore
// --------------------------------------------------------------------------------------
// Generate the documentation
// Paths with template/source/output locations
let content = __SOURCE_DIRECTORY__ @@ "docsrc/content"
let output = __SOURCE_DIRECTORY__ @@ "docs"
let files = __SOURCE_DIRECTORY__ @@ "docsrc/files"
let templates = __SOURCE_DIRECTORY__ @@ "docsrc/tools/templates"
let formatting = __SOURCE_DIRECTORY__ @@ "packages/formatting/FSharp.Formatting"
let toolPath = __SOURCE_DIRECTORY__ @@ "packages/formatting/FSharp.Formatting.CommandTool/tools/fsformatting.exe"
let docTemplate = "docpage.cshtml"
Target.create "LocalDocs" <| fun _ ->
FakeVar.set "Website" website // for now we never generate local docs
Target.create "ReleaseDocs" <| fun _ ->
FakeVar.set "Website" website
// Specify more information about your project
let info () =
[ "project-name", project
"project-author", author
"project-summary", summary
"project-repo", repo
"root", FakeVar.getOrDefault "Website" website ]
let referenceBinaries = []
let layoutRootsAll = new Collections.Generic.Dictionary<string, string list>()
layoutRootsAll.Add("en",[ templates;
formatting @@ "templates"
formatting @@ "templates/reference" ])
Target.create "ReferenceDocs" <| fun _ ->
Directory.ensure (output @@ "reference")
let lDirs =
DirectoryInfo.getSubDirectories <| DirectoryInfo bin
|> Array.map DirectoryInfo.getSubDirectories
|> Array.reduce Array.append
|> Array.map (fun x -> x.FullName.ToLower())
|> List.ofArray
printfn "lDirs=%A" lDirs
let binaries () =
let manuallyAdded =
referenceBinaries
|> List.map (fun b -> bin @@ b)
let conventionBased =
DirectoryInfo.getSubDirectories <| DirectoryInfo bin
|> Array.collect (fun d ->
let name, dInfo =
let netFrameworkBin =
DirectoryInfo.getSubDirectories d |> Array.filter(fun x -> x.FullName.ToLower().Contains("net4"))
let netCoreBin =
DirectoryInfo.getSubDirectories d |> Array.filter(fun x -> x.FullName.ToLower().Contains("netcoreapp"))
match netFrameworkBin.Length > 0 with
| true ->
d.Name, netFrameworkBin |> Array.head
| false ->
d.Name, netCoreBin |> Array.head
dInfo.GetFiles()
|> Array.filter (fun x ->
x.Name.ToLower() = (sprintf "%s.dll" name).ToLower()
|| x.Name.ToLower() = (sprintf "%s.exe" name).ToLower())
|> Array.map (fun x -> x.FullName))
|> List.ofArray
conventionBased @ manuallyAdded
printfn "Binaries=%A" (binaries())
binaries()
|> FSFormatting.createDocsForDlls (fun args ->
{ args with
OutputDirectory = output @@ "reference"
LayoutRoots = layoutRootsAll.["en"]
ProjectParameters = info()
LibDirs = lDirs
ToolPath = toolPath
SourceRepository = repo @@ "tree/master" })
let copyFiles () =
Shell.copyRecursive files output true
|> Trace.logItems "Copying file: "
Directory.ensure (output @@ "content")
Shell.copyRecursive (formatting @@ "styles") (output @@ "content") true
|> Trace.logItems "Copying styles and scripts: "
Target.create "Docs" <| fun _ ->
File.delete "docsrc/content/release-notes.md"
Shell.copyFile "docsrc/content/" "RELEASE_NOTES.md"
Shell.rename "docsrc/content/release-notes.md" "docsrc/content/RELEASE_NOTES.md"
DirectoryInfo.getSubDirectories (DirectoryInfo.ofPath templates)
|> Seq.iter (fun d ->
let name = d.Name
if name.Length = 2 || name.Length = 3 then
layoutRootsAll.Add(
name, [templates @@ name
formatting @@ "templates"
formatting @@ "templates/reference" ]))
copyFiles ()
for dir in [ content ] do
let langSpecificPath(lang, path:string) =
path.Split([|'/'; '\\'|], StringSplitOptions.RemoveEmptyEntries)
|> Array.exists(fun i -> i = lang)
let layoutRoots =
let key = layoutRootsAll.Keys |> Seq.tryFind (fun i -> langSpecificPath(i, dir))
match key with
| Some lang -> layoutRootsAll.[lang]
| None -> layoutRootsAll.["en"] // "en" is the default language
FSFormatting.createDocs (fun args ->
{ args with
Source = content
OutputDirectory = output
LayoutRoots = layoutRoots
ProjectParameters = info()
Template = docTemplate })
Target.create "GenerateDocs" ignore
// --------------------------------------------------------------------------------------
// Release Scripts
Target.create "GitPush" <| fun p ->
let msg =
p.Context.Arguments
|> List.choose (fun s ->
match s.StartsWith("--Msg=") with
| true -> Some(s.Substring 6)
| false -> None)
|> List.tryHead
|> function
| Some(s) -> s
| None -> (sprintf "Bump version to %s" release.NugetVersion)
Git.Staging.stageAll ""
Git.Commit.exec "" msg
Git.Branches.push ""
Target.create "GitTag" <| fun _ ->
Git.Branches.tag "" release.NugetVersion
Git.Branches.pushTag "" "origin" release.NugetVersion
// --------------------------------------------------------------------------------------
// Run all targets by default. Invoke 'build -t <Target>' to override
Target.create "All" ignore
Target.create "Release" ignore
Target.create "UpdateDocs" ignore
Target.create "AllDev" ignore
Target.create "QDev" <| fun _ ->
Yarn.exec "dev" id
"Clean"
==> "AssemblyInfo"
==> "Restore"
==> "YarnInstall"
==> "Build"
==> "BuildElectron"
==> "PostBuildClean"
==> "CopyBinaries"
"Build" ==> "RunTests"
"Build"
==> "PostBuildClean"
==> "PublishDotNet"
==> "PostPublishClean"
==> "CopyBinaries"
"Restore" ==> "Lint"
"Restore" ==> "Format"
"Lint"
?=> "Build"
?=> "RunTests"
?=> "CleanDocs"
"CopyBinaries"
==> "CleanDocs"
==> "Docs"
==> "ReferenceDocs"
==> "GenerateDocs"
?=> "CleanElectronBin"
"Clean"
==> "GitPush"
?=> "GitTag"
"All" <== [ "CleanElectronBin"]
"AllDev" <== ["CleanElectronBin"]
"All" ?=> "Release"
"LocalDocs" ?=> "All"
"ReleaseDocs" ?=> "All"
"ConfigDebug" ?=> "Clean"
"ConfigRelease" ?=> "Clean"
"PullDockerImage"
==> "DistLinux"
"YarnInstall"
==> "DistWin"
"DistWin" ?=> "DistLinux"
"Dev" <== ["All"; "LocalDocs"; "ConfigDebug"]
"DistWin" <== ["All"; "ConfigRelease"]
"DistLinux" <== ["All"; "ConfigRelease"]
"Release" <== ["All"; "ConfigRelease"; "DistWin"; "DistLinux"]
"UpdateDocs" <== ["All"; "ReleaseDocs"; "ConfigRelease"]
Target.runOrDefaultWithArguments "Dev"

25
build.proj Normal file
View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<RepoRootDir>$([System.IO.Path]::GetFullPath("$(MSBuildThisFileDirectory)"))</RepoRootDir>
<BuildDependsOn>
</BuildDependsOn>
<CoreBuildDependsOn>
</CoreBuildDependsOn>
</PropertyGroup>
<Target Name="Build">
<Exec IgnoreStandardErrorWarningFormat="true" Command="fake build" WorkingDirectory="$(RepoRootDir)" />
</Target>
<Target Name="Pack">
</Target>
<Target Name="Test">
</Target>
<Target Name="VSTest" DependsOnTargets="Test" />
<Import Project=".paket\Paket.Restore.targets" />
</Project>

17
build.sh Executable file
View file

@ -0,0 +1,17 @@
#!/usr/bin/env bash
# to properly set Travis permissions: https://stackoverflow.com/questions/33820638/travis-yml-gradlew-permission-denied
# git update-index --chmod=+x fake.sh
# git commit -m "permission access for travis"
set -eu
set -o pipefail
dotnet tool restore
dotnet paket install
# dotnet restore build.proj
if [ ! -f build.fsx ]; then
dotnet fake run init.fsx
fi
dotnet fake build $@

BIN
build/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

48
docs/Contact.html Normal file
View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>
Contact
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Schematic Editor and Simulator" />
<meta name="author" content="tomcl" />
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
<link rel="stylesheet" href="content/style.css" />
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<h><a name="Home" href="index.html"></a></h>
<div class="topnav">
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
<a href="UserGuide.html">User Guide</a>
<a href="DeveloperInfo.html">Developer Info</a>
<a href="https://github.com/tomcl/issie/wiki/Issie-Blog"> Issie Blog</a>
<a href="Contact.html">Contact</a>
<div class="topnav-right">
<a href="Download.html">Download</a>
</div>
</div>
<div class="GeneralText">
<div class="section"><h1><a name="General" href="#General">General Issues</a></h1></div>
<p>
If you encounter any problems using or downloading the software, please see the <a href="https://github.com/tomcl/issie/issues">Gihub Issue</a> page, or <a href="https://github.com/tomcl/issie/issues/new">create a new issue</a> on the ISSIE GitHub repository.
Any feedback and suggestions are also welcome!
</p><br>
</div>
</body>
</html>

64
docs/DeveloperInfo.html Normal file
View file

@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>
Developer Info
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Schematic Editor and Simulator" />
<meta name="author" content="tomcl" />
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
<link rel="stylesheet" href="content/style.css" />
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<h><a name="Home" href="index.html"></a></h>
<div class="topnav">
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
<a href="UserGuide.html">User Guide</a>
<a href="DeveloperInfo.html">Developer Info</a>
<a href="https://github.com/tomcl/issie/wiki/Issie-Blog"> Issie Blog</a>
<a href="Contact.html">Contact</a>
<div class="topnav-right">
<a href="Download.html">Download</a>
</div>
</div>
<div class="GeneralText">
<div class="section"><h1><a name="Background-and-Technical-Details" class="anchor" href="#Background-and-Technical-Details">Background and Technical Details</a></h1></div>
<p>
Marco's <a href="https://tomcl.github.com/issie/marco-report.pdf">Dissertation</a> or his <a href="https://tomcl.github.com/issie/marco-poster.pdf">Poster</a>.
</p><br>
<div class="section"><h1><a name="Documentation" class="anchor" href="#Documentation">Documentation</a></h1></div>
<ul>
<li>Issie is designed to be usable without needing a User Manual. Developer information can be found in the
Github <a href="https://github.com/tomcl/issie/blob/master/README.md">README</a>.
</li>
</ul><br>
<div class="section"><h1><a name="Contributing" class="anchor" href="#Contributing">Contributing</a></h1></div>
<p>
The project is hosted on <a href="https://github.com/tomcl/issie">Github</a> where you can <a href="https://github.com/tomcl/issie/issues">report issues</a>, fork the project and submit pull
requests. Please take a look at the <a href="contributing.html">contribution guidelines</a> for more information. Contact <a href="https://www.imperial.ac.uk/people/t.clarke">Tom Clarke</a>
for more information about development.
</p><br>
</div>
</body>
</html>

62
docs/Download.html Normal file
View file

@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>
Download
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Schematic Editor and Simulator" />
<meta name="author" content="tomcl" />
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
<link rel="stylesheet" href="content/style.css" />
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<h><a name="Home" href="index.html"></a></h>
<div class="topnav">
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
<a href="UserGuide.html">User Guide</a>
<a href="DeveloperInfo.html">Developer Info</a>
<a href="https://github.com/tomcl/issie/wiki/Issie-Blog"> Issie Blog</a>
<a href="Contact.html">Contact</a>
<div class="topnav-right">
<a href="Download.html">Download</a>
</div>
</div>
<div class="GeneralText">
<div class="section"><h1><a name="Downloadlinks" href="#DownloadLinks">Download Links</a></h1></div>
<p>
Latest stable release: <a href="https://github.com/tomcl/issie/releases/latest">Click here</a> for the latest GitHub release page, where the latest .zip and .tar file can be found.
<br><br>
Possibly unstable: <a href="https://github.com/tomcl/issie/zipball/master">Download latest master .zip</a>
</p><br>
<div class="section"><h1><a name="SystemRequirements" href="#SystemRequirements">System Requirements</a></h1></div>
<p>
Currently no known incompatibilities. Linux users can run the windows .zip file under WINE.
See <a href="https://github.com/tomcl/issie/blob/master/README.md#getting-started">Getting Started</a> for information about how to run the binaries.
</p><br>
<div class="section"><h1><a name="ReleaseNotes" href="#ReleaseNotes">Release Notes</a></h1></div>
<p>
All releases: <a href="https://github.com/tomcl/issie/releases">Click here</a>
<br>
<br>
Latest release notes: <a href="https://github.com/tomcl/issie/releases/latest">Click here</a>
</p>
</div>
</body>
</html>

85
docs/UserGuide.html Normal file
View file

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>
User Guide
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Schematic Editor and Simulator" />
<meta name="author" content="tomcl" />
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
<link rel="stylesheet" href="content/style.css" />
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<h><a name="Home" href="index.html"></a></h>
<div class="topnav">
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
<a href="UserGuide.html">User Guide</a>
<a href="DeveloperInfo.html">Developer Info</a>
<a href="Contact.html">Contact</a>
<div class="topnav-right">
<a href="Download.html">Download</a>
</div>
</div>
<div class="GeneralText">
<div id="toc_container">
<p class="toc_title">Contents</p>
<ul class="toc_list">
<li>
<a href="#ProjectInfo">1 Project Info</a>
<ul>
<li><a href="#CreatingProject">1.1 Creating a project</a></li>
<li><a href="#Saving">1.2 Saving a project</a></li>
<li><a href="#DesignSheets">1.3 Design sheets</a></li>
<li><a href="#Exiting">1.4 Exiting the program</a></li>
</ul>
</li>
<li>
<a href="#Components">2 Components</a>
<ul>
<li><a href="#Catalogue">2.1 Catalogue</a></li>
<li><a href="#AddingComponents">2.2 Adding Components</a></li>
<li><a href="#EditingComponents">2.3 Editing Components</a></li>
<li><a href="#MovingComponents">2.4 Moving Components</a></li>
<li><a href="#DeletingComponents">2.5 Deleting Components</a></li>
</ul>
</li>
<li>
<a href="#Wires">3 Wires</a>
<ul>
<li><a href="#Auto-routing">3.1 Auto-routing</a></li>
<li><a href="#Manual-routing">3.2 Manual-routing</a></li>
</ul>
</li>
<li><a href="#WidthInference">4 Width Inference</a></li>
<li>
<a href="#Simulation">5 Circuit Simulation</a>
<ul>
<li><a href="#StepSimulation">5.1 Step Simulation</a></li>
<li><a href="#WaveformSimulation">5.2 Waveform Simulation</a></li>
</ul>
</li>
<li><a href="#Verilog">6 Verilog Output</a></li>
<li><a href="#Memory">7 Memory Editor</a></li>
</ul>
</div>
<br>
<p>
CURRENTLY IN PROGRESS, CHECK BACK SOON!
</p>
</div>
</body>
</html>

2
docs/blog.md Normal file
View file

@ -0,0 +1,2 @@

62
docs/community.html Normal file
View file

@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Community
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content="Schematic editor and Simulator"/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1><a name="Community" class="anchor" href="#Community">Community</a></h1>
<p>This presently just has the Announcements page, but more may be added in the future.</p>
<h2><a name="Announcements" class="anchor" href="#Announcements">Announcements</a></h2>
<p>*</p>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

BIN
docs/content/github.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

BIN
docs/content/img/github.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

BIN
docs/content/img/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

394
docs/content/style.css Normal file
View file

@ -0,0 +1,394 @@
@import url(https://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans+Mono|Open+Sans:400,600,700);
@import url('https://fonts.googleapis.com/css2?family=Inconsolata:wght@200;300;400;500;600;700;800;900&display=swap');
/* COLOUR THEME */
/*
Backround (white): #FBFFFE
Highlight/secondary background (yellow): #FAA916
Highlight (blue): #01ABAA
TextColour (off black): #272838
*/
/*--------------------------------------------------------------------------
Formatting for F# code snippets
/*--------------------------------------------------------------------------*/
/* strings --- and stlyes for other string related formats */
span.s {
color: #E0E268;
}
/* printf formatters */
span.pf { color:#E0C57F; }
/* escaped chars */
span.e { color:#EA8675; }
/* identifiers --- and styles for more specific identifier types */
span.id { color:#d1d1d1; }
/* module */
span.m { color:#43AEC6; }
/* reference type */
span.rt { color:#43AEC6; }
/* value type */
span.vt { color:#43AEC6; }
/* interface */
span.if{ color:#43AEC6; }
/* type argument */
span.ta { color:#43AEC6; }
/* disposable */
span.d { color:#43AEC6; }
/* property */
span.prop { color:#43AEC6; }
/* punctuation */
span.p { color:#43AEC6; }
/* function */
span.f { color:#e1e1e1; }
/* active pattern */
span.pat { color:#4ec9b0; }
/* union case */
span.u { color:#4ec9b0; }
/* enumeration */
span.e { color:#4ec9b0; }
/* keywords */
span.k { color:#FAB11D; }
/* comment */
span.c { color:#808080; }
/* operators */
span.o { color:#af75c1; }
/* numbers */
span.n { color:#96C71D; }
/* line number */
span.l { color:#80b0b0; }
/* mutable var or ref cell */
span.v { color:#d1d1d1; font-weight: bold; }
/* inactive code */
span.inactive { color:#808080; }
/* preprocessor */
span.prep { color:#af75c1; }
/* fsi output */
span.fsi { color:#808080; }
/* omitted */
span.omitted {
background:#3c4e52;
border-radius:5px;
color:#808080;
padding:0px 0px 1px 0px;
}
/* tool tip */
div.tip {
background:#475b5f;
border-radius:4px;
font:11pt 'Droid Sans', arial, sans-serif;
padding:6px 8px 6px 8px;
display:none;
color:#d1d1d1;
pointer-events:none;
}
table.pre pre {
padding:0px;
margin:0px;
border:none;
}
table.pre, pre.fssnip, pre {
line-height:13pt;
border:1px solid #d8d8d8;
border-collapse:separate;
white-space:pre;
font: 9pt 'Droid Sans Mono',consolas,monospace;
width:90%;
margin:10px 20px 20px 20px;
background-color:#212d30;
padding:10px;
border-radius:5px;
color:#d1d1d1;
max-width: none;
}
pre.fssnip code {
font: 9pt 'Droid Sans Mono',consolas,monospace;
}
table.pre pre {
padding:0px;
margin:0px;
border-radius:0px;
width: 100%;
}
table.pre td {
padding:0px;
white-space:normal;
margin:0px;
}
table.pre td.lines {
width:30px;
}
/*--------------------------------------------------------------------------
Formatting for page & standard document content
/*--------------------------------------------------------------------------*/
body {
font-family: 'Inconsolata', 'Helvetica';
margin: 0;
padding-top: 0px;
padding-bottom: 40px;
}
pre {
word-wrap: inherit;
}
/* Format the heading - nicer spacing etc. */
.masthead {
overflow: hidden;
}
.masthead .muted a {
text-decoration:none;
color:#999999;
}
.masthead ul, .masthead li {
margin-bottom:0px;
}
.masthead .nav li {
margin-top: 15px;
font-size:110%;
}
.masthead h3 {
margin-bottom:5px;
font-size:170%;
}
hr {
margin:0px 0px 20px 0px;
}
/* Make table headings and td.title bold */
td.title, thead {
font-weight:bold;
}
/* Format the right-side menu */
#menu {
margin-top:50px;
font-size:11pt;
padding-left:20px;
}
#menu .nav-header {
font-size:12pt;
color:#606060;
margin-top:20px;
}
#menu li {
line-height:25px;
}
/* -------- NAVIGATION BAR STYLE ---------- */
/* Add a black background color to the top navigation */
.topnav {
background-color: #FAA916;
overflow: hidden;
line-height: 20px;
vertical-align: middle;
font-weight: 600;
flex-direction: column;
}
/* Style the links inside the navigation bar */
.topnav a {
float: left;
margin: 0.5%;
padding: 0.75%;
color: #272838;
text-align: center;
text-decoration: none;
font-size: 18px;
}
/* Change the color of links on hover */
.topnav a:hover {
border-radius: 5px;
background-color: #FBFFFE;
color: #272838;
}
/* Right-aligned section inside the top navigation */
.topnav-right {
flex-direction: column;
overflow: hidden;
vertical-align: middle;
}
.topnav-right a {
float: right;
margin: 0.5%;
padding: 0.75%;
color: #FBFFFE;
background-color: #01ABAA;
border: 1px solid #FBFFFE;
border-radius: 5px;
}
/* -------- PANNEL STYLE ------- */
.IntroBackground {
margin-top: 0.5%;
background: url('../content/img/circuit/circuitcropped.png');
clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 70%);
}
.IntroLayer {
margin-top: 0.5%;
background-color: rgba(250, 169, 22, 0.8);
clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 70%);
}
/* ------- GENERAL TEXT PARAGRAPH STYLE ------ */
.GeneralText {
margin: 5%;
color: #272838;
}
/* -------- TABLE OF CONTENTS STYLE ------- */
#toc_container {
background: rgba(250, 169, 22, 0.65) none repeat scroll 0 0;
border: 3px solid #FAA916;
display: table;
margin-bottom: 1em;
padding: 20px;
width: auto;
}
.toc_title {
font-weight: 700;
text-align: left;
color: #272838
}
#toc_container li, #toc_container ul, #toc_container ul li {
list-style: outside none none !important;
margin-bottom: 5px;
}
/* ------ GENERIC IMAGE FORMATTING -------- */
img {
max-width: 100%;
height: auto;
text-align: center;
width: 50%;
margin-left: auto;
margin-right: auto;
display: block;
}
/* ------- CLASSES TO ADD LINES BETWEEN SECTIONS -------- */
.section {
border-bottom: 1px solid #FAA916;
}
#halfwidth {
width: 50%;
}
/* -------- List formatting --------- */
li{
margin: 10px 0;
}
/* Responsive layout - when the screen is less than 700px wide, make the two columns stack on top of each other instead of next to each other */
@media screen and (max-width: 700px) {
.topnav {
flex-direction: column;
}
.topnav-right {
flex-direction: column;
}
}
/* Responsive layout - when the screen is less than 400px wide, make the navigation links stack on top of each other instead of next to each other */
@media screen and (max-width: 400px) {
.topnav-right {
float: none;
width: 100%;
}
}
/* Change font sizes for headings etc. */
#main h1 { font-size: 26pt; margin:10px 0px 15px 0px; font-weight:400; border: 1px solid #272838; border-width: 0 1px;}
#main h2 { font-size: 20pt; margin:20px 0px 0px 0px; font-weight:400; border-bottom: 1px solid #272838; }
#main h3 { font-size: 14pt; margin:15px 0px 0px 0px; font-weight:600; }
#main p { font-size: 11pt; margin:5px 0px 15px 0px; }
#main ul { font-size: 11pt; margin-top:10px; }
#main li { font-size: 11pt; margin: 5px 0px 5px 0px; }
#main strong { font-weight:700; }
/*--------------------------------------------------------------------------
Formatting for API reference
/*--------------------------------------------------------------------------*/
.type-list .type-name, .module-list .module-name {
width:25%;
font-weight:bold;
}
.member-list .member-name {
width:35%;
}
#main .xmldoc h2 {
font-size:14pt;
margin:10px 0px 0px 0px;
}
#main .xmldoc h3 {
font-size:12pt;
margin:10px 0px 0px 0px;
}
.github-link {
float:right;
text-decoration:none;
}
.github-link img {
border-style:none;
margin-left:10px;
}
.github-link .hover { display:none; }
.github-link:hover .hover { display:block; }
.github-link .normal { display: block; }
.github-link:hover .normal { display: none; }
/*--------------------------------------------------------------------------
Links
/*--------------------------------------------------------------------------*/
h1 a, h1 a:hover, h1 a:focus,
h2 a, h2 a:hover, h2 a:focus,
h3 a, h3 a:hover, h3 a:focus,
h4 a, h4 a:hover, h4 a:focus,
h5 a, h5 a:hover, h5 a:focus,
h6 a, h6 a:hover, h6 a:focus { color : inherit; text-decoration : inherit; outline:none }
/*--------------------------------------------------------------------------
Additional formatting for the homepage
/*--------------------------------------------------------------------------*/
#nuget {
margin-top:20px;
font-size: 11pt;
padding:20px;
}
#nuget pre {
font-size:11pt;
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
background: #404040;
border-style:none;
color: #e0e0e0;
margin-top:15px;
}

View file

@ -0,0 +1,227 @@
@import url(https://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans+Mono|Open+Sans:400,600,700);
/*--------------------------------------------------------------------------
Formatting for F# code snippets
/*--------------------------------------------------------------------------*/
/* identifier */
span.i { color:#000000; }
/* string */
span.s { color:#a31515; }
/* keywords */
span.k { color:#0000ff; }
/* comment */
span.c { color:#008000; }
/* operators */
span.o { color:#000000; }
/* numbers */
span.n { color:#000000; }
/* line number */
span.l { color:#96c2cd; }
/* type or module */
span.t { color:#2b91af; }
/* function */
span.f { color:#0000a0; }
/* DU case or active pattern */
span.p { color:#800080; }
/* mutable var or ref cell */
span.v { color:#000000; font-weight: bold; }
/* printf formatters */
span.pf { color:#2b91af; }
/* escaped chars */
span.e { color:#ff0080; }
/* mutable var or ref cell */
/* inactive code */
span.inactive { color:#808080; }
/* preprocessor */
span.prep { color:#0000ff; }
/* fsi output */
span.fsi { color:#808080; }
/* omitted */
span.omitted {
background:#3c4e52;
border-radius:5px;
color:#808080;
padding:0px 0px 1px 0px;
}
/* tool tip */
div.tip {
background:#e5e5e5;
border-radius:4px;
font:9pt 'Droid Sans', arial, sans-serif;
padding:6px 8px 6px 8px;
display:none;
color:#000000;
pointer-events:none;
}
table.pre pre {
padding:0px;
margin:0px;
border:none;
}
table.pre, pre.fssnip, pre {
line-height:13pt;
border:1px solid #d8d8d8;
border-collapse:separate;
white-space:pre;
font: 10pt consolas,monospace;
width:90%;
margin:10px 20px 20px 20px;
background-color:#fdfdfd;
padding:10px;
border-radius:5px;
color:#000000;
max-width: none;
}
pre.fssnip code {
font: 9pt 'Droid Sans Mono',consolas,monospace;
}
table.pre pre {
padding:0px;
margin:0px;
border-radius:0px;
width: 100%;
}
table.pre td {
padding:0px;
white-space:normal;
margin:0px;
}
table.pre td.lines {
width:30px;
}
/*--------------------------------------------------------------------------
Formatting for page & standard document content
/*--------------------------------------------------------------------------*/
body {
font-family: 'Open Sans', serif;
padding-top: 0px;
padding-bottom: 40px;
}
pre {
word-wrap: inherit;
}
/* Format the heading - nicer spacing etc. */
.masthead {
overflow: hidden;
}
.masthead .muted a {
text-decoration:none;
color:#999999;
}
.masthead ul, .masthead li {
margin-bottom:0px;
}
.masthead .nav li {
margin-top: 15px;
font-size:110%;
}
.masthead h3 {
margin-bottom:5px;
font-size:170%;
}
hr {
margin:0px 0px 20px 0px;
}
/* Make table headings and td.title bold */
td.title, thead {
font-weight:bold;
}
/* Format the right-side menu */
#menu {
margin-top:50px;
font-size:11pt;
padding-left:20px;
}
#menu .nav-header {
font-size:12pt;
color:#606060;
margin-top:20px;
}
#menu li {
line-height:25px;
}
/* Change font sizes for headings etc. */
#main h1 { font-size: 26pt; margin:10px 0px 15px 0px; font-weight:400; }
#main h2 { font-size: 20pt; margin:20px 0px 0px 0px; font-weight:400; }
#main h3 { font-size: 14pt; margin:15px 0px 0px 0px; font-weight:600; }
#main p { font-size: 11pt; margin:5px 0px 15px 0px; }
#main ul { font-size: 11pt; margin-top:10px; }
#main li { font-size: 11pt; margin: 5px 0px 5px 0px; }
#main strong { font-weight:700; }
/*--------------------------------------------------------------------------
Formatting for API reference
/*--------------------------------------------------------------------------*/
.type-list .type-name, .module-list .module-name {
width:25%;
font-weight:bold;
}
.member-list .member-name {
width:35%;
}
#main .xmldoc h2 {
font-size:14pt;
margin:10px 0px 0px 0px;
}
#main .xmldoc h3 {
font-size:12pt;
margin:10px 0px 0px 0px;
}
.github-link {
float:right;
text-decoration:none;
}
.github-link img {
border-style:none;
margin-left:10px;
}
.github-link .hover { display:none; }
.github-link:hover .hover { display:block; }
.github-link .normal { display: block; }
.github-link:hover .normal { display: none; }
/*--------------------------------------------------------------------------
Links
/*--------------------------------------------------------------------------*/
h1 a, h1 a:hover, h1 a:focus,
h2 a, h2 a:hover, h2 a:focus,
h3 a, h3 a:hover, h3 a:focus,
h4 a, h4 a:hover, h4 a:focus,
h5 a, h5 a:hover, h5 a:focus,
h6 a, h6 a:hover, h6 a:focus { color : inherit; text-decoration : inherit; outline:none }
/*--------------------------------------------------------------------------
Additional formatting for the homepage
/*--------------------------------------------------------------------------*/
#nuget {
margin-top:20px;
font-size: 11pt;
padding:20px;
}
#nuget pre {
font-size:11pt;
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
background: #404040;
border-style:none;
color: #e0e0e0;
margin-top:15px;
}

46
docs/content/tips.js Normal file
View file

@ -0,0 +1,46 @@
var currentTip = null;
var currentTipElement = null;
function hideTip(evt, name, unique) {
var el = document.getElementById(name);
el.style.display = "none";
currentTip = null;
}
function findPos(obj) {
// no idea why, but it behaves differently in webbrowser component
if (window.location.search == "?inapp")
return [obj.offsetLeft + 10, obj.offsetTop + 30];
var curleft = 0;
var curtop = obj.offsetHeight;
while (obj) {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
obj = obj.offsetParent;
};
return [curleft, curtop];
}
function hideUsingEsc(e) {
if (!e) { e = event; }
hideTip(e, currentTipElement, currentTip);
}
function showTip(evt, name, unique, owner) {
document.onkeydown = hideUsingEsc;
if (currentTip == unique) return;
currentTip = unique;
currentTipElement = name;
var pos = findPos(owner ? owner : (evt.srcElement ? evt.srcElement : evt.target));
var posx = pos[0];
var posy = pos[1];
var el = document.getElementById(name);
var parent = (document.documentElement == null) ? document.body : document.documentElement;
el.style.position = "absolute";
el.style.left = posx + "px";
el.style.top = posy + "px";
el.style.display = "block";
}

116
docs/contributing.html Normal file
View file

@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Contributing
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content="Schematic editor and Simulator"/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1><a name="Contributing" class="anchor" href="#Contributing">Contributing</a></h1>
<h2><a name="Branching" class="anchor" href="#Branching">Branching</a></h2>
<ul>
<li>Create a feature branch in git.</li>
<li>Fork and clone locally.</li>
</ul>
<h2><a name="Style-Guidelines" class="anchor" href="#Style-Guidelines">Style Guidelines</a></h2>
<ul>
<li>Follow <a href="https://docs.microsoft.com/en-us/dotnet/fsharp/style-guide/formatting">F# Coding Guidelines</a>.</li>
<li>Take into consideration <a href="https://github.com/fsprojects/FSharpLint">FSharpLint</a> output.</li>
<li><a href="https://github.com/fsprojects/fantomas">Fantomas</a> should be run to ensure formatting is consistent.</li>
</ul>
<h2><a name="Testing" class="anchor" href="#Testing">Testing</a></h2>
<p>Testing is done in the tests libraries using <a href="https://github.com/haf/expecto">Expecto</a> which is able to load in any
testing framework you may need, but is strongly encouraged to keep things consistent and use Expecto tests and <a href="https://github.com/fscheck/FsCheck">FsCheck</a>
for any property-based testing.</p>
<ul>
<li>Add test cases where needed.</li>
<li>Tests are run as part of the build process, please ensure they pass.</li>
<li>Note that pure F# should be tested - GUI cannot easily be tested.</li>
</ul>
<h2><a name="Documentation" class="anchor" href="#Documentation">Documentation</a></h2>
<p>Documentation is built dynamically from F# script files and markdown files using <a href="https://github.com/fsprojects/FSharp.Formatting">FSharp.Formatting</a>.
The Reference documentation is dynamically generated, and descriptions specified by using <code>///</code> rather than <code>//</code> for comments, see the Formatting documentation
for more information.</p>
<ul>
<li>Add documentation as necessary, pages can be modified and created in the <code>./docsrc</code> directory.</li>
<li>Documentation is built during the build process.</li>
<li>Consider adding examples if adding new features.</li>
<li><a href="https://daringfireball.net/projects/markdown/syntax">Markdown Syntax</a></li>
</ul>
<h2><a name="Building" class="anchor" href="#Building">Building</a></h2>
<ul>
<li>Build the solution with Visual Studio, <code>build.cmd</code> or <code>build.sh</code>.</li>
<li>All binaries will be in <code>./bin</code> after being built.</li>
<li>
When you're ready to commit the code use `build.cmd/sh -t "Release". This will clean up directories, stage,
and build everything for release. Once you've confirmed it looks good, commit to your branch and make your PR.
</li>
<li>Please note in order to build the Linux images you must have <code>Docker</code> installed.</li>
</ul>
<h2><a name="Releasing" class="anchor" href="#Releasing">Releasing</a></h2>
<ul>
<li>
Create the distributables via the <code>Dist</code> build task, then create the delta and sig files with the <code>CreateDiffs</code> task. Upload all of the files
related to the new version to the release.
</li>
</ul>
<div class="row">
<div class="span1"></div>
<div class="span6">
<img src="img/fake.png" alt="Build process"/>
</div>
</div>
<h2><a name="Merging" class="anchor" href="#Merging">Merging</a></h2>
<ul>
<li>Send a pull request and have it reviewed.</li>
</ul>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
docs/img/fake.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
docs/img/logo-template.pdn Normal file

Binary file not shown.

BIN
docs/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

BIN
docs/img/modAvailable.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

BIN
docs/img/modInstalled.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
docs/img/modInstalling.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
docs/img/mordhauConfig.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
docs/img/settings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

198
docs/index.html Normal file
View file

@ -0,0 +1,198 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>
ISSIE
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Schematic Editor and Simulator" />
<meta name="author" content="tomcl" />
<link rel="icon" type="image/x-icon" href="content/img/icon.ico" />
<link rel="stylesheet" href="content/style.css" />
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<h><a name="Home" href="index.html"></a></h>
<div class="topnav">
<a href="index.html" style="font-size: 30px; font-weight:bolder">ISSIE</a>
<a href="UserGuide.html">User Guide</a>
<a href="DeveloperInfo.html">Developer Info</a>
<a href="https://github.com/tomcl/issie/wiki/Issie-Blog"> Issie Blog</a>
<a href="Contact.html">Contact</a>
<div class="topnav-right">
<a href="Download.html">Download</a>
</div>
</div>
<div class="IntroBackground">
<div class="IntroLayer">
<p style="font-size: 24px; margin-left: 0.5%; font-weight:bolder; color: #272838; text-align: center">
<br><br><br> Discover, Learn & Create with the ISSIE circuit schematic editor!
</p>
<div class="topnav-right">
<a href="#Info">About ISSIE</a>
<a href="#Acknowledgements">Acknowledgements</a>
</div>
<br><br><br><br><br>
</div>
</div>
<div class="GeneralText">
<br><br><br>
<div class="section"><h1><a name="Info" class="anchor" href="#Info">What is Issie?</a></h1></div>
<p>
Issie (Interactive Schematic Simulator and Integrated Editor) is a very easy to use and capable hierarchical block schematic based digital logic editor and simulator,
originally made for the 1st year undergraduate Digital Electronics and Computer Architecture module at the
Department of Electronic and Electrical Engineering, Imperial College London, by 3rd year students at the same institution.
</p>
<p>
Issie has been well tested on designs with up to 15,000 schematic components. We expect it to be reasonably performant on much larger designs as well.
The simulation speed is approximately 2000 component-clocks per ms. Thus a circuit with 1000 components would run at 2000 clocks per second. Issie
creates fully synchronous circuits with a single clock: logic with asynchronous loops is currently not supported.
</p>
<p>
Issie is coded in F# transpiled to Javascript by <a href="http://fable.io">FABLE</a>, and uses a pure F# drawing library.
</p><br>
<div class="section"><h1><a name="Features" class="anchor" href="#Features">Key Features</a></h1></div>
<br>
<div id="toc_container">
<p class="toc_title">Contents</p>
<ul class="toc_list">
<li><a href="#ComponentLibrary">1 Component Library</a></li>
<li><a href="#WireRouting">2 Wire Routing</a></li>
<li><a href="#WidthInference">3 Width Inference</a></li>
<li>
<a href="#Simulation">4 Circuit Simulation</a>
<ul>
<li><a href="#StepSimulation">4.1 Step Simulation</a></li>
<li><a href="#WaveformSimulation">4.2 Waveform Simulation</a></li>
</ul>
</li>
<li><a href="#Verilog">5 Verilog Output</a></li>
<li><a href="#Memory">6 Memory Editor</a></li>
</ul>
</div>
<div class="section" id="halfwidth"><h2><a name="ComponentLibrary" class="anchor" href="#ComponentLibrary">Component Library</a></h2></div>
<p>
ISSIE has an extensive and complete library of components available in the 'Catalogue' menu.
Components include low-level gates and flipflops as
well as larger blocks: RAMs, ROMs, n-bit registers and adders. The lack of HDL-based combinational logic is partly filled by
special components: Bus Select (extracts a bit-field), Bus Compare (decodes a min-term of a bus). Components defined as Verilog
combinational logic are a likely future addition.
</p><br>
<p>
Viewer components are used to (optionally) view simulation waveforms of nodes on subsheets. Wire label components allow any number of
nodes on one design sheet to be connected without visible wires.
</p><br>
<div class="img">
<img src="content/img/circuit/catalog.png" alt="Initial circuit and Component tab" />
</div><br>
<div class="section" id="halfwidth"><h2><a name="WireRouting" class="anchor" href="#WireRouting">Wire Routing</a></h2></div>
<p>
ISSIE schematic component ports are connected using drag-and-drop: each connection represents a wire or bus.
ISSIE has two methods of routing wires: Auto-routing and Manual-routing. Wires will all start out as Auto-routed,
which means that the wire's path is created automatically by the program. This path will update when moving any connected components.
ISSIE also allows for manual routing, where the user may manipulate segments of the wire as desired to make the circuit more readable. Effort has
been put into making this functionality intuitive, with automatic reversion to auto-routing when wire topology changes, and auto-routing of
endpoints when parts of a wire are manually routed.
</p><br>
<div class="section" id="halfwidth"><h2><a name="WidthInference" class="anchor" href="#WidthInference">Width Inference</a></h2></div>
<p>
Wires will automatically be created the correct width using a width inference algorithm.
Wires connecting two ports of incompatible widths will be highlighted red and an error message shown, as will multiply driven wires.
Additional sanity checks (e.g. for combinational loops, or unconnected ports) are made before simulation with errors highlighted visually.
</p><br>
<div class="img">
<img src="content/img/circuit/wireerror.png" alt="Width Inferer Error Message" />
</div><br>
<div class="section" id="halfwidth"><h2><a name="CircuitSimulation" class="anchor" href="#CircuitSimulation">Circuit Simulation</a></h2></div>
<p>
ISSIE includes two simulations in order to inspect and test circuit schematics: The step simulator, and waveform simulator.
This allows users to visualise the information in different ways to best suit their needs and understanding.
</p><br>
<div class="section" id="halfwidth"><h3><a name="StepSimulation" class="anchor" href="#StepSimulation">Step Simulation</a></h3></div>
<p>
Step Simulation allows the user to 'step' or cycle through each clock tick, and view the current design sheet's Output and Viewer component information.
It also allows users to view how the state changes in stateful components such as RAM.
</p><br>
<div class="img">
<img src="content/img/circuit/simulation tab.png" alt="Step simulator example" />
</div><br>
<div class="section" id="halfwidth"><h3><a name="WaveformSimulation" class="anchor" href="#WaveformSimulation">Waveform Simulation</a></h3></div>
<p>
Waveform Simulation allows the user to see the values in each selected connected circuit element (<a href="https://en.wikipedia.org/wiki/Netlist">Netlist</a>) over time as a waveform.
The waveform simulator allows users to move waveforms up/down in the list to make the simulation more readable.
Users may cycle through the simulator using the arrows to directly go to a specific clock cycle.
Alternatively there is a scrollbar for the Waveform simulator that will automatically lengthen the simulation once the end is reached.
The values in the waveform simulator can be viewed in various formats: binary, hexadecimal, unsigned decimal and signed decimal.
The Waveform Simulator also features a draggable sidebar to partition screen space dynamically between waveforms and circuit.
</p><br>
<div class="img">
<img src="content/img/circuit/waveformsimulation.png" alt="Waveform simulator example" />
</div><br>
<p>
Waveform Simulation also allows for the simulation and contents viewing of memory components such as RAM.
</p><br>
<div class="img">
<img src="content/img/circuit/wavesimramview.png" alt="Waveform simulator with RAM example" />
</div><br>
<div class="section" id="halfwidth"><h2><a name="Verilog" class="anchor" href="#Verilog">Verilog Output</a></h2></div>
<p>
Users may convert their ISSIE schematic design into a Verilog file using the 'Write design as verilog' option found in the header bar of the application.
This allows great flexibility as ISSIE designs may be used in more complex design tools and other programs that use Verilog;
allowing ISSIE to be used as a top-level design that can be further developed if needed. Verilog output for simulation or synthesis is documented
as part of the Verilog write process, this includes links to a [YoSys](http://bygone.clairexen.net/yosys/download.html) workflow for synthesis on FPGAs.
Imperial College users can download a pre-installed VM for this workflow, the VHDL output is standalone and should work with other synthesis methods.
</p><br>
<div class="section" id="halfwidth"><h2><a name="Memory" class="anchor" href="#Memory">Memory Editor</a></h2></div>
<p>
ISSIE allows users to directly edit the contents of Memory components, for more versitility and ease of use. Memory contents can also be exported and imported via .ram files.
</p><br>
<div class="img">
<img src="content/img/circuit/memoryeditor.png" alt="RAM editor example" />
</div><br>
<br>
<div class="section"><h1><a name="Acknowledgements" class="anchor" href="#Acknowledgements">Acknowledgements:</a></h1></div>
<ul>
<li>Marco Selvatici for the 8K lines of base code written for his 3rd year BEng <a href="https://github.com/MarcoSelvatici/DEflow">FYP</a></li>
<li>Edoardo Santi for work improving Issie over Summer 2020.</li>
<li>High Level Programming 2020 cohort for providing the base code of the draw block</li>
<li>Jo Merrick for work improving ISSIE for her 3rd year BEng Project</li>
<li>Dr Tom Clarke for his continued work maintaining and improving ISSIE throughout</li>
<li>All 2020/2021 1st year undergraduate students of the EEE department, Imperial College London, for acting as unpaid beta-testers!</li>
</ul>
</div>
</body>
</html>

BIN
docs/marco-poster.pdf Normal file

Binary file not shown.

BIN
docs/marco-report.pdf Normal file

Binary file not shown.

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>ComponentId - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>ComponentId</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '369', 369)" onmouseover="showTip(event, '369', 369)">
ComponentId(string)
</code>
<div class="tip" id="369">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L4-4" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>ConnectionId - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>ConnectionId</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '370', 370)" onmouseover="showTip(event, '370', 370)">
ConnectionId(string)
</code>
<div class="tip" id="370">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L5-5" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,120 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>ConnectionsWidth - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>ConnectionsWidth</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Instance members</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Instance member</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '371', 371)" onmouseover="showTip(event, '371', 371)">
x.Count
</code>
<div class="tip" id="371">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<p>CompiledName: <code>get_Count</code></p>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '372', 372)" onmouseover="showTip(event, '372', 372)">
x.IsEmpty
</code>
<div class="tip" id="372">
<strong>Signature:</strong> bool<br />
</div>
</td>
<td class="xmldoc">
<p>CompiledName: <code>get_IsEmpty</code></p>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '373', 373)" onmouseover="showTip(event, '373', 373)">
[key]
</code>
<div class="tip" id="373">
<strong>Signature:</strong> key:ConnectionId -&gt; int option<br />
</div>
</td>
<td class="xmldoc">
<p>CompiledName: <code>get_Item</code></p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>InputPortId - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>InputPortId</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '374', 374)" onmouseover="showTip(event, '374', 374)">
InputPortId(string)
</code>
<div class="tip" id="374">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L6-6" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>InputPortNumber - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>InputPortNumber</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '375', 375)" onmouseover="showTip(event, '375', 375)">
InputPortNumber(int)
</code>
<div class="tip" id="375">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L8-8" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>OutputPortId - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>OutputPortId</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '376', 376)" onmouseover="showTip(event, '376', 376)">
OutputPortId(string)
</code>
<div class="tip" id="376">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L7-7" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>OutputPortNumber - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>OutputPortNumber</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '377', 377)" onmouseover="showTip(event, '377', 377)">
OutputPortNumber(int)
</code>
<div class="tip" id="377">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L9-9" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>WidthInferError - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>WidthInferError</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-bustypes.html">BusTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '378', 378)" onmouseover="showTip(event, '378', 378)">
ConnectionsAffected
</code>
<div class="tip" id="378">
<strong>Signature:</strong> ConnectionId list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L16-16" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '379', 379)" onmouseover="showTip(event, '379', 379)">
Msg
</code>
<div class="tip" id="379">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/WidthInferer/Types.fs#L15-15" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,105 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>CanvasState - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>CanvasState</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
<p>F# data describing the contents of a single schematic sheet.</p>
</div>
<h3>Instance members</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Instance member</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '104', 104)" onmouseover="showTip(event, '104', 104)">
x.Item1
</code>
<div class="tip" id="104">
<strong>Signature:</strong> Component list<br />
</div>
</td>
<td class="xmldoc">
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '105', 105)" onmouseover="showTip(event, '105', 105)">
x.Item2
</code>
<div class="tip" id="105">
<strong>Signature:</strong> Connection list<br />
</div>
</td>
<td class="xmldoc">
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,241 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Component - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>Component</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
<p>JSComponent mapped to F# record.
Id uniquely identifies the component within a sheet and is used by draw2d library.
Label is optional descriptor displayed on schematic.</p>
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '106', 106)" onmouseover="showTip(event, '106', 106)">
H
</code>
<div class="tip" id="106">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L80-80" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '107', 107)" onmouseover="showTip(event, '107', 107)">
Id
</code>
<div class="tip" id="107">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L73-73" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '108', 108)" onmouseover="showTip(event, '108', 108)">
InputPorts
</code>
<div class="tip" id="108">
<strong>Signature:</strong> Port list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L76-76" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '109', 109)" onmouseover="showTip(event, '109', 109)">
Label
</code>
<div class="tip" id="109">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L75-75" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '110', 110)" onmouseover="showTip(event, '110', 110)">
OutputPorts
</code>
<div class="tip" id="110">
<strong>Signature:</strong> Port list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L77-77" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '111', 111)" onmouseover="showTip(event, '111', 111)">
Type
</code>
<div class="tip" id="111">
<strong>Signature:</strong> ComponentType<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L74-74" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '112', 112)" onmouseover="showTip(event, '112', 112)">
W
</code>
<div class="tip" id="112">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L81-81" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '113', 113)" onmouseover="showTip(event, '113', 113)">
X
</code>
<div class="tip" id="113">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L78-78" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '114', 114)" onmouseover="showTip(event, '114', 114)">
Y
</code>
<div class="tip" id="114">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L79-79" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,507 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>ComponentType - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>ComponentType</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '115', 115)" onmouseover="showTip(event, '115', 115)">
And
</code>
<div class="tip" id="115">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '116', 116)" onmouseover="showTip(event, '116', 116)">
AsyncROM(Memory)
</code>
<div class="tip" id="116">
<strong>Signature:</strong> Memory<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L67-67" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '117', 117)" onmouseover="showTip(event, '117', 117)">
BusSelection(OutputWidth,OutputLSBit)
</code>
<div class="tip" id="117">
<strong>Signature:</strong> int * int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L58-58" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '118', 118)" onmouseover="showTip(event, '118', 118)">
Custom(CustomComponentType)
</code>
<div class="tip" id="118">
<strong>Signature:</strong> CustomComponentType<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L62-62" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '119', 119)" onmouseover="showTip(event, '119', 119)">
Demux2
</code>
<div class="tip" id="119">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L60-60" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '120', 120)" onmouseover="showTip(event, '120', 120)">
DFF
</code>
<div class="tip" id="120">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L66-66" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '121', 121)" onmouseover="showTip(event, '121', 121)">
DFFE
</code>
<div class="tip" id="121">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L66-66" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '122', 122)" onmouseover="showTip(event, '122', 122)">
Input(BusWidth)
</code>
<div class="tip" id="122">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L58-58" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '123', 123)" onmouseover="showTip(event, '123', 123)">
IOLabel
</code>
<div class="tip" id="123">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L58-58" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '124', 124)" onmouseover="showTip(event, '124', 124)">
MergeWires
</code>
<div class="tip" id="124">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L63-63" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '125', 125)" onmouseover="showTip(event, '125', 125)">
Mux2
</code>
<div class="tip" id="125">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L60-60" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '126', 126)" onmouseover="showTip(event, '126', 126)">
Nand
</code>
<div class="tip" id="126">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '127', 127)" onmouseover="showTip(event, '127', 127)">
NbitsAdder(BusWidth)
</code>
<div class="tip" id="127">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L61-61" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '128', 128)" onmouseover="showTip(event, '128', 128)">
Nor
</code>
<div class="tip" id="128">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '129', 129)" onmouseover="showTip(event, '129', 129)">
Not
</code>
<div class="tip" id="129">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '130', 130)" onmouseover="showTip(event, '130', 130)">
Or
</code>
<div class="tip" id="130">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '131', 131)" onmouseover="showTip(event, '131', 131)">
Output(BusWidth)
</code>
<div class="tip" id="131">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L58-58" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '132', 132)" onmouseover="showTip(event, '132', 132)">
RAM(Memory)
</code>
<div class="tip" id="132">
<strong>Signature:</strong> Memory<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L67-67" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '133', 133)" onmouseover="showTip(event, '133', 133)">
Register(BusWidth)
</code>
<div class="tip" id="133">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L66-66" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '134', 134)" onmouseover="showTip(event, '134', 134)">
RegisterE(BusWidth)
</code>
<div class="tip" id="134">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L66-66" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '135', 135)" onmouseover="showTip(event, '135', 135)">
ROM(Memory)
</code>
<div class="tip" id="135">
<strong>Signature:</strong> Memory<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L67-67" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '136', 136)" onmouseover="showTip(event, '136', 136)">
SplitWire(BusWidth)
</code>
<div class="tip" id="136">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L63-63" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '137', 137)" onmouseover="showTip(event, '137', 137)">
Xnor
</code>
<div class="tip" id="137">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '138', 138)" onmouseover="showTip(event, '138', 138)">
Xor
</code>
<div class="tip" id="138">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L59-59" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,150 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Connection - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>Connection</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
<p>JSConnection mapped to F# record.
Id uniquely identifies connection globally and is used by library.</p>
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '139', 139)" onmouseover="showTip(event, '139', 139)">
Id
</code>
<div class="tip" id="139">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L87-87" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '140', 140)" onmouseover="showTip(event, '140', 140)">
Source
</code>
<div class="tip" id="140">
<strong>Signature:</strong> Port<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L88-88" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '141', 141)" onmouseover="showTip(event, '141', 141)">
Target
</code>
<div class="tip" id="141">
<strong>Signature:</strong> Port<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L89-89" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '142', 142)" onmouseover="showTip(event, '142', 142)">
Vertices
</code>
<div class="tip" id="142">
<strong>Signature:</strong> (float * float) list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L90-90" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>CustomComponentType - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>CustomComponentType</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
<p>Name identified the LoadedComponent used.
The labels define legends on symbol.
Label strings are unique per CustomComponent.
Multiple CustomComponent instances are differentiated by Component data.</p>
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '143', 143)" onmouseover="showTip(event, '143', 143)">
InputLabels
</code>
<div class="tip" id="143">
<strong>Signature:</strong> (string * int) list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L39-39" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '144', 144)" onmouseover="showTip(event, '144', 144)">
Name
</code>
<div class="tip" id="144">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L37-37" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '145', 145)" onmouseover="showTip(event, '145', 145)">
OutputLabels
</code>
<div class="tip" id="145">
<strong>Signature:</strong> (string * int) list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L40-40" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,179 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>LoadedComponent - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>LoadedComponent</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
<p>Static data describing a schematic sheet loaded as a custom component.
Every sheet is always identified with a file from which it is loaded/saved.
Name is human readable (and is the filename - without extension) and identifies sheet.
File path is the sheet directory and name (with extension).
InputLabels, OutputLabels are the I/O connections.
The I/O connection integers are bus widths.
The I/O connection strings are human readable. The strings are guaranteed
to be unique in the I/O connection list. I.e. An input label may be the same
as an output label, but two input (or output) labels cannot be the same.
The position in the I/O connections list is important as it implicitly
indicates the port number. For example, the first element in the InputLabels
list is related to the Component's Port with PortNumber 0.
Two instances of a loaded component have the same LoadedComponent data.</p>
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '151', 151)" onmouseover="showTip(event, '151', 151)">
CanvasState
</code>
<div class="tip" id="151">
<strong>Signature:</strong> CanvasState<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L116-116" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '152', 152)" onmouseover="showTip(event, '152', 152)">
FilePath
</code>
<div class="tip" id="152">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L115-115" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '153', 153)" onmouseover="showTip(event, '153', 153)">
InputLabels
</code>
<div class="tip" id="153">
<strong>Signature:</strong> (string * int) list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L117-117" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '154', 154)" onmouseover="showTip(event, '154', 154)">
Name
</code>
<div class="tip" id="154">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L114-114" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '155', 155)" onmouseover="showTip(event, '155', 155)">
OutputLabels
</code>
<div class="tip" id="155">
<strong>Signature:</strong> (string * int) list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L118-118" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Memory - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>Memory</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '156', 156)" onmouseover="showTip(event, '156', 156)">
AddressWidth
</code>
<div class="tip" id="156">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L46-46" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '157', 157)" onmouseover="showTip(event, '157', 157)">
Data
</code>
<div class="tip" id="157">
<strong>Signature:</strong> int64 list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L53-53" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '158', 158)" onmouseover="showTip(event, '158', 158)">
WordWidth
</code>
<div class="tip" id="158">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L48-48" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>NumberBase - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>NumberBase</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '159', 159)" onmouseover="showTip(event, '159', 159)">
Bin
</code>
<div class="tip" id="159">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L135-135" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '160', 160)" onmouseover="showTip(event, '160', 160)">
Dec
</code>
<div class="tip" id="160">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L135-135" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '161', 161)" onmouseover="showTip(event, '161', 161)">
Hex
</code>
<div class="tip" id="161">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L135-135" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '162', 162)" onmouseover="showTip(event, '162', 162)">
SDec
</code>
<div class="tip" id="162">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L135-135" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,158 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Port - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>Port</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
<p>A component I/O.
Id (like any other Id) is a string generated with 32 random hex charactes,
so it is (practically) globally unique. These Ids are used by the draw2d
library to uniquely refer to ports and components. They are generated via:
<a href="http://www.draw2d.org/draw2d_touch/jsdoc_6/#!/api/draw2d.util.UUID.
PortNumber">http://www.draw2d.org/draw2d_touch/jsdoc_6/#!/api/draw2d.util.UUID.
PortNumber</a> is used to identify which port on a component, contiguous from 0
separately for inputs and outputs.
HostId is the unique Id of the component where the port is. For example,
all three ports on the same And component will have the same HostId.</p>
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '163', 163)" onmouseover="showTip(event, '163', 163)">
HostId
</code>
<div class="tip" id="163">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L29-29" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '164', 164)" onmouseover="showTip(event, '164', 164)">
Id
</code>
<div class="tip" id="164">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L24-24" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '165', 165)" onmouseover="showTip(event, '165', 165)">
PortNumber
</code>
<div class="tip" id="165">
<strong>Signature:</strong> int option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L27-27" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '166', 166)" onmouseover="showTip(event, '166', 166)">
PortType
</code>
<div class="tip" id="166">
<strong>Signature:</strong> PortType<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L28-28" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>PortType - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>PortType</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '167', 167)" onmouseover="showTip(event, '167', 167)">
Input
</code>
<div class="tip" id="167">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L12-12" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '168', 168)" onmouseover="showTip(event, '168', 168)">
Output
</code>
<div class="tip" id="168">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L12-12" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Project - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>Project</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-commontypes.html">CommonTypes</a></span><br />
</p>
<div class="xmldoc">
<p>Type for an open project which represents a complete design.
ProjectPath is directory containing project files.
OpenFileName is name of file from which current schematic sheet is loaded/saved.
LoadedComponents contains the list of schematic sheets, each as a component, one per sheet.</p>
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '169', 169)" onmouseover="showTip(event, '169', 169)">
LoadedComponents
</code>
<div class="tip" id="169">
<strong>Signature:</strong> LoadedComponent list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L128-128" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '170', 170)" onmouseover="showTip(event, '170', 170)">
OpenFileName
</code>
<div class="tip" id="170">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L127-127" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '171', 171)" onmouseover="showTip(event, '171', 171)">
ProjectPath
</code>
<div class="tip" id="171">
<strong>Signature:</strong> string<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Common/Types.fs#L126-126" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,165 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>JSDiagramMsg - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>JSDiagramMsg</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '178', 178)" onmouseover="showTip(event, '178', 178)">
InferWidths(unit)
</code>
<div class="tip" id="178">
<strong>Signature:</strong> unit<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L40-40" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '179', 179)" onmouseover="showTip(event, '179', 179)">
InitCanvas(JSCanvas)
</code>
<div class="tip" id="179">
<strong>Signature:</strong> JSCanvas<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L37-37" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '180', 180)" onmouseover="showTip(event, '180', 180)">
SelectComponent(JSComponent)
</code>
<div class="tip" id="180">
<strong>Signature:</strong> JSComponent<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L38-38" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '181', 181)" onmouseover="showTip(event, '181', 181)">
SetHasUnsavedChanges(bool)
</code>
<div class="tip" id="181">
<strong>Signature:</strong> bool<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L41-41" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '182', 182)" onmouseover="showTip(event, '182', 182)">
UnselectComponent(unit)
</code>
<div class="tip" id="182">
<strong>Signature:</strong> unit<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L39-39" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,165 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>KeyboardShortcutMsg - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>KeyboardShortcutMsg</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '183', 183)" onmouseover="showTip(event, '183', 183)">
AltC
</code>
<div class="tip" id="183">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '184', 184)" onmouseover="showTip(event, '184', 184)">
AltShiftZ
</code>
<div class="tip" id="184">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '185', 185)" onmouseover="showTip(event, '185', 185)">
AltV
</code>
<div class="tip" id="185">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '186', 186)" onmouseover="showTip(event, '186', 186)">
AltZ
</code>
<div class="tip" id="186">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '187', 187)" onmouseover="showTip(event, '187', 187)">
CtrlS
</code>
<div class="tip" id="187">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L45-45" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>MemoryEditorData - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>MemoryEditorData</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '188', 188)" onmouseover="showTip(event, '188', 188)">
Address
</code>
<div class="tip" id="188">
<strong>Signature:</strong> int option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L16-16" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '189', 189)" onmouseover="showTip(event, '189', 189)">
NumberBase
</code>
<div class="tip" id="189">
<strong>Signature:</strong> NumberBase<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L17-17" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '190', 190)" onmouseover="showTip(event, '190', 190)">
OnlyDiff
</code>
<div class="tip" id="190">
<strong>Signature:</strong> bool<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L15-15" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,759 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Msg - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>Msg</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '195', 195)" onmouseover="showTip(event, '195', 195)">
AddWaveSimFile(string,WaveSimModel)
</code>
<div class="tip" id="195">
<strong>Signature:</strong> string * WaveSimModel<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L118-118" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '196', 196)" onmouseover="showTip(event, '196', 196)">
ChangeRightTab(RightTab)
</code>
<div class="tip" id="196">
<strong>Signature:</strong> RightTab<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L123-123" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '197', 197)" onmouseover="showTip(event, '197', 197)">
CloseDiagramNotification
</code>
<div class="tip" id="197">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L136-136" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '198', 198)" onmouseover="showTip(event, '198', 198)">
CloseFilesNotification
</code>
<div class="tip" id="198">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L141-141" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '199', 199)" onmouseover="showTip(event, '199', 199)">
CloseMemoryEditorNotification
</code>
<div class="tip" id="199">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L143-143" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '200', 200)" onmouseover="showTip(event, '200', 200)">
ClosePopup
</code>
<div class="tip" id="200">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L130-130" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '201', 201)" onmouseover="showTip(event, '201', 201)">
CloseProject
</code>
<div class="tip" id="201">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L128-128" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '202', 202)" onmouseover="showTip(event, '202', 202)">
ClosePropertiesNotification
</code>
<div class="tip" id="202">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L145-145" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '203', 203)" onmouseover="showTip(event, '203', 203)">
CloseSimulationNotification
</code>
<div class="tip" id="203">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L138-138" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '204', 204)" onmouseover="showTip(event, '204', 204)">
CloseWaveSimNotification
</code>
<div class="tip" id="204">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L139-139" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '205', 205)" onmouseover="showTip(event, '205', 205)">
EndSimulation
</code>
<div class="tip" id="205">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L122-122" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '206', 206)" onmouseover="showTip(event, '206', 206)">
IncrementSimulationClockTick
</code>
<div class="tip" id="206">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L121-121" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '207', 207)" onmouseover="showTip(event, '207', 207)">
JSDiagramMsg(JSDiagramMsg)
</code>
<div class="tip" id="207">
<strong>Signature:</strong> JSDiagramMsg<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L114-114" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '208', 208)" onmouseover="showTip(event, '208', 208)">
KeyboardShortcutMsg(KeyboardShortcutMsg)
</code>
<div class="tip" id="208">
<strong>Signature:</strong> KeyboardShortcutMsg<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L115-115" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '209', 209)" onmouseover="showTip(event, '209', 209)">
MenuAction(MenuCommand,Msg -&gt; unit)
</code>
<div class="tip" id="209">
<strong>Signature:</strong> MenuCommand * Msg -&gt; unit<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L150-150" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '210', 210)" onmouseover="showTip(event, '210', 210)">
ReloadSelectedComponent(int)
</code>
<div class="tip" id="210">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L147-147" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '211', 211)" onmouseover="showTip(event, '211', 211)">
SelectionHasChanged
</code>
<div class="tip" id="211">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L151-151" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '212', 212)" onmouseover="showTip(event, '212', 212)">
SetClipboard(CanvasState)
</code>
<div class="tip" id="212">
<strong>Signature:</strong> CanvasState<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L125-125" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '213', 213)" onmouseover="showTip(event, '213', 213)">
SetCreateComponent(Component)
</code>
<div class="tip" id="213">
<strong>Signature:</strong> Component<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L126-126" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '214', 214)" onmouseover="showTip(event, '214', 214)">
SetDragMode(DragMode)
</code>
<div class="tip" id="214">
<strong>Signature:</strong> DragMode<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L148-148" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '215', 215)" onmouseover="showTip(event, '215', 215)">
SetFilesNotification(...)
</code>
<div class="tip" id="215">
<strong>Signature:</strong> (Msg -&gt; unit) -&gt; (type)<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L140-140" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '216', 216)" onmouseover="showTip(event, '216', 216)">
SetHighlighted(...)
</code>
<div class="tip" id="216">
<strong>Signature:</strong> ComponentId list * ConnectionId list<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L124-124" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '217', 217)" onmouseover="showTip(event, '217', 217)">
SetMemoryEditorNotification(...)
</code>
<div class="tip" id="217">
<strong>Signature:</strong> (Msg -&gt; unit) -&gt; (type)<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L142-142" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '218', 218)" onmouseover="showTip(event, '218', 218)">
SetPopupDialogInt(int option)
</code>
<div class="tip" id="218">
<strong>Signature:</strong> int option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L132-132" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '219', 219)" onmouseover="showTip(event, '219', 219)">
SetPopupDialogMemorySetup(...)
</code>
<div class="tip" id="219">
<strong>Signature:</strong> (int * int) option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L134-134" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '220', 220)" onmouseover="showTip(event, '220', 220)">
SetPopupDialogText(string option)
</code>
<div class="tip" id="220">
<strong>Signature:</strong> string option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L131-131" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '221', 221)" onmouseover="showTip(event, '221', 221)">
SetPopupDialogTwoInts(...)
</code>
<div class="tip" id="221">
<strong>Signature:</strong> int option * IntMode<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L133-133" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '222', 222)" onmouseover="showTip(event, '222', 222)">
SetPopupMemoryEditorData(...)
</code>
<div class="tip" id="222">
<strong>Signature:</strong> MemoryEditorData option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L135-135" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '223', 223)" onmouseover="showTip(event, '223', 223)">
SetProject(Project)
</code>
<div class="tip" id="223">
<strong>Signature:</strong> Project<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L127-127" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '224', 224)" onmouseover="showTip(event, '224', 224)">
SetPropertiesNotification(...)
</code>
<div class="tip" id="224">
<strong>Signature:</strong> (Msg -&gt; unit) -&gt; (type)<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L144-144" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '225', 225)" onmouseover="showTip(event, '225', 225)">
SetSimulationBase(NumberBase)
</code>
<div class="tip" id="225">
<strong>Signature:</strong> NumberBase<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L120-120" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '226', 226)" onmouseover="showTip(event, '226', 226)">
SetSimulationGraph(SimulationGraph)
</code>
<div class="tip" id="226">
<strong>Signature:</strong> SimulationGraph<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L119-119" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '227', 227)" onmouseover="showTip(event, '227', 227)">
SetSimulationNotification(...)
</code>
<div class="tip" id="227">
<strong>Signature:</strong> (Msg -&gt; unit) -&gt; (type)<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L137-137" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '228', 228)" onmouseover="showTip(event, '228', 228)">
SetTopMenu(TopMenu)
</code>
<div class="tip" id="228">
<strong>Signature:</strong> TopMenu<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L146-146" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '229', 229)" onmouseover="showTip(event, '229', 229)">
SetViewerWidth(int)
</code>
<div class="tip" id="229">
<strong>Signature:</strong> int<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L149-149" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '230', 230)" onmouseover="showTip(event, '230', 230)">
ShowPopup(PopupDialogData -&gt; (type))
</code>
<div class="tip" id="230">
<strong>Signature:</strong> PopupDialogData -&gt; (type)<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L129-129" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '231', 231)" onmouseover="showTip(event, '231', 231)">
StartSimulation(...)
</code>
<div class="tip" id="231">
<strong>Signature:</strong> Result&lt;SimulationData,SimulationError&gt;<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L116-116" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '232', 232)" onmouseover="showTip(event, '232', 232)">
StartWaveSim(...)
</code>
<div class="tip" id="232">
<strong>Signature:</strong> Result&lt;WaveSimModel,SimulationError option&gt;<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L117-117" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,167 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>PopupDialogData - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>PopupDialogData</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
</p>
<div class="xmldoc">
<p>Possible fields that may (or may not) be used in a dialog popup.</p>
</div>
<h3>Record Fields</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Record Field</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '233', 233)" onmouseover="showTip(event, '233', 233)">
Int
</code>
<div class="tip" id="233">
<strong>Signature:</strong> int option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L23-23" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '234', 234)" onmouseover="showTip(event, '234', 234)">
Int2
</code>
<div class="tip" id="234">
<strong>Signature:</strong> int option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L24-24" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '235', 235)" onmouseover="showTip(event, '235', 235)">
MemoryEditorData
</code>
<div class="tip" id="235">
<strong>Signature:</strong> MemoryEditorData option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L26-26" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '236', 236)" onmouseover="showTip(event, '236', 236)">
MemorySetup
</code>
<div class="tip" id="236">
<strong>Signature:</strong> (int * int) option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L25-25" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '237', 237)" onmouseover="showTip(event, '237', 237)">
Text
</code>
<div class="tip" id="237">
<strong>Signature:</strong> string option<br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L22-22" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>RightTab - issie</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content=""/>
<meta name="author" content="tomcl"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://tomcl.github.io/issie//content/style.css" />
<script type="text/javascript" src="https://tomcl.github.io/issie//content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="http://fsharp.org">fsharp.org</a></li>
</ul>
<h3 class="muted"><a href="https://tomcl.github.io/issie//index.html">issie</a></h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1>RightTab</h1>
<p>
<span>Namespace: global</span><br />
<span>Parent Module: <a href="global-diagrammessagetype.html">DiagramMessageType</a></span><br />
</p>
<div class="xmldoc">
</div>
<h3>Union Cases</h3>
<table class="table table-bordered member-list">
<thead>
<tr><td>Union Case</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '238', 238)" onmouseover="showTip(event, '238', 238)">
Catalogue
</code>
<div class="tip" id="238">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L10-10" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '239', 239)" onmouseover="showTip(event, '239', 239)">
Properties
</code>
<div class="tip" id="239">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L9-9" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '240', 240)" onmouseover="showTip(event, '240', 240)">
Simulation
</code>
<div class="tip" id="240">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L11-11" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
<tr>
<td class="member-name">
<code onmouseout="hideTip(event, '241', 241)" onmouseover="showTip(event, '241', 241)">
WaveSim
</code>
<div class="tip" id="241">
<strong>Signature:</strong> <br />
</div>
</td>
<td class="xmldoc">
<a href="https://github.com/tomcl/ISSIE/tree/master/src/Renderer/UI/MessageType.fs#L12-12" class="github-link">
<img src="../content/img/github.png" class="normal" />
<img src="../content/img/github-blue.png" class="hover" />
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu" style="margin-top: 20px;">
<li class="nav-header">issie</li>
<li class="divider"></li>
<li><a href="https://github.com/tomcl/ISSIE">Source Code</a></li>
<li><a href="https://tomcl.github.io/issie//release-notes.html">Release Notes</a></li>
<li><a href="https://tomcl.github.io/issie//contributing.html">Contributing</a></li>
<li class="nav-header">Documentation</li>
<li><a href="https://tomcl.github.io/issie//index.html">Introduction</a></li>
<li class="divider"></li>
<li><a href="https://tomcl.github.io/issie//community.html">Community</a></li>
<li class="nav-header">Reference</li>
<li><a href="https://tomcl.github.io/issie//reference/index.html">API Reference</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show more