Skip to content

Commit b24d1b8

Browse files
style: apply clang-format and update files
Signed-off-by: Jorge Ferreira <jorge.ferreira@precisioninno.com>
1 parent ab39b17 commit b24d1b8

10 files changed

Lines changed: 117 additions & 20 deletions

File tree

include/ord/OpenRoad.hh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ class OpenRoad
227227

228228
void read3Dbv(const std::string& filename);
229229
void read3Dbx(const std::string& filename);
230+
void clear3Dbx();
230231
void write3Dbv(const std::string& filename);
231232
void write3Dbx(const std::string& filename);
232233
void read3DBloxBMap(const std::string& filename);

src/OpenRoad.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,8 +499,19 @@ void OpenRoad::read3Dbv(const std::string& filename)
499499
parser.readDbv(filename);
500500
}
501501

502+
void OpenRoad::clear3Dbx()
503+
{
504+
std::vector<odb::dbChip*> chips;
505+
auto chips_set = db_->getChips();
506+
chips.assign(chips_set.begin(), chips_set.end());
507+
for (odb::dbChip* chip : chips) {
508+
odb::dbChip::destroy(chip);
509+
}
510+
}
511+
502512
void OpenRoad::read3Dbx(const std::string& filename)
503513
{
514+
clear3Dbx();
504515
odb::ThreeDBlox parser(logger_, db_, sta_);
505516
parser.readDbx(filename);
506517
check3DBlox();

src/OpenRoad.i

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,13 @@ read_3dbx_cmd(const char *filename)
380380
ord->read3Dbx(filename);
381381
}
382382

