Saturday, 2020-04-25

*** tpb has joined #yosys00:00
*** Degi_ has joined #yosys00:03
*** Degi has quit IRC00:07
*** Degi_ is now known as Degi00:07
*** npe has joined #yosys00:50
*** npe has quit IRC00:55
*** npe has joined #yosys01:05
*** jfierro has quit IRC01:08
*** FFY00 has quit IRC01:48
*** FFY00 has joined #yosys01:50
*** citypw has joined #yosys01:54
*** Vinalon has quit IRC03:11
*** Vinalon has joined #yosys03:11
*** Vinalon has quit IRC03:42
*** Vinalon has joined #yosys03:44
*** Nazara has quit IRC04:11
*** Nazara has joined #yosys04:13
*** _whitelogger has quit IRC05:06
*** _whitelogger has joined #yosys05:08
*** dys has quit IRC05:19
*** cyberclown has joined #yosys06:01
*** npe has quit IRC06:25
*** emeb_mac has quit IRC06:28
*** az0re has quit IRC07:00
*** alexhw has joined #yosys07:22
*** vidbina_ has joined #yosys08:00
*** mirage335 has quit IRC08:53
*** mirage335 has joined #yosys08:57
*** az0re has joined #yosys09:03
*** Asu has joined #yosys09:06
pepijndevosHow much RAM do you need for a Yosys build?09:08
az0reMaybe 500MB free?09:12
az0reMost compilation units are maybe 200MB max09:13
az0reBut some take more09:13
az0reJust run a build and watch `top`09:13
pepijndevosHm, I'll just see how it goes...09:13
*** jakobwenzel has quit IRC09:52
*** Vinalon has quit IRC10:29
*** cyberclown has quit IRC12:56
*** craigo has joined #yosys13:09
*** cyberclown has joined #yosys13:56
*** emeb has joined #yosys14:01
ZirconiumXSo, I'm reading the Cyclone V documentation, and they have a 27x27 multiplier, but I can't understand how they manage it...14:37
ZirconiumXhttps://puu.sh/FCkUT/52ea8426dd.png14:38
ZirconiumXThis is like, (x0 * (y0 +/- z0)) + (x1 * (y1 +/- z1))14:39
*** npe has joined #yosys14:40
mwk... I'm going to guess this drawing is, in fact, a lie14:41
mwk(I mean that's usually a safe bet with intel docs)14:41
ZirconiumXHeh14:41
ZirconiumXThe trick is finding out where the lie is14:42
mwkyeah14:42
ZirconiumXSo they say they have an 18x18 and an 18x19 mode, but I'm pretty sure the "18x18" is "18x19 with a zero top bit"14:44
ZirconiumXhttps://puu.sh/FCl0I/9718f3cc4a.png14:45
ZirconiumXFrom this I'm pretty sure the 19-bit input is signed14:45
*** ZirconiumX has quit IRC14:57
*** npe has quit IRC14:57
*** knielsen has quit IRC15:00
*** knielsen has joined #yosys15:01
*** ZirconiumX has joined #yosys15:01
*** tecepe has quit IRC15:06
*** noopwafel has quit IRC15:06
Sarayanhmmm yeah, the 36 makes send, the 27 is stranger15:06
Sarayansense15:06
*** tecepe has joined #yosys15:06
ZirconiumXFor now I'm going to use what I can tell from the diagram: the DSP supports 18x19 multiplication15:15
ZirconiumXAnd since mul2dsp.v doesn't support a single parameter needing to be signed, the whole thing is marked as signed only15:15
ZirconiumXWhich is perhaps a little inefficient, but oh well15:15
FFY00backends/protobuf/protobuf.cc:29:10: fatal error: yosys.pb.h: No such file or directory15:24
FFY00   29 | #include "yosys.pb.h"15:24
FFY00      |          ^~~~~~~~~~~~15:24
FFY00can anyone reproduce when compiling with -j1?15:24
FFY00I have isolated the issue, I build in a clean chroot with a reproducible environment15:24
FFY00I don't think this is a environment issue but it doesn't hurt to check15:25
FFY00forgot to say, you obviously need to compile with ENABLE_PROTOBUF=115:26
*** Vinalon has joined #yosys15:42
*** citypw has quit IRC15:49
*** GenTooMan has quit IRC16:11
*** GenTooMan has joined #yosys16:12
*** noopwafel has joined #yosys16:18
*** ross_s has joined #yosys16:23
*** cr1901_modern has quit IRC16:35
*** cr1901_modern has joined #yosys16:46
*** npe has joined #yosys16:55
*** npe has quit IRC19:12
*** npe has joined #yosys19:19
*** adumont has joined #yosys19:29
adumontHi, I'm trying to understand why yosys won't infer BRAM for a ram.19:30
ZirconiumXadumont: Look at the log for MEMORY_BRAM; it'll usually tell you19:30
adumont(after I made some changes to the top module, but not the ram.v module)19:30
ZirconiumXOr else look for a "converting to registers" type warning19:31
adumontthe 10.24. Executing MEMORY_BRAM pass (mapping $mem cells to block memories). block is empty19:31
adumonttwo commit earlier (in my design), it was infering BRAM fine19:31
ZirconiumXAre there any "converting to registers" warnings?19:31
adumontany tip of where/what to look before 10.24. Executing MEMORY_BRAM pass (mapping $mem cells to block memories). ?19:31
adumontnope, no "converting to registers" in the yosys.log19:32
adumonthere's the faulty log https://termbin.com/ikp719:32
adumonttwo commit earlier, the same section showed it infered BRAM. but in this log it's empty :(, can't find why19:33
adumont(previous yosys log (OK) --> https://termbin.com/ee3c)19:33
adumontI've been looking at it all afternoon, can't find :(19:34
ZirconiumXadumont: So, I think what's happening here is it's decided fontRom and labelsRam both have no read ports19:36
ZirconiumXSee MEMORY_COLLECT19:36
ZirconiumXIn the good version, you do have read ports19:37
ZirconiumXSo Yosys then optimises out the WOM19:37
ZirconiumXAlso, are you still using arachne-pnr? You should move to nextpnr instead.19:41
adumontDoes it make a difference in the yosys step?19:42
ZirconiumXYes, nextpnr takes in JSON with -json instead of BLIF19:42
ZirconiumXBut it's not strictly related to this19:42
adumontyes, ok, but besides the format, will  the yosys synthesis be differnet?19:43
ZirconiumXNo19:43
adumont you're right , in MEMORY_COLLECT it's missing two lines now, like this one: $techmap\font0.fontRom.$memrd$\mem$ram.v:32$546 ($memrd)19:43
adumontany reason why?19:44
ZirconiumX$memrd is a memory read port19:44
adumontat simulation (verilator), the design works fine, so port is definitely connected :(19:44
ZirconiumXSince I can't find any reference to it at all, I'm assuming it doesn't recognise whatever pattern you're using for a RAM19:45
ZirconiumXMay I see?19:45
adumontsure, https://github.com/adumont/fpga-font/tree/stream19:47
tpbTitle: GitHub - adumont/fpga-font at stream (at github.com)19:47
adumontstream branch is the broken one19:47
adumontok branch is counter219:47
adumontsame ram.v file (no change)19:47
ZirconiumXhttps://github.com/adumont/fpga-font/blob/stream/ram.v#L3219:48
tpbTitle: fpga-font/ram.v at stream · adumont/fpga-font · GitHub (at github.com)19:48
ZirconiumXadumont: Try replacing the = with a <=19:48
adumontI use always the same ram.v as in the "LATTICE, Memory Usage Guide for iCE40 Devices" Technical Note TN1250, June 2016, Appendix A. Standard HDL Code References, p2019:48
ZirconiumXYosys can't infer single-port RAMs19:49
ZirconiumXEither instantiate it directly or use a dual-port RAM.19:49
daveshahIn this case I think it should be fine as it will just end up as a dual port RAM19:50
daveshahWhich I think is what is desired19:50
ZirconiumXGiven the "** Single-Port RAM **" comment, I disagree, daveshah19:50
daveshahBut if this is on an iCE40 other than the UP5K then all the ram is dual port19:51
daveshahAnd given there is an initialisation, it coudd never map to SPRAM19:51
daveshahThe = definitely looks dodgy though regardless of what Lattice say, that should be <=19:52
adumontok will try to change19:53
ZirconiumXAnd since the = line is the read port, perhaps that's why Yosys is failing to infer?19:55
daveshahI don't think it should make a difference, but it is definitely not the expected pattern19:55
adumontdoesn't make difference, still no BRAM infered. I'm worried about what ZirconiumX says above "it's decided fontRom and labelsRam both have no read ports"19:56
daveshahI will take a look, just rebuilding Yosys19:56
daveshahLooks like the RAMs are being optimised away for some reason20:03
daveshahYou say the design works correctly in simulation?20:04
adumontyes it does. the design is simple, it write some labels (strings are in ram (more rom, as I don't use the write ports)., and the font is also in another rom.20:08
adumontthat's weird it wouldn't detect the memrd ports, when what is not used in the design are the memwr ports)20:10
daveshahThe problem isn't to do with the memrd ports at all20:10
daveshahIt looks like something much further away is being optimised away20:10
adumontDo you believe it should appear in the yosys log before MEMORY_COLLECT then?20:12
daveshahYes, but it is probably not that easy to spot20:12
daveshahas it is hard to know what is even being optimised away firsr20:12
daveshah*first20:12
adumontIs there any way in yosys to disable these optimizations and maybe enable them one by one and see where it start to fail?20:14
ZirconiumXYou can run each step individually20:14
ZirconiumXIf you manually copy and paste them in interactive mode20:15
adumontyes, but until the end I don't know if it will infer BRAM ?20:15
adumontno sure I follow you :(20:15
ZirconiumXYosys is a series of passes on an internal representation of your code.20:16
ZirconiumXSo you can run one pass at a time and then look around20:16
ZirconiumXFor example, if you run `stat`, it will print statistics about your netlist at that point in time20:17
ZirconiumXSo if you run a pass and then use `stat`, in the good path you should see a $memrd that becomes $mem and then SB_RAM_4K (IIRC)20:17
ZirconiumXIn the bad path, either the $memrd disappears, or else never appears in the first place20:18
daveshahThe problem seems to be vgaLabel3.out[23] being stuck low meaning that the if ( ab ) never activates so the $memrd is swept away as the value is never used20:19
adumont@dave20:20
adumontups20:20
adumontdo you see that in the yosys log??20:21
daveshahNot directly, but by piecing together what was going on combined with tracing the ilang (internal Yosys representation) after `hierarchy -top top; proc; flatten; clean;` (i.e. elaboration but minimal optimisations)20:22
adumontyou're looking at it or do you do that mentally???20:22
daveshahLooking at it20:23
daveshahit needs a bit of following20:23
daveshahIn this case, I can see the driver for \vgaLabel3.out is a register20:25
daveshahthe input to that register is { $techmap\vgaLabel3.$0\out[43:0] [43:23] \vgaLabel2.out [22:0] }20:25
daveshahthe upper bits are $techmap\vgaLabel3.$0\out[43:0] [43:23]20:25
daveshahoh wait20:25
daveshahit's not directly stuck low20:26
daveshahhmm20:26
daveshahit's tied to \vgaLabel2.out [43:23]20:26
adumonteach of the vgaLabel take a 44 bit input and outputs a 44 bit output , it may have modified some bits in the way.20:27
daveshahIt looks like in each three modules, none change bit 23 of out20:29
daveshahso it is ultimately driven to 1'b020:29
daveshahI trace it back to this mux20:29
daveshah  cell $mux $techmap\vgaLabel1.$procmux$29920:29
daveshah    parameter \WIDTH 2120:29
daveshah    connect \A 21'00000000000000000000020:29
daveshah    connect \B $techmap\vgaLabel1.$or$vgaModule.v:88$264_Y20:29
daveshah    connect \S 1'020:29
daveshah    connect \Y $techmap\vgaLabel1.$0\out[43:0] [43:23]20:29
daveshah  end20:29
daveshahwhich means that bits 43:23 of the vgaLabel1 register are always 0 (when S is 0 the mux output is A)20:29
*** X-Scale` has joined #yosys20:30
daveshahIt looks like all three .active signals are ending up at 020:30
*** X-Scale has quit IRC20:30
*** X-Scale` is now known as X-Scale20:30
* adumont is checking 20:31
daveshahLooks like you have a multiple assignment on tmp that is messing things up20:41
daveshah(you assign tmp both in the wire declaration and in an assign)20:42
*** strobokopp has joined #yosys20:42
*** emeb_mac has joined #yosys20:42
daveshahFixing that (removing the assignment in the declaration) and memory is inferred fine20:42
adumontdamn!! you're right. I wonder how it's possible verilator nor yosys warn me on that :D20:45
adumontthat's an aweful mistake! :'(20:45
daveshahYosys does warn, both of us just missed the warning20:45
adumontThank you so much for the help20:45
adumontoh does it?20:45
daveshahI'm surprised Verilator allows this though20:45
daveshahHmm, I thought I saw a warning20:46
daveshahYeah, looks like the warning is lost when doing synth_ice4020:46
daveshahI only saw the warning when I was doing some of the early commands manually20:47
adumontare the steps you took described somewhere? I'd love to be able to find out myself the next time (or learn something in that direction, even if I don't get to the same capacity ;)  )20:48
daveshahNot really. But I have a pretty standard procedure which is to do -p "read_verilog -lib +/ice40/cells_sim.v; hierarchy -top top; proc; flatten; clean; stat; write_ilang top.il"20:49
daveshahthis then gets you a low level dump of what is going on inside Yosys just after initial processing of the input20:49
daveshahthen steps can be added and removed as needed20:49
*** npe has quit IRC21:02
adumontthank you so much Dave (and also ZirconiumX) for the help. I'll try myself to get to the conclusion :D  with you steps21:04
*** npe has joined #yosys21:10
daveshahfyi, I have filed https://github.com/YosysHQ/yosys/issues/2003 as I think the lack of a warning in synth_ice40 is a bug.21:17
tpbTitle: opt_expr prevents driver/constant conflict warning · Issue #2003 · YosysHQ/yosys · GitHub (at github.com)21:17
*** adumont has quit IRC21:19
*** npe has quit IRC21:25
*** anticw has quit IRC21:35
*** anticw has joined #yosys21:37
whitequarkdaveshah: i think i filed an issue for this a long time ago and Claire's response was basically WONTFIX21:41
whitequarkeven had a branch with an attempt to resolve it partially21:42
mwkiirc one issue here is that `check` doesn't detect the case when something is driving a net connected to a constant as a driver-driver conflict?21:42
whitequarkthat was one of those things that convinced me that improving Yosys Verilog frontend is a dead end and frankly I would just be better off staying away from FOSS Verilog development altogether21:42
whitequarkdaveshah: https://github.com/YosysHQ/yosys/issues/54521:44
tpbTitle: `check` does not appear to detect many cases of multiple drivers · Issue #545 · YosysHQ/yosys · GitHub (at github.com)21:44
daveshahI don't think there is a multiple driver by the time check is reached21:44
whitequarkactually there is a braindead clause in Verilog which *requires* you to prefer a constant driver21:45
mwk*whaT*21:45
whitequarklet me see if i remember it correctly21:46
az0reI don't understand why you think that would be braindead21:46
whitequarkaz0re: because a driver conflict should be a compilation error21:47
whitequarkin the same way, the SV LRM does not allow code that violates the requirements of always_ff to be an error, it has to be a warning, as written21:47
whitequark(so Yosys is not SV compliant here because it actually does make it an error)21:48
mwk... because when you have more than one driver in the first place, you're already doing stuff you shouldn't be?21:48
daveshahMy guess is that this was written from a simulation point of view21:48
mwk(with the exception of internal tristate logic but uhhh can we pretend that doesn't exist)21:48
daveshahwhere there are occasional cases where you do want to override a signal21:48
az0rewhitequark: I agree that it is an error, of course21:48
whitequarkdaveshah: yes, and that should just use a separate keyword that's invalid in synthesis21:49
az0reBut I don't understand why it's brain dead to say, "well, this is wrong, but let's be conservative and assign it the constant driver"21:49
mwkbecause if obvious errors are warnings and not errors, you end up with shit code21:50
whitequark^21:50
daveshahI suspect most of these cases effectively already do, because they use "assign" within a procedural block21:50
az0remwk: totally agree there, it should be an error with some option to allow it with a warning21:50
whitequarkgood tools do not second-guess my intent when encountering questionable code. good tools fail loudly on it21:50
az0resure, agreed21:50
mwkwould you also like an option for invalid pointer access in C to be a warning?21:51
az0reI just don't think it's brain dead, *if you're not going to die*, to make that choice21:51
daveshahIn fact there is a force keyword already21:51
az0reyou misunderstand what I'm saying lol21:51
whitequarkoh, you were nitpicking a literal interpretation of my words. nevermind then21:51
az0rehuh?21:52
az0reI didn't understand why you thought it was braindead to prefer a constant driver21:52
az0reTurns out you really just have a problem with it not being an error.  I agree there.21:52
whitequarkright, so21:53
whitequarkI hold my tools to a much higher standard than is considered normal in this industry21:53
az0reI don't see how I was nitpicking anything21:53
whitequarkyes, I misunerstood your response, sorry21:53
az0reOK no problem I just don't want any lingering misunderstandings21:53
whitequarkin general, I think that something like the missing diagnostic we discussed above, in a language specificaion--an unforced error--is completely unacceptable21:54
whitequarkin the same sense that the situation we ended with in PCs where everything runs on memory-unsafe code that contains untold quantities of severe bugs is completely unacceptable21:54
az0reTBH I don't see a big problem with diverging from the official Verilog spec (ideally with an option for full spec compliance) to implement more sane behavior in Yosys21:55
az0reI mean, Yosys already picks and chooses things from SV to support, right?21:55
whitequarkthere is a particular point of view that IME many engineers hold that "Verilog is fine, you just need a linter and a year to learn every footgun it has", and I refuse to concede with it21:55
az0retotally agreed that is a garbage perspective :)21:56
whitequarkyes, I agree that Yosys should diverge from the SV spec when it makes sense to do so21:56
az0reand also that Verilog is not ideal...21:56
whitequarkI also find it really weird that there is no synthesis subset of SV21:57
whitequarksure, 1164.1 was to put it mildly not ideal (it *requires* you to have a sim/synth mismatch in one particular clause)21:57
whitequarkbut as it stands, no vendor implements the entirety of SV in synthesis (that wouldn't even make sense), and so you're stuck with N incompatible dialects whether you like it or not, and there isn't even any baseline you can claim conformance to21:58
az0reSince everybody seems to write generators and use Verilog primarily as a language backend, anyway, I wonder if RTLIL will largely supplant it in a few years21:58
whitequarkI would hope not (at least, not as RTLIL exists today)21:58
az0reWrite your RTL however you want: Bluespec, Chisel, Migen, etc.21:58
whitequarkRTLIL is defined by its singular implementation that changes without notice21:58
az0reBut those are all more sane HDLs than Verilog IMO21:59
whitequarkRTLIL is quite nice, but it simply cannot become an industry standard without negatively impacting... well, everyone21:59
whitequark(Yosys because RTLIL would get effectively frozen, and everyone else who would now lack a formal specification they could adhere to)22:00
whitequarkit's like how people keep trying to use LLVM IR for things22:00
whitequarkfirst in PNaCl, then in some shader thing I forget the name of22:00
az0reI dunno if it would get effectively frozen, it would just need to be effectively versioned22:01
whitequarkit works for exactly one LLVM release cycle and then you're left with a massive headache and a project you're probably going to deprecate22:01
whitequarkwhy not just use FIRRTL?22:01
az0reOh, sorry, that's what I meant22:01
whitequarkit's conceptually very similar to RTLIL and it is explicitly designed as an interchange format22:01
az0reWhat Chisel uses on the backend22:01
whitequarkoh22:01
whitequarkoh yeah I want to add a FIRRTL backend to nMigen some day22:02
az0reSo many RTLs and Rs and Is, I got lexically turned around...22:02
daveshahWe need a FIRRTL frontend for Yosys at some point22:02
whitequarkdaveshah: I might write that along with the nMigen backend, possibly22:02
whitequarkthe current situation where I version-sniff Yosys is not ideal22:02
daveshahYeah, that would be nice22:03
whitequarkI might be stuck doing that to an extent depending on how bad FIRRTL-to-Verilog roundtrip is22:03
whitequarkbut also maybe not22:03
sorearthe best part about SPIR-V is that everyone thinks it's related to RISC-V or vice versa22:03
daveshahPartly because I've been using some of the Chisel cores as large benchmarks, and their Verilog generation on those is pretty slow22:03
daveshahNot massively problematic in the scheme of synthesis of such big thingsi22:04
daveshahBut 10 minutes or so for the bigger BOOM configs which seems quite a bit for a fairly simple transformation22:04
whitequarkouch22:05
az0reOh I can tell you stories about long build times in Chisel... ;)22:05
whitequarki would start reconsidering my choices if i had to wait 10 minutes for *synthesis*22:05
whitequarkmuch less verilog generation22:05
az0reI once had a design that took 40+m to elaborate in a frozen Chisel2 version22:06
daveshahI mean this is a design that will probably take a few hours to go through nextpnr atm22:06
daveshahto get an idea of the order of magnitude22:06
whitequarksuddenly, the current nmigen elaboration times start to look not so ba22:06
whitequark*bad22:06
whitequark(i can improve them by an OOM, i think, with some significant but necessary effort)22:07
az0reon an empty dual Xeon E5-2698v4 with all cores being used22:07
whitequarkwow22:07
az0reA big part of it for sure was my own code22:07
whitequarkwas it particularly large?22:07
az0reBut at least 15+m was purely in Chisel code22:07
az0reI mean, yeah...22:07
az0relol22:07
az0reThe output Verilog was like 100M IIRC22:07
*** vidbina_ has quit IRC22:08
whitequarkI see22:08
whitequarkwith attributes, comments, etc stripped?22:08
az0reBut this was also a very old frozen version of Chisel2 with a very old frozen version of Scala22:08
whitequark(nmigen's verilog output is probably half (*src*))22:08
az0reNope, raw22:08
az0reBut there weren't any attributes emitted at that point22:08
whitequarkah, makes sense22:08
az0reLots and lots and lots of gunk, useless wires, etc. though22:08
whitequarkyes, it's been somehting i've worked on in yosys' write_verilog backend22:09
daveshahChisel/FIRRTL tends to generate a lot of source comments, ime22:09
whitequarksadly, the sheer complexity of verilog's width/signedness inference has defeated me22:09
az0reAnd comments, yeah22:09
daveshahsimilar to the number of nmigen src attributes22:09
whitequarkit's tractable, but i spent so long on it, and would have to spend so much more time, that it is really hard to find motivation for it22:09
az0reI wonder if you could do a sort of SAT sweeping approach22:10
whitequarkfor someone who doesn't write any verilog code basically ever, i know *Way* too much about verilog22:10
whitequarkand most of that knowledge is really depressing22:10
az0reFind other equivalent wires, replace all references to the one closest to the driver22:10
whitequarkyou don't need SAT22:10
whitequarkat least for the thing i was doing22:10
whitequarkyou just need to reconstruct it back to an AST form first22:10
whitequarkoh, *that* kind of useless wire22:11
whitequarkshouldn't yosys be able to do it already?22:11
az0reProbably22:11
whitequarkthe share pass22:11
daveshahYeah, good luck with that on that size design though22:11
az0reopt_share or opt_merge probably get a lot, if not all22:11
daveshahopt_merge should catch most of these cases22:12
daveshahfreduce does full SAT equivalence sweeping22:12
daveshahBut I've not had much luck with it above about 1000 LUTs22:12
az0reI see22:12
whitequarkdaveshah: oooh, that should work well for boneless22:12
daveshahit quickly takes way longer than the rest of synthesis22:12
az0reLots to be tried there22:12
whitequarkwith the 300 LUT target22:12
daveshahA fast, whitebox aware version is on my TODO list but I don't know when I will get to that22:13
az0reMight be a good idea to try a window, where you look only at nearby (by some metric) cells up to some number22:13
daveshahThe trick ABC does is to use random value simulation to find candidate equivalences22:14
daveshahI haven't quite figured out how freduce actually works yet22:14
az0reYeah, Alan is probably the guy to talk to about this if anyone wants to get serious about improving that code...22:14
daveshahIt's based on cones but it doesn't seem to do much to try and reduce the problem22:15
daveshahI plan to reimplement the random value simulation, as it is the most obvious way to filter out things that don't need to go to SAT22:15
az0reMakes sense22:15
az0reI'm sure it's way down on the TODO list though22:16
daveshahYeah, very much in the "one day" category, nextpnr maintainence and R&D taking up most of my time atm22:16
az0reYeah that's probably appropriate IMO22:17
az0reHonestly this would be a good semester project for some university student22:17
*** Asuu has joined #yosys22:33
*** Asu has quit IRC22:33
*** npe has joined #yosys22:59
*** emeb has quit IRC23:04
*** Asuu has quit IRC23:24

Generated by irclog2html.py 2.17.2 by Marius Gedminas - find it at https://mg.pov.lt/irclog2html/!