Adding optional to differentiate between empty sets and unset attributes

Signed-off-by: Ethan Mahintorabi <ethanmoon@google.com>
This commit is contained in:
Ethan Mahintorabi 2024-03-10 01:56:33 +00:00
parent 36c1bade14
commit 8aef4d549e
No known key found for this signature in database
GPG Key ID: 824E41B920BEA252
8 changed files with 48 additions and 23 deletions

View File

@ -17,6 +17,7 @@
#pragma once
#include <functional>
#include <optional>
#include "Vector.hh"
#include "Map.hh"
@ -108,7 +109,7 @@ public:
void setIsLeaf(bool is_leaf);
void setAttribute(const std::string &key,
const std::string &value);
std::string getAttribute(const std::string &key) const;
std::optional<std::string> getAttribute(const std::string &key) const;
// Cell acts as port factory.
ConcretePort *makePort(const char *name);

View File

@ -17,6 +17,7 @@
#pragma once
#include <functional>
#include <optional>
#include "Map.hh"
#include "Set.hh"
@ -75,7 +76,7 @@ public:
const PatternMatch *pattern) const override;
const char *name(const Cell *cell) const override;
std::string getAttribute(const Cell *cell,
std::optional<std::string> getAttribute(const Cell *cell,
const std::string &key) const override;
ObjectId id(const Cell *cell) const override;
Library *library(const Cell *cell) const override;
@ -111,7 +112,7 @@ public:
PortMemberIterator *memberIterator(const Port *port) const override;
const char *name(const Instance *instance) const override;
std::string getAttribute(const Instance *inst,
std::optional<std::string> getAttribute(const Instance *inst,
const std::string &key) const override;
ObjectId id(const Instance *instance) const override;
Cell *cell(const Instance *instance) const override;
@ -298,7 +299,7 @@ public:
InstanceChildIterator *childIterator() const;
void setAttribute(const std::string &key,
const std::string &value);
std::string getAttribute(const std::string &key) const;
std::optional<std::string> getAttribute(const std::string &key) const;
void addChild(ConcreteInstance *child);
void deleteChild(ConcreteInstance *child);
void addPin(ConcretePin *pin);

View File

@ -17,6 +17,7 @@
#pragma once
#include <functional>
#include <optional>
#include "Map.hh"
#include "StringUtil.hh"
@ -145,7 +146,7 @@ public:
// Filename may return null.
virtual const char *filename(const Cell *cell) = 0;
// Attributes can be null
virtual std::string getAttribute(const Cell *cell,
virtual std::optional<std::string> getAttribute(const Cell *cell,
const std::string &key) const = 0;
// Name can be a simple, bundle, bus, or bus bit name.
virtual Port *findPort(const Cell *cell,
@ -209,7 +210,7 @@ public:
const PatternMatch *pattern) const;
virtual InstanceSeq findInstancesHierMatching(const Instance *instance,
const PatternMatch *pattern) const;
virtual std::string getAttribute(const Instance *inst,
virtual std::optional<std::string> getAttribute(const Instance *inst,
const std::string &key) const = 0;
// Hierarchical path name.
virtual const char *pathName(const Instance *instance) const;

View File

@ -17,6 +17,7 @@
#pragma once
#include <functional>
#include <optional>
#include "Network.hh"
@ -45,7 +46,7 @@ public:
const PatternMatch *pattern) const override;
const char *name(const Cell *cell) const override;
std::string getAttribute(const Cell *cell,
std::optional<std::string> getAttribute(const Cell *cell,
const std::string &key) const override;
ObjectId id(const Cell *cell) const override;
Library *library(const Cell *cell) const override;
@ -82,7 +83,7 @@ public:
bool hasMembers(const Port *port) const override;
ObjectId id(const Instance *instance) const override;
std::string getAttribute(const Instance *inst,
std::optional<std::string> getAttribute(const Instance *inst,
const std::string &key) const override;
Instance *topInstance() const override;
Cell *cell(const Instance *instance) const override;

View File

@ -275,11 +275,14 @@ ConcreteCell::setAttribute(const std::string &key,
attribute_map_.insert(key, value);
}
std::string
std::optional<std::string>
ConcreteCell::getAttribute(const std::string &key) const
{
if (attribute_map_.hasKey(key)) {
return attribute_map_.findKey(key);
}
return {};
}
ConcretePort *
ConcreteCell::findPort(const char *name) const

View File

@ -606,7 +606,7 @@ ConcreteNetwork::filename(const Cell *cell)
return ccell->filename();
}
std::string
std::optional<std::string>
ConcreteNetwork::getAttribute(const Cell *cell,
const std::string &key) const
{
@ -938,7 +938,7 @@ ConcreteNetwork::id(const Instance *instance) const
return inst->id();
}
std::string
std::optional<std::string>
ConcreteNetwork::getAttribute(const Instance *inst,
const std::string &key) const
{
@ -1689,11 +1689,14 @@ ConcreteInstance::setAttribute(const std::string &key,
attribute_map_.insert(key, value);
}
std::string
std::optional<std::string>
ConcreteInstance::getAttribute(const std::string &key) const
{
if (attribute_map_.hasKey(key)) {
return attribute_map_.findKey(key);
}
return {};
}
void
ConcreteInstance::addChild(ConcreteInstance *child)

View File

@ -122,7 +122,7 @@ NetworkNameAdapter::id(const Cell *cell) const
return network_->id(cell);
}
std::string
std::optional<std::string>
NetworkNameAdapter::getAttribute(const Cell *cell,
const std::string &key) const
{
@ -334,7 +334,7 @@ NetworkNameAdapter::cell(const Instance *instance) const
return network_->cell(instance);
}
std::string
std::optional<std::string>
NetworkNameAdapter::getAttribute(const Instance *inst,
const std::string &key) const
{

View File

@ -4186,7 +4186,14 @@ LibertyCell *liberty_cell() { return cmdNetwork()->libertyCell(self); }
bool is_leaf() { return cmdNetwork()->isLeaf(self); }
CellPortIterator *
port_iterator() { return cmdNetwork()->portIterator(self); }
string get_attribute(const char *key) { return cmdNetwork()->getAttribute(self, key); }
string get_attribute(const char *key)
{
std::optional<std::string> result = cmdNetwork()->getAttribute(self, key);
if (result) {
return result.value();
}
return "";
}
Port *
find_port(const char *name)
@ -4411,6 +4418,14 @@ find_pin(const char *name)
{
return cmdLinkedNetwork()->findPin(self, name);
}
string get_attribute(const char *key)
{
std::optional<std::string> result = cmdNetwork()->getAttribute(self, key);
if (result) {
return result.value();
}
return "";
}
} // Instance methods
%extend InstanceChildIterator {