383+
void
384+
clear_3dbx_cmd()
385+
{
386+
OpenRoad *ord = getOpenRoad();
387+
ord->clear3Dbx();
388+
}
389+
383390
void
384391
read_3dblox_bmap_cmd(const char *filename)
385392
{

src/OpenRoad.tcl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ proc read_3dbx { args } {
213213
ord::read_3dbx_cmd $filename
214214
}
215215

216+
sta::define_cmd_args "clear_3dbx" {}
217+
218+
proc clear_3dbx { args } {
219+
sta::parse_key_args "clear_3dbx" args keys {} flags {}
220+
sta::check_argc_eq0 "clear_3dbx" $args
221+
ord::clear_3dbx_cmd
222+
}
223+
216224
sta::define_cmd_args "read_3dblox_bmap" {filename}
217225

218226
proc read_3dblox_bmap { args } {

src/odb/src/db/dbChip.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,13 @@ void dbChip::destroy(dbChip* chip_)
744744
auto chipConn = *chip_conns_itr++;
745745
dbChipConn::destroy(chipConn);
746746
}
747+
// destroy chip nets
748+
auto chip_nets = chip_->getChipNets();
749+
auto chip_nets_itr = chip_nets.begin();
750+
while (chip_nets_itr != chip_nets.end()) {
751+
auto chipNet = *chip_nets_itr++;
752+
dbChipNet::destroy(chipNet);
753+
}
747754
// destroy chip insts
748755
auto chip_insts = chip_->getChipInsts();
749756
auto chip_insts_itr = chip_insts.begin();

src/web/src/main.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,28 @@ function tclAppend(text, className) {
323323
app.tclOutputEl.scrollTop = app.tclOutputEl.scrollHeight;
324324
}
325325

326+
function handleSessionExit(input) {
327+
const mgr = app.websocketManager;
328+
if (mgr && mgr.socket) {
329+
mgr._exiting = true;
330+
if (mgr.socket.readyState === WebSocket.OPEN) {
331+
try {
332+
mgr.socket.send(JSON.stringify({ type: 'server_exit' }));
333+
} catch (_) { /* ignore */ }
334+
}
335+
try { mgr.socket.close(); } catch (_) { /* ignore */ }
336+
}
337+
try { window.close(); } catch (_) { /* ignore */ }
338+
setTimeout(() => {
339+
if (!window.closed) {
340+
tclAppend('Session terminated. You can close this tab.\n',
341+
'tcl-exit');
342+
input.disabled = true;
343+
input.placeholder = 'Session terminated';
344+
}
345+
}, 100);
346+
}
347+
326348
function createTclConsole(container) {
327349
const el = document.createElement('div');
328350
el.className = 'tcl-console';
@@ -345,6 +367,13 @@ function createTclConsole(container) {
345367
if (e.key === 'Enter') {
346368
const cmd = input.value.trim();
347369
if (!cmd) return;
370+
if (cmd === 'exit' || cmd === 'quit') {
371+
tclAppend(`>>> ${cmd}\n`, 'tcl-cmd');
372+
completer.addToHistory(cmd);
373+
input.value = '';
374+
handleSessionExit(input);
375+
return;
376+
}
348377
tclAppend(`>>> ${cmd}\n`, 'tcl-cmd');
349378
completer.addToHistory(cmd);
350379
input.value = '';

src/web/src/request_handler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ struct WebSocketRequest
9696
kDrcUpdateMarker,
9797
kDrcUpdateCategoryVisibility,
9898
kDrcHighlight,
99+
kServerExit,
99100
kUnknown
100101
};
101102

src/web/src/style.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,10 @@ html, body {
616616
.tcl-error {
617617
color: var(--error-text);
618618
}
619+
.tcl-exit {
620+
color: var(--fg-secondary);
621+
font-style: italic;
622+
}
619623
.tcl-input-row {
620624
display: flex;
621625
align-items: center;

src/web/src/web.cpp

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
#include <netinet/in.h>
77

8-
#include <csignal>
98
#include <cstdint>
109
#include <cstdlib>
1110
#include <cstring>
1211
#include <deque>
1312
#include <exception>
1413
#include <filesystem>
1514
#include <fstream>
15+
#include <functional>
1616
#include <ios>
1717
#include <iterator>
1818
#include <limits>
@@ -27,7 +27,6 @@
2727

2828
#include "boost/asio/io_context.hpp"
2929
#include "boost/asio/ip/tcp.hpp"
30-
#include "boost/asio/signal_set.hpp"
3130
#include "boost/asio/strand.hpp"
3231
#include "boost/beast/core.hpp"
3332
#include "boost/beast/http.hpp"
@@ -191,6 +190,8 @@ static WebSocketRequest parse_web_socket_request(const std::string& msg)
191190
} else if (type_str == "list_dir") {
192191
req.type = WebSocketRequest::kListDir;
193192
req.dir_path = extract_string(msg, "path");
193+
} else if (type_str == "server_exit") {
194+
req.type = WebSocketRequest::kServerExit;
194195
} else {
195196
req.type = WebSocketRequest::kUnknown;
196197
}
@@ -347,13 +348,16 @@ class WebSocketSession : public std::enable_shared_from_this<WebSocketSession>
347348
std::shared_ptr<TileGenerator> generator_;
348349
std::thread init_thread_;
349350

351+
std::function<void()> shutdown_cb_;
352+
350353
public:
351354
WebSocketSession(Tcp::socket&& socket,
352355
std::shared_ptr<TileGenerator> generator,
353356
std::shared_ptr<TclEvaluator> tcl_eval,
354357
std::shared_ptr<TimingReport> timing_report,
355358
std::shared_ptr<ClockTreeReport> clock_report,
356-
utl::Logger* logger);
359+
utl::Logger* logger,
360+
std::function<void()> shutdown_cb);
357361
~WebSocketSession();
358362

359363
void run(http::request<http::string_body>&& req);
@@ -374,7 +378,8 @@ WebSocketSession::WebSocketSession(
374378
// NOLINTEND(performance-unnecessary-value-param)
375379
std::shared_ptr<TimingReport> timing_report,
376380
std::shared_ptr<ClockTreeReport> clock_report,
377-
utl::Logger* logger)
381+
utl::Logger* logger,
382+
std::function<void()> shutdown_cb)
378383
: websocket_(std::move(socket)),
379384
logger_(logger),
380385
select_handler_(generator, tcl_eval),
@@ -384,7 +389,8 @@ WebSocketSession::WebSocketSession(
384389
tile_handler_(generator),
385390
drc_handler_(generator),
386391
strand_(net::make_strand(websocket_.get_executor())),
387-
generator_(std::move(generator))
392+
generator_(std::move(generator)),
393+
shutdown_cb_(std::move(shutdown_cb))
388394
{
389395
if (generator_->getBlock()) {
390396
tile_handler_.initializeHeatMaps(state_);
@@ -698,6 +704,11 @@ void WebSocketSession::on_read(beast::error_code ec)
698704
self->drc_handler_.handleDRCHighlight(req, self->state_));
699705
});
700706
break;
707+
case WebSocketRequest::kServerExit:
708+
if (shutdown_cb_) {
709+
shutdown_cb_();
710+
}
711+
return;
701712
default:
702713
net::post(websocket_.get_executor(),
703714
[self = std::move(self), req = std::move(req)]() {
@@ -881,6 +892,7 @@ class DetectSession : public std::enable_shared_from_this<DetectSession>
881892
http::request<http::string_body> req_;
882893
std::string doc_root_;
883894
utl::Logger* logger_;
895+
std::function<void()> shutdown_cb_;
884896

885897
public:
886898
DetectSession(Tcp::socket&& socket,
@@ -889,7 +901,8 @@ class DetectSession : public std::enable_shared_from_this<DetectSession>
889901
std::shared_ptr<TimingReport> timing_report,
890902
std::shared_ptr<ClockTreeReport> clock_report,
891903
std::string doc_root,
892-
utl::Logger* logger);
904+
utl::Logger* logger,
905+
std::function<void()> shutdown_cb);
893906

894907
void run();
895908

@@ -903,14 +916,16 @@ DetectSession::DetectSession(Tcp::socket&& socket,
903916
std::shared_ptr<TimingReport> timing_report,
904917
std::shared_ptr<ClockTreeReport> clock_report,
905918
std::string doc_root,
906-
utl::Logger* logger)
919+
utl::Logger* logger,
920+
std::function<void()> shutdown_cb)
907921
: stream_(std::move(socket)),
908922
generator_(std::move(generator)),
909923
tcl_eval_(std::move(tcl_eval)),
910924
timing_report_(std::move(timing_report)),
911925
clock_report_(std::move(clock_report)),
912926
doc_root_(std::move(doc_root)),
913-
logger_(logger)
927+
logger_(logger),
928+
shutdown_cb_(std::move(shutdown_cb))
914929
{
915930
}
916931

@@ -941,7 +956,8 @@ void DetectSession::on_read(beast::error_code ec)
941956
tcl_eval_,
942957
timing_report_,
943958
clock_report_,
944-
logger_);
959+
logger_,
960+
shutdown_cb_);
945961
websocket_session->run(std::move(req_));
946962
} else {
947963
// Regular HTTP - hand off to session with already-read request
@@ -965,6 +981,7 @@ class Listener : public std::enable_shared_from_this<Listener>
965981
std::shared_ptr<ClockTreeReport> clock_report_;
966982
std::string doc_root_;
967983
utl::Logger* logger_;
984+
std::function<void()> shutdown_cb_;
968985

969986
public:
970987
Listener(net::io_context& ioc,
@@ -974,7 +991,8 @@ class Listener : public std::enable_shared_from_this<Listener>
974991
std::shared_ptr<TimingReport> timing_report,
975992
std::shared_ptr<ClockTreeReport> clock_report,
976993
std::string doc_root,
977-
utl::Logger* logger);
994+
utl::Logger* logger,
995+
std::function<void()> shutdown_cb);
978996

