24 static const bool sLazyUpdates =
false;
30 mParentWidget(nullptr),
35 mUnappliedChanges(false),
36 mSceneUpdateRequired(false),
37 mSceneUpdateInProgress(false),
38 mSpecialUpdate(false),
83 if (mUserUpdateCount == 0)
101 mRemovedModules -= old_modules;
102 mRemovedGates -= old_gates;
104 mAddedModules += new_modules;
105 mAddedGates += new_gates;
107 mPlacementList[placement.
mode()].append(
110 if (mUserUpdateCount == 0)
123 mRemovedModules += old_modules;
124 mRemovedGates += old_gates;
127 mAddedGates -=
gates;
134 if (mUserUpdateCount == 0)
144 mRemovedModules = mModules;
145 mRemovedGates = mGates;
147 mAddedModules.
clear();
150 for (
int i=0; i<4; i++)
151 mPlacementList[i].
clear();
153 if (mUserUpdateCount == 0)
162 QSet<u32> containedGates = mGates + mAddedGates - mRemovedGates;
163 return containedGates.
contains(gateId);
168 QSet<u32> containedGates = mGates + mAddedGates - mRemovedGates;
169 QSet<u32> containedModules = mModules + mAddedModules - mRemovedModules;
173 for (
const Gate*
g : m->get_gates())
175 if (!containedGates.
contains(
g->get_id()))
return false;
187 auto contained_modules = mModules + mAddedModules - mRemovedModules;
189 if (contained_modules.find(
id) != contained_modules.end())
195 Node singleContentNode;
198 for (
const Gate*
g : m->get_gates())
242 QSet<u32> tempMod = mModules + mAddedModules - mRemovedModules;
243 QSet<u32> tempGat = mGates + mAddedGates - mRemovedGates;
249 if (testIfAffectedInternal(
id, moduleId, gateId))
253 bool GraphContext::testIfAffectedInternal(
const u32 id,
const u32* moduleId,
const u32* gateId)
259 std::vector<Gate*> modifiedGates;
263 if (m) modifiedGates = m->
get_gates(
nullptr,
true);
268 if (
g) modifiedGates.push_back(
g);
270 for (Gate* mg : modifiedGates)
277 void GraphContext::removeModuleContents(
const u32 moduleId)
284 childGates.
insert(
g->get_id());
288 childModules.
insert(sm->get_id());
290 remove(childModules, childGates);
317 auto contextGates = (mGates - mRemovedGates) + mAddedGates;
318 auto contextModules = (mModules - mRemovedModules) + mAddedModules;
319 auto moduleGates = (
gates - minus_gates) + plus_gates;
320 auto moduleModules = (
modules - minus_modules) + plus_modules;
322 return contextGates == moduleGates && contextModules == moduleModules;
328 auto contextGates = (mGates - mRemovedGates) + mAddedGates;
329 if (!contextGates.isEmpty())
return false;
330 auto contextModules = (mModules - mRemovedModules) + mAddedModules;
331 if (contextModules.size() != 1)
return false;
338 auto containedModules = mModules + mAddedModules - mRemovedModules;
349 if (!containedModules.contains(sm->get_id()) &&
isModuleUnfolded(sm->get_id()))
362 if (!mExclusiveModuleId)
return false;
364 auto containedModules = mModules + mAddedModules - mRemovedModules;
365 auto containedGates = mGates + mAddedGates - mRemovedGates;
368 if (containedGates.empty() && containedModules.size() == 1 && *containedModules.begin() == mExclusiveModuleId)
379 auto src_pins =
net->get_sources();
381 for(
auto pin : src_pins)
383 if(pin->get_gate() !=
nullptr)
385 if(mGates.
contains(pin->get_gate()->get_id()))
396 auto dst_pins =
net->get_destinations();
398 for(
auto pin : dst_pins)
400 if(pin->get_gate() !=
nullptr)
402 if(mGates.
contains(pin->get_gate()->get_id()))
414 Gate*
g = ep->get_gate();
416 if (box)
return box->
getNode();
423 for (
Endpoint* ep :
n->get_destinations())
425 Gate*
g = ep->get_gate();
427 if (box)
return box->
getNode();
449 return mLayouter->
scene();
464 if (mDirty)
return mName +
"*";
470 return mSceneUpdateInProgress;
475 mSceneUpdateRequired =
true;
481 if(mUserUpdateCount == 0)
527 if (!percent) text =
QString(
"Layout %1[%2]").
arg(mName).
arg(mId);
528 if (mParentWidget) mParentWidget->
showProgress(percent,text);
542 void GraphContext::handleLayouterFinished()
544 if (mUnappliedChanges)
547 if (mSceneUpdateRequired)
549 requireSceneUpdate();
556 mSceneUpdateInProgress =
false;
564 void GraphContext::evaluateChanges()
567 mUnappliedChanges =
true;
570 void GraphContext::update()
572 if (mSceneUpdateInProgress)
577 if (mUnappliedChanges)
580 if (mSceneUpdateRequired)
581 requireSceneUpdate();
584 void GraphContext::applyChanges()
587 auto it = mAddedModules.
begin();
588 while (it != mAddedModules.
end())
593 it = mAddedModules.
erase(it);
596 mModules -= mRemovedModules;
597 mGates -= mRemovedGates;
599 mModules += mAddedModules;
600 mGates += mAddedGates;
602 mLayouter->
remove(mRemovedModules, mRemovedGates, mNets);
603 mShader->
remove(mRemovedModules, mRemovedGates, mNets);
612 for (
int iplc = 0; iplc<4; iplc++)
614 for (
const PlacementEntry& plcEntry : mPlacementList[placementOrder[iplc]])
616 QSet<u32> modsForHint = plcEntry.mModules;
617 modsForHint &= mAddedModules;
619 gatsForHint &= mAddedGates;
620 mLayouter->
add(modsForHint, gatsForHint, mNets, plcEntry.mPlacementHint);
624 mShader->
add(mAddedModules, mAddedGates, mNets);
626 mAddedModules.
clear();
629 mRemovedModules.
clear();
630 mRemovedGates.
clear();
632 for (
int i=0; i<4; i++)
633 mPlacementList[i].
clear();
635 mUnappliedChanges =
false;
636 mSceneUpdateRequired =
true;
642 for (
const auto&
id : mGates)
644 if (mRemovedGates.
contains(
id))
continue;
647 for (
auto net :
g->get_fan_in_nets())
652 for (
auto net :
g->get_fan_out_nets())
658 for (
const auto&
id : mModules)
660 if (mRemovedModules.
contains(
id))
continue;
674 void GraphContext::requireSceneUpdate()
680 void GraphContext::startSceneUpdate()
682 mSceneUpdateRequired =
false;
683 mSceneUpdateInProgress =
true;
695 handleLayouterFinished();
700 if (!mSceneUpdateInProgress)
return;
714 handleLayouterFinished();
717 void GraphContext::handleStyleChanged(
int istyle)
720 handleLayouterFinished();
729 void GraphContext::handleModuleNameChanged(
Module* m)
731 if (mExclusiveModuleId == m->
get_id())
748 if (json.
contains(
"timestamp") && json[
"timestamp"].isString())
753 if (json.
contains(
"modules") && json[
"modules"].isArray())
755 QJsonArray jsonMods = json[
"modules"].toArray();
756 int nmods = jsonMods.
size();
757 for (
int imod=0; imod<nmods; imod++)
760 if (!jsonMod.
contains(
"id") || !jsonMod[
"id"].isDouble())
continue;
761 u32 id = jsonMod[
"id"].toInt();
764 log_warning(
"gui",
"Module id={} not found in netlist, view id={} not restored.",
id, mId);
767 if (!jsonMod.
contains(
"x") || !jsonMod[
"x"].isDouble())
continue;
768 int x = jsonMod[
"x"].toInt();
769 if (!jsonMod.
contains(
"y") || !jsonMod[
"y"].isDouble())
continue;
770 int y = jsonMod[
"y"].toInt();
776 if (json.
contains(
"gates") && json[
"gates"].isArray())
778 QJsonArray jsonGats = json[
"gates"].toArray();
779 int ngats = jsonGats.
size();
780 for (
int igat=0; igat<ngats; igat++)
783 if (!jsonGat.
contains(
"id") || !jsonGat[
"id"].isDouble())
continue;
784 u32 id = jsonGat[
"id"].toInt();
787 log_warning(
"gui",
"Gate id={} not found in netlist, view id={} not restored.",
id, mId);
790 if (!jsonGat.
contains(
"x") || !jsonGat[
"x"].isDouble())
continue;
791 int x = jsonGat[
"x"].toInt();
792 if (!jsonGat.
contains(
"y") || !jsonGat[
"y"].isDouble())
continue;
793 int y = jsonGat[
"y"].toInt();
801 log_warning(
"gui",
"Cannot restore view id={}, there are no nodes to place.", mId);
810 mModules.
insert(box.first.id());
812 mGates.
insert(box.first.id());
818 if (json.
contains(
"nets") && json[
"nets"].isArray())
821 int nnets = jsonNets.
size();
822 for (
int inet=0; inet<nnets; inet++)
825 if (!jsonNet.
contains(
"id") || !jsonNet[
"id"].isDouble())
continue;
826 u32 id = jsonNet[
"id"].toInt();
839 json[
"id"] = (int) mId;
840 json[
"name"] = mName;
841 json[
"timestamp"] = mTimestamp.
toString();
842 json[
"exclusiveModuleId"] = (int) mExclusiveModuleId;
844 json[
"parentId"] = (int) parentId;
847 for (
u32 id : mModules)
852 jsonMod[
"id"] = (int)
id;
853 jsonMod[
"x"] = (int) pos.
x();
854 jsonMod[
"y"] = (int) pos.
y();
857 json[
"modules"] = jsonMods;
861 for (
u32 id : mGates)
866 jsonGat[
"id"] = (int)
id;
867 jsonGat[
"x"] = (int) pos.
x();
868 jsonGat[
"y"] = (int) pos.
y();
871 json[
"gates"] = jsonGats;
878 jsonNet[
"id"] = (int)
id;
881 json[
"nets"] = jsonNets;
887 if (mDirty==dty)
return;
894 mScheduleRemoveModules = mods;
895 mScheduleRemoveGates = gats;
903 auto it = mScheduleRemoveModules.
find(nd.
id());
904 if (it != mScheduleRemoveModules.
end())
906 mScheduleRemoveModules.
erase(it);
913 auto it = mScheduleRemoveGates.
find(nd.
id());
914 if (it != mScheduleRemoveGates.
end())
916 mScheduleRemoveGates.
erase(it);
929 mSpecialUpdate =
state;
940 u32 old_id = mExclusiveModuleId;
941 mExclusiveModuleId =
id;
944 if ((
id == 0 && old_id != 0) && emitSignal)
948 void GraphContext::handleExclusiveModuleLost(
u32 old_id)
965 if (ctx->name() == new_name)
973 ActionRenameObject* act =
new ActionRenameObject(new_name);
GraphTabWidget * getGraphTabWidget()
Get hal's graph tab widget.
bool isModuleUnfolded(const u32 moduleId) const
bool isGateUnfolded(u32 gateId) const
void remove(const QSet< u32 > &modules, const QSet< u32 > &gates)
void setSpecialUpdate(bool state)
void writeToFile(QJsonObject &json, int parentId)
void unfoldModule(const u32 id, const PlacementHint &plc)
void refreshModule(const u32 moduleId)
void showComments(const Node &nd)
void exclusiveModuleCheck()
bool readFromFile(const QJsonObject &json)
Node getNetSource(const Net *n) const
bool isShowingModuleExclusively()
bool isShowingFoldedTopModule() const
bool isShowingModule(const u32 id) const
void setExclusiveModuleId(u32 id, bool emitSignal=true)
void add(const QSet< u32 > &modules, const QSet< u32 > &gates, PlacementHint placement=PlacementHint())
void updatePlacement(const GridPlacement &plc)
void layoutProgress(int percent) const
Node getNetDestination(const Net *n) const
const QSet< u32 > & gates() const
const QSet< u32 > & modules() const
void testIfAffected(const u32 id, const u32 *moduleId, const u32 *gateId)
Node nodeForGate(const u32 id) const
void exclusiveModuleLost(u32 old_id)
void scheduleSceneUpdate()
void setScheduleRemove(const QSet< u32 > &mods, const QSet< u32 > &gats)
void setShader(GraphShader *shader)
bool isScheduledRemove(const Node &nd)
QDateTime getTimestamp() const
GraphLayouter * getLayouter() const
GraphContext(u32 id_, const QString &name, QObject *parent=nullptr)
bool willBeEmptied() const
QString getNameWithDirtyState() const
void setLayouter(GraphLayouter *layouter)
const QSet< u32 > & nets() const
bool isShowingNetSource(const u32 mNetId) const
bool sceneUpdateInProgress() const
bool isShowingNetDestination(const u32 mNetId) const
void getModuleChildrenRecursively(const u32 moduleId, QSet< u32 > *gates, QSet< u32 > *modules) const
QVector< GraphContext * > getContexts() const
Base class for all specific layouters.
virtual void remove(const QSet< u32 > modules, const QSet< u32 > gates, const QSet< u32 > nets)=0
void setNodePosition(const Node &n, const QPoint &p)
virtual void add(const QSet< u32 > modules, const QSet< u32 > gates, const QSet< u32 > nets, PlacementHint placement=PlacementHint())=0
NetLayoutPoint positonForNode(const Node &nd) const
const QMap< Node, QPoint > nodeToPositionMap() const
GraphicsScene * scene() const
const NodeBoxes & boxes() const
void updatePlacement(const GridPlacement &plc)
Base class to store and update visual information about the graph.
virtual void add(const QSet< u32 > modules, const QSet< u32 > gates, const QSet< u32 > nets)=0
virtual void remove(const QSet< u32 > modules, const QSet< u32 > gates, const QSet< u32 > nets)=0
const Shading & getShading()
Abstract base class for modules.
void setModuleLabel(const Module *m, bool init=false)
Container for a GraphGraphicsView containing gates, nets, and modules.
void updateVisuals(const GraphShader::Shading &s)
static LayoutLockerManager * instance()
void removeWaitingContext(GraphContext *ctx)
static SettingsItemDropdown * sSettingStyle
Module * get_parent_module() const
const std::vector< Gate * > & get_gates() const
std::string get_name() const
const std::unordered_set< Net * > & get_input_nets() const
std::vector< Module * > get_submodules(const std::function< bool(Module *)> &filter=nullptr, bool recursive=false) const
const std::unordered_set< Net * > & get_output_nets() const
Gate * get_gate_by_id(const u32 gate_id) const
Module * get_module_by_id(u32 module_id) const
Net * get_net_by_id(u32 net_id) const
void moduleNameChanged(Module *m) const
The NodeBox class represents a node placed at a grid position within a hal view.
GraphicsNode * item() const
item getter for graphics item object
Node getNode() const
getNode getter for node information
NodeBox * boxForNode(const Node &n) const
boxForNode find NodeBox by node
NodeBox * boxForGate(const Gate *g) const
boxForGate find NodeBox by Gate pointer.
The Node class object represents a module or a gate.
NodeType type() const
type getter for type information
u32 id() const
id getter for ID information
Container class to store a PlacementHint togerther with a set of modules and gates.
The PlacementHint class object provides hints for the layouter how new box objects are placed on a vi...
void addGridPosition(const Node &nd, const QPoint &p)
PlacementModeType mode() const
mode getter for placement mode type
void intChanged(int value)
virtual void setObject(const UserActionObject &obj)
The UserActionObject class represents a single object used in UserAction.
#define log_warning(channel,...)
ContentManager * gContentManager
GraphContextManager * gGraphContextManager
NetlistRelay * gNetlistRelay
QDateTime currentDateTime()
QDateTime fromString(const QString &string, Qt::DateFormat format)
QString toString(Qt::DateFormat format) const const
void update(const QRectF &rect)
void append(const QJsonValue &value)
QJsonValue at(int i) const const
bool contains(const QString &key) const const
QJsonObject toObject() const const
void append(const T &value)
bool isEmpty() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QSet::const_iterator constBegin() const const
bool contains(const T &value) const const
QSet::iterator erase(QSet::iterator pos)
QSet::iterator find(const T &value)
QSet::iterator insert(const T &value)
bool isEmpty() const const
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromStdString(const std::string &str)
QString number(int n, int base)