979997
void run() { do_accept(); }
980998

@@ -990,15 +1008,17 @@ Listener::Listener(net::io_context& ioc,
9901008
std::shared_ptr<TimingReport> timing_report,
9911009
std::shared_ptr<ClockTreeReport> clock_report,
9921010
std::string doc_root,
993-
utl::Logger* logger)
1011+
utl::Logger* logger,
1012+
std::function<void()> shutdown_cb)
9941013
: ioc_(ioc),
9951014
acceptor_(ioc),
9961015
generator_(std::move(generator)),
9971016
tcl_eval_(std::move(tcl_eval)),
9981017
timing_report_(std::move(timing_report)),
9991018
clock_report_(std::move(clock_report)),
10001019
doc_root_(std::move(doc_root)),
1001-
logger_(logger)
1020+
logger_(logger),
1021+
shutdown_cb_(std::move(shutdown_cb))
10021022
{
10031023
beast::error_code ec;
10041024

@@ -1049,7 +1069,8 @@ void Listener::on_accept(beast::error_code ec, Tcp::socket socket)
10491069
timing_report_,
10501070
clock_report_,
10511071
doc_root_,
1052-
logger_)
1072+
logger_,
1073+
shutdown_cb_)
10531074
->run();
10541075
}
10551076
do_accept();
@@ -1389,22 +1410,22 @@ void WebServer::serve(int port, const std::string& doc_root)
13891410

13901411
net::io_context ioc{num_threads};
13911412

1413+
auto shutdown_cb = [this, &ioc]() {
1414+
logger_->info(utl::WEB, 3, "Shutting down...");
1415+
ioc.stop();
1416+
};
1417+
13921418
std::make_shared<Listener>(ioc,
13931419
Tcp::endpoint{address, u_port},
13941420
generator_,
13951421
tcl_eval,
13961422
timing_report,
13971423
clock_report,
13981424
doc_root,
1399-
logger_)
1425+
logger_,
1426+
shutdown_cb)
14001427
->run();
14011428

1402-
net::signal_set signals(ioc, SIGINT, SIGTERM);
1403-
signals.async_wait([&](auto, auto) {
1404-
logger_->info(utl::WEB, 3, "Shutting down...");
1405-
ioc.stop();
1406-
});
1407-
14081429
std::vector<std::thread> threads;
14091430
threads.reserve(num_threads - 1);
14101431
for (int i = 0; i < num_threads - 1; ++i) {
@@ -1417,6 +1438,7 @@ void WebServer::serve(int port, const std::string& doc_root)
14171438
t.join();
14181439
}
14191440

1441+
Tcl_ResetResult(interp_);
14201442
logger_->info(utl::WEB, 5, "Server stopped.");
14211443
} catch (std::exception const& e) {
14221444
logger_->error(utl::WEB, 2, "Server error : {}", e.what());

src/web/src/websocket-manager.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ export class WebSocketManager {
5959
};
6060

6161
this.socket.onclose = () => {
62+
if (this._exiting) {
63+
for (const [id, handler] of this.pending) {
64+
handler.reject(new Error('Session ended by user'));
65+
}
66+
this.pending.clear();
67+
return;
68+
}
6269
console.log('WebSocket closed, reconnecting...');
6370
for (const [id, handler] of this.pending) {
6471
handler.reject(new Error('WebSocket closed'));

0 commit comments

Comments
 (0)